Aller au contenu

Super purge


Fraid

Messages recommandés

Merci sergeluc,

 

À première vue tu n'es pas du tout hors sujet, je vais regarder çà de plus près.

J'étais justement en train de chercher aussi un moyen par le biais des "dictionnaires".

 

c'est pas sérieux de ma part

 

C'est moi qui ne suis pas sérieux, je poste un code faux en vitesse avant de partir au boulot, et c'est là que je me rends compte de ma bétise alors que je n'ai plus de moyen de corriger !

 

 

 

Pour Fraid,

 

Voilà, j'ai fini par trouver quelque chose qui semble fonctionner (renommé RASTER_PURGE) :

 

Version corrigée : les images contenues dans des blocs ne sont pas purgées

 

;;; RASTER_PURGE Purge les images raster non référencées

(defun c:raster_purge (/ AcDoc lay l_lst im_dict n im_lst ss name)

 ;; Chargement des fonctions ActiveX

 (vl-load-com)

 ;; AcDoc : pointeur vers le document actif

 (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)))


 ;; Dévérouillage de tous les calques

 (repeat (setq n (vla-get-count (vla-get-Layers AcDoc)))
   (setq lay (vla-item (vla-get-Layers AcDoc) (setq n (1- n))))
   (if	(= :vlax-true
   (vla-get-lock lay)
)
     (progn
(vla-put-lock lay :vlax-false)
(setq l_lst (cons lay l_lst))
     )
   )
 )

 ;; Recherche du "dictionnaire" des images (s'il existe)

 (setq
   im_dict (vl-catch-all-apply
      'vla-item
      (list (vla-get-Dictionaries acdoc) "ACAD_IMAGE_DICT")
    )
 )
 (if (vl-catch-all-error-p im_dict)
   (setq im_dict nil)
 )

 ;; Constitution d'une liste des images contenues dans la "bibliothèque"

 (if im_dict
   (progn
     (repeat (setq n (vla-get-Count im_dict))
(setq im_lst (cons (vla-item im_dict (setq n (1- n))) im_lst))
     )
     
     ;; Suppression de la liste des images insérées dans le dessin
     
     (if (setq ss (ssget "_X" '((0 . "IMAGE"))))
(repeat	(setq n (sslength ss))
  (setq	name   (vla-get-Name
		 (vlax-ename->vla-object (ssname ss (setq n (1- n))))
	       )
	im_lst (vl-remove (vla-item im_dict name) im_lst)
  )
)
     )
     
     ;; Suppression de la liste des images contenues dans les blocs insérées
     
     (if (setq ss (ssget "_X" '((0 . "INSERT"))))
(repeat	(setq n (sslength ss))
  (setq obj (vlax-ename->vla-object (ssname ss (setq n (1- n)))))
  (if (vlax-property-available-p obj 'EffectiveName)
    (setq name (vla-get-EffectiveName obj))
    (setq name (vla-get-Name obj))
  )
  (setq bloc (vla-item (vla-get-blocks AcDoc) name))
  (repeat (setq m (vla-get-count bloc))
    (setq ent (vla-item bloc (setq m (1- m))))
    (if	(= (vla-get-ObjectName ent) "AcDbRasterImage")
      (setq im_lst
	     (vl-remove	(vla-item im_dict (vla-get-Name ent))
			im_lst
	     )
      )
    )
  )
)
     )

     ;; Suppression du dessin des images restant dans la liste

     (mapcar '(lambda (x) (vl-catch-all-apply 'vla-delete (list x)))
      im_lst
     )
   )
 )

 ;; Restauration de l'état des calques

 (if l_lst
   (mapcar '(lambda (x)
       (vla-put-lock x :vlax-true)
     )
    l_lst
   )
 )
 (princ)
)

 

On pourrait "fondre" raster_purge et xref_purge en une seule routine spurge, pour éviter les redondences (AcDoc, dévérrouillage et reverrouillage) mais il peut être intéressant d'avoir ces deux routines pour les utiliser séparément.[Edité le 10/6/2006 par (gile)]

 

[Edité le 13/6/2006 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Une amélioration pour SPURGE, pour purger complètement les blocs imbriqués (version corrigée le 13/06/06) :

 

VERSION 1.0

 

;;; SPURGE Purge tout, y compris les blocs imbriqués, les xrefs et les images non référencées

(defun c:spurge
      (/ AcDoc ss n obj name bloc ent r_lst x_lst p_lst c_lst m)
 (vl-load-com)
 (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)))

 ;; Purge les xrefs et rasters non référencées
 (c:xref_purge)
 (c:raster_purge)

 ;; r_lst : liste des blocs et "sous-blocs" insérés
 ;; x_lst : liste des xrefs insérées
 (setq ss (ssget "_X" '((0 . "INSERT"))))
 (if ss
   (progn
     (repeat (setq n (sslength ss))
(setq
  obj (vlax-ename->vla-object (ssname ss (setq n (1- n))))
)
(if (vlax-property-available-p obj 'EffectiveName)
  (setq name (vla-get-EffectiveName obj))
  (setq name (vla-get-Name obj))
)
(if (= :vlax-true
       (vla-get-isXref
	 (vla-item (vla-get-Blocks AcDoc) name)
       )
    )
  (if (not (member name x_lst))
    (setq x_lst (cons name x_lst))
  )
  (if (not (member name r_lst))
    (setq r_lst (cons name r_lst))
  )
)
     )
     ;; Ajout des "sous-blocs" des blocs insérés à r_lst
     (setq n 0)
     (if r_lst
(while (setq name (nth n r_lst))
  (setq bloc (vla-item (vla-get-blocks acDoc) name))
  (repeat (setq m (vla-get-count bloc))
    (setq ent (vla-item bloc (setq m (1- m))))
    (if	(and (= (vla-get-ObjectName ent) "AcDbBlockReference")
	     (not (member (vla-get-name ent) r_lst))
	)
      (setq
	r_lst
	 (reverse (cons (vla-get-Name ent) (reverse r_lst)))
      )
    )
  )
  (setq n (1+ n))
)
     )
   )
 )

 (setq p_lst T)
 (while p_lst
   (vla-PurgeAll AcDoc)
   ;; c_lst liste des définitions de blocs de la collection
   (setq c_lst nil)
   (repeat (setq n (vla-get-count (vla-get-blocks AcDoc)))
     (setq
c_lst
 (cons (vla-get-name
	 (vla-item (vla-get-blocks AcDoc) (setq n (1- n)))
       )
       c_lst
 )
     )
   )
   ;; p_lst : liste des blocs à purger, soit les blocs de la collection ...
   ;; ... moins les blocs "*Model_Space" "*Paper_Space*" et les blocs insérées
   (setq p_lst	(vl-remove-if
	  '(lambda (x)
	     (or (= (substr x 1 1) "*")
		 (member x r_lst)
	     )
	   )
	  c_lst
	)
   )
   ;; ... moins les xrefs insérées et les blocs qu'elles contiennent
   (mapcar '(lambda (x)
       (setq p_lst
	      (vl-remove-if
		'(lambda (y)
		   (wcmatch y (strcat x "*"))
		 )
		p_lst
	      )
       )
     )
    x_lst
   )
 )
 (vla-AuditInfo AcDoc :vlax-true)
 (princ)
)

[Edité le 12/6/2006 par (gile)][Edité le 12/6/2006 par (gile)][Edité le 13/6/2006 par (gile)][Edité le 13/6/2006 par (gile)]

 

[Edité le 13/6/2006 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Encore un fois je suis allé un peu vite en besogne, la version de SPURGE juste au dessus contenait une erreur !

 

Je modifie le code.

 

Toutes mes excuses à ceux qui auront testé et se seront retrouvé dans une boucle sans fin :calim:

 

EDIT : La réparation est plus complexe que prévu, le code ci dessus est supprimé momentanément, on peut utiliser celui donné plus haut (qui ne purge pas toutes les imbrications de blocs)[Edité le 12/6/2006 par (gile)]

 

EDIT 2 : Cette fois, je pens que c'est bon !

 

[Edité le 12/6/2006 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Merci Patrick_35 pour le lien, je verrais çà ce soir, on dirait que c'est pas près d'être fini cette histoire de "super purge" !

 

Sinon, j'ai réparé (enfin, j'espère) la routine qui purge tous les blocs (même imbriqués) en une seule fois.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Je ne vois pas bien, chez moi çà marche, la seule chose : certaines variables n'étaient pas déclarées, peut-être restait-il des éléments dans une des listes alors qu'il avaient été purgés ?

 

J'ai modifié le code en déclarant bien toutes les variables.

 

Si tu ré-essayes dans le même dessin avec la nouvelle mouture, fais :

 

(foreach n '(AcDoc ss n lst obj name bloc ent r_lst p_lst c_lst m)

(set n nil)

)

 

avant de lancer la routine, pour assurer le coup.

 

Sinon, si tu pouvais faire d'abord raster_purge puis xref_purge et ensuite seulement spurge on pourrais localiser l'erreur.

 

[Edité le 12/6/2006 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

bonsoir Gile

je viens de faire plusieurs test sur "spurge" la dernière sur acad2000 avec la bonne version purge_xref

j'ai des résultats bizarre .Tout dépend de ce que l'on insert ou pas.

 

1)un xref comprenant 20 blocs (avec spurge seul) + bloc seul = boucle sans fin

en rajoutant raster ou purge_xref =la meme chose

avec puge_xref seul detache l'xref avec chemin connu+retour:

erreur automation aucune description n'a été entrée

 

2)raster_purge seul ne me renvoi aucune erreur

 

purge _xref me renvoi ;erreur automation aucune description n'a été entrée

et me purge l' xref dont le chemin est connu et laisse biensur le bloc unique

et donc pas de retour de vla-auditinfo

 

3)dessin vierge spurge seul ..retour OK

