Qqs trucs sur Autocad et d'autres logiciels DAO...
Accueil Initiation Méthodologie Variables Comment faire ? Lisps Sommaire
Soft & liens Revit 2020 CVC sur autocad Linux CloudCompare Initiation à Autolisp Blog

Les polylignes chapitre 2

 

Au chapitre 1 on a pris une polyligne faite de segments droits. Regardons ce qui se passe quand on à des arcs

((-1 . <Nom d'entité: 7ffff7a2640>) (0 . LWPOLYLINE) (330 . <Nom d'entité: 7ffff797f00>) (5 . 152C) (100 . AcDbEntity) (67 . 0) (410 . Model) (8 . --SEE 0 IMPRIME PAS) (62 . 2) (100 . AcDbPolyline) (90 . 7) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 0.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 40.0 0.0) (40 . 0.0) (41 . 0.0) (42 . 0.290168) (91 . 0) (10 50.0 10.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 50.0 20.0) (40 . 0.0) (41 . 0.0) (42 . -0.414214) (91 . 0) (10 60.0 30.0) (40 . 0.0) (41 . 0.0) (42 . 1.0) (91 . 0) (10 60.0 60.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (10 100.0 60.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (91 . 0) (210 0.0 0.0 1.0))

On remarque les codes 42 qui définissent les arcs. Alors dans le guide de ref DXF, le code 42 est définit comme:

42.................. Bulge (multiple entries; one entry for each vertex) (optional; default = 0)

Je ne suis pas assez callé en math pour vous déchiffrer cet artifice qui avec un seul chiffre réussi à caractériser le centre, et le rayon et l'angle de cet arc, mais apparemment, ça suffit. Pour retrouver ces données, notre mentor (gile) à pondu une fonction BulgeData que vous retrouverez à la fin de notre exemple.

Discrétisation

 

Quand on travaille en 3d, on se sert de polylignes 3D qu'on verra plus tard. Mais ces poly3D n'acceptent pas les arcs. On a donc besoin de découper les arcs en petits bouts de segments droits qui divisent l'arc régulièrement. C'est ça discrétiser une polyligne. Pile le genre de truc super lourd à faire à la main. (Gile) toujours lui à fait une super fonction pour ça qui gère les épaisseurs, les poly fermées, les SCU, ext... Je l'ai trouvé dans une discutions CadXp .
Mais on va faire la notre, plus simple pour des poly ouverte dans le SCG. Ya déja de quoi faire...

 

En préhalable on avait vu la fonction (polar dans un exemple simpliste. Il va faloir réviser...

Algorithme

Le programme va demander une poly à traiter, Il va falloir trier les points caractérisé par le code 10, les arcs caractérisé par le code 42. Pour chaque point (10) on le pose dans une liste de la nouvelle polyligne, pour chaque arc, il faut calculer les points intermédiaires et les ajouter à la liste. Quand on à parcouru toute la liste, on trace la nouvelle polyligne. Simple non?

Mais il y a des pièges...

La découpe de l'arc par tranche d'environ 10° pour que ce soit régulier devra se faire par un chiffre entier Pour choper la partie entière d'un nombre, c'est (fix
Autre subtilité la fonction BulgeData peut retourner un angle et une distance négative suivant les cas. Il va falloir la jouer fine pour pas avoir des points foireux. Pour récupérer la valeur absolue d'un nombre, c'est (abs

Appel séquentiel de (command

Pour passer une liste de point à la commande Polyligne, on ne peut pas passer la liste directement comme ça:

(command "polyligne" '(p1 p2 p3...)...

Il va falloir insérer dans l'appel command une fonction qui égraine les points un par un. Et donc scinder l'appel en plusieurs morceaux de cette manière (command et Vl-cmdf sont équivalent dans ce cas)

  (vl-cmdf "POLYLIGN")
  (while lst-npoly (vl-cmdf (setq pt (car lst-npoly)))
    (setq lst-npoly (cdr lst-npoly))
  )
  (vl-cmdf "")

J'ai la flème de dessiner l'algoritme, mais voici mon code.... encore une fois, essayez de le faire par vous même...

 

 

lien vers cadXP