VBA开发AUTOCAD实现参数化绘图
基于VBA在AutoCAD中自动绘图的应用

基于VBA在AutoCAD中自动绘图的应用------李广亚随着电脑技术的飞速发展,目前大多数企业都采用AutoCAD制图、绘图,在工程施工领域也是采用AutoCAD进行二维工程绘图。
GPS的应用使的施工现场坐标的采集非常方便,通常便于直观,监理、业主会要求将GPS采集的坐标绘制在CAD图上。
对于一个熟悉CAD的人来说,将10几个坐标数据手工录入坐标绘制到CAD中是比较容易的,但如果是几十个点,上百个点,甚至几百个点,对于一个施工技术员来说一个一个坐标的手工录入,就成了一个比较有难度的工作,主要因为手工录入会比较繁琐、耗费时间长还特别容易出错。
在这方面如何能提高技术人员的工作效率?基于此,我们采用AtuoCAD中的VBA技术,进二次开发,可以方便的将大量的坐标自动绘制到CAD图中。
下面通过一个简单事例来说明AtuoCAD中VBA技术的二次开发自动绘图程序的过程: 事件介绍:2012年业主在场区开挖一不规则多边形鱼塘,要求我单位将鱼塘进行测量并标注在总平面图上。
1、数据采集:使用GPS现场进行数据采集,在鱼塘周边从一点开始,顺时针方向进行,在不规则鱼塘的所有角点拐点均采集坐标,并保存在GPS中。
2、导出坐标:将GPS中采集的坐标导出到文本文档,如下图:3、数据处理:将导入的坐标使用EXCEl文档打开并编辑处理,高程全设为0,表单重命名为“SJ”,保存EXCEl文档到D盘,文档名称为“GPS导入坐标绘图”如下图:4、VBA跨平台技术二次开发:(1)、打开AutoCAD,选择工具->宏->VBA编辑器,打开VBA编辑器。
在VBA编缉器中插入用户窗体,在窗体上插入按钮组件,如图:(2)、双击按钮,打开代码编辑窗口,编缉代码如下:Private Sub CommandButton1_Click()Dim xlapp As Excel.ApplicationDim xlbook As Excel.workbookDim xlsheet As Excel.worksheetSet xlapp = CreateObject("excel.application")Set xlbook = xlapp.workbooks.Open("D:\GPS导入坐标绘图.xls")'打开的EXCEL路径xlapp.Visible = FalseSet xlsheet = xlbook.worksheets("sj") '打开EXCEL中的sj工作表i = xlsheet.Cells(1, 2) 'i为线条线数For p = 0 To i - 2 Step 1p = pk1 = xlsheet.Cells(3 + p, 3) '将表格第3行第3列内数值赋值给K1,X坐标值h1 = xlsheet.Cells(3 + p, 2)k3 = xlsheet.Cells(3 + p, 4)k2 = xlsheet.Cells(4 + p, 3)h2 = xlsheet.Cells(4 + p, 2)h3 = xlsheet.Cells(4 + p, 4)Dim 点 As AcadLineDim 起点(2) As DoubleDim 端点(2) As Double起点(0) = k1 '将K1值贱赋值给起点数组内第一个值,即起点X坐标。
基于VBA在AutoCAD中自动绘图的应用

基于VBA在AutoCAD中自动绘图的应用------李广亚随着电脑技术的飞速发展,目前大多数企业都采用AutoCAD制图、绘图,在工程施工领域也是采用AutoCAD进行二维工程绘图。
GPS的应用使的施工现场坐标的采集非常方便,通常便于直观,监理、业主会要求将GPS采集的坐标绘制在CAD图上。
对于一个熟悉CAD的人来说,将10几个坐标数据手工录入坐标绘制到CAD中是比较容易的,但如果是几十个点,上百个点,甚至几百个点,对于一个施工技术员来说一个一个坐标的手工录入,就成了一个比较有难度的工作,主要因为手工录入会比较繁琐、耗费时间长还特别容易出错。
在这方面如何能提高技术人员的工作效率?基于此,我们采用AtuoCAD中的VBA技术,进二次开发,可以方便的将大量的坐标自动绘制到CAD图中。
下面通过一个简单事例来说明AtuoCAD中VBA技术的二次开发自动绘图程序的过程: 事件介绍:2012年业主在场区开挖一不规则多边形鱼塘,要求我单位将鱼塘进行测量并标注在总平面图上。
1、数据采集:使用GPS现场进行数据采集,在鱼塘周边从一点开始,顺时针方向进行,在不规则鱼塘的所有角点拐点均采集坐标,并保存在GPS中。
2、导出坐标:将GPS中采集的坐标导出到文本文档,如下图:3、数据处理:将导入的坐标使用EXCEl文档打开并编辑处理,高程全设为0,表单重命名为“SJ”,保存EXCEl文档到D盘,文档名称为“GPS导入坐标绘图”如下图:4、VBA跨平台技术二次开发:(1)、打开AutoCAD,选择工具->宏->VBA编辑器,打开VBA编辑器。
在VBA编缉器中插入用户窗体,在窗体上插入按钮组件,如图:(2)、双击按钮,打开代码编辑窗口,编缉代码如下:Private Sub CommandButton1_Click()Dim xlapp As Excel.ApplicationDim xlbook As Excel.workbookDim xlsheet As Excel.worksheetSet xlapp = CreateObject("excel.application")Set xlbook = xlapp.workbooks.Open("D:\GPS导入坐标绘图.xls")'打开的EXCEL路径xlapp.Visible = FalseSet xlsheet = xlbook.worksheets("sj") '打开EXCEL中的sj工作表i = xlsheet.Cells(1, 2) 'i为线条线数For p = 0 To i - 2 Step 1p = pk1 = xlsheet.Cells(3 + p, 3) '将表格第3行第3列内数值赋值给K1,X坐标值h1 = xlsheet.Cells(3 + p, 2)k3 = xlsheet.Cells(3 + p, 4)k2 = xlsheet.Cells(4 + p, 3)h2 = xlsheet.Cells(4 + p, 2)h3 = xlsheet.Cells(4 + p, 4)Dim 点 As AcadLineDim 起点(2) As DoubleDim 端点(2) As Double起点(0) = k1 '将K1值贱赋值给起点数组内第一个值,即起点X坐标。
VB对AutoCAD的二次开

