找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 623|回复: 7

[编程申请] 求多条直线形成的多个交叉区域围成的多个多段线

[复制链接]

已领礼包: 2个

财富等级: 恭喜发财

发表于 2018-7-19 09:28:37 | 显示全部楼层 |阅读模式

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

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

×
请各位大神帮帮忙啊,这个完全没思路,不知道咋写了,如图中这样的
QQ截图20180719092530.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-7-19 12:33:18 | 显示全部楼层
1,2文字是什么意思? 求什么多段线? 请上传个条件图和结果图的对比截图。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2018-7-20 20:52:04 | 显示全部楼层
newer 发表于 2018-7-19 12:33
1,2文字是什么意思? 求什么多段线? 请上传个条件图和结果图的对比截图。

图片是这样的,红色的线是多段线,直线相交的闭合区域生成多段线
QQ截图20180720205005.png
QQ截图20180720205015.png

点评

很简单,核心的就一行代码 (xdrx_geom_searchregions (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE")))) [attachimg]78850[/attachimg]  详情 回复 发表于 2018-7-20 21:09
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-7-20 21:09:59 | 显示全部楼层
yigexinren 发表于 2018-7-20 20:52
图片是这样的,红色的线是多段线,直线相交的闭合区域生成多段线

很简单,核心的就一行代码 (xdrx_geom_searchregions (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))))

矩形区域.gif

  1. (defun c:tt ()
  2.   (if (and (xdrx_initssget "\n选择曲线<退出>:")
  3.            (setq ss (xdrx_ssget '((0 . "*LINE,ARC,ELLIPSE,CIRCLE"))))
  4.       )
  5.     (progn (xdrx_begin)
  6.            (setq ss1 (xdrx_geom_searchregions (xdrx_entity_copy ss)));; 生成联通区域
  7.            (xdrx_entity_setproperty ss1 "constantwidth" 5.0 "color" 1)  ;;区域宽度设5,颜色红色
  8.            (xdrx_end)
  9.     )
  10.   )
  11.   (princ)
  12. )


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

使用道具 举报

已领礼包: 69个

财富等级: 招财进宝

发表于 2018-7-21 08:38:52 | 显示全部楼层
newer 发表于 2018-7-20 21:09
很简单,核心的就一行代码 (xdrx_geom_searchregions (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))))

...

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

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2018-7-21 08:56:08 | 显示全部楼层
newer 发表于 2018-7-20 21:09
很简单,核心的就一行代码 (xdrx_geom_searchregions (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))))

...

谢谢版主大哥,您真厉害,我这里还有个问题想请教您一下,我整了很久都没整明白,就是用boundary的时候,老是提示点在对象上,其实点只是距离对象特别近而已,这种怎么处理啊
111111111111111.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2018-7-21 08:59:55 | 显示全部楼层
newer 发表于 2018-7-20 21:09
很简单,核心的就一行代码 (xdrx_geom_searchregions (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))))

