2024年2月20日发(作者:)

ork

2.Module(空的,用来放workbenchs,components,workbench要把原来的module清掉,components不用,它是直接在上面加的东西)

ork:public 用来放盛workbench的module头文件

Private:这个是加进来workbench怎么继承上面的一个类

还一个是生成一个workebench的出去文件

tyCard 用来放外部或系统的API所属的外部框架定义

文件时定义外部或系统的API所属的外部模块定义

查看dico 外部框架外部模块在相应的文件定义是关键

5.这里有三个文件

CATNIs可以定义此Workbench以及其工具条、菜单的所有名字(Title),定义格式为: =”test”;

CATRsc可以定义此Workbench的图标(Icons)和其放置路径(Category)(这里放模块)

Pnl="Clouds";

Ctx="Clouds";

Rep="Clouds";

中添加

="月亮";

中添加

="mycmd";

另一个CATNIs文件 是实现workbench的命令头文件

6..dico文件定义的是链接库

还一个是工厂定义

新建一个workbench的时候,首先要以workbench名声明一个工厂

然后 CATApplicationFrame框 与 工厂 进行库连接

给 新建的workbench 与 它下面的配置文件接口 进行库连接

7.在Module中的trsc文件是A TIE is the object that links the interface and the implementation

TIE以trsc的形式存在

在这个workbench所在的模块里面有src里面是本模块的CPP文件集合,local interface里面是本模块的.h文件集合,包括

① 上面提到的trsc文件,用来链接接口和现实的对象的的,主要是两组继承,工厂的继承和addin的继承 2

② 还有从基工厂类上继承一个wokbench工厂所需要的cpp和.h文件。还一个是创建一个新工厂 1 ,1 || 1 ,1

③ 还有将执行的命令用MacDefineHeader宏定义当前的workbench命令,也有.h文件和CPP文件 1,1

④ 实现 现实的对象 需要 header.h workshop.h 还有就是就是从最初基类CATBaseUnknown继承下来的派生类 1, 3

⑤ 还有一个是interface此接口是定义addin接口文件,用来继承库中的addin

1,1

g CATIA 可以启动看到workbench了

9.添加工具条

注意加头文件,加API所在的模块定义,框架定义

查询,头文件是否要加,看上下:

void CreateCommands();

CATCmdContainer * CreateToolbars();

#include "CATCommandHeader.h"

MacDeclareHeader(PartCmdHeader);

CreateToolbars里面就是要建的工具条和菜单的主要内容:

NewAccess(CATCmdContainer,pPartBenchTlb,PartBenchTlb);

建立新的进口(内部接口类名,变量名,目标名)

NewAccess(CATCmdStarter,pPointCmd,PointCmd);

SetAccessCommand(pPointCmd,"point");

SetAccessChild(pPartBenchTlb,pPointCmd);

NewAccess(CATCmdStarter,pLineCmd,LineCmd);

SetAccessCommand(pLineCmd,"line");

SetAccessNext(pPointCmd,pLineCmd);

AddToolbarView(pPartBenchTlb,1,Right);

return pPartBenchTlb;

Command命令的定义:

new PartCmdHeader(“point”,“CmdModule”,“TestCmd”,(void *)NULL);

new PartCmdHeader("line","CmdModule","LinCmd",(void *)NULL);

第一个参数是按钮的名字,第二、三个代表按钮执行的命令所在的module和命令的名字,参数四缺省就行了。

注意把用到的接口的API所在的头文件,模块名,还有框架加上

10.现在做dialog你做的命令所在的模块和命令名一定要和上面的名字对应

新建module,insert dialog

======================================================================

首先声明,我也是一个菜鸟,接触CATIA二次开发时间很短,也在学习,下面的几个概念是我在学习及使用时自己琢磨得到的解释,目的是用尽可能简洁易懂的语言来描述英文文档中相对不容易理解的几个概念,在学习的时候我得到了CAA群的水晶羽和huright的帮助,感谢他们。