实验VB对AutoCAD的二次开发一、实验目的了解CAD二次开发的几种形式,掌握VB对AutoCAD进行二次开发,实现参数化绘图的技巧。
二、实验要求1、了解AutoCAD二次开发的基本原理2、掌握运用VB开发界面的方法3、掌握运用VB调用AutoCAD库函数,完成相关功能的方法三、实验步骤1、建立AutoCAD和VB之间的连接启动VB,建立“标准exe”程序,选择菜单“工程”——“引用”,选择“AutoCAD 2004 Type Library”。
2、创建界面3、程序编码1)定义全局变量Dim AcadApp As AcadApplication 'AutoCAD应用程序变量Dim AcadDoc As AcadDocument 'AutoCAD文档变量2)引用AutoCAD应用程序Private Sub Command1_Click()On Error Resume NextIf Err ThenErr.ClearEnd IfSet AcadApp = New AcadApplicationIf Err ThenMsgBox Err.DescriptionExit SubEnd If'设置AutoCAD应用程序参数AcadApp.WindowTop = 0AcadApp.WindowLeft = 400AcadApp.Width = 600AcadApp.Height = 800AcadApp.Visible = TrueAcadApp.Documents.AddSet AcadDoc = AcadApp.ActiveDocumentAcadDoc.WindowState = acMaxCommand4.Enabled = TrueEnd Sub3)参数化绘图Private Sub Command4_Click()'设置新图层Dim layer1 As AcadLayerDim layer2 As AcadLayerSet layer0 = yers.Item(0)Set layer1 = yers.Add("粗实线层")Set layer2 = yers.Add("中心线层")layer1.Lineweight = acLnWt080 '粗实线的线宽layer1.Color = acWhitelayer2.Color = acRedAcadDoc.Linetypes.Load "centerx2", "acad.lin"layer2.Linetype = "centerx2"'输入原始参数Dim Center(0 To 2) As DoubleDim Vert(0 To 7) As DoubleDim L04 As DoubleDim L01 As DoubleDim b As DoubleDim r As Doubleb = Val(Text2.Text): r = Val(Text1.Text) / 2: L01 = r - Val(Text3.Text) L04 = Sqr(r * r - (b / 2) ^ 2)Center(0) = 100: Center(1) = 100: Center(2) = 0'画中心线AcadDoc.ActiveLayer = layer2Dim line1 As AcadLineDim line2 As AcadLine'定义两直线的端点Dim pl1s(0 To 2) As DoubleDim pl1e(0 To 2) As DoubleDim pl2s(0 To 2) As DoubleDim pl2e(0 To 2) As Doublepl1s(0) = Center(0) - r - 1.5: pl1s(1) = Center(1): pl1s(2) = 0pl1e(0) = Center(0) + r + 1.5: pl1e(1) = Center(1): pl1e(2) = 0pl2s(0) = Center(0): pl2s(1) = Center(1) + r + 1.5: pl2s(2) = 0pl2e(0) = Center(0): pl2e(1) = Center(1) - r - 1.5: pl2e(2) = 0Set line1 = AcadDoc.ModelSpace.AddLine(pl1s, pl1e)Set line2 = AcadDoc.ModelSpace.AddLine(pl2s, pl2e)'创建辅助的优化多段线AcadDoc.ActiveLayer = layer1'定义键槽直线端点Dim p1(0 To 2) As DoubleDim p2(0 To 2) As DoubleDim p3(0 To 2) As DoubleDim p4(0 To 2) As DoubleDim angVal As DoubleDim pLine1 As AcadLineDim pLine2 As AcadLineDim pLine3 As AcadLineDim pArc As AcadArcDim pi As Double '定义圆周率p1(0) = Center(0) - b / 2: p1(1) = Center(1) + L01: p1(2) = 0p2(0) = p1(0): p2(1) = Center(1) + L04: p2(2) = 0p3(0) = p1(0) + b: p3(1) = p1(1): p3(2) = 0p4(0) = p1(0) + b: p4(1) = p2(1): p4(2) = 0Set pLine1 = AcadDoc.ModelSpace.AddLine(p1, p2)Set pLine2 = AcadDoc.ModelSpace.AddLine(p1, p3)Set pLine3 = AcadDoc.ModelSpace.AddLine(p3, p4)angVal = Atn((b / 2) / L04)pi = 3.1415Set pArc = AcadDoc.ModelSpace.AddArc(Center, r, pi / 2 + angVal, 2 * pi + pi / 2 - angVal)AcadApp.ZoomExtentsAcadDoc.ActiveLayer = layer0End Sub'查询Private Sub CmdSeek_Click() Dim aVal As Integer 'A值 aVal = CInt(Text1.Text) Text2.Text = GetVal(aVal)End Sub。
基于VBA的AutoCAD参数化设计探讨

