找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 11492|回复: 37

[每日一码] 判断pl线自相交

[复制链接]

已领礼包: 488个

财富等级: 日进斗金

发表于 2013-11-27 23:49:58 | 显示全部楼层 |阅读模式

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

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

×

  1. ;;自相交? 不自相交返回T
  2. (defun rrr(e  / ret1 ret2 )
  3.     (setq e(vlax-ename->vla-object e))
  4.     (and
  5.       (setq ret1(vl-catch-all-apply 'vlax-invoke (list e 'offset 0.0001)))
  6.       (not(vl-catch-all-error-p ret1))
  7.       (progn(mapcar 'vla-delete ret1)t)
  8.       (= 1(length ret1))
  9.       (setq ret2(vl-catch-all-apply 'vlax-invoke (list e 'offset -0.0001)))
  10.       (not(vl-catch-all-error-p ret2))
  11.       (progn(mapcar 'vla-delete ret2)t)
  12.       (= 1(length ret2))
  13.     )
  14. )

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

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-11-28 00:04:14 | 显示全部楼层
测试通过,不过发现一个有趣现象, 距离极小时夹点没了,妥当那个 grip  点是整根线移动
pl7.jpg
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-11-28 09:46:33 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2013-11-28 11:42 编辑

无论是否自相交,均返回T,这是为什么呢?

点评

aeo
我测试了很多条线都可以判断, pl线最后一点如果没回到起点,只要在某一线上就应该是 nil 中间画的过程中碰到自己,也应该是nil 你贴个图上来,哪种情况不对  详情 回复 发表于 2013-11-29 21:56
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-11-28 13:34:44 | 显示全部楼层
本帖最后由 牢固 于 2013-12-2 10:50 编辑

测试结果是自交和不自交均返回T!
我给出另一版本的计算多段线自交函数:
  1. ;多段线是否自交 By Gu_xl
  2. ;;(gxl-PlSelfIntersP (car(entsel)))
  3. (defun GXL-PLSELFINTERSP
  4.   (PL /        CMD OBJS TMP FLAG OBJ P0 P1 OBJS1 OBJ1 P2 P3 LST SS ENDENT)
  5.   (setq cmd (getvar 'cmdecho))
  6.   (setvar 'cmdecho 0)
  7.   (if (>  (atoi (getvar 'acadver)) 16)
  8.     (progn
  9.       (setq PEDITACCEPT (getvar 'PEDITACCEPT))
  10.       (setvar 'PEDITACCEPT 0)
  11.       )
  12.     )
  13.   (if (= 'ename (type pl))
  14.     (setq pl (vlax-ename->vla-object pl))
  15.   )
  16.   (setq        objs (vlax-safearray->list (vlax-variant-value (vla-explode pl)))
  17.         tmp  objs
  18.   )
  19.   (setq flag nil)
  20.   (while (and objs (not flag))
  21.     (setq obj        (car objs)
  22.           p0        (vlax-curve-getStartPoint obj)
  23.           p1        (vlax-curve-getEndPoint obj)
  24.           objs        (cdr objs)
  25.           objs1        objs
  26.     )
  27.     (while (and        (not flag)
  28.                 objs1
  29.            )
  30.       (setq obj1  (car objs1)
  31.             p2          (vlax-curve-getStartPoint obj1)
  32.             p3          (vlax-curve-getEndPoint obj1)
  33.             objs1 (cdr objs1)
  34.       )
  35.       (setq lst (vlax-invoke obj 'IntersectWith obj1 acExtendNone))
  36.       (if lst
  37.         (progn
  38.           (setq lst (GXL-LST-SPLIT lst 3))
  39.           (setq        lst
  40.                  (vl-remove-if
  41.                    '(lambda (x)
  42.                       (and
  43.                         (or
  44.                           (equal p0 x 1e-6)
  45.                           (equal p1 x 1e-6)
  46.                         )
  47.                         (or
  48.                           (equal p2 x 1e-6)
  49.                           (equal p3 x 1e-6)
  50.                         )
  51.                       )
  52.                     )
  53.                    lst
  54.                  )
  55.           )
  56.           (setq flag (> (length lst) 0))
  57.         )
  58.       )

  59.     )
  60.   )
  61.   (if (not flag)
  62.     (progn
  63.       (setq ss (ssadd))
  64.       (foreach o tmp
  65.         (ssadd (vlax-vla-object->ename o) ss)
  66.       )
  67.       (setq endent (entlast))
  68.       (command "_pedit" "m" ss "" "y" "j" "" "")
  69.       (setq ss (ssadd))
  70.       (while (setq endent (entnext endent))
  71.         (ssadd endent ss)
  72.       )
  73.       (setq flag (> (sslength ss) 1))
  74.       (command "_erase" ss "")
  75.       (if (> (atoi (getvar 'acadver)) 16)
  76.         (progn
  77.           (setvar 'PEDITACCEPT PEDITACCEPT)
  78.         )
  79.       )
  80.       (setvar 'cmdecho cmd)

  81.       flag
  82.     )
  83.     (progn
  84.       (mapcar 'vla-delete tmp)
  85.       (if (> (atoi (getvar 'acadver)) 16)
  86.         (progn
  87.           (setvar 'PEDITACCEPT PEDITACCEPT)
  88.         )
  89.       )
  90.       (setvar 'cmdecho cmd)
  91.       t
  92.     )
  93.   )
  94. )(defun gxl-lst-split (lst len / tmp)
  95.   (if lst
  96.     (cons
  97.       (reverse
  98.         (repeat        len
  99.           (if (car lst)
  100.             (setq tmp (cons (car lst) tmp)
  101.                   lst (cdr lst)
  102.             )
  103.           )
  104.           tmp ;_ 制造返回值
  105.         )
  106.       )
  107.       (gxl-lst-split lst len)
  108.     )
  109.   )
  110. )



点评

错误: no function definition: GXL-LST-SPLIT,G版,提示还缺少GXL-LST-SPLIT函数  详情 回复 发表于 2013-11-30 14:59
G版,运行出错,找不到原因  详情 回复 发表于 2013-11-28 13:52
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-11-28 13:52:32 | 显示全部楼层
牢固 发表于 2013-11-28 13:34
测试结果是自交和不自交均返回T!
我给出另一版本的计算多段线自交函数:

G版,运行出错,找不到原因

点评

系统变量 peditaccept的问题!楼上代码已修正!  详情 回复 发表于 2013-11-28 14:16
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-11-28 13:55:55 | 显示全部楼层
是不是判断能否生成 Region 也可以, 当然Open的先行 Close

点评

这种方法不靠谱!开口不自交的多段线,封口后有可能就会自交!所以很难判断!  详情 回复 发表于 2013-11-28 14:18
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-11-28 14:16:00 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-11-28 13:52
G版,运行出错,找不到原因

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

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-11-28 14:18:58 | 显示全部楼层
st788796 发表于 2013-11-28 13:55
是不是判断能否生成 Region 也可以, 当然Open的先行 Close

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2013-11-29 21:56:19 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-11-28 09:46
无论是否自相交,均返回T,这是为什么呢?

我测试了很多条线都可以判断,

pl线最后一点如果没回到起点,只要在某一线上就应该是 nil
中间画的过程中碰到自己,也应该是nil

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2013-11-29 22:05:40 | 显示全部楼层
其实很简单,自己用offset命令试验,距离可以设大一点就可以看清,往两个方向offset
如果自相交是offset不出一条完整的线的,至少有一个方向不行。
这种判断,桌子公司写offset的时候已经考虑的很清楚了,你如果自定义实体重载offset方法,一样的也要想的很充分。
所以我们没必要自己动脑筋。

点评

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-11-29 22:20:37 | 显示全部楼层
aeo 发表于 2013-11-29 22:05
其实很简单,自己用offset命令试验,距离可以设大一点就可以看清,往两个方向offset
如果自相交是offset不 ...

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-11-30 08:12:54 | 显示全部楼层
aeo版主请看,不论是否自交,返回的结果不对
1.png

Drawing1.rar

20.32 KB, 下载次数: 7, 下载积分: D豆 -1 , 活跃度 1

点评

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

使用道具 举报

已领礼包: 2688个

财富等级: 家财万贯

发表于 2013-11-30 14:59:04 | 显示全部楼层
牢固 发表于 2013-11-28 13:34
测试结果是自交和不自交均返回T!
我给出另一版本的计算多段线自交函数:

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

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-12-2 11:11:26 | 显示全部楼层
本帖最后由 牢固 于 2013-12-2 11:13 编辑
zyhandw 发表于 2013-11-30 14:59
错误: no function definition: GXL-LST-SPLIT,G版,提示还缺少GXL-LST-SPLIT函数


楼上 GXL-LST-SPLIT 函数已补上!
根据VLA-offset函数特性,给出另一版本的判断自交代码:  
  1. (defun GXL-PLSELFINTERSP  (pl / err err1 flag)
  2.   (if (= 'ename (type pl))
  3.     (setq pl (vlax-ename->vla-object pl))
  4.     )
  5.   (if
  6.     (not
  7.       (VL-CATCH-ALL-ERROR-P
  8.         (setq err (VL-CATCH-ALL-APPLY 'vla-Offset (list pl 0.001)))
  9.         )
  10.       )
  11.      (progn
  12.        (setq err (vlax-safearray->list (vlax-variant-value err)))
  13.        (if (> (length err) 1)
  14.          (progn
  15.            (mapcar 'vla-delete err)
  16.            t
  17.            )
  18.          (if (not
  19.                (VL-CATCH-ALL-ERROR-P
  20.                  (setq err1 (VL-CATCH-ALL-APPLY
  21.                               'vla-Offset
  22.                               (list (car err) -0.001)))
  23.                  )
  24.                )
  25.            (progn
  26.              (setq err1        (vlax-safearray->list
  27.                           (vlax-variant-value err1)))
  28.              (setq flag        (not
  29.                           (equal
  30.                             (vla-get-length pl)
  31.                             (vla-get-length (car err1))
  32.                             1e-8
  33.                             )
  34.                           )
  35.                    )
  36.              (mapcar 'vla-delete err)
  37.              (mapcar 'vla-delete err1)
  38.              flag
  39.              )
  40.            (princ "\nFailed!")
  41.            )
  42.          )
  43.        )
  44.      (princ "\nFailed!")
  45.      )
  46.   )

点评

感谢固版的分享,回去学习下。试用了下,根据VLA-offset函数特性的另一版本更好些,4楼修正后的还是有一些问题。比如这种情况:  详情 回复 发表于 2013-12-2 16:55

评分

参与人数 1D豆 +5 收起 理由
/db_自贡黄明儒_ + 5 很完美!!!

查看全部评分

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

使用道具 举报

已领礼包: 2688个

财富等级: 家财万贯

发表于 2013-12-2 16:55:58 | 显示全部楼层
牢固 发表于 2013-12-2 11:11
楼上 GXL-LST-SPLIT 函数已补上!
根据VLA-offset函数特性,给出另一版本的判断自交代码:

感谢固版的分享,回去学习下。试用了下,根据VLA-offset函数特性的另一版本更好些,4楼修正后的还是有一些问题。比如这种情况:
1.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-28 22:57 , Processed in 0.526378 second(s), 69 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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