布朗运动 发表于 2015-2-9 20:08:34

巧用Shift键实现一箭双雕

本帖最后由 布朗运动 于 2015-2-11 16:58 编辑

我想写一个小程序,要实现的功能如下图所示:命令启动—>选中直线A(红色线),回车确定—>选中直线B、C(黄色线)—>按住Shift键,同时选中D、E(绿色线)—>回车—>命令结束。执行后的结果:直线B、C被直线A打断,直线A被直线D、E打断。也就是程序内部会根据选择对象时用户是否同时按住了Shift键作出不同的响应。这样,只用一个程序就执行了两种操作,类似于AutoCAD本身的Trim(Extend)命令,正常选择对象执行的是Trim(Extend)命令,而按住Shift键同时选择对象执行的是Extend(Trim)命令。需要高手指点的关键点是:如何让程序感知用户选择对象时是否按住了Shift键,从而对不同的选中对象做出不同的反应,另外应允许用户用多次框选的方法选择对象,就像使用Trim或Extend命令那样。
感谢院长(xyp1964)、鱼和熊掌、ZZXXQQ在群里的解答,此问题结论是:在AutoLISP语言里要利用Shift键是难以实现上述全部要求的。

fl202 发表于 2015-2-10 09:01:22

你换个思路就好了。
先选中A,再用ssget选中BCDE,再用ssget选中DE,然后用程序将DE从第一个选择集中扣除,然后执行剪切命令即可。
这样操作更方便。

布朗运动 发表于 2015-2-10 10:48:58

fl202 发表于 2015-2-10 09:01 static/image/common/back.gif
你换个思路就好了。
先选中A,再用ssget选中BCDE,再用ssget选中DE,然后用程序将DE从第一个选择集中扣除, ...

谢谢!也可以这样,先使用一次(ssget)得到BC,回车,再使用一次(ssget)得到DE,然后分别对这两个选择集采用不同子程序进行处理。不过还是想知道,怎样实现按住Shift键选择对象进而达到不同效果的方法。

娶了个钱串子 发表于 2015-2-10 11:11:22

支持下 看来楼主和shift键是杠上了

自贡黄明儒 发表于 2015-2-10 12:08:08

安装ET后有这个定义
(defun ACET-SYS-SHIFT-DOWN ()
(< (ACET-SYS-KEYSTATE 16) 0)
)

布朗运动 发表于 2015-2-10 14:31:28

自贡黄明儒 发表于 2015-2-10 12:08 static/image/common/back.gif
安装ET后有这个定义
(defun ACET-SYS-SHIFT-DOWN ()
(< (ACET-SYS-KEYSTATE 16) 0)


非常感谢黄工的指导,有这种问题的原来不止我一个( 如何取得键盘按键状态 :http://bbs.mjtd.com/thread-74422-1-1.html)。按一次Shift键,(ACET-SYS-KEYSTATE 16)的返回值就会改变一次(0和1之间来回转变),这样的话,用户选择完直线B、C后,按一下Shift键(而不是按住Shift键不放,这个与我原来设想的操作有些不同),代码就可以通过检查(ACET-SYS-KEYSTATE 16)的返回值知道用户按了一次Shift键了(不能多按,按两次函数返回值不变)。不过,还需要解决一个问题:如何实现选择完直线B、C后就立即对直线B、C进行处理,而且处理完之后还可以允许用户继续选择,从而对下一批选中对象进行处理呢?(就像使用Trim或Extend命令那样)?

布朗运动 发表于 2015-2-10 14:36:34

自贡黄明儒 发表于 2015-2-10 12:08 static/image/common/back.gif
安装ET后有这个定义
(defun ACET-SYS-SHIFT-DOWN ()
(< (ACET-SYS-KEYSTATE 16) 0)


黄工给出的另外一个函数(ACET-SYS-SHIFT-DOWN),我在CAD命令行键入(ACET-SYS-SHIFT-DOWN),同时按住Shift键然后敲击回车键,该函数返回值为T,不按住Shift键,返回值为nil。只是不知道这个函数怎么配合(ssget)的选择动作,恳请黄工继续施以援手。

自贡黄明儒 发表于 2015-2-10 14:41:57

布朗运动 发表于 2015-2-10 14:36 static/image/common/back.gif
黄工给出的另外一个函数(ACET-SYS-SHIFT-DOWN),我在CAD命令行键入(ACET-SYS-SHIFT-DOWN),同时按住Shift ...

根据你的叙述,按不按shift是没有用的。因为ssget不结束时,虽然可以多次选择,便只能构成一个选择集。

鱼与熊掌 发表于 2015-2-10 14:54:35

ssnamex 不知道有没有信息

布朗运动 发表于 2015-2-10 16:29:05

布朗运动 发表于 2015-2-10 14:36 static/image/common/back.gif
黄工给出的另外一个函数(ACET-SYS-SHIFT-DOWN),我在CAD命令行键入(ACET-SYS-SHIFT-DOWN),同时按住Shift ...

是啊,所以这个函数用不上,黄工索性帮忙帮到底,看看这个“一箭双雕”的想法能否完美实现?多谢!
页: [1] 2
查看完整版本: 巧用Shift键实现一箭双雕