Author Topic: [XDrX-PlugIn(17)] Convert complex SPLINE to POLYLINE (perfect arc conversion)  (Read 707 times)

0 Members and 1 Guest are viewing this topic.

xdcad

  • Bull Frog
  • Posts: 424
A request I saw in other forums. I don’t know if it has been posted in our forum.



==================================

After conversion, it turned into a perfect arc.






Code - Auto/Visual Lisp: [Select]
  1. (defun c:tt ()
  2.   (defun spline->Arc (controlPnts       /        p1       p2
  3.                       v1       v2       chordMidPnt1      vchord
  4.                       chordpnt2         p3       cen      r
  5.                       gcir     p4
  6.                      )
  7.     (setq p1           (car controlPnts)
  8.           p2           (last controlPnts)
  9.           v1           (xdrx-getpropertyvalue x "firstderiv" p1)
  10.           v2           (xdrx-vector-perpvector v1)
  11.           chordMidPnt1 (xdrx-line-midp p1 p2)
  12.           vchord       (xdrx-vector-normalize
  13.                          (mapcar '- chordMidPnt1 p1)
  14.                        )
  15.           vchord1      (xdrx-vector-perpvector vchord)
  16.           chordPnt2    (mapcar '+
  17.                                chordMidPnt1
  18.                                vchord1
  19.                        )
  20.           p3           (mapcar '+ p1 v2)
  21.           cen          (inters p1 p3 chordMidPnt1 chordPnt2 nil)
  22.           r            (distance cen p1)
  23.     )                                   ; Find the center and radius of the circle
  24.                                         ; Find the third point P4 on the arc below.
  25.     (setq gCir (xdge::constructor "kCircArc2d" cen r)
  26.           p4   (xdge::getpropertyvalue
  27.                  gCir
  28.                  "GetClosestPointTo"
  29.                  chordMidPnt1
  30.                )
  31.           gArc (xdge::constructor "kCircArc2d" p1 p4 p2)
  32.                                         ; Three-point construction AcGe arc geometric object
  33.     )
  34.   )
  35.   (if (setq ss (xdrx-ssget
  36.                  "\nSelect SPLINE to convert to POLYLINE<Exit>:"
  37.                  '((0 . "spline"))
  38.                )
  39.       )
  40.     (progn
  41.       (xdrx-begin)
  42.       (setq ents nil)
  43.       (setq ss (xdrx-entity-explode ss))
  44.       (mapcar
  45.         '(lambda (x)
  46.            (setq controlPnts (xdrx-getpropertyvalue x "controlpoints"))
  47.            (cond
  48.              ((xdrx_points_isColinear controlPnts)
  49.               ;;Control points are collinear, straight lines
  50.               ;;Line
  51.               (setq ln
  52.                        (xdrx-line-make (car controlPnts) (last controlPnts))
  53.                     ln (entlast)
  54.               )
  55.               (xdrx-entity-matchprop x ln)
  56.               (xdrx-object-swapid ln x)
  57.               (xdrx-entity-delete ln)
  58.              )
  59.              ((= (length controlPnts) 3)
  60.               ;;Not collinear, 3 control points, forming an arc
  61.               ;;Arc
  62.               (setq gArc (spline->arc controlPnts)
  63.                             mArc (xdge::entity:make gArc)
  64.               )
  65.               (xdrx-entity-matchprop x mArc)
  66.               (xdrx-object-swapid mArc x)
  67.               (xdrx-entity-delete mArc)
  68.               (xdge::free gCir gArc)    ;Release geometry object
  69.              )
  70.            )
  71.            (setq ents (cons x ents))
  72.          )
  73.         (xdrx-pickset->ents ss)
  74.       )
  75.       (setq ss (xdrx-curve-join ents))  ;Join together
  76.       (xdrx-end)
  77.     )
  78.   )
  79.   (princ)
  80. )
  81.  
« Last Edit: November 28, 2023, 07:36:59 AM by xdcad »
The code I wrote uses XDRX-API,which can be downloaded from github.com and is updated at any time.
===================================
[XDrx-Sub Forum]
https://www.theswamp.org/index.php?board=78.0
https://github.com/xdcad/XDrx-API
http://bbs.xdcad.net