找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1476|回复: 5

[曲线] (XD::Curve:Relation)两条曲线的8种拓扑关系判断

[复制链接]

已领礼包: 51个

财富等级: 招财进宝

发表于 2018-12-23 18:03:50 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::Curve:Relation
调用格式: (XD::Curve:Relation e1 e2)
参数说明: e1 ---- 曲线1
e2 ---- 曲线2
返回值: 0-8
函数简介: 8种关系
0:内部
1:内部贴合
2:相交
3:外部贴合
4:外部
5:内部相贴有缝隙
6:外部相贴有缝隙
7:内部但距离小于容差,容差值由 (xdrx_setvar "toldist" dist)设定
8:外部但距离小于容差,容差值由 (xdrx_setvar "toldist" dist)设定
函数来源: 原创
函数作者: Lispboy
适用版本: XDRX API 
最后更新时间: 2018-12-23
备注: -
演示图片:

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

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

×
本帖最后由 newer 于 2018-12-24 09:46 编辑

8种关系
0:内部
1:内部贴合
2:相交
3:外部贴合
4:外部
5:内部相贴有缝隙
6:外部相贴有缝隙
7:内部但距离小于容差,容差值由 (xdrx_setvar "toldist" dist)设定
8:外部但距离小于容差,容差值由 (xdrx_setvar "toldist" dist)设定

(XD::Curve:Relation)两条曲线的8种拓扑关系判断-1.png
  1. (defun XD::Curve:Relation (e1 e2 / cfgs cfgs1 g1 g2 gint ints isGe isinnor is-inters isMInters
  2.                            isnear isqua item numints ret verts1 verts2 x
  3.                           )
  4.   (cond ((XdGe::IsKindOf e1 "kCurve3d")
  5.          (setq g1 e1
  6.                isGe t
  7.          )
  8.         )
  9.         ((= (type e1) 'ENAME) (setq g1 (xdge::constructor e1)))
  10.         ((= (type e1) 'LIST)
  11.          (setq g1 (xdge::constructor "kCompositeCrv3d" e1))
  12.         )
  13.   )
  14.   (cond ((XdGe::IsKindOf e2 "kCurve3d")
  15.          (setq g2 e2
  16.                isGe t
  17.          )
  18.         )
  19.         ((= (type e2) 'ENAME) (setq g2 (xdge::constructor e2)))
  20.         ((= (type e2) 'LIST)
  21.          (setq g2 (xdge::constructor "kCompositeCrv3d" e2))
  22.         )
  23.   )
  24.   (if (and g1
  25.            g2
  26.            (setq gint (xdge::Constructor "kCurveCurveInt3d" g1 g2))
  27.       )
  28.     (progn (setq numints (xdge::getpropertyvalue gint "numintpoints"))
  29.            (setq verts2  (xdrx_getpropertyvalue g2 "vertices")
  30.                  verts1  (xdrx_getpropertyvalue g1 "vertices")
  31.                  isnear  (< (xdge::getpropertyvalue g1 "distanceto" g2)
  32.                             (xdrx_getvar "toldist")
  33.                          )
  34.                  isinnor (vl-some '(lambda (x) (xdrx_point_isinside x e2)) verts1)
  35.            )
  36.            (cond ((= numints 0)
  37.                   (if isinnor
  38.                     (progn (setq ret 0)
  39.                            (if isnear
  40.                              (setq ret 7)
  41.                            )
  42.                     )
  43.                     (progn (setq ret 4)
  44.                            (if isnear
  45.                              (setq ret 8)
  46.                            )
  47.                     )
  48.                   )
  49.                  )
  50.                  ((> numints 0)
  51.                   (setq ints      (xdge::getpropertyvalue gint "intpoints")
  52.                         cfgs      (mapcar '(lambda (x)
  53.                                              (xdge::getpropertyvalue gint "getintconfigs" x t)
  54.                                            )
  55.                                           (xd::list:intarrays 0 (1- (length ints)))
  56.                                   )
  57.                         item      (xdrx_string_replace
  58.                                     (substr (strcase (caar cfgs)) 2)
  59.                                     "OVERLAP"
  60.                                     ""
  61.                                   )
  62.                         cfgs1     (strcase (apply 'strcat (mapcar 'car cfgs)))
  63.                         is-inters (and (xdrx_string_regexps "left" cfgs1)
  64.                                        (xdrx_string_regexps "right" cfgs1)
  65.                                   )
  66.                         isqua     (and (> (length ints) 1)
  67.                                        (or (not (xdrx_string_regexps "OVERLAP" cfgs1))
  68.                                            (and (setq cfgs1 (xdrx_string_regexps item cfgs1))
  69.                                                 (> (length cfgs1) 2)
  70.                                            )
  71.                                        )
  72.                                   )
  73.                         isMInters (> (length ints) 1)
  74.                   )
  75.                   (cond (is-inters (setq ret 2))
  76.                         (isinnor
  77.                          (setq ret 1)
  78.                          (if (and isMInters isqua)
  79.                            (setq ret 5)
  80.                          )
  81.                         )
  82.                         (t
  83.                          (setq ret 3)
  84.                          (if (and isMInters isqua)
  85.                            (setq ret 6)
  86.                          )
  87.                         )
  88.                   )
  89.                  )
  90.            )
  91.            (if (not isGe)
  92.              (xdge::free g1 g2)
  93.            )
  94.            (xdge::free gint)
  95.     )
  96.   )
  97.   ret
  98. )


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

已领礼包: 3904个

财富等级: 富可敌国

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

使用道具 举报

已领礼包: 32个

财富等级: 招财进宝

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

使用道具 举报

已领礼包: 3个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

发表于 2021-6-17 10:16:21 | 显示全部楼层

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

使用道具 举报

已领礼包: 22个

财富等级: 恭喜发财

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 04:07 , Processed in 0.391964 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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