实现机械设计特征构建
实现 CATIBuild 和 CATIBuildShape 接口
接要
本文讨论CAAPriUserPad案例。本案例说明如何为机械设计特征实现CATIBuild和CATIBuildShape接口。例如,简单的凸台特征用作机械特征。 强烈建议了解机械建模器 [1]。
- 使用此案例你将学习什么
- CAAPriBuildUserPad 案例
- CAAPriBuildUserPad实现了什么
- 如何启动CAAPriBuildUserPad
- 在哪找到 CAAPriBuildUserPad代码
- CATIBuild 的实现步骤
- CATIBuildShape 的实现步骤
- 总之
- 引用
使用此案例你将学习什么
此案例旨在帮助您完成使用零件设计进行编程的第一步。 其主要目的是介绍实现机械设计功能的 CATIBuild 和 CATIBuildShape 接口的方法的重要概念。具体来说,您将如何学习:
- 创建与特征关联的拓扑体
- 报告操作。
在谈到这个用例本身之前,请参阅文章“在更新机制中集成新的几何特征”[2],其中详细解释了如何实现CATIBuild和CATIBuildShape接口。
[Top]
CAAPriBuildUserPad案例
CAAPriBuildUserPad是http://CAAPartInterfaces.edu框架,说明了PartInterface和MechanicalModeler框架的功能。
[Top]
CAAPriBuildUserPad实现了什么
CAAPriBuildUserPad的目标是展示如何在给定的形状特征(即用户凸台)上实现CATIBuild和CATIBuildShape接口。用户凸台已作为启动项存在于CAAPriFormFeature目录中,其类型为CAAPriUserPad。它是一个形状特征,换句话说,CAAPriUserPad启动源于MechanicalFormFeature启动[3]。
图1 初创程序的层次结构

CAAPriBuildUserPadMain.m模块包含一个主程序,该主程序创建一个零件文档,实例化CAAPriUserPad启动,调用其生成方法,保存生成的部件文档图2,用新草图再次实例化CAAPriUserPad启动,调用其生成方法,并将生成的部件保存在第二个部件文档图3中。
图2 第一个保存的凸台

图3 第二个保存的凸台

