COM 技术在Autodesk Inventor 二次开发中的应用

2012-07-25 07:16:58校月军
微型电脑应用 2012年10期
关键词:安装包二次开发启动

校月军

0 引言

Inventor 二次开发有 3种方式:Add-In, EXE和 VBA Macro[1]。Add-In和VBA Macro都是进程内加载运行;EXE方式,是在进程外,通过创建 Inventor进程并获取其Application访问Inventor对象,或者通过Inventor Apprentice将Inventor的一些功能模块加载到自己的进程中运行,但该方式下的API集要小一些[2]。他们各有自己的优缺点,可以根据需要自己选择。

1 Inventor 二次开发的简介

Add-In的优点,是直接将自己的功能完全嵌入到Inventor当中,可以完全访问Inventor的所有API,该方式对于用户,具有较高透明性,用户可以控制其加载和卸载。Add-In可以独立发布,单独制作安装包;其缺点是需要较多的时间来开发。同时,Add-In分为两种:Application Add-In和Translator Add-In。Translator Add-In是专门针对其他CAD文件和Inventor文件之间格式转换而设计的Add-In 框架。而Application Add-In 可以归结为其他的一般的Add-In。两者间的启动方式和入口不大一样,Translator Add-In一般设计为打开某个特定文件时才会加载该 Add-In模块,而Application Add-In 一般是随着Inventor的启动或者打开第一个Add-In所支持的文档时加载(2012才有的Delay loading的功能)。本文着重介绍Application Add-In。

EXE方式由于只能访问部分Inventor API,故其主要是将Inventor的部分功能,集成到自己的应用中。例如安装包里的TaskScheduler工具,其主要是利用Inventor对Inventor文件进行简单的操作; Exe还可以通过 Apprentice集成Inventor的功能,Apprentice 类似于一个没有UI的Inventor的内核,API也相对少一些。Apprentice的优点,是不需要启动 Inventor进程就能对 Inventor文档进行操作,缺点是API没有Inventor API丰富。

VBA Macro是Inventor自带的VBA开发环境,启动Inventor后,就能通过直接编写 VBA代码来访问所有Inventor的API,调试也相对简单,能够查看Inventor 对象里的各个变量值。不需要学习复杂的高级编程语言,开发简单、快速、适用于做原型论证(Prototype);但其缺点是代码是暴露给所有用户,用户需要在Inventor VBA环境中加载VBA macro的工程,运行其代码。

2 Inventor Add-In 的开发实践及相关技术

2.1 准备工作

Inventor作为整个二次开发的平台,必须在机器上安装Autodesk的Inventor产品,同时需要安装类似Visual Studio之类的软件开发工具及组件。因为 Inventor Add-In本身是COM组件,所以,该开发工具需要具备COM组件开发的功能。

2.2 具体实践

本文的例子是基于Inventor 2012平台之上,采用的开发语言是C++,开发工具是VC++ 2008。如果你的Inventor和 Visual Studio版本较低,仍然也可以按照本文的步骤操作,实现一个Add-In (部分2011 和2012版本上的才有的新功能除外) 。

2.2.1 创建与加载新的Add-In

在装有Inventor产品的机器上,可以看到以下路径中含有eveloperTools.msi 和UserTools.msi两个安装包:

Win7:C:UsersPublicDocumentsAutodeskInventor 2012SDK

WinXP:C:Program FilesAutodeskInventor 2010SDK