图2
为了能从窗体输入数据并能正确绘制轴的参数化 图形 ,需要 为窗 体 和控件添加程序代码 , 在添加代码前 , 应首先按绘图所需 的参数定义 窗体级变量 。 P b c , ,1 2 3 A L s obe ’ ul W2 , , , , A u l 用来存储轴的各种参数 i W1 L L L I 5 D 由于篇幅所限仅列举 C d r m Da w的 Ci 事件程序代码如下 : lk c
、
户能够方便 的进行可视化操作 , 人机界面设计简单美 观。因此在二次开 发中,主要运用 V A语言进行图形绘制 的程序设计 。V A即 Mirsf B B coo t
ole中的 Vsa B s r pi tn,它 被 集 成 到 A tC 0 0以后 fc i l aif l ai s u co Ap c o uo AD20 所有的版 本中。VB A和 A tC uo AD中强大的 A t e 自动化对象模 型的 cvX i 结合, 代表了一种新型的定制 A t A uo D的模式构架 。通过 V A 我们可 C B, 以操作 A tC D控制 A t e uo A , ci X和其它一些应用程序 , v 使之相互之 间发生 互 易 活动 。 B 和 V VA B的 主 要 差 别 是 V A 和 A tC D在 同 一进 程 空 间 B uo A
中运行, 提供的是具有 Au C D智能的 、 t A o 非常快速 的编程环境。
二 、 uo D 参数 化 设 计 的 基本 思 想及 设 计 过 程 A tOA
参数化设计 的基本思想是保持图形结构之问的相互拓扑关 系( 进行 产 品设计所采用的数学模型及产品的结 构) 固定不变的。 是 参数化 的含 义有两种: 参数化 和图形参数化。设计参数化对应于产 品的设计过 设计 程 , 特点是 : 其 控制产 品的参数在 整个设 计过程 中其数 目、 数值 和类型 都不断发生变化 , 在设汁的某一时刻还有可能发生参数转换 , 即控制参 数 由一组变为另 一组 。 图形参数 化对应 于最终产品或某些常用零部件 , 此时控制参数 只有数值变化 , 不存在参数类型和整组控制参数的转换。 对于产品 ,我们可 以将 已知条件及其他的随着产品规格而变化的基本 参数用响应 的变量代替 ,然后根据这些已知条件和基本参数来控制图 形的几何 尺寸大小 ,部分参数值的改变能够直接导致设 汁结果的 自动 修 改。 基于 V A的 A tC D参数 化设计系统 主要采用的是二维图纸 的 B uo A 绘 制, 设计者打开 A t A uo D设计界 面, V A管理器新建 个工程 , C 由 B 并 且 保 存 在 适 当的 位 置 , 此 工 程 中创 建 系列 件 的数 据 库 , 种 零 件 的儿 在 各 何参数基于数据库系统建立通讯 与调用 ,设计过程 的主要信息和数据 均存储在数据库中。并通过 动态数据交换(D ) D E功能 向绘图程序传递尺 寸参数 。 然后进入 V A集成开发环境 , B 新建窗体和模块 , 该窗体创建 在 需要的控件 ,设定其属性要与数据库 匹配,在各 自代码 区编写绘 图程 序, 调用数据库中的相应数据 , 来完成参数化 的设计程序代码。 三、 阶梯轴参数化设计过程 有些企业的产品经 常用到阶梯轴 ,如 图 1 所示 。这些阶梯轴系列 化、 通用化和标准化程度高 。 可以利 用参数化设计极大地改善 图形设计 的重构能力, 高了设计 的柔性。 提
利用VB实现AutoCAD二次开发中参数化绘图

