layout - Autocad - 自动更新 lisp 生成的字段(布局计数器)

标签 layout lisp field autocad autolisp

任务:在自动更新其值的字段中使用工作表计数器。最终目标是为每个布局创建类似“Table {1} of {5}” 的文本,其中 {1} 是布局名称(位于 system variables/ctab) 和 {5} 是布局的总数。后者在内置字段中找不到,因此唯一知道它的方法是使用 lisp 代码 (length (layoutlist))

我创建了一个 AcadDoc.lsp 文件并将其放入 autodesk 文件夹中。 LISP代码如下:

    (setq *LayoutCount* 
     (length 
      (vl-remove-if 
       (function 
        (lambda (aLayout) (= (strcase aLayout) "MODEL"))) 
      (layoutlist))))

每次我打开 DWG 文件时运行。可悲的是,在重新加载 DWG(关闭并重新打开)之前,该字段不会更新。有没有人知道每次在列表中添加/删除布局时如何更新此 *LayoutCount* 变量?

注意 - 我已经检查了切换布局时重新生成的选项,并且强制更新字段不会产生任何结果。我想我的代码只在第一次打开 DWG 时运行,然后就不再运行了。

最佳答案

正如您所收集的,acaddoc.lsp 中的代码文件只会在绘图启动时进行评估,因此您的 *LayoutCount* 的值(value)变量仅在首次打开绘图时是正确的。

解决此问题的一种可能方法是使用 Visual LISP Reactor 在执行某些操作后更新此变量的值。

例如,您可以按以下方式使用 Miscellaneous Reactor 在事件布局更改时更新变量值:

(
    (lambda ( )
        (vl-load-com)
        (foreach grp (vlr-reactors :vlr-miscellaneous-reactor)
            (foreach rtr (cdr grp)
                (if (= "layoutcount-reactor" (vlr-data rtr))
                    (vlr-remove rtr)
                )
            )
        )
        (vlr-set-notification
            (vlr-miscellaneous-reactor "layoutcount-reactor"
               '(
                    (:vlr-layoutswitched . layoutswitched-callback)
                )
            )
            'active-document-only
        )
        (defun layoutswitched-callback ( rtr arg )
            (setq *layoutcount* (length (layoutlist)))
        )
        (layoutswitched-callback nil nil)
        (princ)
    )
)

将上面的代码复制到你的acaddoc.lsp*layoutcount*变量将在绘图启动时定义,并在每次事件布局更改时更新。

此外,没有必要删除 Model来自 layoutlist 返回的列表函数,因为此函数仅返回 Paperspace 布局列表。


但是,使用全局变量提供此信息的缺点是全局变量将仅在事件 AutoCAD session 期间在文档命名空间内定义,并且需要为 重新定义每节课

因此,如果您的一位同事或第三方要打开绘图文件,除非他们也运行在您的 acaddoc.lsp 中找到的代码, *layoutcount*不会定义变量,因此该字段不会正确显示。

因此,另一种方法是利用字段表达式实际上可以引用任何 ActiveX 属性,而不仅仅是那些显示在 FIELD 中的事实。命令对话框。

我用我的 Layout Field application 演示了这项技术,它允许您创建引用 Count 的字段表达式布局集合的属性。

这种方法有几个优点:

  • 绘图内容不依赖于任何外部代码。
  • CTAB未引用系统变量,即 DATAEXTRACTION命令将输出正确的信息,而不是为每个布局输出相同的值。

关于layout - Autocad - 自动更新 lisp 生成的字段(布局计数器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57450995/

相关文章:

delphi - TClientDataSets 的 'invalid field type' 错误我不明白

android - 在 Android 中创建二维 ScrollView 的正确方法是什么?

c++ - 在子尺寸更改后调整父窗口的大小

html - 以最大宽度居中绝对定位的 div

Lisp 简单问题

c# - 公共(public)属性(property)定义

css - 为什么我的侧边栏和我的内容之间有额外的空间?

scheme - 在 Scheme 中,普通的、未引用的列表是否有语法糖?

list - 我如何将值存储到 Scheme 的读取中?或者那是不可能的?

unix - 仅打印字符串中的第一个字段