Visual LISP for AutoCAD R14 全 新 的CAD 开 发 环 境

彭 明 华----王 卫 安----王 晓 艳


---- AutoCAD 是 一 个 非 常 流 行 的CAD 平 台, 在 建 筑、 机 械、 测 绘 等 领 域 尤 其 如 此, 它 拥 有 着 广 泛 的 用 户 和 一 批 高 素 质 的 开 发 人 员。AutoCAD 如 此 普 及 得 益 于 它 强 大 的 功 能、 使 用 上 的 便 利 以 及 良 好 的 开 放 性, 用 户 可 以 定 制 自 己 的 外 部 命 令(PGP)、 菜 单(Menu)、 型(Shape)、 线 型(LineType)、 多 线(MultiLine)、 填 充(Hatch) 等, 它 还 提 供 了 众 多 的 二 次 开 发 环 境: 包 括R12 及 以 前 版 本 提 供 的AutoLISP、ADS(Advanced Development System), 以 及R13、R14 新 增 加 的ADSRX、ObjectARX、 还 有 本 文 要 介 绍 的Visual LISP 等, 这 些 众 多 的 二 次 开 发 环 境 对 于 满 足 不 同 层 次 应 用 的 需 求, 有 着 非 常 积 极 的 意 义。

---- 在 介 绍Visual LISP 之 前 对AutoLISP 做 一 些 简 单 的 回 顾 是 有 必 要 的。AutoLISP 是AutoCAD 内 嵌 的 一 种 解 释 语 言,AutoCAD 的 用 户 从2.18 版 开 始 就 可 以 进 行 一 些 较 简 单 的 二 次 开 发。R10 发 布 时,AutoLISP 程 序 运 行 于 扩 展 内 存 中, 用 户 可 以 编 写 一 些 规 模 稍 大 的 应 用。Autodesk 在AutoCAD 的 后 继 版 本 中 一 直 提 供 了 对 它 的 支 持, 直 到 最 新 发 布 的AutoCAD R14。

---- AutoLISP 的 大 部 分 功 能 是 直 接 针 对AtuoCAD 的, 又 具 有 简 单 易 学 的 优 点, 所 以AutoCAD 下 的 编 程 绝 大 多 数 是 从AutoLISP 开 始 的,AutoLISP 在AutoCAD 的 二 次 开 发 环 境 中 也 因 此 而 占 有 重 要 的 地 位。 然 而 计 算 机 技 术 在 不 断 地 向 前 发 展, 程 序 的 规 模 越 来 越 庞 大, 逻 辑 结 构 也 更 加 复 杂,CAD 中 的 二 次 开 发 也 不 再 仅 仅 局 限 于 交 互 性 了。 由 于AutoLISP 是 一 种 解 释 语 言, 决 定 了 它 的 运 行 速 度 比 较 慢; 解 释 运 行 导 致 的 另 一 个 缺 点 是AutoLISP 程 序 不 能 编 译, 软 件 开 发 者 的 劳 动 成 果 得 不 到 保 护。 随 着CAD 应 用 层 次 的 提 高, 不 但 要 求CAD 能 画 图, 而 且 要 进 行 相 关 的 计 算, 而 计 算 并 不 是AutoLISP 的 长 项。AutoLISP 还 有 一 个 比 较 大 的 缺 点 就 是 使 用 不 方 便, 由 于AutoCAD 本 身 并 未 提 供 一 个 专 门 的AutoLISP 程 序 设 计 环 境, 致 使 程 序 的 编 写、 加 载 都 不 方 便, 用 户 只 能 在 某 种 字 处 理 程 序 下 编 写AutoLISP 的 程 序, 然 后 切 换 到AutoCAD 下 装 入 并 执 行, 程 序 的 调 试 也 不 方 便, 此 外 还 缺 少 在 线 帮 助。

---- AutoLISP 的 后 继 版 本 — — 可 视 化 的 集 成 开 发 环 境Visual LISP for AutoCAD R14 作 为 一 个 全 新 的 开 发 环 境, 令 耳 目 一 新, 它 的 推 出, 使 得 一 些 根 本 性 的 变 化 呈 现 在 用 户 面 前。

---- Autodesk 在http: ∥www.autodesk.com 提 供 了Visual LISP 的Demo 版 安 装 程 序 供 免 费 下 载( 以 前 是Beta 版), 安 装 后 缺 省 地 在AutoCAD R14 的 目 录 下 生 成VLISP 目 录,Visual LISP 的 主 文 件 是VLIDE.ARX, 先 运 行AutoCAD 然 后 装 入 该ARX 程 序 就 可 以 启 动Visual LISP 的 集 成 开 发 环 境 了, 启 动 界 面 如 附 图 所 示。


附图

