>>NicoM Posté(e) le 3 septembre 2019 Posté(e) le 3 septembre 2019 Bonjour, Je suis en train d'essayer de bidouiller un lisp de (gile) qui traite de l'affectation d'une valeur à un attribut.Mais j'ai des soucis à l'insertion d'un bloc comportant des attributs et je dois faire appel à vous car je n'y arrive pas... J'ai essayé de l'insérer avec le entmake classique :(entmake (list '(0 . "INSERT") '(100 . "AcDbEntity") '(100 . "AcDbBlockReference") '(2 . "#NM - NBDS2") '(8 . "GO - ARMATURES") '(10 5200.00 350.00 0.0) ) )Mais aucun attribut n'apparaît... Puis j'ai essayé de rajouter la paire pointé 66 qui semble correspondre à la présence d'attribut.(entmake (list '(0 . "INSERT") '(100 . "AcDbEntity") '(100 . "AcDbBlockReference") '(2 . "#NM - NBDS2") '(8 . "GO - ARMATURES") '(66 . 1) '(10 5200.00 350.00 0.0) ) )Mais maintenant, la ligne de commande me dit : "Objet complexe non valable." Donc question simple : "Comment faire pour que les attribut soient pris en compte ?" Projeteur Béton Armé sur Revit et AutoCAD 2023 Une connaissance acquise ne devient vivante que si on l’a repensée par soi-même.
didier Posté(e) le 3 septembre 2019 Posté(e) le 3 septembre 2019 Coucou Essaie ce qui suit dans le prochain messageIl faut que le bloc existe dans le dessin, avec un "bloctest" c'est son nom.Si tu veux créer un bloc c'est un autre code questionne le cas échéant... Ce bloc a deux attributs dans mon exempleLe code va fonctionner... Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
didier Posté(e) le 3 septembre 2019 Posté(e) le 3 septembre 2019 (setq pt (getpoint" \nPoint Insertion ?\n")) (setq att1 "attribut 1" att2 "attribut 2") (entmake (append '((0 . "INSERT")(67 . 0)(410 . "Model")(100 . "AcDbBlockReference")(66 . 1) (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) (2 . "bloctest")) (list (cons 10 pt)) (list (cons 8 "calquebloc")) ) ) ;insertion de l'attribut 1 (entmake (append '((0 . "ATTRIB")(2 . "ETI1")(70 . 0)(40 . 1)(50 . 0.0)) (list (cons 10 (list (+ (car pt) 1)(+ (cadr pt)1)(caddr pt)))) (list (cons 1 att1)) (list (cons 8 "calqueatt1")) ) ) ;insertion de l'attribut 1 (entmake (append '((0 . "ATTRIB")(2 . "ETI2")(70 . 0)(40 . 1.50)(50 . 0.0)) (list (cons 10 (list (+ (car pt) 1)(- (cadr pt)1)(caddr pt)))) (list (cons 1 att2)) (list (cons 8 "calqueatt2")) ) ) ;fin du bloc à insérer (entmake '((0 . "SEQEND"))) Éternel débutant... Mon site perso : Programmer dans AutoCAD
>>NicoM Posté(e) le 3 septembre 2019 Auteur Posté(e) le 3 septembre 2019 Merci beaucoup !Je termine tous les petits exercices sur les blocs et je testerais ça ! Vu de loin ça a l'air quand même bien compliqué d'insérer les attributs, dans mon cas j'en ai pas loin d'une dizaine... Projeteur Béton Armé sur Revit et AutoCAD 2023 Une connaissance acquise ne devient vivante que si on l’a repensée par soi-même.
didier Posté(e) le 3 septembre 2019 Posté(e) le 3 septembre 2019 Coucou Rien de compliqué, Le code est un peu long mais on le tape une fois et on n'en parle plusC'est quand même avantageux car si les calques n'existent pas au moment de l'appel ils sont créés par entmake. Amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 13 septembre 2019 Posté(e) le 13 septembre 2019 Salut, Jolie coïncidence, ce sujet a démarré alors que je dispensais une formation LISP où une question similaire est posée le même jour.Ceci m'a permis de montrer qu'il ne fallait pas hésiter à poser une question sur un forum et que la réactivité sur CADxp n'est pas une légende. J'ai pu finir aujourd'hui une routine un peu plus générique que l'exemple proposé par didier. Elle devrait fonctionner avec les blocs avec attributs ou sans.Elle prend en compte la rotation du bloc et une échelle uniforme.Resterait à traiter les échelles non-uniforme et les attributs multiligne. ;; entmakeblockreference ;; Insére une référence bloc et éventuellement ses attributs ;; Renvoie le ename de la référence insérée ou nil ;; ;; arguments : ;; blockname : nom du bloc ;; position : point d'insertion ;; rotation : rotation ;; scale : échelle globale ;; attribs : liste de paires (etiquette . valeur) (defun entmakeblockreference (blockname position rotation scale attribs / mxv rotvec blockdef ; liste dxf de la définition de bloc ent ; une entité elst ; une liste dxf attdefs ; liste des listes dxf des définitions d'attribut blockref ; référence de bloc tag ; étiquette d'attribut vec ; déplacement du point d'alignement par rapport au point dinsertion pt ; point d'alignement ht ; hauteur de texte val ; valeur d'attribut ) ;; MXV ;; Applique une matrice de transformation à un vecteur -Vladimir Nesterovsky- ;; ;; Arguments- ;; m : une matrice ;; v : un vecteur (defun mxv (m v) (mapcar (function (lambda (r) (apply '+ (mapcar '* r v)))) m) ) ;; ROTSCALEVEC ;; Applique une rotation 2d et une échelle à un vecteur ;; ;; Arguments ;; v : vecteur ;; a : angle en radians ;; s : échelle (defun rotscalevec (v a s) (mxv (list (list (* s (cos a)) (* s (- (sin a))) 0.) (list (* s (sin a)) (* s (cos a)) 0.) '(0. 0. 1.) ) v ) ) ;; on contrôle si la table des block contient une définition de bloc nommée 'blockname' (if (setq blockdef (tblsearch "BLOCK" blockname)) (progn ;; collecte les définitons d'attribut dans la définition de bloc (setq ent (cdr (assoc -2 blockdef))) (while ent (setq elst (entget ent)) (if (= (cdr (assoc 0 elst)) "ATTDEF") (setq attdefs (cons elst attdefs)) ) (setq ent (entnext ent)) ) ;; si aucune définition d'attribut n'a été trouvée, (if (null attdefs) ;; alors, création de la réference de bloc (setq blockref (entmakex (list (cons 0 "INSERT") (cons 100 "AcDbEntity") (cons 100 "AcDbBlockReference") (cons 2 blockname) (cons 10 position) ) ) ) ;; sinon, création de la réference de bloc et des références d'attribut (progn (entmake (list (cons 0 "INSERT") (cons 100 "AcDbEntity") (cons 100 "AcDbBlockReference") (cons 66 1) (cons 2 blockname) (cons 10 position) (cons 41 scale) (cons 42 scale) (cons 43 scale) (cons 50 rotation) ) ) ;; création les definitions d'attributs (foreach attdef attdefs (setq tag (cdr (assoc 2 attdef)) vec (if (= (cdr (assoc 72 attdef)) (cdr (assoc 74 attdef)) 0) (rotscalevec (cdr (assoc 10 attdef)) rotation scale) ; bas gauche (rotscalevec (cdr (assoc 11 attdef)) rotation scale) ; autre ) pt (mapcar '+ position vec) ht (* scale (cdr (assoc 40 attdef))) val (cond ((cdr (assoc tag attribs))) ; valeur dans la liste 'attribs' (T (cdr (assoc 1 attdef))) ; valeur par défaut ) ) (entmake (vl-remove nil (list (cons 0 "ATTRIB") ; type d'entité (cons 100 "AcDbEntity") (assoc 8 attdef) ; calque (assoc 62 attdef) ; couleur (assoc 6 attdef) ; type de ligne (assoc 370 attdef) ; épaisseur de ligne (cons 100 "AcDbText") (cons 10 pt) ; point d'insertion (cons 40 ht) ; hauteur de texte (cons 1 val) ; valeur d'attribut (cons 50 rotation) ; rotation (assoc 41 attdef) ; facteur de largeur (assoc 51 attdef) ; inclinaison (assoc 7 attdef) ; style de texte (assoc 71 attdef) ; génération de texte (assoc 72 attdef) ; justification horizontale (cons 11 pt) ; point d'alignement (assoc 210 attdef) ; direction d'extrusion (cons 100 "AcDbAttribute") (assoc 280 attdef) ; numéro de version (cons 2 tag) ; étiquette (assoc 70 attdef) ; drapeaux d'attribut (assoc 73 attdef) ; style d'espacement des lignes de l'entité MTEXT (assoc 74 attdef) ; justification verticale du texte (assoc 280 (reverse attdef)) ; verrouillage de la position ) ) ) ) ;; création de l'objet SEQEND (entmake '((0 . "SEQEND"))) (setq blockref (entlast)) ) ) ) ) ;; valeur de retour blockref ) 1 Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
DenisHen Posté(e) le 13 septembre 2019 Posté(e) le 13 septembre 2019 Aller, Zou, voilà Maître (gile) qui va me paumer...Dès qu'il intervient, on sait qu'on va cramer de la matière grise... Ce qui m'a définitivement perdu, c'est (mapcar, lambda et encore un mapcar). Windows 11 / AutoCAD 2024 Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net). Davantage d'avantages, avantagent davantage (Bobby Lapointe). La connaissance s'accroît quand on la partage (Socrate). Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)
>>NicoM Posté(e) le 24 septembre 2019 Auteur Posté(e) le 24 septembre 2019 Je suis heureux d'avoir pu appuyer tes explications, j'aime bien ces petites anecdotes :) Merci pour cette routine qui a l'air très complète et bien commentée.Si j'arrive à bien comprendre son écriture, je pense que j'aurais fait un grand pas ! Projeteur Béton Armé sur Revit et AutoCAD 2023 Une connaissance acquise ne devient vivante que si on l’a repensée par soi-même.
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