Layout Autocad-自动更新lisp生成的字段(布局计数器)
任务:在自动更新其值的字段中使用工作表计数器。最终目标是为每个布局创建一个类似于“表{1}of{5}”的文本,其中{1}是布局名称(位于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
系统变量/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