【问题标题】:Autocad - update lisp generated field automatically (layouts counter)Autocad - 自动更新 lisp 生成的字段(布局计数器)
【发布时间】:2019-12-18 10:21:22
【问题描述】:

任务:在自动更新其值的字段中使用工作表计数器。最终目标是为每个布局创建类似 "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 时运行,然后不再运行。

【问题讨论】:

    标签: layout lisp field autocad autolisp


    【解决方案1】:

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

    解决此问题的一种可能方法是使用 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* 变量将在绘图启动时定义,并在每次更改活动布局时更新。

    除此之外,没有必要从layoutlist 函数返回的列表中删除Model,因为该函数只返回一个Paperspace 布局列表。


    但是,使用全局变量来提供此信息的缺点是全局变量只能在活动的 AutoCAD 会话期间在文档命名空间中定义,并且需要为 重新定义每个会话

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

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

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

    这种方法有几个优点:

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

    【讨论】:

    • 令人印象深刻!你回答得比我见过的任何人都快。非常感谢,非常清晰和清晰的答案。不知道为什么搜索引擎没有直接把我带到你的应用程序!你能告诉我你的应用程序是否允许我在多行文本中添加字段吗?还是只是作为 gif 并编辑所有文本?
    • 没关系,我只是看到代码:在根代码中或放置后编辑文本没有问题。
    • 不客气!也感谢您的积极反馈。如果您在使用该程序/代码时需要任何进一步的帮助,请告诉我。
    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多