Delphi制作SolidWorks的二次开发插件

  • 格式:pdf
  • 大小:200.08 KB
  • 文档页数:5

用Delphi制作SolidWorks的二次开发插件飞天鸟自从SolidWorks出现以来,因该软件强大的功能及丰富的可扩充性,使得越来越多的用户针对SolidWorks进行定制的二次开发。

SolidWorks通过ActiveX Automation接口技术(COM)为用户提供了成熟而可靠的二次开发接口,令许多编程软件均能对其进行操作。

在大多数关于SolidWorks开发的资料中,都把VC++或VB作为主要编程工具,而关于Delphi 的介绍则比较稀缺,鉴于在中国,熟悉Delphi的人数不少,因此通过下面的例子作为这方面的相关补充。

另外,由于SolidWorks的帮助系统对SolidWorks的对象及各API函数都已经描述得足够清晰,且有丰富的VC、VB的示例资源,这里对SolidWorks的API不多作阐释,仅对Delphi制作插件的方法进行解说,而读者则应具备Delphi开发程序所需要的相关知识。

在实际使用中,将二次开发出的程序制作成为插件形式,会比单独制作成exe可执行文件更理想,在大多数的情况下,应优先采取这种形式。

它可以与Solidworks实现无缝结合,再配合Delphi 快如闪电的编译器和它优良的执行代码,使二次开发变成愉快的工作。

一、类型库的导入为便于在编写代码的过程中,使Delphi能够执行类型检查、代码自动完成及参数提示,在开(本文以SolidWorks2008发前,须将SolidWorks的对象类型SldWorks 2008 Type Library库导入。

如图,及Delphi 7环境为例)然后点击Create Unit建立单元,生成SldWorks_TLB.pas文件。

用同法将swPublished.tlb导入,如图:点击Create Unit建立单元,生成swpublished_TLB.pas文件。

注意:在SldWorks_tlb.pas中,位于约987行的type 区域内找到ICoEdge=interface 这句代码,在前面用“//”注释掉它,然后保存这两个文件。

SolidWorks的其他几个库由于暂时还没有使用到,因此可先不导入它们,随着程序功能的增加及深入,再选择进行相同的生成工作。

二、创建程序主结构在Delphi中,点击File|New|Other|ActiveX|ActiveX Library新建一项目,建立后再点选File|New|Other|ActiveX|AutoMation Object加入一自动化对象,在输入对话框中将对象命名为MyApplication,然后程序自动生成的代码框架如下:unit Unit1;{$WARN SYMBOL_PLA TFORM OFF}interfaceusesComObj, ActiveX, Project1_TLB, StdVcl;typeTMyApplication = class(TAutoObject, IMyApplication)protectedend;implementationuses ComServ;initializationTAutoObjectFactory.Create(ComServer, TMyApplication, Class_MyApplication,ciMultiInstance, tmApartment);End.将swPublished_tlb, SldWorks_tlb加入到uses语句之中,并增加TmyApplication的类定义如下(其中下划字均为增加部分):……typeTMyApplication= class(TAutoObject, IApplica, swAddin)function ConnectToSW(const ThisSW: IDispatch; Cookie: Integer;Out IsConnected: WordBool): HResult; stdcall;function DisconnectFromSW(out IsDisconnected: WordBool): HResult; stdcall;publishedprocedure ItemCall; safecall;function ItemUpdate: integer; stdcall;end;……swAddin是在swPublished_tlb中被定义了的插件接口声明,所有在SolidWorks中工作的插件都必须继承并实现这个接口。

类中的前两个函数必须与swAddin中的函数声明完全相同。

其中第一个ConnectToSW是该插件在装入SolidWorks时首先被SolidWorks主动执行的默认过程,我们在该过程中可以进行菜单或工具栏的自定义增加;第二个DisconnectFromSw函数也是机制一样,但目的相反,当插件被卸去时自动执行,我们在这里添加卸除自定义菜单的命令。

后面两个函数是在View|Type Library类型库对话框中增加子项时生成的,可以用其他名称指定它,如图(同时目录下还会增加一个“项目名_tlb.pas”的单元,但不需要编辑它):这两个过程只是我用来示例用的过程,事实上你可以添加更多的函数或过程。

