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

Layout Autocad-自动更新lisp生成的字段(布局计数器),layout,lisp,field,autocad,autolisp,Layout,Lisp,Field,Autocad,Autolisp,任务:在自动更新其值的字段中使用工作表计数器。最终目标是为每个布局创建一个类似于“表{1}of{5}”的文本,其中{1}是布局名称(位于系统变量/ctab),而{5}是布局总数。后一个在内置字段中找不到,因此了解它的唯一方法是使用lisp代码(length(layoutlist)) 我创建了一个AcadDoc.lsp文件并放入autodesk文件夹。LISP代码如下所示: (setq*布局计数* (长度 (如果需要,请移除vl) (功能 (lambda(aLayout)(=(strcase aL

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

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

(setq*布局计数*
(长度
(如果需要,请移除vl)
(功能
(lambda(aLayout)(=(strcase aLayout)“MODEL”))
(布局列表)
每次打开DWG文件时都会运行。遗憾的是,在重新加载DWG(关闭并重新打开)之前,该字段不会更新。是否有人知道如何在每次从列表中添加/删除布局时更新此*LayoutCount*变量


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

正如您所收集的,只有在图形启动时才会计算
acaddoc.lsp
文件中的代码,因此
*LayoutCount*
变量的值只有在第一次打开图形时才正确

解决此问题的一种可能方法是使用Visual LISP 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
,因为此函数仅返回纸张空间布局列表


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

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

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

我用my演示了这项技术,它允许您创建一个引用Layouts集合的
Count
属性的字段表达式

这种方法有几个优点:

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

令人印象深刻!你的回答比我见过的任何人都快。非常感谢,非常清晰和水晶般的回答。不知道为什么搜索引擎没有把我直接带到你的应用程序!你能告诉我你的应用程序是否允许我在多行文字中添加字段吗?或者它就像gif一样编辑所有的文本?不管怎样,我只是看到了代码:在根代码中或放置文本后编辑文本没有问题。非常欢迎!还感谢您的积极反馈。如果您需要使用该程序/代码的任何进一步帮助,请告诉我。