发现一个错误,没有交点时会出错。已经改正。

- ;|
- 自动将穿过图块的曲线打断 Copyright(C) 1994-2005 KozMos Inc. | All rights reserved
- Revision: 2005/03/26[27]
- 此程序可以编译成ARX后运行在R14.0下,但是由于部分曲线的vlax-intersectwith函数还不成熟,
- 复杂曲线的交点经常会漏掉。因此有可能会出现不可预计的结果。在2004+没有这个问题。
- 命令列表
- ========
- BCUTP: 选取图块
- BCUTP: 点取图块
- 注意: 没有设计错误捕捉函数.
- |;
- (Defun C:BCUTP (/ vllist-divide xsub-block-cut blk osmode pickbox
- highlight)
- (defun vllist-divide (lst n / element item new)
- (foreach element (reverse lst)
- (setq item (cons element item))
- (if (= (length item) n)
- (setq new (cons item new)
- item nil
- )
- )
- )
- new
- )
- (Defun xsub-block-cut (block / ll ur ssx ssp
- curve kkk mindis maxdis minpt maxpt
- i cvv int intx brk idx
- dis pick
- )
- (setq pick (getvar "pickbox"))
- (setvar "pickbox" 0)
- (vla-getboundingbox (vlax-ename->vla-object Block) 'll 'ur)
- (if vlax-safearray->list
- (setq ll (vlax-safearray->list ll)
- ur (vlax-safearray->list ur)
- )
- )
- (if
- (and (setq ll (trans ll 0 1)
- ur (trans ur 0 1)
- )
- (setq
- cvv (ssget "_c" ll ur '((0 . "*line,arc,circle,ellipse")))
- )
- (setq idx -1)
- )
- (progn
- (command "_.Undo" "_Group")
- (command "_.Explode" block)
- (setq ssx (ssget "_p" '((0 . "*line,arc,circle,ellipse")))
- brk nil
- i -1
- )
- (repeat (sslength ssx)
- (setq ssp
- (cons (vlax-ename->vla-object (ssname ssx (setq i (1+ i))))
- ssp
- )
- )
- )
- (repeat (sslength cvv)
- (setq curve (vlax-ename->vla-object
- (ssname cvv (setq idx (1+ idx)))
- )
- kkk nil
- )
- (foreach ssx ssp
- (if
- (and (setq int (vla-intersectwith curve ssx acextendnone))
- vlax-safearray-get-u-bound
- (setq int (vlax-variant-value int))
- (> (vlax-safearray-get-u-bound int 1) 0)
- )
- (setq int (vlax-safearray->list int))
- (setq int nil)
- )
- (if (> (length int) 3)
- (setq intx (vllist-divide int 3))
- (setq intx (list int))
- )
- (foreach int intx
- (if (and int
- (null (member int kkk))
- )
- (setq kkk (cons int kkk))
- )
- )
- )
- (setq brk (cons (cons curve kkk) brk))
- )
- (command "_.Undo" "_End")
- (command "_U")
- (foreach kkk brk
- (setq curve (car kkk)
- kkk (cdr kkk)
- )
- (cond ((= (length kkk) 1)
- (princ)
- )
- ((= (length kkk) 2)
- (setq minpt (car kkk)
- maxpt (cadr kkk)
- )
- )
- (t
- (foreach ssx kkk
- (setq dis (vlax-curve-getDistAtPoint curve ssx))
- (if (or (null mindis)
- (< dis mindis)
- )
- (setq mindis dis
- minpt ssx
- )
- )
- (if (or (null maxdis)
- (> dis maxdis)
- )
- (setq maxdis dis
- maxpt ssx
- )
- )
- )
- )
- )
- (if (and minpt maxpt)
- (command "_.break"
- (list (setq curve (vlax-vla-object->ename curve))
- (trans minpt 0 1)
- )
- (trans maxpt 0 1)
- )
- )
- )
- )
- )
- (setvar "pickbox" pick)
- )
- (command "_.Undo" "_Group")
- (setq osmode (getvar "osmode")
- pickbox (getvar "pickbox")
- highlight (getvar "highlight")
- )
- (setvar "osmode" 0)
- (setvar "pickbox" 5)
- (setvar "highlight" 1)
- (while (and (setq blk (entsel "\n剪除穿过图块的曲线, 请点取图块 <退出>:"))
- (setq blk (car blk))
- (= (cdr (assoc 0 (entget blk))) "INSERT")
- (/= (substr (cdr (assoc 2 (entget blk))) 1 1) "*")
- )
- (xsub-block-cut blk)
- )
- (setvar "osmode" osmode)
- (setvar "pickbox" pickbox)
- (setvar "highlight" highlight)
- (command "_.Undo" "_End")
- (princ)
- )
- (Defun C:BCUTS (/ vllist-divide xsub-block-cut
- sss iii blk osmode
- pickbox highlight
- )
- (defun vllist-divide (lst n / element item new)
- (foreach element (reverse lst)
- (setq item (cons element item))
- (if (= (length item) n)
- (setq new (cons item new)
- item nil
- )
- )
- )
- new
- )
- (Defun xsub-block-cut (block / ll ur ssx ssp
- curve kkk mindis maxdis minpt maxpt
- i cvv int intx brk idx
- dis pick
- )
- (setq pick (getvar "pickbox"))
- (setvar "pickbox" 0)
- (vla-getboundingbox (vlax-ename->vla-object Block) 'll 'ur)
- (if vlax-safearray->list
- (setq ll (vlax-safearray->list ll)
- ur (vlax-safearray->list ur)
- )
- )
- (if
- (and (setq ll (trans ll 0 1)
- ur (trans ur 0 1)
- )
- (setq
- cvv (ssget "_c" ll ur '((0 . "*line,arc,circle,ellipse")))
- )
- (setq idx -1)
- )
- (progn
- (command "_.Undo" "_Group")
- (command "_.Explode" block)
- (setq ssx (ssget "_p" '((0 . "*line,arc,circle,ellipse")))
- brk nil
- i -1
- )
- (repeat (sslength ssx)
- (setq ssp
- (cons (vlax-ename->vla-object (ssname ssx (setq i (1+ i))))
- ssp
- )
- )
- )
- (repeat (sslength cvv)
- (setq curve (vlax-ename->vla-object
- (ssname cvv (setq idx (1+ idx)))
- )
- kkk nil
- )
- (foreach ssx ssp
- (if
- (and (setq int (vla-intersectwith curve ssx acextendnone))
- vlax-safearray-get-u-bound
- (setq int (vlax-variant-value int))
- (> (vlax-safearray-get-u-bound int 1) 0)
- )
- (setq int (vlax-safearray->list int))
- (setq int nil)
- )
- (if (> (length int) 3)
- (setq intx (vllist-divide int 3))
- (setq intx (list int))
- )
- (foreach int intx
- (if (and int
- (null (member int kkk))
- )
- (setq kkk (cons int kkk))
- )
- )
- )
- (setq brk (cons (cons curve kkk) brk))
- )
- (command "_.Undo" "_End")
- (command "_U")
- (foreach kkk brk
- (setq curve (car kkk)
- kkk (cdr kkk)
- )
- (cond ((= (length kkk) 1)
- (princ)
- )
- ((= (length kkk) 2)
- (setq minpt (car kkk)
- maxpt (cadr kkk)
- )
- )
- (t
- (foreach ssx kkk
- (setq dis (vlax-curve-getDistAtPoint curve ssx))
- (if (or (null mindis)
- (< dis mindis)
- )
- (setq mindis dis
- minpt ssx
- )
- )
- (if (or (null maxdis)
- (> dis maxdis)
- )
- (setq maxdis dis
- maxpt ssx
- )
- )
- )
- )
- )
- (if (and minpt maxpt)
- (command "_.break"
- (list (setq curve (vlax-vla-object->ename curve))
- (trans minpt 0 1)
- )
- (trans maxpt 0 1)
- )
- )
- )
- )
- )
- (setvar "pickbox" pick)
- )
- (command "_.Undo" "_Group")
- (setq osmode (getvar "osmode")
- pickbox (getvar "pickbox")
- highlight (getvar "highlight")
- )
- (setvar "osmode" 0)
- (setvar "pickbox" 5)
- (setvar "highlight" 1)
- (if (and (princ "\n剪除穿过图块的曲线, 请选取图块 <退出>:")
- (setq sss (ssget '((0 . "insert"))))
- (setq iii -1)
- )
- (repeat (sslength sss)
- (setq blk (ssname sss (setq iii (1+ iii))))
- (if (/= (substr (cdr (assoc 2 (entget blk))) 1 1) "*")
- (xsub-block-cut blk)
- )
- )
- )
- (setvar "osmode" osmode)
- (setvar "pickbox" pickbox)
- (setvar "highlight" highlight)
- (command "_.Undo" "_End")
- (princ)
- )
|