Aller au contenu

Super purge


(gile)

Messages recommandés

Salut,

 

Suite à ce sujet (qui faisait déjà suite à celui-ci), voilà une nouvelle mouture de Spurge, l'algorithme est différent et devrait être un peu plus rapide.

 

Les routines xref_purge et raster_purge (pour purger les xrefs et les images raster non référencées) ont été toilettées.

Ces routine peuvent être appelées indépendamment.

 

Spurge, après avoir lancé les deux routine précédentes (si elles sont chargées), purge tout le dessin (y compris les blocs imbriqués, et les blocs vides) et effectue un audit.

 

;;; RASTER_PURGE version 1.2 (gile) 20/07/08
;;; Purge les images raster non référencées ou non contenues dans des blocs

(defun c:raster_purge
      (/ AcDoc l_lst im_dict im_lst ss name obj bloc ent)

 ;; 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

 (vlax-for lay (vla-get-Layers AcDoc)
   (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
     (vlax-for o im_dict (setq im_lst (cons o im_lst)))

     ;; Suppression de la liste des images insérées dans le dessin

     (if (ssget "_X" '((0 . "IMAGE")))
(vlax-for i (setq ss (vla-get-ActiveSelectionSet AcDoc))
  (setq	im_lst (vl-remove (vla-item im_dict (vla-get-Name i))
			  im_lst
	       )
  )
)
     )
     (and ss (vla-delete ss))

     ;; Suppression de la liste des images contenues dans les définitions de blocs

     (vlax-for b (vla-get-Blocks AcDoc)
  (if
    (and
      (not (wcmatch (setq name (vla-get-Name b)) "`**_Space*"))
      (= (vla-get-isXref b) :vlax-false)
    )
     (vlax-for o b
       (if (= (vla-get-ObjectName o) "AcDbRasterImage")
	 (setq im_lst
	       (vl-remove (vla-item im_dict (vla-get-Name o))
			  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

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

 

;;; XREF_PURGE version 1.3
;;; Purge les xrefs non référencées

(defun c:xref_purge
      (/ AcDoc l_lst blocks name n_lst cnt item obj x_lst)

 ;; 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

 (vlax-for lay (vla-get-Layers AcDoc)
   (if	(= :vlax-true
   (vla-get-lock lay)
)
     (progn
(vla-put-lock lay :vlax-false)
(setq l_lst (cons lay l_lst))
     )
   )
 )

 ;; Pour chaque nom de xref de la collection, on teste si une référence
 ;; est présente dans le dessin, si non la xref est détachée du dessin

 (vlax-for x (setq blocks (vla-get-Blocks AcDoc))
   (if	(and (= :vlax-true (vla-get-isXref x))
     (/= 0 (vla-get-count x))
     (not (member (setq name (vla-get-name x)) n_lst))
)
     (setq n_lst (cons name n_lst))
   )
 )
 (foreach n n_lst
   (vlax-for obj (vla-item blocks (eval n))
     (if (and (= (vla-get-objectname obj) "AcDbBlockReference")
       (member (vla-get-Name obj) n_lst)
  )
(setq x_lst (cons (vla-get-Name obj) x_lst))
     )
   )
 )
 (foreach n n_lst
   (if	(member (eval n) x_lst)
     (setq n_lst (vl-remove (eval n) n_lst))
   )
 )
 (foreach n n_lst
   (if	(not
  (ssget "_X"
	 (list (cons 0 "INSERT") (cons 2 (eval n)))
  )
)
     (vla-detach (vla-item (vla-get-Blocks AcDoc) (eval n)))
   )
 )

 ;; Restauration de l'état des calques

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

 

;;; SPURGE version 2.4 (gile) 21/07/08
;;; Purge tout, y compris les blocs imbriqués, les blocs vides,
;;; les xrefs, les images et les applications non référencées
;;; Exécute les fonctions LISP c:xref_purge et c:raster_purge

(defun c:spurge	(/ AcDoc Blocks name blst dict lst tbl ss stl used)

 (vl-load-com)

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

 ;; Purge et audit du dessin

 (defun nest-level (lst cnt / sub)
   (if	lst
     (progn
(setq sub nil)
(vlax-for o (vla-item Blocks (car lst))
  (if (= (vla-get-ObjectName o) "AcDbBlockReference")
    (setq sub (cons (vla-get-Name o) sub))
  )
)
(if sub
  (append (nest-level sub (1+ cnt))
	  (nest-level (cdr lst) cnt)
  )
  (cons cnt (nest-level (cdr lst) cnt))
)
     )
   )
 )

 (vlax-for b Blocks
   (if	(and
  (not (wcmatch (setq name (vla-get-Name b)) "`*[~T]*,*|*"))
  (= (vla-get-isXref b) :vlax-false)
)
     (if (= (vla-get-Count b) 0)
(if (ssget "_X"
	   (list '(0 . "INSERT") (cons 2 (vla-get-Name b)))
    )
  (progn
    (vlax-for o	(setq ss (vla-get-ActiveSelectionSet AcDoc))
      (vla-delete o)
    )
    (vla-delete ss)
  )
)
(setq blst (cons (vla-get-Name b) blst))
     )
   )
 )
 (setvar "cmdecho" 0)
 (repeat (1+ (apply 'max (nest-level blst 0)))
   (vl-cmdf "_.purge" "_all" "" "_no")
 )
 (vl-cmdf "_.purge" "_regapp" "" "_no")
 (setvar "cmdecho" 1)

 ;; Purge les xrefs et rasters non référencées

 (and c:xref_purge (c:xref_purge))
 (and c:raster_purge (c:raster_purge))

 (vla-AuditInfo AcDoc :vlax-true)
)

[Edité le 21/7/2008 par (gile)]

 

[Edité le 23/7/2008 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

hello gile

 

je viens de tester "SPURGE"

sur un fichier normal

 

je suis en version autodesk architecture 2009 avec des objets AEC, blocs paramétriques, des xrefs

 

et j'ai ca comme réponse sur la ligne de commande

 

 
Commande: spurge
*Annuler*
nombre d'arguments insuffisants
Commande: spurge
*Annuler*
nombre d'arguments insuffisants

 

si ca peut t'aider

 

patrick_35 si tu passes par la j'ai la meme chose en essayant SPURGE sur le fichier test que je t'ai envoye

 

 

phil

 

[Edité le 20/7/2008 par PHILPHIL]

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Ca continue de planter, mais je pense que cela est du à la présence des blocs dans les xrefs de la varibale blst

 

Je ne pense pas que ça puisse faire planter la routine, blst sert juste d'argument à nest-level qui retourne un liste de niveaux d'imbrication des blocs dont le plus grand sert à déterminer le nombre d'exécutions de vla-purgeall.

Je modifie quand même la routine pour écarter les blocs contenus dans les xrefs (dont le nom contient une barre verticale).

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

Lien vers le commentaire
Partager sur d’autres sites

hello gile

 

il foit manquer une prarenthese fermante quelque part

la dedans mais ou ?? mystere pour moi

 

....

....

 

....

....

 

au dire du formatage du LISP de VISUAL LISP

phil[Edité le 20/7/2008 par PHILPHIL]

 

[Edité le 20/7/2008 par PHILPHIL]

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

hello gile

 

aussitot réparé

aussitot tester

 

oups dsl bug

 

bon ok mea kulpa

autodesk architecture 2009 + vista de #£$¤%§ ( si ca a son influence bien sur )

 

 
Commande: spurge
*Annuler*
type d'argument incorrect: VLA-OBJECT nil

 

 

phil

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

ca marche

 

Merci.

 

En fait, pas tout à fait, je viens de remarquer que vla-purgeall ne purge pas les styles de tableau (en tout cas chez moi).

 

Je modifie le code (version 2.2) pour y intégrer la purege des styles de tableaux non utilisés.

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

Lien vers le commentaire
Partager sur d’autres sites

Bon, vla-purgeall ne purgeant ni les applications, ni les styles visuels, ni les matériaux, ...

Comme quoi, des fois Visual LISP c'est pas le "top" ...

J'ai donc opté pour l'utilisation de la commande PURGER (vl-cmdf _purge ...) :(

 

[Edité le 21/7/2008 par (gile)]

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

Lien vers le commentaire
Partager sur d’autres sites

hello gile

 

il manque pas la toute derniere parenthese à la fin pour

 

SPURGE 2.4

 

enfin c'est la que je l'ai rajouter

 

pour : XREF_PURGE 1.3

 

quelle est la veritable différence entre un XREF estanpillé "introuvable " et un "non référencé"

 

l'introuvable est dans la liste des xrefs avec son chemin connu mais il ne le trouve pas et est implanté dans le fichier *.dwg

 

le non référencé est dans la liste des xrefs avec son chemin connu mais il ne le trouve pas et N'EST PAS implanté dans le fichier *.dwg

 

la seule différence reside dans le fait que l'un un point d'implantation et pas l'autre

 

est ce le LISP ne pourrait pas demander si on veux virer les XREF qui sont "introuvable" et viré d'office les "non référencé"

 

a+

 

phil

 

[Edité le 23/7/2008 par PHILPHIL]

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

  • 14 ans après...

Salut a tous, et a Gile en particulier,

je suis étonné qu'une page traitant d'un pb aussi courant soit aussi vieille ?

Il y a une nouvelle version quelque part ?

Parceque sur celle là, j'ai un problème, c'est que lorsqu'une image a été renommée, ce nom n'est que dans le dictionnaire, pas dans la propriété name, qui pointe plutôt vers le filename.

pour trouver ce nouveau nom je dois faire ça:

;; Recherche du "dictionnaire" des images (s'il existe)
 (setq
   im_dict (vl-catch-all-apply
      'vla-item
      (list (vla-get-Dictionaries (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)))) "ACAD_IMAGE_DICT")
    )
 )
 (if (vl-catch-all-error-p im_dict)
   (setq im_dict nil)
 )
(cdr (assoc 3 (entget (handent (vla-get-handle im_dict)))))
->
"Logo_OGE_RN"

là j'ai le bon nom pour le détacher, mais comment faire le lien entre l'image à détacher, parcequ'elle est unresolved ou unreferenced, et son nom de scène ?

encore une emmerde et il faut que je tombe dessus...

a+

gégé

 

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Non, détacher que les images non référencées OU les images non résolues.

Et en fait, dès le 1er dessin, je suis tombé sur un image qui ne s'enlevait pas.

j'avais le même pb avec mon lisp à moi, c'est pour ça que je l'avais décrit comme "pas finit"

En fait cette image a été renommée.

Je sais que j'ai déjà eu ce problème de liaison entre les informations d' un dictionnaire et d'entité, que j'avais résolu, mais je ne me souvient plus de quoi il s'agissait.

Bon c'est pas grave, je vais déjà essayer le script console avec spurge, ça enlèvera 99% des pb ...

a+

Gégé

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

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é