希望我的总结对初学者有用,另外,可能会有理解不当的地方,欢迎大家指出来,有交流才会有进步,汲取他人的知识和经验为我所用,我们才能走得更远。

Agent:A dialog agent translates a user interaction into a user input。一个Dialog Agent将用户的交互动作转变为了相应的输入,比如,CATIndicationAgent将用户在屏幕上的一个

左键单击转换为相应的用户输入,获得单击处的坐标值。

我觉得,简单理解,就是作为一个中介(Agent),我们不用关心它是如何转变的,只要知道,我们可以利用它来得到用户的输入就可以了。

State:A State is a step in a dialog where the program is waiting for an input。一个Dialog

State就是指一个状态,对于多状态的输入来讲(Statechart diagram),它就是指程序的几个状态,比如画一个圆,就有选取平面,选取圆心,指定半径,输入结束等几个状态,在相应的状态下利用Dialog Agent获得相应的输入,并对输入进行判断,从而激发相应的响应。(即Guard condition 和Action)

3. TIE:A TIE is the object that links the interface and the implementation。TIE(不知道全称是什么)是用来连接接口与实现的对象。在程序中是以.tsrc文件后缀名存在的,而在程序编译时将会产生一个TIE的.h头文件(参见百科全书User Interface部分)。

_CATIPrtWksAddin(NewAddin):NewAddin是一个Component,它实现了接口CATIPrtWksAddin,因此就写成上面的形式:TIE_CATIPrtWksAddin(NewAddin);

-----------------------------------------------------------------------------------------------------------

lareClass:这是一个类中变量的声明,类似于MFC中的DECLARE_DYNAMIC (我个人以为),其代码如下:

#define CATDeclareClass

private :

static CATMetaClass *meta_object;

public :

virtual CATMetaClass *__stdcall GetMetaObject() const;

virtual const char *IsA() const;

virtual intIsAKindOf(const char *) const;

static CATMetaClass *__stdcall MetaObject();

static const CLSID &__stdcall ClassId();

static const char *__stdcall ClassName();

static CATBaseUnknown *CreateItself()

而相应的MFC中的DECLARE_DYNAMIC代码如下:

#define DECLARE_DYNAMIC(class_name)

protected:

static CRuntimeClass* PASCAL _GetBaseClass();

public:

static const AFX_DATA CRuntimeClass class##class_name;

virtual CRuntimeClass* GetRuntimeClass() const;

// not serializable, but dynamically constructable

#define DECLARE_DYNCREATE(class_name)

DECLARE_DYNAMIC(class_name)

static CObject* PASCAL CreateObject();

MFC中的DECLARE_DYNAMIC其目的是在类中构建一个含有CruntimeClass的变量,从而实现RTTI(在App及Window中)和动态重建(在Window中),看上面的函数CreateObject()以及CreateItself()以及相应的变量,我想应该在CAA中也是实现类似的效果。

6. CATImplementClass:这个应该不用说了,跟上面的CATDeclareClass形成一个组合,从而达到跟DECLARE_DYNAMIC一样的效果,应该是RTTI和动态重建。其各自的代码简单列如下:

CATImplementClass(NewAddin,

Implementation,

CATBaseUnknown,

CATnull ):

#define CATImplementClass(Class,Typeofclass,Basemeta,Impmeta)

CATBeginImplementClass(Class,Typeofclass,Basemeta,Impmeta);

CATEndImplementClass(Class)

#define IMPLEMENT_DYNAMIC(class_name, base_class_name)

IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)

7。MacDeclareHeader:Declares and defines a header class。声明并定义一个头,用来声明并定义一个Command Header,在命令的响应中使用。

如例:MacDeclareHeader (PartCmdHeader),而MacDeclareHeader代码如下:

#define MacDeclareHeader(DerivedHeader)

MacDefineHeader(DerivedHeader);

