用 AutoLISP 设置 MODEMACRO (概念)

AutoCAD 2008

 
用 AutoLISP 设置 MODEMACRO
概念 快速参考
 
 
 

设置 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)"
  )
)

适当地缩进代码可以提高 AutoLISP 文件和 DIESEL 字符串的可读性。