前言

本文是一篇译作,翻译了达索官方白皮书”Getting Started with CAA V6 CATIA Geometric Modeler”前三章的内容。正好是一年之前翻译的,也是有点唏嘘呢,分享出来。

CATIA Geometric Modeler是一个强大而完整的、为了开发构建具有3D几何模型能力应用的软件开发包,这篇白皮书提供了对于CATIA V6几何建模概念和几何数据分析的总览,能够帮助CAA开发者快速熟悉几何开发的场景、检查代码中CGM的部分是否能够正常运作。文章基于V6R2013x,发布于2015年2月。

可能对于普通建模人员和刚进入CAA开发的人员来说,理解起来依然有些困难,翻译的时候很多地方我自己都比较懵逼,但是阅读其中对于几何拓补的解释我认为还是大有裨益,值得一看。第三章以后的内容主要涉及各种几何对象的创建,当时并没有继续翻译翻译下去,本人当时也很少够碰到需要直接创建几何拓补内容的应用场景。如果需要原文pdf,可以联系我或者留言。


Part1: CGM Architecture & data model

白皮书的第一部分向读者介绍了几何建模者的概念和数据模型。

我们首先介绍CGM的主要数学能力和不同的几何对象。我们主要是为了对CGM拓补概念和数据模型有一个概览,陈述了CGM实体如何定义拓扑模型以及介绍如何分解拓扑模型。最后我们将介绍使用一个和原理最为相关的CGM拓扑操作概念来结束这一部分。读者将会对拓补操作的主要类型有一个概览,并且看到从初始拓补到最终结果的过程。

1. CATIA Geometric Modeler overview

1.1. Introduction to CATIA Geometric Modeler

GM是一个完整的软件包,专门用于开发3D应用程序的三维建模部分。它作为几何基础应用于许多终端CATIA应用例如Part Design和Shape Design。

CGM实际上提供了一组面向对象的编程资源,可以想象和构建高层次的几何图元。CGM可以创建集成于应用的其他部分的复杂拓扑对象(viewer、对话框和数据管理)。

1.2. Architecture of the CATIA Geometric Modeler

在CAA应用程序的全局体系结构中,CATIA Geometric modeler与feature modeler一起构成了应用的主要数据模型基础。

CGM是一个完整的三维建模软件包,超过3300个API分布在6 个CAA框架:

  • Mathematics:定义了基本的数学对象:点、向量、直线、平面、轴、矩阵和变换。
  • AdvancedMathematics: 为需要执行密集数学计算的应用程序提供数学服务。数学和高级数学的对象不是一直存在的;他们被其他CGM框架用作中间体。
  • CATMathStream: 定义了阅读和stream GM对象的服务。
  • GeometricObjects: 允许您创建基本几何图元以及对象管理的几何机制…
  • GMModelInterfaces: 定义了边界对象以及几何对象和拓扑对象的几何离散化工具。
  • GMOperatorsInterfaces: 提供对拓扑对象的操作:布尔、扫略、倒角、拔模、粗细操作。

几何建模器分为以下几个层面:

  • -数学层面(Frameworks: Mathematics, CATMathStream, AdvancedMathematics),提供所有基本的数学类(点、向量、矩阵……)及其相关行为(向量的范数、矩阵的逆向等)。
  • -几何层面(Main framework: GeometricObjects),提供几何建模的所有组件,建立自己的几何应用用到的固有对象(点、曲线、曲面、NURBS…)或用于数学计算或对曲线曲面的参数管理的中间对象。
  • -阅读和分析模型的服务,拓扑允许通过细分它们的边界和它们不同部分之间的连接来表示几何对象。拓扑对象与几何对象相关联。这些框架还提供了几何算子(如质量属性、最小距离、投影、相交等)和工具来操纵Nurbs(such as degree or know vector modification, tessellation operators)。细分是几何和拓扑结构的离散化。细分的目的是为了得到某些应用需要的离散数据,如数控应用、有限元网格划分等。细分的API能够计算几何曲线、曲面的,或拓扑体、边, 或面 (体tessellator,单元tessellator,曲线和曲面tessellator,迭代器扫描镶嵌对象(扇形,三角形,条纹))的几何离散结果。
  • -三维建模服务(Framework: GMOperatorsInterfaces)。这个框架提供了一系列拓补运算符(例如波尔运算, 装配,拔模,扫略,表面提取等)以及用于检查拓扑和几何的有效性(Journal checker, Body checker, Data Checker)的专用分析工具。

