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
你的理解没错
页: 1 [2] 3
查看完整版本: 新人求教关于ssget"p"的一点疑问