Aller au contenu

Récupérer les nouveaux points d\'une polyligne lissé


Messages recommandés

Posté(e)

Bonjour à tous,

 

comment peut-on récupérer les nouveaux points créés lors de la transformation d'une polyligne en plyligne lissée?

 

Je m'explique : lorsque l'on modifie le paramètre "type" d'une polyligne pour lui mettre "Aucun, "Lissée", "Second ordre" ou "Troisième ordre". On voit apparaitre de nouveaux points d'accroche et la polyligne se lisse. Cette modification ne change en rien les coordonnées d'origine de la poly.

Alors comment récupérer les nouveaux ?

 

Lorsque l'on eclate la poly (explode) on retrouve tous ces segments. Ils sont surement quelque part.

 

 

 

Posté(e)

Salut,

 

Tout d'abord, je voudrais préciser que les polylignes lissées ou splinées sont des entités de type POLYLINE (sous classe AcDb2dPolyline) tout comme les polylignes 3d et les maillages et que ces objets sont différents du type LWPOLYLINE (sous classe AcDbPolyline).

Quand on lisse ou on spline une polyligne optimisée (LWPOLYLINE) avec la commande PEDIT on la transforme en polyligne 'old style' (POLYLINE).

 

Les entités POLYLINE sont des entités complexes, c'est à dire des entités constituées de sous-entités de type VERTEX.

 

À ma connaissance les objets VERTEX ne sont pas accessibles via l'interface COM utilisée par VBA (ou Visual LISP) mais le sont via AutoLISP (ou .NET).

 

Avec AutoLISP c'est la fonction entnext qui permet d'accéder aux sous-entités d'une entité complexe (sommets (VERTEX) des polylignes 2d et 3d ou des maillages (POLYLINE) ou encore les attributs (ATTRIB) des références de bloc (INSERT)).

La fonction entnext requiert un argument de type ENAME (nom d'entité) et retourne l'entité suivante dans la base de données (que ce soit une entité 'pleine' ou une sous-entité).

 

La fonction entget retourne la liste des données DXF de l'entité VERTEX (comme pour les autres types d'entités) les code de groupe 10 de cette liste contient les coordonnées du VERTEX.

 

Un exemple de routine qui retourne la liste des coordonnées des sommets d'une polyligne 2d ou 3d (ne fonctionne pas avec les lwpolyline).

La routine boucle sur les entités suivant la polyligne tant que ces entités sont du type VERTEX

 

;; Poly2dVertices
;; Retourne la liste des sommets (VERTEX) de la polyligne
;;
;; Argument
;; pl : nom d'entité (ENAME) de la polyligne

(defun Poly2dVertices (pl / vtx vlst plst)

 ;; vtx = entité suivant la polyligne (premier sommet)
 (setq vtx (entnext pl))

 ;; Tant que vtx est un objet de type VERTEX
 (while (= (cdr (assoc 0 (setq vlst (entget vtx)))) "VERTEX")

   ;; Si le code groupe 70 ne contient pas le code binaire 16
   ;; qui caractérise les points de cotrôle des polylignes splinées...
   (if	(zerop (logand (cdr (assoc 70 vlst)) 16))

     ;; ...le point est ajouté au début de la liste
     (setq plst (cons (cdr (assoc 10 vlst)) plst))
   )

   ;; vtx = ;; vtx = entité suivant vtx (sommet suivant ou autre type d'entité)
   (setq vtx (entnext vtx))
 )

 ;; Retour de la fonction : la liste des points (inversée pour la remettre  à l'endroit)
 (reverse plst)
)

 

Une commande de test

 

;; Commande de test
;; L'utilisateur est invité à sélectionner une polyligne 2d ou 3d
;; Si l'objet sélectionné est bien une polyligne 2d ou 3d,
;; la liste des sommets est affichée sur la ligne de commande
;; sinon un message d'erreur

(defun c:test (/ ent)
 (if
   (and
     (setq ent (car (entsel "\nSélectionnez une polyligne 2d ou 3d: ")))
     (= "POLYLINE" (cdr (assoc 0 (entget ent))))
   )
    (princ (Poly2dVertices ent))
   (princ "\nL'entité sélectionnée n'est pas une polyligne 2d ou 3d")
 )
 (princ)
)

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

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é