C h i 2 0 1 4 N O . 0 7 ( 上) n a Ne W Te c h no l o z i e s a n d Pr o d u c t s
利用 VB实现 Au t o C AD 二次开发 中 参数化绘 图
陈 炜
( 江 省 大丰 中等 专业学校 ,江苏 大丰 2 2 4 1 0 0 )
实 现参 数 化绘 图 的背景 从 A u t o C A D R1 4版 本 以 后 , 就 增 加 了 采 用 相 同 的方 法 ,将 2中所 有 菜 单 A u t o C A D作 为一 款 工 程 方 面非 常 出 A c t i v e X A u t o m a t i o n 自动化 服务 的功 能 。 全 部 建立 好 相 对 应 的 子 窗体 ,并 在 菜 单 色 的软 件 , 因其 优 秀 图 形 处 理 能力 和 通 而 V i s u a l B a s i c 是 Wi n d o w s 操 作 系 统 下 最 ’中用 “ 窗体 名 . s h o w ”命令 调 用各 自子 窗 用 性 而 得 到 广 泛 普 及 与 应 用 ,正 因 为该 常用 的支持 A c t i v e X A u t o m a t i o n技术的开 体。如 : “ 弹簧”子菜单,打开它对应 软 件 通 用 性 很 强 ,从 而 在 进行 具 体 图形 发 工 具 。V B是 一种 面 向对象 的 可视 化 程 的窗体 ( 窗 体名 为 f r m T h ),则 用命令 绘 制 和 数 据 处 理 综 合 应 用 的 时 候 自身所 序 开发 工具 ,它 入 门简 单 易 学 ,具 有 快 f r m T h . s h o w ,代码 如下 : 具 有 的功 能 就 显 得 相 形 见 绌 。 比如 在机 速 的程 序 开 发环 境 ,代 码 的编 写 量 小 , Pr i v a t e S u b t h C l i c k( ) 械 制 图时 ,如 螺母 、垫 圈 、轴 承 、弹簧 、 开 发 人 员 改 动 界 面 方 便 直 接 、 所 见 即 所 f r mTh. s h o w 齿 轮 等 一 些 标 准 件 、 常用 件 的设 计 和绘 得 , 并且 支 持各 类最 新 的 Wi n d o w s 技术 , E n d S u b最 后 添 加 L a b e l 、T e x t B o x 、 制 ,都 需 要 用 户 逐 一 绘 制 ,这 些 标 准件 拥有强大 的数据库编程能力 ,广泛使 用 C o m m a n d B u t t o n控件完 成 参数 化绘 图窗 口 都会有大量数据 ,用户绘 图时必须查找 于 Wi n d o w s 平 台上 。 的设计 。 各 种 标 准 ,不 仅 费 时 而 且 容 易 出错 。 为 根 据 以上 五个 工 具 的 比较 ,利 用 V B 4编 程 流 程 图。 开 始 一 >连 接 了解 决 上述 问题 , 尽 可 能 的不重 复劳 动 , 对A u t o C A D二 次 开 发 实 现 参 数 化 绘 图 C A D 一 >参 数 赋 值 一 >根 据 每 圈 分 段 数 计 提 高 设 计 效 率 ,减 少 设计 开 发 周 期 ,因 将更 具优势 ,用 V B语 言编程开 发 ,将 算角度间隔 一 >用循环计算每个控制点坐 此我们想到了实现图形 的自动绘制方法。 A u t o C A D看着 V B程序 中一个绘 图 的窗 标 一 > 把 所 有 控 制 点 连 接 成 多段 线 一 > 绘 根 据 机 械 制 图 中各 种 标 准 件 结 构 特 点 , 口,对其进行打开 、编辑、绘图、打印 制截 面 圆生 成面域 一 > 完成一 >结 束 同 一 个 系列 内 ,它们 基 本 结 构 相 似 ,仅 和关闭等操作 , 其速度相对较快 。为此 , 5实现结 果和 结论 是尺寸上有些变化。对于齿轮、弹簧等 可以作为我们进行程序设计的首选工具。 ( 1 ) 输人参数如下时 ,绘制弹簧并 常用件 ,尽 管不 能像 螺栓 、螺母那样完 下 面以弹簧绘制 为例用 V B实 现 参 生 成 弹 簧 图 形 每 一 圈大 小 都 相 同 ,且 弹 全实现标准化 ,但可 以实现部分结构标 数 化 绘 图 对 A u t o C A D进 行 二 次 开 发 ,解 簧 圈数 为 4圈 。 准化 。 比如弹簧 , 我们 只需输入起始半径、 决 机 械 制 图 中标 准 件 、常 用 件 的参 数 化 起 始 半 径 :6 0 , 垂 直 增 量 :1 0 , 垂 直 增 量 、 水 平 增 量 、 圈数 、分 段 数 等 绘 图 问题 。 水平增量 :0 ,旋转 圈数 :4 ,分段数 : 参 数 ,即可 编 程 实 现 该 二 维 或 三维 图形 0。 三 、V B实现参数化绘图的系统设计 5 的 自动绘 制 。 ( 2)当改变 参 数 为下所 示 时 ,生成 1建 立 主 界 面 。 打 开 在 Mi c r o s o f t 二 、V B实现 参数 化绘 图的优 势 V i s u a l B a s i c 设 计 工 具 ,选 择 文 件 中 “ 新 弹 簧 图形 每 一 圈 大小 按 增 量 递 增 ,其 弹 为 了使 重 复性 较 大 的计 算 绘 图工 作 建 工程 ”, 进入 窗体设 计 器 。 首先, 在“ 工 簧 圈数 为 3圈 。 量 减 小 和更 加 规 范 准 确 ,A u t o C A D提 供 程”菜单中选择 “ 移除 F o r m1 ”。然后 , 起 始 半 径 :3 O ,垂 直 增 量 :2 0 ,水 了 二 次 开 发 的 功 能 接 口。进 行 其 二 次 开 在 “ 工程” 菜单中选择 “ 添加 MD I 窗体 ”, 平 增 量:1 0 ,旋转 圈 数:3 ,分 段 数 : Wo r ml 主控 窗体 。最后 ,在 1 0 0。 发的常用工具 目前大体有五种 ,分别是 即可添 加 MD 通过上述 2 组 数 据 的实 验 ,输 入 的 A D S 、0 b j e c t A R X、A u t o L I S P 、. N E T 、 “ 文件”菜单 中保存该工程 ,将 窗体保 V B A。 其 中 。A D S是 A u t o C A D 的 C语 存 为 默 认文 件 名 ,把 新 工程 保存 为 “ V B 参数不同生成的图形也不同,说明 V B实 言 开 发 系 统 ,直 接 利 用 c语 言 编译 器 , 实 现参 数化 绘 图 . v b p ”。 现 参数 化绘 图是 可行 的 。 因 涉及 到 C语 言 的 编 程 它 的 开发 不 易上 2在 MD I 主 窗 体 中建 立 菜 单 。点 击 通过 V B编 程 对 A u t o C A D进 行 二 次 手 并 且 难 度 较 大 ;O b j e c t A R X的 功 能 强 MD I F o ml r 主窗 体 , 在其 上右 击 , 选择 “ 菜 开 发 ,可 以使 标 准 件 绘 图 繁 琐 的 问题 得 大 ,效率较高 ,但是开发人员必须掌握 单编辑器” ,在弹出的对话 框中根据需 以圆满解决 ,操作起来也简单易行。大 V c + + ,难度很大 ,而且开发效率不高, 求完成相应 的菜单设计 ,注意每个菜单 家 还 可 利 用 I m a g e L i s t 与T o o l B a r 控 件 制 容 易出现 内存泄 漏;A u t o L I S P语言虽然 的名称的命名必须符合语法规范并要有 作 一 个 工 具 条 ,通 过 工 具 条 按 钮 点 击 常 其语 法规则简单、灵活 ,但是缺乏综合 意 义 ,这 里统 一 用 菜 单 名 的 拼音 首 字 母 用菜单命令绘 图将会更加方便快捷。 参考 文献 性 的开发环境 ,综合 能力差 ;. N E T是微 命名,如标题为 “ 弹簧”,名称为 “ t l l ”。 软新 一代技 术平台,功能强大 ,但对开 3添加子 窗体 。选择 “ 工程 ”菜单 『 1 1 张帆 . A u t o C A D V B A 二 次 开 发 教 程 发 环境要求 较高,而且可供学 习参考 的 中 “ 添加窗体” ,在弹 出的对话框 中选 『 M】 . 北京 : 清华大学出版社 , 2 0 0 6 . 资 料 较 少;V B A即 M c o r s o f t O f l c e中 的 择 “ 2 ] 刘永 波 . 分析 A u t o C A D 二 次开 发方 法 窗体”并 打开,然后修 改新建 窗体 『 V i s u a l B a s i c(简 称 V B) f o r A p p l i c a t i o n s 的 MD I C h i l d属 性 为 “ T ee r ” ,最 后 保 存 的研 究 卟 软件 . 2 0 1 3 . 3 4( 5) . 开 发 环 境,被 集 成 到 A u t o C A D中, 该 窗体 。
利用VBA在AutoCAD2000中实现参数化绘图

