论文部分内容阅读
摘要 介绍用VB开发AutoCAD进行参数化绘图的途径和方法。优化孔型设计是轧钢工艺设计的主要问题之一,通过轧制角钢孔型的优化设计,介绍这种方法在轧钢孔型优化设计中的具体应用。
关键词 VB;AutoCAD;参数化绘图
中图分类号:TP391.72 文献标识码:A 文章编号:1671-489X(2008)20-0108-03
轧钢孔型的优化设计是轧制工艺的主要问题之一。如果利用参数化绘图,可以将图形尺寸与设计条件相关联,即将图形尺寸看作是“设计条件”的函数,当设计条件发生变化时,图形尺寸也随之发生变化,从而完成图形的绘制。这样不仅可以缩短设计周期,而且提高了设计质量。其实,AutoCAD自问世之初,就为人们提供了参数化绘图的功能,它不但提供了与其他程序设计语言的接口,而且其自身拥有的AUTOLISP、ADS、ARS、VBA等开发工具功能强大。
笔者通过VB高级语言把AUTOCAD中的VBA代码转变为VB代码,以VB作为编译器,AutoCAD作为图形支撑软件,使VB直接调用AutoCAD来实现参数化绘图。
1 设计思路
对于高级语言Visual Basic 6.0来说,其计算能力较强而绘图能力却相对较差;而绘图软件AutoCAD2002恰好相反,计算能力差而绘图能力强。设计者可以用前者计算,用后者绘图。这就要求高级语言和绘图软件之间要有接口,设计者给出参数,经高级语言处理后能够调用AutoCAD绘出所需的图形。
2 Visual Basic 6.0与 AutoCAD2002的连接
2.1 连接方式VBA是AutoCAD2002的内嵌式语言,它的全称是Visual Basic for Application。它是基于Visual Basic 6.0版本,完全面向对象体系结构的一种编程语言,所以它有着与VB几乎相同的开发环境和语法;它的功能强大,可以说是一个万能开发工具。由于VBA是依附于AutoCAD的,所以其与AutoCAD共享内存空间、数据环境。VBA语言结构简单,即可利用AutoCAD主界面操作环境,也可创造自己所需的主界面操作环境[1]。但是它也存在一定的缺点,为了克服这些缺点,使用Visual Basic 6.0开发AutoCAD。
转化VBA代码为VB代码,首先要引用AutoCAD type library。在VB6.0中,选择工程—“引用”,然后在“引用”对话框选择AutoCAD2000 type library,接下来将VBA代码中所有的Thisdrawing替换成一个用户定义的代表当前活动文档的变量,为AutoCAD应用程序acadApp和当前文档acadDoc定义一个变量,然后设置应用程序变量为当前AutoCAD应用程序。
如果AutoCAD正在运行,则用GetObject方法取得AutoCAD应用程序对象。如果AutoCAD没有运行,则返回一个错误。捕捉这个错误并清除它,然后用CreateObject方法尝试建立一个AutoCAD应用程序对象。如果成功,则AutoCAD启动;如果失败,则显示一个消息框说明错误原因[2]。
2.2 连接程序代码[3]
Public acadapp As Object
’ AutoCAD应用程序对象变量
Public preference As Object
’ AutoCAD优先设置对象变量
Public acaddoc As Object
’ AutoCAD文档对象变量
Public paspace As Object
’ AutoCAD图纸空间对象变量
Public mospace As Object
’ AutoCAD模型空间对象变量
’绘图初始化
Sub init()
’与CAD建立连接
On Error Resume Next
’如果CAD正在运行,则GetObject函数返回对应用程序对象的引用
’变量AcadApp已经定义成全局变量
Set acadapp = GetObject(, " AutoCAD.Application")
If Err Then
Err.Clear’清除错误
Set acadapp = CreateObject("AutoCAD.Application")’启动AutoCAD
’如果GetObject函数不能创建AutoCAD应用程序对象
’则提示不能运行AutoCAD!!!
If Err Then
MsgBox "不能运行AutoCAD!!!"
Exit Sub ’退出本过程
End If
End If
’如果成功的引用了AutoCAD应用程序对象
’则使其界面可见(缺省状态下是不可见的)
acadapp.Visible = True
acadapp.Width = Screen.Width
acadapp.Height = Screen.Height
Set preference = acadapp.preference
Set acaddoc = acadapp.ActiveDocument
Set mospace = acaddoc.ModelSpace
Set paspace = acaddoc.PaperSpace
End Sub ’结束过程
3 参数化绘图的实现
3.1 AutoCAD2002对象模型AutoCAD2002应用程序公开的对象很多,每个对象都代表了AutoCAD应用程序的一部分。图形实体对象,如直线line、圆circle等;样式设置对象,如线型linetype等;组织结构对象,如层layer、块block等。这些对象按照从属关系,有层次地组织在一起,就形成了AutoCAD2002对象模型。在编制参数化绘图代码前必须建立实体层、中心线层,并设定各层的颜色和线型。
实体对象的创建与编辑:在创建实体对象之前,要确定实体将放于何处,是模型空间、图纸空间,还是存放在块中。不论在哪个对象中创建实体,都要先引用这个对象。
3.2 建立图形的几何及数学模型无论怎么复杂的图形,均可看成是由直线、圆弧、圆等基本绘图元素拼接而成的。只要已知特征点(直线两端点、圆的圆心、圆弧的起点和终点等)的坐标和有关参数,就能调用 AutoCAD的基本作图命令,将它们画出来。
在参数化绘图过程时,首先确定所选坐标系的原点坐标,这里是(ox,oy)。其次是确定一些特征点的坐标。按照图形的几何关系,根据特征点计算绘图点,绘图点由特征点两边夹角和圆角半径来确定。然后利用AutoCAD的直线﹑圆弧绘图命令,把这些绘图点连接起来,即可绘出完整的孔型图。
现以型钢轧制过程的孔型设计中箱形孔为例来说明图形的参数化绘图的具体途径。型材是在带有所谓轧槽所构成的环形凹槽或凸缘的轧辊上轧制出来的。由两个或多个轧辊的轧槽所构成的断面轮廓叫做孔型[4]。孔型设计中首先确定孔型形状和孔型尺寸,其次是将孔型配置在轧辊上。如图1所示:要画出箱形孔必须知道轧件宽度b、轧件高度h、外角半径r1、内角半径r2、孔型上半部倾斜角qxj1、孔型下半部倾斜角qxj2、辊缝s共7个尺寸。孔型宽高可以由VB计算部分得到,也可以手工输入,而其他5个尺寸可以由人手工输入。在参数化绘制孔型图的过程中首先要正确地确定特征点的坐标。一般应根据尺寸的几何关系,建立孔型上所有的特征点的坐标和孔型宽度和高度的关系式,从而实现当轧件尺寸改变时,相应孔型图也随之改变的目的。绘图点由特征点两边夹角和圆角半径来确定。因为箱形孔是按照y轴对称,所以只画出左面一半的图形,右面一半的图形由左面图形关于y轴镜像得到。
编制箱形孔参数化绘图的程序如下所示(以1、2两点的线段1和2、3两点之间的圆弧2来说明图形的绘制,其中13点为一个特征点):
Public ox, oy As Double
’ 图形所放位置的相对原点坐标
Dim pn1(0 To 2) As Double
’ 定义1点的坐标为双精度数
Dim pn2(0 To 2) As Double
’ 定义2点的坐标为双精度数
Dim pn3(0 To 2) As Double
’ 定义3点的坐标为双精度数
Dim pntcen1(0 To 2) As Double
’过渡弧圆心坐标
Dim Line1 As Object
’ 定义1点和2点之间的直线1为对象变量
Dim Line2 As Object
’ 定义2点和3点之间的圆弧2为对象变量
Dim line11 As Object
’ 定义直线1关于y轴的对称线段11为对象变量
Dim Line21 As Object
’ 定义圆弧2 y轴的对称弧21为对象变量
Dim lkx As Object ’ 轮廓线
Dim point1(0 To 2) As Double ’ 镜像点坐标
Dim point2(0 To 2) As Double’ 镜像点坐标
Dim xxobj As AcadLineType
’建立实体层
Dim stlayerobj As AcadLayer
Dim curlayerobj As AcadLayer
’添加一个实体层
Set stlayerobj = acaddoc.Layers.Add("lunkuoxian")
stlayerobj.Color = acWhite
’stlayerobj.Lineweight = acLnWt025
’画孔型轮廓线
Set curlayerobj = acaddoc.ActiveLayer
’保存当前活动层
acaddoc.ActiveLayer = stlayerobj
’设实体层为当前层
Set xxobj = acaddoc.Linetypes.Add("continuous")
acaddoc.ActiveLinetype = xxobj
’xxobj.Lineweight = acLnWt025
acaddoc.Regen True
qxj1 = 7 * pi / 180: r1 = 25: r2 = 18: s= 15
’ qxj1为箱形孔的侧壁斜角
pn1(0) = ox - b / 2 - r1 * Tan((pi / 2 - qxj1) / 2) - 20: pn1(1) = oy s / 2: pn1(2) = 0
pn2(0) = ox - b(i) / 2 - r1 * Tan((pi / 2 - qxj1) / 2): pn2(1) = oy s / 2: pn2(2) = 0
Set Line1 = mospace.AddLine(pn1, pn2)
pntcen1(0) = pn2(0): pntcen1(1) = oy s(i) / 2 r1: pntcen1(2) = 0
Set Line2 = mospace.AddArc(pntcen1, r1, 3 / 2 * pi, 2 * pi - qxj1)
point1(0) = ox: point1(1) = oy - 135: point1(2) = 0
point2(0) = ox: point2(1) = oy 118.5: point2(2) = 0
Set line11 = Line1.Mirror(point1, point2)
Set Line21 = Line2.Mirror(point1, point2)
图中其他点的坐标也按照上述的方法依次找到,这样就依次画出箱形孔孔型图的左半部分,再通过关于y轴镜像得到完整的孔型图。
4 结论
本文介绍Visual Basic 6.0 与AutoCAD 2002的连接,以VB作为编译器,以AutoCAD为图形支撑软件,在AutoCAD绘图环境下进行参数化绘图。这种方法可以使设计人员从繁琐的计算、绘图工作中解放出来,以从事其他创造性的工作;并将高级语言在计算和数据处理上的优势与AutoCAD在图形处理上的特长有机地结合在一起,能够更好地满足需要,提高优化水平。
参考文献
[1]孔晓玲.AutoCAD 2000 的二次开发—通用件压板的计算机辅助设计[J].机械设计与制造,2002,10:16
[2]余承飞,王冬松.AutoCAD 数据库应用与连接技术[M].北京:北京大学出版社,2000,6
[3]张国宝.AutoCAD Visual Basic开发技术[M].北京:科学出版社,2000,1:25
[4]B.K.斯米尔诺夫,等.轧辊孔型设计[M].北京:冶金工业出版社,1991,1
关键词 VB;AutoCAD;参数化绘图
中图分类号:TP391.72 文献标识码:A 文章编号:1671-489X(2008)20-0108-03
轧钢孔型的优化设计是轧制工艺的主要问题之一。如果利用参数化绘图,可以将图形尺寸与设计条件相关联,即将图形尺寸看作是“设计条件”的函数,当设计条件发生变化时,图形尺寸也随之发生变化,从而完成图形的绘制。这样不仅可以缩短设计周期,而且提高了设计质量。其实,AutoCAD自问世之初,就为人们提供了参数化绘图的功能,它不但提供了与其他程序设计语言的接口,而且其自身拥有的AUTOLISP、ADS、ARS、VBA等开发工具功能强大。
笔者通过VB高级语言把AUTOCAD中的VBA代码转变为VB代码,以VB作为编译器,AutoCAD作为图形支撑软件,使VB直接调用AutoCAD来实现参数化绘图。
1 设计思路
对于高级语言Visual Basic 6.0来说,其计算能力较强而绘图能力却相对较差;而绘图软件AutoCAD2002恰好相反,计算能力差而绘图能力强。设计者可以用前者计算,用后者绘图。这就要求高级语言和绘图软件之间要有接口,设计者给出参数,经高级语言处理后能够调用AutoCAD绘出所需的图形。
2 Visual Basic 6.0与 AutoCAD2002的连接
2.1 连接方式VBA是AutoCAD2002的内嵌式语言,它的全称是Visual Basic for Application。它是基于Visual Basic 6.0版本,完全面向对象体系结构的一种编程语言,所以它有着与VB几乎相同的开发环境和语法;它的功能强大,可以说是一个万能开发工具。由于VBA是依附于AutoCAD的,所以其与AutoCAD共享内存空间、数据环境。VBA语言结构简单,即可利用AutoCAD主界面操作环境,也可创造自己所需的主界面操作环境[1]。但是它也存在一定的缺点,为了克服这些缺点,使用Visual Basic 6.0开发AutoCAD。
转化VBA代码为VB代码,首先要引用AutoCAD type library。在VB6.0中,选择工程—“引用”,然后在“引用”对话框选择AutoCAD2000 type library,接下来将VBA代码中所有的Thisdrawing替换成一个用户定义的代表当前活动文档的变量,为AutoCAD应用程序acadApp和当前文档acadDoc定义一个变量,然后设置应用程序变量为当前AutoCAD应用程序。
如果AutoCAD正在运行,则用GetObject方法取得AutoCAD应用程序对象。如果AutoCAD没有运行,则返回一个错误。捕捉这个错误并清除它,然后用CreateObject方法尝试建立一个AutoCAD应用程序对象。如果成功,则AutoCAD启动;如果失败,则显示一个消息框说明错误原因[2]。
2.2 连接程序代码[3]
Public acadapp As Object
’ AutoCAD应用程序对象变量
Public preference As Object
’ AutoCAD优先设置对象变量
Public acaddoc As Object
’ AutoCAD文档对象变量
Public paspace As Object
’ AutoCAD图纸空间对象变量
Public mospace As Object
’ AutoCAD模型空间对象变量
’绘图初始化
Sub init()
’与CAD建立连接
On Error Resume Next
’如果CAD正在运行,则GetObject函数返回对应用程序对象的引用
’变量AcadApp已经定义成全局变量
Set acadapp = GetObject(, " AutoCAD.Application")
If Err Then
Err.Clear’清除错误
Set acadapp = CreateObject("AutoCAD.Application")’启动AutoCAD
’如果GetObject函数不能创建AutoCAD应用程序对象
’则提示不能运行AutoCAD!!!
If Err Then
MsgBox "不能运行AutoCAD!!!"
Exit Sub ’退出本过程
End If
End If
’如果成功的引用了AutoCAD应用程序对象
’则使其界面可见(缺省状态下是不可见的)
acadapp.Visible = True
acadapp.Width = Screen.Width
acadapp.Height = Screen.Height
Set preference = acadapp.preference
Set acaddoc = acadapp.ActiveDocument
Set mospace = acaddoc.ModelSpace
Set paspace = acaddoc.PaperSpace
End Sub ’结束过程
3 参数化绘图的实现
3.1 AutoCAD2002对象模型AutoCAD2002应用程序公开的对象很多,每个对象都代表了AutoCAD应用程序的一部分。图形实体对象,如直线line、圆circle等;样式设置对象,如线型linetype等;组织结构对象,如层layer、块block等。这些对象按照从属关系,有层次地组织在一起,就形成了AutoCAD2002对象模型。在编制参数化绘图代码前必须建立实体层、中心线层,并设定各层的颜色和线型。
实体对象的创建与编辑:在创建实体对象之前,要确定实体将放于何处,是模型空间、图纸空间,还是存放在块中。不论在哪个对象中创建实体,都要先引用这个对象。
3.2 建立图形的几何及数学模型无论怎么复杂的图形,均可看成是由直线、圆弧、圆等基本绘图元素拼接而成的。只要已知特征点(直线两端点、圆的圆心、圆弧的起点和终点等)的坐标和有关参数,就能调用 AutoCAD的基本作图命令,将它们画出来。
在参数化绘图过程时,首先确定所选坐标系的原点坐标,这里是(ox,oy)。其次是确定一些特征点的坐标。按照图形的几何关系,根据特征点计算绘图点,绘图点由特征点两边夹角和圆角半径来确定。然后利用AutoCAD的直线﹑圆弧绘图命令,把这些绘图点连接起来,即可绘出完整的孔型图。
现以型钢轧制过程的孔型设计中箱形孔为例来说明图形的参数化绘图的具体途径。型材是在带有所谓轧槽所构成的环形凹槽或凸缘的轧辊上轧制出来的。由两个或多个轧辊的轧槽所构成的断面轮廓叫做孔型[4]。孔型设计中首先确定孔型形状和孔型尺寸,其次是将孔型配置在轧辊上。如图1所示:要画出箱形孔必须知道轧件宽度b、轧件高度h、外角半径r1、内角半径r2、孔型上半部倾斜角qxj1、孔型下半部倾斜角qxj2、辊缝s共7个尺寸。孔型宽高可以由VB计算部分得到,也可以手工输入,而其他5个尺寸可以由人手工输入。在参数化绘制孔型图的过程中首先要正确地确定特征点的坐标。一般应根据尺寸的几何关系,建立孔型上所有的特征点的坐标和孔型宽度和高度的关系式,从而实现当轧件尺寸改变时,相应孔型图也随之改变的目的。绘图点由特征点两边夹角和圆角半径来确定。因为箱形孔是按照y轴对称,所以只画出左面一半的图形,右面一半的图形由左面图形关于y轴镜像得到。
编制箱形孔参数化绘图的程序如下所示(以1、2两点的线段1和2、3两点之间的圆弧2来说明图形的绘制,其中13点为一个特征点):
Public ox, oy As Double
’ 图形所放位置的相对原点坐标
Dim pn1(0 To 2) As Double
’ 定义1点的坐标为双精度数
Dim pn2(0 To 2) As Double
’ 定义2点的坐标为双精度数
Dim pn3(0 To 2) As Double
’ 定义3点的坐标为双精度数
Dim pntcen1(0 To 2) As Double
’过渡弧圆心坐标
Dim Line1 As Object
’ 定义1点和2点之间的直线1为对象变量
Dim Line2 As Object
’ 定义2点和3点之间的圆弧2为对象变量
Dim line11 As Object
’ 定义直线1关于y轴的对称线段11为对象变量
Dim Line21 As Object
’ 定义圆弧2 y轴的对称弧21为对象变量
Dim lkx As Object ’ 轮廓线
Dim point1(0 To 2) As Double ’ 镜像点坐标
Dim point2(0 To 2) As Double’ 镜像点坐标
Dim xxobj As AcadLineType
’建立实体层
Dim stlayerobj As AcadLayer
Dim curlayerobj As AcadLayer
’添加一个实体层
Set stlayerobj = acaddoc.Layers.Add("lunkuoxian")
stlayerobj.Color = acWhite
’stlayerobj.Lineweight = acLnWt025
’画孔型轮廓线
Set curlayerobj = acaddoc.ActiveLayer
’保存当前活动层
acaddoc.ActiveLayer = stlayerobj
’设实体层为当前层
Set xxobj = acaddoc.Linetypes.Add("continuous")
acaddoc.ActiveLinetype = xxobj
’xxobj.Lineweight = acLnWt025
acaddoc.Regen True
qxj1 = 7 * pi / 180: r1 = 25: r2 = 18: s= 15
’ qxj1为箱形孔的侧壁斜角
pn1(0) = ox - b / 2 - r1 * Tan((pi / 2 - qxj1) / 2) - 20: pn1(1) = oy s / 2: pn1(2) = 0
pn2(0) = ox - b(i) / 2 - r1 * Tan((pi / 2 - qxj1) / 2): pn2(1) = oy s / 2: pn2(2) = 0
Set Line1 = mospace.AddLine(pn1, pn2)
pntcen1(0) = pn2(0): pntcen1(1) = oy s(i) / 2 r1: pntcen1(2) = 0
Set Line2 = mospace.AddArc(pntcen1, r1, 3 / 2 * pi, 2 * pi - qxj1)
point1(0) = ox: point1(1) = oy - 135: point1(2) = 0
point2(0) = ox: point2(1) = oy 118.5: point2(2) = 0
Set line11 = Line1.Mirror(point1, point2)
Set Line21 = Line2.Mirror(point1, point2)
图中其他点的坐标也按照上述的方法依次找到,这样就依次画出箱形孔孔型图的左半部分,再通过关于y轴镜像得到完整的孔型图。
4 结论
本文介绍Visual Basic 6.0 与AutoCAD 2002的连接,以VB作为编译器,以AutoCAD为图形支撑软件,在AutoCAD绘图环境下进行参数化绘图。这种方法可以使设计人员从繁琐的计算、绘图工作中解放出来,以从事其他创造性的工作;并将高级语言在计算和数据处理上的优势与AutoCAD在图形处理上的特长有机地结合在一起,能够更好地满足需要,提高优化水平。
参考文献
[1]孔晓玲.AutoCAD 2000 的二次开发—通用件压板的计算机辅助设计[J].机械设计与制造,2002,10:16
[2]余承飞,王冬松.AutoCAD 数据库应用与连接技术[M].北京:北京大学出版社,2000,6
[3]张国宝.AutoCAD Visual Basic开发技术[M].北京:科学出版社,2000,1:25
[4]B.K.斯米尔诺夫,等.轧辊孔型设计[M].北京:冶金工业出版社,1991,1