didier Posté(e) le 23 août 2011 Posté(e) le 23 août 2011 coucou je n'avais pas vu cette réponseje reviens donc poser ma question dans le cas contraire je risque de lâcher l'affaire je t'ai donné mon adresse mail par MPpasse moi un fichier avec des explications Tonnerre de Brest ! parce que, quand je vois un bloc NGF, j'ai des craintes amicalement tout de même Éternel débutant... Mon site perso : Programmer dans AutoCAD
ASTERIXII Posté(e) le 23 août 2011 Auteur Posté(e) le 23 août 2011 Désolé Didier, mais je n'ai pas ton adresse mail.Ou voir les message perso ?ou tu parle de ton site ? [Edité le 23/8/2011 par ASTERIXII]
richard-c Posté(e) le 23 août 2011 Posté(e) le 23 août 2011 Bonjour, c'est tout en bas du message de Didier. A+
ASTERIXII Posté(e) le 23 août 2011 Auteur Posté(e) le 23 août 2011 Sur le site Acadlab il n'y a pas d"adresse mail pour le contacter, ou alors il faut s'inscrire Sinon voila le lien : http:// http://dl.free.fr/bd48ioROO ContientUn fichier dwg avec le blocle code lispun fichier texte [Edité le 23/8/2011 par ASTERIXII]
richard-c Posté(e) le 23 août 2011 Posté(e) le 23 août 2011 re, bin oui, et alors, les autre l'ont fait, et ça marche sur CadXp tu t'inscrit bien . . . A+
didier Posté(e) le 23 août 2011 Posté(e) le 23 août 2011 coucou je t'ai envoyé un MP, Message Privé pour être complet tu n'as pas une notification sur ta page d’accueil de CadXP? je sais bien que ce site bat de l'aile, mais quand même ! Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
ASTERIXII Posté(e) le 23 août 2011 Auteur Posté(e) le 23 août 2011 Pour info voila le début de la page de l'onglet CADXP 5Þ .Þ ..6Þarea1block.html7Þarea2block.html8Þarea3block.html9Þarea4block.html:Þ article.htmlÿÿÿ;Þcenterblock.htmlj®<Þ centerblock.html.bakÿÿÿ=Þ credits.txt>Þleftblock.htmlÿ?Þ mainmenu.htmlÿÿ@Þmainmenu.html.bak˜®AÞrightblock.htmlBÞ summary.htmlÿÿÿCÞ theme.cfg¦€DÞ theme.html€EÞtheme.html.bakÿFÞ theme.php¦€GÞ Thumbs.db¦€²Þimagesÿ¸Þ,styleÿÿ5Þ .Þ ..6Þarea1block.html7Þarea2block.html8Þarea3block.html9Þarea4block.html:Þ article.htmlÿÿÿ;Þcenterblock.htmlj®<Þ centerblock.html.bakÿÿÿ=Þ
didier Posté(e) le 23 août 2011 Posté(e) le 23 août 2011 Coucou voici ce que je te proposela valeur se stocke dans la variable valATT (setq jeusel (ssget "x" (list (cons 0 "INSERT") (cons 2 "NGFX") ) )) (if (> (sslength jeusel) 1) (progn (alert "le Bloc NGFX n'est pas unique dans le dessin\n Abandon") (quit) ) (progn (setq valATT (cdr(assoc 1 (entget (entnext (ssname jeusel 0)))))) (alert (strcat "la valeur de NGFX est :" valATT)) ) ) Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
VDH-Bruno Posté(e) le 23 août 2011 Posté(e) le 23 août 2011 Bonsoir, J’ai bien trouvé les codes de groupe pour SSGET X mais dans une doc de 1989 !, et j’ai pas d’explication sur (Cons 66 1 ) Dans l’aide DXF et en français: http:// http://docs.autodesk.com/ACD/2011/FRA/filesDXF/WS1a9193826455f5ff18cb41610ec0a2e719-7a04.htm Si tu n’es pas familier des codes dxf , cela veut dire que dans ta sélection tu as filtré les références de bloc (Cons 0 "INSERT"), ayant pour nom NGFX (Cons 2 bn), et ayant un ou plusieurs attributs (Cons 66 1). Pour simplifier on peut directement filtrer une référence de bloc avec son nom.(ssget "_X" '((2 . "NGFX"))) A+ Apprendre => Prendre => Rendre
ASTERIXII Posté(e) le 24 août 2011 Auteur Posté(e) le 24 août 2011 Bonjour,Merci didier pour ton nouveau code.J'avais 2 questions, mais tu as deja repondu sur une avec le test sur le bloc unique.L'autre question : si j'ai 2 attributs dans mon bloc cela va t'il changer le raisonnement ? Amicalement
(gile) Posté(e) le 24 août 2011 Posté(e) le 24 août 2011 L'autre question : si j'ai 2 attributs dans mon bloc cela va t'il changer le raisonnement ? Forcément, la routine donnée par Didier ne récupère que la valeur du premier attribut. C'est pour ça que, excuse moi d'insister, je proposais une routine plus polyvalente avec GetAttribs qui retourne une liste de paires pointées contenant les étiquettes et valeurs pour chaque attribut. Exemple un bloc contient 2 attributs dont les étiquettes sont ATT1 et ATT2 et une variable blk contenant le nom d'entité d'une référence de bloc dont les valeurs d'attribut sont "toto" pour ATT1 et "3.14159" pour ATT2. l'expression : (setq atts (GetAttribs blk))affecte la liste : (("ATT1" . "toto") ("ATT2" . "3.14159")) à la variable attspour avoir la valeur de ATT1 : (cdr (assoc "ATT1" atts))pour avoir la valeur de ATT2 : (cdr (assoc "ATT2" atts)) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
ASTERIXII Posté(e) le 24 août 2011 Auteur Posté(e) le 24 août 2011 Merci pour ta réponse Gile, mais pourquoi cette ligne ? affecte la liste : (("ATT1" . "toto") ("ATT2" . "3.14159")) à la variable atts Si j'ai compris le début : une variable blk contenant le nom d'entité Ici ent = blk (setq ent (ssget "x" (list (cons 0 "INSERT") (cons 2 "NGFX2") ) ))Ensuite ton autre code: (defun GetAttribs (ent / elst lst) ;; Entité suivant celle passée en argument (setq ent (entnext ent)) ;; Boucle tant que ent est de type ATTRIB (while (= "ATTRIB" (cdr (assoc 0 (setq elst (entget ent))))) ;; ajoute à la liste une paire pointée (TAG . valeur) et passe à l'entité suivante (setq lst (cons (cons (cdr (assoc 2 elst)) (cdr (assoc 1 elst))) lst) ent (entnext ent) ) ) ;; valeur de retour : la liste inversée (reverse lst))
(gile) Posté(e) le 24 août 2011 Posté(e) le 24 août 2011 Non, la fonction LISP ssget retourne un jeu de sélection (un objet de type PICKSET), donc :(setq ent (ssget "x" (list (cons 0 "INSERT") (cons 2 "NGFX2") ) ) )affecte à la variable ent un jeu de sélection. C'est la fonction ssname qui retourne le nom d'entité (type ENAME) de l'entité contenue dans le jeu de sélection à l'indice spécifié (base 0).Donc, c'est l'expression : (ssname ent 0) qui retourne la première entité contenue dans le jeu de sélection. Ensuite, tu peux appeler la fonction GetAttribs définie dans la routine que j'ai donnée. Je te donne un exemple commenté et te recommande grandement de le décortiquer de tester chaque expression dans l'éditeur Visual LISP pour comprendre ce qui se passe.;; Commande TEST ;; Affiche la valeur de l'attribut NTFZ contenu dans le bloc NTGFX ;; Appelle la fonction GetAttribs qui doit être chargée. (defun c:test (/ ss blk atts val) ;_ variables locales ;; Sélectionner les références de bloc NGFX (setq ss (ssget "_X" '((0 . "INSERT") (2 . "NGFX")))) ;; Obtenir la première entité du jeu de sélection (setq blk (ssname ss 0)) ;; Obtenir la liste des attributs et de leurs valeurs ;; avec la fonction GetAttribs (setq atts (getattribs blk)) ;; Obtenir la valeur de l'attribut "NGFZ" (setq val (cdr (assoc "NGFZ" atts))) ;; Afficher la valeur dans une boite d'alerte (alert (strcat "Valeur de NGFZ : " val)) ;; sortie silencieuse (princ) ) ;; GetAttribs ;; Retourne une liste de paire pointées (TAG . Value) par attribut contenus dans le bloc ;; ;; Argument ;; ent : le nom d'entité (ENAME) de la référence de bloc (defun GetAttribs (ent / elst lst);_ variables locales ;; Entité suivant celle passée en argument (setq ent (entnext ent)) ;; Boucle tant que ent est de type ATTRIB (while (= "ATTRIB" (cdr (assoc 0 (setq elst (entget ent))))) ;; ajoute à la liste une paire pointée (TAG . valeur) et passe à l'entité suivante (setq lst (cons (cons (cdr (assoc 2 elst)) (cdr (assoc 1 elst))) lst) ent (entnext ent) ) ) ;; valeur de retour : la liste de paires pointées (reverse lst) ) La commande 'test' aurait pu être écrite de manière plus concise en utilisant des imbrications d'expressions plutôt que d'utiliser de nombreuses variables :(defun c:test () (alert (strcat "Valeur de NGFZ : " (cdr (assoc "NGFZ" (getattribs (ssname (ssget "_X" '((0 . "INSERT") (2 . "NGFX"))) 0 ) ) ) ) ) ) (princ) ) En plus du lien donné ci-dessus, je te recommandes grandement la lecture des sujets suivants :Éléments de syntaxe AutoLISPArguments et Variables ;; Commande TEST Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
ASTERIXII Posté(e) le 24 août 2011 Auteur Posté(e) le 24 août 2011 Ok, j'avais effectivement une erreurJ'ai alors repris ton explication, et j'ai corrigé ssname Voila pour le moment: avec un nouveau bloc du nom NGF2et 2 attributs NGFZ2 et NIVEAU Je vais aussi regarder ton code, mais pour revenir à l'Etideur Visual Lisp, je n'arrive pas lancer mon lisp depuis la consoleJe sais que tu a fait un tutorial, je vais allé voir [surligneur] C'est nickel pour ton code, et aussi ton tuto sur l'Etideur Visual Lisp[/surligneur] Encore un grand merci (Defun C:NGF () (setq ent (ssname (ssget "_X" '((2 . "NGF2"))) 0)) (setq atts (GetAttribs ent)) (prompt "\n********* NGFZ2 ****** ")(princ (cdr (assoc "NGFZ2" atts)))(prompt "\n********* NIVEAU ****** ")(princ (cdr (assoc "NIVEAU" atts))) ); fin defun;-------------------------------------- ;; GetAttribs;; Retourne une liste de paire pointées (TAG . Value) par attribut contenus dans le bloc;;;; Argument;; ent : le nom d'entité (ENAME) de la référence de bloc (defun GetAttribs (ent / elst lst) ;; Entité suivant celle passée en argument (setq ent (entnext ent)) ;; Boucle tant que ent est de type ATTRIB (while (= "ATTRIB" (cdr (assoc 0 (setq elst (entget ent))))) ;; ajoute à la liste une paire pointée (TAG . valeur) et passe à l'entité suivante (setq lst (cons (cons (cdr (assoc 2 elst)) (cdr (assoc 1 elst))) lst) ent (entnext ent) ) ); fin while ;; valeur de retour : la liste inversée (reverse lst) ) ; fin defun [Edité le 24/8/2011 par ASTERIXII]
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