明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 15651|回复: 65

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

    [复制链接]
发表于 2013-3-26 18:02:58 | 显示全部楼层 |阅读模式
本帖最后由 张和平 于 2013-4-28 01:11 编辑

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


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

第④次更新=================================================
请教大神们,如何选取块里的pline线作为剪切边啊。。
选择的时候加上条件(0 . "LWPOLYLINE")的话就只能选择块外的pline了,而块里pline将随块一同被忽略了。
好是纠结的问题啊。
CAD自带的剪切命令是可以单独选择块里的某个图元的,这个是怎么实现的呀?
第③次更新=================================================   
原理加入如下程序抑制一下就可以了。。。
  1. (setvar "cmdecho" 0)
复制代码

第②次更新=================================================

回家之后又仔细看了一下,发现了问题的所在,解决后的源码详见2楼。问题发生的原因是,如下命令后
  1. (command ".trim" end "")
  2.    (repeat (setq n (sslength ss))
  3.      (command (list(ssname ss (setq n (1- n))) midp))
  4.    )
CAD提示:
  1. 选择要修剪的对象,或按住 Shift 键选择要延伸的对象,或 [投影(P)/边(E)/放弃(U)]:
复制代码
不知道是trim这个命令段写得不对还是其他原因,我的解决办法是加上了下面这行:
  1. (COMMAND "")
复制代码
模拟CAD中按一下空格或按一下enter或按一下ESC退出当前的状态。
但是,目前还存在的不足是,程序选择的是块之外的pline线,这些pline线可以是闭合的也可以是不闭合的,存在于块中的pline线则没有选中。
接下去就要解决这些个问题了。有知道的大神也请赐教一下哈。。。
第①次更新==以下内容为首发帖子标题为【这个框剪程序为什么不能批量????】时的帖子正文2013.03.26==
今天拼编了一个框剪的小程序,源码如下:但是这个程序却不能实现批量,纳闷中。请各位大神帮忙看看,分析一下是什么原因。
  1. (defun C:TTR( / en end end_data pmin pmax minp maxp minx miny maxx maxy m n ss midp i)
  2. (vl-load-com)
  3. (princ "\n请选择闭合pline:")
  4. (while(null(setq en (ssget  '((0 . "LWPOLYLINE")))))); (70 . 1)
  5. (setq i 0)
  6. (repeat (setq m (sslength en))
  7.    ;(setq end (ssname en (setq m (1- m))))
  8.    (setq end (ssname en i))
  9.    (setq end_data (entget end))
  10.    (ttrMin_Max)
  11.    (setq midp (mapcar '* '(0.5 0.5 0.5) (mapcar '+ pmin pmax)))
  12.    (setq ss (ssget "c" Pmin Pmax))
  13.    (ssdel end ss)
  14.    (command ".trim" end "")
  15.    (repeat (setq n (sslength ss))
  16.      (command (list (ssname ss (setq n (1- n))) midp))
  17.    )
  18.    (setq i (1+ i))
  19. )
  20. (COMMAND "")
  21. (princ "完成!")
  22. )

  23. (defun ttrMin_Max()
  24. (vla-getboundingbox(vlax-ename->vla-object end) 'minp 'maxp)
  25. (setq minp (vlax-safearray->list minp)
  26.        maxp (vlax-safearray->list maxp))
  27. (setq minx (car minp)
  28.        maxx (car maxp)
  29.        miny (cadr minp)
  30.        maxy (cadr maxp))
  31. (setq pmin (list minx miny)
  32.        pmax (list maxx maxy))
  33. )
  34. (princ "命令TTR")

本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +2 金钱 +5 收起 理由
wayne_myles + 1 + 5 很给力!
flytoday + 1 张工那个闭合的多段线是天正柱,,那要怎么.

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2013-3-26 18:33:36 | 显示全部楼层
上传个调用文件(*.dwg)以利探讨
 楼主| 发表于 2013-3-26 20:43:43 | 显示全部楼层
已解决这个问题了,调整了【(COMMAND "")】这一行命令的位置,详见下面:
  1. (defun C:TTR( / en end end_data pmin pmax minp maxp minx miny maxx maxy m n ss midp i)
  2. (vl-load-com)
  3. (princ "\n请选择闭合pline:")
  4. (while(null(setq en (ssget  '((0 . "LWPOLYLINE")))))); (70 . 1)
  5. (setq i 0)
  6. (repeat (setq m (sslength en))
  7.    ;(setq end (ssname en (setq m (1- m))))
  8.    (setq end (ssname en i))
  9.    (setq end_data (entget end))
  10.    (ttrMin_Max)
  11.    (setq midp (mapcar '* '(0.5 0.5 0.5) (mapcar '+ pmin pmax)))
  12.    (setq ss (ssget "c" Pmin Pmax))
  13.    (ssdel end ss)
  14.    (command ".trim" end "")
  15.    (repeat (setq n (sslength ss))
  16.      (command (list (ssname ss (setq n (1- n))) midp))
  17.    )
  18.    (COMMAND "")
  19.    (setq i (1+ i))
  20. )

  21. (princ "完成!")
  22. )

  23. (defun ttrMin_Max()
  24. (vla-getboundingbox(vlax-ename->vla-object end) 'minp 'maxp)
  25. (setq minp (vlax-safearray->list minp)
  26.        maxp (vlax-safearray->list maxp))
  27. (setq minx (car minp)
  28.        maxx (car maxp)
  29.        miny (cadr minp)
  30.        maxy (cadr maxp))
  31. (setq pmin (list minx miny)
  32.        pmax (list maxx maxy))
  33. )
  34. (princ "命令TTR")
发表于 2013-3-26 21:15:39 | 显示全部楼层
俺来学习学习。
 楼主| 发表于 2013-3-26 21:18:02 | 显示全部楼层
smartstar 发表于 2013-3-26 21:15
俺来学习学习。

俺是初手,俺是来学习的
发表于 2013-3-27 08:40:53 | 显示全部楼层
好像还是不能以块内多义线为边界进行修剪
 楼主| 发表于 2013-3-27 10:28:14 | 显示全部楼层
longer1000 发表于 2013-3-27 08:40
好像还是不能以块内多义线为边界进行修剪

是的,正在愁这个问题呢。。。
发表于 2013-3-27 12:49:50 | 显示全部楼层
本帖最后由 smartstar 于 2013-3-27 12:51 编辑

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

本帖子中包含更多资源

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

x
发表于 2013-3-28 18:23:30 | 显示全部楼层
圆内修剪好像不支持!!
发表于 2013-3-28 19:33:55 | 显示全部楼层
最、终情况有点糊涂。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 23:23 , Processed in 0.229962 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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