基 圆 的 交点 ( l Yb ) X 2 Y 2 。过 渡 圆弧 则 使 Xb , 1 ( b , b ) 用 S t ug eB le方法 , 一 段 轻 量 多 义 线 设 成 圆 弧 段 的 将 方 式 来 实现 。 齿顶 圆和 齿根 圆则 分 别求 出 它 们 的半
Au t A 2 0 oC D 0 0中实 现 参 数化 绘 图 的过 程 。
Auo A 0 0中使 用 的 VB 是 基 于 V 5 0 tC D 20 A B .
版 本 , 全 面 向对 象体 系结 构 的一 种 编程 语 言 , 与 完 它
VB有 着 几 乎 相 同 的 开 发 环 境 和 语 法 , 能 强 大 且 功 易于 掌握 , 且 它 驻 留 在 Auo A 的 内 部 , 构 精 而 tC D 结 简 , 码运 行 效 率高 。 代
烦 的事情 。通 常在 C D 软件 系统 中 , 决 着一 类 图 A 解 形 的方 法是 通 过 参数 化编 程 的 办 法 , 入几 个 参 数 , 输 就 能 由程 序将 重 复而 烦琐 的零 件 轮廓 绘 制 出 来 。 目 前较 为 流行 的 参 数化 绘 图 是 通 过 对 Auo A 的 二 tC D 次 开 发实 现 的 。 在 Au  ̄A 0 0平 台 上 的 开 发 工 具 主 要 有 t D 20 c VIUA IP语 言 、 D 、 X、 B 等 , 中 由 于 S L LS A S AR V A 其 VB A与其 它开 发工具 相 比, 具有 运 行 速 度快 , 发界 开
黄 秀 琴
( 州工学院 延陵学院, 苏 常州 230 ) 常 江 10 2
摘要 :用 V A 开 发 Auo A 应 有 程 序 的 方 法 ,并 通 过 一 个 实 例 ,阐 述 了 用 VB 在 B tC D A
AUTOCAD利用VBA进行二次开发

