Convertir un cylindre 3D en cercle avec épaisseur via LISP

Pour un export vers un logiciel de programmation CNC, comment automatiser la conversion de multiples solides cylindriques 3D en cercles 2D ? Chaque cercle doit conserver le calque, la couleur et le diamètre du cylindre d’origine, et se voir attribuer une épaisseur négative correspondant à la hauteur du cylindre.

La conversion manuelle de chaque cylindre 3D en un cercle avec une épaisseur négative est un processus long et fastidieux. L’utilisation d’un script AutoLISP est la solution la plus efficace pour automatiser cette tâche, en particulier pour des workflows de fabrication numérique (CNC) qui exigent ce format spécifique.

Voici une routine LISP qui effectue cette conversion en série sur une sélection d’objets.

Étape 1 : Création du fichier LISP

Copiez le code ci-dessous et enregistrez-le dans un fichier texte avec l’extension .lsp, par exemple CylindreVersCercle.lsp.

;; Lisp réalisé par Bonuscad et Tramber
(defun c:xcyl ( / js n ent dxf_ent cyl  dern   p1 p2)
  (cond
    ((setq js (ssget '((0 . "3DSOLID"))))
      (repeat (setq n (sslength js))
	(setq ent (ssname js (setq n (1- n)))
	      dxf_ent (entget ent)
	      cyl (vlax-ename->vla-object ent))
        (cond
	  ((= (vl-catch-all-apply 'vla-get-SolidType (list cyl)) "Cylindre")
	   (setq dern(entlast))
	   (command-s "_explode" ent "" )
	   (while(and dern(setq ent(entnext dern)))
	     (cond((="SURFACE"(cdr(assoc 0 (entget ent))))(setq dern ent)(entdel ent))
		  ((="REGION"(cdr(assoc 0 (entget ent))))(setq dern ent)(command-s "_explode" ent "" ))
		  ((="CIRCLE" (cdr(assoc 0 (entget ent))))(setq dern ent)
		   (setq p1(trans (cdr(assoc 10(entget dern)))dern 0)
			 p2(trans (cdr(assoc 10(entget(entnext dern))))(entnext dern) 0)
			 )
		   (entdel(entnext dern))
		   (setq dern nil)
		   (princ(strcat"\nDistance="(rtos(distance p1 p2)2 2))); renvoie la distance
		   
		   )
		  ((setq dern nil)); pour protéger un peu la boucle de solides qui ne contiendraient pas de cercles
		  )
	     )
	   (and p1 p2(entmod (append(entget ent)(list(cons 39(- (distance p1 p2)))))))
	   )
        )
      )
    )
  )
	     (princ)
)

Étape 2 : Chargement et utilisation du script dans AutoCAD

  1. Ouvrez votre dessin contenant les cylindres 3D.
  2. Tapez la commande APPLOAD (ou CHARGAPP) dans la barre de commande et appuyez sur Entrée.
  3. Naviguez jusqu’à votre fichier CylindreVersCercle.lsp, sélectionnez-le et cliquez sur Charger.
  4. Fermez la boîte de dialogue APPLOAD.
  5. Tapez la nouvelle commande XCYL dans la barre de commande et appuyez sur Entrée.
  6. AutoCAD vous invite à sélectionner des objets. Sélectionnez tous les cylindres 3D que vous souhaitez convertir.
  7. Appuyez sur Entrée pour valider la sélection. Le script traitera automatiquement chaque cylindre.

Explication technique du script

  • c:XCyl : Définit une nouvelle commande AutoCAD nommée XCyl.
  • (ssget '((0 . "3DSOLID"))) : Crée un jeu de sélection en filtrant uniquement les objets de type 3DSOLID.
  • (vla-get-SolidType cyl) : Utilise les fonctions Visual LISP (ActiveX) pour vérifier si le solide sélectionné est bien de type « Cylindre ». C’est une méthode robuste qui évite les erreurs sur d’autres types de solides.
  • command-s "_explode" ent "" : Décompose le cylindre en ses éléments de base : une surface (le corps) et deux régions (les bases). Les régions sont ensuite elles-mêmes décomposées en cercles.
  • entnext et while : Le script parcourt les nouvelles entités créées après la décomposition pour identifier les deux cercles.
  • trans : Convertit les coordonnées du centre des cercles du SCU de l’objet vers le SCG (Système de Coordonnées Général) pour garantir un calcul de distance correct, quelle que soit l’orientation du cylindre.
  • (distance p1 p2) : Calcule la hauteur du cylindre en mesurant la distance entre les centres des deux cercles de base.
  • entdel : Supprime la géométrie superflue (la surface et le deuxième cercle).
  • entmod : Modifie l’entité du premier cercle en ajoutant le code DXF 39 (épaisseur) avec la valeur de la hauteur calculée, précédée d’un signe négatif.