CATIA CAA二次开发开发教材_第1页
CATIA CAA二次开发开发教材_第2页
CATIA CAA二次开发开发教材_第3页
CATIA CAA二次开发开发教材_第4页
CATIA CAA二次开发开发教材_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1/84CATIACAA开发教材TOC\o"1-1"\t"编号标题1,附录标识,1,编号标题2,1,编号标题3"1进入CAA开发世界 31.1CAA的应用 31.2CAA开发流程界面介绍 31.3一个简单的批处理程序 8基本思路: 8主函数返回值的含义: 8运行方式: 9代码开发详解: 9创建进程 9创建新文档 9访问文档内部结构 10保存文档 11从进程移除文档 11关闭进程 111.4常用插件说明 122CAA对象模型 132.1整体架构 132.2重点模型之零件设计 152.2.1零件的复制、剪切、粘贴。 152.2.2复制、粘贴功能的主函数介绍 242.3重点模型之曲面设计 312.3.1创建放样曲面 312.3.2将曲面feature转换为Datum(CAAGsiDatum.m) 382.3.3创建Body、GS、OGS(CAAGsiBodyGSAndOGS.m) 432.4重点模型之二维图 563可视化、交互程序开发 573.1.1Workshop或Workbench的创建 573.1.2Addin的创建 633.1.3工具条、菜单的建立和显示 663.2命令的响应 683.2.1Command插入 683.2.2Dialog的插入 693.3窗体控件 723.4鼠标事件交互选择 773.5关于窗口/界面定义、命令响应、系统组织的说明 824典型实例详解 84CATIA二次开发进入CAA开发世界CAA的应用CATIA能提供的功能,通常来说,都可以通过CAA编程实现。另外,还可以对CATIA系统功能进行扩展,完成CATIA通用模块不能实现的工作。CAA开发主要有两种模式:批处理模式和交互模式。批处理程序以磁盘上存储的CATIA物理文件为处理对象,例如:在程序内部打开一个二维图文件CATDrawing,对工程图内的页面和视图等信息进行各种处理,最后在程序内部关闭文件,结束操作;或者在程序内部打开一个曲面文件,对文件内的两个曲面利用函数求交线,最后将求得的交线添加到结构树上,并关闭文件,结束操作。交互程序为用户提供交互操作界面,用户需将开发的插件加入catia标准配置,启动catia后通过新创建的菜单、工具条、对话框等,为用户提供交互手段。例如:用户在catia的操作界面内选择2个零件,然后点击命令按钮,系统检查这两个零件是否有干涉,并弹出对话框显示检查结果。下面先对基本开发流程做介绍,然后对批处理方式进行示例。CAA开发流程界面介绍建立工程。建立Framework。(3)添加预定义工作区,以搜索开发所需要的API资源。点击“CAAV5Workspace”“LocatePrerequisiteWorkspace…”,添加CATIA的安装路径。注意此路径为Intele_a文件夹的上层路径。,如果要引用其他Workspace的接口(Interface),也可以在这里指定此Workspace的路径。点击“Add”添加,如下图所示:(4)插入Module。设置当前module,并加入CAAV5类。在类文件内,添加功能代码。一个简单的批处理程序目的:利用批处理的模式创建一个新的part文档。(见工程1)基本思路:Create_Session:Createsanewsession,necessaryinabatchprogramNew:Createsanewdocumentofastandardtype("Part")SaveAs:SavesthedocumentunderanewnameRemove:RemovesthedocumentfromthesessionDelete_Session:Deletesthesession主函数返回值的含义:ReturnErrors://1-ERRORincreatingthesession2-ERRORincreatinganewdocument3-ERRORinQueryInterface4-ERRORinretrievingtherootcontainer5-ERRORinsavingthedocument6-ERRORinremovingthedocument7-ERRORindeletingthesession运行方式:mkrun-c"CAAOmbNewDocE:\\output.CATPart"代码开发详解:添加头文件//ObjectModelerBaseFramework#include"CATSessionServices.h"//Create_SessionandDelete_Session#include"CATDocumentServices.h"//New,SaveAsandRemove#include"CATInit.h"//GetRootContainer#include"CATDocument.h"//QueryInterface-CATInit//Otherincludes#include<iostream.h>//Printtothescreenduringexecutionintmain(intargc,char*argv[])创建进程在程序开始之初,每个批处理程序都应使用全局函数Create_Session创建一个进程。一个批处理程序内有且仅有一个进程。char*sessionName="CAA2_Sample_Session";CATSession*pSession=NULL;HRESULTrc=::Create_Session(sessionName,pSession);if((FAILED(rc))||(NULL==pSession)){cout<<"ERRORincreatingsession"<<endl<<flush;return1;}创建新文档采用CATDocumentServices的一个静态方法::New来定义和初始化一个文档,利用获取的文档指针pDoc可以对文档做一系列操作。CATDocument*pDoc=NULL;rc=CATDocumentServices::New("CATPart",pDoc);if(NULL!=pDoc)cout<<"NewdocumentcreatedOK"<<endl<<flush;else{cout<<"ERRORincreatingNewdocument"<<endl<<flush;return2;}访问文档内部结构访问或者更改文档,需要通过CATInit::GetRootContainer方法获取其RootContainer,然后再进行系列操作。对一个指针对象访问某个属性时,常用的方法基本可归纳为两类:(一)、调用指针对象的成员函数。(二)、直接查询指针对象的相关接口;基本格式如下:rc=pDoc->QueryInterface(IID_CATInit,(void**)&piInitOnDoc)。CATInit*piInitOnDoc=NULL;rc=pDoc->QueryInterface(IID_CATInit,(void**)&piInitOnDoc);if(FAILED(rc)){cout<<"ERRORinQueryInterfaceonCATInitfordoc"<<endl<<flush;return3;}constCATIdentidCATIContainer="CATIContainer";CATIContainer*piRootContainer=NULL;piRootContainer=(CATIContainer*)piInitOnDoc->GetRootContainer(idCATIContainer);if(NULL==piRootContainer){cout<<"ERRORinGetRootContainer"<<endl<<flush;return4;}保存文档保存函数有两个参数,参数1代表文档指针;参数2包含文档保存路径和文档名称。此外,如果有必要,还可以指定文档的保存格式。rc=CATDocumentServices::SaveAs(*pDoc,argv[1]);if(SUCCEEDED(rc))cout<<"DocumentsavedOK"<<endl<<flush;else{cout<<"ERRORinsavingdocument"<<endl<<flush;return5;}从进程移除文档当程序里面不再对文档进行操作时,在保证文档已经保存的前提下,应将移除文档。rc=CATDocumentServices::Remove(*pDoc);if(SUCCEEDED(rc))cout<<"DocumentremovedOK"<<endl<<flush;else{cout<<"ERRORinremovingdocument"<<endl<<flush;return6;}关闭进程开发结束时需调用全局函数Delete_Session,关闭进程。rc=::Delete_Session(sessionName);if(SUCCEEDED(rc))cout<<"SessiondeletedOK"<<endl<<flush;else{cout<<"ERRORindeletingsession"<<endl<<flush;return7;}常用插件说明分别对应:对话框、响应命令、workbench、类、工具条。

