找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1603|回复: 17

[每日一码] 椭圆(弧)转换为多段线弧(非直线模拟)

[复制链接]

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-8-2 14:45:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 marting 于 2017-8-2 14:49 编辑

椭圆(弧)转换为多段线弧(非直线模拟)

QQ截图20170802144119.png

QQ截图20170802144101.png

加载后,执行命令:EL2PL

  1. ;; EllipseToPolyline
  2. ;; Returns a polyline (vla-object) which is an approximation of the ellipse (or elliptical arc)
  3. ;;
  4. ;; Argument : an ellipse (vla-object)

  5. (defun EllipseToPolyline (el        /     cl    norm  cen        elv   pt0
  6.                           pt1        pt2   pt3   pt4          ac0        ac4   a04
  7.                           a02        a24   bsc0  bsc2  bsc3        bsc4  plst
  8.                           blst        spt   spa   fspa  srat        ept   epa
  9.                           fepa        erat  n
  10.                          )
  11.   (vl-load-com)
  12.   (setq        cl   (=        (ang<2pi (vla-get-StartAngle el))
  13.                 (ang<2pi (vla-get-EndAngle el))
  14.              )
  15.         norm (vlax-get el 'Normal)
  16.         cen  (trans (vlax-get el 'Center) 0 norm)
  17.         elv  (caddr cen)
  18.         cen  (3dTo2dPt cen)
  19.         pt0  (mapcar '+ (trans (vlax-get el 'MajorAxis) 0 norm) cen)
  20.         ac0  (angle cen pt0)
  21.         pt4  (mapcar '+ cen (trans (vlax-get el 'MinorAxis) 0 norm))
  22.         pt2  (3dTo2dPt
  23.                (trans (vlax-curve-getPointAtparam el (/ pi 4.)) 0 norm)
  24.              )
  25.         ac4  (angle cen pt4)
  26.         a04  (angle pt0 pt4)
  27.         a02  (angle pt0 pt2)
  28.         a24  (angle pt2 pt4)
  29.         bsc0 (/ (ang<2pi (- a02 ac4)) 2.)
  30.         bsc2 (/ (ang<2pi (- a04 a02)) 2.)
  31.         bsc3 (/ (ang<2pi (- a24 a04)) 2.)
  32.         bsc4 (/ (ang<2pi (- (+ ac0 pi) a24)) 2.)
  33.         pt1  (inters pt0
  34.                      (polar pt0 (+ ac0 (/ pi 2.) bsc0) 1.)
  35.                      pt2
  36.                      (polar pt2 (+ a02 bsc2) 1.)
  37.                      nil
  38.              )
  39.         pt3  (inters pt2
  40.                      (polar pt2 (+ a04 bsc3) 1.)
  41.                      pt4
  42.                      (polar pt4 (+ a24 bsc4) 1.)
  43.                      nil
  44.              )
  45.         plst (list pt4 pt3 pt2 pt1 pt0)
  46.         blst (mapcar '(lambda (b) (tan (/ b 2.)))
  47.                      (list bsc4 bsc3 bsc2 bsc0)
  48.              )
  49.   )
  50.   (foreach b blst (setq blst (cons b blst)))
  51.   (foreach b blst (setq blst (cons b blst)))
  52.   (foreach p (cdr plst)
  53.     (setq ang  (angle cen p)
  54.           plst (cons (polar cen (+ ang (* 2 (- ac4 ang))) (distance cen p))
  55.                      plst
  56.                )
  57.     )
  58.   )
  59.   (foreach p (cdr plst)
  60.     (setq ang  (angle cen p)
  61.           plst (cons (polar cen (+ ang (* 2 (- ac0 ang))) (distance cen p))
  62.                      plst
  63.                )
  64.     )
  65.   )
  66.   (setq        pl (vlax-invoke
  67.              (vla-get-ModelSpace
  68.                (vla-get-ActiveDocument (vlax-get-acad-object))
  69.              )
  70.              'AddLightWeightPolyline
  71.              (apply 'append
  72.                     (setq plst (reverse        (if cl
  73.                                           (cdr plst)
  74.                                           plst
  75.                                         )
  76.                                )
  77.                     )
  78.              )
  79.            )
  80.   )
  81.   (vlax-put pl 'Normal norm)
  82.   (vla-put-Elevation pl elv)
  83.   (mapcar '(lambda (i v) (vla-SetBulge pl i v))
  84.           '(0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16)
  85.           blst
  86.   )
  87.   (if cl
  88.     (vla-put-Closed pl :vlax-true)
  89.     (progn (setq spt  (vlax-curve-getClosestPointTo pl (vlax-get el 'Startpoint))
  90.                  spa  (vlax-curve-getParamAtPoint pl spt)
  91.                  fspa (fix spa)
  92.                  ept  (vlax-curve-getClosestPointTo pl (vlax-get el 'Endpoint))
  93.                  epa  (vlax-curve-getParamAtPoint pl ept)
  94.                  fepa (fix epa)
  95.                  n    0
  96.            )
  97.            (cond ((equal spt (trans pt0 norm 0) 1e-9)
  98.                   (if (= epa fepa)
  99.                     (setq plst (sublist plst 0 (1+ fepa))
  100.                           blst (sublist blst 0 (1+ fepa))
  101.                     )
  102.                     (setq erat (/ (- (vlax-curve-getDistAtParam pl epa)
  103.                                      (vlax-curve-getDistAtParam pl fepa)
  104.                                   )
  105.                                   (- (vlax-curve-getDistAtParam pl (rem (1+ fepa) 17))
  106.                                      (vlax-curve-getDistAtParam pl fepa)
  107.                                   )
  108.                                )
  109.                           plst (append (sublist plst 0 (1+ fepa))
  110.                                        (list (3dTo2dPt (trans ept 0 norm)))
  111.                                )
  112.                           blst (append (sublist blst 0 (1+ fepa))
  113.                                        (list (k*bulge (nth fepa blst) erat))
  114.                                )
  115.                     )
  116.                   )
  117.                  )
  118.                  ((equal ept (trans pt0 norm 0) 1e-9)
  119.                   (if (= spa fspa)
  120.                     (setq plst (sublist plst fspa nil)
  121.                           blst (sublist blst fspa nil)
  122.                     )
  123.                     (setq srat (/ (- (vlax-curve-getDistAtParam pl (rem (1+ fspa) 17))
  124.                                      (vlax-curve-getDistAtParam pl spa)
  125.                                   )
  126.                                   (- (vlax-curve-getDistAtParam pl (rem (1+ fspa) 17))
  127.                                      (vlax-curve-getDistAtParam pl fspa)
  128.                                   )
  129.                                )
  130.                           plst (cons (3dTo2dPt (trans spt 0 norm))
  131.                                      (sublist plst (1+ fspa) nil)
  132.                                )
  133.                           blst (cons (k*bulge (nth fspa blst) srat)
  134.                                      (sublist blst (1+ fspa) nil)
  135.                                )
  136.                     )
  137.                   )
  138.                  )
  139.                  (T
  140.                   (setq        srat (/        (- (vlax-curve-getDistAtParam pl (rem (1+ fspa) 17))
  141.                                    (vlax-curve-getDistAtParam pl spa)
  142.                                 )
  143.                                 (- (vlax-curve-getDistAtParam pl (rem (1+ fspa) 17))
  144.                                    (vlax-curve-getDistAtParam pl fspa)
  145.                                 )
  146.                              )
  147.                         erat (/        (- (vlax-curve-getDistAtParam pl epa)
  148.                                    (vlax-curve-getDistAtParam pl fepa)
  149.                                 )
  150.                                 (- (vlax-curve-getDistAtParam pl (rem (1+ fepa) 17))
  151.                                    (vlax-curve-getDistAtParam pl fepa)
  152.                                 )
  153.                              )
  154.                   )
  155.                   (if (< epa spa)
  156.                     (setq plst (append (if (= spa fspa)
  157.                                          (sublist plst fspa nil)
  158.                                          (cons (3dTo2dPt (trans spt 0 norm))
  159.                                                (sublist plst (1+ fspa) nil)
  160.                                          )
  161.                                        )
  162.                                        (cdr (sublist plst 0 (1+ fepa)))
  163.                                        (if (/= epa fepa)
  164.                                          (list (3dTo2dPt (trans ept 0 norm)))
  165.                                        )
  166.                                )
  167.                           blst (append (if (= spa fspa)
  168.                                          (sublist blst fspa nil)
  169.                                          (cons (k*bulge (nth fspa blst) srat)
  170.                                                (sublist blst (1+ fspa) nil)
  171.                                          )
  172.                                        )
  173.                                        (sublist blst 0 fepa)
  174.                                        (if (= epa fepa)
  175.                                          (list (nth fepa blst))
  176.                                          (list (k*bulge (nth fepa blst) erat))
  177.                                        )
  178.                                )
  179.                     )
  180.                     (setq plst (append (if (= spa fspa)
  181.                                          (sublist plst fspa (1+ (- fepa fspa)))
  182.                                          (cons (3dTo2dPt (trans spt 0 norm))
  183.                                                (sublist plst (1+ fspa) (- fepa fspa))
  184.                                          )
  185.                                        )
  186.                                        (list (3dTo2dPt (trans ept 0 norm)))
  187.                                )
  188.                           blst (append (if (= spa fspa)
  189.                                          (sublist blst fspa (- fepa fspa))
  190.                                          (cons (k*bulge (nth fspa blst) srat)
  191.                                                (sublist blst (1+ fspa) (- fepa fspa))
  192.                                          )
  193.                                        )
  194.                                        (if (= epa fepa)
  195.                                          (list (nth fepa blst))
  196.                                          (list (k*bulge (nth fepa blst) erat))
  197.                                        )
  198.                                )
  199.                     )
  200.                   )
  201.                  )
  202.            )
  203.            (vlax-put pl 'Coordinates (apply 'append plst))
  204.            (foreach b blst (vla-SetBulge pl n b) (setq n (1+ n)))
  205.     )
  206.   )
  207.   pl
  208. )

  209. ;; Ang<2pi
  210. ;; Returns the angle expression betweem 0 and 2*pi
  211. (defun ang<2pi (ang)
  212.   (if (and (<= 0 ang) (< ang (* 2 pi)))
  213.     ang
  214.     (ang<2pi (rem (+ ang (* 2 pi)) (* 2 pi)))
  215.   )
  216. )

  217. ;; 3dTo2dPt
  218. ;; Returns the 2d point (x y) of a 3d point (x y z)
  219. (defun 3dTo2dPt (pt) (list (car pt) (cadr pt)))

  220. ;; Tan
  221. ;; Returns the angle tangent
  222. (defun tan (a) (/ (sin a) (cos a)))



  223. ;; K*BULGE
  224. ;; Returns the proportinal bulge to the référence bulge
  225. ;; Arguments :
  226. ;; b : the bulge
  227. ;; k : the proportion ratio (between angles or arcs length)
  228. (defun k*bulge (b k / a)
  229.   (setq a (atan b))
  230.   (/ (sin (* k a)) (cos (* k a)))
  231. )

  232. ;; EL2PL
  233. ;; Converts ellipses and elliptcal arcs into polylines

  234. (defun c:el2pl (/ *error* fra acdoc ss)
  235.   (vl-load-com)
  236.   (defun *error* (msg)
  237.     (if        (and (/= msg "Fonction annulée")
  238.              (/= msg "Function cancelled")
  239.         )
  240.       (princ (strcat (if (= "FRA" (getvar 'locale))
  241.                        "\nErreur: "
  242.                        "\Error: "
  243.                      )
  244.                      msg
  245.              )
  246.       )
  247.     )
  248.     (vla-endUndoMark acdoc)
  249.     (princ)
  250.   )
  251.   (setq acdoc (vla-get-ActiveDocument (vlax-get-acad-object)))
  252.   (if (ssget '((0 . "ELLIPSE")))
  253.     (progn (vla-StartUndoMark acdoc)
  254.            (vlax-for e (setq ss (vla-get-ActiveSelectionSet acdoc))
  255.              (EllipseToPolyline e)
  256.              (vla-delete e)
  257.            )
  258.            (vla-delete ss)
  259.            (vla-EndUndoMark acdoc)
  260.     )
  261.   )
  262.   (princ)
  263. )

  264. ;; PELL
  265. ;; Draws an ellipse or an elliptical arc approximation (polyline) on the fly
  266. (defun c:pell (/ *error* ec pe old ent)
  267.   (vl-load-com)
  268.   (defun *error* (msg)
  269.     (if        (and msg
  270.              (/= msg "Fonction annulée")
  271.              (/= msg "Function cancelled")
  272.         )
  273.       (princ (strcat (if (= "FRA" (getvar 'locale))
  274.                        "\nErreur: "
  275.                        "\Error: "
  276.                      )
  277.                      msg
  278.              )
  279.       )
  280.     )
  281.     (setvar 'cmdecho ec)
  282.     (setvar 'pellipse pe)
  283.     (princ)
  284.   )
  285.   (setq        ec  (getvar 'cmdecho)
  286.         pe  (getvar 'pellipse)
  287.         old (entlast)
  288.   )
  289.   (setvar 'cmdecho 1)
  290.   (setvar 'pellipse 0)
  291.   (command "_.ellipse")
  292.   (while (/= 0 (getvar 'cmdactive)) (command pause))
  293.   (if (not (eq old (setq ent (entlast))))
  294.     (progn (EllipseToPolyline (vlax-ename->vla-object ent))
  295.            (entdel ent)
  296.     )
  297.   )
  298.   (*error* nil)
  299. )


函数 sublist :


  1. ;; SUBLIST
  2. ;; Returns a sub list
  3. ;;
  4. ;; Arguments
  5. ;; lst : a list
  6. ;; start : start index (first item = 0)
  7. ;; leng : the sub list length (number of items) or nil
  8. (defun sublist (lst start leng / n r)
  9.   (if (or (not leng) (< (- (length lst) start) leng))
  10.     (setq leng (- (length lst) start))
  11.   )
  12.   (setq n (+ start leng))
  13.   (while (< start n)
  14.     (setq r (cons (nth (setq n (1- n)) lst) r))
  15.   )
  16. )

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 6468个

财富等级: 富甲天下

发表于 2017-8-3 00:08:30 | 显示全部楼层
沙发,正需要,太感谢了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

发表于 2017-8-3 07:12:17 来自手机 | 显示全部楼层
这个太有用了,感谢分享!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 812个

财富等级: 财运亨通

发表于 2017-8-3 08:14:50 | 显示全部楼层
感谢大大分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 315个

财富等级: 日进斗金

发表于 2017-8-3 11:37:03 | 显示全部楼层

佑达升级了没?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 45个

财富等级: 招财进宝

发表于 2017-8-14 21:02:14 | 显示全部楼层
感谢分享,正需要
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 41个

财富等级: 招财进宝

发表于 2017-8-15 09:37:31 | 显示全部楼层
工作中很有帮助,给力
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 85个

财富等级: 招财进宝

发表于 2017-10-18 10:31:31 | 显示全部楼层
加载后未知命令?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2017-10-31 16:44:57 | 显示全部楼层
怎么运行不起来呢?求有经验的给介绍
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 584个

财富等级: 财运亨通

发表于 2017-11-15 09:41:31 | 显示全部楼层
感谢大大分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 844个

财富等级: 财运亨通

发表于 2017-12-16 15:46:52 | 显示全部楼层
能否转换后是多段圆弧或是圆弧,而不是闭合的多段线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 897个

财富等级: 财运亨通

发表于 2018-1-4 14:31:48 | 显示全部楼层
好贴 必须顶
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2019-5-25 09:33:11 | 显示全部楼层
还是多段线编辑起来方便,谢谢分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 9个

财富等级: 恭喜发财

发表于 2019-6-6 22:41:55 来自手机 | 显示全部楼层

marting LV5
2017-8-2 14:45:12 楼主
椭圆(弧)转换为多段线弧(非直线模拟)
椭圆(弧)转换为多段线弧(非直线模拟)

来自: 微社区
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6056个

财富等级: 富甲天下

发表于 2019-6-10 00:50:13 | 显示全部楼层
这个收藏了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-14 20:32 , Processed in 0.232257 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表