xxwz 发表于 2018-3-23 17:14:56

LISP和DCL一同使用时,不显示对话框

本帖最后由 xxwz 于 2018-3-23 17:16 编辑

《AutoCAD程序设计魔法书》中16-4章节的例子,lsp和dcl文件见附件。
(defun c:dia5b()
(setvar "CMDECHO" 0)
(dcl_dia5b)
(prin1)
)
(defun dcl_dia5b()
(setq dcl_id (load_dialog "dia5b"))
(new_dialog "dia5b" dcl_id)
(set_tile "kww" "50")
(set_tile "khh" "50")
(action_tile "bb1" "(get_ww_hh) (done_dialog 1)")
(action_tile "bb2" "(get_ww_hh) (done_dialog 2)")
(action_tile "bb3" "(get_ww_hh) (done_dialog 3)")
(setq dd (start_dialog))
(cond ((= dd 1) (c:dia5b1))
      ((= dd 2) (c:dia5b2))
      ((= dd 3) (c:dia5b3))
      (t      (alert "未完成任何动作!!!"))
)
)
(defun get_ww_hh()       ;取得对话框的ww与hh值
(setq ww (atof (get_tile "kww")))
(setq hh (atof (get_tile "khh")))
)
(defun c:dia5b1()       ;L型主程序
(setvar "CMDECHO" 0)
(get_input_data)
(command "PLINE" p1 p2 p3 pm34 pm pm14 "c")
(prin1)
)
(defun c:dia5b2()       ;X型主程序
(setvar "CMDECHO" 0)
(get_input_data)
(command "PLINE" p1 p2 p3 p4 "c")
(command "LINE" p1 p3 "")
(command "LINE" p2 p4 "")
(prin1)
)
(defun c:dia5b3()       ;漏斗型主程序
(setvar "CMDECHO" 0)
(get_input_data)
(command "PLINE" p1 p2 p4 p3 "c")
(prin1)
)
(defun get_input_data()       ;共同数据取得与处理子程序
;;;(setq ww (getreal "\n宽度WW:"))       ;动作取消
;;;(setq hh (getreal "\n高度HH:"))       ;动作取消
(setq p1 (getpoint "\n插入点:"))
(setq p2 (polar p1 0 ww))
(setq p3 (polar p2 (* pi 0.5) hh))
(setq p4 (polar p3 pi ww))
(setq pm (inters p1 p3 p2 p4))
(setq pm12 (polar p1 0 (* ww 0.5)))
(setq pm34 (polar p3 pi (* ww 0.5)))
(setq pm23 (polar p2 (* pi 0.5) (* hh 0.5)))
(setq pm14 (polar p1 (* pi 0.5) (* hh 0.5)))
)/*★★★★★ListDCL @ fsxm.mjtd.com★★★★★*/
dia5b:dialog {
    label = "按钮测试范例" ;
    :boxed_row {
      label = "图形尺寸" ;
      :edit_box {
            edit_width = 8 ;
            key = "kww" ;
            label = "宽度WW" ;
      }
      :edit_box {
            edit_width = 8 ;
            key = "khh" ;
            label = "高度HH" ;
      }
    }
    :button {
      key = "bb1" ;
      label = "绘制DIA5B1→L型" ;
    }
    :button {
      key = "bb2" ;
      label = "绘制DIA5B2→X型" ;
    }
    :button {
      key = "bb3" ;
      label = "绘制DIA5B3→漏洞型" ;
    }
    spacer_1;
    cancel_button;
}

程序运行后,不出现对话框,直接提示"未完成任何动作!!!"。
请大神帮看看什么原因,谢谢!

祝好!

gaomingabc456 发表于 2018-3-24 14:21:20

dia5b.dcl 文件加到支持文件搜索路径中或在    (setq dcl_id (load_dialog "dia5b"))中加入绝对路径 如:
(setq dcl_id (load_dialog "D:\\dia5b")) ,把文件放到D盘根目录中

xxwz 发表于 2018-3-25 09:59:05

gaomingabc456 发表于 2018-3-24 14:21
dia5b.dcl 文件加到支持文件搜索路径中或在    (setq dcl_id (load_dialog "dia5b"))中加入绝对路径...

谢谢回复,有两个问题:
1、另外一个示例(dia5a),我用类似的方法是能成功的;
2、load_dialog加载DCL文件,搜寻的顺序是:当前的工作路径文件夹,当前编辑图文件的所在文件夹,AutoCAD所设定的支持路径,包含AutoCAD执行文件所在的文件夹。所以,路径应该没有问题吧?

xxwz 发表于 2018-3-25 17:32:58

