明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3012|回复: 12

[已解答] 巧用Shift键实现一箭双雕

[复制链接]
发表于 2015-2-9 20:08:34 | 显示全部楼层 |阅读模式
本帖最后由 布朗运动 于 2015-2-11 16:58 编辑

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

本帖子中包含更多资源

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

x
发表于 2015-2-10 09:01:22 | 显示全部楼层
你换个思路就好了。
先选中A,再用ssget选中BCDE,再用ssget选中DE,然后用程序将DE从第一个选择集中扣除,然后执行剪切命令即可。
这样操作更方便。
 楼主| 发表于 2015-2-10 10:48:58 | 显示全部楼层
fl202 发表于 2015-2-10 09:01
你换个思路就好了。
先选中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
安装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
安装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
黄工给出的另外一个函数(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
黄工给出的另外一个函数(ACET-SYS-SHIFT-DOWN),我在CAD命令行键入(ACET-SYS-SHIFT-DOWN),同时按住Shift ...

是啊,所以这个函数用不上,黄工索性帮忙帮到底,看看这个“一箭双雕”的想法能否完美实现?多谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-23 10:20 , Processed in 0.196080 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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