文章目录
一、前言二、开发环境概述2.1 理论部分2.2 实操部分三、参考文章一、前言
上篇文章作为热身讲解了CATIA
的前世今生,由于本人接触这个软件的时间比较短,所以有理解偏差或者叙述错误的部分,欢迎读者批评指正。本篇文章打算聊一聊CATIA
二次开发环境,这是我们迈向二次开发的第一步,这一步要走好、走稳,才能开展后续的开发工作!
二、开发环境概述
2.1 理论部分
无论是哪种软件的二次开发,首先我们都必须拿到这个软件在进程中的对象(object
),CATIA
也不例外。而通过编程的方式去访问CATIA
对象又有很多种方法。根据所在进程的不同,我们可以将其分为两大阵营:进程内(In-process Application
)和进程外(Out-process Application
)。其中进程内,顾名思义就是跟CATIA软件在同一进程地址下运行,最典型的例子就是宏(Macro
)了,这个词大家应该都在Micro Office
开发中有所耳闻,比如说EXCEL
宏开发,其实就是编写一些简单的脚本来完成重复的操作,实现一些简单的自动化功能。而进程外,即CATIA
软件与我们所开发的外部应用程序在不同进程地址空间运行,它们互不影响,但又可以互相通信。这种通信的方式是通过OLE
技术(Object Linking and Embedding
,对象连接与嵌入)实现的。
这里我们花点时间一起来了解一下这个技术,本人也是现学现卖😂。OLE
,没有D,是定义和实现一种允许应用程序作为软件对象彼此进行连接的机制,这个应该好理解,就是把整个软件形象化成一个对象,只要你拿到这个对象,就能跟它进行数据传输了。而对于连接的机制得给它定个规范,不然不同的编程语言、不同的系统都要进行连接时,那就乱了套了。所以就有了COM
(Component Object Model
,部件对象模型),它是软件组件的编制规范。这里插一个对组件的介绍,组件是软件公司为了让开发人员拿到前文所说的软件对象而提供的类库。所以,回到正题,COM
的出现有什么作用呢,不管你的组件用什么样的语言开发,只要它遵循COM
规范,那么开发人员就能使用任意一种编程语言调用软件对象。例如我们的CATIA
是使用C++开发的,如果它不支持COM
,那么我们也只能用C++进行二次开发,反之,我们可以使用C#
、python
、VB
等等你所熟悉的任一语言进行开发。这里很庆幸地告诉大家,CATIA
,它支持COM
,而我目前使用C#
进行二次开发工作。对比Revit
软件,其采用C#
编写,遵循的是.NET
的CLS
(COMMON LANGUAGE SPECIFICATION
)规范,所以其API
能被所有.NET
平台的语言所调用,包括:C#
、、
Managed C++
等,但.NET
以外的就不行了。之前我在CSDN
博客里分享了国外大佬开发的pyRevit
,这个项目解决了这个问题,有需要的可以关注一下。
再次切回到进程外上面来,请读者原谅我的天马行空。对于进程内和进程外开发方式的对比我列了下面这张表格,以便大家根据自己的功能需求进行选择。此外,随便提一句,两者在运行时的状态也是不同的。进程内开发时,宏在运行的过程中,CATIA
将处于非激活状态,待程序全部跑完,再把进程还给主程序,这就导致了程序假死的现象,交互体验很差;而进程外开发就显得极其友好,在不影响主程序正常操作的情况下,外部程序还能对其进行一些自动化操作!
2.2 实操部分
理论讲得差不多了,我们结合实际操作进行一个对比。打开VS
中的引用管理器,找到COM
一栏,我们任意引用一个组件,如图1
所示。引用之后,如图2
多出了3个关于CATIA
的类库,也就说明CATIA
中的COM
组件对应一组类库(图3
),它会自动引用与功能相关的其他类库。此外,细心的人还会发现组件引用的类库和一般的类库存在一些差异,例如通过COM
组件引用过来的类库,其属性中包含标识这一属性,即GUID
(全球唯一标识码),也就是说这些组件是被唯一标识的。外部程序只在运行期间才动态地建立一个组件的实例,并使用这个组件的功能。这种方式虽然释放了内存空间,但其缺点就是当计算机上的DLL
版本与创建程序时使用的版本不同时,就会出现DLL地狱,我有同事遇到过这个问题,他安装了两个版本的CATIA
,在程序编制时,他引用了最新版本的COM
组件,但运行过程中,系统却总是去实例化那个老版本的DLL
,导致程序无法运行,后来将两个版本都卸载,重新安装最新版才得以解决!
图1
图2
图3
步骤1:根据界面不同新建VS项目
步骤2:导入COM
每个COM
组件都是一系列相关函数的集合,暂时还没有花精力去一个个搞明白哪个COM
对应哪些功能,所以目前的做法是不管三七二十一,一股脑都导进来,只不过导的过程会多花点时间。
步骤3:拿到CATIA对象
public Application GetCatiaAPP(){Application CATIA = null;try{// 已打开CATIACATIA = (INFITF.Application)Marshal.GetActiveObject("CATIA.Application");}catch{// 未打开Type oType = System.Type.GetTypeFromProgID("CATIA.Application");CATIA = (INFITF.Application)Activator.CreateInstance(oType);CATIA.Visible = true;}return CATIA;}
步骤4:按照国际惯例, Hello CATIA!
我个人新建了一个CATIA 二次开发的交流学习群,有兴趣的可以加一下,大家一起交流共同进步,我也会把自己收集到的一些学习资料分享在里面,供大家免费下载。
三、参考文章
OLE
COM, COM+ and .NET 程序集的区别
DLL地狱
《CATIA二次开发技术基础》-胡挺(公众号回复“CATIA开发基础”可下载)