问题找到了,但是原理不明白,下面两种情况中lsp和dcl文件均在CAD的“支持文件搜索路径”中。
1、原来的操作办法:在飞诗Lisp编辑器里面按F6(加载所有),然后在CAD里面输入快捷键(dia5b),这时就出现提问里面的错误。
2、另外的操作办法:在CAD里面输入(load “dia5b”),然后输入快捷键(dia5b),这时可以正常运行。

renyonghua2014 发表于 2019-6-22 22:17:41

支持的文件搜索路径中即可。

song宋_74729 发表于 2022-6-29 14:28:35

=====================================================================
   (setq dcl_file (open (setq tmp-dcl-file-name (vl-filename-mktemp nil nil".DCL")) "w"))
            (progn
               (foreach x
                   '(

                     "/*★★★★★ListDCL @ fsxm.mjtd.com★★★★★*/"
                     "dia5b:dialog {"
                     "    label = \"按钮测试范例\" ;"
                     "    :boxed_row {"
                     "      label = \"图形尺寸\" ;"
                     "      :edit_box {"
                     "            edit_width = 8 ;"
                     "            key = \"kww\" ;"
                     "            label = \"宽度WW\" ;"
                     "      }"
                     "      :edit_box {"
                     "            edit_width = 8 ;"
                     "            key = \"khh\" ;"
                     "            label = \"高度HH\" ;"
                     "      }"
                     "    }"
                     "    :button {"
                     "      key = \"bb1\" ;"
                     "      label = \"绘制DIA5B1→L型\" ;"
                     "    }"
                     "    :button {"
                     "      key = \"bb2\" ;"
                     "      label = \"绘制DIA5B2→X型\" ;"
                     "    }"
                     "    :button {"
                     "      key = \"bb3\" ;"
                     "      label = \"绘制DIA5B3→漏洞型\" ;"
                     "    }"
                     "    spacer_1;"
                     "    cancel_button;"
                     "}"
   ) (write-line x dcl_file) )
   (setq dcl_file (close dcl_file)))

(defun c:dia5b()
        (setvar "CMDECHO" 0)
        (dcl_dia5b)
        (prin1)
)
(defun dcl_dia5b()
        (setq dcl_id (load_dialog tmp-dcl-file-name))
        (new_dialog "dia5b" dcl_id)
        (set_tile "kww" "50")
        (set_tile "khh" "50")
        (action_tile "bb1" "(get_ww_hh) (done_dialog 1)")
        (action_tile "bb2" "(get_ww_hh) (done_dialog 2)")
        (action_tile "bb3" "(get_ww_hh) (done_dialog 3)")
        (setq dd (start_dialog))
        (cond ((= dd 1) (c:dia5b1))
                  ((= dd 2) (c:dia5b2))
                  ((= dd 3) (c:dia5b3))
                  (t      (alert "未完成任何动作!!!"))
        )
)
(defun get_ww_hh()       ;取得对话框的ww与hh值
        (setq ww (atof (get_tile "kww")))
        (setq hh (atof (get_tile "khh")))
)
(defun c:dia5b1()       ;L型主程序
        (setvar "CMDECHO" 0)
        (get_input_data)
        (command "PLINE" p1 p2 p3 pm34 pm pm14 "c")
        (prin1)
)
(defun c:dia5b2()       ;X型主程序
        (setvar "CMDECHO" 0)
        (get_input_data)
        (command "PLINE" p1 p2 p3 p4 "c")
        (command "LINE" p1 p3 "")
        (command "LINE" p2 p4 "")
        (prin1)
)
(defun c:dia5b3()       ;漏斗型主程序
        (setvar "CMDECHO" 0)
        (get_input_data)
        (command "PLINE" p1 p2 p4 p3 "c")
        (prin1)
)
(defun get_input_data()       ;共同数据取得与处理子程序
        ;;;(setq ww (getreal "\n宽度WW:"))       ;动作取消
        ;;;(setq hh (getreal "\n高度HH:"))       ;动作取消
        (setq p1 (getpoint "\n插入点:"))
        (setq p2 (polar p1 0 ww))
        (setq p3 (polar p2 (* pi 0.5) hh))
        (setq p4 (polar p3 pi ww))
        (setq pm (inters p1 p3 p2 p4))
        (setq pm12 (polar p1 0 (* ww 0.5)))
        (setq pm34 (polar p3 pi (* ww 0.5)))
        (setq pm23 (polar p2 (* pi 0.5) (* hh 0.5)))
        (setq pm14 (polar p1 (* pi 0.5) (* hh 0.5)))
)




合併版 ,試試看
页: [1]
查看完整版本: LISP和DCL一同使用时,不显示对话框