1.3. The Geometric Modeler Levels of Use

CGM提供了三个使用层级。

高层次的使用专门用于CAA拓扑运算符。使用这些操作符,我们可以得到有效的数据,也就是说,我们将能够对这些数据应用新的操作符。

中层次的使用用于使得开发者能够通过结合其他的运算符来创造他们自有的运算符。这种情况下我们不保证结果的有效性(尤其是journal)。CGM为这种层次的使用提供了一套能够检查结果有效性的工具。

低层次的使用用于高级用户创建基于自有参数方程的曲面。基于外来数据的CAA应用是GM低层次使用的一个例子。

2.CGM Mathematical and Geometrical model

本章提供了CGM的数学和几何数据模型概述。回答了以下几个问题:

  • CGM的主要数学功能是什么?
  • 什么是不同的CGM几何对象?
  • 他们是如何创建的?

2.1. The CGM Mathematic classes

数学层次定义了所有基本的数学对象,如点、向量、直线、平面、轴、矩阵和变换。在这一层管理的对象不是持久的,仅在内存中使用。

Mathematics, CATMathStream 和 AdvancedMathematics构成这一层的主要CAA框架,它们包含了所有的数学类。

这些框架被其他CGM框架的使用,为许多其他应用程序提供基本的数学服务。

在这些类中,简单的语法使得代码易于编写和理解。

2.2. The CGM Geometrical model

在CGM中,几何对象可以是:

点、单维对象(例如线、样条线、曲线、圆锥曲线,NURBS曲线等),两维对象(例如正则曲面,NURBS曲面,旋转曲等)

几何对象通过CATGeoFactory类创建。

几何对象只是一个空间区域的数学定义,它可以是一个点、一条曲线或一个曲面。当一个几何对象由CATGeoFactory创建时,它会获得一个唯一的标志,称为persistent tag。

这仅仅是一个数学定义,因此在CATIA的3D浏览器中没有该几何对象的显示。

几何对象具有持久性,但在每一次更新中,他们是破坏和重建。

2.2.1. The Points model.

一个点可以在欧氏空间(2D或3D)中或在参数空间(可以是一个曲线(1D)或平面(2D))中定义。

2.2.2. The curve model.

曲线是从R到R ^3闭区间参数函数。

CGM曲线实现了CATCurve接口,通过CGM对象工厂创建(CATGeoFactory) 。

一般有三种类型的曲线:

  • Resolved curve是具有数学定义的曲线(CATLine, CATConic),以及能够通过控制点创建的现实曲线(CATSplineCurve, CATNurbsCurve)。
  • EdgeCurve是几个曲线的聚集。给定两个具有公共边的面,边缘曲线是从定义公共边的两条曲线中建立的对象。
  • PCurves是专用于创建曲面参数空间上的曲线。
2.2.3. The surface model

曲面是从R 2到R 3的闭区间函数。CGM的曲面是C2连续的,而且实现了CATSurface接口。曲面可以通过三个CATMathFunctionXY代表((FX(x,y),FY(x,y),FZ(X,Y))),其可以通过CATSurface::GetGlobalEquation()方法得到。

