(gile) Posté(e) le 18 mai 2006 Posté(e) le 18 mai 2006 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
(gile) Posté(e) le 19 mai 2006 Auteur Posté(e) le 19 mai 2006 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
BTO Posté(e) le 19 mai 2006 Posté(e) le 19 mai 2006 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]
(gile) Posté(e) le 19 mai 2006 Auteur Posté(e) le 19 mai 2006 :exclam: Alors là, merci ! Je modifie le code ci dessus (et les fautes de frappe !). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant