当前位置:研发设计首页 >> 软件世界 >> 欧特克(AutoCAD Inventor...) >> COM技术在Autodesk Inventor二次开发中的应用
COM技术在Autodesk Inventor二次开发中的应用
2017-06-12 17:05:43  作者:校月军   来源:互联网
  •   0 引言   Inventor二次开发有3种方式:Add-In,EXE和VBA Macro。Add-In和VBA Macro都是进程内加载运行;EXE方式,是在进程外,通过创建Inventor进程并获取其Application访问Inventor对象,或者通过Invent ...

  0 引言

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

  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两个安装包:

  

路径中含有eveloperTools.msi和UserTools.msi两个安装包

  其中,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 Addln模板(包括VB和C#:

  选择该模板,创建一个新的项目,命名为“MyInventorAddln”,下一步到“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的描述,我把他们都设置为MylnventorAddlnServer和This is my first Add-In,下一步直到结束。

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

  2.3 技术详解

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

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

  

Solution文件组成

  图1 Solution文件组成

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

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

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

  

文件结构(.addin)

  Inventor 2011引入了一种新的Add-In注册方式:.addin方式。在之前的版本,Inventor Add-In的信息是通过AddlnServer的DIIRegisterServer(…)函数将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模块。类CMyInventorAddlnServer继承于模扳类CApplication Ad-dInServerImpl,该基类持有指向InventorApplication的指针m_pApplication,通过该指针你可以访问Inventor的API库,从而操作Inventor对象。

  

操作Inventor对象

  

操作Inventor对象

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

  

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。本文结合例子\Samples*C++\Addlns\CustomCommand来研究Add-In的模型以及其是如何工作的。

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

  

Inventor API

  当按钮被用户点击后,该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,调试也就相当简单。首先确定.Addln文件中指定的AddlnServer dll所指向的是编译生成的dll,然后用Visual Studio打开该工程文件,选择AddlnServer所在的Dll,右键中选择“设置为启动项目(Setas 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能够具备较好的跨平台能力。



版权所有:智造网 京ICP证100778号 京公网安备110102003025 虚假新闻举报电话:010-88379107