Aller au contenu

Boucle d\'extraction attribut fixe dans bloc imbriqués


Messages recommandés

Posté(e)

Salut,

J'ai écrit une petite routine permettant d'extraire des "attributs fixes" contenu dans mes blocs.

 

Je n'arrive pas à mettre en place une boucle à l'interieur de mon lisp me permettant d'aller extraires ces même attributs si ces blocs font partis d'un blocs imbriqués à "X" niveau....

(je sais que je pourrais utiliser la commande d'extration d'Autocad pour ça...mais pour le principe de ne pas rester sur une impasse.... :casstet: )

 

lisp d'extration d'attribut fixe d'un bloc "simple" :

 (defun c:aaa ()
 
(setq list-att-1bloc nil) 
 (setq list-att nil)

(setq sel (ssget '((0 . "INSERT"))))

(setq index 0)
(repeat (sslength sel)

(setq Nom_ent (ssname sel index))
(setq bloc (tblsearch "BLOCK"  (cdr (assoc 2 (entget Nom_ent)))))
(setq Nom_ent (cdr (assoc -2 bloc)))
(setq ent (entget Nom_ent))

(while Nom_ent
  (if (/= (cdr (assoc 0 (entget Nom_ent))) "ATTDEF")
    
    (setq Nom_ent (entnext Nom_ent))
    
    (progn				; (setq list-att-1bloc nil)
      (setq ent (entget Nom_ent))
      (setq list-att-1bloc (append
			     (list
			       (list
				 (cdr (assoc 2 ent))(cdr (assoc 1 ent)))) list-att-1bloc))
      (setq Nom_ent (entnext Nom_ent))
      )
    )
  )

(setq list-att (append (list (list (cadr (assoc "Att1" list-att-1bloc))
			       (cadr (assoc "Att2" list-att-1bloc)) 
			       (cadr (assoc "Att3" list-att-1bloc))
			       (cadr (assoc "Att4" list-att-1bloc)))) list-att))
  (setq index (1+ index))
  )

 ;;; liste final tout attributs
 (setq list-att (append (list (list "Att1" "Att2" "Att3" "Att4")) list-att))  
 )

 

... merci d'avances pour votre aide .... ;)

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

pfffffffff.... m'enerve :mad: ,

 

.... plus j'avance, plus je me demande si c'est possible.......

 

.... si vous avez une piste .... :(

 

merci ;)

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

... en fait c'est pour faire le décompte du materiel.

Chaque attribut correspond à un renseignement du la pièce (couleur, poids, ....)

et je veux pouvoir les manipuler.

 

J'y arrive trés bien avec l'extraction d'attribut d'Autocad, mais j'ai , en plus de faire un décompte, besoin de pouvoir faire des tris différents, des selections partiel, ou d'autre manipulation sur la liste des attributs.

(et aussi comme on me conseil souvent ici d'éviter d'utiliser les (command...), j'essaye de sortir tout ça en ne travaillant que sur les entités des blocs...)

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Cela, je le comprends même très bien, mais tu as accès dans ce cas directement aux attributs et il est donc inutile de faire une recherche sur des blocs imbriqués

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Raaaaaaaaaaaaahhhh... à chaque fois j'ai espoirs qu'on me donne une solution... tu joues avec ma santé Patrick !!! ;)

 

Serieusement : pour faire une extraction d'attribut en lisp, je créé un fichier texte, puis je fait un traitement en lisp de ce fichier texte, puis je l'enregistre en csv ....

 

Alors que je voudrais faire une routine pour extraire mes attributs en les rentrants directement dans une "liste lisp", pour pouvoir la traiter ensuite dans des "lisp en argument" utilisant cette routine, et traitant différemment cette liste ....

 

Mais je ne pensais pas que c'était si difficile d'extraire des attributs de blocs imbriqué en lisp... et peut-être beaucoup plus long (en temp de calcul)....

 

je vais en rester à un "(command "-eattext" "O" "P" "" "N..............)

 

... trés triste .... :(

 

:P :P :P

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Extraire les attributs d'un bloc, rien de plus facile, rechercher des bloc imbriqué est une autre histoire, et je pense que l'on parle pas exactement de le même chose

 

pour récupérer les attributs d'un bloc, tu les sélectionnes d'abord dans le dessin et non dans la base de données

Ensuite, tu regardes si le code 66 du bloc existe pour dire que des attributs suivent

Si oui, tu fais une boucle dont tu ressortiras les attributs avec leurs valeurs grace a un premier entnext sur le bloc et ensuite des entnext qui se suivent et dont le dernier se nommera '(0 . SEQEND)

 

@+

 

http://smileys.smileycentral.com/cat/36/36_1_40.gif

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

Ensuite, tu regardes si le code 66 du bloc existe pour dire que des attributs suivent

 

... j'ai un doute : je n'ai jamais trouvé de code 66 dans un bloc contenant un attribut fixe... c'est pour ça que dans mon lisp je passe par une boucle pour atteindre "ATTDEF" ....

 

Je suis daccord pour un bloc ayant des attributs "modifables", mais j'ai cherché et je n'ai pas trouvé de code d'identification d'un attribut fixe ...

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Extrait de l'aide

 

66 Drapeau de variable attributs-suivent (facultatif, valeur par défaut = 0) ; si la valeur du drapeau d’attributs-suivent est de 1, une série d’entités attribut doit suivre l’insertion et se terminer par une entité seqend.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

 

Coucou

 

Et si vous regardiez le code 70 ?

 

= 3 : Attribut constant

 

Ou bien je suis une truffe !

 

Le Decapode (qui connait rien au Lisp)

 

Autodesk Expert Elite Team

Posté(e)

ReReBonjour

 

2 = Constant seulement

 

3 = Invisible et Constant

 

etc ... Eh OUI les petit gars, il faut TESTER / MASQUER les bits UN par UN

pour voir les différents types d'attributs !!! ;)

 

Au boulot, les Lispeurs de la Nuit

 

Le Decapode qui vous salue bien :)

 

 

 

[Edité le 26/7/2006 par lecrabe]

Autodesk Expert Elite Team

Posté(e)

Je sais, je sais ... mais non ....

je confirme que mes blocs créé avec des attributs on ne peut plus simple n'ont pas de code 66, et pourtant en faisant un boucle dessus avec entnext j'atteind bien une entité "ATTDEF"...

 

ex bloc "lc100":

 

((-1 . ) (0 . "INSERT") (330 . ) (5 . "FE54") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AcDbBlockReference") (2 . "lc100") (10 1.37181 1.0525 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 après quelques "entnext" :

 

((-1 . ) (0 . "ATTDEF") (330 . ) (5 . "FE4B") (100 . "AcDbEntity") (67 . 0) (8 . "Attribut") (100 . "AcDbText") (10 0.0 0.0 0.0) (40 . 0.05) (1 . "lob de 100.") (50 . 3.14159) (41 . 1.0) (51 . 0.0) (7 . "Standard") (71 . 0) (72 . 0) (11 0.0 0.0 0.0) (210 0.0 0.0 1.0) (100 . "AcDbAttributeDefinition") (3 . "") (2 . "Désignation") (70 . 2) (73 . 0) (74 . 0))

 

.... et jamais de code 66 ....

 

------------------------------------------------

editer

... mais par contre un code 70... bien vu !!!! je vais voir ça !!! merci edité !!![Edité le 26/7/2006 par Bred]

 

---------------------------------------------------

éditer 2 : aide

.... 70 : Nombre de colonnes (facultatif, valeur par défaut = 1)

 

c'est un peu flou là... j'ai (70.0) dans un (0."INSERT)... et pareil dans un bloc SANS AUCUN ATTRIBUT (une ligne...) .... mauvaise piste je crois ... (le code 70 se trouve dans (0 . ATTDEF")...

 

 

[Edité le 26/7/2006 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

 

ReCoucou

 

Je parle du code 70 dans ATTDEF et non pas dans INSERT ...

 

Mais peut être que je me plante complet ...

 

(entget (car (entsel)) '("*"))

sur des ATTDEF différents: visible/invisible, constant/variable

et c'est comme ça que j'en ai déduit qu'il s'agissait sans doute des bits sur le code 70 !!!

 

Le Decapode

Autodesk Expert Elite Team

Posté(e)

Je parle du code 70 dans ATTDEF et non pas dans INSERT ...

 

oui, mais que j'atteigne (0 . "ATTDEF) ou (70 . 2) c'est pareil pour moi vu qu'il faut que je fasse une boucle pour atteindre le même endroit ....

 

Le problème n'étant pas d'atteindre les attributs dans un bloc "simple", mais de créér une boucle qui me décompose un bloc imbriqué à X niveau afin de le décomposer en sous-bloc qui eux contiennent les attributs...

 

merci quand même (je vais me coucher.... à demain !!!... ;) )

bonne nuit !

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Je pense qu'il te faut passer par la table des "BLOCK" car effectivement pour un attribut constant le code 66 n'apparait pas dans un "INSERT"

 

Et la effectivement le code 70 peut prendre ces différente valeur.

Drapeaux par type de bloc (valeurs binaires pouvant être combinées) :

0 = indique qu'aucun des drapeaux suivants ne s'applique

1 = bloc anonyme généré par hachure, cotation associative, d'autres opérations internes ou une application

2 = ce bloc a des définitions d'attribut non constantes (ce bit n'est pas défini dans le cas contraire ou si le bloc n'a aucune définition d'attribut)

4 = ce bloc est une référence externe (xréf)

8 = ce bloc est un recouvrement de référence externe

16 = ce bloc a des dépendances externes

32 = référence externe résolue ou dépendant d'une référence externe (bit ignoré à la saisie)

64 = cette définition est une référence externe référencée (bit ignoré à la saisie)

 

Dans ton cas tu devrait avoir '(70 . 2)

Mais ça complique les choses, d'ailleurs "EATTEDIT" ne fonctionne pas sur ce genre de bloc à attribut constant.

 

Complexe ton histoire :casstet:

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Bonjour... bien dormi ????

 

Complexe ton histoire

 

... j'ai l'impression qu'il y a de l'éxagération dans la complexité de mon problème....

µDonc, je vais un peu remettre à jour mon post...

 

- le lisp que j'ai écris (1er message) fonctionne trés bien pour extraire les attributs fixe d'un bloc "simple"

 

... le souci que je n'arrive pas à résoudre et l'emplacement dans le lisp d'une boucle du genre

 

 
(while (/= (cdr (assoc 0 (entget Nom_ent))) "ATTDEF")

(setq bloc (tblsearch "BLOCK" (cdr (assoc 2 (entget Nom_ent)))))
(setq Nom_ent (cdr (assoc -2 bloc)))

(setq Nom_ent (entnext Nom_ent))

 

... afin de traiter les blocs imbriqué à "X" niveau

 

- j'arrive en le "bidouillant" à extraire les attributs du "premier" bloc imbriqué, mais je bute sur l'écriture de la boucle de "passage au bloc suivant" ...

 

Mais ça complique les choses, d'ailleurs "EATTEDIT" ne fonctionne pas sur ce genre de bloc à attribut constant.

 

... je ne vois pas ce que "EATTEDIT" viens faire là.... ce sont justement des attributs "fixes", donc je n'ai JAMAIS besoin de les modifiers ....

 

 

 

 

 

 

 

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

je ne vois pas ce que "EATTEDIT" viens faire là....

 

Je pense que simplement que les commandes standard d'Autocad fonctionne suivant le même principe que ce que pourrais faire un lisp. Donc je pense que cette commande s'appuie sur les bits de controle pour editer l'attribut.

 

En conséquence vu que cette commande refuse de fonctionner sur un attribut constant, pour moi cela veut dire que le bit de controle n'est pas valide ou inexistant. Donc je vois mal comment faire avec un lisp pour acceder simplement a cet attribut de la même manière.

 

Il est possible que ma réflexion soit erronée, mais j'essaye d'être logique, c'est tout :casstet:

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Idée débile peut être: Ne pas utiliser d'attributs constants / fixes !

 

... j'ai 800 blocs à mettre à jours ... et je suis en train de l'grandir ma biblio...

et qui plus est je n'est besoin que d'attribut fixe (avoir chaque fois des invites à l'insertion me mettrait en "rogne" ... ou vérifier que j'ai bien les variables attreq et attdia bien paramétré au moment de l'insertion du bloc (j'en utilise certains avec invite) un peu lourd ...)

 

.... je ne pensais vraiment pas que ce post mettrais une barrière au lisp en traitement d'entité !!!... ??? ...

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Y a un truc qui m'échappe

et qui plus est je n'ai besoin que d'attribut fixe

 

Cela veut dire que tu connais donc la valeur de tes attributs, alors pourquoi vouloir les extraire?

 

Il te suffit de faire un comptage du nombre d'insertion de ton bloc et d'y affecter toi même les valeurs puisque tu les connais!

 

 

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

Il te suffit de faire un comptage du nombre d'insertion de ton bloc et d'y affecter toi même les valeurs puisque tu les connais!

 

en effet... et ça à été la première piste que j'ai suivi lors de la cration de la bibliothèque... pour ce rendre compte ensuite que pour faire ça, il me faut absolument avoir un code qui me traduise mes réferences... si je change de poste ou que je veuille transmettre la bibliothèque à un client, il faut que je lui fournisse le "programme de traduction" ...

un peu lourd en sachant que le fait de crér des attributs fixes me permet d'éviter ce problème, et m'évite aussi de taper un multitude de ligne de code (800 blocs référencé pour l'instant !!!...)... :(

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Je pense qu'il te faut passer par la table des "BLOCK" car effectivement pour un attribut constant le code 66 n'apparait pas dans un "INSERT"

Je viens d'apprendre quelque chose. :cool:

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

C CLAIR que tu n'auras AUCUNE info sur les attributs constants par les .INSERT !!!

 

... en effet, et c'est bien pour cela que dans mon lisp je "penettre" dans le bloc jusqu'à rencontrer un "(0 . ATTDEF) si il y en a un ...

 

donc si maintenant on pouvais revenir au sujet original de mon post, c'est à dire le fait d'effectuer une boucle afin de "fouiller" les blocs imbriqués ....

 

... merci

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Je te propose quelque chose, sans garantie, bien tester pour voir si les résultats te semble corrects car ce n'est pas évident dans les imbrications :casstet:

 

 

(defun xplore (l / ent )
(while (setq ent (entnext (cdar l)))
	(setq l (entget ent))
	(if (eq (cdr (assoc 0 l)) "INSERT")
		(xplore (entget (cdr (assoc -2 (tblsearch "BLOCK" (cdr (assoc 2 l)))))))
	)
	(if (eq (cdr (assoc 0 l)) "ATTDEF")
		(print (strcat "Etiquette = " (cdr (assoc 2 l)) " ; Valeur = " (cdr (assoc 1 l))))
	)
)
)
(defun c:block_summary ( / first_blk l_blk n_blk js)
(setq first_blk (tblnext "BLOCK" T))
(cond
	(first_blk
		(setq l_blk (list first_blk))
		(while (setq n_blk (tblnext "BLOCK"))
			(setq l_blk (cons n_blk l_blk))
		)
		(foreach n l_blk
			(setq js (ssget "_X" (list (cons 0 "INSERT") (assoc 2 n))))
			(print (strcat "BLOC : " (cdr (assoc 2 n)) " " (itoa (if js (sslength js) 0)) " insertion(s)"))
			(cond
				((< (cdr (assoc 70 n)) 4)
					(setq dxf_lst (entget (cdr (assoc -2 n))))
					(xplore dxf_lst)
				)
				(T (princ " -> XREF. Définition ignorée"))
			)
			(print)
		)
	)
	(T
		(princ "\nPas de blocs définis!")
	)
)
(prin1)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

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é