张和平 发表于 2013-3-26 18:02:58

批量框剪小程序源码(更新至V2.0.0)

本帖最后由 张和平 于 2013-4-28 01:11 编辑

第⑥次更新(2013/04/28)========================================
最近工作很忙,一直都没有更新,趁加班结束更新一下。
这次采用了express tools的etrim函数,所以对圆柱和方柱都是适用的,对于狭长的矩形也能胜任。
但是,使用有前提,就是你必须先装了express tools.(未在未装express tools的机子上测试,大家可以测试一下。)
这个版本有很多有待改进,但是先扔个适用版吧,急用的同学可以拿去用。
注意:和上一版本不同,这一版本只提供选择剪切边所在图层,未提供选择被剪切图元所在图层,因此,在操作前请自行关闭或者锁定不想被剪切的图层。下一版本中应该会完善这个功能。


第⑤次更新(2013/03/27)========================================
增加了选择“剪切边对应图层和待剪切图元对应图层”的功能。

第④次更新=================================================
请教大神们,如何选取块里的pline线作为剪切边啊。。
选择的时候加上条件(0 . "LWPOLYLINE")的话就只能选择块外的pline了,而块里pline将随块一同被忽略了。
好是纠结的问题啊。
CAD自带的剪切命令是可以单独选择块里的某个图元的,这个是怎么实现的呀?
第③次更新=================================================   
原理加入如下程序抑制一下就可以了。。。(setvar "cmdecho" 0)
第②次更新=================================================
回家之后又仔细看了一下,发现了问题的所在,解决后的源码详见2楼。问题发生的原因是,如下命令后(command ".trim" end "")
   (repeat (setq n (sslength ss))
   (command (list(ssname ss (setq n (1- n))) midp))
   )CAD提示:选择要修剪的对象,或按住 Shift 键选择要延伸的对象,或 [投影(P)/边(E)/放弃(U)]:不知道是trim这个命令段写得不对还是其他原因,我的解决办法是加上了下面这行:(COMMAND "")模拟CAD中按一下空格或按一下enter或按一下ESC退出当前的状态。
但是,目前还存在的不足是,程序选择的是块之外的pline线,这些pline线可以是闭合的也可以是不闭合的,存在于块中的pline线则没有选中。
接下去就要解决这些个问题了。有知道的大神也请赐教一下哈。。。
第①次更新==以下内容为首发帖子标题为【这个框剪程序为什么不能批量????】时的帖子正文2013.03.26==
今天拼编了一个框剪的小程序,源码如下:但是这个程序却不能实现批量,纳闷中。请各位大神帮忙看看,分析一下是什么原因。(defun C:TTR( / en end end_data pmin pmax minp maxp minx miny maxx maxy m n ss midp i)
(vl-load-com)
(princ "\n请选择闭合pline:")
(while(null(setq en (ssget'((0 . "LWPOLYLINE")))))); (70 . 1)
(setq i 0)
(repeat (setq m (sslength en))
   ;(setq end (ssname en (setq m (1- m))))
   (setq end (ssname en i))
   (setq end_data (entget end))
   (ttrMin_Max)
   (setq midp (mapcar '* '(0.5 0.5 0.5) (mapcar '+ pmin pmax)))
   (setq ss (ssget "c" Pmin Pmax))
   (ssdel end ss)
   (command ".trim" end "")
   (repeat (setq n (sslength ss))
   (command (list (ssname ss (setq n (1- n))) midp))
   )
   (setq i (1+ i))
)
(COMMAND "")
(princ "完成!")
)

(defun ttrMin_Max()
(vla-getboundingbox(vlax-ename->vla-object end) 'minp 'maxp)
(setq minp (vlax-safearray->list minp)
       maxp (vlax-safearray->list maxp))
(setq minx (car minp)
       maxx (car maxp)
       miny (cadr minp)
       maxy (cadr maxp))
(setq pmin (list minx miny)
       pmax (list maxx maxy))
)
(princ "命令TTR")

Andyhon 发表于 2013-3-26 18:33:36

上传个调用文件(*.dwg)以利探讨

张和平 发表于 2013-3-26 20:43:43

已解决这个问题了,调整了【(COMMAND "")】这一行命令的位置,详见下面:(defun C:TTR( / en end end_data pmin pmax minp maxp minx miny maxx maxy m n ss midp i)
(vl-load-com)
(princ "\n请选择闭合pline:")
(while(null(setq en (ssget'((0 . "LWPOLYLINE")))))); (70 . 1)
(setq i 0)
(repeat (setq m (sslength en))
   ;(setq end (ssname en (setq m (1- m))))
   (setq end (ssname en i))
   (setq end_data (entget end))
   (ttrMin_Max)
   (setq midp (mapcar '* '(0.5 0.5 0.5) (mapcar '+ pmin pmax)))
   (setq ss (ssget "c" Pmin Pmax))
   (ssdel end ss)
   (command ".trim" end "")
   (repeat (setq n (sslength ss))
   (command (list (ssname ss (setq n (1- n))) midp))
   )
   (COMMAND "")
   (setq i (1+ i))
)

(princ "完成!")
)

(defun ttrMin_Max()
(vla-getboundingbox(vlax-ename->vla-object end) 'minp 'maxp)
(setq minp (vlax-safearray->list minp)
       maxp (vlax-safearray->list maxp))
(setq minx (car minp)
       maxx (car maxp)
       miny (cadr minp)
       maxy (cadr maxp))
(setq pmin (list minx miny)
       pmax (list maxx maxy))
)
(princ "命令TTR")

smartstar 发表于 2013-3-26 21:15:39

俺来学习学习。

张和平 发表于 2013-3-26 21:18:02

smartstar 发表于 2013-3-26 21:15 static/image/common/back.gif
俺来学习学习。

俺是初手,俺是来学习的

longer1000 发表于 2013-3-27 08:40:53

好像还是不能以块内多义线为边界进行修剪

张和平 发表于 2013-3-27 10:28:14

longer1000 发表于 2013-3-27 08:40 static/image/common/back.gif
好像还是不能以块内多义线为边界进行修剪

是的,正在愁这个问题呢。。。

smartstar 发表于 2013-3-27 12:49:50

本帖最后由 smartstar 于 2013-3-27 12:51 编辑

刚才试了一下2楼的程序,不尽人意!执行结果如下图所示:
左边是剪切前,右边是剪切后。

完整武器 发表于 2013-3-28 18:23:30

圆内修剪好像不支持!!

跳跳虫 发表于 2013-3-28 19:33:55

最、终情况有点糊涂。。。
页: [1] 2 3 4 5 6 7
查看完整版本: 批量框剪小程序源码(更新至V2.0.0)