krunch Posté(e) le 2 octobre 2012 Posté(e) le 2 octobre 2012 Bonjour Savez vous où se planque cette propriété de bloc ?? Pour les textes c'est une Xdata (ce post) mais pour les blocs il n'y a pas d'entité, donc pas de Xdata ..La Xdata n'est pas dans l'Insert, ni dans les objets de l'Insert, ni dans les objets du bloc. Par contre dans l'Insert il y a bien la propriété Annotative (dictionnaire du code 360) comme pour les textes .. :angry:
(gile) Posté(e) le 2 octobre 2012 Posté(e) le 2 octobre 2012 mais pour les blocs il n'y a pas d'entité, donc pas de Xdata . Eh si, on peut attacher des Xdata à tous les objets AutoCAD, aux entités graphiques comme aux objets non graphiques (calques, définitions de bloc, dictionnaires...). Ce que tu cherches se trouve bien dans les Xdata de la définition d'un bloc annotatif sous la même forme que pour les textes (1001 . AcadAnnoPO) (1070 . 1) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
krunch Posté(e) le 2 octobre 2012 Auteur Posté(e) le 2 octobre 2012 Alors j'ai raté quelque chose .. Je disais qu'il n'y a pas d'entité parce qu'il n'y a pas de code -1 dans la définition de bloc obtenue par (tblsearch "BLOCK" "nom") Et la propriété en question se cherche avec :(assoc -3 (entget ent '("AcadAnnoPO"))) D'autre part je n'ai pas de code -3 dans la définition d'un bloc (même annotatif) renvoyé par tblsearch, donc je n'obtiens rien avec :(assoc -3 (tblsearch "BLOCK" "nom")) Comment l'obtiens tu ?
(gile) Posté(e) le 2 octobre 2012 Posté(e) le 2 octobre 2012 Première chose, tblsearch ne retourne pas la liste DXF complète, il faut utiliser tblobjname pour avoir le ename puis faire un entget :(entget (tblobjname "block" "nom"))Deuxième chose, j'ai oublié de préciser que les Xdata sont attachées à l'objet BlockTableRecord (la définition du bloc, objet propriétaire de l'objet Block). On obtient cet objet par le premier groupe 330 de la liste du bloc :(cdr (assoc 330 (entget (tblobjname "block" "nom"))))Donc, pour avoir les Xdata :(cadr (assoc -3 (entget (cdr (assoc 330 (entget (tblobjname "block" "nom")))) '("AcadAnnoPO")))) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
krunch Posté(e) le 2 octobre 2012 Auteur Posté(e) le 2 octobre 2012 D'accord, je connaissais pas tblobjname vs tblsearch .. J'arrive maintenant à la lire.Merci un coup de plus.
krunch Posté(e) le 3 octobre 2012 Auteur Posté(e) le 3 octobre 2012 Je sèche sur autre chose : finalement j'ai besoin de vérifier la propriété Annotative du bloc, et je n'arrive pas à trouver le dictionnaire "AcDbContextDataManager" .. Normalement le test est le suivant (pour ent = texte) mais dans le cas d'un bloc je ne trouve pas non plus sur quoi le brancher ..(if (and (setq tmp (cdr (assoc 360 (entget ent)))) (setq tmp (dictsearch tmp "AcDbContextDataManager")) (setq tmp (dictsearch (cdr (assoc -1 tmp)) "AcDb_AnnotationScales")) ) (assoc 350 tmp) )
krunch Posté(e) le 4 octobre 2012 Auteur Posté(e) le 4 octobre 2012 Bon, alors je ne dis plus qu'il y a un manque de cohérence mais il y a parfois de quoi s'arracher les cheveux .. (gile) tu m'as donné la solution pour la propriété MatchOrient d'un bloc, je cherche maintenant sa propriété Annotative (sachant que pour que la 1ère soit effective il faut les deux). Pour un texte j'obtiens ces propriétés avec les fonctions ci-dessous, ça marche très bien(Get_MatchOrient obj) (Get_Annot obj) Pour un bloc je récupère maintenant MatchOrient depuis le BlockTableRecord (dans la ligne suivante obj est obtenu avec nentsel).. alors pourquoi la 2è ligne ne marche pas ?(Get_MatchOrient (cdr (assoc 330 (entget (tblobjname "block" (cdr (assoc 2 (entget (cdr (assoc 330 (entget obj))))))))))) (Get_Annot (cdr (assoc 330 (entget (tblobjname "block" (cdr (assoc 2 (entget (cdr (assoc 330 (entget obj))))))))))) Où est stocké ce dictionnaire ?Il n'est pas dans l'objet imbriqué (sauf si c'est un Attrib je crois), il n'est pas dans la RefBloc, il n'est pas dans le bloc, il n'est pas dans l'objet BlockTableRecord ??? ; Renvoie l'entrée du dictionnaire si la propriété annotative de obj est activée / nil sinon (defun Get_Annot (obj) (if (and (setq obj (cdr (assoc 360 (entget obj)))) (setq obj (dictsearch obj "AcDbContextDataManager")) (setq obj (dictsearch (cdr (assoc -1 obj)) "AcDb_AnnotationScales")) ) (cdr (assoc 350 obj)) ) ) ; Renvoie la XData si la propriété MatchOrient de obj est activée / nil sinon (defun Get_MatchOrient (obj) (assoc -3 (entget obj '("AcadAnnoPO"))) )
(gile) Posté(e) le 4 octobre 2012 Posté(e) le 4 octobre 2012 Salut, Je ne pense pas qu'il y ait de dictionnaire pour les blocs.Si le BLOCK_RECORD n'a pas de xdata pour l'appreg "AcadAnnotative", il n'est pas annotatif.S'il a cette xdata, il est annotatif si la seconde entrée 1070 = 1 et n'est pas annotatif si elle est égale à 0. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
krunch Posté(e) le 4 octobre 2012 Auteur Posté(e) le 4 octobre 2012 Je ne pense pas qu'il y ait de dictionnaire pour les blocsPourtant si : on le voit avec ton EDICT si le bloc est annotatif .. Si le BLOCK_RECORD n'a pas de xdata pour l'appreg "AcadAnnotative"En effet, le test marche bien comme ça y compris avec les textes, c'est donc une meilleure formule. Merci de nouveau
(gile) Posté(e) le 4 octobre 2012 Posté(e) le 4 octobre 2012 Précision :L'objet BLOCK_RECORD (définition du bloc) n'a pas d'entrée "AcDbContextDataManager" dans son dictionnaire d'extension, par contre les références du bloc en ont une si le bloc est annotatif. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
krunch Posté(e) le 4 octobre 2012 Auteur Posté(e) le 4 octobre 2012 Oui c'est bien la RefBloc qui est testée par EDICT J'ai compris : le pb venait en fait de mon (cdr (assoc 330 (entget obj))) où obj est donné par nentsel ..- si obj est un Attrib il renvoie bien l'INSERT- sinon il renvoie un BLOCK_RECORD
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