Aller au contenu

Entmake Bloc avec Attribut


>>NicoM

Messages recommandés

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.

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Essaie ce qui suit dans le prochain message

Il 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 exemple

Le code va fonctionner...

 

Amicalement

Lien vers le commentaire
Partager sur d’autres sites

(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")))





Lien vers le commentaire
Partager sur d’autres sites

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.

Lien vers le commentaire
Partager sur d’autres sites

Coucou

 

Rien de compliqué,

Le code est un peu long mais on le tape une fois et on n'en parle plus

C'est quand même avantageux car si les calques n'existent pas au moment de l'appel ils sont créés par entmake.

 

Amicalement

 

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

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
)

  • Upvote 1

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

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)

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

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.

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é