MacImplementHeader(DerivedHeader);

#define MacDefineHeader(DerivedHeader)

class HeaderExportedBy DerivedHeader : public CATCommandHeader

从中可以看出,PartCmdHeader是我们定义的一个类,而这个类派生于CATCommandHeader,因此,我们在做Addin时就可以直接new PartCmdHeader(…)等了,因为它的参数被定义为一个类。

8. Smart Pointer:智能指针,这个在C++中就有:A smart pointer is one which replaces a standard

pointer and adds functionality. The C++ standard library, for example, defines a class known as

auto_ptr<> which automatically frees any resource it is controlling when its destructor is called。(见:/english/code/cpp_mfc/leakfree_)说得简易些:智能指针就是一种高级的指针,不同于普通指针的是,它可以自已控制资源的释放,而不用手动去释放所申请的资源。

针对CATIA中的Smart Pointer:A Smart Pointer is a class associated to an interface, that behaves

like an interface pointer ,which additional automatic reference counting。对于一个接口CATI***,其智能指针为:CATI***_var,如CATISketch

其对应的智能指针就是CATISketch _var。

对于Smart Pointer的使用问题:这一部分参见百科全书的中间件部分,推荐的是尽可能不要使用,而采用手动的Addref或Release。

下面的例子说明了如何使用CAA C++开发方式来建立一个CATIA内部程序。实现的功能是新建一个独立的工作台(workbench),并在其下面实现添加自定义菜单,添加工具条以及按钮图标,插入CATIA风格的对话框。并生成对界面功能的响应,建立command,实现调用对话框,以及通过输入参数直接用代码生成一个三维模型,并在CATIA主窗口中显示。

1、 新建独立的workbench

CATIA V5将某类包含一系列交互命令的一些工具条分组显示在不同的工作台(workbench)中,这样有利于工具的查找和使用。通过自己新建的workbench可以将自己二次开发形成的一系列命令集中显示在一个工作台中,便于以后的操作。工作台的建立需要以下几个步骤。

?

创建工作台厂(factory)的接口(interface);?

创建工作台厂;?

创建工作台描述类;?

创建响应命令(command)的标题;?

创建工作台并排列图标按钮响应;

提供图片及提示等资源并将新建的工作台插入开始菜单;

创建工作台的显示界面。

插入新建的工作台MyWorkBench后的CATIA开始菜单如图3所示,它与CATIA现有的模块成为并列关系。现在进入MyWorkBench工作台里面没有任何工具条及按钮,下面添加这部分工具。

2、 添加工具条及按钮

首先创建按钮的描述类CAAAfrGeoCreationWkb,派生于CATBaseUnknown类。CATBaseUnknown是创建用户界面并实现界面的基类,所有的接口都是从IUnknown/CATBaseUnknown继承的。这个类中建立了两个函数分别为CATCmdWorkbench *的CreateWorkbench()函数和无返回值类型的CreateCommands()。前面的函数是用来实现顺序插入工具条、按钮图标以及菜单,后面的函数是实现对插入按钮以及菜单和响应函数的关联。

在CreateWorkbench()函数中用到了宏NewAccess(className,variableName,objectName)。CATIA的工作场(workshop)或者工作台(workbench)可以被看作是一个入口的集合包,使用NewAccess宏可以创建一个这样的入口。使用SetAccessChild(variableName,childName)以及SetAccessNext (variableName,nextName)这两个宏则可以连接入口。其中className表示

被创建类的类型,包括以下几种类型:CATCmdContainer,CATCmdWorkshop,CATCmdSeparator,CATCmdStarter。下面就是创建了一个按钮的容器,也就是工具条,并在其中添加按钮的部分代码。

NewAccess(CATCmdContainer,pCAAAfrTB1EltTlb,CAAAfrTB1EltTlb);//创建工具条pCAAAfrTB1EltTlb

SetAccessChild(pCAAAfrGeoCreationWkb, pCAAAfrTB1EltTlb); //工具条加入工作台