spurge+purge_xref ... retour OK

 

4) dessin avec 1 xref (sans bloc) avec spurge+xref_purge= erreur type d'argument incorrect :consp nil

idem avec spurge seul

avec purge_xref seul = erreur automation aucune description n'a été entrée et il m'enleve

l'xref dont le chemin est connu .

 

Bon j'arrete cela devient un peu brouillon,jespère que ca va t'aider

 

[Edité le 12/6/2006 par sergeluc]

Lien vers le commentaire
Partager sur d’autres sites

Merci,

 

À cause d'une confusion, ce long fil a débouché sur 2 types de routines, un qui, il me semblait, t'intéressait :

 

purge_xref et purge_raster qui détachent les xrefs ou les images raster introuvables (dont le chemin n'est plus valide

 

L'autre qui voulait répondre à la demande de Fraid :

 

xref_purge et raster_purge qui purgent les xrefs ou les images non référencées (dont plus aucune référence n'est insérée dans le dessin mais qui subsistent dans les collection ou dictionnaire), ce sont ces deux dernières qui sont appelées automatiquement dans spurge

 

Je reconnais que les noms des routines prètent à confusion, mais je ne comprends pas tout aux test que tu as fait.

 

Je verrai çà demain au calme.

 

Merci encore.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

J'ai (encore) corrigé SPURGE, les xrefs et rasters non référencés sont purgés avant de lancer la boucle qui purge tout tant qu'il reste des définitions des "sous-blocs" des blocs imbriqués purgés.

Il me semble que c'est cette partie du code qui posait problème avec les xrefs et les blocs éventuellement contenus dans ces xrefs.

 

Merci encore aux testeurs pour leur patience.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Encore une faille détectée (et réparée, j'espère) la présence de blocs anonymes dans les xrefs

 

À partir de maintenant, le vais mettre des numéros de versions afin qu'on puisse se retrouver dans ce dédale de corrections

 

Celle-ci sera la version 1.0 (même si c'est loin d'être la première !)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

bonjour gile

 

je suis content que le sujet t'interresse autant

 

le lisp ne veut pas fonctionner sur mon poste

j'ai toujours lle meme message d'erreur

 

 

Commande: _spurge ; erreur: Erreur Automation. Aucune description n'a été

entrée

 

par contre les images sont bien enlevé

meme un peu trop puisque si une image est dans un bloc il ne la considere pas dans le dessin

c'est genant

cela m'arrive d'inserer des image et de les transformer en bloc pour pouvoir tripoter leur x et y indépendament

 

c'est dingue comme une chose simple peut devenir compliquée

Lien vers le commentaire
Partager sur d’autres sites

c'est dingue comme une chose simple peut devenir compliquée

 

Je suis en train de m'apercevoir que la gestion en programmation des blocs, xrefs, rasters et toutes leurs possibles imbrications n'est pas une chose "simple", ou alors, c'est que je m'y prends mal.

 

Je modifie raster_purge, les images insérées dans des blocs ne sont plus purgées même s'il n'y a pas de référence de l'image dans le dessin.

 

Pour l'autre erreur, je ne vois pas, si tu pouvais me décrire un peu les circonstances, voir si elle intervient dans raster_purge, xref_purge ou uniquement dans spurge.

 

Je pense ouvrir un nouveau fil, celui-ci devient trop long ...

 

[Edité le 13/6/2006 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité