soly2006 发表于 2013-1-7 23:37:14

怎么才能像刀一样切开封闭的多段线?

最近用到分割多段线的功能,看似简单却在使用break时,总是断在不该断的地方,如图,高手帮忙看怎么处理?切开前多段线是一封闭线,切开后分成两半也是封闭线。


中间不拐弯,切开一条线也成。


阿然 发表于 2013-1-7 23:37:15


好吧,写了一个,难点我觉得是找一个点,这个点能位于闭合圈内
(vl-load-com)
(setvar "cmdecho" 0)
(setq *AcadDoc* (vla-get-ActiveDocument (vlax-get-Acad-Object)))
(setq *MoSpace* (vla-get-ModelSpace *AcadDoc*))

(defun c:tt (/ ss vlalst ss1 Centroid region1 region2)
(if (and (setq ss (ssget '((0 . "LWPOLYLINE"))))
   (= (sslength ss) 2)
      )
    (progn
      (vla-startundomark *acaddoc*)
      (setq vlalst (lm:ss->vla ss))
      (if (member T (mapcar 'vlax-curve-isclosed vlalst))
(progn
    (setqregion1 (car
       (vlax-safearray->list
         (vlax-variant-value
         (vla-addregion
             *mospace*
             (Xr:list->Obj-Array vlalst)
         )
         )
       )
         )
    )
    (setqCentroid (vlax-safearray->list
         (vlax-variant-value
         (vlax-get-property region1 'Centroid)
         )
       )
    )
    (command "-boundary" "A" "B" "N" SS "" "" Centroid "")
    (setq ss1 (ssget "L"))
    (setq vlalst (lm:ss->vla ss1))
    (setqregion2 (car
       (vlax-safearray->list
         (vlax-variant-value
         (vla-addregion
             *mospace*
             (Xr:list->Obj-Array vlalst)
         )
         )
       )
         )
    )
          (vlax-invoke-method region1 'Boolean 2 region2)
    (setqCentroid (vlax-safearray->list
         (vlax-variant-value
         (vlax-get-property region1 'Centroid)
         )
       )
    )
    (command "-boundary" "A" "B" "N" SS "" "" Centroid "")
    (vla-erase region1)
    (command "_.erase" ss "")
    (setq ss nil)
    (setq ss1 nil)
    (princ)
)
(progn
    (princ "\n没有闭合线")
    (princ)
)
      )
      (vla-endundomark *acaddoc*)
    )
    (progn
      (princ "\n只能选择2条多义线")
      (princ)
    )
)
)


(defun Xr:list->Obj-Array (objList / arraySpace sArray)
(setqarraySpace
   (vlax-make-safearray
   vlax-vbObject    ; 元素类型
   (cons 0
   (1- (length objList))
   )      ; 数组维数
   )
)
(setq sArray (vlax-safearray-fill arraySpace objList))
)

(defun LM:ss->vla (ss / i l)
;; ?Lee Mac 2010
(if ss
    (repeat (setq i (sslength ss))
      (setq
l (cons(vlax-ename->vla-object (ssname ss (setq i (1- i))))
    l
    )
      )
    )
)
)

阿然 发表于 2013-1-7 23:52:34

本帖最后由 阿然 于 2013-1-8 00:00 编辑

用boundary,然后点中间两个点不行么?
(command "-boundary" (getpoint) (getpoint) "")

soly2006 发表于 2013-1-7 23:58:35

阿然 发表于 2013-1-7 23:52 static/image/common/back.gif
用boundary,然后点中间两个点不行么?

图面没那么干净,还有其他杂质在。

阿然 发表于 2013-1-8 00:00:55

soly2006 发表于 2013-1-7 23:58 static/image/common/back.gif
图面没那么干净,还有其他杂质在。

那就是说要选中闭合线和你的刀,然后生成两个?

soly2006 发表于 2013-1-8 00:08:19

阿然 发表于 2013-1-8 00:00 static/image/common/back.gif
那就是说要选中闭合线和你的刀,然后生成两个?

1,boundary
2、按钮->选择两个实体
3、按钮->点两点
4、删除原线和切割线
5、附属性和图层
------------------这么多步骤,你让lisp情何以堪。
呵呵,谢谢关注.

阿然 发表于 2013-1-8 00:10:18

(command "-boundary" "a" "b" "n" (ssget) "" "" (getpoint) (getpoint) "")
哈哈哈哈,很偷懒的做法

soly2006 发表于 2013-1-8 10:19:23

阿然 发表于 2013-1-8 01:15 static/image/common/back.gif
好吧,写了一个,难点我觉得是找一个点,这个点能位于闭合圈内

就是这效果,感谢。 剩下的就是加图层信息和扩展码。
这分给你。

bai2000 发表于 2013-1-8 23:51:01

哈哈,能不能进一步:切割多个图元并成两个块(组)

tianyi1230 发表于 2013-1-9 22:08:03

加载了没有其效果演示的那样
页: [1] 2
查看完整版本: 怎么才能像刀一样切开封闭的多段线?