不死猫 发表于 2014-8-29 00:23:39

[原创] 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:36:24

本帖最后由 carrot1983 于 2015-6-28 07:39 编辑

去年都没上论坛,错过了不少好东西。
请猫老师方便时,解释一下,或者说,有没有办法打开任意CAD,都能实现,
而不是DCL要在第一个CAD调用。
试了一下,会出现这种提示: ; 错误: VisualLISP: Member not found: funcall

另外,经过测试,vlide从CAD2006以后,应该就只有一种版本,那就是
VL.Application.16

z312144636 发表于 2024-3-30 14:23:48


学习下!!!谢谢!!!

不死猫 发表于 2014-8-29 00:27:05

就算中秋节提前发的月饼,到时候就不要找我领啦!
提前祝坛友们节日快乐.

819534890 发表于 2014-8-29 00:48:19

太好了,谢谢分享

laiz3000 发表于 2014-8-29 05:16:08

看看猫老师的好东西

crtrccrt 发表于 2014-8-29 07:50:22

一个字
很好

spp_wall 发表于 2014-8-29 08:06:29

学习下!!!谢谢!!!

maiko 发表于 2014-8-29 08:17:26

看看猫老师的好东西

qyming 发表于 2014-8-29 08:29:38

有这样的功能,神了

ynhh 发表于 2014-8-29 08:32:28

本帖最后由 ynhh 于 2014-8-29 08:37 编辑

猫老师总是在创新啊
太牛了

请教猫老师:
能不能双击列表框中的目录任一内容
就可直接进入指定的程序
而不用再点击确定按钮?

springwillow 发表于 2014-8-29 08:41:09

好东西,这样做对话框的时候就方便多了,不用自己一边在纸上画一边写代码一边调试了。
页: [1] 2 3 4 5 6 7
查看完整版本: [原创] DCL对话框在开启状态下进行调试!