azbk00
发表于 2015-9-29 16:12:42
masterlong 发表于 2015-9-29 16:01 static/image/common/back.gif
前面所说的那些
是CAD的标准操作模式
一直没有改过的
嗯,如果真如你所说,可以用第三方插件实现这个功能,那也一定是调用了cad自己的函数才是,我现在也想要自己写lisp来实现上述的功能,请问一下你有什么好的办法吗?
masterlong
发表于 2015-9-29 16:40:51
首先要确认你需要的是什么
是框选后不执行任何命令
即将被框选的图元形成当前选择集
还是copy后的最后一组图元默认为当前选择集
如果是前者我没有办法
如果是后者是可以做到的
记录最后图元
将之后生成的图元形成选择集
当然方法不止一种
azbk00
发表于 2015-9-29 16:53:01
masterlong 发表于 2015-9-29 16:40 static/image/common/back.gif
首先要确认你需要的是什么
是框选后不执行任何命令
即将被框选的图元形成当前选择集
后者的话,大哥能写一个lisp给我参考下吗?就用cc命令来复制copy后生成的选择集,选择集不只一个对象的那种。
masterlong
发表于 2015-9-30 08:55:45
(defun c:cc()
(setq a (cadr (ssgetfirst)))
(if a
(setq ss a)
(setq ss (ssget))
)
(setvar "cmdecho" 0)
(command "undo" "g")
(if ss
(progn
;;(initget "M W A ")
;;(setq p1 (getpoint "\n见层有份(A)/原位复制(W)/定距复制(D)/多重复制(M)/指定基点: "))
(initget "M ")
(setq p1 (getpoint "\n多重复制(M)/指定基点: "))
(cond
((= p1 "M")
(princ "\n多重复制....")
(setq pt Nil)
(setq p1 (getpoint "指定基点: "))
(princ "\n")
(if p1
(progn
(princ "\n已指定基准点\n")
(while (not (equal p1 pt 1e-4))
(setq ent (entlast))
(setq pt p1)
(princ "指定下一点: ")
(vl-cmdf "copy" ss "" "non" pt pause)
(setq tempss ss)
(setq ss (entbackss ent))
(setq p1 (getvar "lastpoint"))
)
(command "._erase" ss "")
(command "select" tempss "")
)
(princ "\n未指定基准点,程序结束\n")
)
)
;|.....|;
( T
(if p1
(progn
(setq ent (entlast))
(princ "指定下一点: ")
(command "copy" ss "" "non" p1 pause)
(setq tempss ss)
(setq pt (getvar "lastpoint"))
(setq ss (entbackss ent))
(if (null ss)
(setq ss (ssadd))
)
(if (equal p1 pt 1e-4)
(progn
(command "._erase" ss "")
(command "select" tempss "")
)
(command "select" ss "")
)
)
)
)
)
)
)
(command "undo" "e")
(princ)
)
;;获取在图元 ent 之后产生的图元的选择集 ,ent不存在时返回nil
(defun entbackss ( ent / backss )
(if ent
(progn
(setq backss (ssadd))
(while (setq ent (entnext ent))
(if (not (member (cdr (assoc 0 (entget ent))) '("ATTRIB" "VERTEX" "SEQEND")))
(setq backss (ssadd ent backss))
)
)
(if (zerop (sslength backss))
(setq backss NIL)
)
backss
)
)
)
(princ)
azbk00
发表于 2015-9-30 09:15:43
masterlong 发表于 2015-9-30 08:55 static/image/common/back.gif
(defun c:cc()
(setq a (cadr (ssgetfirst)))
(if a
拜谢大神!
czcxxx
发表于 2015-9-30 09:37:20
拜谢大神!masterlong
azbk00
发表于 2015-10-7 21:40:30
masterlong 发表于 2015-9-30 08:55 static/image/common/back.gif
(defun c:cc()
(setq a (cadr (ssgetfirst)))
(if a
大神你好,我这几天好好研究了下你的代码,恕我愚钝,还有几点疑惑,望大神解答:
1、开头的位置有
(defun c:cc()
(setq a (cadr (ssgetfirst)))
(if a
(setq ss a)
(setq ss (ssget))
)
我感觉(setq ss a)没有意义啊,之后都有(setq ss (ssget))了,ss之前的赋值还有意义吗?可不可以拿掉if语句直接改为
(defun c:cc()
(setq ss (ssget))
2、(command "undo" "g")和 (command "undo" "e")我没看懂是什么意思,我直接输入undo命令之后可以跟a\c\be\e\m\b,唯独没有g\e,请问这个g\e代表什么意思,还有这两个函数在整个代码中的作用何在?
3、 (while (not (equal p1 pt 1e-4))
(setq ent (entlast))
(setq pt p1)
(princ "指定下一点: ")
(vl-cmdf "copy" ss "" "non" pt pause)
(setq tempss ss)
(setq ss (entbackss ent))
(setq p1 (getvar "lastpoint"))
)
(command "._erase" ss "")
(command "select" tempss "")
在 (vl-cmdf "copy" ss "" "non" pt pause)命令中,pause让我指定下一点,如果这个时候我没有指定下一点,直接空格结束。此时while循环语句中(setq tempss ss)、(setq ss (entbackss ent))、(setq p1 (getvar "lastpoint"))这三步还执行吗?还是就直接跳出循环执行(command "._erase" ss "")了?
masterlong
发表于 2015-10-8 10:30:34
1.
开头代码的作用
是可以让程序实现“先选择再执行”
当然本程序中
你说的也能实现这一目的
某些情况下两者会有所不同
一时想不到合适的例子加以说明
就当个人习惯吧
2.
UNDO语句就是做一个标记
如果没有它们当你想“回退”时
你需要重复很多次的“U+空格”
3.
while函数仅在每一轮循环开始之前
判断是否需要结束循环
而循环一旦开始
就会一直执行直到这一轮结束
因此看while语句首先看结束循环的条件
程序中设定的是
p1、pt之间距离小于0.0001
理解了以上内容以后再来看你的疑问
循环语句执行到pause时
输入一个符合要求的点坐标时
程序完成该轮循环继续下一循环
输入无效点时
copy命令拒绝接受并提示重新输入
输入回车、空格、鼠标右键
对copy来说就是正常结束命令
此时系统参数“lastpoint”没有任何改变
而该轮循环继续执行
然后由于p1=pt结束while
azbk00
发表于 2015-10-8 20:45:13
masterlong 发表于 2015-10-8 10:30 static/image/common/back.gif
1.
开头代码的作用
是可以让程序实现“先选择再执行”
非常详细的解释,我再确认下,看看有没有正确理解大神的意思
2、(command "undo" "g")是不是就等同于(command "undo" "be"),g和be都能被系统识别为完整的begain命令?
3、最后一轮循环中,右键后copy命令结束,“lastpoint”没有任何改变,但是(setq tempss ss)和(setq ss (entbackss ent))还是有效执行了,对吗?
masterlong
发表于 2015-10-8 22:35:50
2
undo中g和be有啥区别
这个真没去细究
凭感觉应该是一样的
可能较早的版本中是采用的g
后来的版本改成了be
同时保留了对g的支持
3
你的理解没错