【问题标题】:How to properly link DCL to AutoLisp?如何正确地将 DCL 链接到 AutoLisp?
【发布时间】:2012-06-02 08:59:42
【问题描述】:

我正在尝试构建一个非常基本的 AutoLisp 界面。我是这方面的初学者,所以在未能从头开始编写代码后,我转向正确学习 DCL。我按照本教程进行操作:

http://www.afralisp.net/dialog-control-language/tutorials/dialog-boxes-and-autolisp-part-1.php

我也遇到了同样的错误。 AutoCAD 基本上退出执行该函数,就好像 dcl 文件甚至不存在一样。

我尝试将地址完全输入其中,但我认为它应该能够像将 HTML 链接到同一文件夹中的图像一样工作。

下面是我的代码:

DCL:

samp1 : dialog {
    label = "Structural Holes";

    ok_cancel;
}

Lisp:

(defun C:samp1()
  (setq dcl_id (load_dialog "samp1.dcl"))
  (if (not (new_dialog "samp1" dcl_id))
    (exit)
    )

  (action_tile
       "cancel"
       "(done_dialog)(setq userclick nil)"
       )
  (action_tile
    "accept"
    "(done_dialog)(setq userclick T))"
    )

  (start_dialog)

  (unload_dialog dcl_id)

  (princ)

 )

(princ)

感谢任何愿意花时间帮助我解决此问题的人。我开始非常绝望,这是我的第一个也是唯一一个 autolisp 项目,所以我没有任何经验......

LE:请注意,dcl 文件和 lisp 文件都在同一个文件夹中,没有其他子文件夹或其他任何东西。

【问题讨论】:

    标签: dialog lisp autocad autolisp


    【解决方案1】:

    不管怎样,您还可以在“已知目录”(例如 AutoCAD 所在的目录)中动态创建一个对话框。下面将证明这一点。

    (defun _make-getstring-dialog-on-the-fly ( / fn f dcl dcl_id userclick str) 
      (setq fn (strcat
                 (vl-filename-directory
                   (findfile "acad.exe")) "\\$vld$.dcl")
            f (open fn "w")
            dcl
            '(
              "stringdlg : dialog {"
              "label = \"Charater Array\";"
              ": edit_box {"
              "label = \">>:\";"
              "edit_width = 20;"
              "key = \"stringdlg\";"
              "is_default = true;"
              "}"
              ": row {"
              "alignment   = centered;"
              "fixed_width = true;"
              " : button {"
              " label      = \"OK\";"
              " key        = \"dcl_accept\";"
              " width      = 10;"
              " allow_accept = true;"
              " }"
              "}"
              "}"
              )
            )
      (mapcar 
        (function
          (lambda ( x )
            (write-line x f)
            (write-line "\n" f)))
        dcl)
      (close f)
      (setq dcl_id (load_dialog fn))
      (new_dialog "stringdlg" dcl_id)
      (action_tile "stringdlg" "(setq str $value)(done_dialog)")
      (setq userclick (start_dialog))
      (unload_dialog dcl_id)
      str
      )
    

    【讨论】:

      【解决方案2】:
      1. 找不到**.DCL 文件
      2. 错误:退出/退出中止
      3. 错误:加载失败

        这通常意味着找不到 autolisp 文件或 DCL 文件。要解决此问题,请确保将 autolisp 和 DCL 文件放在 AutoCAD 搜索路径中。更具体地说,将它们放在属于“支持文件和搜索路径”的目录中。要查找 AutoCAD 支持文件和搜索路径列表,请执行以下操作:

      4. 在 AutoCAD 中,单击工具下拉菜单。

      5. 转到“选项”菜单项。
      6. 单击“文件”选项卡。
      7. 点击支持文件和搜索路径前面的加号+。

        这是您的搜索路径位置。列出的目录按顺序从上到下搜索您尝试加载的任何 autolisp 程序。它还用于查找块和 DCL 文件。

        要么添加存储 autolisp 和 DCL 文件的目录,要么将 autolisp 和 DCL 文件移动到此处列出的目录之一。这应该会结束上面列出的错误。

      我在这里偶然发现了这条信息:

      http://www.jefferypsanders.com/autolisp_nodcl.html

      非常感谢 JefferyPSanders 的贡献......

      【讨论】:

      • 测试和开发时,只需从文件所在的文件夹启动 AutoCAD。首先搜索当前目录。这样,您就不会在搜索路径中乱扔许多文件夹。开发结束后,将您的 LSP 和 DCL 文件移动到您的支持文件夹或列表中的任何其他文件夹。要在首选文件夹中启动 Autocad,请将地址复制到启动 Autocad 时使用的图标中,或者创建一个批处理文件并在该文件夹是当前文件夹时从 CMD 提示符调用它。
      • 您可以检查 AutoCAD 是否可以找到不应返回 nil 的 (findfile "samp1.dcl") 文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-25
      • 2017-01-28
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      相关资源
      最近更新 更多