SF.Designer Posté(e) le 26 février 2016 Posté(e) le 26 février 2016 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 !!!
-Olivier- Posté(e) le 26 février 2016 Posté(e) le 26 février 2016 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
SF.Designer Posté(e) le 29 février 2016 Auteur Posté(e) le 29 février 2016 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))
-Olivier- Posté(e) le 29 février 2016 Posté(e) le 29 février 2016 Bonjour,Pas de problème chez moi. Le bloc CRTP4PP4 ne doit pas être dans ton espace actuel.Dans ce cas, supprime le (cons 410 (getvar "ctab")) .Olivier
(gile) Posté(e) le 29 février 2016 Posté(e) le 29 février 2016 Salut, Pour éviter ce genre de désagrément, toujours tester si le jeu de sélection n'est pas vide (lselset = nil). (if (setq ss (ssget "_X" ...)) (progn ; traiter le jeu de sélection ) (prompt "\n Aucune sélection") ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
-Olivier- Posté(e) le 1 mars 2016 Posté(e) le 1 mars 2016 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
SF.Designer Posté(e) le 1 mars 2016 Auteur Posté(e) le 1 mars 2016 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 !
bonuscad Posté(e) le 1 mars 2016 Posté(e) le 1 mars 2016 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
SF.Designer Posté(e) le 1 mars 2016 Auteur Posté(e) le 1 mars 2016 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
Tramber Posté(e) le 1 mars 2016 Posté(e) le 1 mars 2016 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 ./__\. (.°=°.)
SF.Designer Posté(e) le 1 mars 2016 Auteur Posté(e) le 1 mars 2016 Daccord donc si je comprend bien, cela vas redéfinir la variable n avec 1 fois le resultat de la recherche sur le nom de bloc ! Merci Tramber
-Olivier- Posté(e) le 1 mars 2016 Posté(e) le 1 mars 2016 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
Tramber Posté(e) le 1 mars 2016 Posté(e) le 1 mars 2016 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 ./__\. (.°=°.)
SF.Designer Posté(e) le 1 mars 2016 Auteur Posté(e) le 1 mars 2016 Merci beaucoup pour vos réponse, là je suis au taf mais ce soir je regarde l'aide développeur ;)
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