Aller au contenu

Ellipse en polyligne en dxf R12/ LT2


blnd

Messages recommandés

Bonjour à tous,

 

Je viens ici en désespoir de cause et m'excuse par avance si le sujet a déjà été traité autre part !

 

Je cherche à transformer des arcs elliptiques en polylignes afin de créer un fichier DXF et l'utiliser sur une découpeuse industrielle.

 

J'ai essayé pas mal de méthodes (lisp de gille, décaler les arcs un à un puis les transformer en polyligne) mais elles sont toutes fastidieuses. Je pensais avoir trouver la solution miracle en enregistrant mon fichier directement en DXF R12/LT2. cela a fonctionné plusieurs fois (mes arcs elliptiques ce sont transformés en belles polylignes régulières) mais maintenant mes arcs sont transformés en polylignes toutes saccadées voir ici :

image

 

Je ne sais pas d'où ça peut venir ... je suis complètement bloquée ! J'ai essayé PLINETYPE 0 ou 1 + PLINECONVERTMODE 0 ou 1 mais rien n'y fait :(

 

Un grand merci par avance !!

Lien vers le commentaire
Partager sur d’autres sites

Merci pour votre réponse

 

Malheureusement ça ne fonctionne pas puisque j'ai des arcs elliptiques que je veux convertir en polyligne de manière rapide (les lisp et la méthode décaler pour obtenir des splines puis les transformer en polyligne est fastidieuse..)

 

ce que je ne m'explique pas c'est que j'ai déjà réussi à obtenir des polylignes qui suivent parfaitement la courbe de mes anciens arcs .. certainement une histoire de paramétrage que je n'arrive pas à trouver !!!

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je ne sais pas quel LISP tu as essayé, mais avec celui-ci, ça ne devrait pas être trop fastidieux. EL2PL transforme les ellipses ou arcs elliptiques sélectionnés en polylignes.

 

;; EllipseToPolyline
;; Retourne une polyline (vla-object) qui est une approximation de l'ellipse (ou de l'arc elliptique)
;;
;; Argument : une ellipse (vla-object)

