Aller au contenu

Messages recommandés

Posté(e)

Bonjour à tous,

 

J'aimerais beneficier de votre aide concernant cette fameuse commande entnext...

Voilà mon soucis:

disons que je veuille connaitre tout ce q'un bloc a dans le ventre

Je tape donc

 

(setq a (car(entsel)))

 

Je selectionne mon block et là je recupere donc dans "a" le nom de mon entité (le ename si je ne me trompe pas ;) ).Dans mon cas c'est

 

Ensuite pour avoir la liste des données je tape:

 

(setq b (entget a))

 

à ce moment là j'ai la liste suivante:

 

Commande: (setq b (entget a))

((-1 . ) (0 . "INSERT") (330 .

7efe6cf8>) (5 . "17B1") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")

(100 . "AcDbBlockReference") (66 . 1) (2 . "u0gba205") (10 235.795 90.0539 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))

 

Et c'est la que cela se corse pour moi :cool: ...en effet je sais que cette liste n'est pas finis et que pour avoir la suite il me faut utiliser la commande entnext jusqu'à obtenir mon fameux SEQEND mais j'ai beau esayé je n'y arrive pas :P

 

J'ai essayé cela:

Commande: (entnext)

Mais comme vous le voyez je n'ai que le ename...

 

j'ai aussi esayé cela:

 

Commande: (entnext b)

; erreur: type d'argument incorrect: lentityp ((-1 . )

(0 . "INSERT") (330 . ) (5 . "17B1") (100 .

"AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference")

(66 . 1) (2 . "u0gba205") (10 235.795 90.0539 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))

mais la j'ai carrement un message d'erreur...

 

J'ai vraiment besoin de votre aide....

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Posté(e)

Salut,

 

Tout d'abord, attention de ne pas confondre référence de bloc (INSERT) et définition de bloc (BLOCK).

 

entnext utilisé sur une référence de bloc retournera la première référence d'attribut (ATTRIB) si le bloc en a sinon l'entité suivante dans la base de données.

Utilisé sur une définition de bloc, entnext permet de retrouver toutes les entités composant le bloc.

 

Donc d'après ce que tu as commencé à faire, on peut supposer que ce sont les attributs que tu cherches dans une référence de bloc.

 

entnext requiert comme argument un nom d'entité (ENAME) et retourne l'entité suivante dans la base de données.

Donc toujours en suivant ton exemple, si on fait :

(setq e (entnext a)) ; avec [b]a[/b] et non pas [b]b[/b] qui est une liste DXF

e contiendra le nom d'entité de l'entité suivante dans la base de données (ou nil si a est un bloc ne contenant aucun attribut et que c'est la dernière entité ajoutée à la base de données).

 

Pour continuer, il faut tester si e est bien un attribut, on va donc rechercher le code 0 dans sa liste DXF :

(setq elst (entget e))
(if (= (cdr (assoc 0 elst)) "ATTRIB") ...)

 

Si c'est bien un attribut et qu'on veut le ou les attributs suivants on fait en général une boucle en réaffectant à e l'entité suivant e :

(setq e (entnext e))

 

Je te laisse chercher un peu et si tu n'y arrive vraiment pas ou si ce n'est pas du tout ce que tu voulais faire, je te donnerais un exemple.

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

Posté(e)

Merci beaucoup Gile,tu as parfaitement bien compris mon problème :)

 

En effet ce sont bien les attributs que je recherche et il est vrai que ma commande (entnext b) ne pouvais pas marcher car b est une liste et pas un ename ;) .J'ai donc executer la commande (setq e (entnext a)) et là je me suis rendu compte d'un truc tout bete mais que je n'avais pas remarquer la premiere fois...le nom de l'entité n'etais plus le meme! Voilà ce que cela a donner:

 

Ouverture d'un fichier au format AutoCAD 2004.

Régénération du modèle.

 

AutoCAD Express Tools Copyright © 2002-2004 Autodesk, Inc.

 

