VL - Coordonnées Objets

Coordonnées Entités

X, Y et Z...

Les coordonnées des objets (des entités) sont les données de base qui permettent de "travailler" ces objets, devoir les extraire est une des bases de la programmation sur des objets dessinés.

Les coordonnées de ces différents types d'objets : (ordre alphabétique, n'y voyez pas de préférences) sont obtenues par l'interrogation de la propriété coordinates sur un objet VLA.

les valeurs renvoyées sont de type Variant (tableau de réels)

Ligne
3DFace Face3D un variant de 3 ou 4 points 3D
3DPolyline Polyligne3D un variant de points 3D
Leader Ligne de repère un variant de points 3D
LWPolyline Polyligne allégée un variant de points 2D
Mline Multi Ligne un variant de points 3D
Point Point un variant 3D
PolyFaceMesh un variant de points 3D
PolygonMesh un variant de points 3D
Polyligne polyligne
(version 14)
un variant de points 3D (Z ignoré)
Solid Solide, pas une entité en 3D 3DSOLID un variant de points 3D
SubDMesh un variant de points 3D
SubDMeshVertex un variant de points 3D
Trace un variant de points 3D

Pour modifier les coordonnées de l'objet spécifié, il va falloir utiliser les techniques de gestion des tableaux pour traiter les coordonnées contenues dans cette propriété.

PolyfaceMesh, PolygonMesh, Trace
Vous ne pouvez pas modifier le nombre de coordonnées obtenues pas cette propriété, vous ne pouvez modifier que les valeurs des coordonnées existantes.

3DPolyline, Polyline, PolygonMesh :
Pour les polylignes simples (sans courbe ou lissage), cette propriété spécifie des sommets simples.
Pour les polylignes avec courbe ou lissage, cette propriété spécifie les sommets des points de contrôle.

Lorsque vous extrayez les coordonnées d'une polyligne pour la modifier,et qu'à la transformation vous fournissez moins de coordonnées que l'objet possède actuellement, la polyligne sera tronquée.
Si vous fournissez plus de coordonnées que l'objet possède actuellement, les sommets supplémentaires seront ajoutés à la polyligne.

Le système de coordonnées de l'objet pour les polylignes "simple" et "allégée" peut être transformé par la méthode : TranslateCoordinatesmethod.


Polyligne3D

1
2
3
4
5
6
7
8
9
(setq entvla (vlax-ename->vla-object 
                                (car (entsel "\nChoix de l'entité\n"))
             )
)
(setq coords-vla (vlax-get-property entvla 'coordinates))
(setq coords-liste (vlax-safearray->list
                   (vlax-variant-value coords-vla)
                   )
 )

La valeur stockée dans la variable "coords-vla" est un tableau (array) : #<variant 8197 ...>

La valeur stockée dans la variable "coords-liste" est une liste de réels :
(4.34604 6.11751 0.0 3.66915 11.9517 0.0 14.6263 12.5013 0.0 16.3608 4.76465 0.0 9.59193 4.34189 0.0 11.0726 7.80857 0.0)

Ce qui est renvoyé est donc une liste (list) de réels, les points des sommets ne sont pas regroupés dans des sous-listes, je dirais que c'est une liste "plate" c'est à dire que toutes les données sont l"une derrière l'autre, en quelque sorte : "en vrac".
Il va être utile voire nécessaire de créer une fonction qui va transformer cette liste "plate" en liste de listes dont chaque "sous-liste" sera le triplet de données habituel soit la valeur X puis le Y et enfin le Z, cette fonction sera bientôt disponible dans les exemples.


Polyligne 2D
(LWpolyligne)

On va utiliser exactement la même syntaxe que pour la polyligne 3D mais ce qui va être renvoyé diffère quelque peu de la polyligne 2D.

1
2
3
4
5
6
7
8
9
10
11
(setq entvla (vlax-ename->vla-object 
             (car
             (entsel "\nChoix de l'entité\n")
             )
             )
)
(setq coords-vla (vlax-get-property entvla 'coordinates))
(setq coords-liste (vlax-safearray->list
                   (vlax-variant-value coords-vla)
                   )
 )

La valeur stockée dans la variable "coords-vla" est un tableau (array) : #<variant 8197 ...>

La valeur stockée dans la variable "coords-liste" est une liste de réels :
(18.6545 21.4363 20.307 28.3116 31.4462 29.2704)
Il n'y a aucun renseignement altimétrique, même pas une notion d'élévation, pour avoir ce renseignement il faudra utiliser une autre propriété :

(setq elev (vlax-get-property entvla 'elevation))

Si la polyligne contient des segments courbes (bulge) ces courbures ne sont pas renseignées dans la liste des coordonnées, en cas de segment courbe une coordonnée est donnée au début de l'arc et une autre à la fin :


Ligne

Dans le cas de l'entité "ligne" il ne va pas être possible de faire appel à la propriété "coordinates", toutefois rien n'est perdu !
Pour avoir accès aux points de début et de fin il faudra interroger les propriétés StartPoint et EndPoint, pas besoin d'être un anglophone averti pour comprendre :

(setq entvla 
   (vlax-ename->vla-object 
      (car (entsel "\nChoix de l'entité\n"))
   )
)
(setq pt-debut 
   (vlax-safearray->list 
      (vlax-variant-value 
         (vla-get-StartPoint entvla)
      )
   )
)
(setq pt-fin 
   (vlax-safearray->list 
      (vlax-variant-value 
         (vla-get-EndPoint entvla)
      )
   )
)

Les variables "pt-debut" et "pt-fin" contiennent des listes de trois valeurs :
pt-debut : (15.2718 3.28642 0.0)
pt-fin : (21.2426 3.28642 0.0)



Au fur et à mesure du temps qui passe*** je viendrai compléter ces exemples

*** il n'a que ça à faire le temps ... passer


11 mai 2018
20 mai 2018