(gile) Posté(e) le 20 juillet 2008 Posté(e) le 20 juillet 2008 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
PHILPHIL Posté(e) le 20 juillet 2008 Posté(e) le 20 juillet 2008 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] FREELANCE Autodesk Architecture 2025 sous windows 11 64 REVIT 24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal
(gile) Posté(e) le 20 juillet 2008 Auteur Posté(e) le 20 juillet 2008 Oupss !!!... Un copier/coller malheureux s'était immiscé dans raster_purge.C'est réparé. Merci de me dire si ça fonctionne malgré les objets AEC. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 20 juillet 2008 Posté(e) le 20 juillet 2008 (gile) Ca continue de planter, mais je pense que cela est du à la présence des blocs dans les xrefs de la varibale blst @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 20 juillet 2008 Auteur Posté(e) le 20 juillet 2008 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
PHILPHIL Posté(e) le 20 juillet 2008 Posté(e) le 20 juillet 2008 hello gile il foit manquer une prarenthese fermante quelque partla dedans mais ou ?? mystere pour moi ........ ........ au dire du formatage du LISP de VISUAL LISPphil[Edité le 20/7/2008 par PHILPHIL] [Edité le 20/7/2008 par PHILPHIL] FREELANCE Autodesk Architecture 2025 sous windows 11 64 REVIT 24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal
(gile) Posté(e) le 20 juillet 2008 Auteur Posté(e) le 20 juillet 2008 Décidément, j'ai le copier/coller qui bafouille ce soir :calim: C'est réparé. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
PHILPHIL Posté(e) le 20 juillet 2008 Posté(e) le 20 juillet 2008 hello gile aussitot réparéaussitot tester oups dsl bug bon ok mea kulpaautodesk architecture 2009 + vista de #£$¤%§ ( si ca a son influence bien sur ) Commande: spurge *Annuler* type d'argument incorrect: VLA-OBJECT nil phil FREELANCE Autodesk Architecture 2025 sous windows 11 64 REVIT 24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal
(gile) Posté(e) le 20 juillet 2008 Auteur Posté(e) le 20 juillet 2008 Trouvé, une variable globale (*blocks*) qui trainaitC'est réparé. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
PHILPHIL Posté(e) le 21 juillet 2008 Posté(e) le 21 juillet 2008 hello ca marche merci phil FREELANCE Autodesk Architecture 2025 sous windows 11 64 REVIT 24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal
(gile) Posté(e) le 21 juillet 2008 Auteur Posté(e) le 21 juillet 2008 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
PHILPHIL Posté(e) le 21 juillet 2008 Posté(e) le 21 juillet 2008 hello est ce que ca purge les petits programmes implanté dans les fichiers aussi?? -purger"appsenreg" ca s'appelle bien comme ca ?? phil FREELANCE Autodesk Architecture 2025 sous windows 11 64 REVIT 24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal
(gile) Posté(e) le 21 juillet 2008 Auteur Posté(e) le 21 juillet 2008 Bien vu PHILPHIL, En fait vla-purgeall ne purge vraiment pas tout, je vais essayer de ne rien oublier... Je modifie le code (version 2.3) pur la purge des applications enregistrées non référencées. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 21 juillet 2008 Auteur Posté(e) le 21 juillet 2008 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
PHILPHIL Posté(e) le 23 juillet 2008 Posté(e) le 23 juillet 2008 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] FREELANCE Autodesk Architecture 2025 sous windows 11 64 REVIT 24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal
(gile) Posté(e) le 23 juillet 2008 Auteur Posté(e) le 23 juillet 2008 Effectivement :calim: Merci, c'est réparé. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 24 juillet 2008 Auteur Posté(e) le 24 juillet 2008 Mille excuses PHILPHIL, je n'avais pas bien lu ton message. Pour supprimer les xrefs "introuvables (dont le chemin n'est plus valide) j'avais fait PURGE_XREF (Oui je sais les noms prêtent à confusion...) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
GEGEMATIC Posté(e) le 4 avril 2023 Posté(e) le 4 avril 2023 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.frBlog: http://g-eaux.over-blog.com
Fraid Posté(e) le 5 avril 2023 Posté(e) le 5 avril 2023 Bonjour, Que cherche tu a faire exactement? Détacher toutes les images? https://github.com/Fraiddd
GEGEMATIC Posté(e) le 5 avril 2023 Posté(e) le 5 avril 2023 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.frBlog: http://g-eaux.over-blog.com
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant