【源码分享】编程处女作-留念!功能:天正门窗居中(批量改图元均可参考)
本帖最后由 wowan1314 于 2013-6-12 20:18 编辑 <br /><br /><div>;;;--------------------------功能:天正门窗居中(必然搞死CAD版)-----------------------------</div><div>;;;实现门窗居中的自动批处理。缺点:CAD必然崩溃。</div><div>;;;可能entmod函数修改块定义中的图元,但这样做可能会生成引用自身的块,导致AutoCAD系统崩溃。</div><div>;;;怎么解决?!改为ENTMAKE居然也会崩溃(不明白),不过好了点。其他批量修改图元资料的程序均可套用此格式。如:文字内容(或其他资料)刷,所有图元原地缩放等等。行行有说明,方便不会编程的朋友借鉴。</div><div>(defun C:ZZ2 (/ SS YY_TEMP YY_WZIL YY_CHUANZ YY_WZDX YY_WZDY YY_NEWXYZ YY_NEWCZIL N K NN)</div><div> (princ "选择要居中门窗,可选N个,命令前后一定要保存,肯定死机")</div><div> (setq SS (ssget '((0 . "TCH_OPENING"))));建立特定图元选集</div><div> (setq n (sslength ss) nn -1 K 1);批量修改循环参数设置,WHILE开始循环</div><div> (WHILE (>= N K) </div><div> (setq nN (+ NN 1)</div><div> YY_TEMP (ENTGET (SSNAME SS NN));得到门窗的资料</div><div> YY_WZIL (ENTGET (CDR (assoc 330 (CDR (CDR (CDR YY_TEMP))))));得到墙的资料</div><div> YY_CHUANZ (CADDR (CDR (assoc 10 YY_TEMP)));得到窗户的插入点Z坐标</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> YY_WZDX (/ (+ (CAR (CDR (assoc 10 YY_WZIL))) (CAR (CDR (assoc 11 YY_WZIL)))) 2);得到墙的中心点X坐标</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> YY_WZDY (/ (+ (CADR (CDR (assoc 10 YY_WZIL))) (CADR (CDR (assoc 11 YY_WZIL)))) 2);得到墙的中心点Y坐标</div><div> YY_NEWXYZ (CONS '10 (LIST YY_WZDX YY_WZDY YY_CHUANZ));得到窗户居中插入的插入点坐标并形成资料格式</div><div> YY_NEWCZIL (SUBST YY_NEWXYZ (assoc 10 YY_TEMP) YY_TEMP));将新的坐标资料替换旧的坐标资料</div><div> (ENTMAKE YY_NEWCZIL);按新资料重建图元,如不是块图元,则entmod修改资料就可以。</div><div> (setq k (+ k 1))</div><div> );结束WHILE</div><div> (command "_.erase" SS "");删除旧图元</div><div> (prompt (strcat "处理了 " (RTOS (sslength ss)) " 个门窗!!注意保存!!!"))</div><div> (princ)</div><div>)</div><div>本人是初学者,水平有限。不足处请谅解。</div><div>参考资料:《lisp教程修正.chm》 ;《LSP函数集.chm》</div><div><br></div><div><div></div></div> 现在天正T20的墙体已经没有10,11组码的数据,不知何故? 好贴,支持一下 支持,顶一下。 本帖最后由 highflybir 于 2011-6-14 20:17 编辑只是告诉楼主,崩溃并不是你LISP程序有问题,而是天正提供的接口有问题。
关于这个崩溃的问题,我曾经问过开发天正的自定义实体的软件的 (金剑--网名)
他亲口告诉我,以前这个地方开发的时候欠考虑。后来他离开天正公司了,到了斯维尔。
但天正公司对这个bug一直视而不见。
所以如果你用斯维尔的话,基本不会有问题,但天正基本有问题。
顺便学习一下楼主的程序。
本帖最后由 wowan1314 于 2011-6-14 20:37 编辑
我第一次编! 这个程序其实就很简单的几步!
花了两天照着论坛那个的LSP教程,才搞出来! 结果还是个崩溃CAD的程序
大家别笑话! 楼主很厉害,太谦虚了 阅读权限不够啊!~~可惜!~~ 一个相关的例子:
;;;天正隐藏门窗编号
(defun c:mtt(/ door)
(princ "选择天正门窗:")
(ssget '((0 . "TCH_OPENING")))
(vlax-for door (vla-get-activeselecti**et (vla-get-activedocument (vlax-get-acad-object)))
(vlax-put-property door 'hidelabel "是"))
(princ)) 上面**不知道怎么出来的,应是selecti**et,用对象编辑可以,不会死机 ??。还有**啊,selecti-o-n-s-et