Aller au contenu

Messages recommandés

Posté(e)

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.

Posté(e)

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...

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

  • 2 semaines après...
Posté(e)

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.

Posté(e)

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

Posté(e)

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

Posté(e)

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.

Posté(e)

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

Posté(e)

'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]

Posté(e)

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

Posté(e)

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).

 

 

Posté(e)

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

Posté(e)

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.

 

 

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é