设置 MODEMACRO 值的另一种方法是使用 AutoLISP。
可将下面显示的代码样例保存为 ASCII 格式的文本文件,然后用 AutoLISP load 函数加载。
下面的 AutoLISP 命令用于定义一个提供与内置状态行中的信息类似的 MODEMACRO 字符串。由于 AutoLISP 不能在多行中延续字符串,因此要使用 AutoLISP strcat 函数将较短的部件字符串合并成完整的 MODEMACRO 字符串。
(defun C:ACADMODE ( )
(setvar "modemacro"
(strcat
"Layer $(substr,$(getvar,clayer),1,8)"
"$(if,$(getvar,orthomode), Ortho)"
"$(if,$(getvar,snapmode), Snap)"
"$(if,$(getvar,tabmode), Tablet)"
"$(if,$(=,$(getvar,tilemode),0),"
"$(if,$(=,$(getvar,cvport),1), P)"
")"
)
)
)
将此 AutoLISP 例程保存在名为“acadmode.lsp”的文件中。如果加载并执行该例程,则状态行中将显示信息。但这不是最佳的应用,仅用作一个样例。
下面的样例文件“acad.lsp”使用 S::STARTUP 函数将 MODEMACRO 变量设置为由 AutoLISP 文件“mode1.lsp”定义的字符串。
;;; Sample acad.lsp file that uses S::STARTUP to load the
;;; file MODE1.LSP which defines a MODEMACRO string
(defun S::STARTUP()
(load "mode1")
(princ)
)
;;; Additional AutoLISP files can also be defined or
;;; loaded here
加载 AutoLISP 文件 (“mode1.lsp”) 时,将使用 MODEMACRO 系统变量定义状态行,显示 L: 且其后跟图层名的前八个字符、图形名和部分路径以及当前处于活动模式的每个名称的第一个字母。不管图层名的长度如何变化,图形名的位置是固定的。
;;; MODE1.LSP
;;;
(setvar "modemacro"
(strcat
"L:$(substr,$(getvar,clayer),1,30)"
"$(substr, ,1,$(-,30,$(strlen,$(getvar,clayer)))) "
;; ^^^^^^^^ Note the 8 spaces here
"<.."
"$(if,$(eq,$(getvar,dwgname),UNNAMED),UNNAMED,"
"$(substr,$(getvar,dwgname),"
"$(if,$(>,$(strlen,$(getvar,dwgprefix)),29),"
"$(-,$(strlen,$(getvar,dwgprefix)),29),1"
"),"
"$(strlen,$(getvar,dwgname))"
")"
")"
">"
"$(if,$(getvar,orthomode), O, )"
"$(if,$(getvar,snapmode), S, )"
"$(if,$(getvar,tabmode), T, )"
"$(if,$(and,"
"$(=,$(getvar,tilemode),0),$(=,$(getvar,cvport),1)),P)"
)
)