明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3194|回复: 11

[函数] 请帮忙看看这个trim的lisp问题出在哪里:

  [复制链接]
发表于 2011-1-9 22:16 | 显示全部楼层 |阅读模式
本帖最后由 mandala 于 2011-1-9 23:12 编辑

画一条pline,剪切掉被pline围住的多段线、直线、圆弧或者曲线,如图:




  1. (defun c:trm (/ e1 elist trn en p1 p2 ss p3 n )
  2.   
  3.   (setvar "osmode" 0)
  4. (command "_.pline")
  5. (while (= 1 (getvar "cmdactive"))(command pause))
  6.   (setq e1 (entlast))
  7.   (setq elist (entget e1))
  8.   (setq trn (cdr (assoc -1 elist)))
  9.   (setq en (vlax-ename->vla-object trn))
  10.   (vla-getboundingbox en 'p1 'p2)
  11.   (setq p1 (vlax-safearray->list p1)
  12.            p2 (vlax-safearray->list p2)
  13.   )
  14.   (setq ss (ssget "c" p1 p2))
  15.   (setq p3 (mapcar '(lambda (x y) (/ (+ x y) 2.0)) (vlax-curve-getEndPoint e1) (vlax-curve-getstartPoint e1)));;p3为pline头尾连线的中点
  16.   (setq n -1)
  17.       (repeat (sslength ss)
  18.               (setq en (ssname ss (setq n (1+ n))))
  19.           (if (not (eq en trn))
  20.                (command "trim" e1 "" (list en p3) "")
  21.           )
  22.       )
  23. (entdel e1)
  24. )
问题是这个lisp有时候灵有时候不灵,汗一个。应该是通过ssget来获取与pline相交的图元时,方式不对,因为如果pline画得比较斜的话,trim就剪切得不对。请帮我看看问题出在哪里呢?另外有没有更好的方法来实现呢?

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2017-12-20 15:19 | 显示全部楼层
我一个圆弧画管的程序也类似,把人逼疯了。上传帮看看,也是剪切不可预测。
在2006以前的版本上还行,2008就疯了。

本帖子中包含更多资源

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

x
发表于 2011-1-9 22:51 | 显示全部楼层
回复 mandala 的帖子

猜测:(setvar "edgemode" 1).不对勿怪。
 楼主| 发表于 2011-1-9 23:03 | 显示全部楼层
本帖最后由 mandala 于 2011-1-9 23:07 编辑

谢谢,不过不是这个原因。
发表于 2011-1-9 23:13 | 显示全部楼层
本帖最后由 qjchen 于 2011-1-9 23:13 编辑

:)
测试了一下程序,程序挺有意思的。主要是不清楚楼主程序的目的。假如是用一个PL来切其他图形(一个或者多个的话),为什么用boundingbox,其实取出多段线的3个点,用f的选择模式而不是c模式会更好。 (list en p3) 中的p3,也可以考虑用PL和物体相交得到的交点Parameter来反算。

 楼主| 发表于 2011-1-9 23:23 | 显示全部楼层
本帖最后由 mandala 于 2011-1-9 23:29 编辑

回复 qjchen 的帖子

也曾经想过你说的这个办法,但是水平有限,总是写不好。主要问题是f的选择模式,f线该怎么画呢,就是pline本身的这条线吗,还是要在pl里边作一条平行线?下边这段是pl本身,结果很糟;也写过作条平行线来 f ,结果也不理想。
  1. (defun c:tt(/ e1  obj plist pp n p1)
  2. (setvar "osmode" 0)
  3. (command "_.pline")
  4. (while (= 1 (getvar "cmdactive"))(command pause))
  5.   (setq e1 (entlast))
  6. (setq obj (vlax-ename->vla-object e1))
  7.   (setq plist (vlax-safearray->list
  8.   (vlax-variant-value
  9.     (vla-get-coordinates obj))))
  10.     (setq n 0)
  11.   (repeat (/ (length plist) 2)
  12.     (setq pp (append pp (list (list (nth n plist)(nth (1+ n) plist)))))
  13.     (setq n (+ n 2))
  14.   )
  15. (setq n 0)
  16. (command "trim" e1 "" "f")
  17. (repeat (/ (length plist) 2)
  18. (setq p1 (nth n pp))
  19. (command  p1)
  20. (setq n (1+ n))
  21. )
  22. (command """")
  23. (entdel e1)

  24. )
发表于 2011-1-10 09:45 | 显示全部楼层
本帖最后由 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



发表于 2011-1-10 13:03 | 显示全部楼层
回复 qjchen 的帖子

回复很有深度,感觉像科研论文
 楼主| 发表于 2011-1-10 14:02 | 显示全部楼层
回复 qjchen 的帖子

谢谢,我研究一下。
 楼主| 发表于 2011-1-10 20:00 | 显示全部楼层
本帖最后由 mandala 于 2011-1-11 00:06 编辑

没研究出来什么结果。查了一下,这似乎是个老大难问题了,研究的人很多,但没什么完美的lsp。另外cad的“F”选择模式还是有问题的,对虚线不灵,如果“F”划中虚线的空白部分时就选不中。即使是express里边的extrim.lsp也一样。而我要这个lsp主要就是针对虚线的,晕。

现在我火大了就直接把extrim拿过来,改成先画线后剪切,方向点直接定为中点,为提高速度再删掉那些zoom的语句,把regenmode设为0,最后把ltscale设成一万……这样总划不中虚线的空挡了吧!!!

现在正厚颜无耻地将就用着,速度是稍微慢了点,也还能忍受。各位老大,能再帮帮忙想想办法吗?最好是能把1楼的程序优化一番?
发表于 2011-1-10 23:20 | 显示全部楼层
给个用BREAK的。
  1. ;用BREAK打断线条 明经 ZZXXQQ 2011.1.10
  2. (defun c:trm (/ e1 elist trn en p1 p2 ss p3 n )
  3. (setvar "CMDECHO" 0)
  4. (setvar "OSMODE" 0)
  5. (command "_.UNDO" "BE")
  6. (if (and (setq s1 (entsel "\n选择线条 :"))
  7.           (setq b (getdist "\n打断宽度 :"))) (progn
  8.   (setq ent (entget(car s1)))
  9.   (if (assoc 6 ent)
  10.    (setq ltn (cdr(assoc 6 ent))
  11.    ent1 (subst '(6 . "CONTINUOUS") (assoc 6 ent) ent))
  12.    (setq ln (cdr(assoc 8 ent))
  13.    ent1 (subst '(8 . "0") (assoc 8 ent) ent))
  14.   )
  15.   (entmod ent1)
  16.   (setq pt1 (osnap (cadr s1) "NEA")
  17.         ang (+ (/ pi 2) (angle pt1 (cadr s1)))
  18.         pt2 (polar pt1 ang (/ b 2))
  19.         pt1 (polar pt2 (+ ang pi) b))
  20.   (command "_.BREAK" s1 "F" pt1 pt2)
  21.   (if (assoc 6 ent)
  22.    (command "_.CHPROP" s1 "L" "" "LT" ltn "")
  23.    (command "_.CHPROP" s1 "L" "" "LA" ln "")
  24.   )
  25. ))
  26. (setvar "CMDECHO" 1)
  27. (princ)
  28. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-26 11:19 , Processed in 0.546524 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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