gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:52:12 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com