找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1003|回复: 1

[曲线] (XD::Curve:OverLaps)计算两曲线的重叠的部分

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-12-16 18:34:41 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::Curve:OverLaps
调用格式: (XD::Curve:OverLaps e1 e2)
参数说明: e1 --- 曲线实体 或 曲线几何实体
e2 --- 曲线实体 或 曲线几何实体
返回值: 表 or nil
两元素表,每个元素是对应实体E1,E2的子表
( (重叠1长度 起始参数 结束参数) ... (重叠n长度 起始参数 结束参数)
)
函数简介: 计算两曲线的重叠的部分
函数来源: 原创
函数作者: newer
适用版本: XDRX API 
最后更新时间: 2017-12-16
备注: (((281.931 1.0 2.0) (227.406 0.0 1.0)) ((281.931 0.422696 1.0) (227.406 1.0
1.39366)))
演示图片: -

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

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

×
  1. (defun XD::Curve:OverLaps (g1 g2 / #lowerbound #upperbound ent0 ent1 gint
  2.                               g-lst i int1 int2 j len1 lst lst1 overlap
  3.                               overlap-nums x
  4.                           )
  5.   (if (and
  6.         (= (type g1) 'ENAME)
  7.         (= (type g2) 'ENAME)
  8.         (or
  9.           (xdge::type g1)
  10.           (setq ent0 g1
  11.                 g1 (xdge::constructor g1)
  12.           )
  13.         )
  14.         (setq g-lst (cons g1 g-lst))
  15.         (or
  16.           (xdge::type g2)
  17.           (setq ent1 g2
  18.                 g2 (xdge::constructor g2)
  19.           )
  20.         )
  21.         (setq g-lst (cons g2 g-lst))
  22.       )
  23.     (progn
  24.       (if (not (xdge::type g1))
  25.         (setq ent0 g1
  26.               g1 (xdge::constructor g1)
  27.               g-lst (cons g1 g-lst)
  28.         )
  29.       )
  30.       (if (not (xdge::type g2))
  31.         (setq ent1 g2
  32.               g2 (xdge::constructor g2)
  33.               g-lst (cons g2 g-lst)
  34.         )
  35.       )
  36.       (if (and
  37.             (setq gint (xdge::constructor "kCurveCurveInt3d" g1 g2))
  38.             (> (setq overlap-nums (xdge::getpropertyvalue gint
  39.                                                           "overlapcount"
  40.                                   )
  41.                )
  42.                0
  43.             )
  44.           )
  45.         (progn
  46.           (setq g-lst (cons gint g-lst))
  47.           (setq i -1
  48.                 lst nil
  49.                 lst nil
  50.           )
  51.           (repeat overlap-nums
  52.             (if (setq overlap (xdge::getpropertyvalue gint
  53.                                                       "getoverlapranges"
  54.                                                       (setq i (1+ i))
  55.                               )
  56.                 )
  57.               (progn
  58.                 (setq g-lst (cons overlap g-lst))
  59.                 (setq j 0)
  60.                 (setq int1 (xdge::getpropertyvalue (car overlap)
  61.                                                    "lowerbound" "upperbound"
  62.                            )
  63.                       int2 (xdge::getpropertyvalue (cadr overlap)
  64.                                                    "lowerbound" "upperbound"
  65.                            )
  66.                       len1 (xdge::getpropertyvalue g1 "length" #lowerbound
  67.                                                    #upperbound
  68.                            )
  69.                 )
  70.                 (if ent0
  71.                   (setq int1 (mapcar
  72.                                '(lambda (x)
  73.                                   (xdrx_curve_getparamatdist ent0 x)
  74.                                 )
  75.                                int1
  76.                              )
  77.                   )
  78.                 )
  79.                 (if ent1
  80.                   (setq int2 (mapcar
  81.                                '(lambda (x)
  82.                                   (xdrx_curve_getparamatdist ent1 x)
  83.                                 )
  84.                                int2
  85.                              )
  86.                   )
  87.                 )
  88.                 (setq lst1 (cons g1 (cons len1 int1))
  89.                       lst (cons lst1 lst)
  90.                       lst1 (cons g2 (cons len1 int2))
  91.                       lst (cons lst1 lst)
  92.                 )
  93.               )
  94.             )
  95.           )
  96.           (setq lst (xd::list:groupbyindex lst 0.1))
  97.           (setq lst (mapcar
  98.                       'cdr
  99.                       (list (assoc g1 lst) (assoc g2 lst))
  100.                     )
  101.           )
  102.         )
  103.       )
  104.     )
  105.   )
  106.   (xdge::free g-lst)
  107.   lst
  108. )


演示例子:


曲线重叠段.gif

  1. (defun c:tt ()
  2.   (if (and (setq e1 (car (xdrx_entsel
  3.                            "\n拾取曲线1<退出>:"
  4.                            '((0 . "LINE,*POLYLINE,ARC,CIRCLE,ELLIPSE"))
  5.                          )
  6.                     )
  7.            )
  8.            (setq e2 (car (xdrx_entsel
  9.                            "\n拾取曲线2<退出>:"
  10.                            '((0 . "LINE,*POLYLINE,ARC,CIRCLE,ELLIPSE"))
  11.                          )
  12.                     )
  13.            )
  14.            (setq info (xd::curve:overlaps e1 e2))
  15.       )
  16.     (progn (setq d1 (nth 0 info))
  17.            (mapcar '(lambda (x)
  18.                       (setq pa1          (cadr x)
  19.                             pa2          (caddr x)
  20.                             pamid (/ (+ pa1 pa2) 2.0)
  21.                       )
  22.                       (setq p (xdrx_curve_getpointatparam e1 pamid))
  23.                       (xdrx_grdraw 2 0 p 3 3)
  24.                     )
  25.                    d1
  26.            )
  27.            (xdrx_prompt
  28.              "\n两曲线有 "
  29.              (length info)
  30.              " 个重叠段,重叠长度分别是 "
  31.              (caar (nth 0 info))
  32.              " 和"
  33.              (caadr (nth 0 info))
  34.              "."
  35.            )
  36.     )
  37.   )
  38.   (princ)
  39. )




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

已领礼包: 104个

财富等级: 日进斗金

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 21:39 , Processed in 0.246129 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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