找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 7944|回复: 32

[求助] 带孤岛判断的批量偏移

[复制链接]

已领礼包: 2476个

财富等级: 金玉满堂

发表于 2013-10-28 12:45:44 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 q3_2006 于 2013-10-28 14:56 编辑

孤岛部分整体外偏。。
请用我的DWG图测试,谢谢!
未命名.JPG

内收外扩000.rar

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

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

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-10-28 13:05:54 | 显示全部楼层
T的个数即为图元所在层数


这个什么意思?

另外,你上图的红线是偏移后的? 怎么有的红线外偏,有的白色线又在外面?

点评

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

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-10-28 13:15:06 | 显示全部楼层
newer 发表于 2013-10-28 13:05
这个什么意思?

另外,你上图的红线是偏移后的? 怎么有的红线外偏,有的白色线又在外面?

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

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-10-28 13:15:45 | 显示全部楼层
本帖最后由 q3_2006 于 2013-10-28 13:23 编辑

孤岛判断是难点。。。看填充的图好理解,也就是所有孤岛的位置同时向岛外偏移X。。。。我的理解:如果最外层为第一层,凡是奇数层就外偏,偶数层就内偏。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-10-28 13:43:49 | 显示全部楼层
下面代码模拟了你的要求,距离没判断合法,不要超过里面的多段线不能接受的范围。

xdtb_hatchoffset.gif


游客,如果您要查看本帖隐藏内容请回复

点评

处理好几层的孤岛,还是要分组的。。。  详情 回复 发表于 2013-10-28 16:34
猪脑子 。。。刚被水哥点通。。  详情 回复 发表于 2013-10-28 14:49
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-10-28 13:47:05 | 显示全部楼层
上面的程序,填充没有边界也行。

点评

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

使用道具 举报

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

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-10-28 14:49:58 | 显示全部楼层
newer 发表于 2013-10-28 13:43
下面代码模拟了你的要求,距离没判断合法,不要超过里面的多段线不能接受的范围。

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

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-10-28 16:31:01 | 显示全部楼层
newer 发表于 2013-10-28 13:47
上面的程序,填充没有边界也行。
  1. (defun c:tt (/ OffsetCurve curveInCurve GroupToOne d ss el lst)
  2.   (defun OffsetCurve (e d / lastent)
  3.     (setq lastent (entlast))
  4.     (vl-catch-all-apply
  5.       '(lambda () (vla-offset (vlax-ename->vla-object e) d))
  6.     ) ;_防止间隙过小
  7.     (if  (not (equal (entlast) lastent))
  8.       (xdrx_setpropertyvalue (entlast) "Color" 4)
  9.     )
  10.   )
  11.   ;;(< Area1 Area2)
  12.   (defun CurveInCurve (e1 e2 / lst)
  13.     (and (setq lst (xdrx_curve_intersect e2 e1))
  14.    (= (length (car lst)) (length lst) 1)
  15.    (equal  (abs (apply 'xdrx_points_area (caar lst)))
  16.     (apply 'xdrx_points_area (xdrx_getsamplept e1))
  17.     1.
  18.    )
  19.     )
  20.   )
  21.   ;;批量处理时分组
  22.   (defun GroupToOne (lst / ll tf)
  23.     (while lst
  24.       (if ll
  25.   (if (not (car (vl-remove 't
  26.          (mapcar '(lambda (a)
  27.               (vl-position (car lst) a)
  28.             )
  29.            ll
  30.          )
  31.           )
  32.      )
  33.       )
  34.     (progn
  35.       (mapcar '(lambda (x)
  36.            (if (curveincurve (car lst) (last x))
  37.        (setq ll (subst (cons (car lst) x) x ll)
  38.              tf t
  39.        )
  40.            )
  41.          )
  42.         ll
  43.       )
  44.       (if  (not tf)
  45.         (setq ll (cons (list (car lst)) ll))
  46.       )
  47.     )
  48.     (setq ll (cons (list (car lst)) ll))
  49.   )
  50.   (setq ll (list (list (car lst))))
  51.       )
  52.       (setq lst  (cdr lst)
  53.       tf  nil
  54.       )
  55.     )
  56.     ll
  57.   )
  58.   (if (and (or (setq
  59.      d (getdist (strcat "\nSpace dist<"
  60.             (rtos (getvar "offsetdist") 2 3)
  61.             ">: "
  62.           )
  63.        )
  64.          )
  65.          (and (or (null d) (minusp (getvar "offsetdist")))
  66.         (setq d 1.5)
  67.          )
  68.          (setq d (getvar "offsetdist"))
  69.      )
  70.      (setvar "offsetdist" d)
  71.      (setq ss (ssget '((-4 . "<or")
  72.            (0 . "circle")
  73.            (0 . "*polyline")
  74.            (-4 . "&=")
  75.            (70 . 1)
  76.            (-4 . "or>")
  77.           )
  78.         )
  79.      )
  80.       )
  81.     (progn
  82.       (XD::Begin)
  83.       (xdrx_document_ucsoff)
  84.       ;;(xdrx_curve_removedup ss) ;_消重
  85.       (setq el (xdrx_pickset->ents ss))
  86.       (mapcar '(lambda (e)
  87.      (if (= (xdrx_getpropertyvalue e "IsA") "AcDbPolyline")
  88.        (progn
  89.          (xdrx_polyline_compress e) ;_消除重点
  90.          (and (minusp (apply 'xdrx_points_area
  91.            (xdrx_entity_getstretchpoint e)
  92.           )
  93.         )
  94.         (xdrx_curve_reverse e) ;_统一逆时针
  95.          )
  96.        )
  97.      )
  98.          )
  99.         el
  100.       )
  101.       (setq el  (vl-sort el
  102.        '(lambda (e1 e2)
  103.           (> (car (xdrx_getarea e1))
  104.              (car (xdrx_getarea e2))
  105.           )
  106.         )
  107.     ) ;_按面积大小排序
  108.       lst  (GroupToOne el)
  109.       )
  110.       ;;(xdrx_undostart)
  111.       (mapcar
  112.   '(lambda (x / b c tf l ll)
  113.      (cond
  114.        ((= (length x) 1)
  115.         (OffsetCurve (car x) d)
  116.        )
  117.        ((= (length x) 2)
  118.         (OffsetCurve (car x) (- d))
  119.         (OffsetCurve (cadr x) d)
  120.        )
  121.        (t
  122.         (OffsetCurve (last x) d)
  123.         (while x
  124.     (setq c  (car x)
  125.           b  (cdr x)
  126.     )
  127.     (while b
  128.       (if (curveincurve c (car b))
  129.         (setq l (cons c l))
  130.       )
  131.       (setq b (cdr b))
  132.     )
  133.     (setq x   (cdr x)
  134.           ll (cons l ll)
  135.           l   nil
  136.     )
  137.         ) ;_组内是面积由小到大
  138.         (mapcar '(lambda (a)
  139.        (if (zerop (rem (1- (length a)) 2))
  140.          (OffsetCurve (last a) (- d))
  141.          (OffsetCurve (last a) d)
  142.        )
  143.            )
  144.           (vl-remove nil ll)
  145.         )
  146.        ) ;_ t分组后由内向外
  147.      ) ;_end cond
  148.    ) ;_ end lambda
  149.   lst
  150.       ) ;_mapcar
  151.       ;;(xdrx_undoend)
  152.       (xdrx_document_ucson)
  153.       (XD::End)
  154.     )
  155.   )
  156.   (princ)
  157. )