Utilitaires de menu AutoCAD chargés.

Commande: (setq a (car(entsel)))

 

Choix de l'objet:

 

Commande: (setq b (entget a))

((-1 . ) (0 . "INSERT") (330 .

7ef80cf8>) (5 . "17BD") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")

(100 . "AcDbBlockReference") (66 . 1) (2 . "u0gba205") (10 235.795 150.739 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))

 

Commande: (setq e (entnext a))

 

C'est donc à cette instant que j'ai compris que le "e" n'avais plus rien a voir avec le "a" alors j'ai continuer ma boucle jusqu'à obtenir enfin mon fameux SEQEND

 

Ouverture d'un fichier au format AutoCAD 2004.

Régénération du modèle.

 

AutoCAD Express Tools Copyright © 2002-2004 Autodesk, Inc.

 

Utilitaires de menu AutoCAD chargés.

Commande: (setq a (car(entsel)))

 

Choix de l'objet:

 

Commande: (setq b (entget a))

((-1 . ) (0 . "INSERT") (330 .

7ef80cf8>) (5 . "17BD") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")

(100 . "AcDbBlockReference") (66 . 1) (2 . "u0gba205") (10 235.795 150.739 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))

 

Commande: (setq e (entnext a))

 

Commande: (entget e)

((-1 . ) (0 . "ATTRIB") (330 .

7efbe9e8>) (5 . "17BE") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")

(62 . 7) (6 . "Continuous") (100 . "AcDbText") (10 222.957 146.996 0.0) (40 .

2.0) (1 . "1500-00-EA1-1599") (50 . 0.0) (41 . 0.8) (51 . 0.0) (7 . "romans")

(71 . 0) (72 . 1) (11 235.795 146.996 0.0) (210 0.0 0.0 1.0) (100 .

"AcDbAttribute") (2 . "REPERE") (70 . 0) (73 . 0) (74 . 0))

 

Commande: (setq e (entnext e))

 

((-1 . ) (0 . "ATTRIB") (330 .

7efbe9e8>) (5 . "17BF") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")

(62 . 7) (6 . "Continuous") (100 . "AcDbText") (10 231.795 151.996 0.0) (40 .

2.0) (1 . "1x36W") (50 . 0.0) (41 . 0.8) (51 . 0.0) (7 . "romans") (71 . 0) (72

. 1) (11 235.795 151.996 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (2 .

"PUISSANCE") (70 . 0) (73 . 0) (74 . 0))

 

Commande: (setq e (entnext e))

 

Commande: (entget e)

((-1 . ) (0 . "ATTRIB") (330 .

7efbe9e8>) (5 . "17C0") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")

(62 . 240) (100 . "AcDbText") (10 235.795 157.73 0.0) (40 . 2.0) (1 . "") (50 .

0.0) (41 . 1.0) (51 . 0.0) (7 . "romans") (71 . 0) (72 . 1) (11 235.795 157.73

0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (2 . "PUISSUNIT") (70 . 1) (73 .

0) (74 . 0))

 

Commande: (setq e (entnext e))

 

Commande: (entget e)

((-1 . ) (0 . "ATTRIB") (330 .

7efbe9e8>) (5 . "17C1") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")

(62 . 240) (100 . "AcDbText") (10 235.795 160.73 0.0) (40 . 2.0) (1 . "") (50 .

0.0) (41 . 1.0) (51 . 0.0) (7 . "romans") (71 . 0) (72 . 1) (11 235.795 160.73

0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttribute") (2 . "OBSERVAT") (70 . 1) (73 .

0) (74 . 0))

 

Commande: (setq e (entnext e))

 

Commande: (entget e)

((-1 . ) (0 . " SEQEND") (330 .

7efbe9e8>) (5 . "17C2") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0")

(-2 . ))

 

Et là au miracle :D mon SEQEND est apparue! Au fur et a mesure que je faisais des entnext mon block devoilais enfin tous ces secrets :)

 

Maintenant il ne me reste plus qu'a m'entrainer pour faire une boucle avec tout cela qui s'arreterai dès qu'elle trouverait une certaine valeur :cool:

 

En tout cas je te remercie Gile pour tes conseils mais je n'arrive pas a saisir encore la difference entre "réference de bloc" et "definition de bloc" peux tu m'expliquer s'il te plait?

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Posté(e)

Les références de blocs c'est ce qu'on appelle communément les blocs à savoir des entités complexes insérées dans l'espace objet, l'espace papier, ou un définition de bloc (bloc imbriqué).

Ce 'bloc inséré' n'est en fait qu'une référence à la définition du bloc on peut modifier sa géométrie location, rotation et échelles, mais pas les entités qui le compose excepté les valeurs d'attribut (ce qui ne change pas la définition d'attribut dans la définition du bloc).

