首页 CATIA_CAA_二次开发详细资料合集

CATIA_CAA_二次开发详细资料合集

举报
开通vip

CATIA_CAA_二次开发详细资料合集CATIA_CAA_二次开发详细资料合集 1.CATIA CAA 二次开发详细教程(1):基本概念 1. 什么是组件, 由于本人是自学,属于摸着石头过河,所以很多东西显得比较幼稚,大家请见谅。 CAA,全称 Component Application Architecture,组件应用架构。这个东西对不搞软件的人来说可能很陌生,我也很陌生啊,原来光知道―面向对象的技术‖就很牛逼了,―组件技术‖难道更牛逼吗, 既然类和组件有着这么多类似的地方,那么传统的面向对象编程和面向组件编程有什么区别呢,简单的说,面向...

CATIA_CAA_二次开发详细资料合集
CATIA_CAA_二次开发详细资料合集 1.CATIA CAA 二次开发详细教程(1):基本概念 1. 什么是组件, 由于本人是自学,属于摸着石头过河,所以很多东西显得比较幼稚,大家请见谅。 CAA,全称 Component Application Architecture,组件应用架构。这个东西对不搞软件的人来说可能很陌生,我也很陌生啊,原来光知道―面向对象的技术‖就很牛逼了,―组件技术‖难道更牛逼吗, 既然类和组件有着这么多类似的地方,那么传统的面向对象编程和面向组件编程有什么区别呢,简单的说,面向对象关注的是组合在一个二进制可执行文件中的各个类的关系,而面向组件的编程关注的是在彼此独立的基础上模块之间的交互性,这种交互性使得你并不需要熟悉它们内部的工作原理。 这两种方法最基本的不同在于它们对最终的应用程序的观点。在传统的面向对象编程中,尽管你可以精心的把所有的商业逻辑分布在不同的类中,一旦这些类被编译,它们就被固化成了一个巨大的二进制代码。所有的类共享同一个物理单元(通常是一个可执行文件)、被操作系统认为是同一个进程,使用同一个地址空间以及共享相同的安全策略等等。如果多个开发者在同一份代码上进行开发,他们甚至还要共享源文件。在这种情况下,修改一个类可能会让整个项目被重新链接,并重新进行必要的测试,更严重的,还有可能要修改其他的类。但是,在面向组件开发中,应用程序是由一系列可以互相交互的二进制模块组合而成的。 一个具体的二进制组件可能并不能完成什么工作。有些组件是为了提供一些常规服务而编写的,例如通信的封装或者文件访问组件。也有一些是为了某些特定应用而专门开发的。一个应用程序的设计者可以通过把这些不同的组件提供的功能粘合在一起来实现他们需要的商业逻辑。很多面向组件的技术——例如: COM 、 J2EE 、 CORBA 和 .NET 都为二进制组件提供了的无缝链接的机制。而唯一的不同就是你需要在组件通信上花费的力气。 把一个二进制应用程序分解成不同的二进制组件的动机和把不同的类放到不同的文件中是类似的。后者使得不同的类的开发人员可以彼此独立的工作,尽管即时修改了一个类也要重新链接整个应用程序,但是你只需要重新编译被修改的部分就可以了。 但是,面向组件的开发还是和简单软件项目的管理更复杂一些。因为一个面向组件的应用程序是一个二进制代码块的集合,你可以把组件当作是 LEGO 的积木块一样,随心所欲的拆装它们。如果你需要修改一个组件的实现,只需要修改那个组件就可以了,而组件的客户机不需要重新编译也不需要重新开发。对于那些不常用到的组件,组件甚至可以在一个程序运行的时候被更新。这些改进和增强使得组件可以立即进行更新,而所有该组件的客户都将立即受益。无论是在同一台机器上还是通过网络远程访问。 面向组件的应用程序也更易于扩展。当你需要实现新的需求的时候,你可以提供一个新的组件,而不去影响那些和新需求无关的组件。这些特点使得面向组件的开发降低了大型软件项目长期维护的成本,这是一个最实际的商业问题,也正是如此,组件技术才如此迅速的被接受。 面向组件的应用程序通常可以更快的响应市场,因为你可以有很大的选择空 间, 不仅仅是自己开发的组件,还可以从第三方厂商来购买某些组件,从而避免了重复制造轮子。这里, VB 就是一个很好的例子,丰富的 ActiveX 控件使得很多人在快速开发中得到了享受。 面向对象和面向组件另一个重要的不同在于这两种技术在继承和重用模型上的侧重点不同。 在面向对象的分析和设计中,应用程序通常被分解成复杂的类继承结构。类的设计和要解决的商业问题紧密结合。你可以从已有基类继承并特化其行为来实现代码重用。问题在于,这是一种很糟糕的重用的方法。当你从一个基类派生一个子类的时候,你必须对基类的实现有透彻的理解才可能保证不出问题。例如:修改一个成员变量会不会带来副作用,这会对基类中的代码有什么影响,重载基类的方法会不会破坏那些想使用基类版本的客户的行为,等等。 这种形式的重用被称为白盒重用(White-box reuse),因为当你重用的时候你就需要去了解基类实现的细节。显然。白盒重用在可扩展性较高的大型应用中并不经济,也很难得到第三方Framework厂商的支持。 面向组件的开发采用了黑盒重用(Black-box reuse)的方法,它可以让你对组件内部全然不知的情况下来使用组件公开的接口。这样,你就可以远离那些复杂的继承关系。而面向组件的开发者也可以把更多的精力放在制定组件和客户的沟通的接口上了。 最后,面向对象编程提供了有限的工具和设计模式来处理和应用程序运行时相关的问题,例如多线程、并发管理、安全、分布式应用和版本控制等。面向对象的开发者当面对这些―公共需求‖的时候,或多或少的需要自己来解决问题。但是面向组件的开发方式却使你在这方面要灵活的多。 以下是CSDN社区网友对组件的一个讨论: 1面向对象是面向组件的基础,组件是在对象的基础上加上属性和事件 2复用粒度的大小不同。通常多个密切相关的对象组织在一起完成一个/或多特定的功能。组件有多个侧面(facet),不同的使用者可能只使用其中的部分。 3级别不一样,―面向对象‖是对语言级别的,―组件‖是对应用级别的。组件可以由对象实体组成。 4组件由一个或若干个对象组成。对象提供可访问的接口。 5可笑,现在很多人把面向对象编程理解为面向组件编程,真是幼稚~ 6组件是一种面向应用的概念,对象是一种面向编程方法的概念。一般进行组件编程都是用面向对象的方法编程进行实现。组件已经是一种能实际应用的实例了。本人的理解,见笑了。 7面向对象是在代码一级对数据和方法的封装,C++,JAVA 面向组件是在二进制代码上的封装,COM/COM+,CORBA 8面向组件的集成度和可重用度更高(如楼上的meking_lee所说的),面向组件渴望一种真正的接口级的搭积木的软件模式,目前在语言特性上支持这一点的就只有java了(当然也许我见识短)。 9用C++实现组件,是因为没有直接支持组件的语言。现在的组件太大了。 10 应该说是面向对像和基于组件 2. CAA架构 CATIA本身是按照组件模型建立起来的,用户可以通过开发自己的CAA组件,对DASSAULT SYSTEMES的CATIA V5进行扩展;也可以把用户自己开发的CAA组件结合起来,实现用户自定义应用。 CAA应用的框架结构遵从组件对象模型,有自己的框架结构。每个应用有至少一个框架(framework),每个框架有至少一个模块(module)。每个框架里面有一个IdentityCard.h文件,这个文件通过宏―AddPrereqComponent(framenwork,protected)‖来声明―声明‖这个框架的一些首先必备的其他框架名称,framework是框架名称。CAA的编译器就是通过IdentityCard.h文件,来把头文件搜索限制在首先必备框架所包含的接口中。 8 每个模块下面定义了一个Imakefile.mk文件,这个文件指明了这个模块中所有文件在编译时用到的其它模块和一些外部库以及为编译器提供如何编译的模块必须信息,还指定在不同的操作系统下面编译时的一些可能的特殊要求。CAA环境对Cnext能够运行的所有操作系统中采用同样的编译器,这为开发者提供了很大的方便,因为他们可以不需要知道怎样用不同的编译器和怎么写makefile。但是MKMK并不能做所有的事情,开发者至少要说明他们想要做什么。我们在自己的源文件中用到其它模块的接口,要在Imakefile.mk中进行说明。 % S( c’ R y’ [3 E- T0 Y$ _7 f程序结构采用了COM组件模型,组件模型中有两个常用的概念:接口(Interface)和实现(Implement)。接口是一个包含许多纯虚 函数 excel方差函数excelsd函数已知函数     2 f x m x mx m      2 1 4 2拉格朗日函数pdf函数公式下载 的抽象对象,这些纯虚函数指明了接口支持的方法。实现是一个具体定义接口中的方法的对象,一个实现对象必须显式声明它支持哪些接口,还必须定义它支持的接口中 的所有抽象方法,实现对象可以支持一个或多个接口,而客户应用只能通过这些接口与实现对象发生联系。 下面的这个图好像比较能体现CAA的思想,不过要仔细看看。 3.What’s RADE?? RADE,Rapid Application Development Environment,快速应用研发环境,是一个可视化的集成开发环境,它提供完整的编程工具组。RADE以Microsoft Visual C++6.0为载体,开发工具完全集成在了VC++环境中,并且提供了一个CAA框架程序编译器,但同时也限制了VC++的部分功能。可以说CATIA CAA–RADE是目前所有高端CAD/CAM开发环境中最为复杂、同时也是功能最为强大的一个。 CAA V5 RADE包括一系列工具:TCK(Tool Configuration Key)、MAB(多工作空间应用生成器)、CUT(C++单元调试管理器)、MKMK(CAA编译工具) 、CID(C++交互式面板)等,以插件的形式与MSDev VC++集成到一起。然后借助于这些工具在MSDev 环境下开发自己的CAA组件。 TCK管理RADE环境,TCK命令是用来管理开发工具包的安装,用来创建一个工作环境。当在WinowsNT上用CAA V5的可视化创建工具(以插件形式嵌入Microsoft Developer Studio),tck_init 和 tck_profile 命令在打开一个V5的工作区时被自动调用。 . Z7 MKMK(多工作区应用编译器)是DS(Dassault Systems)原代码编译工具,它构建在平台无关(UNIX和WindowsNT)的 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 编译器上,它支持面向组件 的设计模式。MKMK提供一种统一的工具来编译和连接CAA应用而不管是用的什么编程语言(Fortran, C, C++, IDL, Express, CIRCE, ...)。 1 ]1 V9 K O8 n, S4 n’ _ CUT是单元调试管理器,CUT用mkodt命令来运行传递给测试框架中的测试对象,通过选择不同的命令参数来决定选择测试一个对象或者所有对象。 CID即C++交互式面板,CID根据软件开发人员的需求,支持从设计、开发到测试、推广及维护的整个开发设计周期,CID提供对RADE产品的单点访问。尽管CID在WindowsNT下运行,它能够产生Unix程序代码。 MAB多工作空间应用生成器产品,它为CATIA V5应用程序提供一个集成统一的编译、链接、编辑、生成环境。MAB能够承担多工作空间编辑,链接,运行代码生成,以及各工作空间之间依赖性的有效管理。MAB还可以监控任一工作空间的源代码的变更,在整个编译过程中显示跟踪该变更,使编译过程只需要编译更改部分即可。 4 CATIA CAA 命令的类型及应用 命令是程序交互的基础,CAA中命令主要分为三类: 单步命令(One-shot Commands):运行时用户不能有附加选项,从其开始运行直至其结束期间无法停止,该类命令派生自CATCommand类。 对话框命令(Dialog Box Commands):用户可以输入参数值或选择选项,对话框本身即命令,而不是其它命令的一部分,该类命令派生自CATDlgDialog类。状态对话命令(State Dialog Commands):状态对话命令被模拟为状态机,通过状态、迁移(或转换)的组合可构成高级对话命令。命令中可有数个状态,每个 状态让用户选择对象、输入参数或选择选项。根据选择的对象、输入参数或选项判断是否满足条件,如果满足相应条件则触发迁移,跳转到下一状态执行,直到命令结束。对话框可用于状态对话命令作参数或选项输入界面。该类命令派生自CATStateCommand类。状态机是由状态和迁移组成的图,通常状态机附属于类,描述了类实例对接收事件的响应状态机是某个类的对象所有可能生命历史的模型,所有外部世界对对象的影响被总结为事件。事件是具有时间和空间位置的显著发生的某件事,如鼠标在窗口某个位置点击、控件的某个操作等。当对象 检测 工程第三方检测合同工程防雷检测合同植筋拉拔检测方案传感器技术课后答案检测机构通用要求培训 到事件,将对事件作出判断,并以相关于当前状态的方式来响应,这里的判断称为迁移条件或监控条件。响应可能包括动作的执行和改变到新的状态。状态即描述了对象生命周期中的一段时间,可通过三个方面来界定:某些性质上具有相似性的一系列对象值,对象等待某个或某些事件发生的一段时间,对象执行某些正在进行活动的一段时间。状态由迁移来连接,迁移定义了状态对象对某事件的响应,包括触发事件、监控条件、动作及目标状态。状态机对理解控制机制较实用,如用户交互界面和设备控制器等。 5 CATIA CAA Spec/Result Modeler基本概念解释 ―Specs‖指组成对象的事物,―Specs‖处理之后产生的叫―Result‖。如线段:两个 点为―specs‖,线段即其―specs‖的―result‖,而每个点由坐标确定,坐标集合是点的―specs‖,点即其相应―specs‖的―result‖。Spec/Result模型为Spec/Result管理提供了基础结构,也称为Build/Update机制。如果线段任一端点的任一坐标修改,线段将随之重画,也就是说,任何时候―specs‖改变,―result‖必须更新。为了保持模型协调一致,所有results都必须更新。specs之间定义了各自的内部关系,当一个spec修改时,所有依赖于该spec的specs也将随之修改,Build/Update机制由此可精确控制specs的变化。Build/Update机制的两种基本活动:一是计算每个spec以更新results,二是定义specs之间的关系。Spec/Result Modeler的最主要好处是:保证更新数据在整个系统中传播时的同一性以及使公司 规则 编码规则下载淘宝规则下载天猫规则下载麻将竞赛规则pdf麻将竞赛规则pdf 和知识经验等更易捕捉。 2.CATIA CAA 二次开发 (2):添加Workbench 这一部分很重要请注意认真看,说它重要是因为在后面程序的调试中可能会出现错误,请你务必在安装开发vc环境的时候注意,在安装vc的时候记得有个地方自己选,最好你都装了,如果你没有装也没有关系,到时候从vc的安装文件里面考出来也可以,就是关于RADE中会用到的lib库,在vc中的目录为vc98/mfc/lib目录下,如果你调试出现问题,比如error没有找到mfc42u.lib或者别的你就要从安装盘里面把所有的lib里面的文件考到你的vc对应安装目录下。 1. 2进入正题 1. 新建工作空间 你按照我以前的帖子安装完开发环境在vc下面就有了RADE的菜单 找个标签页你可以选择下面的复选框,以后新建工程的时候就不会弹出了,然后选择 ok 你可以先建立你的开发目录然后选择Workspace Directory的时候指定目录,with就选择mkmk,tool level选择你的版本。点击next 选择创建一个新的框架frame,然后finish,弹出new framework对话框,输入你的frame名字,下面的选择如图所示,framework t’ype,implementation,framework function,development,然后 ok 弹出下面的配置对话框 然后ok,dos窗口闪动几下就可以了 1. 创建module 有了工作空间和框架下面就是添加module了,好像你做的所有开发都在module里面(我 vc的fileview窗口 1. 载入必须的API函数 选择菜单如下所示: 弹出如下的对话框 Mode选择第一项,然后点击add,添加函数所在目录,选到你的catia目录下 面的B14,一定要选对。添加后的结果为 点击ok,弹出调入需要的文件对话框如下 点击close,dos窗口闪动完成。 1. 插入资源,也就是菜单、对话框等 在RADE环境的insert,catia resource,catia pattern„, 弹出对话框如下 选择ok,弹出下面的对话框 选择workObject type为workbench,然后输入你的workbench名字,点击associated workshop(也就是你要你的菜单出现在那儿,catia里面的一个workshop对应一个模块,比如机械设计、曲面等)右面的按钮,弹出下面的对话框 选择PRDWorkshop,也就是你做的菜单要出现在―机械设计‖模块里面,点击ok回到原来对话框 点击next弹出 不用选择直接next,出现对话框 这个对话框是让你选生成类的前缀,可以不用去管,然后点击finish弹出将要生成文件对话框 Ok,完成配置,回到vc界面下fileview窗口可以看到变化如下 同时将上图里面的myframe1.mfiles删除。 多了一个myworkbench.m文件包。 1. 删除多余文件并修改mk文件 1. 打开你的工作空间所在目录,找到你建立的frame框架文件 夹,然后打开删除里面的第一次建立的module,我这儿是MyModule 1,同时删除PublicInterfaces文件夹下面对应第一次建立的modul e的头文件,我这儿是MyModule1.h, 2. 修改.mk文件,因为里面未包含CATIPRDWorkshopConfigura tion.h这一个头文件的Module,打开该文件后在后面添加下面代码 LINK_WITH = $(WIZARD_LINK_MODULES)? \ CATPrsWksPRDWorkshop (3)指定你的菜单出现位置,打开userframd/Cnext/resource/msgcatalog下面的MyWorkBench.CATRsc文件,修改TestWb.Category="Infrastructure" 里面引号里面的 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 为MechanicalDesign,也就是变为TestWb.Category="MechanicalDesign",这样你的菜单就出现在―机械设计‖里面了。 1. .编译调试 1. 编译之前先更新一下运行环境,如下所示 选择creat/update runtime view,弹出下面对话框 选择图中的设置,点击ok完成更新 1. 调试mkmk 选择环境下面的菜单如下 选择mkmk进行编译弹出下面的对话框 选中你的workbench,在上面的复选框选择编译时要检测的选项,点击ok完成编译 1. 生成可执行文件 下面生成你的workbench,选择编译环境下的菜单如下所示 弹出下面的对话框 选择里面的文件和debug标签页,选择executeble for debug session文本框右面的箭头,选择brose弹出下面的对话框和选择 ive。 2、做接口CATIPrtWksAddin的implemention, insert->component,弹出对话框如图,输入addin的名字,点击add再点击浏览选择要执行的接口,如图。 要选择的接口为CATIPrtWksAddin注意Search workspace为你的CATIA安装路径,并将下面的单选框设为空。点ok完成。文件相应的试图如下: 3、此时建立了一个空的Addin。在yourframe.dico文件中可以看到这个Addin的声明: NewAddin????? CATIPrtWksAddin? libPartDesignAddin 但是,要创建一个工具条,我们还需要在这个类:NewAddin中添加一些函数。 在NewAddin类中添加两个Public函数声明: void CreateCommands(); CATCmdContainer * CreateToolbars(); 在NewAddin.cpp中添加宏定义: #include "CATCommandHeader.h"??????? MacDeclareHeader(PartCmdHeader); 这两个函数及宏都可以按ctrl+F1查到, CreateCommands里面的代码只是用 MacDeclareHeader生成的PartCmdHeader定义命令的header(不知道怎么翻译,就是工具条或菜单里面可以看到的执行命令的按钮了,这个命令是连接界面命令和实现代码的桥梁。)如:? new PartCmdHeader(―point‖,―CmdModule‖,―TestCmd‖,(void *)NULL); new PartCmdHeader("line","CmdModule","LinCmd", (void *)NULL);第一个参数是按钮的名字,第二、三个代表按钮执行的命令所在的module和命令的名字,参数四缺省就行了。 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); 这三个函数都可以查到, NewAccess肯定是新建了,常用的类有 CATCmdWorkbench(The workbench’s access is a CATCmdContainer which contains containers: one for it’s menubar and one for each toolbar. ) 、CATCmdContainer(Class to create the container’s access like a menubar, a menu, a submenu, a toolbar or an icon box) 、 CATCmdStarter、(A starter is a leaf of the workshop’s accesses tree. At each starter you attach a CATCommandHeader to launch the associated command. ) NewAccess, SetAccessCommand, SetAccessChild, SetAccessNext等几个命令的 使用。其具体含义可以参看API文档的说明。( SetAccessCommand 就是将starter 与上面的PartCmdHeader 建立的东西连接了,注意参数―line‖ )其他的顾名就可 思义。 4、此时编译,发生几个连接错误。主要是CATCmdContainer类型及Newaccess 的定义的头文件及其Module的添加。 在.h文件中加上:#include "CATCmdContainer.h" 在.cpp中加入:#include "CATCmdContainer.h" #include "CATCreateWorkshop.h" 在.mk文件中加入:WIZARD_LINK_MODULES =? \ JS0FM JS0GROUP PrtWorkshop MechanicalModelerUIUUID \ CATApplicationFrame # END WIZARD EDITION ZONE LINK_WITH = $(WIZARD_LINK_MODULES)? \ CATApplicationFrame 在Identitycard.h中加入: AddPrereqComponent("ConstraintModelerUI",Protected); 注意:每次换行时,都要加一斜线用来继续执行下面的module. 到此addin就做成了。剩下的就是定义资源文件,也就是换换名字或给按钮连 接个图片。和前面的workbench一样工具条名字在―NewAddin.CATNIS‖中进行定 义: PartBenchTlb.Title=‖测试工具条‖; 在NewAddin.CATRsc定义图片。 NewAddin.point.Icon.Normal = ―I_CAAPoint‖ ;(图片一般放在cnext/resource graphic\ Icon\Normal文件加下 , NewAddin.CATRsc文件可能不会自动生成, 你可以在相应的文件加下新建一个问 下面简单介绍一下命令的响应, (1)首先就是前面提到的 new PartCmdHeader(―point‖,―CmdModule‖,―TestCmd‖,(void *)NULL); 你做的命令所在的模块和命令名一定要和上面的名字对应。新建一个名为CmdModule的Module。将此Module设为当前的Project,选择―Insert‖? ―CATIA Resource‖? ―Command„‖,插入一个名位TestCmd的Command: (2)Dialog的插入 将CmdModule设为当前Project,选择―Insert‖? ―CATIA Resource‖? ―Dialog„‖,并将其名字设为TestDialog。 然后在TestDialog.CATDlg中添加控件,这里的控件与一般VC程序差不多,不再详述。添加三个回调函数。 在Command(TestCmd.cpp)的BuildGraph()函数或者其构造函数中添加代码: TestDialog *pi=new TestDialog(); pi->Build(); pi->SetVisibility(CATDlgShow); 注意先加其头文件: #include "TestDialog.h" 在TestDialog.cpp的Build()函数中添加 在三个回调函数中加入 RequestDelayedDestruction(); 此语句功能为执行Dialog的析构函数。 编译(MKMK),更新(Create/Update runtime virw),运行tools->open runtime window输入cnext。去partdesign里找你的工具调就行了。 补充:在自己做的workbench里加工具条和菜单代码是一样的,一般加在文件workshop.h里面,它里面已经有了工具条的代码,宏定义header class也已经自动添加到yourworkbenchCmdHeader.cpp里面 在做以上例子时最好参考CAA V5 Encyclopedia\user interfaces\Wintop Frame里面的Create workbench、CreateAddin例子,资源文件的定义在这里也讲的比较详细 4.CATIA CAA二次开发 (4):创建自定义特征 本例是使用CAA C++开发方式,建立一个自定义的用户特征,实现的功能是使一个任意曲面可以根据给定曲面的形状来生成和目标形状相同的形状,类似于生活中缝补的概念,其具体的开发步骤如下: (1)创建一个库(catalog)来定义特征的StartUp。用CATfctEditorAssistant-new-catalog命令创建catalog,通过.osm文件定义catalog里StartUp数据结构。对StartUp的定义要根据自定义特征的性质,选用合适的container,在feature定义中,要对对自定义特征的输入输出和该特征的中性数据 给予明确的定义。 (2)创建一个扩展接口来访问特征的属性。通常在该接口中定义设置和获取自定义特征属性的方法。在 取得被缝合的表面和支撑面。 actory)。该工厂的作用是打开创建 (3)创建一个可以实例化该特征的工厂(F 的catalog获取startup,然后实例化自定义特征并设置它的属性。 oolbar。使用CATCommandHeader类创建命令头,最简单的 (4)创建工具条T 方法就是使用宏命令: #include"CATCommandHeader.h"、MacDeclareHeade(rMyHea-der)。CommandHeader添加到工具条的Addin函数中,createco-mmand(s)用来实例化一个新的命令,createtoolbars用来确定访问顺序,SetAccessCommand的作用是将命令头与按钮相连,SetAccessChild以及SetAccessNext这两个宏则可以顺序连接到入口。 (5)创建对话框Panal。在Bulid函数里添加设置对话框各按钮相应的功能函数,并为各按钮设置默认的初始值。用CATStateCommand类创建StateCommand命令,在BuildGraph里 定义状态表(StartChart)来实现用户意图。 (6)最后应用CATIBuild方法,当输入改变时对新的特征更新。 运行程序后,生成图1所示的三张不同形状的曲面,其中黄色两个曲面为参考面,绿色为目标曲面。 当在创建的自定义特征对话框中,参考曲面选择sphericalsurface,目标曲面选择base plane时,点击ok按钮后,原绿色平面就生成了缝合球面后的新特征,如图2所示。 图2以球面为参考生成的自定义特征 当在创建的自定义特征对话框中,参考曲面选择prismsurface,目标曲面选择base plane时,点击ok按钮,原绿色平面就生成了缝合后的新特征,如图3所示。 )添加一个点 5.CATIA CAA 二次开发 详细教程(5 在创建任何几何对象之前,必须在激活的函数命令中添加以下代码,: CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor(); if(pEditor == NULL) { printf("error getting the FRM editor"); } CATDocument *pDoc = pEditor->GetDocument(); CATIContainerOfDocument_var spConODocs = pDoc; CATIContainer* pSpecContainer = NULL; HRESULT hr = spConODocs->GetSpecContainer(pSpecContainer); if(spConODocs == NULL_var) { printf("error getting the container of documents"); } 以上代码的主要功能是获取editor, the document and the container。 CATIGSMFactory_var spGSMFactory = NULL_var; CATIPrtFactory_var spPrtFactory = NULL_var; CATICkeParmFactory_var spParmFactory = NULL_var; spGSMFactory = pSpecContainer; spPrtFactory = pSpecContainer; spParmFactory = pSpecContainer; 以上代码设置工厂,在这基础上你才可以造型,GSMFactory用于创建底层的 几何对象比如点、线等。PrtFactory包含创建孔特征、拉伸特征实体等函数。 ParmFactory 包含设定参数的函数。 在以上的基础上可以创建点了,步骤如下: (1)创建一个三维数组(x,y,z)定义点坐标。 double Coords[3]; Coords[0] = 0; Coords[1] = 0; Coords[2] = 0; (2)创建一个CATIGSMPoint并将其转换为CATISpecObject CATIGSMPoint_var spPoint1 = spGSMFactory->CreatePoint(Coords); //Creates a point CATISpecObject_var spSpecPoint1 = spPoint1; //Casts the point as a CATISpecObject (3)为了在CATIA显示你创建的点,必须将其添加到视图中。 spSpecPoint1->Update(); CATIGSMProceduralView_var spPntObj = spSpecPoint1; spPntObj->InsertInProceduralView(); 所有的源代码如下: // www.mememama.cn // ---------------------------------------------------- CATStatusChangeRC MyCommand::Activate( CATCommand * iFromClient, CATNotification * iEvtDat) { CATFrmEditor* pEditor = CATFrmEditor::GetCurrentEditor(); if(pEditor == NULL) { printf("error getting the FRM editor"); } CATDocument *pDoc = pEditor->GetDocument(); CATIContainerOfDocument_var spConODocs = pDoc; CATIContainer* pSpecContainer = NULL; HRESULT hr = spConODocs->GetSpecContainer(pSpecContainer); if(spConODocs == NULL_var) { } printf("error getting the container of documents"); CATIGSMFactory_var spGSMFactory = NULL_var; CATIPrtFactory_var spPrtFactory = NULL_var; CATICkeParmFactory_var spParmFactory = NULL_var; spGSMFactory = pSpecContainer; spPrtFactory = pSpecContainer; spParmFactory = pSpecContainer; double Coords[3]; Coords[0] = 0; Coords[1] = 0; Coords[2] = 0; CATIGSMPoint_var spPoint1 = spGSMFactory->CreatePoint(Coords); //Creates a point CATISpecObject_var spSpecPoint1 = spPoint1; //Casts the point as a CATISpecObject } return (CATStatusChangeRCCompleted); spSpecPoint1->Update(); CATIGSMProceduralView_var spPntObj = spSpecPoint1; spPntObj->InsertInProceduralView(); 6.CATIA CAA 二次开发 详细教程(6)创建一条线 初始的设定请参考上一讲《CATIA CAA 二次开发 详细教程(5)添加一个点》。 在此基础上,创建线的步骤如下: 1)创建两个点并将其转换为CATISpecObjects。 double Coords[3]; Coords[0] = 0; Coords[1] = 0; Coords[2] = 0; CATIGSMPoint_var spPoint1 = spGSMFactory->CreatePoint(Coords); CATISpecObject_var spSpecPoint1 = spPoint1; Coords[0] = 8; Coords[1] = 6; Coords[2] = 7; CATIGSMPoint_var spPoint2 = spGSMFactory->CreatePoint(Coords); CATISpecObject_var spSpecPoint2 = spPoint2; 2) 利用创建的点创建一条线,并将其转换为CATISpecObject CATISpecObject_var spSupport = NULL_var; CATIGSMLinePtPt_var spLine1 = spGSMFactory->CreateLine(spSpecPoint1, spSpecPoint2, spSupport); CATISpecObject_var spSpecLine1 = spLine1; 3) 更新创建的线,并将其添加到视图中。 spSpecLine1->Update(); CATIGSMProceduralView_var spCurObj = spLine1; spCurObj->InsertInProceduralView(); 7.CATIA CAA 二次开发 详细教程(7)创建草图Sketch 有两种方式可以创建草图: 1)通过参考平面创建 首先获取一个CATIPrtPart变量: CATIPrtPart_var spPart(pIPrtContOnDocument->GetPart()); pIPrtContOnDocument->Release(); 有了CATIPrtPart变量就可以利用其方法GetReferencePlanes(),获取参考平面 CATLISTV(CATISpecObject_var) spRefPlanes = spPart->GetReferencePlanes(); 然后创建XY plane (spRefPlanes[1]) CATISketchFactory_var spSketchFactory(pSpecContainer); if ( NULL_var == spSketchFactory ) return (CATStatusChangeRCCompleted); CATISketch_var spSketch(spSketchFactory->CreateSketch(spRefPlanes [1])); if ( NULL_var == spSketch ) return (CATStatusChangeRCCompleted); spSketch->OpenEdition(); 2) 通过原点和两个矢量方向 该方法是通过定义一个原点和两个方向pH、pV 进行创建。 定义原点和方向: double origin[3]={0.0,0.0,10.0}; double x_dir[3]={1.0,0.0,0.0}; double y_dir[3]={0.0,1.0,0.0}; CATISketchFactory_var spSketchFactory(pSpecContainer); if ( NULL_var == spSketchFactory ) return (CATStatusChangeRCCompleted); CATISketch_var spSketch(spSketchFactory->CreateSketch(origin,x_dir,y_dir)); if ( NULL_var == spSketch ) return (CATStatusChangeRCCompleted); spSketch->OpenEdition(); 到这里,你已经创建了一个Sketch,你可以在上面创建任意的草图了。 创建 好记住要将其关闭: spSketch->CloseEdition(); 8.CATIA CAA 二次开发 详细教程(8)草图上创建几何图形 在上一节的基础上,开始创建草图。首先创建草图工厂: CATI2DWFFactory_var sketch2DFactory(spSketch); 下面创建点: CATI2DPoint_var spPt_bottom_left, spPt_bottom_right, spPt_top_right, spPt_top_left; double pt_bottom_left[2] = {10., 10.}; double pt_bottom_right[2] = {50., 10.}; double pt_top_right[2] = {50., 50.}; double pt_top_left[2] = {10., 50.}; spPt_bottom_left = sketch2DFactory->CreatePoint(pt_bottom_left); spPt_bottom_right = sketch2DFactory->CreatePoint(pt_bottom_right); spPt_top_right = sketch2DFactory->CreatePoint(pt_top_right); spPt_top_left = sketch2DFactory->CreatePoint(pt_top_left); 开始创建线: CATI2DLine_var spLine1, spLine2, spLine3, spLine4; spLine1 = sketch2DFactory->CreateLine(pt_bottom_left,pt_bottom_right); spLine2 = sketch2DFactory->CreateLine(pt_bottom_right,pt_top_right); spLine3 = sketch2DFactory->CreateLine(pt_top_right,pt_top_left); spLine4 = sketch2DFactory->CreateLine(pt_top_left,pt_bottom_left); 将线连接起来: CATI2DCurve_var spCurve1 (spLine1); CATI2DCurve_var spCurve2 (spLine2); CATI2DCurve_var spCurve3 (spLine3); CATI2DCurve_var spCurve4 (spLine4); spCurve1->SetStartPoint(spPt_bottom_left); spCurve1->SetEndPoint(spPt_bottom_right); spCurve2->SetStartPoint(spPt_bottom_right); spCurve2->SetEndPoint(spPt_top_right); spCurve3->SetStartPoint(spPt_top_right); spCurve3->SetEndPoint(spPt_top_left); spCurve4->SetStartPoint(spPt_top_left); spCurve4->SetEndPoint(spPt_bottom_left); 然后退出草图: spSketch->CloseEdition(); 9.CATIA CAA 二次开发 详细教程(9)创建圆角三角形 1)创建三个点(参见教程5) 2) 将点连成线(参见教程6) 3) 通过三点创建一个参考平面,后面进行圆弧倒角时要用到该平面。 CATIGSMPlane3Points_var Supportplane = spGSMFactory->CreatePlane(spPoint1, spPoint2,spPoint3); CATISpecObject_var spSupportplane = Supportplane; 4) 创建倒角半径的参数: CATICkeParm_var Radius1 = NULL_var; CATICkeMagnitude_var spRadMag = spParamDictionary->FindMagnitude("LENGTH"); CATUnicodeString name("Radius 1"); Radius1 = spParmFactory->CreateDimension(spRadMag,name, .01); 5) 创建倒角:: CATIGSMCorner_var Corner1 = spGSMFactory->CreateCorner(spLine1, spLine2, spSupportplane, Radius1, CATGSMSameOrientation, CATGSMSameOrientation, FALSE); CATISpecObject_var spCorner1 = Corner1; 6) 裁剪去多余的线和点: CATIGSMSplit_var Split1 = spGSMFactory->CreateSplit(spLine1, spRadius1, CATGSMSameOrientation); CATISpecObject_var spSplit1 = Split1; CATIGSMSplit_var Split1a = spGSMFactory->CreateSplit(spSplit1, spRadius3, CATGSMInvertOrientation); CATISpecObject_var spSplit1a = Split1a; 7) 将线和圆弧依次连接起来,创建一个序列: CATLISTV(CATISpecObject_var) joincurves; joincurves.Append(spSplit1a); joincurves.Append(spSplit2a); joincurves.Append(spSplit3a); joincurves.Append(spRadius1); joincurves.Append(spRadius2); joincurves.Append(spRadius3); 8)在讲序列连接起来之前,需要创建一个最小的结合距离: CATICkeParm_var Mergedist = NULL_var; CATICkeMagnitude_var spMergedist = spParamDictionary->FindMagnitude("LENGTH"); CATUnicodeString mergename("Merge Distance"); Mergedist = spParmFactory->CreateDimension(spMergedist, mergename, .0001); 9)连接起来并插入到视图中: Now we can join this list of objects into a single shape and insert it into the part. CATIGSMAssemble_var CurveAssy = spGSMFactory->CreateAssemble(joincurves, Mergedist, FALSE); CATISpecObject_var spCurveAssy = CurveAssy; spCurveAssy->Update(); CATIGSMProceduralView_var spCurObj = Curveassembly; spCurObj->InsertInProceduralView(); 10.CATIA CAA 二次开发详细教程(10) 文档操作方法 创建 加载 保存 1、创建(Create the new document) CATDocument* pDoc = NULL; rc = CATDocumentServices::New("Part",pDoc); if (NULL != pDoc) { cout << "New document created OK" << endl << flush; } else { cout << "ERROR in creating New document" << endl << flush; return 2; } Now that the session is opened, you can create a new document using the New static method of CATDocumentServices. This method creates a document and initializes it, allowing it to be loaded and stored and making it editable. In this use case, a pre-defined document type, "Part", is used as a document type. In interactive mode, this is the name that appears when performing a File/New operation. It is not the file extension, which, in this case, is "CATPart". 2、打开(Load the document) CATDocument *pDoc = NULL; rc = CATDocumentServices::Open(argv[1], pDoc); if (SUCCEEDED(rc) && (NULL != pDoc)) { cout << "Document opened OK" << endl << flush; } else { cout << "ERROR in opening an existing document" << endl << flush; return 2; } Now that the session is opened, you can load an existing document using the Open static method of CATDocumentServices. This method needs, as a first parameter, the entire storage path name and document name of the existing document that we want to load into the session. In this use case, we enter this information as an argument to the program. The second parameter of the Open method returns a CATDocument pointer to the document it has loaded. Once the document exists in the session, you can work with objects within it, using specific interfaces external to the ObjectModelerBase framework. 3、获取当前文档 CATFrmEditor * pEditor = GetEditor(); if (NULL != pEditor ) { cout << "Editor got OK" << endl << flush; } else { cout << "ERROR in getting the current editor" << endl << flush; return 1; } CATDocument *pDoc = pEditor->GetDocument(); if (NULL != pDoc) { cout << "Document opened OK" << endl << flush; } else { cout << "ERROR in opening an existing document" << endl << flush; return 2; } 4、提取根容器(Retrieving the Document Root Container) CATInit *piInitOnDoc = NULL; rc = pDoc -> QueryInterface (IID_CATInit, (void**) &piInitOnDoc); if (FAILED(rc)) { cout << "ERROR in QueryInterface on CATInit for doc" << endl << flush; return 3; } const CATIdent idCATIContainer = "CATIContainer"; CATIContainer *piRootContainer = NULL; piRootContainer = (CATIContainer*) piInitOnDoc -> GetRootContainer(idCATIContainer); if (NULL == piRootContainer) { cout << "ERROR in GetRootContainer" << endl << flush; return 4; } The document root container is retrieved using the CATInit::GetRootContainer method. The CATIContainer handle retrieved through GetRootContainer will be necessary whenever you want to create or manipulate objects in the document. 5、保存文档(Save the Document) 5.1 另存 rc = CATDocumentServices::SaveAs (*pDoc, argv[1]); if (SUCCEEDED(rc)) { cout << "Document saved OK" << endl << flush; } else { cout << "ERROR in saving document" << endl << flush; return 5; } To save the new document, use the SaveAs static method of CATDocumentServices. This method takes the pointer to the document created by New as a first parameter, and the storage path name and document name under which the document is to be stored as a second parameter. In this use case, we pass the storage path name and document name as an argument to the program. 5.2 保存 rc = CATDocumentServices::Save (*pDoc); if (SUCCEEDED(rc)) { cout << "Document saved OK" << endl << flush; } else { cout << "ERROR in saving document" << endl << flush; return 3; } To save the new document under the same name, use the Save static method of CATDocumentServices. This method takes the CATDocument pointer to the document as the only parameter. 6、删除(Remove the document) rc = CATDocumentServices::Remove (*pDoc); if (SUCCEEDED(rc)) { cout << "Document removed OK" << endl << flush; } else { cout << "ERROR in removing document" << endl << flush; return 6; } If you ever needed to re-open the document during this same session, it would then be necessary to also remove it from the session after having saved it. Otherwise, you need not worry about it since deleting the session will automatically remove the document as well. To remove the document, you should use the Remove static method of CATDocumentServices. 7、按指定文档格式保存(Exporting a Document Format Type) 7.1 Defining the New Document Format Type CATProduct_OmbExportType CATIExportTypeManager libCAAOmbExportType A new document format type is simply defined by adding a new entry in the current framework’s dictionary. This new entry will cause the File/SaveAs dialog box to list the new format type among the types defined to the save operation. The first parameter, CATProduct_OmbExportType, indicates that the exporting document is a Product-type document (i.e., a document having a .CATProduct suffix) and that the exported document format type is "OmbExportType", which will also be the suffix of the saved document. The second parameter indicates that this new document type will implement the CATIExportTypeManager interface in order to define the specific save operations necessary to export the new document. The last parameter is the name of the library in which the implementation module is to be found. 7.2 Implementing CATIExportTypeManager See the Object Modeler articles [2] for a detailed explanation about interface implementations. The implementation of CATIExportTypeManager is found in the CAAOmbExportType.m module defining the CAAEOmbExportTypeData implementation class. CATImplementClass( CAAEOmbEExportTypeData, CodeExtension, CATBaseUnknown, CATProduct_OmbExportType ); The CATImplementClass macro defines the implementation class CAAEOmbExportTypeData as a code extension implementing the CATProduct_OmbExportType late type. #include "TIE_CATIExportTypeManager.h" TIE_CATIExportTypeManager( CAAEOmbExportTypeData ); The above statement indicates that this is an implementation of the CATIExportTypeManager interface. HRESULT CAAEOmbExportTypeData::ExportData ( CATDocument *pDoc, CATUnicodeString path ) { cout << "************** Begin ExportData 1" << endl << flush; HRESULT rc = CATDocumentServices::SaveAs (*pDoc, path); return rc; } In this case, the document is simply saved using the SaveAs method of CATDocumentServices. However, it is in this method that you must code any specific save operations necessary for your new document type. 程序的发布 11.CATIA CAA 二次开发详细教程(11) 1. 发布条件: 已安装了CATIA,版本不能低于开发使用的CAA版本。 CAA代码成果物―intel_a‖文件中的所有文件。 1. 发布方法: 2. 将―intel_a‖文件存放在要发布机器上,存放―intel_a‖文件的路径最好不要有 中文字符和空格。(例:E:\VCINewFromExisting\intel_a) 3. 点击 ‖开始‖ –> ‖所有程序‖ –> ―CATIA P3‖ –> ―Tools‖ –>‖ Environment Editor V5R18‖ 1. 点击 ―确定‖。 1. 选择‖Environment‖ –> ―New‖ 1. ―Name‖ 栏为将要创建的桌面快捷方式的名称;在‖Install Path‖ 栏中,CATIA 的安装路径后输入‖; E:\VCINewFromExisting\intel_a‖,这是要发布的intel_a的存 放路径;其他如图所选,采取默认设置。完成后点击‖OK‖。 1. 至此发布完成,在桌面上会生成一个名为‖NewFromExisting‖的CATIA类型图标。双击该图标,会启动CATIA,用户便可使用CATIA原所有功能和新发布的功能。 1. 与原CATIA图标集成发布方法: 设: Catia的工作目录是 D:\DS\B18\intel_a; 已开发插件的工作目录是D:\MyAddin\intel_a; 将D:\MyAddin\intel_a下这些文件复制到D:\DS\B18\intel_a对应的位置,即可在运行Catia时候自动加载插件: code \ bin \ *.dll; \ code \dictionary \ *.dico; \ code \ productIC \ *.script; \ code \ productIC \ *.xml; *.bmp; \ resources \ graphic \ icons \ normal \ \ resources \ msgcatalog \ *.CATNls; \ resources \ msgcatalog \ *.CATRsc; 12.CATIA CAA 二次开发详细教程(12)在CAA中定义全局函数 在CAA中定义全局函数时要做到以下几点: 1、包含全局函数的类在新建时,Header一定要选择PublicInterface,默认的是localInterface。如图所示 2、如果在某个模块中用到了全局函数,则在这个模块的.mk文件中一定要链接全局函数所在的模块 3、在定义全局函数所在的类时,前面一定要有ExportedByGlobal,如图所示, 表示全局函数可以向外输出,即可以被外界使用。 这个Global是我建的全局函数所在的模块,每个人用自己所建的模块 。 如果在编译时出现―使用了未定义的类ExportedByGlobal‖的错误,是因为在全局函数所在的类的头文件中没有包含Global.h,其中Global是全局函数所在的模块。 注意以上三点,定义全局函数就不会错了。 )CAA框架三字缩写词 13.CATIA CAA 二次开发详细教程(13
本文档为【CATIA_CAA_二次开发详细资料合集】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_729658
暂无简介~
格式:doc
大小:82KB
软件:Word
页数:34
分类:工学
上传时间:2017-11-23
浏览量:170