Bortch59 Posté(e) le 4 avril 2011 Posté(e) le 4 avril 2011 Bonjour, comment accède t'on aux valeurs d'attributs dans un bloc?Le but étant de remplir automatiquement celles-ci à l'insertion du bloc. J'ai essayé avec (entget) : ((-1 . ) (0 . "INSERT") (330 . 7ee51cf8>) (5 . "522") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (66 . 1) (2 . "ETQ_PAS") (10 3334.2 514.793 0.0) (41 . 1.0) (42 . 1.0) (43 . 1.0) (50 . 0.0) (70 . 0) (71 . 0) (44 . 0.0) (45 . 0.0) (210 0.0 0.0 1.0)) puis avec (tblsearch) : ((0 . "BLOCK") (2 . "ETQ_PAS") (70 . 2) (10 0.0 0.0 0.0) (-2 . 7c6cf210>)) aucune traces de mes attributs... Merci.
bseb67 Posté(e) le 5 avril 2011 Posté(e) le 5 avril 2011 Salut Bortch59, Lorsque tu insères un bloc dans un dessin, tu as donc une entité de type "INSERT". Pour accéder à ses attributs, il te faut faire un entnext pour parcourir les entités de type "ATTRIB". Et lorsque tu tombes sur l'entité "SEQEND" tu as alors atteinds la fin des attributs. a+ Tous pour lisp, Lisp pour tous!Avec Revit, cela ne vas trop vite...
Bortch59 Posté(e) le 12 avril 2011 Auteur Posté(e) le 12 avril 2011 Salut, effectivement avec (entnext) je vois le début du tunnel... ((-1 . ) (0 . "ATTRIB") (330 . 7ee53bb0>) (5 . "457") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbText") (10 61.0626 44.9198 0.0) (40 . 2.5) (1 . "") (50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "BCH_ARIAL") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (280 . 0) (2 . "OBS1") (70 . 1) (73 . 0) (74 . 0) (280 . 1)) Seulement je ne vois pas comment accéder aux autres attributs (4 au total dans mon bloc).Les seuls résultats positifs étant obtenu avec (entget(entnext(entlast)))
(gile) Posté(e) le 12 avril 2011 Posté(e) le 12 avril 2011 Salut entnext retourne le ename de l’entité suivant celle passée en argument dans la base de données.Il faut donc faire une boucle en passant chaque fois l’entité retournée par entnext à entnext. (setq br (car (entsel "\nSélectionnez le bloc: "))) (setq ent (entnext br)) ;_ entité suivant le bloc (while (= "ATTRIB" (cdr (assoc 0 (setq elst (entget ent))))) ;_ tant que l'entité est de type ATTRIB (alert (strcat "Etiquette = " (cdr (assoc 2 elst)) "\nValeur = " (cdr (assoc 1 elst)))) (setq ent (entnext ent)) :_ entité suivante ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bortch59 Posté(e) le 12 avril 2011 Auteur Posté(e) le 12 avril 2011 Salut (gile), y a t'il un moyen de "voir la base de données" du dessin afin de mieux comprendre l'ordre des entités?
VDH-Bruno Posté(e) le 12 avril 2011 Posté(e) le 12 avril 2011 Bonsoir y a t'il un moyen de "voir la base de données" du dessin Oui, tu peux enregistrer ton dessin en DXF puis l'ouvrir avec un éditeur de texte, mais pas sur que celà t'aide beaucoup.. A+ Apprendre => Prendre => Rendre
(gile) Posté(e) le 12 avril 2011 Posté(e) le 12 avril 2011 Appeler entnext sans argument retourne la première entité du dessin.Boucler ensuite avec entnext sur chacune des entités permet de voir toutes les entités graphiques dans l'ordre de création. (setq ent (entnext)) (while ent (print (cdr (assoc 0 (entget ent)))) (setq ent (entnext ent)) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bortch59 Posté(e) le 21 avril 2011 Auteur Posté(e) le 21 avril 2011 Salut, après plusieurs essais je pense avoir bien compris la fonction (entnext).Et effectivement le fait de voir toutes les entités ne m'a pas beaucoup aidé. Maintenant j'essaie de remplir mes attributs automatiquement.J'y arrive en indiquant une valeur prédéfinie (ex: 200, toto...) dans mon code (setq a (enget (entnext (entlast)))) (entmod (subst '(1 . "valeur")) (assoc 1 a) a )) mais dès que j'essaie avec une valeur stockée dans (setq valeur) j'ai droit à un message d'erreur.
(gile) Posté(e) le 21 avril 2011 Posté(e) le 21 avril 2011 Difficile de dire d'où vient l'erreur sans en savoir plus, mais je suppute un problème d'évaluation de la paire pointée. L'apostrophe (') est un raccourci pour la fonction quote qui empêche l'évaluation de l'expression.Quand on écrit '(1 . "valeur") la paire pointée n'est pas évaluée ce qui ne pose pas de problème puisque 1 et "valeur" n'ont pas besoin d'être évalués.Mais si on écrit '(1 . valeur), la variable valeur ne sera pas évalué, pour qu'elle le soit, il faut construire la paire pointée avec cons :(cons 1 valeur) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
VtKp Posté(e) le 21 avril 2011 Posté(e) le 21 avril 2011 Bonjour, Ce petit bout de code non testé retourne normalement (je ne l'ai pas testé mais fait comme çà)la liste des attributs de ton bloc en insérant devant ce code un (setq ent (car (entsel)))et après (if (= (cdr (assoc 0 (entget ent))) "INSERT" ) (if (= (cdr (assoc 66 (entget ent))) 1) (progn (setq liste nil) (while (if ent (not (= (cdr (assoc 0 (entget ent))) "SEQEND"))) (if (= (cdr (assoc 0 (entget ent))) "ATTRIB") (setq liste (append liste (list (cdr (assoc 1 (entget ent))))))) (setq ent (entnext ent)) ) ) (setq liste nil) ) ) ca devrait le faire VtKp
Bortch59 Posté(e) le 22 avril 2011 Auteur Posté(e) le 22 avril 2011 pour qu'elle le soit, il faut construire la paire pointée avec cons c'est ce que j'ai essayé (entmod (subst (cons 1 v) (assoc 1 a) a)) l'erreur suivante m'est renvoyée: ; erreur: groupe DXF incorrect: (1 . 400) Je n'arrive pas à ce que la variable stockée dans (setq) se retrouve entre guillemets.
(gile) Posté(e) le 22 avril 2011 Posté(e) le 22 avril 2011 Toujours difficile de répondre avec aussi peu d'informations... Comment est obtenue 'v' ? regarde les fonctions itoa (entier -> chaîne); rtos (réel -> chaîne), angtos (angle -> chaîne). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bortch59 Posté(e) le 22 avril 2011 Auteur Posté(e) le 22 avril 2011 'v' est une variable que je renseigne mais ce n'est là qu'un exemple. Je suis toujours sur ce code: http:// http://www.cadxp.com/sujetXForum-31360.htm J'y ai rajouté l'insertion d'une étiquette (bloc avec attributs) que je voudrais voir se remplir automatiquement. -- PAS 1.1 (BCH) -- ;Créé un piège à son (defun c:PAS (/ L Ep N Ec P0 P10 P11 B Ba) (setvar "cmdecho" 0) (initget (+ 1 2 4)) (setq OS (getvar "osmode") L (getreal "\nLongueur baffle: ") Ep (getreal "\nEpaisseur baffle: ") N (getint "\nNombre de baffles: ") Ec (getreal "\nEcartement des baffles: ") P0 (getpoint "\nPt d'insertion PAS: ") ) (setvar "osmode" 0) ;Dessin Baffle (setq P10 (list (+ (car P0) (/ Ec 2)) (+ (cadr P0) (/ Ec 2)))) (setq P11 (list (+ (car P10) L) (+ (cadr P10) Ep))) (command "_rectangle" P10 P11) ;Changement propriétés bafles (setq B (entget (entlast))) (if (assoc 62 B) (entmod (subst '(62 . 8) (assoc 62 B) B)) ;couleur (entmod (append B '((62 . 8)))) ) (if (assoc 6 B) (entmod (subst '(6 . "cache") (assoc 6 B) B)) ;type de ligne (entmod (append B '((6 . "cache")))) ) (if (assoc 370 B) (entmod (subst '(370 . 9) (assoc 370 B) B)) ;Epaisseur (entmod (append B '((370 . 9)))) ) (setq Ba (entlast)) (command "_array" Ba "" "r" N "1" (+ Ep Ec)) ;[reseau] ;Dessin PAS (command "rectangle" P0 (list (+ (car P0) L Ec) (+ (cadr P0) (* N (+ Ep Ec)))) ) ;Insertion étiquette (command "_-insert" "ETQ_PAS" pause "" "" "") (setvar "osmode" OS) (setvar "cmdecho" 1) (princ) ) PS: j'ai aussi essayé (itoa) mais je n'arrive à obtenir que (1 . 400) qui génére une erreur puisque la valeur 400 n'est pas entre guillemet.[Edité le 22/4/2011 par Bortch59]
(gile) Posté(e) le 23 avril 2011 Posté(e) le 23 avril 2011 Salut, Tu ne semble pas comprendre que même si nous avons une certaine capacité de déduction que n'a pas un ordinateur, sans un minimum d'information, il est impossible de de résoudre un problème. Dans le code que tu postes, il n'est nulle part question de variable v ni d'attribut... 'v' est une variable que je renseigne Oui mais comment ??? Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bortch59 Posté(e) le 23 avril 2011 Auteur Posté(e) le 23 avril 2011 Oui mais comment ??? soit par (getreal) soit par (getint) Dans mon code il n'y a effectivement pas de 'v' (c'est pour ça que je précisais qu'il ne s'agissait que d'un exemple).
(gile) Posté(e) le 23 avril 2011 Posté(e) le 23 avril 2011 Comme dit plus haut, les fonctions itoa et rtos convertissent respectivement un entier ou un réel en chaîne de caractère : (if (setq v1 (getreal "\nEntrez un nombre réel: ")) (setq v1 (rtos v1)) ) (if (setq v2 (getint "\nEntrez un nombre entier: ")) (setq v2 (itoa v2)) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bortch59 Posté(e) le 23 avril 2011 Auteur Posté(e) le 23 avril 2011 C'est exactement ce que je désirais...Désolé de ne pas avoir été plus clair dès le départ (c'est un défaut que j'essaie de corriger). J'insére un bloc puis j'accède au premier attribut (setq a (entget (entnext (entlast)))) Résultat:((-1 . ) (0 . "ATTRIB") (330 . 7ee55bb0>) (5 . "457") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbText") (10 43.4904 64.842 0.0) (40 . 2.5) [surligneur] (1 . "") [/surligneur](50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "BCH_ARIAL") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (280 . 0) (2 . "OBS1") (70 . 1) (73 . 0) (74 . 0) (280 . 1)) j'affecte une valeur à une variable (au hasard 'v') (setq v 400) puis je remplace la valeur actuelle de l'attribut par la valeur stockée dans ma variable (entmod (subst (cons 1 (rtos v 2 0)) (assoc 1 a) a)) Résultat:((-1 . ) (0 . "ATTRIB") (330 . 7ee55bb0>) (5 . "457") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbText") (10 43.4904 64.842 0.0) (40 . 2.5) [surligneur] (1 . "400") [/surligneur](50 . 0.0) (41 . 1.0) (51 . 0.0) (7 . "BCH_ARIAL") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (280 . 0) (2 . "OBS1") (70 . 1) (73 . 0) (74 . 0) (280 . 1)) Merci.
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