找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1615|回复: 3

[多段线] (XD::Polyline:SetFillet)改变一个倒角的样式, 灵活的根据参数变成尖角、C角、F角

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-10-29 18:56:17 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::Polyline:SetFillet
调用格式: (XD::Polyline:SetFillet e index flag)
参数说明: e ---- LWPOLYLINE
index- 有效的顶点索引值
flag - 倒角方式
0 : 尖角 ?
1 : C角 (距离=半径)
2 : C角 (弧线两端点连线)

对于直线段,如果给0,变成尖角,如果给1,倒角较小索引方向的长度改成半径值倒F角
返回值: 0:成功
1:新顶点超出曲线范围
2:对不封闭线多点操作非法
3:
4:顶点索引超出范围
函数简介: 改变一个倒角的样式, 灵活的根据参数变成尖角、C角、F角
函数来源: 原创
函数作者: Newer
适用版本: XDRX API 
最后更新时间: 2013-10-29
备注: 2013.10.30 下午4点 第二版
演示图片:

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

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

×
本帖最后由 newer 于 2013-10-30 23:44 编辑


该函数应用程序,非模式对话框批量倒角插件,见:http://bbs.xdcad.net/thread-671374-1-1.html

  1. ;|
  2. 改变一个倒角的样式, 灵活的根据参数变成尖角、C角、F角
  3. 参数:
  4.    e ---- LWPOLYLINE
  5.    index- 有效的顶点索引值
  6.    flag - 倒角方式
  7.           0 : 尖角  ?
  8.           1 : C角 (距离=半径)
  9.           2 : C角 (弧线两端点连线)

  10.           对于直线段,如果给0,变成尖角,如果给1,倒角较小索引方向的长度改成半径值倒F角

  11. 返回值:
  12.    0:成功
  13.    1:新顶点超出曲线范围
  14.    2:对不封闭线多点操作非法
  15.    3:
  16.    4:顶点索引超出范围
  17. |;
  18. (defun XD::Polyline:SetFillet (e index flag / an anc bulge dis dis1 dis2
  19.                                         eL1 eL2 info int inx next num p_1 p_2 p0
  20.                                         p1 p2 p3 radius ret tf v1 v2 x xdata
  21.                                         xdata1 xdata2
  22.                                      )
  23.   (setq inx (XD::PolyLine:-Index+ e index)
  24.         num (xdrx_polyline_numVerts e)
  25.   )
  26.   (if (and
  27.         (setq ret 4);顶点索引超出范围
  28.         (>= index 0)
  29.         (< index num)
  30.         (setq ret 2);;对不封闭线多点操作非法
  31.         (or
  32.           (xdrx_getpropertyvalue e "IsClosed")
  33.           (and
  34.             (/= (last inx) 0)               ; 不封闭线判断是否是两端点,是退出
  35.             (/= (car inx) (1- num))
  36.           )
  37.         )
  38.       )
  39.     (progn
  40.       (setq ret 3
  41.             tf (xdrx_polyline_segtype e index)
  42.       )
  43.       (cond
  44.         ((= tf "kArc")
  45.           (setq info (xdrx_polyline_getArcSegAt e index)
  46.                 bulge (abs (xdrx_polyline_getBulgeAt e index))
  47.                 p1 (xdrx_polyline_getPointAt e index)
  48.                 p0 (xdrx_polyline_getPointAt e (car inx))
  49.                 v1 (mapcar
  50.                      '-
  51.                      p0
  52.                      p1
  53.                    )
  54.                 p2 (xdrx_polyline_getPointAt e (last inx))
  55.                 p3 (xdrx_polyline_getPointAt e (last
  56.                                                      (XD::PolyLine:-Index+ e
  57.                                                                            (last inx)
  58.                                                      )
  59.                                                )
  60.                    )
  61.                 v2 (mapcar
  62.                      '-
  63.                      p3
  64.                      p2
  65.                    )
  66.                 v1 (xdrx_vector_normalize v1)
  67.                 v2 (xdrx_vector_normalize v2)
  68.                 int (car (xdrx_curve_getinters (list p0 p1) (list p2 p3) 3))
  69.           )
  70.           (cond
  71.             ((= (xdrx_polyline_segtype e (last inx)) "kArc")
  72.               (xdrx_polyline_setBulgeAt e index 0.0)
  73.               (setq ret 0)
  74.             )
  75.             ((= flag 0)
  76.               (xdrx_polyline_setBulgeAt e index 0.0)
  77.               (xdrx_polyline_removeVertexAt e index)
  78.               (if (= 0 (last inx))
  79.                 (xdrx_polyline_setPointAt e 0 int)
  80.                 (xdrx_polyline_setPointAt e index int)
  81.               )
  82.               (setq ret 0)
  83.             )
  84.             ((= flag 1)
  85.               (setq an (* 4 (xdrx_math_atan bulge))
  86.                     dis (* (nth 2 info) (xdrx_math_tan (/ an 2.0)))
  87.                     p_1 (mapcar
  88.                           '+
  89.                           int
  90.                           (xdrx_vector_product v1 (nth 2 info))
  91.                         )
  92.                     p_2 (mapcar
  93.                           '+
  94.                           int
  95.                           (xdrx_vector_product v2 (nth 2 info))
  96.                         )
  97.               )
  98.               (setq ret 1)
  99.               (if (and
  100.                     (xdrx_point_ison p_1 e)
  101.                     (xdrx_point_ison p_2 e)
  102.                   )
  103.                 (progn
  104.                   (xdrx_polyline_setBulgeAt e index 0.0)
  105.                   (xdrx_polyline_setPointAt e (last inx) p_2)
  106.                   (xdrx_polyline_setPointAt e index p_1)
  107.                   (setq ret 0)
  108.                 )
  109.               )
  110.             )
  111.             ((= flag 2)
  112.               (xdrx_polyline_setBulgeAt e index 0.0)
  113.               (setq ret 0)
  114.             )
  115.           )
  116.         )
  117.         ((= tf "kLine")                       ; 移除kLine段倒角
  118.           (if (and
  119.                 (> num 3)
  120.                 (member index (setq xdata (xdrx_xdata_get e "XD_FILLET")))
  121.                 (= (xdrx_polyline_segtype e (last inx)) "kLine")
  122.               )
  123.             (progn
  124.               (setq eL1 (xdrx_polyline_getLineSegAt e (car inx))
  125.                     eL2 (xdrx_polyline_GetLineSegAt e (last inx))
  126.                     int (car (xdrx_curve_getinters eL1 eL2 3))
  127.                     v1 (xdrx_vector_normalize (mapcar
  128.                                                 '-
  129.                                                 (car eL1)
  130.                                                 int
  131.                                               )
  132.                        )
  133.                     v2 (xdrx_vector_normalize (mapcar
  134.                                                 '-
  135.                                                 (cadr eL2)
  136.                                                 int
  137.                                               )
  138.                        )
  139.                     radius (distance (last eL1) int)
  140.               )
  141.               (cond
  142.                 ((= flag 0)
  143.                   (xdrx_polyline_removeVertexAt e (last inx))
  144.                   (xdrx_polyline_setPointAt e index int)
  145.                 )
  146.                 (t
  147.                   (setq an (xdrx_vector_angle v1 v2)
  148.                         anc (- pi an)
  149.                         dis (* radius (xdrx_math_tan (/ anc 2.0)))
  150.                         dis1 dis
  151.                         dis2 dis
  152.                         bulge (xdrx_math_tan (/ anc 4.0))
  153.                   )
  154.                   (if (not (xdrx_curve_direction e))
  155.                     (setq bulge (- bulge))
  156.                   )
  157.                   (setq p_1 (mapcar
  158.                               '+
  159.                               int
  160.                               (xdrx_vector_product v1 dis1)
  161.                             )
  162.                         p_2 (mapcar
  163.                               '+
  164.                               int
  165.                               (xdrx_vector_product v2 dis2)
  166.                             )
  167.                   )
  168.                   (setq ret 1)               ; 算点不在曲线上
  169.                   (setq next (cadr inx))
  170.                   (xdrx_polyline_setPointAt e index p_1)
  171.                   (xdrx_polyline_setPointAt e (last inx) p_2)
  172.                   (xdrx_polyline_setBulgeAt e index bulge)
  173.                 )
  174.               )
  175.               (setq ret 0)
  176.             )
  177.           )
  178.         )
  179.       )
  180.     )
  181.   )
  182.   (if (= ret 0)
  183.     (progn
  184.       (if (= flag 0)
  185.         (progn
  186.           (setq xdata1 (xdrx_xdata_get e "XD_FILLET")
  187.                 xdata1 (vl-sort xdata1 '<)
  188.                 xdata2 (member index xdata1)
  189.                 xdata (append
  190.                         (reverse (cdr (member index (reverse xdata1))))
  191.                         (mapcar
  192.                           '(lambda (x)
  193.                              (1- x)
  194.                            )
  195.                           (cdr xdata2)
  196.                         )
  197.                       )
  198.           )
  199.           (if (= (length xdata) 0)
  200.             (xdrx_object_removeXdata e "XD_FILLET")
  201.             (apply
  202.               'xdrx_xdata_set
  203.               (cons e (cons "XD_FILLET" xdata))
  204.             )
  205.           )
  206.         )
  207.       )
  208.     )
  209.   )
  210.   ret
  211. )


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

