场景举例:一个界面上有两个按钮,按钮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网友答:
我之前的项目里面有用过这种方式,估计这也是唯一满足cad机制的方法了。
感觉cad还有一些接口没有暴露出来,细节的东西处理不了。网友答: 本帖最后由 你有种再说一遍 于 2025-9-25 23:18 编辑
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网友答:
高版本直接用commandasync就可以解决这个问题了
网友答:
你指的是写在
protected override SamplerStatus Sampler(JigPrompts prompts)
这里面吗?
网友答:
ESC能够终止的地方就只有JIG循环采集鼠标点的时候呀,不然什么时候能够退出?网友答:
我试了,这个只会在鼠标移动的时候触发。如果点击按钮2,可能不会立即触发这个网友答:
不会立即也会在下次移动鼠标时候取消了JIG,然后退出命令1了.
接着就执行按钮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命令.