CGM提供了以下几种曲面:

  • 分解曲面可以是数学形式的(平面,锥面,球面,Nurbs),他们的值可以直接从数学公式中得到。
  • 样条曲面是由诸如圆角曲面等通过计算所得的结果。
  • Multi-represented Surfaces是为了计算过程((CATFilletSurface, CATChamfer, CATSweepSurface …)等指向其他曲面的曲面。
  • Procedural Surfaces是使用其他曲面(参考)的计算结果来计算它自身。

下面的例子展示了如何在CAA中创建锥面(一种由CATElementarySurface类继承而来的几何对象):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//------------------------------------------------------------------------- 
// 1 - Initialize the factory
//-------------------------------------------------------------------------
CATGeoFactory* piGeomFactory = ::CATCreateCGMContainer() ;
if (NULL == piGeomFactory) return (1);
//-------------------------------------------------------------------------
// 2 - Input parameters
//-------------------------------------------------------------------------
//
CATMathAxis axis; CATMathDirection D1(1.,0.,0.);
CATMathDirection D2(0.,1.,0.);
CATMathDirection D3(0.,0.,1.);
CATMathPoint mathpoint(5.,15.,50.);
CATCartesianPoint * pCartP = piGeomFactory -> CreateCartesianPoint (5.,15.,50.);
axis.Set(mathpoint,D1,D2,D3); double slantLengthEnd(80.0);
double slantLengthStart(18.0);
double coneAngle = 0.4*CATPI;
double startAngle = -0.2*CAT2PI;
double endAngle = +0.1*CAT2PI;
double radius(25.);
// ----------------------------------------------
// 3 - Cone creation
// ----------------------------------------------
//
cout << "Cone creation" << endl;
CATCone *pCone = piGeomFactory -> CreateCone( axis, radius, coneAngle, startAngle,
endAngle, slantLengthStart, slantLengthEnd);
if (!pCone) return (1);

2.3. Bibliography(变形)

对于CGM几何模型更多的细节,请参考以下CAA百科中的文章:

  • Geometric Modeler Objects, Model Size and Tolerances
  • The Objects of CATIA Geometric Modeler
  • The Curves of CATIA Geometric Modeler
  • The Surfaces of CATIA Geometric Modeler.

也可以参考CAAGMModelInterfaces.edu框架,它提供了一系列用于理解如何创建几何对象的CAA使用示例。

3. CGM Topological data model

在这个章节中,我们提供了对于CGM拓补概念和数据模型的概览。我们回答了以下问题:

  • 什么是定义拓补模型的CGM实体?
  • 如何在CAA中创建拓补对象?
  • 如何分解一个拓补模型
  • 什么是拓补和几何之间的链接?
  • 拓扑与它的相关的几何的方位关系?

ps:这章是最值得看的。

3.1. Presentation of the basic topological objects

每一个几何对象都关联一个专用于它表示的拓扑对象…

CGM结构的拓补层面包含了所有允许通过区分他们不同部分的边界和链接来代表对象的类。
拓扑一种逻辑信息,是描述几何对象边界和管理三种实体:

  • Cells
  • Domains
  • Body

3.2. The topological concepts and model

3.2.1. The topological Cell

Cell是基础几何的连接限制。根据区域的维度有四种类型的Cell:

  • Vertex for dimension 0
  • Edge for dimension 1
  • Face for dimension 2
  • Volume for dimension 3
3.2.2. The topological domain

Domain是链接基础几何的一系列同维度的Cell。

Domain在同时操纵更高层维度的一个Cell的边界时十分有用。

例如,一个Face是由4个相连的edges包围的;所有这些edges很自然的组合成一个Domain:Loop。

CATDomain接口实现了拓补Domain的概念。

一个Domain可以是:

  • Lump ,当我们有一系列通过Faces链接的Volumes。
  • Shell,当我们有一系列由一系列包围成面的edges相互链接的Faces。
  • Skin,当我们有一系列由一系列edges相互链接的Faces。
  • Loop,当一系列由Vertex链接的edges包围成一个Face。
  • Wire,当我们有由一系列Vertex相互链接的edges并且它们不包围成一个Face。
  • Vertex In Face,当它是一个面的边界的Vertex。
  • Vertex In Volume,当我们有一个作为Volume边界的Vertex。
3.2.3. The topological body

Body是拓补对象的最高级别。Body是一系列不一定相连的Domains,这些Domains包含了相互链接的Cells,而这些Cells由较低维度的Domains所限定。

CATBody接口实现了拓补Body的概念。

Body有以下属性:

  • 任何限定Body中其他Cell的Cell属于这个Body。
  • 包含两个Cell的Body的基本几何的相交也是Cell的基本几何(属于这个Body)。

3.3. Architecture of the topological model

CATGeoFactory允许开发者创建几何对象。拓补主要通过使用拓补操作类创建。

几何容器有集成CATGeoFactory接口使得能够创建几何和拓补。

几何对象和拓补对象也是持久的,在3D视图中显示。

3.4. Decomposition of a topological body

任何拓扑Body可以通过一组拓扑Domains和Cells分解。考虑例如以下Body:

这个Body是由lump(由volume构成)构成的。

Volume是由2个shells构成:一个内部shell和外部shell。

每个shell由6个faces构成。

每个拓补face由一个loop Domain包围。

每个loop由4个Edge Cells组成。

每个Edge由连个Vertexs限定。

Body完整的最终分解可以由下图总结:

通用的拓补对象分解图如下:

Domain指向Cell的箭头代表了“由其组成”的关系。Cell指向Domain的箭头代表了“由其包围”的关系。

3.5. How to introspect in CAA a topological body

现在让我们看看下面的示例代码是如何在CAA中将一个拓补Body进行dump。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
int TSTDumpTopo::Dump(CATBody_var & ihBody)
{
int ReturnCode = 1;
cout << "-------------------------------------------------------" << endl;
TopoTrace( "Body", ihBody );
if (ihBody != NULL_var)
{
// Dump all the cells aggregated by the body
// -----------------------------------------
CATLISTP(CATCell) listCells;
ihBody -> GetAllCells (listCells);
int nbCells = listCells.Size();
cout << "Number of Cells : " << (CATLONG32)nbCells << endl;
for (CATULONG32 iCell=1; iCell<=nbCells && ReturnCode; iCell++)
{
// Dump Each cell
CATCell_var hCell = listCells[iCell];
ReturnCode *= Dump(hCell);
}
cout << "--------------------------------" << endl;
// Dump all the domains under the body.
CATULONG32 NbDomains = ihBody -> GetNbDomains();
cout << "Number of Domains : " << (CATLONG32)NbDomains << endl;
for (CATULONG32 iDomain=1; (iDomain<=NbDomains)&&(ReturnCode);
iDomain++)
{
CATDomain_var hDomain = ihBody->GetDomain(iDomain);
// Dump the domain
ReturnCode *= Dump(hDomain);
}
}
cout << "--------------------------------------------------------" << endl;
return ReturnCode;
}

这个dump Body的方法调用了两个dump方法,一个针对domain,另一个针对cell。详情参考包含了能够dump选定对象拓补元素命令的workspace。(见附件)(没有附件。。)

结果如下图所示:

假设我们处理一个代表Curve的拓补。

这个Curve的CATBody包含了一个CATWire的Domain。

CATWire由一个CATEdge cell组成,这个CATEdge由两个Vertex限制。

我们有以下拓补关联到这些几何对象。

  • CATMacroPoint for the CATVertex objects
  • CATEdgeCurve aggregating a CATSpline for the CATEdge

关联关系可以总结为如下图所示:

从实践的角度来看,我们从创建几何对象开始,然后我们创建拓扑对象,并将它们与所创建的几何体相关联。举例来说,如果我们想要创建一个拓补点,我们首先创建几何,它可以是CATCartesianPoint,然后创建一个CATVertex。

3.7. Difference between Domain & Cell orientation

一个Cell的方位相对于它对应的基本几何。

一个Cell的方位与它对应的几何方位相同时它的方位是Positive。相反则是Negative,如果未定义则是Unknown。

一个Domain和一个Cell的方位是不同的。

一个Domain实际上有一个全局方位,而且这个全局方位与其包含的Cells的方位不会混淆。

下图说明了一个封闭shell的全局方位是朝向shell内部的。箭头代表了CATShell的全局方位而不是face的方位。

还有一种Domain是Loop。

它也有全局方位。如果你以face的方位方向站立,然后沿着loop的方位移动,那么这种移动遵循左手法则。

用于获取方位的服务有:

参考Domain全局方位的Cell:CATDomain::GetCellRank ()

依赖在几何(Surface)下的Cell(face):CATCell::GetGeometryOrientation()

参考坐标系的face:CATFace::EvalNormal

参考坐标系的surface:CATSurface::EvalNormal

可以根据给予的几何来获取side。为了获取它你必须对一个edge使用CATCell::GetMatterSide 或者CATEdge::GetSideOnFace。CATSide属性定义了。。。(The CATSide attribute defines the matter side on a bounding cell of a cell.)(这什么鬼?)

考虑下图定义的例子。假设我站在face的方向上,观察edge1的方向,I have the matter to my left。GetMatterSide方法将会返回CATSideLeft。


后话

有些可能翻译地不太准确,水平没这么高见谅。拓补算是CAA开发里比较难理解的一块了,资料也比较少。我当时所在的是一家超大型装配工厂,因此不怎么会接触到非常深的拓补内容,很多地方我个人也是模模糊糊。CATIA之所以牛逼应该有很大一部分要归功于这个几何拓补部分,不知有没机会再续前缘呢。

Activiti入门学习
UEditor结合highlight.js