这是E大的。。处理得很好。。。

点评

这个能不能把偏移出来的线修改成别的层呢?  详情 回复 发表于 2015-12-19 09:02
这个里面没有交叉情况,只需要用 Xdrx_curve_intersect 判断,不需要 CurveInCurve 函数的,下面是修改后的程序  详情 回复 发表于 2013-10-29 08:38
是不是还可以优化?  详情 回复 发表于 2013-10-28 17:20
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-10-28 16:34:01 | 显示全部楼层
newer 发表于 2013-10-28 13:43
下面代码模拟了你的要求,距离没判断合法,不要超过里面的多段线不能接受的范围。

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-28 17:18:54 来自手机 | 显示全部楼层
要考虑多层嵌套情况,仅一层很简单的
还有可能里面有circle
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-28 17:20:38 来自手机 | 显示全部楼层
q3_2006 发表于 2013-10-28 16:31
这是E大的。。处理得很好。。。

是不是还可以优化?

点评

多层嵌套。。。好晕呀。。一层填充轻松搞定!  详情 回复 发表于 2013-10-28 17:45
是还可以优化。。  详情 回复 发表于 2013-10-28 17:42
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-10-28 17:42:37 | 显示全部楼层
st788796 发表于 2013-10-28 17:20
是不是还可以优化?

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

使用道具 举报

已领礼包: 2476个

财富等级: 金玉满堂

 楼主| 发表于 2013-10-28 17:45:07 | 显示全部楼层
st788796 发表于 2013-10-28 17:20
是不是还可以优化?

多层嵌套。。。好晕呀。。一层填充轻松搞定!

点评

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-10-28 17:49:51 来自手机 | 显示全部楼层
本帖最后由 st788796 于 2013-10-28 17:55 编辑
q3_2006 发表于 2013-10-28 17:45
多层嵌套。。。好晕呀。。一层填充轻松搞定!


一层的就不用写那么复杂了
分好组,组内最大外偏,里面都是内偏
要少N多判断,效率高很多了
感觉E大的在分组时还可以优化

点评

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 02:53 , Processed in 0.495026 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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