Aller au contenu

travailler tout un répertoire


PHILPHIL

Messages recommandés

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

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

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

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

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

@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.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é