PHILPHIL Posté(e) le 1 février 2022 Partager Posté(e) le 1 février 2022 bonjour j'essaie de modifier un LISP ( de Gile) pour qu'il travaille sur tous les fichier d'un répertoire sans passer par LISPTOR ou SUPERAUTOSCRIPT c'est dans le bout de lisp "TESTOUVRIRFERMER" que ca plante j'arrive a ouvrir le fichier, mais apparemment, le lisp ne travaille pas dans le fichier nouvellement ouvert, mais dans le fichier de base ou a été lancer le lisp comment faire comprendre qu'il doit etre dans le fichier nouvellement ouvert ? apres ((vla-open (vla-get-documents (vlax-get-acad-object)) (strcat rep "/" filename))) je suppose que apres le travail dans le fichier ouvert, il faudra retourner dans le fichier de base et dire de fermer le fichier ouvert non ? comment ? Merci Phil (defun c:travailsousrepertoire (/ filename dirbox rep ) (defun dirbox (txt / cdl rep) (if (setq cdl (vlax-create-object "Shell.Application")) (progn (and (setq rep (vlax-invoke cdl 'browseforfolder 0 txt 512 "")) (setq rep (vlax-get-property (vlax-get-property rep 'self) 'path)) ) (vlax-release-object cdl) ) ) rep ) (setq rep (dirbox "Choisissez un répertoire pour traiter tous les dessins.")) (foreach filename (append (vl-directory-files rep "*.dwg" 1) (vl-directory-files rep "*.dwt" 1)) (setq filename1 (strcat rep "/" filename)) (if (testouvrirfermer) (princ (strcat "\nLe traitement du fichier " filename " terminée.")) (princ (strcat "\nLe traitement du fichier " filename " a échoué.")) ) ) (princ) ) (defun testouvrirfermer () ((vla-open (vla-get-documents (vlax-get-acad-object)) (strcat rep "/" filename))) (setvar "cmdecho" 0) (command-s "-calque" "ch" 0 "") (command-s "zoom" "et") (command-s "-purger" "APPSENREG" "*" "n") (command-s "_close" "n") (princ) ) 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 More sharing options...
(gile) Posté(e) le 1 février 2022 Partager Posté(e) le 1 février 2022 Le LISP ne fonctionne que dans le contexte du document dans lequel il a été lancé. Pour travailler sur d'autres dwg, tu peux utiliser ObjectDBX qui permet d'accéder à la base de donnée d'un fichier fermer (en fait de l'ouvrir en mémoire mais pas dans l'éditeur). Cette méthode n'autorise que les fonction vla_ ou vlax- pour lire/écrire dans le fichier. Sinon, SAS est très bien pour faire du traitement par lot. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD Lien vers le commentaire Partager sur d’autres sites More sharing options...
PHILPHIL Posté(e) le 1 février 2022 Auteur Partager Posté(e) le 1 février 2022 hello Gile comment faire comprendre qu'il doit aller dans le fichier nouvellement ouvert ? et en ressortir la réponse me permet de regler d'autre lisp que celui ci. et je ne veux pas utiliser SAS (vla-active.... merci 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 More sharing options...
Luna Posté(e) le 1 février 2022 Partager Posté(e) le 1 février 2022 Heya, J'ai trouvé ceci dans l'aide AutoCAD : @nancy.ice wrote: Hi All, I am looking for a LISP routine that will delete a block from multiple drawings. (Defun c:DeleteBlockName (/ f filesToProcess cnt odbx) (if (and (setq f (acet-ui-pickdir "Select folder to process" (getvar 'dwgprefix) ) ) (setq filesToProcess (vl-directory-files f "*.dwg" 1)) (setq blkname (vl-princ-to-string (lisped (if blkname blkname "Enter Block name")))) (not (member blkname '("0" "-1"))) (snvalid blkname) ) (progn (if (< (atoi (substr (getvar "ACADVER") 1 2)) 16) (setq odbx (vlax-get-or-create-object "ObjectDBX.AxDbDocument")) (setq odbx (vlax-get-or-create-object (strcat "ObjectDBX.AxDbDocument." (substr (getvar "ACADVER") 1 2) ) ) ) ) (foreach itm filesToProcess (setq cnt 0) (if (not (vl-catch-all-error-p (vl-Catch-All-Apply '(lambda () (vla-open odbx (setq fullname (strcat f "\\" itm))) ) ) ) ) (progn (vlax-for layout (vla-get-layouts odbx) (vlax-for objBlock (vla-get-block layout) (if (and (vlax-write-enabled-p objBlock) (= (setq objtype (vla-get-objectname objBlock)) "AcDbBlockReference" ) (eq (strcase (Vlax-get objBlock 'effectivename) ) blkname ) ) (progn (Vla-delete objBlock) (setq cnt (1+ cnt)) ) ) ) ) (if (> cnt 0) (progn (vla-saveas odbx fullname) (princ (strcat "\n" (vl-filename-base fullname) "\nDeleted " (itoa cnt) " block(s) : " blkname )))) ) ) ) (vlax-release-object odbx) ) ) (princ) ) ;; Routine écrite par pbejse Cela correspond à la suggestion de @(gile) en utilisant ObjectDBX Bisous, Luna Lien vers le commentaire Partager sur d’autres sites More sharing options...
bonuscad Posté(e) le 1 février 2022 Partager Posté(e) le 1 février 2022 Si tu ne veux qu'utiliser des commandes standard d'autocad (pas de commandes de produit verticaux ex: commande mapinsert d'autocadmap) et un peu de lisp (vanilla, pas activeX), la solution accoreconsole est sympa, plus rapide car elle n'utilise pas le moteur graphique d'autocad. Un exemple à adapter, celui ci enlève les dictionnaires de produit verticaux (Covadis, Architecture) du dessin,purge, fait un contrôle du fichier et enregistre au format 2013. Pour exécuter cela il suffit de copier-coller le code dans un nouveau dessin et de désigner le dossier à traiter. ((lambda ( / f_exe ShlObj Folder FldObj Out_Fld file_scr file_bat) (vl-load-com) (setq f_exe (findfile "accoreconsole.exe")) (setq ShlObj (vla-getinterfaceobject (vlax-get-acad-object) "Shell.Application") Folder (vlax-invoke-method ShlObj 'BrowseForFolder 0 "" 0) ) (vlax-release-object ShlObj) (if Folder (progn (setq FldObj (vlax-get-property Folder 'Self) Out_Fld (vlax-get-property FldObj 'Path) ) (vlax-release-object Folder) (vlax-release-object FldObj) ) ) (setq file_scr (open (strcat (getvar "ROAMABLEROOTPREFIX") "support\\update.scr") "w")) (write-line "((lambda ( / ) (foreach p (entget (namedobjdict)) (if (and (= 3 (car p)) (or (wcmatch (cdr p) \"COVA_*\") (wcmatch (cdr p) \"AEC_*\"))) (dictremove (namedobjdict) (cdr p))))))" file_scr) (write-line "(command \"_.audit\" \"_Yes\")" file_scr) (write-line "(command \"_.-purge\" \"_Regapps\" \"*\" \"_No\")" file_scr) (write-line "(command \"_.-purge\" \"_All\" \"*\" \"_No\")" file_scr) (write-line "(command \"_.saveas\" \"_LT2013\" \"\" \"_Yes\")" file_scr) (close file_scr) (setq file_bat (open (strcat (getvar "ROAMABLEROOTPREFIX") "support\\update.bat") "w")) (write-line (eval (read "(strcat \"set accoreexe=\" \"\\\"\" f_exe \"\\\"\")")) file_bat) (write-line (eval (read "(strcat \"set source=\" \"\\\"\" Out_Fld \"\\\"\")")) file_bat) (write-line (eval (read "(strcat \"set script=\" \"\\\"\" (getvar \"ROAMABLEROOTPREFIX\") \"support\\\\update.scr\" \"\\\"\")")) file_bat) (write-line "FOR /f \"delims=\" %%f IN ('dir /b \"%source%\\\*.dwg\"') DO %accoreexe% /i \"%source%\\%%f\" /s %script%" file_bat) (close file_bat) (startapp (strcat (getvar "ROAMABLEROOTPREFIX") "support\\update.bat")) (princ"\Job finished") (prin1) )) Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius Lien vers le commentaire Partager sur d’autres sites More sharing options...
GEGEMATIC Posté(e) le 1 février 2022 Partager Posté(e) le 1 février 2022 @Luna Salut, A ma connaissance le dbx est la solution la plus élégante (et rapide), mais comme elle ne donne accès qu'aux méthodes et propriétés "com", on ne peut pas tout faire. je ne me rappelle pas de toutes les limitations, mais par exemple, faire un zoom étendu pour que l’aperçu d'un dessin soit parlant, pas possible. Il faut passer par un script, comme Bruno le propose en mode XXL, car il va jusqu’à automatiser le lancement du script ... a+ gégé ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com Lien vers le commentaire Partager sur d’autres sites More sharing options...
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