详细构建
生成特征包括创建结果。结果是:
- 由来自几何建模器框架的对象计算的关联几何结果。此结果是 CATBody,一个拓扑对象。
- of the 范围[4]:为了确保用户板的生命周期,并使其可由其他机械特性重用,Build方法构造一个对象,用于管理 CATBody 的 CATCell [的访问稳定性。 T他的对象是由用户凸台的程序报告创建的范围。
以下架构详细介绍了形状特征的构造。形状特征是一个链式连接的实体特征(与表面特征相对)。这些链接由ResultIN和 ResultOUT属性链接在一起。实体要素的 ResultIN 属性引用链中上一个特征的 ResultOUT 属性。 有关ResultIN和ResultOUT属性的完整详细信息,请参阅标题为“应用于机械特征的规格/结果机制”的文章[5]。
图4 :形状特征生成

- •BuildShape方法构建一个作用域和一个名为拓扑C的CATBody-此结果与形状特征本身(本例中的用户凸台)关联。
- 构建方法构建一个范围和一个名为拓扑B的CATBody-此结果与SolidB特性相关。此功能称为形状特征的结果特征。通过在拓扑C和与实体a特征相关联的几何图形(拓扑a)之间执行逻辑运算来计算拓扑B。实体A是链中当前特征之前的前一个形状。
[Top]
如何启动CAAPriBuildUserPad
要启动CAAPriBuildUserPad,您需要设置构建时环境,然后编译CAAPriBuildUserPad及其先决条件,设置运行时环境,然后执行用例[6]。
启动用例,如下所示:
- 在Windows中
e:>CAAPriBuildUserPadMain outputDirectoryCAAUserPad1.CATPart
outputDirectoryCAAUserPad2.CATPart
- 在UNIX中
$ CAAPriBuildUserPadMain outputDirectory/CAAUserPad1.CATPart
outputDirectory/CAAUserPad2.CATPart
其中:
outputDirectory
CAAuserPad1. CATPart 和 CAAuserPad2. CATPart 将存储的目录
CAAUserPad1.CATPart
包含创建的键盘的文件
CAAUserPad2.CATPart
修改后的凸台文件
[Top]
在哪找到 CAAPriBuildUserPadMain 代码
CAAPriBuildUserPadMain用例由一个名为CAAPriBuildUserPad的主程序组成,位于http://CAAPartInterfaces.edu框架。CATIBuild和CATIBuildShape接口实现位于同一框架的CAAPriBuildUserPad.m模块中。
Windows
InstallRootDirectoryhttp://CAAPartInterfaces.eduCAAPriBuildUserPad.m
InstallRootDirectoryhttp://CAAPartInterfaces.eduCAAPriBuildUserPadMain.m
Unix
InstallRootDirectory/http://CAAPartInterfaces.edu/CAAPriBuildUserPad.m/
InstallRootDirectory/http://CAAPartInterfaces.edu/CAAPriBuildUserPadMain.m/
其中InstallRootDirectory 是安装 CAA CD-ROM 的目录。
CATIBuild 的实现步骤
CATIBuild是使用名为CAAPriEBuild的类实现的,该类是后期类型CAAPriUserPad的代码扩展。Build,此接口的唯一方法始终具有以下结构:
...
HRESULT CAAPriEBuild::Build ()
{
HRESULT rc = E_FAIL ;
声明有用的指针
CATTry
{
计算特征的形式
删除所有可能的更新错误
检索程序报告的数据
创建程序报告
运行拓扑运算符
存储程序报告
清理无用的数据
}
// 管理错误
CATCatch(CATMfErrUpdate , pUpdateError)
{
管理CATMfErupdate 错误
}
CATCatch(CATError , pError)
{
管理CATError错误
}
CATEndTry
return rc ;
}
...
此方法包含CATTry 和 and CATCatch 部分,因为某些方法可能会引发错误 [7]。
声明有用的指针
在CATTry 部分之前,声明所有指针:
- 在CATTry 和 and CATCatch 部分中使用: such例如piUpdateErrorOn 此用户凸台的 CATIUpdateError接口指针。
- 在CATTry 部分中初始化,在调用可能会引发错误的方法之前未释放
...
CATIUpdateError * piUpdateErrorOnThis = NULL;
CATIBuildShape * piBuildShape = NULL;
CATIMfProcReport * piProcReport = NULL;
CATGeoFactory * piGeomFactory = NULL;
CATDynBoolean * pOperatorBool = NULL;
CATSoftwareConfiguration * pSoftConfig = NULL ;
rc = QueryInterface( IID_CATIUpdateError , (void**) &piUpdateErrorOnThis);
if ( FAILED(rc) ) return rc ;
...
所有这些指针将在下一节中解释。
计算特征的形式
在计算特征的最终结果之前,它的形式是必要的。它是通过BuildShape方法计算的。
...
CATIBuildShape * piBuildShape = NULL;
rc = QueryInterface(IID_CATIBuildShape,(void**)&piBuildShape);
if ( SUCCEEDED(rc) )
{
int val = piBuildShape->BuildShape();
if ( 0 == val )
{
rc = E_FAIL ;
}
piBuildShape->Release();
piBuildShape = NULL ;
}
...
BuildShape 方法可能会引发错误或返回错误。
删除所有可能的更新错误
更安全的做法是删除所有可能与当前用户面板功能相关联的更新错误。为此,请使用CATIUpdateError接口的UnsetUpdateError。有关此接口的详细信息,请参阅标题为“更新错误说明”的文章[8]。
...
rc = QueryInterface( IID_CATIUpdateError , (void**) &piUpdateErrorOnThis);
if ( SUCCEEDED(rc) )
{
piUpdateErrorOnThis->UnsetUpdateError();
}
...
用户凸台的 CATIUpdateError 接口的实现是由后期类型MechanicalFeature的扩展提供的。由于 UserPad 后期类型派生自机械功能后期类型,请参阅图 1,您会自动受益于此实现。
[Top]
检索程序报告的数据
此步骤包括三个子步骤,其中包括 :
- 检索ResultIN特征
- 检索两个CATBodyCATBody(ResultIN 和 this)
- 检查数据
检索ResultIN 特征
...
CATIShapeFeatureBody * pIShapeFeatureBodyOnThis = NULL ;
if ( SUCCEEDED(rc) )
{
rc = QueryInterface( IID_CATIShapeFeatureBody,(void**) &pIShapeFeatureBodyOnThis);
}
CATISpecObject_var spResultIn ;
if ( SUCCEEDED(rc) )
{
CATListValCATISpecAttribute_var *pListSpecAttribute = NULL ;
pListSpecAttribute = pIShapeFeatureBodyOnThis->GetBodyINAttributes();
if ( NULL != pListSpecAttribute )
{
CATISpecAttribute_var spSpecAttribute = (*pListSpecAttribute)[1];
if ( NULL_var != spSpecAttribute )
{
spResultIn = spSpecAttribute->GetSpecObject();
}
...
}
}
...
形状特征实现CATIShapeFeatureBody(MechanicalModeler)接口。此接口使您能够检索与该特征关联的 ResultIN 属性。 此属性(spSpecAttribute) 始终是 GetBodyInAttribute 方法返回的列表的第一个元素。通常,要检索属性引用的特征,请使用CATISpecAttribute(ObjectSpecsModeler)接口的GetSpecObject方法。spResultIn将是程序报告后面的两个元素之一。第二个是这个。
检索两个CATBodyCATBody(ResultIN 和 this)
第一个是与结果特征相关联的。在图4中,它是名为TopoA的CATBody。 始终使用CATIShapeFeatureBody(MechanicalModeler)接口。GetBodyIN方法返回的列表的第一个元素是ResultIN特性spCATBodyOnResultIn的CATBody。
...
CATBody_var spCATBodyOnResultIn ;
if ( SUCCEEDED(rc) )
{
CATListValCATBaseUnknown_var *pListBodyIn = NULL ;
pListBodyIn = pIShapeFeatureBodyOnThis->GetBodyIN("CATBody");
if ( NULL != pListBodyIn )
{
spCATBodyOnResultIn = (*pListBodyIn)[1];
...
}
}
...
其次是与此相关的。它是由BuildShape方法计算的形状。在图4中,始终使用CATIShapeFeatureBody(MechanicalModeler)接口。 GetShape方法返回的列表的第一个元素是该方法的CATBody,即spCATBodyOnThis。
...
CATBody_var spCATBodyOnThis ;
if ( SUCCEEDED(rc) )
{
CATListValCATBaseUnknown_var *pListBody = NULL ;
pListBody = pIShapeFeatureBodyOnThis->GetShape("CATBody");
if ( NULL != pListBody )
{
spCATBodyOnThis = (*pListBody)[1];
...
}
}
...
检查数据
如果ResultIN特征不存在并且形状存在,则形状特征是链中的第一个,因此生成操作完成。将跳过"创建程序报告","运行拓扑运算符"和"存储程序报告"部分。
如果表单不存在,则为错误,Build方法的返回代码将为E_FAIL。
[Top]
创建程序报告
过程报告是通过使用拓扑报告生成以下单元格的名称来生成特征范围的方法。 过程报告由CATIMfProcReport 接口管理。
第一件事是在生成操作期间通过过程日志声明以下单元格。 对于特征,要遵循的规范始终是这样的,如果ResultIN的零件几何体存在,ResultIN也存在。
...
CATLISTV(CATBaseUnknown_var) ListSpec;
CATListOfCATUnicodeString ListKeys;
ListSpec.Append( this );
ListKeys.Append( MfKeyNone );
if (NULL_var != spCATBodyOnResultIn)
{
ListSpec.Append( spResultIn);
ListKeys.Append( MfKeyNone );
}
...
ListSpec 是要遵循的规范列表,ListKeys 是关联密钥的列表。这两个列表的大小相同。 键的默认值是MfKeyNone。 不同的键值将指示节点的历史关系应替换为用户信息。密钥的值必须与拓扑报告提供的信息有关。
...
if ( SUCCEEDED(rc) )
{
rc = QueryInterface( IID_CATIMfProcReport , (void**) &piProcReport );
if ( SUCCEEDED(rc) )
{
int BoolOper = 1;
piProcReport->CreateProcReport(ListSpec,ListKeys,BoolOper);
}
}
...
一旦检索到用户凸台上的CATIMfProcReport接口指针piProcReport,就可以使用CreateProcReport方法创建程序报告。此方法的最后一个参数是1,因为结果 ( 范围 ) 将受到影响于实体特征,而不是用户凸台本身。在图4上,此实体特征名为 SolidB SolidB。请注意,piProcReport 在生成方法的顶部声明,因为它可以在 CATCatch 部分中发布。
运行拓扑运算符
此步骤包括三个子步骤,这些子步骤始终是:
- 检索几何工厂界面上的指针以创建拓扑运算符和拓扑,
- 检索程序报告使用的拓扑日志,
- 创建与特征关联的几何图形。
检索几何工厂接口
几何工厂由CATGeoFactory接口处理。此接口由零件文档的几何容器实现 [9]。由于在零件文档上实现的CATIContainerOfDocument 接口,您可以检索此容器。CATILinkableObject 接口是每个特征检索其包含文档的方法。
...
if ( SUCCEEDED(rc) )
{
CATILinkableObject *piLinkableObjectOnUserPad= NULL;
rc = QueryInterface( IID_CATILinkableObject,
(void**)& piLinkableObjectOnUserPad);
if ( SUCCEEDED(rc) )
{
CATDocument * pDocument = NULL ;
pDocument = piLinkableObjectOnUserPad->GetDocument();
if ( NULL != pDocument )
{
CATIContainerOfDocument * pIContainerOfDocument = NULL ;
rc = pDocument->QueryInterface(IID_CATIContainerOfDocument,
(void**)& pIContainerOfDocument );
if ( SUCCEEDED(rc) )
{
CATIContainer * pIContainerOnGeomContainer = NULL ;
rc = pIContainerOfDocument->GetResultContainer
(pIContainerOnGeomContainer);
if ( SUCCEEDED(rc) )
{
rc = pIContainerOnGeomContainer->QueryInterface( IID_CATGeoFactory ,
(void**) &piGeomFactory );
...
}
...
GetResultContainer是CATIContainerOfDocument检索几何容器的方法。 piGeomFactory 是几何工厂界面上的指针。 此指针在Build方法的开头声明,因为它可以在 CATCatch 部分中释放。
检索拓扑日志
然后,过程报告在将记录所有拓扑操作的新拓扑日志上提供指针。
...
CATTopData TopData ;
if ( SUCCEEDED(rc) )
{
CATCGMJournalList *pCGMJournalList = piProcReport->GetCGMJournalList();
TopData.SetJournal(pCGMJournalList) ;
pSoftConfig = new CATSoftwareConfiguration();
TopData.SetSoftwareConfiguration(pSoftConfig) ;
}
...
pCGMJournalList 是拓扑日志上的指针。 不得释放此指针。 pSoftConfig是一个在Build方法的开头声明的指针,因为它可以在 CATCatch 部分中释放。
创建生成的几何体
本节包括评价,pResultBody,CATBody, a CATBody实例。此指针在本地声明,并且不在方法的顶部声明。它没有必要,因为它的生命周期由CATCatch 部分中的 DeletedProcReport 方法管理。
...
CATBody *pResultBody = NULL ;
....
...
有两种情况考虑:
1. 用户凸台不是集的第一个实体特征
spCATBodyOnResultIn是与ResultIN凸台关联的CATBody,如果此智能指针不为空,则用户凸台具有ResultIN,因此它不是body特征的第一个实体特征。
...
if (NULL_var != spCATBodyOnResultIn)
{
CATDynBooleanType internalOperType = CATBoolUnion;
pOperatorBool = ::CATCreateDynBoolean(piGeomFactory,
&TopData,
internalOperType,
spCATBodyOnResultIn,
spCATBodyOnThis);
if ( NULL != pOperatorBool )
{
pOperatorBool->Run();
pResultBody = pOperatorBool->GetResult();
}
}
...
在用户垫特征形状(spCATBodyOnThis)和上一个特征的拓扑结果(spCATBodyOnResultIn) 之间执行布尔操作。作为CATDynCreateBoolean全局函数的第二个参数的拓扑日志也进行了更新。 pOperatorBool是一个在生成方法顶部声明的 CATDynBoolean 接口Build指针。 pResultbody是生成的拓扑, 图4上名为 TopoB的 CATBody
2. 用户板是集中的第一个实体功能
与结果关联的几何体是由CATIBuildShape 接口创建的几何休。但由于拓扑结果只能与独特的几何特征关联,因此将创建一个新的 CATBody。 但是,如果CATBody 对于几何特征是唯一的,则两个CATBody 之间可以共享单元。因此,生成的 CATBody 将使用 CATIBuildShape 接口创建的正文的单元格(域)创建。
...
pResultBody = piGeomFactory->CreateBody();
if ( NULL != pResultBody )
{
CATDomain *Domain = NULL;
int NbDomain = spCATBodyOnThis->GetNbDomains();
for (int i = 1; i <= NbDomain; i++)
{
Domain = spCATBodyOnThis->GetDomain(i);
pResultBody->AddDomain(Domain);
}
}
...
spCATBodyOnThis 是CATIBuildShape 接口创建的 CATBody 上的智能指针。此指针的估价在检索两个CATBody(ResultIN 和this)中完成。
[Top]
存储程序报告
现在是存储(填充)与创建用户凸台的几何结果对应的程序报告的时间了。这是CATIMfProcReport::StoreProcReport方法的工作.
...
if ( SUCCEEDED(rc) )
{
if ( NULL != pResultBody )
{
int BoolOper = 1 ;
piProcReport->StoreProcReport(pResultBody,Copy, BoolOper);
}
else
{
CATMfErrUpdate *pErrorNoIntersection = new CATMfErrUpdate();
CATUnicodeString Diagnostic("Error during boolean operation.");
pErrorNoIntersection->SetDiagnostic(1,Diagnostic);
CATThrow(pErrorNoIntersection);
}
}
}
...
StoreProcReport 方法的最后一个参数BoolOper 与 CreateProcReport 方法中的值相同。
[Top]
清理无用的数据
在 CATTry 部分的最后一部分中,您可以清理第一节中声明的名为"声明有用的指针"的数据,并且在 CATTry 部分期间未释放/删除。例如,piBuildShape 指针不会在这里释放,一旦 BuildShape 方法不引发错误,则指针将在 BuildShape 调用之后释放。请参阅"计算功能的形式"部分。
通常,必须考虑:
- 由于CATGeoFactory接口的remove方法,要从拓扑容器中删除的所有对象。(在这个用例中没有任何事情要做)
- 所有尚未删除的对象deleted: pOperatorBool, 拓扑运算符
- 尚未发布的所有指针: released (您应该始终具有这四个指针)
- piUpdateErrorOnThis
- piProcReport
- pSoftConfig
- piGeomFactory
管理错误
在之前的操作中可能会抛出一些错误,CATTry bloc会捕获它们。CATCatch块处理错误。有两种错误:
- CATMfErrUpdate
- CATError
每个CATCatch部分处理错误并清除在 Build 方法顶部声明的指针。
管理CATMfErupdate 错误
最高级别的错误类型为CATMfErUpdate。错误在不修改的情况下重新引发。
...
CATCatch ( CATMfErrUpdate , pUpdateError)
{
if(NULL != piUpdateErrorOnThis)
{
piUpdateErrorOnThis->SetUpdateError(pUpdateError);
piUpdateErrorOnThis->Release();
piUpdateErrorOnThis = NULL ;
}
// 在这里,将清理在Build 方法顶部声明的指针
CATRethrow ;
}
...
管理CATError错误
所有其他类型的错误都源于CATError。以下代码将诊断和错误关联在一起。
...
CATCatch ( CATError , pError)
{
CATMfErrUpdate *pErrorToThrow = new CATMfErrUpdate();
pErrorToThrow->SetDiagnostic(1,pError->GetNLSMessage());
::Flush(pError);
if(NULL != piUpdateErrorOnThis)
{
piUpdateErrorOnThis->SetUpdateError(pErrorToThrow);
piUpdateErrorOnThis->Release();
piUpdateErrorOnThis = NULL ;
}
// 在这里,将清理在Build 方法顶部声明的指针
CATThrow(pErrorToThrow);
}
...
将创建一个新的CATMfErrUpdate。pError,CATError,必须在错误过程中释放。Flush全局函数可以做到这一点。
清洁指针
在两个CATCatch部分中,重要的是:
- 删除结果:与特征及其范围关联的新CATBody。这要感谢DeleteProcReport方法。
以及第一节“声明有用指针”中声明的数据:
- 由于CATGeoFactory接口的删除方法,从拓扑容器中删除。(在这个用例中没有任何事情要做)
- 删除拓扑运算符: pOperatorBool
- 释放 CATTry 部分中未释放的所有指针:(至少应始终具有表单功能的这五个指针)
· piUpdateErrorOnThis
· piProcReport
· pSoftConfig
· piGeomFactory
· piBuildShape
[Top]
CATIBuildShape 的实现步骤
CATIBuildShape使用名为CAAPriEBuildShape类的类实现,该类是后期类型caaprieuserpad的数据扩展。BuildShape,此接口的唯一方法始终具有以下结构:
...
int CAAPriEBuildShape::BuildShape ()
{
int rcode = 1 ; //OK
HRESULT rc = E_FAILD;
CATTry
{
删除所有可能的更新错误
检索程序报告的数据
创建程序报告
运行拓扑运算符
存储程序报告
清理无用的数据
}
// 管理错误
CATCatch(CATMfErrUpdate , pUpdateError)
{
管理CATMfErupdate 错误
}
CATCatch(CATError , pError)
{
管理CATError错误
}
CATEndTry
if ( FAILED(rc) )
{
rcode = 0 ;
}
return rcode ;
}
...
此方法包含CATTry 和 and CATCatch 部分,因为某些方法可能会引发错误 [7]。
声明有用的指针
在CATTry 部分之前,声明所有指针:
- 用于CATTry和catatch部分:例如piupdateerror位于用户面板上的CATIUpdateError接口指针上。
- 在CATTry部分初始化,在调用可能引发错误的方法之前未释放
...
CATIUpdateError * piUpdateErrorOnThis = NULL;
CATTopPrism * pOperatorPrism = NULL;
CATIPrtProfile * pPrtProfile = NULL;
CATIMfProcReport * piProcReport = NULL;
CATGeoFactory * piGeomFactory = NULL;
CATSoftwareConfiguration * pSoftConfig = NULL ;
CATBody_var spBodyOnProfile ;
...
所有这些指针将在下一节中解释。
[Top]
删除所有可能的更新错误
更安全的做法是删除所有可能与当前用户面凸台特征相关联的更新错误。为此,请使用CATIUpdateError接口的UnsetUpdateError。
...
rc = QueryInterface( IID_CATIUpdateError , (void**) &piUpdateErrorOnThis);
if ( SUCCEEDED(rc) )
{
piUpdateErrorOnThis->UnsetUpdateError();
}
...
[Top]
检索程序报告的数据
此步骤包括三个子步骤,其中包括:
- 检索轮廓
- 检索和检查与输轮廓关联的 CATBody
检索轮廓
轮廓是 UserPad 功能的属性,在"Profile"字符串中引用。
...
CATMathDirection ExtrusionDirection ;
CATISpecObject_var spSpecObjectOnProfileElt;
if ( SUCCEEDED(rc) )
{
CATISpecObject * pSpecObjectOnThis = NULL;
rc = QueryInterface( IID_CATISpecObject , (void**) &pSpecObjectOnThis );
if ( SUCCEEDED(rc) )
{
CATUnicodeString strProfile = "Profile";
CATISpecAttribute * pProfileAtt = NULL ;
pProfileAtt = pSpecObjectOnThis->GetAttribute(strProfile);
pSpecObjectOnThis->Release();
pSpecObjectOnThis = NULL ;
if ( NULL != pProfileAtt )
{
CATISpecObject * pSpecObjectOnProfileAtt = NULL;
pSpecObjectOnProfileAtt = pProfileAtt->GetSpecObject();
...
pProfileAtt是用户凸台的“profile”属性。pSpecObjectOnProfileAtt是与此属性关联的特征。 应用于pSpecObjectOnProfileAtt的CATIPrtProfile接口使您能够检索挤出方向、挤出方向和轮廓本身spSpecObjectOnProfileEl。
...
if ( NULL != pSpecObjectOnProfileAtt )
{
rc = pSpecObjectOnProfileAtt->QueryInterface( IID_CATIPrtProfile ,
(void**) &pPrtProfile );
pSpecObjectOnProfileAtt->Release();
pSpecObjectOnProfileAtt = NULL ;
if ( SUCCEEDED(rc) )
{
CATMathPlane SketchPlane ;
rc = pPrtProfile->GetPlane(SketchPlane) ;
if ( SUCCEEDED(rc) )
{
CATMathVector normalDir;
SketchPlane.GetNormal(normalDir);
ExtrusionDirection = normalDir ;
if ( SUCCEEDED(rc) )
{
pPrtProfile->GetElement(1,spSpecObjectOnProfileElt) ;
...
凸台方向ExtrusionDirection,已定义为垂直于草图平面。 由CATIPrtProfileinterface的GetElement方法检索的轮廓spSpecObjectOnProfileElt将是程序报告后面的特征。
要完成此操作,如果spSpecObjectOnProfileElt、pSpecObjectOnProfileAtt或pProfileAtt为NULL或NULL_var,则会引发如下更新错误[8]:
...
CATMfErrUpdate *pError = new CATMfErrUpdate();
CATUnicodeString Diagnostic("xxxxx");
pError ->SetDiagnostic(1,Diagnostic);
CATThrow(pError );
...
在这种情况下,CATTry 部分中断。
检索和检查与轮廓关联的 CATBody
pPrtProfile是用户面板的Profile属性引用的功能上的CATIPrtProfile接口指针。该部分包括计算构成要挤出的轮廓的CATBody、spBodyOnProfile。但之前需要进行一些检查来验证轮廓。
...
if ( SUCCEEDED(rc) )
{
int nbContour = pPrtProfile->GetContourCount();
if (nbContour == 1)
{
CATBody_var LocalBody ;
pPrtProfile->GetBody(0,LocalBody);
CATDomain * pDomain = LocalBody->GetDomain(1);
CATWire_var spWireOnDomain(pDomain);
if (spWireOnDomain != NULL_var)
{
CATBoolean isClosed = spWireOnDomain->IsClosed();
if(TRUE != isClosed)
{
CATMfErrUpdate *pErrorNotClosedProfile = new CATMfErrUpdate();
CATUnicodeString Diagnostic("The associated profile is not closed");
pErrorNotClosedProfile->SetDiagnostic(1,Diagnostic);
CATThrow(pErrorNotClosedProfile);
}
...
如果轮廓存在错误,将生成并抛出一个错误pErrorNotClosedProfile来中断进程。
一旦验证了配置文件,就可以通过CATIPrtProfile接口的GetBody方法计算spBodyOnProfile。此CATBody应在方法结束时从拓扑容器中移除。
...
pPrtProfile->GetBody(1,spBodyOnProfile);
if ( NULL_var == spBodyOnProfile )
{
CATMfErrUpdate *pErrorNoProfileToExtrude = new CATMfErrUpdate();
CATUnicodeString Diagnostic("No elt to extrude");
pErrorNoProfileToExtrude->SetDiagnostic(1,Diagnostic);
CATThrow(pErrorNoProfileToExtrude);
...
[Top]
创建程序报告
程序报告是通过使用拓扑报告生成以下单元格的名称来生成特征范围的方法。 程序报告由CATIMfProcReport 接口管理。第一件事是在生成操作期间通过程序日志声明以下单元格。
...
CATLISTV(CATBaseUnknown_var) ListSpec;
CATListOfCATUnicodeString ListKeys;
if ( SUCCEEDED(rc) )
{
ListSpec.Append( spSpecObjectOnProfileElt );
ListKeys.Append( MfKeyExtrudedFrom );
}
...
ListSpec是要遵循的规范列表,list keys是关联键的列表。只有一个规范,profile,spSpecObjectOnProfileElt和关联的关键字被赋值为mfkeyexturedfrom。
...
if ( SUCCEEDED(rc) )
{
rc = QueryInterface( IID_CATIMfProcReport , (void**) &piProcReport );
if ( SUCCEEDED(rc) )
{
int BoolOper = 0;
piProcReport->CreateProcReport(ListSpec,ListKeys,BoolOper);
}
}
...
一旦检索到用户面板上的CATIMfProcReport接口指针piProcReport,就可以使用CreateProcReport方法创建过程报告。这个方法的最后一个参数是0,这是默认值,因为结果(作用域)将受到特征本身的影响[图1]。请注意,piProcReport声明在Build方法的顶部,因为它可以在CATCatch部分中发布。
[Top]
运行拓扑运算符
此步骤包括三个子步骤,这些子步骤始终是:
- 检索几何工厂界面上的指针以创建拓扑运算符和拓扑,
- 检索程序报告使用的拓扑日志,
- 创建要与特征关联的几何体。
检索几何工厂
请参阅生成实现中的"检索几何工厂接口"部分。
检索拓扑日志
请参阅生成实现中的"检索拓扑日志"部分。
创建棱柱运算符
使用以下参数创建棱柱运算符:
- piGeomFactory几何工厂-请参阅检索几何工厂部分
- TopData拓扑日志:参见检索拓扑日志
- spBodyOnProfile 要拉伸的截面轮廓-请参见检索和检查与截面轮廓相关联的CATBody
- ExtrusionDirection 凸台方向-请参阅“检索截面轮廓”部分
- startOffset 第一个限制的偏移值。赋值为0时,凸台从草图平面开始
- endOffset 上次限制的偏移值。
...
CATBody *pResultBody = NULL ;
if ( SUCCEEDED(rc) )
{
CATLength endOffset = 30.;
CATLength startOffset = 0.;
pOperatorPrism = CATCreateTopPrism(piGeomFactory,
&TopData,
spBodyOnProfile,
&ExtrusionDirection,
startOffset,
endOffset);
...
pad操作创建一个正的形状(在pocket case中为负),CatBoolUnion参数用于描述该操作。应用的两个SetLimit方法允许定义第一个和最后一个限制。
if ( NULL != pOperatorPrism )
{
pOperatorPrism->SetOperation(CatBoolUnion);
CATTopLimitType startLimitType = CatLimOffsetFromProfile;
CATTopPropagationType startPropagType = CatPropagSingle;
// 定义运算符的第一个限制
pOperatorPrism->SetLimit(CatLimStart,
startLimitType,
1,
startOffset,
NULL,
CATBody_var(NULL_var),
startPropagType,
FALSE);
// 定义运算符的第二个限制
CATTopLimitType endLimitType = CatLimOffsetFromProfile;
CATTopPropagationType endPropagType = CatPropagSingle;
pOperatorPrism->SetLimit(CatLimEnd,
endLimitType,
0,
endOffset,
NULL,
CATBody_var(NULL_var),
endPropagType,
FALSE);
// 执行操作
pOperatorPrism->Run();
//检索执行的正文
pResultBody = pOperatorPrism->GetResult();
...
pResultbody 是图[图1]上与用户板形式关联的名为TopoC的CATBody。 请注意,pResultBody 未在方法的顶部声明。一旦其生命周期由 CATCatch 部分中的"已删除程序报告"方法管理,则不需要
[Top]
存储程序报告
现在是存储(填充)与创建用户凸台几何结果相对应的过程报告的时候了。这是CATIMfProcReport::StoreProcReport方法的工作.
...
if ( SUCCEEDED(rc) )
{
if ( NULL != pResultBody )
{
int BoolOper = 0 ;
piProcReport->StoreProcReport(pResultBody,NoCopy,BoolOper);
}
else
{
CATMfErrUpdate *pErrorBuildShape = new CATMfErrUpdate();
CATUnicodeString Diagnostic("Error during BuildShape operation");
pErrorBuildShape->SetDiagnostic(1,Diagnostic);
CATThrow(pErrorBuildShape);
}
}
...
StoreProcReport方法的最后一个参数BoolOper与CreateProcReport方法中的值相同。
[Top]
清除无用数据
在CATTry部分的最后一部分中,您将清除第一部分中声明的数据,该部分名为“声明有用的指针”,并且在CATTry部分期间不会释放/删除这些数据。例如,pPrtProfile指针在CATTry部分安全释放后,就不会在这里释放(本文中没有描述,请参阅代码)
- 从拓扑容器中删除的所有对象:这里只有 spBodyOnProfile,
- 所有尚未删除的对象:这里只有pOperatorPrism的拓扑运算符,
- 尚未发布的所有指针:
- piUpdateErrorOnThis
- piProcReport
- pSoftConfig
- piGeomFactory
管理错误
本节与生成方法的"管理错误"部分Build相同。根据方法期间使用的数据,只有"清理无用的数据"部分会有所不同。在生成Shape方法的两个CATch部分中,重要的是:
- Remove结果:与特征及其范围关联的新CATBody。这要感谢DeleteProcReport方法。请参阅生成方法的“管理CATMfErrUpdate错误”部分。
以及第一节中声明的数据,标题为"声明有用的指针":
- 从拓扑容器中删除CATBody: spBodyOnProfile
- 删除拓扑运算符: pOperatorPrism
- 释放CATTry 部分中未释放的所有指针:
- piUpdateErrorOnThis
- piProcReport
- pSoftConfig
- piGeomFactory
- pPrtProfile
[Top]
总之
这个用例演示了管理形状特征构建的方法。
[Top]
[1]
机械建模概述
[2]
在更新机制中集成新的几何特征
[3]
创建从机械启动派生的新启动
[4]
通用命名概述
[5]
应用于机械功能的规格/结果机制
[6]
构建和启动 CAA V5 用例
[7]
使用异常管理错误
[8]
更新错误的描述
[9]
零件文档的结构
[Top]
历史
版本: 1 [2000 年 4 月]
创建的文档
版本: 2 [2003 年 1 月]
文档已更新
[Top]
版权所有 ©2000年,达索系统。保留所有权利。