---- Visual LISP 的 集 成 开 发 环 境(IDE) 是 标 准 的Windows 程 序, 它 包 括 一 个Visual LISP Console 窗 口, 一 个Trace 窗 口, 数 个 文 档 窗 口 以 及Debug 时 的Watch 窗 口 等 等。 在 文 档 窗 口 中 可 以 很 方 便 地 进 行 源 程 序 的 输 入 和 编 辑, 不 同 的 数 据 类 型 有 不 同 的 显 示 颜 色 以 示 区 别, 语 法 关 键 字 高 亮 显 示, 按 几 下 按 纽 就 可 以 对 源 程 序 进 行 对 齐 排 列 和 语 法 检 查, 程 序 的 装 入(Load) 也 有 快 捷 按 钮, 切 换 至AutoCAD 环 境 运 行 程 序 也 很 方 便。 还 可 以 在Console 窗 口 里 输 入 一 条 或 多 条LISP 语 句, 来 查 看 执 行 的 效 果。

---- 提 出 工 程 文 件 的 概 念 Visual LISP 提 出 了 工 程 文 件 的 概 念, 它 是 一 个 项 目 中 相 关 文 件 的 集 合, 工 程 文 件 对 于 编 写 较 大 规 模 的 应 用 程 序 十 分 有 用, 以 前 在 编 写 较 大 规 模 的 应 用 时 一 般 趋 向 于 选 用ADS, 使 用AutoLISP 往 往 会 使 程 序 的 结 构 变 得 不 清 晰, 但ADS 编 程 需 要 熟 悉C/C++ 语 法, 还 需 要 丰 富 的 调 试 经 验, 而 且 对 于 交 互 语 句 比 较 多 或 引 用 很 多AutoCAD 命 令 的 程 序 采 用ADS 就 不 是 太 有 利,AutoLISP 还 很 简 洁, 特 别 是 涉 及 到 实 体 操 作 时 更 是 如 此,AutoLISP 的 实 体 数 据 表 要 比ADS 的 结 果 缓 存 器 简 单 得 多。 通 常 对AutoLISP 而 言, 几 百 上 千 行 的 程 序 已 经 很 长 了, 对 于 较 大 型 的 项 目 可 以 建 立 工 程 文 件, 工 程 文 件 中 包 括 数 个 小 的 应 用 模 块, 这 样 程 序 的 结 构 比 较 清 晰, 调 试 和 维 护 也 比 较 容 易。 当 程 序 调 试 完 毕 后 可 以 按 需 要 进 行 编 译, 包 括 在Visual LISP 环 境 中 使 用 的FAS, 以 及 可 以 单 独 使 用 和 发 布 的ARX 程 序, 这 样 既 可 以 加 快 程 序 的 运 行 速 度, 又 可 以 保 护 软 件 开 发 者 的 权 益。

---- 调 试 功 能 强 大 Visual LISP 另 一 个 比 较 显 著 的 特 点 就 是 它 提 供 了 强 大 的 调 式 工 具, 以 前 在 使 用AutolLISP 进 行 程 序 设 计 时, 程 序 的 调 整 试 是 一 件 十 分 麻 烦 的 事 情, 更 别 说 动 态 地 跟 踪 和 调 试 了, 为 了 找 出 程 序 中 隐 藏 的 错 误, 必 须 在 程 序 段 中 插 入 大 量 的 打 印 语 句 以 便 于 察 看 程 序 执 行 的 中 间 过 程, 十 分 不 方 便, 而 且 很 不 直 观。 现 在 在Visual LISP 的 集 成 环 境 中 对 程 序 进 行 动 态 地 跟 踪 和 调 试 是 一 件 是 轻 而 易 举 的 事 情, 用 户 可 以 像 调 试C++ 程 序 那 样 调 试LISP 程 序: 包 括 设 计 断 点, 单 步 等, 还 可 以 动 态 地 察 看 变 量 的 值, 这 样 你 就 可 以 很 方 便 地 了 解 和 控 制 程 序 执 行 的 进 程, 快 速 查 找 出 程 序 中 存 在 的 错 误, 甚 至 是 写 错 变 量 名 等 十 分 隐 蔽 的 错 误, 这 类 错 误 在 以 前 是 很 难 调 试 的。

---- ActiveX 函 数 增 多 Visual LISP 新 增 了 一 批ActiveX 函 数, 这 类 函 数 以VLA 或VLX 为 前 缀, 这 是AutoLISP 第 一 次 提 供 面 向 对 象 的 编 程 接 口。 就 如 同 面 向 对 象 的 语 言 例 如C++ 那 样, 每 个 对 象 都 有 它 的 属 性(Object Properties) 和 方 法(Object Methods)。AutoCAD 中 的 实 体 都 有 一 个 或 多 个 属 性, 例 如 一 个 圆 对 象 可 以 用 半 径, 面 积, 线 型 等 属 性 来 描 述, 也 可 以 用ActiveX 函 数 来 获 取 或 改 变 这 些 属 性, 这 些ActiveX 函 数 称 为 对 象 方 法。 这 就 提 供 了 另 外 一 条 操 作AutoCAD 数 据 库 的 十 分 快 捷 的 途 径。 利 用 这 些 函 数, 你 可 以 对AutoCAD 的 图 形 数 据 和 非 图 形 数 据 进 行 最 有 效 的 控 制, 可 以 完 成 前AutoLISP 难 以 完 成 的 或 根 本 不 可 能 做 到 的 事 情。