Le cas des blocs dynamiques illustre bien ça : quand on modifie les propriétés dynamiques d'un bloc AutoCAD crée automatiquement un nouvelle définition de bloc anonyme.

 

Une définition de bloc, c'est un objet conservé dans le dessin dans une "table" : la table des blocs. Il est constitué d'une ou plusieurs entités, et optionnellement de définitions d'attribut chacune de ces entités est située dans la définition du bloc par rapport au point d'insertion qui sert d'origine au système de coordonnées du bloc. Si la définition de bloc est modifiée, toutes les références insérées dans le dessin seront aussi modifiées.

 

Pratiquement, quand on crée un bloc avec la commande BLOC, AutoCAD enregistre la définition de bloc dans la table des blocs et en crée une référence si l'option "Convertir en bloc" est cochée.

 

Tu verras si tu pousses un peu en programmation que les similitudes entre une définition de bloc et l'espace objet d'AutoCAD sont grandes.

Les deux sont composés de plusieurs entités situées dans un système de coordonnées. Par exemple, quand on ouvre un bloc dans l'éditeur de bloc, on est dans la définition du bloc qu'on peut modifier presque comme on modifie l'espace objet.

Quand on utilise la commande WBLOC, on enregistre un ficher DWG dont l'espace objet est le bloc qu'on a défini et inversement quand on insère le bloc "toto.dwg" dans l'espace objet du dessin courant on ajoute une nouvelle définition de bloc à la table des bloc et cette définition n'est autre que l'espace objet du fichier "toto.dwg".

 

J'ai peut être été un peu confus mais je pense que ces notions sont primordiales si on veut bien comprendre le fonctionnement des blocs, comment les modifier, comment traiter les blocs imbriqués etc.

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

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

Bonjour à tous ;) et merci de tes reponses Gile

 

J'essais de comprendre tant bien mal :P ...

 

Afin de bien comprendre comment tout cela marche j'ai realiser un dessin avec 3 blocs constitués d'attribut puis j'ai tapé les commandes suivantes jusqu'a tomber sur nil :

 

Commande: (tblnext "block")
((0 . "BLOCK") (2 . "u0gba223") (70 . 2) (4 . "") (10 0.0 0.0 0.0) (-2 . ))

Commande: (tblnext "block")
((0 . "BLOCK") (2 . "u0gba677") (70 . 2) (4 . "") (10 0.0 0.0 0.0) (-2 . ))

Commande: (tblnext "block")
((0 . "BLOCK") (2 . "BDC") (70 . 2) (4 . "") (10 0.0 0.0 0.0) (-2 . ))

Commande: (tblnext "block")
nil

 

