Aller au contenu

vla-get-coordinates->Point-list


Messages recommandés

Posté(e)

Pour récupérer les coordonnées des sommets d'entités complexes vla-get-coordinates est plus pratique que les boucles avec entnext, mais le résultat retourné, un variant est difficilement exploitable en l'état.

 

Voici donc deux petites routines (définies récursivement parceque je trouve çà plus élégant) pour convertir le variant en liste de points.

 

Pour les polylignes optimisées (lwpolyline) les points sont en 2D (X Y) dans le SCO

 

;;; Convertit un variant de coordonnées 2D en liste de points
;;; LightweightPolyline dans le SCO
(defun variant->2d-pt-lst (var / 2d-coord->pt-lst)
 (2d-coord->pt-lst
   (vlax-safearray->list (vlax-variant-value var))
 )
)

;;; Convertit une liste de coordonnées 2D en liste de points
(defun 2d-coord->pt-lst	(lst)
 (cond
   ((atom lst) lst)
   ((cons (list (car lst) (cadr lst) 0.0)
   (2d-coord->pt-lst (cddr lst))
    )
   )
 )
)

 

Pour les autres objets les point sont en 3D (X Y Z) dans le SCO avec Z = 0 pour les polylignes, dans le SCG pour les autres.

 

;;; Convertit un variant de coordonnées 3D en liste de points
;;; Polyline dans le SCO (Z = 0)
;;; 3DFace, 3DPolyline, Leader, MLine, Point, PolyfaceMesh,
;;; PolygonMesh, Solid, Trace dans le SCG

(defun variant->3d-pt-lst (var / 3d-coord->pt-lst)
 (3d-coord->pt-lst
   (vlax-safearray->list (vlax-variant-value var))
 )
)

;;; Convertit une liste de coordonnées 3D en liste de points
(defun 3d-coord->pt-lst	(lst)
 (cond
   ((atom lst) lst)
   ((cons (list (car lst) (cadr lst) (caddr lst))
   (3d-coord->pt-lst (cdddr lst))
    )
   )
 )
)

 

Et deux autres pour les conversions en sens inverse.

 

Les points dans les listes à convertir sont définis dans le SCO pour les polylignes (optimisées ou 2D) et de forme (X Y 0).

 

Pour les lwpolylines

 

;;; Convertit une liste de points en variant de coordonnées 2D

(defun 2d-pt-lst->variant (lst)
 (setq	lst (apply 'append
	   (mapcar
	     '(lambda (x)
		(list (car x) (cadr x))
	      )
	     lst
	   )
    )
 )
 (vlax-make-variant
   (vlax-SafeArray-fill
     (vlax-make-SafeArray
vlax-vbDouble
(cons 0
      (- (length lst) 1)
)
     )
     lst
   )
 )
)

 

Pour les autres entités

 

;;; Convertit une liste de points en variant de coordonnées 3D

(defun 3d-pt-lst->variant (lst)
 (setq lst (apply 'append lst))
 (vlax-make-variant
   (vlax-SafeArray-fill
     (vlax-make-SafeArray
vlax-vbDouble
(cons 0 (1- (length lst)))
     )
     lst
   )
 )
) 

 

[Edité le 19/5/2006 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Une routine qui retourne directement la liste des des sommets d'un vla-object (ou nil pour les objets n'ayant pas la prorpiété coordinates).

 

La routine fait appel aux routines 2d-coord->pt-lst et 3d-coord->pt-lst.

 

Version améliorée avec la contribution de BTO

 

;;; VrtxList Retourne la liste des sommets de l'objet
(defun VrtxList (obj)
 (cond
   ((= (vla-get-ObjectName obj) "AcDbPolyline")
    (2d-coord->pt-lst (vlax-get obj 'coordinates))
   )
   ((member (vla-get-ObjectName obj)
     '("AcDb2dPolyline"	    "AcDb3dPolyline"
       "AcDbFace"	    "AcDbLeader"
       "AcDbMline"	    "AcDbPoint"
       "AcDbPolyFaceMesh"   "AcDbPolygonMesh"
       "AcDbSolid"	    "AcDbTrace"
      )
    )
    (3d-coord->pt-lst (vlax-get obj 'coordinates))
   )
 )
)

 

[Edité le 19/5/2006 par (gile)]

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

bonjour,

 

on peut aussi obtenir directement un résultat exploitable avec :

(vlax-get vla-object 'coordinates)

 

exemple :

(setq ename (car (entsel "Sélectionnez une lwpolyligne: ")))

(vlax-get (vlax-ename->vla-object ename) 'coordinates)

 

le retour est de la forme :

(143.074 221.014 95.5496 226.048 93.976 110.591 185.247 136.703 ........)

 

ensuite on peut formater aisément cette liste de sommets comme on le souhaite.

 

Bruno Toniutti

[Edité le 19/5/2006 par BTO]

 

[Edité le 19/5/2006 par BTO]

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é