CATIA二次开发(CAA)技术基础之零件设计说明.docx
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第五章零件设计
5.1零件设计环境
图 5.1零件设计环境
零件设计环境中, MyPart1中包含参考平面(包括XY平面、YZ平面、ZX平面)、轴系、参数、几何图形集、有序几何图形集、零件几何体、几何体、集合中的几何体等节点。
几何图形集是无序建模,一般全曲面建模就是他比较管用;有序几何图形集,他里面可以
包含集合中的几何体,几何图形集,几何特征,但建模方式是有序的;几何体是直接插入零件
环境下,他里面可以包含几何图形集,有序几何图形,几何特征,但建模方式是有序的;集合
中的几何体在插入前会询问用户,他可以放在树的根目录下也可以放在有序几何图形集里面,
还可以在插入的同时把有序几何图形集里的特征集合到(集合中的几何体)里面。
5.2零件设计接口介绍
5.2.1操纵零件的一般步骤
图 5.2操纵零件的主要接口及步骤
5.2.2获得CATIPrtPart
参考代码如下:
CATIPrtContainer_var spPrtContainer=spContainer;
CATIPrtPart_var spPrtPart= spPrtContainer->GetPart();
5.2.3获得零件下所有节点
方法一:利用CATIDescendants接口
CATIDescendants_var spDescendantsOnPart = spPrtPart;
CATListValCATISpecObject_var spSpecObjects;
piDescendantsOnPart->GetAllChildren("CATISpecObject",spSpecObjects);
方法二:利用CATContainer中的ListMembersHere方法
SEQUENCE(CATBaseUnknown_ptr)ListObj;
long NbObj = piRootContainer->ListMembersHere("CATISpecObject",ListObj);
for(int j=0;j<NbObj;j++)//注意从0开始
{}
注意: "CATISpecObject" 表示将所有的节点列出,如果想要只列出某种元素,可以将该
参数设置为相应的接口,例如"CATPoint" 表示所有的点。
5.2.4获得参考平面
参考平面包括XY平面、YZ平面、ZX平面,参考代码如下:
CATListValCATISpecObject_var spReferencePlanes;
spReferencePlanes= spPrtPart->GetReferencePlanes();
注意: spReferencePlanes为包含三个元素的数组,数组元素依次为xy平面,yz平面和zx平
面。
如果要使用yz平面,则参考代码如下:
CATISpecObject_var spyzPlane = spReferencePlanes[2];
5.2.5获得轴系
参考代码如下:
CATIMf3DAxisSystemManager_var spAxisSystem = NULL_var;
spPrtPart->QueryInterface(IID_CATIMf3DAxisSystemManager,(void**)&spAxisSystem);
//得到的所有轴系
CATLISTV(CATIMf3DAxisSystem_var)oAxisSystemList;
spAxisSystem ->GetAxisSystems(oAxisSystemList);
5.2.6获得参数
方法一:利用CATIDescendants接口
CATIDescendants_var spDescendantsOnPart = spPrtPart;
CATListValCATISpecObject_var spSpecObjects;
piDescendantsOnPart->GetAllChildren("CATICkeParm",spSpecObjects);
方法二:利用CATIParmPublisher中接口
CATIParmPublisher_var spParmPublisher= spPrtPart;
CATListValCATISpecObject_var ListFound;
spParmPublisher->GetAllChildren("CATICkeParm",ListFound);
方法三:利用CATContainer中的ListMembersHere方法
SEQUENCE(CATBaseUnknown_ptr)ListObj;
long NbObj = spContainer->ListMembersHere("CATICkeParm",ListObj);
for(int j=0;j<NbObj;j++)//注意从0开始
{
CATIAlias_var spAlias= ListObj[j];
cout<<spAlias->GetAlias()<<endl;// 输出参数的名字
}
5.2.7获得几何图形集等节点
该节主要介绍获得几何图形集、有序几何图形集、零件几何体、几何体、集合中的几何体等节点的方法,主要方法流程图如图 5.3所示。
获得 CATIPrtPart
获得 CATIPartRequest
Get AllBodies
GetSurfBodies GetSolidBodies
GetMainBody
几何图形集有序几何图形集零件几何体集合中几何体
的几何体
CATIMmiNonOrderedGeometricalSet CATIMmiOrderedGeometricalSet
CATIGSMTool CATIMechanicalTool
获得 CATIBodyRequest
CATBody
图 5.3流程图
例1:获得零件中的所有几何体的代码如下。
CATIPartRequest *pIPartRequest=NULL ;
HRESULT rc = spPart->QueryInterface(IID_CATIPartRequest,
(void**)&pIPartRequest);
if( SUCCEEDED(rc) )
{
CATLISTV(CATBaseUnknow_var) ListBodies;//所有几何体
CATUnicodeString ViewContext ="MfDefault3DView";
rc= pIPartRequest->GetSolidBodies(ViewContext,ListBodies);
}
例2:获得零件中的所有有序几何图形集的代码如下。
CATIDescendants_var spDescendantsOnPart = spPrtPart;
CATListValCATISpecObject_var spSpecOGSs;// 所有有序几何图形集piDescendantsOnPart->GetAllChildren("CATIMmiOrderedGeometricalSet",spSpecOGSs);例3:获得零件几何体的代码如下。
CATBaseUnknow_var spMainBody;//零件几何体
pIPartRequest->GetMainBody(ViewContext,spMainBody);
例4:获得 CATBody 的代码如下。
CATIBodyRequest *pIBodyRequest= NULL;
spMainBody ->QueryInterface(IID_CATIBodyRequest,(void**)&pIBodyRequest);
CATLISTV(CATBaseUnknown_var) ListResult;
pIBodyRequest->GetResults("",ListResult);
CATIGeometricalElement* pIGeometricalElement= NULL;
for(int i=1 ; i<= ListResult.Size();i++)
{
CATBaseUnknown_var spResult= ListResult[i];
spResult->QueryInterface(IID_CATIGeometricalElement,(void**)&pIGeometricalElement );
CATBody_var spBodyResult =pIGeometricalElement->GetBodyResult();
}
5.2.8创建轴系
//首先初始化工厂
CATIMf3DAxisSystemFactory* pIMf3DAxisSystemFactoryOnFeatCont=spContainer;
CATMathPoint Origin(150.0,.0,.0);
CATMathVector X(1.0,.0,.0);
CATMathVector Y (0.0,1.0,.0);
CATIMf3DAxisSystem_var NewAxisSystemStd;// 创建的轴系
pIMf3DAxisSystemFactoryOnFeatCont->CreateAxisSystem(Origin,X,Y,NewAxisSystemStd);
//对轴系的 X、Y 方向进行修改
NewAxisSystemStd->SetAxisDirection(CATAxisSystemXNumber,pVectorX);
NewAxisSystemStd->SetAxisDirection(CATAxisSystemYNumber,pVectorY);
5.2.9创建参数和公式
1.创建参数
// 初始化CATICkeParmFactory工厂
CATICkeParmFactory_var spParmFactory =spContainer;
CATICkeParm_var spParam1 =spParmFactory->CreateLength("Base",0.1);
CATICkeParm_var spParam2 = spParmFactory->CreateLength("Width",0.15);//长度单位为米
CATICkeParm_var spParam3 = spParmFactory->CreateLength("Height",0.2);//创建长度参数
//CATIParmPublisher 与 CATICkeFunctionFactory功能为将所有参数显示在结构树中
CATIParmPublisher_var spParmPublisher= NULL_var;
CATICkeFunctionFactory_var spFuncFactory=CATCkeGlobalFunctions::GetFunctionFactor y();
spParmPublisher=
spFuncFactory->GetCurrentSet(CATICkeFunctionFactory::Parameter,spPrtPart,CATCke::Tru e);
spParmPublisher.Append(spParam1);
spParmPublisher.Append(spParam2);
spParmPublisher.Append(spParam3);
2.创建公式
//创建参数列表
CATCkeListOfParm pList;
pList->Append(spParam1);
pList->Append(spParam2);
pList->Append(spParam3);
// 创建公式Height= Width +Base
CATICkeRelation_var spFormula1=spParmFactory->CreateFormula("Formula","","", spParam3, pList,"Width+Base",spParmPublisher,CATCke::True);
spFuncFactory->AddToCurrentRelationSet(spFormula1,spParmPublisher);
//修改参数进行测试
spParam1->Valuate(0.5);
5.2.10创建几何图形集等节点
// 初始化CATIMechanicalRootFactory工厂
CATIMechanicalRootFactory_var spMechanicalRootFactory=spContainer;
// 创建几何图形集
virtual HRESULT CreateGeometricalSet(const CATUnicodeString&iUserName,
const CATISpecObject_var& iDestination,
CATISpecObject_var & oGeomSet,
int iPosition=-1) = 0;
函数说明如下表 5.1所示:
表 5.1函数说明
iDestination为零件节点iDestination为其他节点
iPosition=-1几何图形集位于零件最后几何图形集与iDestination在同一父节点
iPosition=0几何图形集位于零件最后几何图形集位于iDestination中的最后
几何图形集位于零件中几何图形集位
0< iPosition<=iDestinatio
+1 处于iDestination
n的大小
iPosition中的Otherwise E_FAIL E_FAIL
//创建有序的几何图形集
virtual HRESULT CreateOrderedGeometricalSet(const CATUnicodeString&iUserName,
const CATISpecObject_var& iDestination,
CATISpecObject_var & oOrderedGeomSet,
int iPosition=-1) = 0;
//创建几何体
virtual CATISpecObject_var CreatePRTTool( const CATUnicodeString&iUserName,
const CATISpecObject_var&iDestination);
virtual CATISpecObject_var CreatePRTTool( const CATUnicodeString&iUserName,
const CATISpecObject_var&iDestination
int iPosition=-1);
5.2.11创建实体特征
实体特征主要包括凸台、槽、旋转体、孔、盒体、倒圆、倒角和厚曲面等特征,创建实体
特征采用CATIPrtFactory工厂中的方法,相应的方法如下表所示。
表 5.2 创建实体特征的方法
目标方法
凸台CreatePad
槽CreatePocket
旋转体CreateRotate
孔CreateHole
盒体CreateShell
倒圆CreateFillet
倒角CreateChamfer
厚曲面CreateThickness
...
现举创建孔的例子如下:
1.常用的创建孔的方法包括三种,依次如下。
public virtual CATISpecObject_var CreateHole(const CATISpecObject_var i hSurface,
const CATISpecObject_var i hDirection)=0
参数介绍: ihSurface指支持孔的平面或曲面;ihDirection指孔的特征方向,特征方向可用CATIGSMFactory中的CreateDirection创建,孔方向若为NULL_var,则按照曲面的法向创建孔。
public virtual CATISpecObject_var CreateHole(const CATISpecObject_var i hPoint,
const CATISpecObject_var ihSurface,
const CATISpecObject_var ihDirection,
const int IsPointOnSurface)= 0
参数介绍: ihPoint指在支持面上的特征点;ihSurface指支持孔的平面或曲面;ihDirection 指孔的特征方向,孔方向若为NULL_var,则按照曲面的法向创建孔; IsPointOnSurface的值如
果为0,说明ihPoint不在ihSurface上,若为0,则说明ihPoint在ihSurface上。
public virtual CATISpecObject_var CreateHole(const CATMathPoint iMathPo int,
const CATISpecObject_var i hSurface,
const CATISpecObject_var i hDirection,
const int IsPointOnSurface)= 0
参数介绍: iMathPoin指在支持面上的数学点;ihSurface指支持孔的平面或曲面;ihDirection 指孔的方向,孔方向若为NULL_var,则按照曲面的法向创建孔;IsPointOnSurface的值如果为
0,说明ihPoint不在ihSurface上,若为0,则说明 ihPoint在ihSurface上。
2.设置孔的参数
CATISpecObject_var spHole = spPrtFactory->CreateHole();
CATINewHole_var spNewHole= spHole;
spNewHole-> SetHoleType(1);//设置孔类型为简单孔
spNewHole->SetBottomType(1);//设置孔底面类型为平底
spNewHole->SetDiameter(5)//设置直径
spNewHole->SetLimit(1)//设置为盲孔
CATIHoleLimit_var spHoleLimit= spHole;
spHoleLimit->SetOffset(5);//设置孔的深度3.将孔添加在结构树中
spHole ->Update();
CATIGSMProceduralView_var ispProcView= spHole;
if(NULL_var != ispProcView) {HResult rc = ispProcView->InsertInProcedura lView();}
5.2.12创建零件设计表
// 初始化CATICkeParmFactory工厂
CATICkeParmFactory_var spParmFactory =spContainer;
//创建设计表的函数如下
CATIDesignTable_var CreateDesignTable(const CATUnicodeString&iRelationNam e,
const CATUnicodeString& iComment,
const CATUnicodeString& iFilePath,
int orientation= 1,
int sheetWithoutFile= 0);
函数说明: iRelationName为设计表的名字, iComment为设计表的说明, iFilePath为创建
表的路径。
创建零件族的步骤如下:
1. 创建参数
CATICkeParm_var spPp1=spFact->CreateInteger("Column1",0);
CATICkeParm_var spPp2=spFact->CreateReal("r",0.0);
CATICkeParm_var spPp3=spFact->CreateString("s","");
CATICkeParm_var spPp4=spFact->CreateBoolean("b",CATCke::True);
CATICkeParm_var spPp5=spFact->CreateLength("l",0);
CATICkeParm_var spPp6=spFact->CreateAngle("a",0);
2. 将参数显示在结构树上
CATIPrtContainer_var spPrtCont = spContainer;
CATIParmPublisher_var spPubroot = spPrtCont->GetPart();
CATICkeFunctionFactory_var fact = CATCkeGlobalFunctions::GetFunctionFactory();
CATISpecObject_var spParameterSet = NULL_var; spParameterSet=
fact->GetCurrentSet(CATICkeFunctionFactory::Parameter,spPubroot,CATCke::True);
CATIParmPublisher_var spParmPublisher= spParameterSet;
spParmPublisher->Append(spPp1);
spParmPublisher->Append(spPp2);
spParmPublisher->Append(spPp3);
spParmPublisher->Append(spPp4);
spParmPublisher->Append(spPp5);
spParmPublisher->Append(spPp6);
3.创建设计表
CATIDesignTable_var spDesignTable =spFact->CreateDesignTable();
4.将设计表显示在结构树上
CATISpecObject_var spRelationSet= fact->GetCurrentSet(
CATICkeFunctionFactory::Relation,spPubroot,CATCke::True);
spParmPublisher= spRelationSet;
spParmPublisher->Append(spDesign);
5.将参数与设计表关联,注意参数名字与设计表的列参数名字一定要相同
//参数列表
CATLISTV(CATBaseUnknown_var) list;
list.Append(spPp1);
spDesign->AutomaticAssociations(spContainer,NULL_var, &list);
//添加关联
spDesign->AddAssociation("Column2",spPp2);
spDesign->AddAssociation("Column3",spPp3);
spDesign->AddAssociation("Column4",spPp4);
spDesign->AddAssociation("Column5",spPp5);
6.设置配置
spDesign->SetCurrentConfiguration(1);
5.2.13创建草图Sketch
有两种方式可以创建草图:
1.通过参考平面创建
//获得参考平面
CATLISTV(CATISpecObject_var) spRefPlanes =spPart->GetReferencePlanes();
//初始化草图工厂
CATISketchFactory_var spSketchFactory(spContainer);
// 在XY plane上创建草图
CATISketch_var spSketch =spSketchFactory->CreateSketch(spRefPlanes[1]));
2.通过原点和两个矢量方向
该方法通过定义一个原点和两个方向pH、pV进行创建。
定义原点和方向:
double pOrigin[3]={0,0,10};
double pH[3]={1,0,0};
double pV[3]={0,1,0};
CATISketchFactory_var spSketchFactory(spContainer);
CATISketch_var spSketch = spSketchFactory->CreateSketch(pOrigin,pH, pV);
5.2.14创建草图几何
//首先声明编辑草图
spSketch->OpenEdition();
CATI2DWFFactory_var sp2DFactory(spSketch);
//下面创建点
CATI2DPoint_var spPt_bottom_left,spPt_bottom_right,spPt_top_right,spPt_top_lef t;
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();
5.2.15创建草图约束
CATI2DConstraintFactory_var spConstraint2DFactory(spSketch);
//定义 spLine1 为水平约束
spConstraint2DFactory->CreateConstraint(spLine1,NULL,NULL,NULL, NULL,NULL,
NULL, Cst2DType_Horizontal,0, 0);
//定义 spLine2 为垂直约束
spConstraint2DFactory->CreateConstraint(spLine2,NULL,NULL,NULL, NULL,NULL,
NULL, Cst2DType_Vertical,0, 0);
//定义 spLine3 为水平约束
spConstraint2DFactory->CreateConstraint(spLine3,NULL,NULL,NULL, NULL,NULL,
NULL, Cst2DType_Horizontal,0, 0);
//定义 spLine4 为垂直约束
spConstraint2DFactory->CreateConstraint(spLine4,NULL,NULL,NULL, NULL,NULL,
NULL, Cst2DType_Vertical,0, 0);
// 定义spLine2的长度约束
spConstraint2DFactory->CreateConstraint(spLine2,NULL,NULL,NULL, NULL,NULL,
NULL, Cst2DType_Length, 0, 0);
//定义 spLine2与 spLine4的距离约束
spConstraint2DFactory->CreateConstraint(spLine2,NULL, spLine4,NULL,NULL, NULL,
NULL,Cst2DType_Distance,0,0);
//定义 spPt_bottom_left与X轴的距离约束
CATI2DAxis_var spSupport=NULL_var;
spSketch->GetAbsolute2DAxis(spSupport);
spConstraint2DFactory->CreateConstraint(spPt_bottom_left,NULL, spSupport->GetHDirection(),NULL,NULL,NULL,NULL,Cst2DType_Distance,0,0);
//定义 spPt_bottom_left与Y轴的距离约束
spConstraint2DFactory->CreateConstraint(spPt_bottom_left,NULL, spSupport->GetVDirection(),NULL,NULL,NULL,NULL,Cst2DType_Distance,0,0); 5.3生成圆柱体实例
5.3.1本实例所实现的功能
本实例主要实现创建圆柱的功能,在对话框中直接输入圆柱直径和圆柱高度,点击确定按
钮,在零件中自动创建相应直径和高度的圆柱体,其界面如图 5.4所示。
图 5.4创建圆柱界面
5.3.2实现的步骤
5.3.2.1获得零件指针
//获得文件指针
CATDocument * pDoc= NULL;
CATFrmEditor * _pEditor= CATFrmEditor::GetCurrentEditor();
pDoc = _pEditor->GetDocument();//这里得到了PART 环境下的文档指针
CATInit_var spInitOnDoc(pDoc);
//得到零件根容器
CATIPrtContainer* piPrtCont=
(CATIPrtContainer*)spInitOnDoc->GetRootContainer("CATIPrtContainer");
//得到零件指针
CATIPrtPart_var spPart=piPrtCont->GetPart();
5.3.2.2创建草图
//初始化草图工厂
CATISketchFactory_var spSketchFactory(piPrtCont);
// 在XY plane上创建草图
CATISketch_var spSketch =spSketchFactory->CreateSketch(spRefPlanes[1]));
5.3.2.3创建草图几何
//首先声明编辑草图
spSketch->OpenEdition();
CATI2DWFFactory_var sp2DFactory(spSketch);
//这里表示圆心点
double iPoint[2]={0.,0.};
//下面创建圆圈
CATISpecObject_var spLine= spSketch ->CreateCircle(iPoint,_Editor003->GetFloatV alue());
CATI2DCurve_var spCurveOnLine(spLine);
spCurveOnLine->GetStartPoint();
spCurveOnLine->GetEndPoint();
//然后退出草图:
spSketch->CloseEdition();
5.3.2.4创建约束
CATI2DConstraintFactory_var spConstraint2DFactory(spSketch);
//定义 spLine1 的半径约束
spConstraint2DFactory->CreateConstraint(spLine,NULL,NULL,NULL, NULL,NULL,
NULL, Cst2DType_Radius, 0, 0);
//定义 spLine1 与坐标原点的同心约束
CATI2DAxis_var spSupport = NULL_var;
spConstraint2DFactory->CreateConstraint(spLine,NULL,
spSupport->GetOriginPoint(),
NULL, NULL, NULL, NULL, Cst2DType_Concentric,0, 0 );
5.3.2.5创建凸台
//从编辑框中获得援助的高度
double firstLimit=_Editor004->GetFloatValue();
double secondLimit= 0.;
//圆柱的轴向方向为 Z 轴方向
CATMathDirection dirZ(0.,0., 1.);
//初始化零件工厂
CATIPrtFactory_var spPrtFactOnPrtCont(piPrtCont);
//创建凸台
CATISpecObject_var spSpecObj =spPrtFactOnPrtCont->CreatePad(spSketch);
CATIPad_var spPadOnSpecObj(spSpecObj);
//设置拉伸方向
spPadOnSpecObj->ModifyDirection(dirZ);
//设置凸台第一限制类型
spPadOnSpecObj->ModifyEndType(catOffsetLimit);
//设置凸台的高度
spPadOnSpecObj->ModifyEndOffset(firstLimit);
//设置凸台第二限制类型
spPadOnSpecObj->ModifyStartType(catOffsetLimit);
spPadOnSpecObj->ModifyStartOffset(secondLimit);
//将凸台添加在结构树中
spSpecObj->Update();
CATIGSMProceduralView_var ispProcView= spSpecObj;
if(NULL_var != ispProcView) {HResult rc = ispProcView->InsertInProcedura lView();}
5.4本章小结
本章主要介绍了零件设计环境中的常见接口,最后用生成圆柱体的实例进行了具体应用。
...。