Alors a ce moment là je me dis que je vais recuperer le nom de l'entité de mon premier bloc via le code -2 ce qui me donne cela:

 
(entget (cdr (assoc -2 (tblnext "block" t))))
((-1 . ) (0 . "LWPOLYLINE") (330 . 7e0def78>) (5 . "F3") (100 . "AcDbEntity") (67 . 0) (8 . "0") (62 . 0) (6 . 
"Continuous") (100 . "AcDbPolyline") (90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) 
(39 . 0.0) (10 -2.5 2.5) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 -2.5 -2.5) (40 . 
0.0) (41 . 0.0) (42 . 0.0) (10 2.5 -2.5) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 
2.5 2.5) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))

Et la oh surprise je me retrouve avec (0 . "LWPOLYLINE") en code 0 d'ou ma question...pourquoi ce code si mon ename est un bloc??Est ce parce que je suis dans la definition de bloc et non pas dans la reference de bloc :cool: ?

J'avoue comprendre facilement les 3 autres strucutres qui compose un dessin a savoir les variables,les tables ou les entités (grosso modo les objet graphique) mais la partie bloc je seche un peu....

 

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Posté(e)

Salut,

 

Quand tu enchaînes les tblnext, tu parcours la table des (définitions de) blocs ("u0gba223" puis "u0gba677" puis "BDC")

Dans chacune des listes retournée, il y a un groupe -2 dont la valeur est le nom d'entité (ENAME) de la première entité composant la définition du bloc.

 

(setq ent (cdr (assoc -2 (tblnext "block" t)))) te retourne donc la première entité du premier bloc de la table.

(setq ent (entnext ent)) te retourne la seconde entité de ce bloc et ainsi de suite jusqu'à avoir parcouru tous les composants du bloc.

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

Posté(e)

Salut Gile :)

 

Tu vois ce que je ne comprends pas c'est pourquoi lorsque je fait

 
Commande: (entget (cdr (assoc -2 (tblnext "block" t))))

j'obtiens:

 
((-1 . ) (0 . "LWPOLYLINE") (330 . 7e0def78>) (5 . "F3") (100 . "AcDbEntity") (67 . 0) (8 . "0") (62 . 0) (6 . 
"Continuous") (100 . "AcDbPolyline") (90 . 4) (70 . 1) (43 . 0.0) (38 . 0.0) 
(39 . 0.0) (10 -2.5 2.5) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 -2.5 -2.5) (40 . 
0.0) (41 . 0.0) (42 . 0.0) (10 2.5 -2.5) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 
2.5 2.5) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))

Alors que si je vais

 
Commande: (entget (car (entsel)))

Et que je selectionne le bloc "u0gba223" j'obtiens:

 
Commande: (entget (car (entsel)))

Choix de l'objet: ((-1 . ) (0 . "INSERT") (330 . d'entité: 7e0decf8>) (5 . "12B") (100 . "AcDbEntity") (67 . 0) (410 . "Model") 
(8 . "0") (100 . "AcDbBlockReference") (66 . 1) (2 . "u0gba223") (10 223.401 
134.096 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))

 

Dans un cas j'obtiens la paire pointé (0 . "LWPOLYLINE") et dans l'autre (0 . "INSERT") ....

Y a t il une difference entre (cdr (assoc -2 (tblnext "block" t))) et (car (entsel))?Les 2 ne devrais t il pas donné le meme ename?

 

Merci pour ton aide Gile ;)

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

Posté(e)

Comme dit ci-dessus :

(cdr (assoc -2 (tblnext "block" t)))

retourne la liste DXF de la première entité (composant) de la définition du bloc (type LWPOLYLINE)

 

(car (entsel))

retourne la liste DXF de la référence de bloc sélectionnée (type INSERT)

 

Si tu fais :

(entget (tblobjname "block" "u0gba223"))

tu auras la liste DXF complète de la définition du bloc "u0gba223" (type "BLOCK") qui contient aussi le groupe -2 (la liste retournée par tblnext n'est qu'un extrait)

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

Posté(e)

Merci pour tes reponses Gile car la distinction entre les 2 ne paraissait pas tres evidente ;) il ne me reste plus qu'a me plonger dans les boucles et les condition maintenant :cool: ...

Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson

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é