...
  1. (defun c:tt ()
  2. (defun 2epi ( e1 e2 mode / l r )
  3.     (setq obj1 (vlax-ename->vla-object e1)
  4.             obj2 (vlax-ename->vla-object e2)
  5.             l (vlax-invoke obj1 'intersectwith obj2 mode))
  6.     (repeat (/ (length l) 3)
  7.         (setq r (cons (list (car l) (cadr l) (caddr l)) r)
  8.               l (cdddr l)
  9.         )
  10.     )
  11.     (reverse r)
  12. )
  13. (defun ptslensort (ptlst / d maxd maxl mind minl n pt)
  14. (setq minl (list (car ptlst) (cadr ptlst)) maxd 0 mind (apply 'distance minl))
  15. (while (setq pt (car ptlst) ptlst (cdr ptlst))
  16. (foreach n ptlst
  17. (setq d (distance n pt))
  18. (cond ((< maxd d) (setq maxd d maxl (list n pt)))
  19. ((> mind d) (setq mind d minl (list n pt)))
  20. )
  21. )
  22. ) (list maxl minl)
  23. )
  24. (defun sspis ( ss / a b i j l )
  25.     (repeat (setq i (sslength ss))
  26.         (setq a (ssname ss (setq i (1- i))))
  27.         (repeat (setq j i)
  28.             (setq b (ssname ss (setq j (1- j)))
  29.                   l (cons (2epi a b acextendnone) l)
  30.             )
  31.         )
  32.     )
  33.     (apply 'append (reverse l))
  34. )
  35. (defun mklaco (la co)
  36.   (If (= (Tblsearch "layer" la) nil)
  37.     (vl-cmdf "layer" "m" la "c" co la "")
  38.     (vl-cmdf "layer" "t" la "s" la "c" co la "")
  39.   )
  40.   la
  41. )
  42. (mklaco "边界" 1)
  43. (setq ss (ssget '((0 . "line"))))
  44. (setq pts (sspis ss))
  45. (setq pts (BF-list-delsame pts 0.0))
  46. (setq dx (* 0.1 (apply 'distance (cadr (ptslensort pts)))))
  47. (setq pl (apply 'append (mapcar '(lambda(x)
  48. (list (mapcar '- x (list dx dx))
  49. (mapcar '+ x (list dx dx))
  50. (mapcar '- x (list dx (- dx)))
  51. (mapcar '+ x (list dx (- dx)))
  52. )
  53. ) pts)))
  54. (command "_.boundary" "a" "b" "n" ss "" "")
  55. (foreach x pl
  56.         (command x)
  57. )
  58. (command "")
  59. (vl-cmdf "_draworder" (ssget "x" (list (cons 8 "边界"))) "" "_f")
  60. )

  61. (defun BF-list-delsame (lst buzz)
  62.   (if Lst
  63.     (cons (car Lst)
  64.           (BF-list-delsame
  65.             (vl-remove-if
  66.               '(lambda (x) (equal (car lst) x buzz))
  67.               (cdr lst)
  68.             )
  69.             buzz
  70.           )
  71.     )
  72.   )
  73. )
这些是代码,是另一个朋友教我的,我已经大概看懂了,就是不会改这个出现的问题。他是先求出所有交点,然后取最近的交点的十分之一,用这个距离算出交点周边的四个点。然后把这些点给boundary作为参数,但是这样做,就是当点距离交点特别近的时候,就会提示点在对象上。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2018-7-21 09:02:24 | 显示全部楼层
newer 发表于 2018-7-20 21:09
很简单,核心的就一行代码 (xdrx_geom_searchregions (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE"))))

...
  1. (defun c:tt ()
  2. (defun 2epi ( e1 e2 mode / l r )
  3.     (setq obj1 (vlax-ename->vla-object e1)
  4.             obj2 (vlax-ename->vla-object e2)
  5.             l (vlax-invoke obj1 'intersectwith obj2 mode))
  6.     (repeat (/ (length l) 3)
  7.         (setq r (cons (list (car l) (cadr l) (caddr l)) r)
  8.               l (cdddr l)
  9.         )
  10.     )
  11.     (reverse r)
  12. )
  13. (defun ptslensort (ptlst / d maxd maxl mind minl n pt)
  14. (setq minl (list (car ptlst) (cadr ptlst)) maxd 0 mind (apply 'distance minl))
  15. (while (setq pt (car ptlst) ptlst (cdr ptlst))
  16. (foreach n ptlst
  17. (setq d (distance n pt))
  18. (cond ((< maxd d) (setq maxd d maxl (list n pt)))
  19. ((> mind d) (setq mind d minl (list n pt)))
  20. )
  21. )
  22. ) (list maxl minl)
  23. )
  24. (defun sspis ( ss / a b i j l )
  25.     (repeat (setq i (sslength ss))
  26.         (setq a (ssname ss (setq i (1- i))))
  27.         (repeat (setq j i)
  28.             (setq b (ssname ss (setq j (1- j)))
  29.                   l (cons (2epi a b acextendnone) l)
  30.             )
  31.         )
  32.     )
  33.     (apply 'append (reverse l))
  34. )
  35. (defun mklaco (la co)
  36.   (If (= (Tblsearch "layer" la) nil)
  37.     (vl-cmdf "layer" "m" la "c" co la "")
  38.     (vl-cmdf "layer" "t" la "s" la "c" co la "")
  39.   )
  40.   la
  41. )
  42. (mklaco "边界" 1)
  43. (setq ss (ssget '((0 . "line"))))
  44. (setq pts (sspis ss))
  45. (setq pts (BF-list-delsame pts 0.0))
  46. (setq dx (* 0.1 (apply 'distance (cadr (ptslensort pts)))))
  47. (setq pl (apply 'append (mapcar '(lambda(x)
  48. (list (mapcar '- x (list dx dx))
  49. (mapcar '+ x (list dx dx))
  50. (mapcar '- x (list dx (- dx)))
  51. (mapcar '+ x (list dx (- dx)))
  52. )
  53. ) pts)))
  54. (command "_.boundary" "a" "b" "n" ss "" "")
  55. (foreach x pl
  56.         (command x)
  57. )
  58. (command "")
  59. (vl-cmdf "_draworder" (ssget "x" (list (cons 8 "边界"))) "" "_f")
  60. )

  61. (defun BF-list-delsame (lst buzz)
  62.   (if Lst
  63.     (cons (car Lst)
  64.           (BF-list-delsame
  65.             (vl-remove-if
  66.               '(lambda (x) (equal (car lst) x buzz))
  67.               (cdr lst)
  68.             )
  69.             buzz
  70.           )
  71.     )
  72.   )
  73. )
这些是代码,是另一个朋友教我的,我已经大概看懂了,就是不会改这个出现的问题。他是先求出所有交点,然后取最近的交点的十分之一,用这个距离算出交点周边的四个点。然后把这些点给boundary作为参数,但是这样做,就是当点距离交点特别近的时候,就会提示点在对象上。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-23 16:28 , Processed in 0.236061 second(s), 46 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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