请帮忙看看这个trim的lisp问题出在哪里:
本帖最后由 mandala 于 2011-1-9 23:12 编辑画一条pline,剪切掉被pline围住的多段线、直线、圆弧或者曲线,如图:
(defun c:trm (/ e1 elist trn en p1 p2 ss p3 n )
(setvar "osmode" 0)
(command "_.pline")
(while (= 1 (getvar "cmdactive"))(command pause))
(setq e1 (entlast))
(setq elist (entget e1))
(setq trn (cdr (assoc -1 elist)))
(setq en (vlax-ename->vla-object trn))
(vla-getboundingbox en 'p1 'p2)
(setq p1 (vlax-safearray->list p1)
p2 (vlax-safearray->list p2)
)
(setq ss (ssget "c" p1 p2))
(setq p3 (mapcar '(lambda (x y) (/ (+ x y) 2.0)) (vlax-curve-getEndPoint e1) (vlax-curve-getstartPoint e1)));;p3为pline头尾连线的中点
(setq n -1)
(repeat (sslength ss)
(setq en (ssname ss (setq n (1+ n))))
(if (not (eq en trn))
(command "trim" e1 "" (list en p3) "")
)
)
(entdel e1)
)问题是这个lisp有时候灵有时候不灵,汗一个。应该是通过ssget来获取与pline相交的图元时,方式不对,因为如果pline画得比较斜的话,trim就剪切得不对。请帮我看看问题出在哪里呢?另外有没有更好的方法来实现呢?
我一个圆弧画管的程序也类似,把人逼疯了。上传帮看看,也是剪切不可预测。
在2006以前的版本上还行,2008就疯了。 回复 mandala 的帖子
猜测:(setvar "edgemode" 1).不对勿怪。 本帖最后由 mandala 于 2011-1-9 23:07 编辑
谢谢,不过不是这个原因。 本帖最后由 qjchen 于 2011-1-9 23:13 编辑
:)
测试了一下程序,程序挺有意思的。主要是不清楚楼主程序的目的。假如是用一个PL来切其他图形(一个或者多个的话),为什么用boundingbox,其实取出多段线的3个点,用f的选择模式而不是c模式会更好。 (list en p3) 中的p3,也可以考虑用PL和物体相交得到的交点Parameter来反算。
本帖最后由 mandala 于 2011-1-9 23:29 编辑
回复 qjchen 的帖子
也曾经想过你说的这个办法,但是水平有限,总是写不好。主要问题是f的选择模式,f线该怎么画呢,就是pline本身的这条线吗,还是要在pl里边作一条平行线?下边这段是pl本身,结果很糟;也写过作条平行线来 f ,结果也不理想。 (defun c:tt(/ e1obj plist pp n p1)
(setvar "osmode" 0)
(command "_.pline")
(while (= 1 (getvar "cmdactive"))(command pause))
(setq e1 (entlast))
(setq obj (vlax-ename->vla-object e1))
(setq plist (vlax-safearray->list
(vlax-variant-value
(vla-get-coordinates obj))))
(setq n 0)
(repeat (/ (length plist) 2)
(setq pp (append pp (list (list (nth n plist)(nth (1+ n) plist)))))
(setq n (+ n 2))
)
(setq n 0)
(command "trim" e1 "" "f")
(repeat (/ (length plist) 2)
(setq p1 (nth n pp))
(commandp1)
(setq n (1+ n))
)
(command """")
(entdel e1)
) 本帖最后由 qjchen 于 2011-1-10 09:56 编辑
(command "trim" e1 "" "f") 这句话不应该这样写,应该是先构建f选择集,再处理的,手头没有ACAD,无法调试,给一些其他的建议吧.:)
个人说的F是选择模式的意思,就是你在CAD中,键入命令 select之后,你按个C看看,按个F看看
另,这个问题不知道楼主是否想这样
画一个PL(个人建议是封闭的,否则不知道内外之分),然后修剪其内所有的物体
那么这个程序要仔细编好的话,是需要挺多时间的,
可以试试 http://bbs.mjtd.com/forum.php?mo ... hlight=%C7%F8%D3%F2 中提到的express tools里的extrim命令.
这个晓东的snsj版主是编过一个 http://www.xdcad.net/forum/showthread.php?postid=1032386
假如想全部自己编,比较好的做法最好是不用trim,因为这个命令要构建出物体和选择点会比较麻烦些
可以用break,将被此PLINE的顶点构成的点集用F模式(ssget 的F模式,更好应该用CP模式)选中的物体,在交点打断(此时,必须用intersectwith函数来得到交点),再删除位于PLINE点集内的物体
网上也有一些相关的代码
王咣生 版主提过的
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=25339&highlight=%C7%F8%D3%F2
如.net 版飞狐版主的 http://bbs.mjtd.com/forum.php?mo ... hlight=%D0%DE%BC%F4
根据多边形顶点进行选择的,可参考一下
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=26393&highlight=%C7%F8%D3%F2
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=26393&highlight=%C7%F8%D3%F2
http://www.xdcad.net/forum/showt ... splay=&pagenumber=1
也可以在 mjtd中查找 区域 或者 修剪,你会发现许多好文章的
比如Highflybird兄的 http://bbs.mjtd.com/forum.php?mod=viewthread&tid=56244&highlight=%C7%F8%D3%F2
回复 qjchen 的帖子
回复很有深度,感觉像科研论文 回复 qjchen 的帖子
谢谢,我研究一下。 本帖最后由 mandala 于 2011-1-11 00:06 编辑
没研究出来什么结果。查了一下,这似乎是个老大难问题了,研究的人很多,但没什么完美的lsp。另外cad的“F”选择模式还是有问题的,对虚线不灵,如果“F”划中虚线的空白部分时就选不中。即使是express里边的extrim.lsp也一样。而我要这个lsp主要就是针对虚线的,晕。
现在我火大了就直接把extrim拿过来,改成先画线后剪切,方向点直接定为中点,为提高速度再删掉那些zoom的语句,把regenmode设为0,最后把ltscale设成一万……这样总划不中虚线的空挡了吧!!!
现在正厚颜无耻地将就用着,速度是稍微慢了点,也还能忍受。各位老大,能再帮帮忙想想办法吗?最好是能把1楼的程序优化一番? 给个用BREAK的。
;用BREAK打断线条 明经 ZZXXQQ 2011.1.10
(defun c:trm (/ e1 elist trn en p1 p2 ss p3 n )
(setvar "CMDECHO" 0)
(setvar "OSMODE" 0)
(command "_.UNDO" "BE")
(if (and (setq s1 (entsel "\n选择线条 :"))
(setq b (getdist "\n打断宽度 :"))) (progn
(setq ent (entget(car s1)))
(if (assoc 6 ent)
(setq ltn (cdr(assoc 6 ent))
ent1 (subst '(6 . "CONTINUOUS") (assoc 6 ent) ent))
(setq ln (cdr(assoc 8 ent))
ent1 (subst '(8 . "0") (assoc 8 ent) ent))
)
(entmod ent1)
(setq pt1 (osnap (cadr s1) "NEA")
ang (+ (/ pi 2) (angle pt1 (cadr s1)))
pt2 (polar pt1 ang (/ b 2))
pt1 (polar pt2 (+ ang pi) b))
(command "_.BREAK" s1 "F" pt1 pt2)
(if (assoc 6 ent)
(command "_.CHPROP" s1 "L" "" "LT" ltn "")
(command "_.CHPROP" s1 "L" "" "LA" ln "")
)
))
(setvar "CMDECHO" 1)
(princ)
)
页:
[1]
2