Aller au contenu

vla-save vla-close ... sauvegarder l\'objet et dessin


Messages recommandés

Posté(e)

Bonjours

 

J'explique ce que je veux faire: j'ouvre des dessins manuellement avec autocad ensuite je lance ma commande qui devrais changer un entité text dans mon dessin ensuite qui devrait passé a lautre dessin qui n'est pas actif encore, ainsi de suite (éventuellement le sauvegarder et le fermer)

 

Voila comment je mis prend (je ne suis pas super familier avec les fonction vla, vlax ...)

 
(vl-load-com)
(defun BatchProcess ( / AcadObj ActiveDoc DocObj DocList DwgName DwgObj)

(setq AcadObj (vlax-get-Acad-Object))
 (setq ActiveDoc (vla-get-ActiveDocument AcadObj))
 (setq DocObj (vla-get-Documents AcadObj))
 (vlax-for doc DocObj
       (setq DocList (cons (cons (vla-get-Name doc) doc) DocLifst))
 )

 (foreach dwg DocList

   	(setq DwgName (car dwg)
      DwgObj  (cdr dwg)
)
       (if (not (equal ActiveDoc DwgObj))
    (vla-activate DwgObj)
       )
       (ProNestTHK)  ;;; ma fonction qui modifie l'entité text
;;;    	(vla-save DwgObj)
;;;  	(vla-close DwgObj)
 )
)

 

le probleme est que je suis pas capable de tracé mon bug apres le (vla-activate DwgObj) le petit sablier apparait est j'ai beau vouloir avancer avec F8 je n'arrive pas a tracé mon bug

 

j'ai fouiller un peux sur le forum je n'ai pas encore trouver la solution si quelqu'un a une idée

 

Merci et bonne journée

 

[Edité le 26/5/2011 par Jipicad]

Posté(e)

Salut,

 

Un LISP lancé dans un document n'est actif que dans ce document.

