(gile) Posté(e) le 10 juin 2006 Posté(e) le 10 juin 2006 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
(gile) Posté(e) le 12 juin 2006 Posté(e) le 12 juin 2006 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
Fraid Posté(e) le 12 juin 2006 Auteur Posté(e) le 12 juin 2006 merci beaucoup gile :D je suis sur d'envoyer des plans "propres" maintenant https://github.com/Fraiddd
(gile) Posté(e) le 12 juin 2006 Posté(e) le 12 juin 2006 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
Patrick_35 Posté(e) le 12 juin 2006 Posté(e) le 12 juin 2006 SalutCa me fais penser qu'il y a aussi un lisp dans ce sujet @+ 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 12 juin 2006 Posté(e) le 12 juin 2006 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
Fraid Posté(e) le 12 juin 2006 Auteur Posté(e) le 12 juin 2006 désolé gile mais cela ne marche pas encore chez moi Commande: _spurge ; erreur: Erreur Automation. Aucune description n'a été entrée. :casstet: https://github.com/Fraiddd
(gile) Posté(e) le 12 juin 2006 Posté(e) le 12 juin 2006 désolé gile mais cela ne marche pas encore chez moi Avec la dernière version ? As tu le même problème avec la précédente ? ou bien le problème vient-il de raster_purge ou xref_purge ? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Fraid Posté(e) le 12 juin 2006 Auteur Posté(e) le 12 juin 2006 c'est la derniere qui me donne ce message d'erreurr je ne sais pas du tout pourquoi ni quelle partie? https://github.com/Fraiddd
(gile) Posté(e) le 12 juin 2006 Posté(e) le 12 juin 2006 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
sergeluc Posté(e) le 12 juin 2006 Posté(e) le 12 juin 2006 bonsoir Gileje viens de faire plusieurs test sur "spurge" la dernière sur acad2000 avec la bonne version purge_xrefj'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 finen rajoutant raster ou purge_xref =la meme choseavec 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éeet me purge l' xref dont le chemin est connu et laisse biensur le bloc uniqueet donc pas de retour de vla-auditinfo 3)dessin vierge spurge seul ..retour OKspurge+purge_xref ... retour OK 4) dessin avec 1 xref (sans bloc) avec spurge+xref_purge= erreur type d'argument incorrect :consp nilidem avec spurge seulavec purge_xref seul = erreur automation aucune description n'a été entrée et il m'enlevel'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]
(gile) Posté(e) le 12 juin 2006 Posté(e) le 12 juin 2006 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
(gile) Posté(e) le 13 juin 2006 Posté(e) le 13 juin 2006 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
(gile) Posté(e) le 13 juin 2006 Posté(e) le 13 juin 2006 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
Fraid Posté(e) le 13 juin 2006 Auteur Posté(e) le 13 juin 2006 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 genantcela 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 https://github.com/Fraiddd
(gile) Posté(e) le 13 juin 2006 Posté(e) le 13 juin 2006 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
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