Aller au contenu

Selection Bloc Dynamique


SF.Designer

Messages recommandés

Bonjour a tous,

 

Je viens vers vous aujourd'hui car je souhaiterai modifier un bout de code, et je n'arrive pas a mettre en place ce que je souhaite grrrrrrrrrrrrrrrrrr

 

Ce code me permet de mettre a jour des informations dans un cartouche.

 

La grosse partie de ce code a été trouvé il y a quelques temps sur le forum "The swamp" (si mes souvenir sont bons), mais je ne me souviens plus de l'auteur, ayant oublié de le noter (Mea Culpa).

 


(defun reptag (tag newvalue ent / alist )
(if (and (= (type ent) (read "VLA-OBJECT")) newvalue)
(progn
(setq alist ( vlax-invoke ent 'GetAttributes))
(foreach a alist
(if (=  (vla-get-tagstring a) tag)
(vlax-put-property a 'TextString newvalue)
)
)
)
(if (= 'ename (type ent)) (reptag tag newvalue (vlax-ename->vla-object ent)));i
)
(princ))


(defun c:ChangeCart ( / ent)

(setq FILENAME (substr (getvar "DWGNAME") 1 10))
(setq FOLIONUMBER (substr (getvar "DWGNAME") 12 2))
(setq DWGLONGNUMBER (- (strlen (getvar "DWGNAME")) 4))
(setq DWGLONGNAME (substr (getvar "DWGNAME") 1 DWGLONGNUMBER))
(setq INDICE (substr DWGLONGNAME 15))

; (setq ent (ssget "_X" '((0 . "INSERT")(2 . "CRTP4PP4")))) ; C'est ça que je n'arrive pas a mettre en place !!!
(setq ent (car (entsel))) ; ceci demande la selection du bloc


(reptag "IND1" INDICE ent)
(reptag "IND2" INDICE ent)
(reptag "TME" FILENAME ent)

(princ))

 

 

Pour info: nom du dwg, ex : AZERTYUIOP-00-AB (AZERTYUIOP = FILENAME / 00 = FOLIONUMBER / AB = INDICE), les noms de fichiers ne changent pas de structure.

Pour le moment ce code oblige l'utilisateur a sélectionner le bloc concerné par les changements.

Je souhaiterai que le bloc dont le nom est connu ( CRTP4PP4 ) soit sélectionné automatiquement et ne plus avoir d'intervention de l'utilisateur.

J'ai retourné le probleme dans tous les sens que je connais et même plus, mais pas suffisant.

Merci beaucoup d'avance pour votre aide comme d'habitude !!!

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

La commande ssget renvoi un jeu de sélection.

Ce jeu de sélection contient les ename d'une à plusieurs entité.

auparavant, tu utilisais entsel , qui lui renvoi directement l'ename de l'entité + le point cliqué lors de sa sélection.

 

(setq ent (car (entsel))

enregistre donc la première partie soit uniquement l'ename de ton entité.

 

Il te faut donc à partir de ton jeu de sélection récupérer uniquement l'ename de l'entité contenu dans cet jeu.

 

Petit ajout, dans ton cas je pense qu'il est préférable de filtrer la sélection sur l'espace courant. (bit 410)

 

Soit (je te le mes en 2 lignes pour être plus clair :

 

(setq ss (ssget "_X" (list '(0 . "INSERT") '(2 . "CRTP4PP4") (cons 410 (getvar "ctab"))))); création du jeu de sélection
(setq ent (ssname ss 0)) ; récupération de l'ename du premier élément du jeu de sélection

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Olivier,

 

Merci de t’être attardé sur mon problème.

 

Voici mon code, il me retourne : "type d'argument incorrect: lselsetp nil"

 

(defun reptag (tag newvalue ent / alist )
(if (and (= (type ent) (read "VLA-OBJECT")) newvalue)
(progn
(setq alist ( vlax-invoke ent 'GetAttributes))
(foreach a alist
(if (=  (vla-get-tagstring a) tag)
(vlax-put-property a 'TextString newvalue)
)
)
)
(if (= 'ename (type ent)) (reptag tag newvalue (vlax-ename->vla-object ent)));i
)
(princ))


(defun c:ChangeCart ( / ent)

(setq ss (ssget "_X" (list '(0 . "INSERT") '(2 . "CRTP4PP4") (cons 410 (getvar "ctab"))))); création du jeu de sélection
(setq ent (ssname ss 0)) ; récupération de l'ename du premier élément du jeu de sélection

(setq FILENAME (substr (getvar "DWGNAME") 1 10))
(setq DWGLONGNUMBER (- (strlen (getvar "DWGNAME")) 4))

(if (<= DWGLONGNUMBER 13)
(progn
	(setq DWGLONGNAME (substr (getvar "DWGNAME") 1 DWGLONGNUMBER))
	(setq INDICE (substr DWGLONGNAME 12))
)
(progn
	(setq DWGLONGNAME (substr (getvar "DWGNAME") 1 DWGLONGNUMBER))
	(setq INDICE (substr DWGLONGNAME 15))
	(setq FOLIONUMBER (substr (getvar "DWGNAME") 12 2))
)
)

(reptag "IND1" INDICE ent)
(reptag "IND2" FOLIONUMBER ent)
(reptag "TME" FILENAME ent)
(reptag "EMETTEUR" FILENAME ent)
(reptag "DAO" DWGLONGNAME ent)

(princ))

 

Lien vers le commentaire
Partager sur d’autres sites

Bonjour SF.Designer,

 

Je viens de lire le titre du topic précisant que tu travail sur un bloc dynamique.

Les références de blocs dynamiques n'apparaissent pas avec leur véritables noms.

Pour tester :

 

(cdr (assoc 2 (entget (car (entsel)))))

 

Pour les retrouver, il faut sélectionner les blocs de l'espace, faire défiler la sélection en vérififiant le nom effectif du bloc.

 

(setq ss (ssget "_X" (list '(0 . "INSERT")  (cons 410 (getvar "ctab")))))
(repeat (setq n (sslength ss))
 (if (= "CRTP4PP4" (vla-get-EffectiveName (vlax-ename->vla-object (ssname ss (setq n (1- n))))))
   (setq ent (ssname ss n)))
 )

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Bon même après avoir mis a jour mon code avec vos explications, il me met aucune sélection. Alors que le bloc se trouve bien dans l'espace objet !

 

Je vous met en pièces jointe le fichier DWG (zippé) et mon Lisp.

 

AZERTYUIOP-00-AB.zip

 

Cartouche_Mod1.lsp

 

 

EDIT: j'etais en train d'ecrire en même temps que Olivier, je teste cela merci beaucoup !

Lien vers le commentaire
Partager sur d’autres sites

L'astuce pour la syntaxe du nom d'un bloc dynamique dans un filtre est d'utiliser le symbole quote inversé (AltGr+7)

Ce qui donnerai:

(setq ss (ssget "_X" (list '(0 . "INSERT") '(2 . "`*U*")(cons 410 (getvar "ctab"))))

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

OLIVIER et GILLES, un GRANNNNNND MERCI avous deux, voila le code fonctionne parfaitement ainsi.

 

Je met la version finale:

 


(defun reptag (tag newvalue ent / alist )
(if (and (= (type ent) (read "VLA-OBJECT")) newvalue)
	(progn
		(setq alist ( vlax-invoke ent 'GetAttributes))
		(foreach a alist
			(if (=  (vla-get-tagstring a) tag)
				(vlax-put-property a 'TextString newvalue)
			)
		)
	)
	(if (= 'ename (type ent)) (reptag tag newvalue (vlax-ename->vla-object ent)))
)
(princ))


(defun c:ChangeCart ( / ent)

(if (setq ss (ssget "_X" (list '(0 . "INSERT")(cons 410 (getvar "ctab")))))
(progn
	(repeat (setq n (sslength ss))
		(if (= "CRTP4PP4" (vla-get-EffectiveName (vlax-ename->vla-object (ssname ss (setq n (1- n))))))
		(setq ent (ssname ss n)))
	)
)
(prompt "\n Aucune selection")
)

(setq FILENAME (substr (getvar "DWGNAME") 1 10))
(setq DWGLONGNUMBER (- (strlen (getvar "DWGNAME")) 4))

(if (<= DWGLONGNUMBER 13)
(progn
	(setq DWGLONGNAME (substr (getvar "DWGNAME") 1 DWGLONGNUMBER))
	(setq INDICE (substr DWGLONGNAME 12))
)
(progn
	(setq DWGLONGNAME (substr (getvar "DWGNAME") 1 DWGLONGNUMBER))
	(setq INDICE (substr DWGLONGNAME 15))
	(setq FOLIONUMBER (substr (getvar "DWGNAME") 12 2))
)
)

(reptag "IND1" INDICE ent)
(reptag "IND2" FOLIONUMBER ent)
(reptag "TME" FILENAME ent)
(reptag "EMETTEUR" FILENAME ent)
(reptag "DAO" DWGLONGNAME ent)

(princ))

 

 

Olivier puis je avoir une petite explication sur ceci : (setq n (1- n))

Je ne comprend pas le 1- n

Merci

Lien vers le commentaire
Partager sur d’autres sites

Olivier puis je avoir une petite explication sur ceci : (setq n (1- n))

Je me permets s'il est pas là : B)

1- est une fonction (un seul argument) au même titre que, par exemple :

1+

+

-

/

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Me revoilà!

(setq n (1- n)) permet de soustraire 1 à la valeur n à chaque boucle de la fonction repeat.

J'ai écris un code plus condensé et moins compréhensible dans le poste #6 par rapport au postes précédents, je m'en excuse. Si tu as des doutes sur le fonctionnement n'hésite pas à redemander.

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Daccord donc si je comprend bien, cela vas redéfinir la variable n avec 1 fois le resultat

Pas du tout B)

C'est juste une fonction qui décrémente la valeur n de 1. Tu n'as pas lu l'aide développeur pour chercher cette fonction à l'orthographe bien courte ?

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
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é