//创建按钮cmd1,并设置其响应宏为CAAAfrCmd1Hdr,最后将其加入工具条TB1中

NewAccess(CATCmdStarter,pCAAAfrTTB1EltCmd1Str,CAAAfrTTB1EltCmd1Str);

SetAccessCommand(pCAAAfrTTB1EltCmd1Str,"CAAAfrCmd1Hdr");

SetAccessChild(pCAAAfrTB1EltTlb,pCAAAfrTTB1EltCmd1Str);

接下来绘制一个图标,并在中将其关联,具体如下,则cmd1按钮显示的是图标。

= "I_CAACmd1";

在文件中设置新建按钮的标题以及提示内容

ry = "Element";

= "command1";

elp = "new cmd1";

添加两个工具条并插入一系列按钮的效果图如下面图4所示。

3、添加菜单

菜单的添加与添加按钮类似,也是在CreateWorkbench()函数中,只不过是在宏中的参数与添加按钮并不一样。添加后的效果图如图5所示

NewAccess(CATCmdContainer, pCAAAfrGeoCreationMbr, CAAAfrGeoCreationMbr);

NewAccess(CATCmdContainer, pCATAfrInsertMnu, CATAfrInsertMnu);

SetAccessChild(pCAAAfrGeoCreationMbr, pCATAfrInsertMnu);

NewAccess(CATCmdSeparator, pCAAAfrGeoCreationInsertSep, CAAAfrGeoCreationInsertSep);

SetAccessChild(pCATAfrInsertMnu, pCAAAfrGeoCreationInsertSep);

NewAccess(CATCmdContainer, pCAAAfrMeu1EltSnu, CAAAfrMeu1EltSnu);

SetAccessNext(pCAAAfrGeoCreationInsertSep, pCAAAfrMeu1EltSnu);

NewAccess(CATCmdStarter, pCAAAfrMMeu1SubMn1Str, CAAAfrMMeu1SubMn1Str);

SetAccessChild(pCAAAfrMeu1EltSnu, pCAAAfrMMeu1SubMn1Str);

SetAccessCommand(pCAAAfrMMeu1SubMn1Str, "CAAAfrCmd1Hdr");

在文件中设置菜单显示的属性。

CAAAfr = "新建菜单1" ;

CAAAfr = "command1" ;

3、 建立菜单以及按钮的响应类

建好的workbench空框架中可以创建三种类型的响应(command)类,他们都是CATCommand派生出来的。具体添加过程是打开CAA Rade 菜单"Insert",选择 "CATIA

Resource"下的""。可以选择Statechart command,dialog-box based command和

Basic command。Basic command是创建一个空的响应类,在函数Activate( CATCommand *

iFromClient, CATNotification * iEvtDat)中添加响应。

dialog-box based command在二次开发中会被更多的用到。选择该类型响应类,在运行的时候会直接弹出一个对话框,当然,可以对这个对话框进行编辑。对话框编辑界面如图6

所示,里面有一个正在编辑的对话框,在图的中部,右边是自带的一些控件,包括CATDlgFrame,CATDlgLabel,CATDlgEditor,CATDlgPushButton,CATDlgRadioButton等等。对话框内所有的控件在Build()函数中列出,应用函数SetGridConstraints(short int

iTopRow, short int iLeftColumn, short int iRowSpan, unsigned int iJustification)通过设置控件在对话框中矩阵位置的方式来调整位置。

为控件添加回调函数来响应各种操作。如图7所示,CATDlgPushButton按钮控件包括Creation,Visibility swap,Resizement,Button activation以及Repetitive button activation5中回调函数。选择Button activation产生点击响应生成回调函数OnPushButton004PushBActivateNotification(CATCommand* cmd,

CATCommandClientData data),可以在这个函数内添加代码。

限制用CATICkeParmFactory ,CreateAngle or CreateLength

CATNotification* evt,