q3_2006 发表于 2013-10-28 12:45:44

带孤岛判断的批量偏移

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

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

newer 发表于 2013-10-28 13:05:54

T的个数即为图元所在层数

这个什么意思?

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

q3_2006 发表于 2013-10-28 13:15:06

newer 发表于 2013-10-28 13:05
这个什么意思?

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

就是要这样呀。。带孤岛判断 。。。

q3_2006 发表于 2013-10-28 13:15:45

本帖最后由 q3_2006 于 2013-10-28 13:23 编辑

孤岛判断是难点。。。看填充的图好理解,也就是所有孤岛的位置同时向岛外偏移X。。。。我的理解:如果最外层为第一层,凡是奇数层就外偏,偶数层就内偏。。。

newer 发表于 2013-10-28 13:43:49

下面代码模拟了你的要求,距离没判断合法,不要超过里面的多段线不能接受的范围。




**** Hidden Message *****

newer 发表于 2013-10-28 13:47:05

上面的程序,填充没有边界也行。

xyp1964 发表于 2013-10-28 14:13:05


q3_2006 发表于 2013-10-28 14:49:58

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




猪脑子 。。。刚被水哥点通。。{:soso_e110:}

q3_2006 发表于 2013-10-28 16:31:01

newer 发表于 2013-10-28 13:47
上面的程序,填充没有边界也行。

(defun c:tt (/ OffsetCurve curveInCurve GroupToOne d ss el lst)
(defun OffsetCurve (e d / lastent)
    (setq lastent (entlast))
    (vl-catch-all-apply
      '(lambda () (vla-offset (vlax-ename->vla-object e) d))
    ) ;_防止间隙过小
    (if(not (equal (entlast) lastent))
      (xdrx_setpropertyvalue (entlast) "Color" 4)
    )
)
;;(< Area1 Area2)
(defun CurveInCurve (e1 e2 / lst)
    (and (setq lst (xdrx_curve_intersect e2 e1))
   (= (length (car lst)) (length lst) 1)
   (equal(abs (apply 'xdrx_points_area (caar lst)))
    (apply 'xdrx_points_area (xdrx_getsamplept e1))
    1.
   )
    )
)
;;批量处理时分组
(defun GroupToOne (lst / ll tf)
    (while lst
      (if ll
(if (not (car (vl-remove 't
         (mapcar '(lambda (a)
            (vl-position (car lst) a)
            )
         ll
         )
          )
   )
      )
    (progn
      (mapcar '(lambda (x)
         (if (curveincurve (car lst) (last x))
       (setq ll (subst (cons (car lst) x) x ll)
             tf t
       )
         )
         )
      ll
      )
      (if(not tf)
      (setq ll (cons (list (car lst)) ll))
      )
    )
    (setq ll (cons (list (car lst)) ll))
)
(setq ll (list (list (car lst))))
      )
      (setq lst(cdr lst)
      tfnil
      )
    )
    ll
)
(if (and (or (setq
   d (getdist (strcat "\nSpace dist<"
            (rtos (getvar "offsetdist") 2 3)
            ">: "
          )
       )
         )
         (and (or (null d) (minusp (getvar "offsetdist")))
      (setq d 1.5)
         )
         (setq d (getvar "offsetdist"))
   )
   (setvar "offsetdist" d)
   (setq ss (ssget '((-4 . "<or")
         (0 . "circle")
         (0 . "*polyline")
         (-4 . "&=")
         (70 . 1)
         (-4 . "or>")
          )
      )
   )
      )
    (progn
      (XD::Begin)
      (xdrx_document_ucsoff)
      ;;(xdrx_curve_removedup ss) ;_消重
      (setq el (xdrx_pickset->ents ss))
      (mapcar '(lambda (e)
   (if (= (xdrx_getpropertyvalue e "IsA") "AcDbPolyline")
       (progn
         (xdrx_polyline_compress e) ;_消除重点
         (and (minusp (apply 'xdrx_points_area
         (xdrx_entity_getstretchpoint e)
          )
      )
      (xdrx_curve_reverse e) ;_统一逆时针
         )
       )
   )
         )
      el
      )
      (setq el(vl-sort el
       '(lambda (e1 e2)
          (> (car (xdrx_getarea e1))
             (car (xdrx_getarea e2))
          )
      )
    ) ;_按面积大小排序
      lst(GroupToOne el)
      )
      ;;(xdrx_undostart)
      (mapcar
'(lambda (x / b c tf l ll)
   (cond
       ((= (length x) 1)
      (OffsetCurve (car x) d)
       )
       ((= (length x) 2)
      (OffsetCurve (car x) (- d))
      (OffsetCurve (cadr x) d)
       )
       (t
      (OffsetCurve (last x) d)
      (while x
    (setq c(car x)
          b(cdr x)
    )
    (while b
      (if (curveincurve c (car b))
      (setq l (cons c l))
      )
      (setq b (cdr b))
    )
    (setq x   (cdr x)
          ll (cons l ll)
          l   nil
    )
      ) ;_组内是面积由小到大
      (mapcar '(lambda (a)
       (if (zerop (rem (1- (length a)) 2))
         (OffsetCurve (last a) (- d))
         (OffsetCurve (last a) d)
       )
         )
          (vl-remove nil ll)
      )
       ) ;_ t分组后由内向外
   ) ;_end cond
   ) ;_ end lambda
lst
      ) ;_mapcar
      ;;(xdrx_undoend)
      (xdrx_document_ucson)
      (XD::End)
    )
)
(princ)
)这是E大的。。处理得很好。。。

q3_2006 发表于 2013-10-28 16:34:01

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




处理好几层的孤岛,还是要分组的。。。

st788796 发表于 2013-10-28 17:18:54

要考虑多层嵌套情况,仅一层很简单的
还有可能里面有circle

st788796 发表于 2013-10-28 17:20:38

q3_2006 发表于 2013-10-28 16:31
这是E大的。。处理得很好。。。

是不是还可以优化?

q3_2006 发表于 2013-10-28 17:42:37

st788796 发表于 2013-10-28 17:20
是不是还可以优化?

是还可以优化。。

q3_2006 发表于 2013-10-28 17:45:07

st788796 发表于 2013-10-28 17:20
是不是还可以优化?

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

st788796 发表于 2013-10-28 17:49:51

本帖最后由 st788796 于 2013-10-28 17:55 编辑

q3_2006 发表于 2013-10-28 17:45
多层嵌套。。。好晕呀。。一层填充轻松搞定!

一层的就不用写那么复杂了
分好组,组内最大外偏,里面都是内偏
要少N多判断,效率高很多了
感觉E大的在分组时还可以优化
页: [1] 2 3
查看完整版本: 带孤岛判断的批量偏移