Aller au contenu

Messages recommandés

Posté(e)

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:

Posté(e)
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

Posté(e)

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 ?

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)
Je ne pense pas qu'il y ait de dictionnaire pour les blocs

Pourtant 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

Posté(e)

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

Posté(e)

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

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é