Author Topic: 2dPolyline to 3dPolyline with arcs  (Read 1206 times)

0 Members and 1 Guest are viewing this topic.

MORITZK

  • Mosquito
  • Posts: 18
2dPolyline to 3dPolyline with arcs
« on: July 21, 2015, 04:01:14 PM »
Hallo,
is it possible to convert a LwPolyline to 3dPolyline with Arcs or another curves?
1. convert LW- Polyline to 3D- Polyline without bulges (no problem)
2. convert the bulges to Arcs with ucs. But how can i calculate the 3 axes?
3. join the straight sectors with the arcs to ....? 3d- Polylines are without curves.
The alternative is a 3dPolyline with many short sectors, but this is not the best solution.
Thank you
Moritz

ChrisCarlson

  • Guest
Re: 2dPolyline to 3dPolyline with arcs
« Reply #1 on: July 21, 2015, 04:09:08 PM »
Code - Auto/Visual Lisp: [Select]
  1. ;;; 3dPolyFillet -Gilles Chanteau- 21/01/07 -Version 1.5-
  2. ;;; "Fillets" a 3D polyline (succession of segments)
  3.  
  4. (defun c:3dPolyFillet (/           3dPolyFillet_err        closest_vertices
  5.                        MakeFillet  AcDoc       ModSp       cnt
  6.                        prec        rad         ent1        ent2
  7.                        vxlst       plst        param       obj
  8.                       )
  9.  
  10. ;;;*************************************************************;;;
  11.  
  12.   (defun 3dPolyFillet_err (msg)
  13.     (if (= msg "Fonction annulée")
  14.       (princ)
  15.       (princ (strcat "\nErreur: " msg))
  16.     )
  17.     (vla-EndUndoMark AcDoc)
  18.     (setq *error* m:err
  19.           m:err nil
  20.     )
  21.     (princ)
  22.   )
  23.  
  24. ;;;*************************************************************;;;
  25.  
  26.   (defun closest_vertices (obj pt / par)
  27.     (if (setq par (vlax-curve-getParamAtPoint obj pt))
  28.       (list (vlax-curve-getPointAtParam obj (fix par))
  29.             (vlax-curve-getPointAtParam obj (1+ (fix par)))
  30.       )
  31.     )
  32.   )
  33.  
  34. ;;;*************************************************************;;;
  35.  
  36.   (defun MakeFillet (obj   par1  par2  /     pts1  pts2  som   p1    p2
  37.                      ptlst norm  pt0   pt1   pt2   pt3   pt4   cen   ang
  38.                      inc   n     vlst  nb1   nb2
  39.                     )
  40.     (if (and
  41.           (setq pts1 (closest_vertices obj par1))
  42.           (setq pts2 (closest_vertices obj par2))
  43.         )
  44.       (progn
  45.         (setq som (inters (car pts1) (cadr pts1) (car pts2) (cadr pts2) nil))
  46.         (if som
  47.           (if
  48.             (or (equal (car pts1) som 1e-9)
  49.                 (equal (cadr pts1) som 1e-9)
  50.                 (and
  51.                   (< (vlax-curve-getParamAtPoint obj (car pts1))
  52.                      (vlax-curve-getParamAtPoint obj (car pts2))
  53.                   )
  54.                   (equal (vec1 (car pts1) (cadr pts1))
  55.                          (vec1 (car pts1) som)
  56.                          1e-9
  57.                   )
  58.                 )
  59.                 (and
  60.                   (< (vlax-curve-getParamAtPoint obj (car pts2))
  61.                      (vlax-curve-getParamAtPoint obj (car pts1))
  62.                   )
  63.                   (equal (vec1 (cadr pts1) (car pts1))
  64.                          (vec1 (cadr pts1) som)
  65.                          1e-9
  66.                   )
  67.                 )
  68.             )
  69.              (progn
  70.                (if (< (distance som (car pts1)) (distance som (cadr pts1)))
  71.                  (setq p1 (cadr pts1)
  72.                        p2 (car pts2)
  73.                  )
  74.                  (setq p1 (car pts1)
  75.                        p2 (cadr pts2)
  76.                  )
  77.                )
  78.                (if (= rad 0)
  79.                  (setq ptlst (list som))
  80.                  (progn
  81.                    (setq norm (norm_3pts som p2 p1)
  82.                          pt0  (trans som 0 norm)
  83.                          pt1  (trans p1 0 norm)
  84.                          pt2  (trans p2 0 norm)
  85.                          cen  (inters
  86.                                 (polar pt0 (- (angle pt0 pt1) (/ pi 2)) rad)
  87.                                 (polar pt1 (- (angle pt0 pt1) (/ pi 2)) rad)
  88.                                 (polar pt0 (+ (angle pt0 pt2) (/ pi 2)) rad)
  89.                                 (polar pt2 (+ (angle pt0 pt2) (/ pi 2)) rad)
  90.                                 nil
  91.                               )
  92.                          pt3  (polar cen (- (angle pt1 pt0) (/ pi 2)) rad)
  93.                          pt4  (polar cen (+ (angle pt2 pt0) (/ pi 2)) rad)
  94.                          ang  (- (angle cen pt4) (angle cen pt3))
  95.                    )
  96.                    (if
  97.                      (and (inters pt0 pt1 cen pt3 T) (inters pt0 pt2 cen pt4 T))
  98.                       (progn
  99.                         (if (minusp ang)
  100.                           (setq ang (+ (* 2 pi) ang))
  101.                         )
  102.                         (setq inc (/ ang prec)
  103.                               n   0
  104.                         )
  105.                         (repeat (1+ prec)
  106.                           (setq ptlst (cons
  107.                                         (polar cen (- (angle cen pt4) (* inc n)) rad)
  108.                                         ptlst
  109.                                       )
  110.                                 n     (1+ n)
  111.                           )
  112.                         )
  113.                         (setq ptlst (mapcar '(lambda (p) (trans p norm 0)) ptlst))
  114.                       )
  115.                    )
  116.                  )
  117.                )
  118.                (setq vlst (3d-coord->pt-lst (vlax-get obj 'Coordinates)))
  119.                (if ptlst
  120.                  (progn
  121.                    (setq nb1 (vl-position p1 vlst)
  122.                          nb2 (vl-position p2 vlst)
  123.                    )
  124.                    (if (= (vla-get-closed obj) :vlax-true)
  125.                      (cond
  126.                        ((and (equal p1 (car vlst))
  127.                              (equal p2 (cadr (reverse vlst)))
  128.                         )
  129.                         (setq
  130.                           vlst
  131.                            (append (sublst vlst 1 (1+ nb2)) (reverse ptlst))
  132.                         )
  133.                        )
  134.                        ((and (equal p1 (cadr (reverse vlst)))
  135.                              (equal p2 (car vlst))
  136.                         )
  137.                         (setq vlst (append (sublst vlst 1 (1+ nb1)) ptlst))
  138.                        )
  139.                        ((and (equal p1 (cadr vlst))
  140.                              (equal p2 (last vlst))
  141.                         )
  142.                         (setq
  143.                           vlst
  144.                            (append (reverse ptlst) (sublst vlst (1+ nb1) nil))
  145.                         )
  146.                        )
  147.                        ((and (equal p1 (last vlst))
  148.                              (equal p2 (cadr vlst))
  149.                         )
  150.                         (setq vlst (append ptlst (sublst vlst (1+ nb2) nil))
  151.                         )
  152.                        )
  153.                        (T
  154.                         (if (< nb1 nb2)
  155.                           (setq vlst (append (sublst vlst 1 (1+ nb1))
  156.                                              ptlst
  157.                                              (sublst vlst (1+ nb2) nil)
  158.                                      )
  159.                           )
  160.                           (setq vlst (append (sublst vlst 1 (1+ nb2))
  161.                                              (reverse ptlst)
  162.                                              (sublst vlst (1+ nb1) nil)
  163.                                      )
  164.                           )
  165.                         )
  166.                        )
  167.                      )
  168.                      (if (equal (car vlst) (last vlst) 1e-9)
  169.                        (cond
  170.                          ((and (equal p1 (cadr vlst))
  171.                                (equal p2 (cadr (reverse vlst)))
  172.                           )
  173.                           (setq vlst (append (sublst vlst 2 nb2)
  174.                                              (reverse ptlst)
  175.                                              (list (cadr vlst))
  176.                                      )
  177.                           )
  178.                          )
  179.                          ((and (equal p1 (cadr (reverse vlst)))
  180.                                (equal p2 (cadr vlst))
  181.                           )
  182.                           (setq vlst (append (sublst vlst 2 nb1)
  183.                                              ptlst
  184.                                              (list (cadr vlst))
  185.                                      )
  186.                           )
  187.                          )
  188.                        )
  189.                        (if (< nb1 nb2)
  190.                          (setq vlst (append (sublst vlst 1 (1+ nb1))
  191.                                             ptlst
  192.                                             (sublst vlst (1+ nb2) nil)
  193.                                     )
  194.                          )
  195.                          (setq vlst (append (sublst vlst 1 (1+ nb2))
  196.                                             (reverse ptlst)
  197.                                             (sublst vlst (1+ nb1) nil)
  198.                                     )
  199.                          )
  200.                        )
  201.                      )
  202.                    )
  203.                    (vlax-put obj 'Coordinates (apply 'append vlst))
  204.                  )
  205.                  (prompt "\nRadius is too large.")
  206.                )
  207.              )
  208.              (prompt "\nDivergent segments.")
  209.           )
  210.           (prompt "\nSegments are not converging.")
  211.         )
  212.       )
  213.       (prompt "\nRadius is too large.")
  214.     )
  215.   )
  216.  
  217.  
  218.  
  219.  
  220. ;;;*************************************************************;;;
  221.  
  222.         ModSp (vla-get-ModelSpace AcDoc)
  223.   )
  224.   (setq m:err   *error*
  225.         *error* 3dPolyFillet_err
  226.   )
  227.  
  228.   ;; Saisie des données
  229.   (if (not (vlax-ldata-get "3dFillet" "Prec"))
  230.     (vlax-ldata-put "3dFillet" "Prec" 20)
  231.   )
  232.   (if (not (vlax-ldata-get "3dFillet" "Rad"))
  233.     (vlax-ldata-put "3dFillet" "Rad" 10.0)
  234.   )
  235.   (prompt (strcat "\nCurrent settings.\tSegments: "
  236.                   (itoa (vlax-ldata-get "3dFillet" "Prec"))
  237.                   "\tRadius: "
  238.                   (rtos (vlax-ldata-get "3dFillet" "Rad"))
  239.           )
  240.   )
  241.   (setq cnt 1)
  242.   (while (= 1 cnt)
  243.     (initget 1 "Segments Radius")
  244.     (setq ent1
  245.            (entsel
  246.              "\nSelect first segment ou [Segments/Radius]: "
  247.            )
  248.     )
  249.     (cond
  250.       ((not ent1)
  251.        (prompt "\nNone selected object.")
  252.       )
  253.       ((= ent1 "Segments")
  254.        (initget 6)
  255.        (if (setq prec
  256.                   (getint
  257.                     (strcat "\nSpecify le number of segments for arcs <"
  258.                             (itoa (vlax-ldata-get "3dFillet" "Prec"))
  259.                             ">: "
  260.                     )
  261.                   )
  262.            )
  263.          (vlax-ldata-put "3dFillet" "Prec" prec)
  264.        )
  265.       )
  266.       ((= ent1 "Radius")
  267.        (initget 4)
  268.        (if (setq rad
  269.                   (getdist
  270.                     (strcat "\nSpecify the radius <"
  271.                             (rtos (vlax-ldata-get "3dFillet" "Rad"))
  272.                             ">: "
  273.                     )
  274.                   )
  275.            )
  276.          (vlax-ldata-put "3dFillet" "Rad" rad)
  277.        )
  278.       )
  279.       ((and
  280.          (= (cdr (assoc 0 (entget (car ent1)))) "POLYLINE")
  281.          (= (logand 8 (cdr (assoc 70 (entget (car ent1))))) 8)
  282.        )
  283.        (setq cnt 0)
  284.       )
  285.       (T
  286.        (prompt "\nSelected object is not a 3D polyline.")
  287.       )
  288.     )
  289.   )
  290.   (setq prec (vlax-ldata-get "3dFillet" "Prec")
  291.         rad  (vlax-ldata-get "3dFillet" "Rad")
  292.   )
  293.   (while (not ent2)
  294.     (initget 1 "All")
  295.     (setq ent2 (entsel "\nSelect second segment or [All]: "))
  296.     (if (not (or (= ent2 "All") (eq (car ent1) (car ent2))))
  297.       (progn
  298.         (prompt
  299.           "\nThe selected segment is not on same object"
  300.         )
  301.         (setq ent2 nil)
  302.       )
  303.     )
  304.   )
  305.   (setq obj (vlax-ename->vla-object (car ent1)))
  306.   (if (= ent2 "All")
  307.     (progn
  308.       (setq vxlst (3d-coord->pt-lst (vlax-get obj 'Coordinates))
  309.             param 0.5
  310.       )
  311.       (repeat (if (= (vla-get-closed obj) :vlax-true) (length vxlst) (1- (length vxlst)))
  312.         (setq plst  (append plst (list (vlax-curve-getPointAtParam obj param)))
  313.               param (1+ param)
  314.         )
  315.       )
  316.       (if (or (= (vla-get-closed obj) :vlax-true)
  317.               (equal (car vxlst) (last vxlst) 1e-9)
  318.               )
  319.         (setq plst (cons (last plst) plst))
  320.         )
  321.       (setq cnt 0)
  322.           (repeat (1- (length plst))
  323.             (MakeFillet obj (nth cnt plst) (nth (setq cnt (1+ cnt)) plst))
  324.           )
  325.     )
  326.     (MakeFillet obj
  327.                 (trans (osnap (cadr ent1) "_nea") 1 0)
  328.                 (trans (osnap (cadr ent2) "_nea") 1 0)
  329.     )
  330.   )
  331.   (vla-EndUndoMark AcDoc)
  332.   (setq *error* m:err
  333.         m:err nil
  334.   )
  335.   (princ)
  336. )
  337.  
  338. ;;;*************************************************************;;;
  339. ;;;*********************** SOUS ROUTINES ***********************;;;
  340.  
  341.  
  342. ;;; NORM_3PTS returns the normal vector of a 3 points defined plane
  343.  
  344. (defun norm_3pts (org xdir ydir / norm)
  345.   (foreach v '(xdir ydir)
  346.     (set v (mapcar '- (eval v) org))
  347.   )
  348.   (if (inters org xdir org ydir)
  349.     (mapcar '(lambda (x) (/ x (distance '(0 0 0) norm)))
  350.             (setq norm (list (- (* (cadr xdir) (caddr ydir))
  351.                                 (* (caddr xdir) (cadr ydir))
  352.                              )
  353.                              (- (* (caddr xdir) (car ydir))
  354.                                 (* (car xdir) (caddr ydir))
  355.                              )
  356.                              (- (* (car xdir) (cadr ydir))
  357.                                 (* (cadr xdir) (car ydir))
  358.                              )
  359.                        )
  360.             )
  361.     )
  362.   )
  363. )
  364.  
  365. ;;;*************************************************************;;;
  366.  
  367. ;;; 3d-coord->pt-lst Convert a 3D coordinates flat list in points list
  368. ;;; (3d-coord->pt-lst '(1.0 2.0 3.0 4.0 5.0 6.0)) -> ((1.0 2.0 3.0) (4.0 5.0 6.0))
  369.  
  370. (defun 3d-coord->pt-lst (lst)
  371.   (if lst
  372.     (cons (list (car lst) (cadr lst) (caddr lst))
  373.           (3d-coord->pt-lst (cdddr lst))
  374.     )
  375.   )
  376. )
  377.  
  378. ;;;*************************************************************;;;
  379.  
  380. ;;; SUBLST Returns a sub list
  381. ;;; First item : 1
  382. ;;; (sublst '(1 2 3 4 5 6) 3 2) -> (3 4)
  383. ;;; (sublst '(1 2 3 4 5 6) 3 nil) -> (3 4 5 6)
  384.  
  385. (defun sublst (lst start leng / rslt)
  386.   (if (not (<= 1 leng (- (length lst) start)))
  387.     (setq leng (- (length lst) (1- start)))
  388.   )
  389.   (repeat leng
  390.     (setq rslt  (cons (nth (1- start) lst) rslt)
  391.           start (1+ start)
  392.     )
  393.   )
  394.   (reverse rslt)
  395. )
  396.  
  397. ;;;*************************************************************;;;
  398.  
  399. ;;; VEC1 Returns the singleunit vector from p1 to p2
  400.  
  401. (defun vec1 (p1 p2)
  402.   (if (not (equal p1 p2 1e-009))
  403.     (mapcar '(lambda (x1 x2)
  404.                (/ (- x2 x1) (distance p1 p2))
  405.              )
  406.             p1
  407.             p2
  408.     )
  409.   )
  410. )
  411.  
  412. ;;;*************************************************************;;;
  413.  
  414. ;;; BUTLAST List but last item
  415.  
  416. (defun butlast (lst)
  417.   (reverse (cdr (reverse lst)))
  418. )


Will apply a fillet to a 3d polyline, is that what you are trying to do?

Jochen

  • Newt
  • Posts: 30
Re: 2dPolyline to 3dPolyline with arcs
« Reply #2 on: July 22, 2015, 04:20:25 AM »
You could use PEDIT3D from www.ant-ares.de
But please notice: ARCS (and SPLINES and HELICES) are changed into small straigth linear segments.
Regards
Jochen

MORITZK

  • Mosquito
  • Posts: 18
Re: 2dPolyline to 3dPolyline with arcs
« Reply #3 on: July 22, 2015, 07:48:59 AM »
Hallo, thank you Chris and Jochen.
I see, 3dPolylines with arcs are not possible.
Must convert arc in polyline to short straight linear segemnts and then convert to 3dpolyline.
Thank you for your suggestions.
Moritz