造型数据ModelingData 2
Geometry
非参数和参数几何
非参数 | 参数 |
---|---|
直接通过值来操作 | Geom(Geom2d)使用Handle来操作,但是控制类(不只是数据结构,可直接生成几何,如GC_MakeLine)是使用值来操作 |
非参数类不能被继承 | 提供从Geom到gp的方法 |
非参数几何
gp_Pnt - 笛卡尔坐标点
gp_Vec - 向量
gp_Dir - 方向(模为1,标准向量)
gp_Trsf - 变化,可以设置移动、旋转、缩放
gp_Ax1 - 轴
gp_Lin,gp_Circ,gp_Elips,gp_Hypr,gp_Parab,gp_Cylinder,gp_Sphere,gp_Torus - 表示线(cruve)和面的基本类型
控制类
直接构造:gce_MakeCircle,gce_MakeLin
受约束的构造(针有2d)GccAna_Circ2d2TanRad(创建与2个点/线/圆相切并具有给定半径的二维圆)
2维类通常加后缀2d,如gp_Pnt2d
非参数几何的限制
一些对象是无限的,没有办法让他们变得有限,如Line,plane,cylinder
一些复杂的形式无法展现
点到线的距离等
参数几何
- Curves - Geom_Curve的子类
Geon_Line
二次曲线:Geom_Circle,Geom_Ellipse,Geom_Hyperbola,Geom_Parabola
自由形式:Geom_BSplineCurve,Geom_BezierCurve
Geom_OffsetCurve
裁剪相关:Geom_TrimmedCurve
- Surface - Geom_Surface的子类
基本面:Geom_Plane,Geom_CylindricalSurface,Geom_SphericalSurface,Geom_ToroidalSurface,Geom_ConicalSurface
自由形式:Geom_BSplineSurface,Geom_BezierSurface
扫略面:Geom_SurfaceOfLinearExtrusion,Geom_SurfaceOfRevolution
Geom_OffsetSurface
裁剪相关:Geom_RectangularTrimmedSurface
控制类
直接构造:gce_MakeCircle,gce2d_MakeCircle
约束构造(只针对2d):Geom2dGcc_Circl2d3Tan
Topology
抽象拓扑TopoDS:通过描述边界之间的联系来完成定义
边界表示B-Rep:通过拓扑和几何信息来完成对象的定义
抽象TopoDS和B-Rep表达与算法类分在了不同的package下
**图形连接性:**两个图形连接起来如果他们共享了一些子图形的话
TopoDS_Shape通过以下3点定义一个shape
- 一个TopoDS_TShape handle-在它内部有一个默认的局部坐标系,以此来描述对象,当时它不能直接被使用
- 一个局部坐标系-
- 一个方向
位置修改
OCCT允许重新修改拓扑信息通过位置。
有关位置的方法有 Location Move Moved
//构造位置信息
gp_Ax1 axis(gp_Pnt(ax,ay,az),gp_Vec(dx,dy,dz));
gp_Trsf T;
T.SetRotation(axis,angle);
//更新已经存在的位置
aShape.Move(T);
方向
OCCT中定义的方向是为了完成边界表达,通过在里面和外面的相关信息。这些信息是一系列影响图形正确与否的规则。
Vertex在edge中
方向本身对于Vertex没有任何含义,Vertex方向仅仅是在界定Edge时起作用,此时第一个Vertex具有TopAbs_Forward方向,而第二个具有TopAbs_REVERSED方向。
注意:BRepBuilderAPI_MakeVerex
构造了一个TopAbs_Forward的Vertex
gp_Pnt ap1(10,0,0),ap2(20,0,0);
TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(ap1,ap2);
TopExp_Explorer anExpEV(anEdge,TopAbs_VERTEX);
for(;anExpEv.More();anExpEv.Next())
{
const TopoDS_Vertex& av = TopoDS::Vertex(anExpEV.Current());
const gp_Pnt& aPnt = Brep_Tool::Pnt(av);
if(av.Orientation()==TopAbs_FORWARD)
{...}
else if(av.Orientation()==TopAbs_REVERSED)
{...//inner}
}
edge在wire中
面是通过多个edge来限定的,edge在面上的方向遵循右手定则,面应该在edge方向的左边,如果edge的方向不是对的,可以使重新构建curve,也可以翻转底层的curve,通常翻转底层的curve即可。
face在solid中
法向应该指向外面。如果sloid指的是模型空间而不包括空间边界,则法向量指向里面
TopoDS_Shape提供了一些有用的方法:
IsNull()-确定TShape是否是null
Nullify()-作废TShape智能指针
Location()-返回存在的坐标
Move()-施加变形
Moved()-返回新的移动后的形状
ShapeType()-返回TopoDS_Shape类型
IsPatrner()-是否是相同的TShape
IsSame()-是否是相同的TShape和坐标
IsEqual()-是否是相同的TShape、坐标、方向
Shape的向下转换
TopoDS::Vertex() 返回一个TopoDS_VerTex,如果是一个不正确的转换会抛出异常