随着产品数据管理系统(PDM)的引入,为了便于今后的产品设计,丰富本地PDM的数据资源,需要将原先设计的产品图纸输入到本地零部件数据资源库,而在输入之前需要删除每张图纸中标题栏和代号栏的内容并更换PDM专用标题栏和代号栏。为了避免重复性劳动,提高输入效率,有必要编写专用的软件来代替手工的操作。通过Visual Basic对AutoCAD进行二次开发,成功编写了适合本公司的图纸批量换图框软件。
Windows应用程序接口,即API (Application programming interface),是一组用C语言编写的函数库,由操作系统调用来控制Windows的各个部件外观和行为。Win32 API就是Windows32位平台提供的应用程序编程接口。在Visual Basic中,可以像调用普通过程一样调用API中的函数,实现所需要的操作。
Windows环境中有很多对象,诸如窗口、组合框、文本框等,可以通过API函数以不同的形式对这些对象进行操作。为此,必须以某种方法对这些对象进行标识,并把它们以参数的形式传送给函数。Windows用一个32位的整数对各种对象进行标识,称之为句柄。VB可以调用API函数FindWindow和FindWindowEx通过窗口标题和类名来查找指定对象,并返回句柄。
在得到指定对象的句柄之后,可以通过消息函数SendMessage和PostMessage给指定对象发送消息。SendMessage函数有4个参数,其中第一个参数(hwnd)是接收消息的窗口,即指定对象的句柄,第二个参数(wMsg)是消息编号(标识符),第三、四个参数是消息的第一、第二个参数。后两个参数wParam和lParam并不固定,随对象和所发送的消息而不同。
本公司的AutoCAD软件集成了INTECAD程序,更换图框时只需通过组合框选择需要的标题栏和代号栏即可,如下页图1所示。本程序的基本原理是当标题栏dwg文件打开时,执行更换标题栏命令会删除原有标题栏中的数据,随后利用VB调用API消息函数SendMessage控制AUTOCAD选择指定的标题栏和代号栏,达到更换图框的目的。
图1 INTECAD程序定制图幅界面
本软件的主要功能是打开AUTOCAD图纸,删除每张图纸中标题栏和代号栏的内容并更换PDM专用标题栏和代号栏,程序流程图见图2。
通过VB编程将本软件的各种数据信息,通过对话框的形式完全体现出来,建立人机交互界面,如图3所示。
图纸自动换图框软件主要由主控制程序、选择标题栏和代号栏子程序组成。
2.3.1 主控制程序
主控制程序实现的功能是循环打开文件列表框中的AUTOCAD图纸,判断图纸为零件还是部件,根据选项判断是否进行删除标题栏和代号栏操作,利用注册表将标题栏和代号栏名称传送给选择标题栏和代号栏子程序,给AUTOCAD发送打开定制图幅命令,执行后见图1,再通过调用选择标题栏和代号栏子程序达到更换指定图框的目的。具体代码如下:
图2 程序流程图
图3 程序主界面
For I = 0 To File1.ListCount - 1
Set acaddoc = acadapp.Documents.Open(astr &File1.List(I))
'利用文件名判断图纸为零件还是部件
Number = Split(File1.List(I), ".")
numbercount = UBound(Number)
If InStr(Number(numbercount - 1), "00") > 0 Then
headstr = headtext2
codestr = codetext2
Else
headstr = headtext1
codestr = codetext1
End If
'利用注册表传递headstr和codestr
SaveSetting "通信小程序", "自定义通讯", "通讯1",headstr
SaveSetting "通信小程序", "自定义通讯", "通讯2",codestr
If Option1.Value = True Then
Call openhead(headbpath, headb)
Shell (App.Path & "headb.exe")
acaddoc.SendCommand ("tf" & vbCr)
acadapp.Documents(1).Close
End If
Shell (App.Path & "headpdm.exe")
acaddoc.SendCommand ("tf" & vbCr)
acaddoc.SendCommand ("qsave" & vbCr)
acaddoc.SendCommand ("close" & vbCr)
Set acaddoc = Nothing
Next I
2.3.2 选择标题栏和代号栏子程序
首先从注册表中取出主程序存入的标题栏和代号栏名称,赋值给变量并清空数据。定义子函数, 以标题栏和代号栏名称为变量。第一步通过API函数FindWindow查找“定制图幅”窗口,再通过类名找到标题栏代号栏组合框控件,利用消息函数SendMessage发送组合框字符串查找消息CB_FINDSTRING来获得标题栏和代号栏在组合框中的位置序号,再发送组合框选择消息CB_SETCURSEL通过刚才获取的序号选择选项。最后找到“确定(Y)”按钮,通过消息函数PostMessage 发送按下Y键的消息,完成选择标题栏和代号栏操作。具体代码如下:
headtext = GetSetting("通信小程序", "自定义通讯","通讯1")
codetext = GetSetting("通信小程序", "自定义通讯","通讯2")
DeleteSetting "通信小程序", "自定义通讯", "通讯1"
DeleteSetting "通信小程序", "自定义通讯", "通讯2"
Private Function pdm(ByVal headtext As String,ByVal codetext As String)
alsAnsi = StrConv(headtext, vbFromUnicode)
blsAnsi = StrConv(codetext, vbFromUnicode)
Dim starttime,count As Single
starttime = Timer
Do Until ahwnd11 Or count > 10
count = Timer - starttime
Sleep (50)
ahwnd1 = FindWindow(vbNullString, "定制图幅")
ahwnd2 = FindWindowEx(ahwnd1, 0, "ComboBox",vbNullString)
ahwnd3 = FindWindow Ex(ahwnd1, ahwnd2,"ComboBox", vbNullString)
ahwnd4 = FindWindow Ex(ahwnd1, ahwnd3,"ComboBox", vbNullString)
ahwnd5 = Find Window Ex(ahwnd1, ahwnd4,"ComboBox", vbNullString)
ahwnd6 = FindWindow Ex(ahwnd1, ahwnd5,"ComboBox", vbNullString) '找到标题栏
ahwnd7 = FindWindow Ex(ahwnd1, ahwnd6,"ComboBox", vbNullString)
ahwnd8 = FindWindow Ex(ahwnd1, ahwnd7,"ComboBox", vbNullString) '找到代号栏
If ahwnd6 And ahwnd8 Then
Do Until (a <> -1 And b <> -1) Or count > 10
count = Timer - starttime
a = SendMessage(ahwnd6, CB_FINDSTRING, -1,ByVal StrPtr(alsAnsi)) '找到标题栏位置序号
b = SendMessage(ahwnd8, CB_FINDSTRING, -1,ByVal StrPtr(blsAnsi)) '找到代号栏位置序号
Loop
SendMessage ahwnd6, CB_SETCURSEL, a, 0 '选择第a个选项
SendMessage ahwnd8, CB_SETCURSEL, b, 0 '选择第b个选项
ahwnd9 = FindWindowEx(ahwnd1, 0, vbNullString,"确定(&Y)") '找确定键
PostMessage ahwnd9, WM_KEYDOWN, vbKeyY, 0'按下确定键
End If
DoEvents
ahwnd10 = FindWindow(vbNullString, "填写栏框")
If ahwnd10 Then
ahwnd11 = Find Window Ex(ahwnd10, 0,vbNullString, "确定(&Y)")
PostMessage ahwnd11, WM_KEYDOWN, vbKeyY, 0
End If
Loop
End
End Function
本应用程序是在VB API和AutoCAD相结合的基础上,实现了批量删除图纸中标题栏和代号栏的内容并更换图框的功能,把原本商品化、通用化的AutoCAD系统用户化、本地化。本文主要介绍了利用VB API作为开发工具的二次开发方法和关键问题,为开发其他适合用户特定需要的专业化软件提供了一种手段,同时也对致力于AUTOCAD二次开发的人员具有一定得参考价值。
[1] 刘炳文,李凤华.Visual Basic 6.0 Win32 API程序设计[M].北京:清华大学出版社,2001.
[2] 张晋西.Visual Basic与AutoCAD二次开发[M].北京:清华大学出版社,2002.
[3] 尚雅玲.基于VB API的Pro/E二次开发探讨[J].现代机械,2009(4):46-47.
[4] 高山,杨卓,张涛.Visual Basic中操作指针的技术及应用[J].计算机工程与设计,2009(24):5 722-5 725.
[5] 罗彬,刘独玉.基于VB调用Windows API函数的参数传递研究[J].计算机应用,2001(8):264-266.