明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 14049|回复: 62

[【不死猫】] [原创] DCL对话框在开启状态下进行调试!

    [复制链接]
发表于 2014-8-29 00:23 | 显示全部楼层 |阅读模式
本帖最后由 不死猫 于 2014-9-23 23:38 编辑

众所周知,在DCL对话框开启状态的时候,因为是模态对话框,无法加载lisp代码实时调试,必须关闭DCL,重新加载程序,运行,查看代码修改的效果.
那么是否有办法在DCL开启状态下进行代码的调试呢?
答案是:有!

方法:开启2个AutoCAD,从第二个CAD传递代码到第一个AutoCAD中去!
步骤:
打开第一个AutoCAD,加载我们的DCL程序并运行TT命令,让DCL为开启状态:

然后打开第二AutoCAD,打开VLIDE编辑器,加载我下面的代码:
  1. (or vl
  2.   (progn
  3.     (vl-load-com)
  4.     (setq acad (vlax-get-object "AutoCAD.Application"));测试于acad2006,版本号16,后面的版本号为17,18,18.1,18.2,19.....
  5.     (setq ve (substr (Vlax-Get (Vlax-Get-Acad-Object) 'Version ) 1 2));版本号根据你的CAD来定,也可以自己写
  6.     (setq vl (Vlax-Invoke-Method acad 'GetInterfaceObject (strcat "VL.Application." ve)))
  7.     (setq ad (Vlax-Get vl 'ActiveDocument ))
  8.     (setq funcs (Vlax-Get ad 'Functions ))
  9.     (setq func_eval (vlax-get-property funcs 'item "eval"))
  10.     (setq func_read (vlax-get-property funcs 'item "read"))
  11.     (princ)
  12.   )
  13. )
  14. (defun go (sym)
  15.   (setq str (vl-prin1-to-string SYM))
  16.   (setq call (vlax-invoke func_read 'funcall str))
  17.   (setq ret (vlax-invoke func_eval 'funcall call))
  18.   (print ret)
  19.   (princ)
  20. )
  21. (go '(set_tile "Text1" "234"))

  22. (go '(start_list "List1"))
  23. (go '(mapcar 'add_list '("1" "2" "3")))
  24. (go '(end_list))
  25. (go '(set_tile "List1" "2"))

  26. (go '(start_list "Combo1"))
  27. (go '(mapcar 'add_list '("4" "5" "6")))
  28. (go '(end_list))
  29. (go '(set_tile "Combo1" "1"))

  30. (go '(set_tile "Option1" "1"))
  31. (go '(set_tile "Check1" "1"))
执行这段代码,你看到了什么?
没错,我们第一个AutoCAD的DCL对话框数据已经发生改变了!(注意DCL运行的那个AutoCAD必须是windows里面第一个开启的cad,否则没有反应)
如果需要获取数据,就调用 '(get_tile "控件key")

用户的点击动作,代码发生改变的时候,我们希望DCL不用关闭的情况下,执行新的代码进行测试.
比如我们修改刚才lsp中的部分代码:
  1. (defun Action_Form1_Keys (key value) ;全部控件的点击动作触发
  2.   (cond
  3.     ((= key "accept") ;{确认按钮}
  4.       
  5.       (Get_Form1_Data)
  6.       (done_dialog 1);对话框退出返回主函数 传递给Dialog_Return值为1
  7.     )
  8.     ((= key "cancel") ;{取消按钮}
  9.       
  10.       (done_dialog 0);对话框退出返回主函数 传递给Dialog_Return值为0
  11.     )
  12.     ((= key "Check1") ; {"复选"} (多选按钮)
  13.       (alert "ok")
  14.     )
  15.     ((= key "Option1") ; {"单选1"} (单选按钮)
  16.       (alert "ok")
  17.     )
  18.     ((= key "Option2") ; {"单选2"} (单选按钮)
  19.       (alert "ok")
  20.     )
  21.     ((= key "List1") ; {} (普通列表)
  22.       ()
  23.     )
  24.     ((= key "Combo1") ; {"Combo1"} (下拉列表)
  25.       ()
  26.     )
  27.   )
  28. )
然后记得保存Form1.lsp文件
接下来我们使用这个代码,就能够让修改后的代码直接生效了:
  1. (go '(load "E:\\Lisp\\dcl调试方法\\Form1.lsp"));路径自己改
  2. 点击控件弹出警告.
  3. 其他的控件都是类似的,学会的同学举个爪吧:)
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

发表于 2015-6-28 07:36 | 显示全部楼层
本帖最后由 carrot1983 于 2015-6-28 07:39 编辑

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

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

回复 支持 1 反对 0

使用道具 举报

发表于 2024-3-30 14:23 | 显示全部楼层

学习下!!!谢谢!!!
 楼主| 发表于 2014-8-29 00:27 | 显示全部楼层
就算中秋节提前发的月饼,到时候就不要找我领啦!
提前祝坛友们节日快乐.
发表于 2014-8-29 00:48 | 显示全部楼层
太好了,谢谢分享
发表于 2014-8-29 05:16 | 显示全部楼层
看看猫老师的好东西
发表于 2014-8-29 07:50 | 显示全部楼层
一个字
很好
发表于 2014-8-29 08:06 | 显示全部楼层
学习下!!!谢谢!!!
发表于 2014-8-29 08:17 | 显示全部楼层
看看猫老师的好东西
发表于 2014-8-29 08:29 | 显示全部楼层
有这样的功能,神了
发表于 2014-8-29 08:32 | 显示全部楼层
本帖最后由 ynhh 于 2014-8-29 08:37 编辑

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

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

点评

当然可以,先给个变量,然后done_dialog,再根据变量值调用指定程序即可.  发表于 2014-8-29 08:49
发表于 2014-8-29 08:41 | 显示全部楼层
好东西,这样做对话框的时候就方便多了,不用自己一边在纸上画一边写代码一边调试了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-20 11:45 , Processed in 0.431971 second(s), 35 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表