其中,DevelopTools.MSI安装后会生成5个文件夹:Docs下放的是一些Add-In开发的指导文档,其中包括API结构图;Include下是为C++开发环境准备的头文件库;Reference下方的是 Inventor用来读写注册表的模块;Sample下一些二次开发的实例;Tools下有一些二次开发相关的有用的工具,比如Event Watcher 就是一个查看Inventor事件的很好的工具;Wizard下的 InventorWizards.msi 是 Visual Studio环境中的一个Inventor Add-In模板安装包,安装完毕后,你的VS环境中就会有一个名字叫Autodesk Inventor AddIn模板(包括VB和C#[3]:

选择该模板,创建一个新的项目,命名为“MyInventorAddIn”, 下一步到“Add-In Type & Settings”页面:Project Type可选为Application Add-In in a regular dll 或者Translator Add-In in a regular dll。Details里面的name是Add-In的启动类,description为该Add-In的描述,我把他们都设置为MyInventorAddInServer和This is my first Add-In,下一步直到结束。

配置好项目环境后编译该工程,如果遇到 fatal error LNK1000,修改工程属性 Build Event>Post Build Event>command line, 指定正确的目的文件夹,本例的正确路径为"C:ProgramDataAutodeskInventor 2012Addins”),成功后,启动Inventor.exe,点击按钮Tools>Add-Ins,启动Add-In Manager窗口,可以看到的Add-In已经在Add-Ins列表中。

2.3 技术详解

2.3.1 Solution文件结构说明与讲解:

该目录结构由模板自动生成,主要具有以下文件,如图1所示:

图1 Solution文件组成

MyInventorAddInServer.cpp:定义了该 Add-In的入口(即加载点);

MyInventorAddIn.idl:定义了该COM对象相关的信息,定义在coclass前的classID(即uuid)一般作为Add-In的唯一标识,Inventor根据这个ID来创建Add-In的COM对象,从而根据预定义的接口来加载Add-In模块;

MyInventorAddIn.X.manifest:(开始于2011版本)定义了该COM对象的manifest文件,用于支持side-by-side的功能,其文件结构(.addin)为:

Inventor 2011引入了一种新的Add-In注册方式:.addin方式。在之前的版本,Inventor Add-In的信息是通过AddInServer的DllRegisterServer(…)函数将Add-In信息以COM注册的方式写在注册表当中的,Inventor会去遍历出这些信息,创建Add-In对象并且加载。2011开始,Inventor也会遍历预定义的Add-In文件夹,遍历所有的.addin文件,从而获取 Add-In的必要信息。可能需要说明的是中的Add-In启动模块可以带有绝对路径,如果不指定路径,则默认为Inventor Bin目录。

三个重要函数:

该函数是Add-In的入口函数,该Add-In的COM对象一旦被创建出来,Inventor就会Query该方法,参数FirstTime值由Inventor给出,表明该Add-In是否为第一次初始化,一般是指Inventor安装后的第一次加载该Add-In模块。 类CMyInventorAddInServer继承于模板类 CApplication AddInServerImpl,该基类持有指向InventorApplication的指针m_pApplication,通过该指针你可以访问Inventor的API库,从而操作Inventor对象。

OnDeactivate()方法会在该Add-In模块被unload的情况下被调用。最后才会被清理的对象或指针一般放在这里释放。

Inventor 不仅可以暴露自己的API,同样也支持用户设计的Add-In API,用户可以通过该函数将Add-In Server的对象暴露出去,用户可用通过Inventor API取到Add-In的handle,从而操作其暴露的函数。

此时的Add-In虽然已经可以被Inventor识别和加载,但没有实现任何功能,如何添加功能,将在下面介绍。

2.3.2 Add-In的Framework

Add-In的功能,除了自己的逻辑之外,很大的一部分模块是用来和Inventor 交互的,由于Inventor的API对于所有的Add-In来讲都是一样的,所以就有可能存在统一或者类似的 Add-In framework,不管你使用的是哪种,都会有下面几个重要的元素:Interface,command和request。本文结合例子SamplesVC++AddInsCustomCommand来研究Add-In的模型以及其是如何工作的。

Interface是指Inventor UI上的Add-In的command命令,在该实例中,由基类CCommand提供的CreateButton (…) 方法生成新的 ButtonDefinition,在 ButtonDefinition的OnActivate方法中可以创建一个新的 command,

当按钮被用户点击后,该Command即被激活,对应的ButtonDefinition就会收到Inventor的OnExecute事件,在该事件中,可以初始化Add-In的对话框,可以为模态也可以为非模态,同时启动 Interaction事件,该事件可以通过OnPreselect,OnSelect,OnUnselect等方法,帮你选择你需要的操作对象,比如说平面或者圆弧之类,这些数据将作为该command的输入数据。

当所有必需的输入数据都准备好后,该command就可以调用对应的 request类执行该 command,request主要由ChangeProcessor对象来扮演,所有的 request通过ChangeProcessor执行后将会自动合成为一个事务操作,自动支持undo和redo。ChangeProcessor同时支持Inventor的Transcript脚本, 实现自动化测试:OnReadFromScript从script中恢复输入数据,包括 Inventor的对象;OnWritetoScript将所有的输入数据写入到script中存储。

2.4 Add-In的调试

Inventor能够成功加载Add-In,调试也就相当简单。首先确定.AddIn文件中指定的AddInServer dll所指向的是编译生成的dll,然后用Visual Studio 打开该工程文件,选择AddInServer所在的Dll,右键中选择“设置为启动项目(Set as startup Project)”,然后再次右键,选择属性 (Property) > 调试 (Debugging) > 命令(command), 输入Inventor.exe的全路径,F5(start debugging)。设置断点,然后Inventor运行到该断点时,将会自动触发。

另一种方式是采用 Visual Studio 中的 Attach Inventor.exe的方式。

2.5 Add-In的部署

Add-In的部署和一般软件的部署一样,只要将所需的文件安装正确的目录即可,如果还是通过写注册表的方式来注册,Add-In,Inventor内部的Add-In通常是采用另外编写一个exe程序,对所有需要register的dll进行注册和反注册,由安装包在安装时执行该exe程序,完成注册过程,卸载是执行反注册过程。

3 结论

CAD软件的二次开发,一直以来都是一个比较活跃的话题,各个平台间的二次开发,也有着较大的差别,本文研究和实践了Inventor Add-In的一些基本知识和技术。同时,随着新技术的不断出现,Add-In的开发,也在不断融入新的内容,如:

(1)多核CPU要求Add-In及其平台能够具有多任务处理的能力。

(2)通过云计算将Add-In的功能模块引入云端。

(3)移动平台的迅速发展,也要求Add-In能够具备较好的跨平台能力。

[1]Brian Ekins, Taking the Step from VBA Macros to Autodesk Inventor Add-Ins,[M]Autodesk University 2009

[2]Brian Ekins, Upgrading your Autodesk Inventor Add-Ins to Use the New Ribbon User Interface,[M]Autodesk University 2009

[3]Rajeev Lochan C.G, Develop Autodesk Inventor Addin using C#, 2008.9

猜你喜欢
安装包二次开发启动
手机之间如何快速分享应用安装包
浅谈基于Revit平台的二次开发
甘肃科技(2020年20期)2020-04-13 00:30:02
浅谈Mastercam后处理器的二次开发
模具制造(2019年3期)2019-06-06 02:11:02
雾霾来袭 限产再次启动
西门子Easy Screen对倒棱机床界面二次开发
另类解压软件安装包
电脑爱好者(2017年3期)2017-05-04 10:29:50
安发生物启动2017
西部最大规模云计算中心启动
现代企业(2015年4期)2015-02-28 18:48:39
俄媒:上合组织或9月启动扩员
环球时报(2014-08-02)2014-08-02 08:26:42
基于Pro/E二次开发的推土铲参数化模块开发