明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: azbk00

[已解答] 新人求教关于ssget"p"的一点疑问

[复制链接]
 楼主| 发表于 2015-9-29 16:12:42 | 显示全部楼层
masterlong 发表于 2015-9-29 16:01
前面所说的那些
是CAD的标准操作模式
一直没有改过的

嗯,如果真如你所说,可以用第三方插件实现这个功能,那也一定是调用了cad自己的函数才是,我现在也想要自己写lisp来实现上述的功能,请问一下你有什么好的办法吗?
发表于 2015-9-29 16:40:51 | 显示全部楼层
首先要确认你需要的是什么
是框选后不执行任何命令
即将被框选的图元形成当前选择集
还是copy后的最后一组图元默认为当前选择集

如果是前者我没有办法
如果是后者是可以做到的

记录最后图元
将之后生成的图元形成选择集
当然方法不止一种
 楼主| 发表于 2015-9-29 16:53:01 | 显示全部楼层
masterlong 发表于 2015-9-29 16:40
首先要确认你需要的是什么
是框选后不执行任何命令
即将被框选的图元形成当前选择集

后者的话,大哥能写一个lisp给我参考下吗?就用cc命令来复制copy后生成的选择集,选择集不只一个对象的那种。
发表于 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)
 楼主| 发表于 2015-9-30 09:15:43 | 显示全部楼层
masterlong 发表于 2015-9-30 08:55
(defun c:cc()
        (setq a (cadr (ssgetfirst)))
        (if a

拜谢大神!
发表于 2015-9-30 09:37:20 | 显示全部楼层
拜谢大神!masterlong
 楼主| 发表于 2015-10-7 21:40:30 | 显示全部楼层
masterlong 发表于 2015-9-30 08:55
(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 "")了?
                                                            
发表于 2015-10-8 10:30:34 | 显示全部楼层
1.
开头代码的作用
是可以让程序实现“先选择再执行”
当然本程序中
你说的也能实现这一目的
某些情况下两者会有所不同
一时想不到合适的例子加以说明
就当个人习惯吧

2.
UNDO语句就是做一个标记
如果没有它们当你想“回退”时
你需要重复很多次的“U+空格”

3.
while函数仅在每一轮循环开始之前
判断是否需要结束循环
而循环一旦开始
就会一直执行直到这一轮结束
因此看while语句首先看结束循环的条件
程序中设定的是
p1、pt之间距离小于0.0001
理解了以上内容以后再来看你的疑问
循环语句执行到pause时
输入一个符合要求的点坐标时
程序完成该轮循环继续下一循环
输入无效点时
copy命令拒绝接受并提示重新输入
输入回车、空格、鼠标右键
对copy来说就是正常结束命令
此时系统参数“lastpoint”没有任何改变
而该轮循环继续执行
然后由于p1=pt结束while
 楼主| 发表于 2015-10-8 20:45:13 | 显示全部楼层
masterlong 发表于 2015-10-8 10:30
1.
开头代码的作用
是可以让程序实现“先选择再执行”

非常详细的解释,我再确认下,看看有没有正确理解大神的意思
2、(command "undo" "g")是不是就等同于(command "undo" "be"),g和be都能被系统识别为完整的begain命令?

3、最后一轮循环中,右键后copy命令结束,“lastpoint”没有任何改变,但是  (setq tempss ss)和(setq ss (entbackss ent))还是有效执行了,对吗?
                                                           

本帖子中包含更多资源

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

x
发表于 2015-10-8 22:35:50 来自手机 | 显示全部楼层
2
undo中g和be有啥区别
这个真没去细究
凭感觉应该是一样的
可能较早的版本中是采用的g
后来的版本改成了be
同时保留了对g的支持

3
你的理解没错
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-21 06:17 , Processed in 0.145315 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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