Aller au contenu

POLYLINE EN LISP


formula1

Messages recommandés

Salut,

 

Pour créer une entité graphique en LISP, il y a 3 méthodes :

- avec la fonction command qui appelle la commande native. Cette méthode requiert les points définis dans le SCU courant et est sensible aux accrochages aux objets.

- avec la fonction entmake qui ajoute l'entité dans la base de données du dessin. Cette méthode requiert les arguments sous forme de "liste DXF".

- avec les fonction vlisp vla-add* qui ajoutent les objets à l'espace spécifié (Model, Paper ou définition de bloc). Cette méthode requiert des argument sous forme de vla-objects et/ou de variants (qu'on peut parfois remplacer par des listes).

 

Exemple pour une polyligne fermée dont les sommets sont contenus dans la liste suivante :

 

(setq pt-lst '((10.0 20.0 0.0) (50.0 20.0 0.0) (10.0 50.0 0.0)))

 

Avec command

 

(command "_.pline")
(foreach p pt-lst (command "_non" p))
(command "_close")

 

Avec entmake

 

(entmake
 (append
   (list
     '(0 . "LWPOLYLINE")
     '(100 . "AcDbEntity")
     '(100 . "AcDbPolyline")
     (cons 90 (length pt-lst))
     '(70 . 1)				; 1 pour fermée, 0 pour ouverte
   )
   (mapcar '(lambda (p) (cons 10 p)) pt-lst)
 )
)

 

avec vla-addLightWeightPolyline

 

(vla-put-Closed
 (vla-addLightWeightPolyline
   (vla-get-ModelSpace
     (vla-get-ActiveDocument
(vlax-get-acad-object)
     )
   )
   (vlax-make-variant
     (vlax-safearray-fill
(vlax-make-safearray
  vlax-vbDouble
  (cons 0 (1- (* 2 (length pt-lst))))
)
(apply
  'append
  (mapcar '(lambda (p) (list (car p) (cadr p))) pt-lst)
)
     )
   )
 )
 :vlax-true
)

 

avec vlax-invoke (pour éviter de faire un variant)

 

(vla-put-Closed
 (vlax-invoke
   (vla-get-ModelSpace
     (vla-get-ActiveDocument
(vlax-get-acad-object)
     )
   )
   'addLightWeightPolyline
   (apply
     'append
     (mapcar '(lambda (p) (list (car p) (cadr p))) pt-lst)
   )
 )
 :vlax-true
)

 

Pour l'offset, soit utiliser (command "_.offset" ...) soit (vla-Offset ...)

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Si tu débutes, commence avec command, c'est plus simple. Il faut juste ne pas oublier de désactiver l'accrochage aux objets avec "_non" pour chaque point ou setvar avant le premier appel à command (dans ce cas il faudra restaurer la la valeur initiale à la fin de la routine).

 

Les autres méthodes sont plus "propres" et d'exécution plus rapides (mais dès lors qu'il y a intervention de l'utilisateur, la différence de rapidité devient négligeable).

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

  • 8 ans après...

Bonjour,

 

ici on rentre les point en dur :

(setq pt-lst '((10.0 20.0 0.0) (50.0 20.0 0.0) (10.0 50.0 0.0)))

J'aimerai savoir si il est possible de les rentrer comme variable et de les importer d'Excel.

Pour ouvrir Excel et récupérer valeur pas de souci, par contre je ne sais pas adapter le code ci-dessus.

Il faut adapter le nombre de sommet (=au nbre de ligne du fichier Excel), et effectuer une boucle correspondant au nbre de ligne Excel.

 

Désolé pour l'explication....

Un exemple avec 2 sommets me conviendrait.

 

En espérant avoir un retour.

 

Cordialement,

Lien vers le commentaire
Partager sur d’autres sites

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é