已领礼包: 488个

财富等级: 日进斗金

发表于 2013-10-29 21:34:41 | 显示全部楼层
不就fillet 就可以吗。何必写那么多记不住的命令.

而且程序好像没判断那个角合不合法,比如可能不是相切的。

点评

另,函数是在有圆角的情况下用的,判断了是否是圆角,所以,变成尖角和C脚不用判断合法不合法。  详情 回复 发表于 2013-10-29 22:40
1、FILTER只能完成尖角,不能继续导成C角 2、即使先用FILTER导成尖角,那么再用CHAMPER命令导C角导多少也不知道,要算 3、最重要的,FILTER不能批量,这个函数是给批量一次性处理大量FILTER,圆角-》C脚,清空F角  详情 回复 发表于 2013-10-29 22:38
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2013-10-29 22:38:49 | 显示全部楼层
aeo 发表于 2013-10-29 21:34
不就fillet 就可以吗。何必写那么多记不住的命令.

而且程序好像没判断那个角合不合法,比如可能不是相切 ...

1、FILTER只能完成尖角,不能继续导成C角
2、即使先用FILTER导成尖角,那么再用CHAMPER命令导C角导多少也不知道,要算
3、最重要的,FILTER不能批量,这个函数是给批量一次性处理大量FILTER,圆角-》C脚,清空F角使用的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

 楼主| 发表于 2013-10-29 22:40:44 | 显示全部楼层
aeo 发表于 2013-10-29 21:34
不就fillet 就可以吗。何必写那么多记不住的命令.

而且程序好像没判断那个角合不合法,比如可能不是相切 ...

另,函数是在有圆角的情况下用的,判断了是否是圆角,所以,变成尖角和C脚不用判断合法不合法。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 19:27 , Processed in 0.195527 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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