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