[原创] DCL对话框在开启状态下进行调试!
本帖最后由 不死猫 于 2014-9-23 23:38 编辑众所周知,在DCL对话框开启状态的时候,因为是模态对话框,无法加载lisp代码实时调试,必须关闭DCL,重新加载程序,运行,查看代码修改的效果.
那么是否有办法在DCL开启状态下进行代码的调试呢?
答案是:有!
方法:开启2个AutoCAD,从第二个CAD传递代码到第一个AutoCAD中去!
步骤:
打开第一个AutoCAD,加载我们的DCL程序并运行TT命令,让DCL为开启状态:
然后打开第二AutoCAD,打开VLIDE编辑器,加载我下面的代码:(or vl
(progn
(vl-load-com)
(setq acad (vlax-get-object "AutoCAD.Application"));测试于acad2006,版本号16,后面的版本号为17,18,18.1,18.2,19.....
(setq ve (substr (Vlax-Get (Vlax-Get-Acad-Object) 'Version ) 1 2));版本号根据你的CAD来定,也可以自己写
(setq vl (Vlax-Invoke-Method acad 'GetInterfaceObject (strcat "VL.Application." ve)))
(setq ad (Vlax-Get vl 'ActiveDocument ))
(setq funcs (Vlax-Get ad 'Functions ))
(setq func_eval (vlax-get-property funcs 'item "eval"))
(setq func_read (vlax-get-property funcs 'item "read"))
(princ)
)
)
(defun go (sym)
(setq str (vl-prin1-to-string SYM))
(setq call (vlax-invoke func_read 'funcall str))
(setq ret (vlax-invoke func_eval 'funcall call))
(print ret)
(princ)
)
(go '(set_tile "Text1" "234"))
(go '(start_list "List1"))
(go '(mapcar 'add_list '("1" "2" "3")))
(go '(end_list))
(go '(set_tile "List1" "2"))
(go '(start_list "Combo1"))
(go '(mapcar 'add_list '("4" "5" "6")))
(go '(end_list))
(go '(set_tile "Combo1" "1"))
(go '(set_tile "Option1" "1"))
(go '(set_tile "Check1" "1"))
执行这段代码,你看到了什么?
没错,我们第一个AutoCAD的DCL对话框数据已经发生改变了!(注意DCL运行的那个AutoCAD必须是windows里面第一个开启的cad,否则没有反应)
如果需要获取数据,就调用 '(get_tile "控件key")
用户的点击动作,代码发生改变的时候,我们希望DCL不用关闭的情况下,执行新的代码进行测试.
比如我们修改刚才lsp中的部分代码:(defun Action_Form1_Keys (key value) ;全部控件的点击动作触发
(cond
((= key "accept") ;{确认按钮}
(Get_Form1_Data)
(done_dialog 1);对话框退出返回主函数 传递给Dialog_Return值为1
)
((= key "cancel") ;{取消按钮}
(done_dialog 0);对话框退出返回主函数 传递给Dialog_Return值为0
)
((= key "Check1") ; {"复选"} (多选按钮)
(alert "ok")
)
((= key "Option1") ; {"单选1"} (单选按钮)
(alert "ok")
)
((= key "Option2") ; {"单选2"} (单选按钮)
(alert "ok")
)
((= key "List1") ; {} (普通列表)
()
)
((= key "Combo1") ; {"Combo1"} (下拉列表)
()
)
)
)然后记得保存Form1.lsp文件
接下来我们使用这个代码,就能够让修改后的代码直接生效了:(go '(load "E:\\Lisp\\dcl调试方法\\Form1.lsp"));路径自己改
点击控件弹出警告.
其他的控件都是类似的,学会的同学举个爪吧:) 本帖最后由 carrot1983 于 2015-6-28 07:39 编辑
去年都没上论坛,错过了不少好东西。
请猫老师方便时,解释一下,或者说,有没有办法打开任意CAD,都能实现,
而不是DCL要在第一个CAD调用。
试了一下,会出现这种提示: ; 错误: VisualLISP: Member not found: funcall
另外,经过测试,vlide从CAD2006以后,应该就只有一种版本,那就是
VL.Application.16
学习下!!!谢谢!!! 就算中秋节提前发的月饼,到时候就不要找我领啦!
提前祝坛友们节日快乐. 太好了,谢谢分享 看看猫老师的好东西 一个字
很好 学习下!!!谢谢!!! 看看猫老师的好东西 有这样的功能,神了 本帖最后由 ynhh 于 2014-8-29 08:37 编辑
猫老师总是在创新啊
太牛了
请教猫老师:
能不能双击列表框中的目录任一内容
就可直接进入指定的程序
而不用再点击确定按钮? 好东西,这样做对话框的时候就方便多了,不用自己一边在纸上画一边写代码一边调试了。