CAA对象模型整体架构可以对CATIA的以下方面根据需求进行二次开发:MechanicalDesignMechanicalModeler&SketcherPartDesignAssemblyDesignDrafting3DFunctionalTolerancing&AnnotationStructureAerospaceSheetMetalShapeDesign&StylingMechanicalModeler&SketcherGenerativeShapeDesignProductSynthesis&KnowledgewareDMUNavigatorDMUSpaceAnalysisDMUKinematicsSimulatorProductFunctionDefinitionProductEngineeringOptimizerKnowledgeExpertAnalysisAnalysisModelerGenerativeStructuralAnalysisMachiningNCReviewPrismaticMachiningLatheMachiningSurfacicMachiningAdvancedMachiningEquipment&SystemsElectricalModelerSchematicsPlatformModelerDistributiveSystemsSpatialLayoutSystemsLayoutElectricalLibraryElectricalHarnessInstallationElectricalWireRoutingElectricalFlatteningElectricalSystemFunctionalDefinitionSystemsDiagramsStructurePreliminaryLayout

重点模型之零件设计零件的复制、剪切、粘贴。功能函数介绍程序将介绍如何对一个pad零件应用复制、剪切、粘贴。有关零件处理的程序中经常用到的一些.h在这里列举,供开发参考://PartInterfacesFramework#include"CATIPrtProfile.h"//neededtoaccesstheprofileattributeoftheUserPad//SketcherInterfacesFramework#include"CATISketch.h"//neededtofindasketchinapathelement//MecModInterfacesFramework#include"CATIPrtPart.h"//neededtocheckvalidityofpastedelement//VisualizationFramework#include"CATPathElement.h"//neededtocheckvalidityofpastedelement//MathematicsFramework#include"CATPlane.h"//neededtocheckvalidityofpastedelement#include"CATMathPoint.h"//neededtodefineanchorpoint#include"CATMathDirection.h"//neededtodefinethenormalofthefeature//ObjectSpecsModelerFramework#include"CATISpecObject.h"//neededtomanagetheprofile#include"CATISpecAttrAccess.h" //neededtoaccessUserpadattributes#include"CATISpecAttrKey.h" //neededtoaccessUserpadattributekeys#######################include"CATLISTV_CATISpecObject.h"//neededtomanagethesketchassociatedtotheprofile#################//ObjectModelerBaseFramework#include"CATSession.h"//neededtomanagesession#include"CATDocument.h"//neededtomanagetheCATPartdocument#include"CATDocumentServices.h"//neededtocreatethedocument#include"CATSessionServices.h"//neededtocreatethesession#include"CATInit.h"//neededtoaccessMechanicaldesigncontainer#include"CATICatalogManager.h"//neededtoaccessUserPadstartup#include"CATICutAndPastable.h"//neededtoperformCut/Copy/Pasteoperation//SketcherInterfacesFramework#include"CATISketchFactory.h"//neededtocreatesketches#include"CATI2DWFFactory.h"//neededtodrawthesketches#include"CATISketch.h"//neededtomanagesketches#include"CATI2DCurve.h"//neededtodrawthelinesofthesketches#include"CATI2DPoint.h"//neededtoaccessthepointsofthesketches//MecModInterfacesFramework#include"CATIPrtContainer.h"//neededtomanageMechanicalDesignfeatures//PartInterfacesFramework#include"CATIPrtFactory.h"//neededtocreateUserPadprofile#include"CATIPrtProfile.h"//neededtovaluateUserPadattribute//ObjectSpecsModelerFramework#include"CATISpecObject.h"//neededtoqueryinterface#include"CATISpecAttrAccess.h" //neededtoaccessUserpadattributes#include"CATISpecAttrKey.h" //neededtoaccessUserpadattributekeys#include"CATIDescendants.h"//neededtoaggregateUserpadattribute#include"CATICatalog.h"//neededtoaccessUserPadstartup#include"CATCatalogFactoryServices.h"//neededtoopenStartUpcatalog//MechanicalModelerFramework#include"CATMfDefs.h"//neededtodefinethekeysoftheproceduralreport#include"CATIPrtProceduralView.h"//neededtoinsertUserPadfeatureintheproceduralview#include"CATIShapeFeatureProperties.h"//neededtotestthattheuserpasisaformfeature通过接口CATIMechanicalCCP的函数,可以判断一个特征是否允许被复制、删除、粘贴。其函数共6个:GiveMeYourFavoriteSpecificationsIsElementValidForPasteGetAnchorPointGetReferenceNormalCanBeDeletedCanBeCopied[1]返回用来创建pad用的特征列表。CATLISTV(CATISpecObject_var)CAAPriEMechanicalCCP::GiveMeYourFavoriteSpecifications()const{//RetrievestheProfileattributeoftheUserPadfeature.//CATLISTV(CATISpecObject_var)listSpec;CATISpecObject*piUserPad=NULL;HRESULTrc=((CATBaseUnknown*)this)->QueryInterface(IID_CATISpecObject,(void**)&piUserPad);if(FAILED(rc))returnlistSpec;CATISpecAttribute*piProfileAtt=piUserPad->GetAttribute("Profile");if(NULL!=piProfileAtt){CATISpecObject_varspProfile=piProfileAtt->GetSpecObject(1);piProfileAtt->Release();if(NULL_var!=spProfile){spProfile->Release();//Todecrementthereferencecount//Retrievesthesketchassociatedwiththeprofile//Thesketchisaddedinthereturnedlist//CATIPrtProfile_varspPrtProfileOnProfile(spProfile);if(NULL_var!=spPrtProfileOnProfile){CATISpecObject_varspElt=NULL_var;spPrtProfileOnProfile->GetElement(1,spElt);if(NULL_var!=spElt){listSpec.Append(spElt);}}}}piUserPad->Release();returnlistSpec;}[2]判断是否允许粘贴,允许返回1,不允许返回0。intCAAPriEMechanicalCCP::IsElementValidForPaste(CATPathElement*ispPath)const{intvalid=0;//checkingifthereisasketchinthepathelement//CATBaseUnknown*spiSketchOnElt=ispPath->FindElement(IID_CATISketch);if(NULL!=spiSketchOnElt){spiSketchOnElt->Release();valid=1;}returnvalid;}[3]用来获得被拷贝对象的绝对坐标系CATMathPointCAAPriEMechanicalCCP::GetAnchorPoint()const{//RetrievestheProfileattributeoftheUserPadfeature.//CATMathPointanchorPoint;CATISpecObject*piUserPad=NULL;HRESULTrc=((CATBaseUnknown*)this)->QueryInterface(IID_CATISpecObject,(void**)&piUserPad);if(FAILED(rc))returnanchorPoint;CATISpecAttribute*piProfileAtt=piUserPad->GetAttribute("Profile");if(NULL!=piProfileAtt){CATISpecObject_varspProfile=piProfileAtt->GetSpecObject(1);piProfileAtt->Release();if(NULL_var!=spProfile){spProfile->Release();//Retrievesthesketchassociatedwiththeprofile//Thesketchisaddedinthereturnedlist//CATIPrtProfile_varspPrtProfileOnProfile(spProfile);if(NULL_var!=spPrtProfileOnProfile){intnbElt=spPrtProfileOnProfile->GetElementCount();if(1==nbElt){//Retrievesthesketchassociatedtotheprofile//CATISpecObject_varspElt;spPrtProfileOnProfile->GetElement(1,spElt);CATIMechanicalCCP_varspCCPOnElt(spElt);if(NULL_var!=spCCPOnElt){//DelegatesGetAnchorPointtothesketch//anchorPoint=spCCPOnElt->GetAnchorPoint();}}}}}piUserPad->Release();returnanchorPoint;}[4]获得特征的法线CATMathDirectionCAAPriEMechanicalCCP::GetReferenceNormal()const{//RetrievestheProfileattributeoftheUserPadfeature.//CATMathDirectionnormal;CATISpecObject*piUserPad=NULL;HRESULTrc=((CATBaseUnknown*)this)->QueryInterface(IID_CATISpecObject,(void**)&piUserPad);if(FAILED(rc))returnnormal;CATISpecAttribute*piProfileAtt=piUserPad->GetAttribute("Profile");if(NULL!=piProfileAtt){CATISpecObject_varspProfile=piProfileAtt->GetSpecObject(1);piProfileAtt->Release();if(NULL_var!=spProfile){spProfile->Release();//Retrievesthesketchassociatedwiththeprofile//Thesketchisaddedinthereturnedlist//CATIPrtProfile_varspPrtProfileOnProfile(spProfile);if(NULL_var!=spPrtProfileOnProfile){intnbElt=spPrtProfileOnProfile->GetElementCount();if(1==nbElt){CATISpecObject_varspElt;spPrtProfileOnProfile->GetElement(1,spElt);CATIMechanicalCCP_varspCCPOnElt(spElt);if(spCCPOnElt!=NULL_var){//DelegatesGetReferenceNormaltothesketch//normal=spCCPOnElt->GetReferenceNormal();}}}}}piUserPad->Release();returnnormal;}[5]用来判断一个特征是否允许被剪切,允许返回1,否则返回值为0。intCAAPriEMechanicalCCP::CanBeDeleted(CATListValCATISpecObject_varList)const{return1;}[6]用来判断一个特征是否允许被拷贝。如果可以被拷贝,返回值为1,否则为0。 intCAAPriEMechanicalCCP::CanBeCopied()const { return1; }通过接口CATIShapeFeatureProperties的函数,定义实体特征的行为。这里共使用了两个:GetPolarityGiveMeYourFavoriteSketches复制、粘贴功能的主函数介绍程序包括:CAAPriCutCopyPast.m、CAAPriCutCopyPasteMain.m。前者包含了开发中用到的系统方法,后者是程序实现的主函数。CAAPriCutCopyPasteMain.m包含了一个main函数,首先创建了一个part文档。之后执行复制、粘贴命令。最后将结果保存在新创建的part文件中。创建进程,新建一个catpart文件。CATSession*pSampleSession=NULL;Create_Session("SampleSession",pSampleSession);CATDocument*pDoc=NULL;CATDocumentServices::New("CATPart",pDoc);对文档初始化后,锁定文档,防止在执行复制、粘贴、剪切操作时丢失数据,要注意在结束程序时,必须解除对文档的锁定。CATInit_varspInitOnDoc(pDoc);CATLockDocument((*pDoc));获取零件结构树的根结构。CATIPrtContainer*spPrtCont=(CATIPrtContainer*)spInitOnDoc->GetRootContainer("CATIPrtContainer"); 调用SketchFactory草图模块,为在PartBody上创建草图特征做好准备。CATISketchFactory_varspSketchFactOnPrtCont(spPrtCont);获取参考平面的链表。CATIPrtPart_varspPart;if(spPrtCont)spPart=spPrtCont->GetPart();CATListValCATISpecObject_varspListRefPlanes=spPart->GetReferencePlanes();将XY平面作为草图工作平面。CATISpecObject_varspSketchPlane=spListRefPlanes[1];CATISketch_varspSketch1=spSketchFactOnPrtCont->CreateSketch(spSketchPlane);定义二维图Factory,为创建二维图元素做准备。CATI2DWFFactory_varspWF2DFactOnSketch1(spSketch1);定义数组,为创建草图元素做准备。doublept1Sk1[2]={10.,5.},pt2Sk1[2]={-10.,5.},pt3Sk1[2]={-10.,-5.},pt4Sk1[2]={10.,-5.};激活结点,如图中的“草图.1”,将进入草图编辑界面,创建相应的二维图元素。spSketch1->OpenEdition();创建直线。 CATISpecObject_varspLine1Sk1=spWF2DFactOnSketch1->CreateLine(pt1Sk1,pt2Sk1);CATISpecObject_varspLine2Sk1=spWF2DFactOnSketch1->CreateLine(pt2Sk1,pt3Sk1);CATISpecObject_varspLine3Sk1=spWF2DFactOnSketch1->CreateLine(pt3Sk1,pt4Sk1);CATISpecObject_varspLine4Sk1=spWF2DFactOnSketch1->CreateLine(pt4Sk1,pt1Sk1);创建曲线两个端点。GetStartPoint()和GetEndPoint()可以返回点,也可以创建点。CATI2DCurve_varspCurveOnLine1Sk1(spLine1Sk1);spCurveOnLine1Sk1->GetStartPoint();spCurveOnLine1Sk1->GetEndPoint();CATI2DCurve_varspCurveOnLine2Sk1(spLine2Sk1);spCurveOnLine2Sk1->GetStartPoint();spCurveOnLine2Sk1->GetEndPoint();CATI2DCurve_varspCurveOnLine3Sk1(spLine3Sk1);spCurveOnLine3Sk1->GetStartPoint();spCurveOnLine3Sk1->GetEndPoint();CATI2DCurve_varspCurveOnLine4Sk1(spLine4Sk1);spCurveOnLine4Sk1->GetStartPoint();spCurveOnLine4Sk1->GetEndPoint();结束草图编辑。spSketch1->CloseEdition(); 利用刚刚创建的草图创建凸台,通过Update添加到结构树。CATISpecObject_varspUserPad1=CreateUserPad(spPrtCont,spSketch1);spUserPad1->Update();将当前结果保存到文档1中。HRESULTboolSave=E_FAIL;char*nomPart1=iArgv[1];boolSave=CATDocumentServices::SaveAs(*pDoc,nomPart1);接下来创建第二个草图,完成复制、剪切等功能。以YZ平面做为参考平面。CATISpecObject_varspSketchPlane2=spListRefPlanes[2];CATISketch_varspSketch2=spSketchFactOnPrtCont->CreateSketch(spSketchPlane2);CATI2DWFFactory_varspWF2DFactOnSketch2(spSketch2);doublept1Sk2[2]={15.,5.},pt2Sk2[2]={25.,5.},pt3Sk2[2]={25.,25.},pt4Sk2[2]={15.,25.};打开草图结点,进入二维图编辑界面,创建直线。spSketch2->OpenEdition();CATISpecObject_varspLine1Sk2=spWF2DFactOnSketch2->CreateLine(pt1Sk2,pt2Sk2);CATISpecObject_varspLine2Sk2=spWF2DFactOnSketch2->CreateLine(pt2Sk2,pt3Sk2);CATISpecObject_varspLine3Sk2=spWF2DFactOnSketch2->CreateLine(pt3Sk2,pt4Sk2);CATISpecObject_varspLine4Sk2=spWF2DFactOnSketch2->CreateLine(pt4Sk2,pt1Sk2);创建直线的两个端点。CATI2DCurve_varspCurveOnLine1Sk2(spLine1Sk2);spCurveOnLine1Sk2->GetStartPoint();spCurveOnLine1Sk2->GetEndPoint();CATI2DCurve_varspCurveOnLine2Sk2(spLine2Sk2);spCurveOnLine2Sk2->GetStartPoint();spCurveOnLine2Sk2->GetEndPoint();CATI2DCurve_varspCurveOnLine3Sk2(spLine3Sk2);spCurveOnLine3Sk2->GetStartPoint();spCurveOnLine3Sk2->GetEndPoint();CATI2DCurve_varspCurveOnLine4Sk2(spLine4Sk2);spCurveOnLine4Sk2->GetStartPoint();spCurveOnLine4Sk2->GetEndPoint();结束草图编辑。spSketch2->CloseEdition();检查基于草图1的凸台,为执行拷贝、粘贴做准备。CATIShapeFeatureProperties*pShapeFeaturePropertiesOnUserPad1=NULL;HRESULThr=spUserPad1->QueryInterface(IID_CATIShapeFeatureProperties,(void**)&pShapeFeaturePropertiesOnUserPad1);if(SUCCEEDED(hr)){intContFeat=pShapeFeaturePropertiesOnUserPad1->IsAContextualFeature();if(1==ContFeat)return5;intFormFeat=pShapeFeaturePropertiesOnUserPad1->IsAFreeFormFeature();if(0==FormFeat)return5;pShapeFeaturePropertiesOnUserPad1->Release();pShapeFeaturePropertiesOnUserPad1=NULL;执行拷贝功能,将基于草图1的数据,复制到草图2上。CATICutAndPastable_varspStartCAPOnPrtCont(spPrtCont);创建草图2的PathElement列表,在里面添加所需的元素。CATLISTV(CATBaseUnknown_var)listTargets;if(spSketch2!=NULL_var) {CATPathElement*pathTarget=newCATPathElement((CATISketch*)spSketch2);pathTarget->AddFatherElement(CATISpecObject_var(spSketch2)->GetFather());listTargets.Append(pathTarget);pathTarget->Release(); }将凸台1作为拷贝源,添加到列表。CATLISTV(CATBaseUnknown_var)listObjectsToCopy;listObjectsToCopy.Append(spUserPad1);判断对象是否可以提取特征用来执行拷贝功能。如果有可提取的对象,返回值为1;否则为0。CATLISTV(CATBaseUnknown_var)listObjectsAlreadyInBoundary;intresultat=spStartCAPOnPrtCont->BoundaryExtract(listObjectsAlreadyInBoundary,&listObjectsToCopy,NULL);创建粘贴板数据。CATBaseUnknown_varspEltCopy=spStartCAPOnPrtCont->Extract(listObjectsAlreadyInBoundary,NULL);在粘贴板的源对象上,检测可以做粘贴操作的对象列表。CATICutAndPastable_varspCAPOnEltCopy(spEltCopy);CATLISTV(CATBaseUnknown_var)listObjects;intresultat2=spCAPOnEltCopy->BoundaryExtract(listObjects,NULL,NULL);创建执行拷贝功能的操作对象。CATICutAndPastable_varspEndCAPOnPrtCont(spPrtCont);将源对象拷贝到目标对象。CATLISTV(CATBaseUnknown_var)spFinalObject=spEndCAPOnPrtCont->Paste(listObjects,&listTargets,NULL);更新结构树显示。CATISpecObject_varspSpecOnPart(spPart);if(NULL_var!=spSpecOnPart)spSpecOnPart->Update();对执行了拷贝、粘贴等操作的结果文件保存在文档2中。boolSave=E_FAIL;char*nomPart2=iArgv[2];boolSave=CATDocumentServices::SaveAs(*pDoc,nomPart2);解锁文档、移除文档、关闭进程。CATUnLockDocument((*pDoc));boolSave=CATDocumentServices::Remove(*pDoc);pDoc=NULL;boolSave=::Delete_Session("SampleSession");

