高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】无模式对话框下的lisp函数调用解决方案讨论
无模式对话框下的lisp函数调用解决方案讨论
无模式对话框下的lisp函数调用解决方案讨论
当时偶从电邮得到楼主的源代码之后用vc debug调试的结果显示, 在无模式对话框下, 调用acedcommand / acedcmd 但不关对话框, autocad将获取不到任何参数, 以至于出现invalid command:nil的错误. 如果这两个命令是在vc提供的标准ok / cancel按钮上呼叫, 那么就能够实现, 但是对话框会被关掉, 也就是和有模对话框并无区别.
原因不清, 偶个人认为是vc无模式对话框建立在堆栈上使得autocad同样使用堆栈的acedcommand / acedcmd无法进入造成. 有模对话框是建立在内存中, 并不占用堆栈, 所以在有模对话框下或者关闭无模对话框释放堆栈指针之后就可以运行acedcommmand / acedcmd.
今天调试出了一个解决方案: 使用acdocmanager的sendstringtoexecute(). 这个命令函数从内存直接向autocad呼叫命令, 不使用堆栈, 所以可以实现无模式对话框的按钮对lisp中已定义的函数的调用.
代码:
假设lisp中已经定义一个名为myfun (x)的函数, x是从对话框edit box获得的int数据.
在无模式对话框的onbutton函数中进行如下操作:
cstring szcommand;
char temp [10];
// 把int转换为string
itoa (m_nedit, temp, 10); // m_nedit为从edit box获得数据的对话框变量, 10是表示用10进制转换.
// 下面开始生成命令字串
szcommand = "(";
szcommand += "myfun "; // 命令名称和参数之间要用空格分开. 如果有多个参数, 参数之间也要用空格分开.
szcommand += temp; // 如果edit box变量类型设定不是int而是cstring, 那么可以省略temp和itoa(), 这一步直接用+= m_nedit
szcommand += ")\n"; // 括号表示直接从autocad command line运行lisp函数命令, \n表示按回车键
// 用命令字串执行
acdocmanager -> sendstringtoexecute ( acdocmanager -> mdiactivedocument(), szcommand, true, true); // 此命令的参数使用可以参考arx帮助
如果lisp中定义的函数是c:xxx, 那么szcommand中就省去括号. 总之, 执行命令时在autocad的命令行中键入的是什么字串, 用sendstringtoexecute送过去的就是什么字串便可.
virtue is like a rich stone, best plain set.
-- francis bacon, <of beauty>
谢谢大侠帮忙,真是好极了,解决了我的大问题啊!!!
大侠,我试了一下,怎么temp的值一直是0,没有接受到edit来的值啊?
应该加上一句updatedata(true);这样才能收到来自edit的输入值。
偶汗....
私下里觉得, updatedata是mfc appwizard最应该替人准备却没有准备的一句话..
virtue is like a rich stone, best plain set.
-- francis bacon, <of beauty>
|