利用VBA对AUTOCAD进行二次开发实例——输入螺栓参数自动生成图形①打开AUTOCAD软件②依次点击工具l菜单,选择,Macro(A),click Visual Basic Editor(B)③打开 Microsoft Visual Basic Editor 窗口.and “公共的额”,之后点击“确定”,如下图所示:.⑤点击.点击:Command:输入螺钉长度完成绘制VBA原程序Public Sub liweiwei()Set acadapp = CreateObject("autocad.application") Dim lineObj As AcadLineDim pt1 As VariantDim d As DoubleDim l As DoubleDim pt2(0 To 2) As DoubleDim pt3(0 To 2) As DoubleDim pt4(0 To 2) As DoubleDim pt5(0 To 2) As DoubleDim pt6(0 To 2) As DoubleDim pt7(0 To 2) As DoubleDim pt8(0 To 2) As DoubleDim pt9(0 To 2) As DoubleDim pt10(0 To 2) As DoubleDim pt11(0 To 2) As DoubleDim pt12(0 To 2) As DoubleDim pt13(0 To 2) As DoubleDim pt14(0 To 2) As DoubleDim pt15(0 To 2) As DoubleDim pt16(0 To 2) As DoubleDim pt17(0 To 2) As DoubleDim pt18(0 To 2) As DoubleDim pt19(0 To 2) As DoubleDim pt20(0 To 2) As Doublept1 = ThisDrawing.Utility.GetPoint(, "输入第一角点")d = Val(InputBox("所绘制螺钉的直径:”) )l = Val(InputBox("所绘制螺钉的长度:"))pt2(0) = pt1(0) + 0.4 * d: pt2(1) = pt1(1): pt2(2) = pt1(2)pt3(0) = pt1(0) + 0.4 * d: pt3(1) = pt1(1) + 1.5 * d: pt3(2) = pt1(2)pt4(0) = pt1(0): pt4(1) = pt1(1) + 1.5 * d: pt4(2) = pt1(2)pt5(0) = pt1(0): pt5(1) = pt1(1) + 0.95 * d: pt5(2) = pt1(2)pt6(0) = pt1(0) + 0.2 * d: pt6(1) = pt1(1) + 0.95 * d: pt6(2) = pt1(2)pt7(0) = pt1(0) + 0.2 * d: pt7(1) = pt1(1) + 0.55 * d: pt7(2) = pt1(2)pt8(0) = pt1(0): pt8(1) = pt1(1) + 0.55 * d: pt8(2) = pt1(2)pt9(0) = pt1(0) + 0.4 * d: pt9(1) = pt1(1) + 1.25 * d: pt9(2) = pt1(2)pt10(0) = pt1(0) + 0.4 * d + l - 1: pt10(1) = pt1(1) + 1.25 * d: pt10(2) = pt1(2) pt11(0) = pt1(0) + 0.4 * d + l - 1: pt11(1) = pt1(1) + 0.25 * d: pt11(2) = pt1(2) pt12(0) = pt1(0) + 0.4 * d: pt12(1) = pt1(1) + 0.25 * d: pt12(2) = pt1(2)pt13(0) = pt1(0) + 0.4 * d: pt13(1) = pt1(1) + 1.25 * d - 1: pt13(2) = pt1(2)pt14(0) = pt1(0) + 0.4 * d + l: pt14(1) = pt1(1) + 1.25 * d - 1: pt14(2) = pt1(2) pt15(0) = pt1(0) + 0.4 * d + l: pt15(1) = pt1(1) + 0.25 * d + 1: pt15(2) = pt1(2) pt16(0) = pt1(0) + 0.4 * d: pt16(1) = pt1(1) + 0.25 * d + 1: pt16(2) = pt1(2)pt17(0) = pt1(0) + 0.4 * d +1:pt17(1) = pt1(1) + 1.25 * d: pt17(2) = pt1(2)pt18(0) = pt1(0) + 0.4 * d + 1 :pt18(1) = pt1(1) + 0.25 * d: pt18(2) = pt1(2)pt19(0) = pt1(0) - 5: pt19(1) = pt1(1) + 0.75 * d: pt19(2) = pt1(2)pt20(0) = pt1(0) + 0.4 * d + l + 5: pt20(1) = pt1(1) + 0.75 * d: pt20(2) = pt1(2) Set lineObj = ThisDrawing.ModelSpace.AddLine(pt1, pt2)Set lineObj = ThisDrawing.ModelSpace.AddLine(pt2, pt3)Set lineObj = ThisDrawing.ModelSpace.AddLine(pt3, pt4)Set lineObj = ThisDrawing.ModelSpace.AddLine(pt4, pt5)Set lineObj = ThisDrawing.ModelSpace.AddLine(pt5, pt6)Set lineObj = ThisDrawing.ModelSpace.AddLine(pt6, pt7)Set lineObj = ThisDrawing.ModelSpace.AddLine(pt7, pt8)Set lineObj = ThisDrawing.ModelSpace.AddLine(pt8, pt1)Set lineObj = ThisDrawing.ModelSpace.AddLine(pt9, pt10)Set lineObj = ThisDrawing.ModelSpace.AddLine(pt10, pt11)Set lineObj = ThisDrawing.ModelSpace.AddLine(pt11, pt12) Set lineObj = ThisDrawing.ModelSpace.AddLine(pt13, pt14) Set lineObj = ThisDrawing.ModelSpace.AddLine(pt14, pt15) Set lineObj = ThisDrawing.ModelSpace.AddLine(pt15, pt16) Set lineObj = ThisDrawing.ModelSpace.AddLine(pt10, pt14) Set lineObj = ThisDrawing.ModelSpace.AddLine(pt11, pt15) Set lineObj = ThisDrawing.ModelSpace.AddLine(pt17, pt18) Set lineObj = ThisDrawing.ModelSpace.AddLine(pt19, pt20)End Sub。
基于VBA的AutoCAD参数化设计

变 量几 何 法 . 同之 处 是 用 辅 助 线 来 表 达 约 束 。 图形 比较 简 单 不 当 这 但 参 数 化 设 计 是 通 过 改 动 图 形 的 某 一 部 分 或 某 几 部 分 的 尺 和 有 规 则 时 , 种 方 法 的求 解 速 度 较 快 , 当图 形 比较 复 杂 时 , 寸 , 修 改 已定 义好 的零 件 参 数 , 或 自动 完 成对 图 形 中 相 关 部 分 的 作 辅 助 线会 增 加 作 图 的 操 作 。 响 作 图速 度 。 影 而且 要 保 证 用 辅 助 改 动 , 而 实 现 对 图形 的驱 动 。 数 驱 动 的方 式 便 于用 户修 改 和 线 定 义 图形 约 束 集 的 完 整 性 比 较 困难 。 从 参 ( ) 于关 系 的 建模 方法 5 基 设 计 。 户 在 设 计 轮 廓 时 无 需准 确 地 定 位 和 定 形 。 用 只需 勾 画 出大 以关 系 型数 据 结 构 构 造 参 数 化 模 型 是 德 国西 门子 公 司 首 先 致 轮 廓 , 后 通 过修 改标 注 的尺 寸 值 来 达 到 最 终 的形 状 , 者 只 然 或 需 将 零 件 的关 键 部 分 定 义 为 某 个 参 数 .通 过 对 参 数 的修 改 实 现 提 出来 的 。 在系 统 内 .关 系 可 建 立 在 所 在 系 统 能 识 别 的对 象 之 也 这 对 产品 的设 计 和 优 化 。 数 化 的 含 义有 两 种: 计 参数 化和 图形 间 , 可 在 任 意 大 的模 型 中 建立 任 意 复 杂 的 关 系模 型 , 种 关 系 参 设
参 数 化 。设 计 参 数 化 对 应 于产 品 的设 计 过 程 . 特 点 是 : 制 产 的建 立 过 程 是 以 符合 设 计 师 设 计 习惯 的 、非 常简 便 自然 的方 式 其 控 品 的参 数 在 整 个 设 计 过 程 中其 数 目 、数 值 和 类 型 都 不 断 发 生变 进 行 的 关 系模 型 的建 立 能 方 便 地 进 行 修 改 以适 应 不 同用 户的 从 化 , 设计的某一时刻还有可能发生参数转换 , 在 即控 制 参 数 由一 特殊 要 求 . 而 大 大 提 高设 计 速 度 。 组 变 为 另一 组 。 图形 参 数 化 对 应 于 最 终 产 品 或 某些 常用 零 部 件 。 ( )知 识驱 动 的智 能 化 设 计 6 此 时控 制 参 数 只有 数 值 变 化 .不 存 在 参 数 类 型 和 整组 控制 参 数 知识 驱 动 的基 本 思 想 是 要 寻 求 、 录 不 同类 型 知 识 的方 法 , 记 的 转换 。 这 些 知 识 用 来 策 划 、 计 和 完 成一 种 产 品 、 目或 工 程 , 将 人 设 项 是 包括 知识 库 、 知识 规 则 、 辑 推 理 等1 C X 集 成 系 统有 逻 与 A 近 十 几 年 来 . 因为 参 数 化 设 计 在 工程 实 际 中 有 广 泛 的 应 用 工智 能 价 值 . 内外 从 事 C D研 究 的专 家 学 者 对其 投 入 极 大 的 精 力 和 机 地结 合 为一 体 。 知 识 库 必须 储 存 大 量 专 家 的 经 验 、 识 及 已 国 A 但 知 热 情进 行研 究 。 方 法 上 做 了大 量 的 研 究 和 尝 试 , 得 了重 大 成 知 的 事 实 和采 用 这 些 知 识 的 规 则 .并 且 知 识 库 中 的 知 识 数 据 能 从 取 果 。 目前 参 数 化设 计 方 法 主要 有 以下 几 种 : 够 被 推理 机制 所 采 纳 ,可 以 通 过 相 应 的 软 件 来 添 加 、修 改 和 维 ( )基 于 几 何 约 束 的 数学 方式 1 护. 因此 这 种 基 于 知识 的智 能化 设 计 仍 然 在 研 究 和 发展 中 。 利 用 尺寸 约 柬建 立方 程 组 .将 几 何 约 束 转 变 为 一 系列 以特 3 Auo . tCAD开 发 工 具 征 点 为 变 元 的 非 线 性 方 程 组 , 于 给定 的 约 束 , 过 数 值 方 法 对 通 A tC D 因为 具 有 开 放 的体 系 结 构 .允许 用 户 和 开 发 者 采 uo A 解 非 线 性 方 程 组 , 次 解 出 所有 特 征 点 的坐 标 值 。 定 出几 何 细 用高 级 编 程 语 言对 其 进 行 扩 充 和 修 改 , 二次 开 发 , 最 大 限 度 一 确 即 能 节 。 用 该 方 法 必 须 输 入 充 分 且 一致 的尺 寸 约 束 . 能 求 解 约束 地满 足 用 户 的 特殊 要 求 。其 常 用 的 二 次 开 发 语 言 有 A tLS , 采 才 uoIP 方 程 组 。 由于 非 线 性 方 程 组 求 解 过 程本 身 的不 足 . 解 稳 定性 A S O jc R 但 求 D , bet X等 。 A t IP是 一 种 嵌 入 A t A 里ห้องสมุดไป่ตู้并 运 行 A uo S L uo D C 的 问题 并 没 有 得 到根 本 解 决 .现 在 有 不 少 研 究 正 在 寻 求 提 高求 于其 中 的 、 留在 扩 展 内里 的解 释 执 行 语 言 , 有 编 程 简 单 的 特 驻 具 解 稳 定 性 的途 径 点 . 在 开 发 大项 目时 显 得 力 不 从 心 。 D 但 A S是 一 种 开 发 A t A uo D C ( ) 于几 何 推 理 的人 工 智 能 法 2 基 应 用 程 序 的 C语 言 程 序 设 计 环 境 。 A S程序 不 再 包 含 于 A t. D uo 人工智能的发展 。 促进 了参 数 化 设 计 方 法 的 发 展 。 生 了 几 C D 内 部 。 与 A t A 之 问 并 不 直 接 通 信 。 是 以 A tLS 产 A 它 uC D o 而 uoIP 何 推 理 法 。 这 种 方 法 又有 两 个方 面 : 是 建 立 在 专 家 系 统 的 基 为 中介 联 系 起 来 的 , 就 摆 脱 了 A t A 的约 束 , 有 很 大 的 一 这 uo D C 具 础上 , 用谓语表示几何约束 , 采 通过 推理 机 制 导 出 几 何 细 节 。这 灵 活 性 .其 缺 点是 不 适 应 当 前 可 视 化 编 程 的需 要 。 执 行 O j ̄ b . o 种 方 法 可 检 验 几 何 约 束 模 型 的 合 理 性 并 能 处 理 局 部 修 改 . 系 tR 应 用 程 序 所 需 系 统 开 销 最 小 。 度 最 快 。 是 开发 过 程 相 但 A X 速 但 统 庞 大 , 递 归 约 束 无 法 处 理 。二 是 扩 展 现 有 的 数 据结 构 , 其 当 复 杂 。A t IP运行 速 度 不 快 , 发 界 面 单 调 且 不 友 好 ;D 对 使 uo S L 开 AS 包 含 拓 扑 信 息 .并 通 过 程 序 实 现 从 几 何 约 束 到 几 何 细 节 的推 是建 立 在 C语 言 基 础 上 的 。而 C语 言 是 面 向 d w o s编程 的 , 理 。 由于 在 �
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VBA开发AUTOCAD实现参数化绘图王若慧Realizing The Parameter-Drawing taking the VBA and AUTOCAD(.山西大学工程学院,山西省太原,030013)Wang Ruo HuiEngineering Colledge of SHANXI University, Taiyuan 030013)摘要: 介绍了采用VBA(Visual Basic for Application)进行AutoCAD2005的二次开发,应用AutoCAD ActiveX Automation 接口技术访问AutoCAD对象,采用ADO实现AUTOCAD与Microsoft Access2000的数据通信,实现程序参数化绘图的基本思路及程序设计流程.关键词:VBA AutoCAD ActiveX Automation ADO 参数化绘图Abstract:Taking the ActiveX Automation of VBA and AutoCAD2005 to access the AutoCAD drawings, and the ADO to make the data communication between the AUTOCAD and ACCESS , the parameter-drawing can be well realized in the way what is described in the article .Key words:VBA AutoCAD ActiveX Automation ADOthe parameter-drawing引言:传统的人机交互式绘图一般需要用精确的尺寸值定义几何元素,输入的每一条线都必须有确定的位置,图形一旦建立,即使结构相似但想改变图形大小尺寸,只能对图形进行编辑。
而在工程设计中,一方面,进行新产品设计时不可避免地需要多次反复修改,需要进行多方面的综合协调和优化;另一方面,许多的专业图纸设计中,很多图形结构具有一定的相似性,往往只是尺寸的大小不同,其图形随尺寸参数的变化而相应变化。
因此,希望有一种比交互式绘图更方便、更高效、更适合结构相似图形绘制的方法.为了解决这个问题,我们可研制出一种绘图软件,图中尺寸参数通过交互方式输入,随后通过运行有关程序,确定所有的绘图信息,自动绘出图形,这种工作方式通常称为程序参数化绘图.这就是参数化绘图要解决的问题,同时它也是CAD系统很重要的一个环节.1.程序参数化绘图的实质程序参数化绘图主要适用于图形结构形式基本固定而结构尺寸参数变化的图形。
程序参数化绘图的实质,就是将图形信息记录在程序中。
图形的描述通常可分为:图形的拓扑关系、图形的几何参数以及这些几何参数与图形结构参数之间的联系。
通常用一组变量记录图形的几何参数,用一系列的赋值语句表达几何参数与结构参数之间的关系,然后用一系列的调用语句来描述图形的拓扑关系。
如图1所示图形的几何参数是四个点的坐标(x1,y1),(x2,y2),(x3,y3)和(x4,y4),结构参数是两个尺寸a和b。
这些参数之间的关系为:x1=x4;y1=y2;x2=x3;y3=y4;x2=x1+a;y3=y1+b。
(x4(x1,y1y2)图1 图形的描述2. 程序参数化绘图的实现途径为了实现参数化绘图,需要建立一个计算机图形软件系统.应用这个系统可以简化图形设计应用程序的编制,并能方便地应用计算机程序实现图形地输入和输出.建立一个图形系统可以有三种方式:(1)设计专用图形语言.(2)修改高级程序设计语言,使其具有图形处理的功能.(3)建立图形设计程序包.前两种方式都需要用低级或高级语言重写一个编译器.一般来说,修改或者重写一个编译器的工作量比较大,而且图形设计过程并非简单的数据处理过程,还包括许多文件结构和存贮结构的问题,从而使上述工作的复杂性大大增加.有些绘图软件配有内部专用绘图语言,如AutoCAD配有AutoLISP编程语言,DDM/DIMENSION3图形软件配有DAL绘图语言等,利用这些语言用户可以开发参数化绘图软件.但是这些语言的数组,循环,函数,逻辑关系等功能一般较差,不宜作大量的计算工作,编程也不太方便.第三种方式即建立图形设计程序包,其基本思想是选择一种合适的高级程序设计语言作为主语言,在此语言中扩展一系列的过程调用,以实现图形设计工作.在这种情况下,用户编写的图形描述程序由两部分组成:一是主语言语句,另一个是主语言中扩展了的过程调用语句.在扩充某种高级语言使其具有图形处理功能时,最好能利用已有的较成熟的图形软件.3. 程序参数化绘图的技术路线要实现程序参数化绘图程序的编制, 本文采用AutoCAD2005为绘图支撑软件,采用VBA(Visual Basic for Application)进行AutoCAD2005的二次开发,运用AutoCADVBA实现参数化绘制工程图纸.3.1 AUTOCAD2005简介1.AutoCAD是当今最流行的二维绘图软件, AutoCAD有强大的二维功能,如绘图、编辑、剖面线和图案绘制、尺寸标注以及二次开发等功能,同时有部分三维功能。
2.尽管AutoCAD是一个非常好的通用计算机辅助绘图和设计软件系统,但每一行业和专业都有自的行业和专业标准,许多单位也有自己的技术规格和企业标准,每个设计工程师和绘图员更有各自独特的工作方式和习惯。
因而AutoCAD不可能完全满足每个用户的具体而特定的要求。
对AutoCAD进行定制和二次开发,能使AutoCAD可以更加符合用户的需求,更方便、更规范、更专业的实现设计和绘图中的应用。
AutoCAD提供的开放式体系结构正是为使用户可以根据各自的需求来改进和扩充AutoCAD的许多功能而着想的3.AutoCAD提供AutoLISP、ADS、ARX、VBA作为二次开发的工具。
在许多实际应用领域(如机械、建筑、电子)中,一些软件开发商在AutoCAD的基础上已开发出许多符合实际应用的软件,很好的实现了参数化绘制工程图纸.3.2 VBA开发AutoCAD2005采用面向对象的程序设计方法, 使用Visual Basic在AutoCAD2005 上用VBA技术进行二次开发, 能够较好地实现系统程序参数化绘图。
VBA是通过AutoCAD ActiveX Automation接口来建立和AutoCAD对象间的联系。
ActiveX是建立在COM对象模型之上的一个标准通信协议,它允许对象之间通过一定的接口相互通信。
而AutoCAD ActiveX提供在AutoCAD外控制编程的机制,通过使用AutoCAD对象,实现控制AutoCAD。
在 AutoCAD 中实现 ActiveX 接口有两大优点:•更多的编程环境可以编程访问 AutoCAD 图形。
在 ActiveX Automation 出现以前,开发人员只能使用 AutoLISP或 C++ 接口。
•与其他 Windows 应用程序(如 Microsoft Excel 和ACCESS)共享数据变得更加容易。
对象是所有 ActiveX 应用程序的主要构造块。
每一个显示的对象均精确代表一个 AutoCAD 组件。
AutoCAD ActiveX 接口中有许多不同类型的对象。
例如:•直线、圆弧、文字和标注等图形对象都是对象。
•线型与标注样式等样式设置都是对象。
•图层、编组和块等组织结构都是对象。
•视图与视口等图形显示都是对象。
•甚至图形、AutoCAD 应用程序本身也是对象。
AutoCAD对象是通过分层方式来组织的,应用程序对象为根对象。
这种分层结构的视图被归结为对象模型。
对象模型提供了用户访问下一层对象的途径,如图2所示。
图2 AutoCAD 的对象模型用户可直接通过用户定义变量引用对象。
直接引用对象,应包括对象的层次。
举一个最简单的例子,以下语句是增加一条直线到模型空间。
Sub Drawline( )’定义两个三维的数组startPoint 和endPoint Dim startPoint(0 to 2) As Double Dim endPoint(0 to 2) As Double ’定义LineObj 为直线对象 Dim LineObj As AcadLine ’定义起点startPoint(0) = 0 startPoint(1) = 0 startPoint(2) = 0 ’定义终点endPoint(0)=30endPoint(1)=20endPoint(2)=10’调用AddLine方法绘制直线Set LineObj = ThisDrawing.ModelSpace.AddLine(startPoint,endPoint) End sub4.参数化绘制图形程序的编制4.1 创建基准函数在实际工程中设计良好的底层库能够节省很多的编码量,并且有助于团体协作的实现.底层库最好在工程编码开始之前就已经完全确定.在以上创建二维对象方法的基础上,采用对系统提供的方法进行封装,创建底层函数库,即由对象的基准函数构成.,其中还包含一些常用的计算函数基准函数就是与系统提供的方法参数一致的函数,其他的函数均调用基准函数创建对象..如.创建直线基准函数的具体步骤如下:1.在AUTOCAD2004中,选择[工具/宏/VBA管理器]菜单项,在弹出的[VBA管理器]对话框中单击[新建]按钮,创建一个新的工程,然后选择该工程,单击[另存为]按钮,将其保存在适当的位置。
2.在[VBA管理器]对话框中单击[Visual Basic编辑器]按钮,进入VBA集成开发环境,选择[插入/模块]菜单项,向工程中添加一个标准模块。
3.选择[插入/过程]菜单项,选择[类型]为[函数],[范围]为[公有的],在[名称]文本框中输入Addline,单击[确定]按钮,就在当前的模块中添加了AddLine 函数。
提示: 在VB中,子程序和函数的主要区别就在于,子程序没有返回值,但函数可以有返回值,而在VBA中,宏的定义通过子程序来实现.因此我们创建底层函数均使用函数。
4.创建直线的基准函数代码为:Public Function AddLine(ByVal ptSt As Variant, ByVal ptEn As Variant) As AcadLineSet AddLine = This Drawing .Model Space .AddLine (ptSt, ptEn)End Function需要注意的是,基准函数名称与VBA中对应的方法保持一致.函数的返回值为AcadLine,输入参数为两个Variant类型的变量,分别用于表示起点和终点的位置。