紧急求助:谁能编一个框选水平直线、竖直直线的LISP透明命令
<p>紧急求助:谁能编一个框选水平直线、竖直直线的LISP透明命令</p><p>功能:1、要求为透明命令,以方便在某些CAD命令提示选择对象时可以采用。</p><p> 2、框选范围内判断是水平直线(Y坐标增量为0)还是竖直直线(X坐标增量为0)。</p><p> 3、虽然用CAD里的快速选择命令可以实现该功能,但是我想要一个LISP的透明命令,因为我想在在其他的LISP程序中调用它,而快速选择中的选择方法我没法调用(就算调用也还需要手动选择几个选项,没法自动化)。</p><p> 请高手帮忙,虽然大致知道怎么判断(比如用程序判断X或Y坐标增量是否为0,或判断该条直线的角度是否为0度或90度),小弟LISP不怎么行,写了好久也没反映。</p><p>谢谢。</p> <p>顶起来</p><p></p> 透明命令可以定义,但和当前命令交换数据似乎有点麻烦 <p>如果实在做不成透明的指令,那么不透明的也可以啊,知识透明的会更方便的使用</p> <p>哎,没人帮忙编,只好自己来乱凑了,凑了好久,凑出了几句语句,可不知道为什么,提示语法错误,请帮忙看下哪里有问题:</p><p>(defun c:ttt(/ ss n i ent1 ang1)<br/> (setq ss (ssget '((0 . "line")))) <br/> (if ss <br/> (setq n (sslength ss))<br/> ) <br/> (setq i 0)<br/> (while (< i n) <br/> (setq ent1 (ssname ss i))<br/> (setq p1 (entget ent1))<br/> (setq ang1 (angle (dxf 10 p1)(dxf 11 p1)))<br/> (if ang1<br/> (ssdel ent1 ss) <br/> (setq i (- i 1))<br/> (setq n (- n 1))<br/> )<br/> (setq i (1+ i))<br/> )<br/> (command "erase" ss "")<br/> (princ)<br/>)</p><p>(defun dxf (code elist) (cdr (assoc code elist)))</p><p>命令: ; 错误: 语法错误<br/>命令: ; 错误: 语法错误</p><p><br/></p> <p>试了大半夜</p><p>初步调整成这样</p><p>大家看看对不对</p><p>水平线的:</p><p>(defun c:ttt(/ ss n i ent1 ang1)<br/> (setq ss (ssget '((0 . "line"))))<br/> (if ss <br/> (setq n (sslength ss))<br/> ) <br/> (setq i 0)<br/> (while (< i n) <br/> (setq ent1 (ssname ss i))<br/> (setq p1 (entget ent1))<br/> (setq ang1 (angle (dxf 10 p1)(dxf 11 p1)))<br/> (if (not(or(= ang1 0)(= ang1 pi)(= dang (- 0 pi)))) (ssdel ent1 ss))<br/> (if (not(or(= ang1 0)(= ang1 pi)(= dang (- 0 pi)))) (setq i (- i 1)))<br/> (if (not(or(= ang1 0)(= ang1 pi)(= dang (- 0 pi)))) (setq n (- n 1)))<br/> (setq i (1+ i))<br/> )<br/> (command "erase" ss "")<br/> (princ)<br/>);其中最后的SS为处理过的选择集,就是我们要的水平线</p><p>(defun dxf (code elist) (cdr (assoc code elist)))</p><p>垂直线的:</p><p>(defun c:czz(/ ss n i ent1 ang1)<br/> (setq ss (ssget '((0 . "line"))))<br/> (if ss <br/> (setq n (sslength ss))<br/> ) <br/> (setq i 0)<br/> (while (< i n) <br/> (setq ent1 (ssname ss i))<br/> (setq p1 (entget ent1))<br/> (setq ang1 (angle (dxf 10 p1)(dxf 11 p1)))<br/> (if (not(or(= ang1 (/ pi 2))(= ang1 (- 0 (/ pi 2)))(= ang1 (+ pi (/ pi 2)))(= ang1 (- 0 (+ pi (/ pi 2)))))) (ssdel ent1 ss))<br/> (if (not(or(= ang1 (/ pi 2))(= ang1 (- 0 (/ pi 2)))(= ang1 (+ pi (/ pi 2)))(= ang1 (- 0 (+ pi (/ pi 2)))))) (setq i (- i 1)))<br/> (if (not(or(= ang1 (/ pi 2))(= ang1 (- 0 (/ pi 2)))(= ang1 (+ pi (/ pi 2)))(= ang1 (- 0 (+ pi (/ pi 2)))))) (setq n (- n 1)))<br/> (setq i (1+ i))<br/> )<br/> (command "erase" ss "")<br/> (princ)<br/>));其中最后的SS为处理过的选择集,就是我们要的垂直线</p><p>(defun dxf (code elist) (cdr (assoc code elist)))<br/></p>(vl-load-com)
;; acet-* required
(Defun HVLineSS (2Test)
(setq nn (sslength 2Test))
(while (setq ee (ssname 2Test (setq nn (1- nn))))
(mapcar 'set '(pa pb) (acet-ent-geomextents ee))
(if
(or
(equal (car pa) (car pb) 1e-13)
(equal (cadr pa) (cadr pb) 1e-13)
)
nil ; (entdel ee)
(ssdel ee 2Test)
)
)
2Test
)
(Defun HV ()
(Cond
((null (setq ss (ssget '((0 . "LINE"))))) nil)
(T (setq rtn (HVLineSS ss)))
)
(vla-SendCommand
(vla-get-ActiveDocument (vlax-get-acad-object))
"!rtn "
)
)
(vlax-remove-cmd "hv")
(vlax-add-cmd "hv" 'hv "hv" ACRX_CMD_TRANSPARENT)
=====================================================
Command: copy
Select objects: 'hv ; TRANSPARENT
>>Select objects: All 8 found
>>Select objects:
Resuming COPY command.
Select objects: !rtn <Selection set: 28>
6 found
Select objects:
.....
<font color="#ff00ff">变量 rtn 如何清除呢?</font> <p>; 错误: no function definition: ACET-ENT-GEOMEXTENTS<br/>正在恢复执行 COPY 命令。</p><p>我运行起来,说是ACET-ENT-GEOMEXTENTS函数没定义,查了好象是EXPRESSTOOL中的公共函數,但是我用的是CAD2009,没法装这个EXPRESSTOOL,请问怎么办?</p>
页:
[1]
2