场景举例:一个界面上有两个按钮,按钮1会进入自定义的jig1交互状态,按钮2会进入自定义的jig2交互状态,现安装按钮1,进入交互状态1,这个是不进行选择,也不退出交互状态,希望在点击按钮2的时候,能够退出按钮1的交互状态1,进入按钮2的交互状态2.

现在已经尝试过的方案:
1.发送命令方式中断交互状态1:因中望cad2025不支持commandasync,单纯发送命令的结果是进入按钮2的功能,但是ed.drag会立即返回null,按钮2的程序结束,这个时候依然在按钮1的交互中。
2.向窗口发送按键ESC中断交互状态1:进入按钮2的功能,但是ed.drag会立即返回null,按钮2的程序结束,按键消息将按钮1的交互状态结束。
3.采用反射调用editor的runcommand方法,无作用。
4.采用官方blog的application.doevents(),无作用

查看了zwcad 和 AutoCAD 的api文档,以及editor的反编译代码,没有找到好的解决方案。

cad自身是可以命令相互打断的,比如line的命令(在交互状态下)可以被polyline命令打算。


有没有大佬可以求救


网友答: 分别做两个命令,用doc.SendStringToExecute,发送命令前拼两个\u0003

网友答: 命令调度引擎执行的bug,CAD得改bug

网友答:
d1742647821 发表于 2025-9-24 14:22
分别做两个命令,用doc.SendStringToExecute,发送命令前拼两个%u0003

我之前的项目里面有用过这种方式,估计这也是唯一满足cad机制的方法了。
感觉cad还有一些接口没有暴露出来,细节的东西处理不了。

网友答: 本帖最后由 你有种再说一遍 于 2025-9-25 23:18 编辑
Hrdk 发表于 2025-9-25 08:57
我之前的项目里面有用过这种方式,估计这也是唯一满足cad机制的方法了。
感觉cad还有一些接口没有暴露出 ...

acad也是DYH这种方案吧,
通过异步发送(ESC+命令)到命令栈执行,实现界面和数据库解耦.
只是需要改一些代码,把JIG交互的死循环改为while(flag),
flag是线程安全标记,
键盘钩子接收ESC就set flag is false.
然后命令内会在下一次捕捉时候,知道是ESC,后面if(!flag) return;
这种就是业务要学习的地方,大部分人没有经验就会写点BUG出来,
例如桌子自己都没有处理double cancel:
https://www.cnblogs.com/JJBox/p/11464977.html

网友答:
你有种再说一遍 发表于 2025-9-25 19:14
acad也是DYH这种方案吧,
通过异步发送(ESC+命令)到命令栈执行,实现界面和数据库解耦.
只是需要改一些代 ...

高版本直接用commandasync就可以解决这个问题了


网友答:
你有种再说一遍 发表于 2025-9-25 19:14
acad也是DYH这种方案吧,
通过异步发送(ESC+命令)到命令栈执行,实现界面和数据库解耦.
只是需要改一些代 ...

你指的是写在
protected override SamplerStatus Sampler(JigPrompts prompts)
这里面吗?


网友答:
Hrdk 发表于 2025-9-26 10:10
你指的是写在
protected override SamplerStatus Sampler(JigPrompts prompts)
这里面吗?

ESC能够终止的地方就只有JIG循环采集鼠标点的时候呀,不然什么时候能够退出?

网友答:
你有种再说一遍 发表于 2025-9-26 10:41
ESC能够终止的地方就只有JIG循环采集鼠标点的时候呀,不然什么时候能够退出?

我试了,这个只会在鼠标移动的时候触发。如果点击按钮2,可能不会立即触发这个

网友答:
Hrdk 发表于 2025-9-26 11:27
我试了,这个只会在鼠标移动的时候触发。如果点击按钮2,可能不会立即触发这个

不会立即也会在下次移动鼠标时候取消了JIG,然后退出命令1了.
接着就执行按钮2命令.
  • 上一篇:可以用Python编写CAD插件吗?
  • 下一篇:没有了