VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - VB在ACADWIN中的使用
发表评论(0)作者:吴启明, 平台:VB6.0+Win98, 阅读:8176, 日期:2001-02-17
VB在ACADWIN中的使用
吴启明
  

AutoCAD 是 一 个 常 用 工 业 绘 图 平 台, 用 户 在 使 用 时 经 常 要 用Lisp 或ADS 进 行 二 次 开 发, 但Lisp 处 理 数 据 库 能 力 差, 编 制 界 面 困 难, 而ADS 要 求 较 高 . 相 比 之 下,Visual Basic( 以 下 简 称VB) 编 写 独 立 程 序 的 速 度 快, 编 制 界 面 容 易, 可 进 行 快 速 计 算, 可 操 作 数 据 库。ACADWIN 是AUTOCAD 的Windows 版 程 序, 具 有WINDOWS 的 许 多 特 点。 可 以 利 用DDE 进 行VB 与ACADWIN 之 间 的 通 讯, 实 现AutoCAD 编 程。

VB 在ACADWIN 的 应 用 文 件
因 为ACADWIN R12 不 支 持 如 PastLink 的 直 接DDE 方 法, 所 以 要 有 一 个 控 件 与VB 相 联 系, 以 进 行 数 据 传 递。 这 里 主 要 用 到 以 下 几 个 文 件:
1):DDEBAS.EXE 这 是VB/DDE 服 务 器 程 序, 必 须 在 运 行VB 应 用 程 序 前 调 入, 在 命 令 行 下 键 入:(XLOAD“DDEBAS”)。
2):ACADVB.DLL,VB 应 用 程 序 的 动 态 连 接 库。
3):GLOBAL.BAS,VB 应 用 程 序 的 全 程 变 量 的 定 义 文 件。
4):ADSFUNCS.BAS,VB 应 用 程 序 对ADS 库 标 准 函 数 的 调 用。
5):ADSFUNCS.FRM, 标 准ACADWIN 的 初 始VB 窗 口。
6):NEW.FRM, 用 于 新 建 标 准 初 始VB 窗 口。

后4 个 文 件 在ACADWIN/VB/NEW 目 录 下, 编 程 时 只 要 打 开NEWPROJ.MAK 就 都 有 了, 但NEW.FRM 可 以 不 要, 只 要 把 启 动 文 件 定 为ADSFUNC.FRM 即 可。

VB 在ACADWIN 的 使 用 方 法
为 了 实 现DDE 通 讯, 先 要 在ADSFUNCS.FRM 中 增 加 一 个 用 于 通 讯 的TEXT( 文 本 框) 控 件, 并 在 特 性 表 中 将 其NAME 命 名 为ACADTEXT,TEXT 的CAPTION 置 为 空 串( 减 少 窗 体 不 必 要 的 信 息),VISIBLE 特 性 呈 为TURE。 用linkapp 函 数 初 始 化 并 关 闭 连 接。
过 程 linkapp 代 码 如 下:

sub linkapp(link as contonl,appname as string,topic as string)
link.linkmode=0注释: 关 闭 通 讯
link.linktopic=appname+“|”+topic 注释: 置 通 讯 主 题
link.linkmode=2 注释: 手 工 通 讯
end sub
增 加 一 个 过 程unlinkapp, 其 代 码 如 下:
sub unlinkapp(link as contonl)
link.linkmode=0注释: 关 闭 通 讯
end sub
在 窗 体 事 件 中, 增 加 如 下 代 码:
sub form_load()
LINKAPP ACADTEXT,“AUTOCAD.DDE”,“SYSTEM”
end sub
sub form_unload(cancel as integer)
UNLINKAPP ACADTEXT
end sub

如 画 圆“CIRCLE”, 先 在ADSFUNC.FRM 中 增 加 一 个 命 令 钮COMMAND1, 将 其CAPTION 置 为“C
IRCLE”, 在 子 过 程 中 增 加 以 下 代 码:
SUB COMMAND1_CLICK()
ACADTEXT.LINKEXECUTE “[^3^3 CIRCLE]”
END SUB

至 此 可 以 实 现 绘 图 命 令。 如 果 要 实 现 复 杂 的 功 能, 如 捕 捉 特 征 点, 获 得 特 性, 参 数 化 绘 图, 等 能 否 让 完 成 界 面 及 计 算 功 能, 把 参 数 传 给 一 个Lisp 程 序, 然 后 再 将 程 序 调 入 环 境 中 完 成 绘 图 呢 ? 答 案 是 肯 定 的 这 就 要 用 到“SendKey" 语 句。 该 语 句 功 能 是 向 具 有 焦 点 的 窗 口 发 送 字 符, 就 象 从 键 盘 中 键 入 一 样。 这 时 先 用 函 数FindACAD() 找 到ACADWIN 的 句 柄, 再 用AcadACTIVE 函 授 激 活ACADWIN, 使 其 具 有 焦 点, 这 时 就 可 以 用SendKey 了。

如 有 一 个Lisp 程 序YZ.LSP, 主 函 数 为“C:YZ()”, 可 先 在ADSFUNC.FRM 中 增 加 一 个 命 令 钮COMMAND2, 将 其CAPTION 置 为“YZ”, 在 子 过 程 中 增 加 以 下 代 码:

SUB COMMAND2_CLICK()
hwndAcad%=FindAcad()
AcadActivate(hwndAcad%)
SendKeys “{(}load+‘yz+注释:{)}”, -1
SendKeys “{enter}”, -1
SendKeys “yz”, -1
END SUB

以 上 方 法 可 以 实 现 通 过VB 的 界 面 选 取 参 数, 进 行 计 算; 用Lisp 进 行 绘 图。 有 两 个 问 题 值 得 注 意: 一: 如 要 进 行 参 数 的 传 递, 可 以 先 用VB 写 临 时 数 据 文 件, 再 用Lisp 读 此 临 时 数 据 文 件。 二: 因 为 与 窗 体 布 置 不 一 定 使ACADWIN 和VB 应 用 程 序 两 者 同 时 可 见,Lisp 程 序 执 行 完 毕, 不 能 自 动 返 回 到VB 应 用 程 序, 这 时 可 以 通 过 调 用Windows API 函 数SetWindowPos 来 使 应 用 程 序 总 浮 在 最 上 面, 避 免 了 来 回 切 换 窗 口。 这 种 技 术 的 实 现 在 本 报 已 有 介 绍.

在ADSFUNCS.BAS 中 也 定 义 了 很 多ADS 函 数 可 供 调 用。 如ACADWIN\VB\ASVU 中 有 一 个 例 子ASVU.EXE, 就 是 应 用Ads_getvar 及Ads_setvar 函 数, 在SYSVARS.MAK 的intervai.bas 可 以 看 到。 但DDE 的 链 接 方 式 要 改 变, 在 启 动 窗 体 或 函 授 中 加 上:

DDE_TIMEOUT=-1 注释: 等 待 一 个DDE 事 件
openDDE 注释:ADSFUNCS.BAS 中 一 个 函 数, 初 始 化DDE 链 接