重点模型之曲面设计创建放样曲面程序模块的开发目标是创建下图所示的曲面,基本步骤是:首先创建线框元素(Point,Plane,Circle),然后用Sweep,Loft等方法创建外形曲面。运行方式:程序需要指定一个参数,用于保存生成曲面的part。通过程序开发,掌握以下知识:(1)创建part文档。(2)创建GSMTool并设置为当前状态。(3)创建点、线、面、圆、扫掠、放样。(4)保存part文档。初始化--创建进程、新文档在本工程里定义了一个工具模块CAAGsiUserTools,有关曲面设计的一些常用工具均在里面定义,使用时,只需调用工具模块的一个对象,即可调用相应的设计工具。程序首先检查输入参数的合法性,然后调用工具模块的Init方法,完成:创建进程、创建新文档两项任务。intRetCode=0;HRESULTrc=S_OK;char*pPartName=NULL;pPartName=iArgv[1];CAAGsiUserToolsCAAGsiObjTool;char*pSessionName="CAA2SampleSession";rc=CAAGsiObjTool.Init(pSessionName);创建openbody&GSMTool创建一个openbody,用于容纳新创建的几何图形,创建GSM工具并设置为当前对象,用来创建所有的特征。CATLISTV(CATISpecObject_var)aObjectParameters;intsetAsCurrent=1;intCreationLocation=0;intTypeOfGeometricalSet=pTypeOfTool;CATIGSMTool_varspTool=CAAGsiObjTool.CreateGSMTool("Nozzle",setAsCurrent,0,TypeOfGeometricalSet);创建几何特征创建点创建点的工作主要分为四步:(1)创建点的长度特征,分xyz三部分。(2)将创建的点特征依次加入特征容器(3)调用中CAAGsiObjTool创建点的方法,根据特征容器创建点。(4)清空特征容器,为下次执行做准备。 CATISpecObject_varspCurrent=NULL_var;//Point(17,0,0)CAAGsiObjTool.CreateLength("X",17.0,spCurrent);aObjectParameters.Append(spCurrent);CAAGsiObjTool.CreateLength("Y",0.0,spCurrent);aObjectParameters.Append(spCurrent);CAAGsiObjTool.CreateLength("Z",0.0,spCurrent);aObjectParameters.Append(spCurrent);CATISpecObject_varspPoint1=CAAGsiObjTool.CreatePointCoord(aObjectParameters);aObjectParameters.RemoveAll();创建平面创建plane的工作类似于创建点,分为4步:(1)创建平面特征,分ABCD4部分。(2)将创建的平面特征依次加入特征容器(3)调用中CAAGsiObjTool创建平面方程的方法,根据特征容器创建平面。(4)清空特征容器,为下次执行做准备。以创建平面Y=15为例,其参数可如下设置。//AnalyticplaneY=15CAAGsiObjTool.CreateReal("A",0.0,spCurrent);aObjectParameters.Append(spCurrent);CAAGsiObjTool.CreateReal("B",1.0,spCurrent);aObjectParameters.Append(spCurrent);CAAGsiObjTool.CreateReal("C",0.0,spCurrent);aObjectParameters.Append(spCurrent);CAAGsiObjTool.CreateLength("D",15.0,spCurrent);aObjectParameters.Append(spCurrent);CATISpecObject_varspPlaneY15=CAAGsiObjTool.CreatePlaneEquation(aObjectParameters);aObjectParameters.RemoveAll();创建直线创建直线的工作分为3步:(1)在特征容器中加入两个点。(2)调用中CAAGsiObjTool创建平直线的方法,根据特征容器创建直线。(3)清空特征容器,为下次执行做准备。下面是在xy平面中创建一条直线。aObjectParameters.Append(spPoint1);aObjectParameters.Append(spPoint3); CATISpecObject_varspLine2=CAAGsiObjTool.CreateLinePtPt(aObjectParameters);aObjectParameters.RemoveAll();创建圆环创建圆环的工作分为3步:在特征容器中加入两个点。在特征容器中加入参考平面。(2)创建半径的长度,并加入特征容器。(3)根据特征容器中的元素创建圆。(4)清空特征容器,为下次执行做准备。下面是在平面Y=10中创建半径为17的通过点3点4的圆。aObjectParameters.Append(spPoint3);aObjectParameters.Append(spPoint4);aObjectParameters.Append(spPlaneY10);CAAGsiObjTool.CreateLength("Radius",17.0,spCurrent);aObjectParameters.Append(spCurrent);CATISpecObject_varspCircle2=CAAGsiObjTool.CreateCircle2PointsRad(aObjectParameters,FALSE,TRUE);aObjectParameters.RemoveAll();此外还需创建一些圆弧用来定义导引路径。通过圆心、通过点、参考平面、起始角度、结束角度创建圆弧的方法如下:aObjectParameters.Append(spPoint11);aObjectParameters.Append(spPoint7);aObjectParameters.Append(spPlaneXY);CAAGsiObjTool.CreateAngle("Angle1",0.0,spCurrent);aObjectParameters.Append(spCurrent);CAAGsiObjTool.CreateAngle("Angle2",-90.0,spCurrent);aObjectParameters.Append(spCurrent);CATISpecObject_varspCircle5=CAAGsiObjTool.CreateCircleCenterRad(aObjectParameters,FALSE);aObjectParameters.RemoveAll();创建分割(Split)创建分割,作为导引线用于限制放样曲面的范围。这里采用了两条圆弧。aObjectParameters.Append(spCircle6);aObjectParameters.Append(spPlaneAngle35);CATISpecObject_varspSplit1=CAAGsiObjTool.CreateSplit(aObjectParameters,TRUE);aObjectParameters.RemoveAll();创建扫掠曲面采用一条导引线的方式创建扫掠曲面,利用前面定义的直线、圆弧,调用CreateSweepOneGuide方法。aObjectParameters.Append(spLine2);aObjectParameters.Append(spCircle1);CATISpecObject_varspSweep1=CAAGsiObjTool.CreateSweepOneGuide(aObjectParameters);aObjectParameters.RemoveAll();创建放样曲面根据放样曲面的定义,创建所需的构造元素。首先创建一个样条曲线:利用两条直线创建端点的切线方向,在特征容器中加入两个点,最后调用CreateSpline方法创建样条曲线。aObjectParameters.Append(spPoint15);aObjectParameters.Append(spPoint16);CATISpecObject_varspDir1=CAAGsiObjTool.CreateDirection(spLine7);CATISpecObject_varspDir2=CAAGsiObjTool.CreateDirection(spLine8);CATISpecObject_varspSpline=CAAGsiObjTool.CreateSpline(aObjectParameters,spDir1,FALSE,spDir2,TRUE);aObjectParameters.RemoveAll();首先创建一个比较简单的放样曲面。定义两个特征容器,分别放置截面特征、路径特征,创建放样曲面。CATLISTV(CATISpecObject_var)aObjectParametersSections;aObjectParametersSections.Append(spCircle2);aObjectParametersSections.Append(spCircle3);aObjectParameters.Append(spLine3);CATISpecObject_varspUnused=NULL_var;CATISpecObject_varspLoft1=CAAGsiObjTool.CreateLoft(aObjectParametersSections,aObjectParameters,spUnused);aObjectParameters.RemoveAll();aObjectParametersSections.RemoveAll();之后创建一个带切割特征的较复杂放样曲面。aObjectParametersSections.Append(spCircle7);aObjectParametersSections.Append(spCircle4);aObjectParameters.Append(spSplit1);aObjectParameters.Append(spSplit2);CATISpecObject_varspLoft2=CAAGsiObjTool.CreateLoft(aObjectParametersSections,aObjectParameters,spSpline);aObjectParameters.RemoveAll();aObjectParametersSections.RemoveAll();关闭进程,保存文档调用CAAGsiObjTool中的方法,将文件保存在由输入参数指定的路径中,最后关闭进程,结束程序。rc=CAAGsiObjTool.Save(pPartName);rc=CAAGsiObjTool.Close(pSessionName);在点、线、面的特征创建中,多次用多了CreateAngleCreateLengthCreateReal方法,用于创建最基本的几何元素,其区别是:CreateAngle:创建角度数值,CreateLength:创建长度数值。CreateReal:创建比例数值。将曲面feature转换为Datum(CAAGsiDatum.m)本用例将完成以下任务:读入曲面文件、join所有曲面、将join结果转换为Datum,Datum不包含子结构,不存在上下文结构,即它的结构是稳定的。程序运行时,需输入:待处理曲面文件、保存结果文件。类似:CAAGsiDatumE:\tmp\CAAGsiNozzle.CATPartE:\tmp\CAAGsiDatum.CATPart最终的处理结果,在3D显示区和结构树上如图:载入文档在程序里面定义一些出错原因,供调试使用://0successfulexecution//1badnumberofarguments//2problemduringdocumentcreation//3problemduringdocumentdeletion//4problemduringPartSave创建进程、打开曲面文件。char*pSessionName="SampleSession";CATSession*pSession=NULL;rc=Create_Session(pSessionName,pSession);CATDocument*pDoc=NULL;rc=CATDocumentServices::OpenDocument(InputName,pDoc);CATIPrtContainer*piPartContainer=NULL;CATIPrtPart_varspPrtPart;访问零件结构的特征容器和几何容器。CATInit*pDocAsInit=NULL;pDoc->QueryInterface(IID_CATInit,(void**)&pDocAsInit);piPartContainer=(CATIPrtContainer*)pDocAsInit->GetRootContainer("CATIPrtContainer");pDocAsInit->Release();pDocAsInit=NULL;if(NULL!=piPartContainer){CATISpecObject_varspPart=piPartContainer->GetPart();spPrtPart=spPart;}获取GSM接口,为Create元素做数据准备。CATIGSMFactory_varspGsmFact;if(NULL!=piPartContainer){CATIGSMFactory*_pFact=NULL;rc=piPartContainer->QueryInterface(IID_CATIGSMFactory,(void**)&_pFact);if(SUCCEEDED(rc)){spGsmFact=_pFact;if(_pFact)_pFact->Release();_pFact=NULL;}piPartContainer->Release();piPartContainer=NULL;}在当前文档中搜索对象,通过曲面的名称在结构树上查找包含的4个曲面。CATISpecObject_varspSweep1,spSweep2,spLoft1,spLoft2;intiValidatedInput=1;if(NULL_var!=spPrtPart){CATUnicodeStringSweep1Name("Sweep.1");spSweep1=CAAGsiSearchFeatureFromName(spPrtPart,Sweep1Name);CATUnicodeStringSweep2Name("Sweep.2");spSweep2=CAAGsiSearchFeatureFromName(spPrtPart,Sweep2Name);CATUnicodeStringL

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论