Bred Posté(e) le 25 juillet 2006 Posté(e) le 25 juillet 2006 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...
Bred Posté(e) le 25 juillet 2006 Auteur Posté(e) le 25 juillet 2006 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...
Patrick_35 Posté(e) le 26 juillet 2006 Posté(e) le 26 juillet 2006 SalutUne chose m'échappe dans ta demande. Que veux tu faire des attributs dans des blocs imbriqués alors que l'on ne peut y avoir accès ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Bred Posté(e) le 26 juillet 2006 Auteur Posté(e) le 26 juillet 2006 ... 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...
Patrick_35 Posté(e) le 26 juillet 2006 Posté(e) le 26 juillet 2006 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Bred Posté(e) le 26 juillet 2006 Auteur Posté(e) le 26 juillet 2006 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...
Patrick_35 Posté(e) le 26 juillet 2006 Posté(e) le 26 juillet 2006 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éesEnsuite, tu regardes si le code 66 du bloc existe pour dire que des attributs suiventSi 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
Bred Posté(e) le 26 juillet 2006 Auteur Posté(e) le 26 juillet 2006 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...
Patrick_35 Posté(e) le 26 juillet 2006 Posté(e) le 26 juillet 2006 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
lecrabe Posté(e) le 26 juillet 2006 Posté(e) le 26 juillet 2006 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
lecrabe Posté(e) le 26 juillet 2006 Posté(e) le 26 juillet 2006 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
Bred Posté(e) le 26 juillet 2006 Auteur Posté(e) le 26 juillet 2006 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...
lecrabe Posté(e) le 26 juillet 2006 Posté(e) le 26 juillet 2006 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/variableet 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
Bred Posté(e) le 26 juillet 2006 Auteur Posté(e) le 26 juillet 2006 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...
bonuscad Posté(e) le 26 juillet 2006 Posté(e) le 26 juillet 2006 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'applique1 = bloc anonyme généré par hachure, cotation associative, d'autres opérations internes ou une application2 = 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 externe16 = ce bloc a des dépendances externes32 = 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
Bred Posté(e) le 27 juillet 2006 Auteur Posté(e) le 27 juillet 2006 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...
bonuscad Posté(e) le 27 juillet 2006 Posté(e) le 27 juillet 2006 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
lecrabe Posté(e) le 27 juillet 2006 Posté(e) le 27 juillet 2006 Hello Idée débile peut être: Ne pas utiliser d'attributs constants / fixes ! Le Decapode "simplifiant" Autodesk Expert Elite Team
Bred Posté(e) le 27 juillet 2006 Auteur Posté(e) le 27 juillet 2006 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...
bonuscad Posté(e) le 27 juillet 2006 Posté(e) le 27 juillet 2006 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
Bred Posté(e) le 27 juillet 2006 Auteur Posté(e) le 27 juillet 2006 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...
Patrick_35 Posté(e) le 27 juillet 2006 Posté(e) le 27 juillet 2006 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 PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
lecrabe Posté(e) le 27 juillet 2006 Posté(e) le 27 juillet 2006 Hello C CLAIR que tu n'auras AUCUNE info sur les attributs constants par les .INSERT !!! Le Decapode "constant" Autodesk Expert Elite Team
Bred Posté(e) le 27 juillet 2006 Auteur Posté(e) le 27 juillet 2006 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...
bonuscad Posté(e) le 28 juillet 2006 Posté(e) le 28 juillet 2006 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
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