Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
15 janvier 2014 3 15 /01 /janvier /2014 13:19
Problématique

On peut avoir, pour diverses raisons, besoin de créer un lien logique entre 2 ou une infinité d’entités.

La raison peut être l’exécution d’un traitement sur une entité, par un réacteur, lorsqu’une autre entité est déplacée ou modifiée.

Dans ce cas là, on utilisera les mécanismes propres aux commandes VLR- qui gèrent ce problème.

Mais on peut simplement avoir besoin de savoir à quelle entité un texte se rapporte, ou quel s sont les blocs qui sont associés à une polyligne

On peut stocker ces infos « en dur », sous forme de handle chaine, dans  des attributs de bloc, des données d’objet.

Le problème de ces méthodes c’est que le lien se casse dès que l’on fait un copier/coller, une insertion comme bloc décomposé dans un autre dessin, ou lors d’une requête Map.

On va donc explorer les liens qui peuvent persister après les opérations suivantes :

-          {C}Copier/ coller

-          {C}Commande copier

-          {C}Insertion/décomposition de dwg externe

-          {C}Requête map

 L’aide officielle d’Autodesk sur ce sujet : Identificateurs persistants de références inter-objets (DXF)

Un exemple concret de lien persistant : les entités leader Autocad

La  première génération de lignes de repère est composée d’une ligne repère (LEADER) et d’un texte multiple (MTEXT)

Si on déplace le mtext, le leader suit.

L’intérêt de ce lien, c’est qu’il est maintenu lors de copier/coller, copie par la commande copier et requête Map

Comment cela fonctionne-t-il ?

Dans le mtext, un pointeur vers le leader est placé sous cette forme :

  (102 . "{ACAD_REACTORS")

  (330 . <Nom d 'entité: 7ffff68c8c0>)

  (102 . "}")

 

Dans le leader, un pointeur vers le mtext est placé sous cette forme :

(340 . <Nom d     'entité: 7ffff68c8d0>)

Je ne connais pas la fonction appelée en réaction, mais pour le mécanisme d’identification, c’est ça.

Peut-t-on utiliser ce mécanisme pour notre propre usage ?

Oui, on peut utiliser cette méthode avec certaines entités, les plus récentes.

Il suffit d’ajouter  le code dxf  "{ACAD_REACTORS" à l’entité, si ce code existe déjà, on peut ajouter nos propres codes 330, Autocad n’y trouve rien à redire.

 Les entités anciennes ne l’acceptent pas : Voici la liste des entités compatible ou incompatible :

Entité

Fonctionne

U = pas testé

3DFACE

 

X = fonctionne

3DSOLID

u

 

ACAD_PROXY_ENTITY

u

 

ACAD_TABLE

x

 

ARC

   

ARC_DIMENSION

X

 

ATTDEF

X

 

ATTRIB

u

 

BODY

u

 

CIRCLE

   

DIMENSION

x

 

DONUT

x

 

ELLIPSE

x

 

HATCH

x

 

HELIX

u

 

IMAGE

u

 

INSERT

   

LEADER

x

 

LIGHT

u

 

LINE

   

LWPOLYLINE

x

 

MLINE

x

 

MPOLYGON

x

 

MTEXT

x

 

MULTILEADER

u

 

OLE2FRAME

u

 

OLEFRAME

u

 

POINT

   

POLYLINE

   

RAY

x

 

REGION

u

 

RTEXT

u

 

SHAPE

u

 

SOLID

   

SPLINE

x

 

TEXT

   

TOLERANCE

x

 

TRACE

   

VERTEX

u

 

VIEWPORT

u

 

WIPEOUT

x

 

XLINE

x

 

 

Une bibliothèque de fonction pour utiliser ce mécanisme ?

Les fonctions ACET (voir ici) fournissent tout ce qu’il faut, et surtout celle-ci :

ACET-ACADREACTOR-ID-ADD      ( E1  NA2 )

;;exemple d'utilisation :

(setq egAvecReact

       (ACET-ACADREACTOR-ID-ADD

       (car (entsel "\nSélectionnez l'entité pour l'ajout du réacteur :"         )       )

       (car (entsel "\nSélectionnez l'entité à référencer :"))

       )

)

;; -> retourne

'((-1 . <Nom d 'entité: 7ffff626f10>)

   (0 . "LWPOLYLINE")

   (5 .      "1CE1"   )

   (102 . "{ACAD_REACTORS")

   (330 . <Nom d 'entité: 7ffff626f20>);_pointeur vers l'entité référencée

   (102     .     "}"   )

   (330 . <Nom d 'entité: 7ffff6199f0>)

   (100 . "AcDbEntity")

   (67 . 0)

   (410     .     "Model"   )

   (8 . "MonCalque")

   (6 . "Continuous")

   (100     .     "AcDbPolyline"   )

   (90 . 2)

   ....

   (210 0.0 0.0 1.0)

 )

 ;;on a plus qu'à faire le entmod:

 (Entmod egAvecReact)

 Article suivant: 3 autres solutions dont les Xdatas avec code 1005

g-eaux

Partager cet article
Repost0

commentaires