Aller au contenu

VLA-ADD*** & PT D\'INSERTION


vinz34

Messages recommandés

Bonjour,

 

Mon objectif est de décomposer un bloc et de remplacer les attributs par des textes reprenant leurs valeurs.

Les objets décomposés prennent la couleur du calque d'insertion du bloc.

 

(defun c:db (/ l tx  layer liste_obj )
 

 (vlax-for n (vla-get-modelspace *acdoc*)
   (and (= "AcDbBlockReference" (vla-get-objectname n))
 (progn
   (if (= (vla-get-HasAttributes n) :vlax-true)
	(progn
	  (setq l (vlax-invoke n 'getattributes))
	  (foreach a l
	    (if (and (= (vla-get-invisible a) :vlax-false) (= (vla-get-visible a) :vlax-true))
	    (progn
	      (setq tx (vla-addtext (vla-get-modelspace *acdoc*) (vla-get-textstring a) (vla-get-InsertionPoint a) (vla-get-height a)))
	      (vla-put-alignment tx (vla-get-alignment a))
	      (vla-put-layer tx (vla-get-layer n))
	      (vla-put-rotation tx (vla-get-rotation a))
	      (vla-put-stylename tx (vla-get-stylename a))		      
	      (vla-update tx)
	      );progn
		 );if
	    );foreach
	  );progn
	);if hasattributes
   (setq liste_obj (vlax-invoke n 'explode)
	 layer (vla-get-layer n))
   (vla-delete n)	   
   (foreach e liste_obj
     (progn	       
       (vla-put-layer e layer)
       (and (= (vla-get-objectname e) "AcDbAttributeDefinition")
	    (vla-delete e))
       );progn
       );foreach
   );progn
 );and isblock
   );vlax-for

 ) 

 

Ce code fonctionne, mon problème est que sur certains fichiers les textes crées par vla-addtext ne s'insèrent pas au bon endroit mais au point d'origine du dwg (pas du scu).

 

Si ça parle à certains...

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut

 

Le plus simple est d'utiliser les codes dxf

 

Par exemple

 

(setq att (entget (car (nentsel))))
(entmake (cons (cons 0 "TEXT") (vl-remove-if '(lambda(x) (member (car x) '(-1 0 2 5 70 74 100 280 330))) att)))

 

@+

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

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Merci ça fonctionne, j'aurais aimé comprendre pourquoi ce problème.

J'avais pensé à osmode, et aux scu, mais rien n'y fait.

 

(defun c:db (/ l tx layer liste_obj)


 (vlax-for n (vla-get-modelspace *acdoc*)
   (and (= "AcDbBlockReference" (vla-get-objectname n))
 (progn
   (if (= (vla-get-HasAttributes n) :vlax-true)
     (progn
       (setq l (vlax-invoke n 'getattributes))
       (foreach	a l
	 (if (and (= (vla-get-invisible a) :vlax-false)
		  (= (vla-get-visible a) :vlax-true)
	     )
	   (progn

	    [surligneur]  (setq att (entget (handent (vla-get-handle a))))

	     (entmake
	       (cons (cons 0 "TEXT")
		     (vl-remove-if
		       '(lambda	(x)
			  (member (car x)
				  '(-1 0 2 5 70 74 100 280 330)
			  )
			)
		       att
		     )
	       )
	     );entmake[/surligneur] 

	   )			;progn
	 )			;if
       )			;foreach
     )				;progn
   )				;if hasattributes
   (setq liste_obj (vlax-invoke n 'explode)
	 layer	   (vla-get-layer n)
   )
   (vla-delete n)
   (foreach e liste_obj
     (progn
       (vla-put-layer e layer)
       (and (= (vla-get-objectname e) "AcDbAttributeDefinition")
	    (vla-delete e)
       )
     )				;progn
   )				;foreach
 )				;progn
   )					;and isblock
 )					;vlax-for

)

 

J'ai intégré la modif un peu sauvagement pour tester.

 

Je pensais faire un bon exercice en vla, je pense que je le reprendrai en autolisp en travaillant avec les dxf pour uniformiser.

 

Merci Patrick_35

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é