一般来说,每一个自定义的菜单项都对应两个这样的过程,假设我们在SolidWorks里增加了一个主菜单,下面有一个子菜单项,那么ItemCall就是执行子菜单项的过程,而ItemUpdate则是用来更新菜单项的SolidWorks的设定函数,当用户改变了SolidWorks的工作环境(如新建一个零件或关闭所有窗口)时,SolidWroks会自动调用它,并根据它的返回值对菜单项进行允许或禁止。

接着,下面代码依次实现类中各声明函数。

implementationuses ComServ, Dialogs;varswApp: IsldWorks; // 这个全局变量用来保存sldworks实例的接口function TApplica.ConnectToSW(const ThisSW: IDispatch; Cookie: Integer;out IsConnected: WordBool): HResult; stdcall;VarMe : Idispatch;i: Integer;beginswApp := ThisSw as iSldWorks; // 保存接口Me := Self as IDispatch;swApp.SetAddinCallbackInfo(HInstance, Me, cookie);for i := 0 to 3 dobeginswApp.AddMenuItem3(i, Cookie, '我的选项1@我的菜单', -1, 'ItemCall', 'ItemUpdate', ' ', ' ' );end;IsConnected := True;result := 0;end;这段代码将Solidwroks传进来的实例接口首先保存起来,再将自已的接口回调给SolidWorks,随后通过函数addmenuItem3把菜单添加进去,之所以用i来循环4次,只不过是将菜单分别添加在SolidWorks的四种环境(无窗口、零件、装配体、工程图)之下,我们可以根据需要分别予以指定。

至于函数AddMenuItem3则是SolidWorks自已的API函数,通过它的参数定义就可以很容易理解,这里是调用它添加一个名为“我的菜单”及一个“我的选项”的子菜单项(主项与子项之间用@符号分隔),然后指定一旦选择了“我的选项”就去执行“ItemCall”;当环境更新时则调用“ItemUpdate”;所以这两个参数与实际函数名称保持一致。

另外参数-1是指将菜单添加到现有菜单的尾部;最后面的两个字符串参数一个鼠标提示,另一个是图标资源名。

接着实现DisconnectFromSW函数。

function TmyApplication.DisconnectFromSW(out IsDisconnected: WordBool): HResult;vari: Integer;beginfor i := 0 to 3 doswapp.RemoveMenu(i, '我的菜单', ' ' ); // 移除菜单IsDisconnected := True;result := 0;end;这是移除掉前面添加的菜单项,上个函数添加了多少,这一个就得移除掉多少。

另外两个过程:Procedure TmyApplication.ItemCall; safecall;beginswApp.SendMsgToUser2('调用子项成功', 2, 2); // 用来测试一下end;使用SolidWorks自己的显示函数,显示菜单项已经被调用了。

function TmyApplication.ItemUpdate: Integer; stdcall;varswM: ModelDoc2;beginswM := swApp.ActiveDoc as ModelDoc2;if swM = nil then result := 0elseresult := 1;end;这个函数必须返回整型0至3,分别用于设定该菜单项的显示状态,0:禁用菜单;1:允用菜单;2:禁用菜单且勾选;3:允用菜单且勾选,默认值为1。

为使AddMenuItem3能够完成指定,这个函数可以多条菜单项共同使用它,并且可以什么都不作,但至少得有一条语句,免得Delphi 在编译时优化掉了这个函数。

三、测试实现了这四个过程后,保存并进行编译连接,验证一下插件是否成功。

如无意外,应生成一个XXXX.DLL的文件。

启动SolidWorks,打开这个DLL文件,稍待一会,如无错误提示,那么就是装载成功了。

打开菜单,可以看到我们新建的菜单及菜单项,点选一下,结果如图。

再点选菜单项,出现“调用子项成功”的信息提示框。

所以,你可以把需要实现的功能代码,写到这个ItemCall函数里面。

至此,实现了在Delphi下的插件制作。

四、其他Delphi生成代码中的GUID值,一般都将保持不变,而VB每次编译时则都会生成新的GUID 值,因此用Delphi对插件进行调试及版本升级时,可以不必在注册表中进行删增,只须简单覆盖替换掉旧的dll文件即可。

并且考虑到Delphi在控件及数据库方面的强大支持,选择Delphi对SolidWorks进行开发是非常有利的。

文中方法在SolidWorks的2006、2008中通过。