---- 监 控 手 段 增 强 利 用Visual LISP 还 可 以 对AutoCAD 的 事 件 进 行 监 视, 可 以 做 到 对AutoCAD 全 方 位 的 控 制, 这 是 利 用 定 义 一 种 称 为Reactors 的 对 象 来 实 现 的,Reactors 对 象 监 视AutoCAD 的 行 为, 当 特 定 的 事 件 发 生 时, 它 将 触 发 特 定 的 函 数 调 用, 来 实 现 用 户 的 特 定 的 目 的,Visual LISP 提 供 了4 类Reactors:Linker Reactors 主 要 负 责 对 应 用 程 序 的 加 载 与 卸 载 进 行 监 控,Editor Reactors 主 要 负 责 对AutoCAD 命 令 的 执 行 情 况 进 行 监 控, 如 命 令 的 发 出、 执 行 和 执 行 完 毕 等,Database Reactors 对AutoCAD 的 数 据 库 进 行 监 控, 如 数 据 库 对 象 记 录 的 增 减,Object Reactors 主 要 负 责 对 实 体 的 行 为 进 行 监 控, 如 被 移 动、 删 除 等。 利 用Visual LISP 定 义 的Reactors, 我 们 可 以 较 完 全 地 控 制Auto CAD 的 行 为, 使AutoLISP 的 程 序 表 现 出 一 定 程 度 的 智 能 性。

---- 在 线 帮 助 使 用 方 便 Visual LISP 与AutoLISP 相 比, 另 一 个 较 大 的 改 进 就 是Visaul LISP 提 供 了 在 线 帮 助, 以 前AutoLISP 是 没 有 开 发 环 境 的, 也 就 没 有 在 线 帮 助,AutoCAD 也 没 有 提 供 与AutoLISP 有 关 的 帮 助, 要 得 到 帮 助 的 就 得 翻 参 考 书 或 者 向 别 人 请 教, 有 时 候 这 是 一 件 十 分 麻 烦 的 事 情。 现 在 这 种 情 况 得 到 了 根 本 的 转 变, 在 编 程 时 碰 到 疑 问, 只 要 按F1 键 就 可 以 进 入 帮 助 系 统。Visual LISP 提 供 的 是 标 准 的Windows 风 格 的 帮 助, 使 用 起 来 很 方 便,Visual LISP 提 供 的 帮 助 内 容 是 比 较 丰 富 的, 包 括 了Visual LISP 编 程 指 南 和Visual LISP 函 数 参 考, 还 有 面 向 初 学 者 的 教 程, 所 以 无 论 是AutoLISP 的 初 学 者 还 是AutoLISP 的 熟 练 编 程 者, 都 可 以 获 得 十 分 详 尽 的 帮 助 信 息。

---- Visual LISP 还 提 供 一 些 小 的 技 巧, 这 些 技 巧 对 编 程 很 有 帮 助, 例 如: 在AutoLISP 程 序 设 计 中, 括 号 的 配 对 是 一 个 十 分 重 要 的 问 题, 但 在 有 时 候 却 不 容 易 处 理, 现 在Visual LISP 提 供 了 匹 配 的 快 捷 键:Ctrl+Shift+ ] 和Ctrl+Shift+ [, 用 它 们 来 进 行 匹 配 十 分 方 便 且 界 面 直 观, 在 一 定 程 度 上 减 轻 了 编 程 者 的 劳 动 强 度。Visual LISP 还 提 供 了 函 数 的 助 记 功 能,AutoLISP 有 大 量 的 比 较 类 似 的 函 数, 如 以Ent 开 头 的 实 体 函 数、 以VLA 或VLAX 开 头 的ActiveX 函 数 等, 容 易 发 生 混 淆, 只 要 输 入 函 数 开 头 几 个 字 母 再 按 住Ctrl+Shift+Space 键 就 可 以 弹 出 一 批 相 类 似 的 函 数 名 供 选 择, 十 分 方 便, 这 样 的 小 技 巧 在Visual LISP 中 是 很 多 的。

---- 综 上 所 述,Visual LISP 的 出 现 对 于 广 大 的AutoLISP 编 程 者 来 说 是 一 件 好 事 情, 它 界 面 友 好、 使 用 方 便 而 且 功 能 强 大, 它 不 但 可 以 提 高AutoLISP 的 编 程 效 率, 而 且 对 于AutoCAD R14 的 普 及 与 应 用 水 平 的 提 高 也 是 大 有 帮 助 的。

---- ( 作 者 地 址: 同 济 大 学 测 量 系,200092; 收 稿 日 期:1998 年09 月)


中国计算机世界出版服务公司版权所有