(defun EllipseToPolyline (el    /  doc   cl    norm  cen   elv   pt0   pt1   pt2
                         pt3   pt4   ac0   ac4   a04   a02   a24   bsc1  bsc2
                         bsc3  bsc4  plst  blst  spt   spa   fspa  srat  ept
                         epa   fepa  erat  n
                        )
 (vl-load-com)
 (setq doc (vla-get-ActiveDocument (vlax-get-acad-object))
       spc (if (= 1 (getvar 'cvport))
             (vla-get-PaperSpace doc)
             (vla-get-ModelSpace doc)
           )
       cl   (and (= (vla-get-StartAngle el) 0.0)
                 (= (vla-get-EndAngle el) (* 2 pi))
            )
       norm (vlax-get el 'Normal)
       cen  (trans (vlax-get el 'Center) 0 norm)
       elv  (caddr cen)
       cen  (3dTo2dPt cen)
       pt0  (mapcar '+ (trans (vlax-get el 'MajorAxis) 0 norm) cen)
       ac0  (angle cen pt0)
       pt4  (mapcar '+ cen (trans (vlax-get el 'MinorAxis) 0 norm))
       pt2  (3dTo2dPt (trans (vlax-curve-getPointAtparam el (/ pi 4.)) 0 norm))
       ac4  (angle cen pt4)
       a04  (angle pt0 pt4)
       a02  (angle pt0 pt2)
       a24  (angle pt2 pt4)
       bsc1 (/ (ang<2pi (- a02 ac4)) 2.)
       bsc2 (/ (ang<2pi (- a04 a02)) 2.)
       bsc3 (/ (ang<2pi (- a24 a04)) 2.)
       bsc4 (/ (ang<2pi (- (+ ac0 pi) a24)) 2.)
       pt1  (inters pt0
                    (polar pt0 (+ ac0 (/ pi 2.) bsc1) 1.)
                    pt2
                    (polar pt2 (+ a02 bsc2) 1.)
                    nil
            )
       pt3  (inters pt2
                    (polar pt2 (+ a04 bsc3) 1.)
                    pt4
                    (polar pt4 (+ a24 bsc4) 1.)
                    nil
            )
       plst (list pt4 pt3 pt2 pt1 pt0)
       blst (mapcar '(lambda (B) (tan (/ b 2.)))
                    (list bsc4 bsc3 bsc2 bsc1)
            )
 )
 (repeat 2
   (foreach b blst
     (setq blst (cons b blst))
   )
 )
 (foreach p (cdr plst)
   (setq ang  (angle cen p)
         plst (cons
                (polar cen (+ ang (* 2 (- ac4 ang))) (distance cen p))
                plst
              )
   )
 )
 (foreach p (cdr plst)
   (setq ang  (angle cen p)
         plst (cons
                (polar cen (+ ang (* 2 (- ac0 ang))) (distance cen p))
                plst
              )
   )
 )
 (setq pl
        (vlax-invoke
          spc
          'AddLightWeightPolyline
          (apply 'append
                 (setq plst
                        (reverse (if cl
                                   (cdr plst)
                                   plst
                                 )
                        )
                 )
          )
        )
 )
 (vlax-put pl 'Normal norm)
 (vla-put-Elevation pl elv)
 (mapcar '(lambda (i v) (vla-SetBulge pl i v))
         '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16)
         blst
 )
 (if cl
   (vla-put-Closed pl :vlax-true)
   (progn
     (setq spt  (vlax-curve-getClosestPointTo pl (vlax-get el 'Startpoint))
           spa  (vlax-curve-getParamAtPoint pl spt)
           fspa (fix spa)
           ept  (vlax-curve-getClosestPointTo pl (vlax-get el 'Endpoint))
           epa  (vlax-curve-getParamAtPoint pl ept)
           fepa (fix epa)
           n    0
     )
     (cond
       ((equal spt (trans pt0 norm 0) 1e-9)
        (if (= epa fepa)
          (setq plst (sublist plst 0 (1+ fepa))
                blst (sublist blst 0 (1+ fepa))
          )
          (setq erat (/ (- (vlax-curve-getDistAtParam pl epa)
                      (vlax-curve-getDistAtParam pl fepa)
                   )
                   (- (vlax-curve-getDistAtParam pl (1+ fepa))
                      (vlax-curve-getDistAtParam pl fepa)
                   )
                )
                plst (append (sublist plst 0 (1+ fepa))
                             (list (3dTo2dPt (trans ept 0 norm)))
                     )
                blst (append (sublist blst 0 (1+ fepa))
                             (list (k*bulge (nth fepa blst) erat))
                     )
          )
        )
       )
       ((equal ept (trans pt0 norm 0) 1e-9)
        (if (= spa fspa)
          (setq plst (sublist plst fspa nil)
                blst (sublist blst fspa nil)
          )
          (setq srat (/ (- (vlax-curve-getDistAtParam pl (1+ fspa))
                           (vlax-curve-getDistAtParam pl spa)
                        )
                        (- (vlax-curve-getDistAtParam pl (1+ fspa))
                           (vlax-curve-getDistAtParam pl fspa)
                        )
                     )
                plst (cons (3dTo2dPt (trans spt 0 norm))
                           (sublist plst (1+ fspa) nil)
                     )
                blst (cons (k*bulge (nth fspa blst) srat)
                           (sublist blst (1+ fspa) nil)
                     )
          )
        )
       )
       (T
        (setq srat (/ (- (vlax-curve-getDistAtParam pl (1+ fspa))
                           (vlax-curve-getDistAtParam pl spa)
                        )
                        (- (vlax-curve-getDistAtParam pl (1+ fspa))
                           (vlax-curve-getDistAtParam pl fspa)
                        )
                     )
              erat (/ (- (vlax-curve-getDistAtParam pl epa)
                      (vlax-curve-getDistAtParam pl fepa)
                   )
                   (- (vlax-curve-getDistAtParam pl (1+ fepa))
                      (vlax-curve-getDistAtParam pl fepa)
                   )
                )
              )
        (if (< epa spa)
          (setq plst (append
                       (if (= spa fspa)
                         (sublist plst fspa nil)
                         (cons (3dTo2dPt (trans spt 0 norm))
                               (sublist plst (1+ fspa) nil)
                         )
                       )
                       (cdr (sublist plst 0 (1+ fepa)))
                       (if (/= epa fepa)
                         (list (3dTo2dPt (trans ept 0 norm)))
                       )
                     )
                blst (append
                       (if (= spa fspa)
                         (sublist blst fspa nil)
                         (cons 
                           (k*bulge (nth fspa blst) srat)
                               (sublist blst (1+ fspa) nil)
                         )
                       )
                       (sublist blst 0 fepa)
                       (if (= epa fepa)
                         (list (nth fepa blst))
                         (list (k*bulge (nth fepa blst) erat))
                       )
                     )
          )
          (setq plst (append
                       (if (= spa fspa)
                         (sublist plst fspa (1+ (- fepa fspa)))
                         (cons (3dTo2dPt (trans spt 0 norm))
                               (sublist plst (1+ fspa) (- fepa fspa))
                         )
                       )
                       (list (3dTo2dPt (trans ept 0 norm)))
                     )
                blst (append
                       (if (= spa fspa)
                         (sublist blst fspa (- fepa fspa))
                         (cons
                           (k*bulge (nth fspa blst) srat)
                               (sublist blst (1+ fspa) (- fepa fspa))
                         )
                       )
                       (if (= epa fepa)
                         (list (nth fepa blst))
                         (list (k*bulge (nth fepa blst) erat))
                       )
                     )
          )
        )
       )
     )
     (vla-delete pl)
     (setq pl (vlax-invoke spc 'AddLightWeightPolyline (apply 'append plst)))
     (vlax-put pl 'Normal norm)
     (vla-put-Elevation pl elv)
     (foreach b blst
       (vla-SetBulge pl n B)
       (setq n (1+ n))
     )
   )
 )
 (or (zerop (getvar 'delobj)) (vla-delete el))
 pl
)

;; Ang<2pi
;; Retourne l'angle, à 2*k*pi près, compris entre 0 et 2*pi
(defun ang<2pi (ang)
 (if (and (<= 0 ang) (< ang (* 2 pi)))
   ang
   (ang<2pi (rem (+ ang (* 2 pi)) (* 2 pi)))
 )
)

;; 3dTo2dPt
;; Retourne le point 2d (x y) d'un point 3d (x y z)
(defun 3dTo2dPt (pt) (list (car pt) (cadr pt)))

;; Tan
;; Retourne la tangente de l'angle
(defun tan (a) (/ (sin a) (cos a)))

;;; SUBLIST Retourne une sous-liste
;;;
;;; Arguments
;;; lst : une liste
;;; start : l'index de départ de la sous liste (premier élément = 0)
;;; leng : la longueur (nombre d'éléments) de la sous-liste (ou nil)
(defun sublist (lst start leng / n r)
 (if (or (not leng) (< (- (length lst) start) leng))
   (setq leng (- (length lst) start))
 )
 (setq n (+ start leng))
 (while (< start n)
   (setq r (cons (nth (setq n (1- n)) lst) r))
 )
)

;; K*BULGE
;; Retourne le bulge proportionnel au bulge de référence
;; Arguments :
;; b : le bulge
;; k : le rapport de proportion (entre les angles ou les longueurs d'arcs)
(defun k*bulge (b k / a)
 (setq a (atan B))
 (/ (sin (* k a)) (cos (* k a)))
)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; EL2PL
;; Convertit ellipses et arcs elliptiques en polylignes
;; Les objets source sont conservés si la variable DELOBJ = 0,
;; supprimés sinon.

(defun c:el2pl (/ *error* fra acdoc ss)
 (vl-load-com)
 (defun *error* (msg)
   (if (and (/= msg "Fonction annulée")
            (/= msg "Function cancelled")
       )
     (princ (strcat (if (= "FRA" (getvar 'locale))
                      "\nErreur: "
                      "\Error: "
                    )
                    msg
            )
     )
   )
   (vla-endUndoMark acdoc)
   (princ)
 )
 (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)))
 (if (ssget '((0 . "ELLIPSE")))
   (progn
     (vla-StartUndoMark acdoc)
     (vlax-for e (setq ss (vla-get-ActiveSelectionSet acdoc))
       (EllipseToPolyline e)
     )
     (vla-delete ss)
     (vla-EndUndoMark acdoc)
   )
 )
 (princ)
)

;; PELL
;; Dessine "à la volée" une approximation d'ellipse ou arc elliptique (polyligne)

(defun c:pell (/ *error* ec pe do old ent)
 (vl-load-com)
 (defun *error* (msg)
   (if (and msg
            (/= msg "Fonction annulée")
            (/= msg "Function cancelled")
       )
     (princ (strcat (if (= "FRA" (getvar 'locale))
                      "\nErreur: "
                      "\Error: "
                    )
                    msg
            )
     )
   )
   (setvar 'cmdecho ec)
   (setvar 'pellipse pe)
   (setvar 'delobj do)
   (princ)
 )
 (setq ec  (getvar 'cmdecho)
       pe  (getvar 'pellipse)
       do  (getvar 'delobj)
       old (entlast)
 )
 (setvar 'cmdecho 1)
 (setvar 'pellipse 0)
 (command "_.ellipse")
 (while (/= 0 (getvar "cmdactive"))
   (command pause)
 )
 (if (not (eq old (setq ent (entlast))))
   (progn
     (setvar 'delobj 1)
   (EllipseToPolyline (vlax-ename->vla-object ent))
   )
 )
 (*error* nil)
)

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

ça ne change rien ..

 

J'ai réussi à résoudre mon problème en utilisant le lisp arc2seg sur les arcs de mon dessin avant d'en faire un bloc et d'en modifier l'échelle (ce qui transformait mes arcs en arcs elliptiques une fois le bloc explosé).

 

Merci tout de même pour votre aide et bonne fin de journée !

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Gile,

 

 

J'ai upploader ton lisp mais quand je l'applique j'ai ce message "Commande: EL2PL

1 trouvé(s)

Erreur: no function definition: VLAX-CURVE-GETPOINTATPARAM"

 

:unsure:

 

Très étrange...

Il ne s'agit pas du (vl-load-com) qui est bien présent au début du code.

Soit tu n'as pas bien copié tout le code, soit ton AutoCAD est abimé (essaye une réparation ou une réinstallation).

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

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é