Si ton code active un autre document il continue son exécution dans le document dans lequel il a été lancé (d'où le sablier).

 

Tu peux agir sur un document ouvert mais non actif, mais sans avoir accès à l'éditeur (pas d'interventions utilisateur, ni d'appels à command ,ni de sélection).

Tu peux aussi agir sur des dessins fermer en utilisant ObjectDBX (voir ici par exemple).

 

Je ne peux guère t'en dire plus, ne sachant pas ce que fait ta fonction ProNestTHK.

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

Posté(e)

Voici mes autre fonctions :

 

(defun ProNestTHK ( / TEXTSSet TEXTEntities Cpt Dxf Directory Thickness String->List PlasmaThk EntityModify UpperVal LowerVal)

 (setq TEXTSSet	(ssget "X" '((0 . "TEXT") (8 . "Undertitle")))
Cpt		0
Directory	"F:/Echange/Jean-Philippe/ProNest/Batch Process/Thickness.txt"
PlasmaThk	(readfile Directory)
 )
 ; Create TEXT Entities List
 (repeat (sslength TEXTSSet)
   	(setq TEXTEntities (append TEXTEntities (list (ssname TEXTSSet Cpt)))
      Cpt (+ Cpt 1)
)
 )
 (mapcar '(lambda (Ent)
     	(setq Dxf (cdr (assoc 1 (entget Ent))))
        ; Retrieve Thickness attribute of the list
     	(if (wcmatch Dxf "*THICKNESS*")
	    (progn
	      	(setq Thickness (vl-string-left-trim "THICKNESS=" Dxf)
	              String->List (vl-string->list Thickness)
		      String->List (reverse
				  	(vl-remove-if '(lambda (Int)
							  (or (= Int 76);|L|;(= Int 212);|Ô|;(= Int 112);|p|;
							      (= Int 80);|P|;(= Int 101);|E|;(= Int 116);|t|;
							      (= Int 70);|F|;(= Int 102);|f|;(= Int 108);|l|;
							      (= Int 84);|T|;(= Int 108);|l|;(= Int 244);|ô|;
							  )
						       )
					  	       String->List
					)
				   )
		)
		(repeat (length (vl-remove-if-not '(lambda (Numb) (= Numb 42)) String->List)) (setq String->List (cdr (member 42 String->List))))
		(setq Thickness   (vl-list->string (reverse String->List)))
	        ; Modify Thickness of drawing for compatibility with PRONEST
	        (setq PlasmaThk
			      	(vl-sort (append (list (atof Thickness))
						 (mapcar '(lambda (X)
		    						(atof X)
		 					  )
		 					  PlasmaThk
						 )
				         )
					'(lambda (e1 e2) (< e1 e2))
				)
		      UpperVal  (nth (1+ (vl-position (atof Thickness) PlasmaThk)) PlasmaThk)
		      LowerVal  (nth (1- (vl-position (atof Thickness) PlasmaThk)) PlasmaThk)
		)
	        (if (> (atof Thickness) 4)
		    (progn
			(cond ((= (RoundUp UpperVal) (atof Thickness))
			       (setq Thickness (strcat "THICKNESS=" (rtos UpperVal 2 3)))
			      )
			      ((= (RoundUp LowerVal) (atof Thickness))
			       (setq Thickness (strcat "THICKNESS=" (rtos LowerVal 2 3)))
			      )
			)
		    )
		    (progn
			(cond ((= (atof (rtos UpperVal 2 1)) (atof Thickness))
			       (setq Thickness (strcat "THICKNESS=" (rtos UpperVal 2 3)))
			      )
			      ((= (atof (rtos LowerVal 2 1)) (atof Thickness))
			       (setq Thickness (strcat "THICKNESS=" (rtos LowerVal 2 3)))
			      )
			      (T (setq Thickness (strcat "THICKNESS=" (rtos UpperVal 2 3))))
			)
		    )
		)
		; Update Entity in drawing
	      	(setq EntityModify (subst (cons 1 Thickness) (assoc 1 (entget Ent)) (entget Ent)))
	        (entmod EntityModify)
	    )
	)
   )
   TEXTEntities
 ) 
)

; Function readfile
;
; Parameter : FilePath -> a file directory
;
; Initial realese : 20-04-2011 Jean-Philippe Proulx
;
; Call sample : (readfile "F:/Echange/Jean-Philippe/ProNest/Batch Process/Thickness.txt")
(defun readfile (FilePath / File Info ACTIVE)

  (setq File (open FilePath "r")
 ACTIVE T
  )
  (while ACTIVE
      
     (setq ACTIVE	(read-line File)
    Info 	(append (list ACTIVE) Info)
     )
  )
  (vl-remove nil Info)
)

; Function RoundUp
;
; Parameter : Real -> a real number
;
; Initial realese : 20-04-2011 Jean-Philippe Proulx
;
; Call sample : (RoundUp 4.36) (RoundUp 4.76)
(defun RoundUp (Real / test)
  (if (= (max Real (+ (fix Real) 0.5)) Real)
      (setq test (+ (fix Real) 1))
      (setq test (fix Real))
  )
)

Posté(e)

Comme je le disais, tu ne peux pas utiliser ssget.

 

Par contre, tu peux parcourir tout l'espace objet (et/ou les espaces papier) à la recherche des objets texte qui t'intéressent pour les traiter.

 

Si tu veux traiter des dessins ouverts :

(vlax-for doc (vla-get-Documents (vlax-get-acad-object)) ...)

te permet d'accéder à chacun des documents ouverts dan la session courante.

 

Puis :

(vlax-for obj (vla-get-ModelSpace doc) ...)

te permet d'accéder à chacun des objets (vla-object) de l'espace objet du document et d'évaluer si c'est un texte sur le calque "Undertitle" dont la valeur contient "*THICKNESS*" :

(if
 (and
   (= (vla-get-ObjectName obj) "AcDbText")
   (= (vla-get-ObjectName obj) "Undertitle")
   (wcmatch (vla-get-TextString obj) "*THICKNESS*")
 )
 ...
)

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

Posté(e)

Bonjour,

 

J'ai retravailler ma fonction avec les conseils que tu ma donner mais voila je sais pas comment faire pour sauvegarder mon object, le dessin et fermer par la suite j'obtien un erreur:

bad argument type: stringp 0.914

 

je crois que j'utilise les mauvaises fonctions (es-ce que vous auriez une index des fonction vla dans l'aide de vlide il y a rien du tout)

 

Voici mon code :

 

 
(vl-load-com)

(defun BatchProcess (/ Directory PlasmaThk THKString Thickness String->List UpperVal LowerVal)

 (setq	Directory "F:/Echange/Jean-Philippe/ProNest/Batch Process/Thickness.txt"
PlasmaThk (readfile Directory)
 )

 (vlax-for doc	(vla-get-Documents (vlax-get-acad-object))

   (vlax-for obj (vla-get-ModelSpace doc)

     (if (and (= (vla-get-ObjectName obj) "AcDbText")
       (wcmatch (vla-get-TextString obj) "*THICKNESS*")
  )
(progn
  (setq	THKString    (vlax-get-property obj 'TextString)
	Thickness    (vl-string-left-trim "THICKNESS=" THKString)
	String->List (vl-string->list Thickness)
	String->List (reverse
		       (vl-remove-if
			 '(lambda (Int)
			    (or	(= Int 76) ;|L|;
				(= Int 212) ;|Ô|;
				(= Int 112) ;|p|;
				(= Int 80) ;|P|;
				(= Int 101) ;|E|;
				(= Int 116) ;|t|;
				(= Int 70) ;|F|;
				(= Int 102) ;|f|;
				(= Int 108) ;|l|;
				(= Int 84) ;|T|;
				(= Int 108) ;|l|;
				(= Int 244) ;|ô|;
			    )
			  )
			 String->List
		       )
		     )
  )

  (repeat (length (vl-remove-if-not '(lambda (Numb) (= Numb 42)) String->List))
    (setq String->List (cdr (member 42 String->List)))
  )
  (setq Thickness (vl-list->string (reverse String->List)))
				; Modify Thickness of drawing for compatibility with PRONEST
  (setq	PlasmaThk (vl-sort (append (list (atof Thickness))
				   (mapcar '(lambda (X)
					      (atof X)
					    )
					   PlasmaThk
				   )
			   )
			   '(lambda (e1 e2) (< e1 e2))
		  )
	UpperVal  (nth (1+ (vl-position (atof Thickness) PlasmaThk)) PlasmaThk)
	LowerVal  (nth (1- (vl-position (atof Thickness) PlasmaThk)) PlasmaThk)
  )
  (if (> (atof Thickness) 4)
    (progn
      (cond ((= (RoundUp UpperVal) (atof Thickness))
	     (setq Thickness (strcat "THICKNESS=" (rtos UpperVal 2 3)))
	    )
	    ((= (RoundUp LowerVal) (atof Thickness))
	     (setq Thickness (strcat "THICKNESS=" (rtos LowerVal 2 3)))
	    )
      )
    )
    (progn
      (cond ((= (atof (rtos UpperVal 2 1)) (atof Thickness))
	     (setq Thickness (strcat "THICKNESS=" (rtos UpperVal 2 3)))
	    )
	    ((= (atof (rtos LowerVal 2 1)) (atof Thickness))
	     (setq Thickness (strcat "THICKNESS=" (rtos LowerVal 2 3)))
	    )
	    (T (setq Thickness (strcat "THICKNESS=" (rtos UpperVal 2 3))))
      )
    )
  )
  (setq Test nil)
  (vlax-put-property obj 'TextString Thickness)
  (vlax-release-object obj)
  (vlax-release-object doc)
;;;				  	; Update Entity in drawing
;;;		      		(setq EntityModify (subst (cons 1 Thickness) (assoc 1 (entget Ent)) (entget Ent)))
;;;		        	(entmod EntityModify)

  (vla-save doc)
  (vla-close doc)
)
     )
   )
 )
)

 

Posté(e)

Bon j'ai réglé mon erreur qui n'avait rien avoir avec les object désolé du dérangement mais sauvegarder et fermer les dessins je n'y arrive pas voila la fin de ma fonction :

 

(vlax-put-property obj 'TextString Thickness)  ;  Je modifi le TextSring de mon object
(vlax-release-object obj)                                     ;  J'update mon object

(vlax-release-object doc)                                    ;  Mon document du début n'existe plus
(vla-save doc)
(vla-close doc)

 

Merci et Bonne journée

Posté(e)

J'ai retravailler ma fonction j'ai ajouté :

 

 
(setq DrawingName (vlax-get-property doc 'Name)
         DrawingPath (vl-string-right-trim ".dxf" (vlax-get-property doc 'FullName))
)

 

au début du vla-for

 

;;; (vla-saveas (vla-item (vla-get-documents (vlax-get-acad-object)) DrawingName) DrawingPath acR15_DXF)
(vla-save (vla-item (vla-get-documents (vlax-get-acad-object)) DrawingName))
(vla-close (vla-item (vla-get-documents (vlax-get-acad-object)) DrawingName ))

 

à la fin de ma boucle

 

le close fonctionne mais pas le save j'obtient l'erreur : Automation Error. Error saving the document

Posté(e)

J'ai trouvé, après quelque essai j'en suis arrivé à la conclusion que si un document n'est pas actif impossible de le sauvegarder avec la manière que j'utilise et impossible de fermer un document actif.

 

Voila si vous avez d'autre manière de procédé je suis preneur.

Posté(e)

Salut

 

(vlax-release-object obj)                                     ;  J'update mon object

Non, tu effaces de la mémoire l'objet, regarde l'aide à ce sujet

Il existe (vla-update obj)

 

Et inverse la sauvegarde avant d'effacer l'objet

(vla-save doc)
(vla-close doc)
(vlax-release-object doc)                                    ;  Mon document du début n'existe plus

 

ps : un (vla-close doc T) permet la sauvegarde du dessin

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

J'ai 3 dessin d'ouvert dans autocad un vierge, et 2 autre avec des objects a modifier, le dessin qui est actif est celui qui est vierge. Je tape ma commande dans autocad et j'ai encore un erreur

 

error: Automation Error. Error saving the document

 

Ce que je voudrais comme résultat est que mon dessin vierge reste ouvert et les dessins contenant l'object a modifier soit modifier, sauvegarder et fermer

 

 
(defun readfile (FilePath / File Info ACTIVE)

  (setq File (open FilePath "r")
 ACTIVE T
  )
  (while ACTIVE
      
     (setq ACTIVE	(read-line File)
    Info 	(append (list ACTIVE) Info)
     )
  )
  (vl-remove nil Info)
)

(defun RoundUp (Real / test)
  (if (= (max Real (+ (fix Real) 0.5)) Real)
      (setq test (+ (fix Real) 1))
      (setq test (fix Real))
  )
)

(defun BatchProcess ( /  StringThk Directory PlasmaThk THKString Thickness String->List UpperVal LowerVal)

(setq Directory	"F:/Echange/Jean-Philippe/ProNest/Batch Process/Thickness.txt"
	  PlasmaThk	(readfile Directory)
)
 
(vlax-for doc (vla-get-Documents (vlax-get-acad-object))

	(vlax-for obj (vla-get-ModelSpace doc)
	  
		(if	(and (= (vla-get-ObjectName obj) "AcDbText")
			     (wcmatch (vla-get-TextString obj) "*THICKNESS*")
			)
		  	(progn

				(setq THKString		(vlax-get-property obj 'TextString)
				      Thickness		(vl-string-left-trim "THICKNESS=" THKString)
			          String->List 	(vl-string->list Thickness)
				      String->List 	(reverse
									  	(vl-remove-if '(lambda (Int)
												  (or (= Int 76);|L|;(= Int 212);|Ô|;(= Int 112);|p|;
												      (= Int 80);|P|;(= Int 101);|E|;(= Int 116);|t|;
												      (= Int 70);|F|;(= Int 102);|f|;(= Int 108);|l|;
												      (= Int 84);|T|;(= Int 108);|l|;(= Int 244);|ô|;
												  )
											       )
										  	       String->List
										)
							 		)
				)

			  	(repeat (length (vl-remove-if-not '(lambda (Numb) (= Numb 42)) String->List)) (setq String->List (cdr (member 42 String->List))))
				(setq Thickness   (vl-list->string (reverse String->List)))
				; Modify Thickness of drawing for compatibility with PRONEST
				(setq StringThk (vl-sort (append (list (atof Thickness))
												 (mapcar '(lambda (X)
												 				(atof X)
												 		  )
												 		  PlasmaThk
												  )
										  )
										 '(lambda (e1 e2) (< e1 e2))
								)
				  	   UpperVal (nth (1+ (vl-position (atof Thickness) StringThk)) StringThk)
					   LowerVal (nth (1- (vl-position (atof Thickness) StringThk)) StringThk)
				)
				(if (> (atof Thickness) 4)
					(progn
						(cond ((= (RoundUp UpperVal) (atof Thickness))
									(setq Thickness (strcat "THICKNESS=" (rtos UpperVal 2 3)))
							  )
							  ((= (RoundUp LowerVal) (atof Thickness))
									(setq Thickness (strcat "THICKNESS=" (rtos LowerVal 2 3)))
							  )
						)
					)
					(progn
						(cond ((= (atof (rtos UpperVal 2 1)) (atof Thickness))
									(setq Thickness (strcat "THICKNESS=" (rtos UpperVal 2 3)))
							  )
							  ((= (atof (rtos LowerVal 2 1)) (atof Thickness))
									(setq Thickness (strcat "THICKNESS=" (rtos LowerVal 2 3)))
							  )
							  (T (setq Thickness (strcat "THICKNESS=" (rtos UpperVal 2 3))))
						)
					)
				)
			    
			  	(vlax-put-property obj 'TextString Thickness)
			  	(vla-update obj)
			  	(vla-save (vlax-get-property obj 'Document)) ; error: Automation Error. Error saving the document
			  	(vla-close (vlax-get-property obj 'Document))
;;;				  	(vlax-release-object (vlax-get-property obj 'Document))
			)
	    )
	)
)
)

 

en utilisant (vla-close (vlax-get-property obj 'Document) T) j'ai la même erreur, j'ai vérifier qu'il ne sont pas en lecture seule

 

Je comprend pas ce que je fais de pas correct (le dessin vierge est .dwg et les autre a modifier .dxf)

 

je suis seulement capable avec vla-saveas et je dois les sauvegarder d'un nom different ou dans un dossier different, sinon la meme erreur se produit.

 

(vla-saveas doc
                  (strcat "F:\\Echange\\Jean-Philippe\\ProNest\\Dxf\\" (vl-string-right-trim ".dxf" (vlax-get-property doc 'Name)))
acR15_DXF
)
(vla-close doc)

 

mais un autre questionnement arrive y créer 2 fichier tole3.4.dxf et tole3.4.dxf.dwg ?? je comprend pas ???

 

Merci et bonne journée

  • Upvote 1

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é