OCC类基础.docx
《OCC类基础.docx》由会员分享,可在线阅读,更多相关《OCC类基础.docx(54页珍藏版)》请在冰豆网上搜索。
OCC类基础
OCC类基础
一直在用OCC作项目,但这方面的中文资料很少,看来OCC在中国还不是十分普及;
后来,项目中使用OCC和DirectX结合使用,取得了很好的效果;
随着版本的推出,OpenCASCADE在速度方面已有了很大的改变。
以下为一些OCC的基础知识,愿与各位OCC爱好者共同学习;
一:
OCC中的基础类:
gp_Pnt
在OCC中,gp_Pnt表示一个顶点,gp_Vec表示一个向量,可以用两个顶点来生成一个向量。
比如:
gp_PntP1(0,0,0);
gp_PntP2(5,0,0);
gp_VecV1(P1,P2);
向量有一个方法.IsOpposite(),可以用来测试两个向量的方向是相对还是平行;
比如:
gp_PntP3(-5,0,2);
gp_VecV2(P1,P3);
Standard_Booleanresult=(V2,Precision:
:
Angular());
另外向量还有一些重要方法:
--Standard_RealMagnitude()const;计算向量的大小;
--Standard_RealSquareMagnitude()const;计算向量的平方;
--向量的加减乘除操作;
--向量的单位化;
--通过一个点,线,面得出其镜像的向量;
--向量的旋转,平移,缩放;
具体的函数名称可以看OCC的头文件说明;
有时需要决定一组空间点是位于一个点;一条直线,或一个平面,或一个空间:
OCC中提供了相应的算法;
比如:
TColgp_Array1OfPntarray(1,5);Geom2d_TrimmedCurve类:
此类通过两个值,定义曲线的一部分,
--可以用来计算曲线的参数值和点坐标;
--可以得到曲线的一般特征,比如连续的等级,封闭特点,周期性,边界参数;
--当用一个矩阵应用于曲线或原始曲线转化后进行相应参数的改变;
所有的曲线必须几何连续,曲线至少一阶可导。
一般来说,在生成一个曲线时,要先检查一下所应用的参数是否可以生成一个光滑曲线;否则会出现错误;
另外注意一点:
不可以构造空长度的曲线或自相交的曲线;
此类的基类是Geom2d_BoundedCurve类:
它是一个抽象类;描述二维空间中的边界曲线的一般行为;除了Geom2d_TrimmedCurve是它的一个派生类外,它还有二个派生类:
-Geom2d_BezierCurve
-Geom2d_BSplineCurve
Geom2d_BoundedCurve类的基类是Geom2d_Curve类:
Geom2d_Curve:
抽象类;此抽象类描述了2D空间的曲线的一般特征;派生出的类有多个:
包括直线,园,二次曲线,Bizier,BSpline曲线等;这些曲线的特点是可以参数化;
Geom2d_Curve类的基类是Geom2d_Geometry类;
此抽象类主要定义了曲线的变换,平移,旋转,缩放及拷贝等方法;
Geom2d_Geometry类的基类是MMgt_TShared类;
此抽象类为管理对象的基类,可以引用计数,及删除方法;
Standard_Transient:
此抽象类为所有类共同的基类;
Geom2dAPI_InterCurveCurve类:
此类用来实现二维曲线的相交;
一种情况是曲线与曲线的相交,另外一种情况是曲线自身的相交;
主要方法有:
--Standard_IntegerNbPoints()const;相交点数;
--Standard_IntegerNbSegments()const;切线相交数;
--voidSegment(constStandard_IntegerIndex,Handle(Geom2d_Curve)&Curve1,Handle(Geom2d_Curve)&Curve2)
const;返回其中一个线段;
下面的示例是两个曲线相交的例子:
首先,生成第一个曲线,在这里,应用点数组来生成一个曲线;
--定义数组
Handle(TColgp_HArray1OfPnt2d)harray= newTColgp_HArray1OfPnt2d(1,5);示例:
gp_Pnt2dP1(1,2);
gp_Pnt2dP2(4,5);
gp_Lin2dL;
GccAna_Pnt2dBisecB(P1,P2);
if())
{L=();}
因为所生成的为直线,所以显示时要转化为线段:
if())
{
Handle(Geom2d_TrimmedCurve)aLine=GCE2d_MakeSegment(L,-8,8);
Handle(ISession2D_Curve)aCurve=newISession2D_Curve(aLine);
aDoc->GetISessionContext()->Display(aCurve,Standard_False);
}
gce_MakeCirc2d类
用来创建园:
创建园的方法很多,主要构造方法有:
--园心和通过的一点;
--通过一个园和一个距离值,创建一个同心园;
--三点决定一个园;
--园心和半径;
gp_Elips2d类:
可以生成一个椭园,也可以生成椭园上的一段园弧;
比如:
Standard_Realmajor=12;
Standard_Realminor=4;
gp_Ax2daxis=gp:
:
OX2d();
gp_Elips2dEE(axis,major,minor);;
Handle(Geom2d_TrimmedCurve)arc=GCE2d_MakeArcOfEllipse(EE,,PI/4);
上面是利用长短轴的方法构造椭圆,也可以用二次方程的方式来构造椭园;
其中椭园类中方法可以求出焦点1和焦点2的位置,两焦点之间的位置,离心率;旋转,平移,缩放等操作.
三、关于面的类
gp_Pln类:
定义一个平面,构造的方法可以是点法式,或通过ABCD系数;
另外,还提供了一些常用的方法,比如:
--求点到平面,线到平面,平面与平面的距离及平方距离;
--点是否在平面内,线是否在平面内;
--通过一个点,一个轴的镜像平面;
--平面的旋转,缩放与平移;
Geom_ElementarySurface类:
此类用来描述一个表面,此类的派生类有:
平面;园柱面;锥面;球面;园环面;
它的基类是Geom_Surface,是一个抽象类;
Geom_Surface类的基类是Geom_Geometry类;
Geom_RectangularTrimmedSurface类:
用来生成一个有边界的平面;
比如:
Handle(Geom_Plane)aProjectionPlane=GC_MakePlane(ProjectionPlane).Value();
Handle(Geom_RectangularTrimmedSurface)aProjectionPlaneSurface=
newGeom_RectangularTrimmedSurface(aProjectionPlane,-8.,8.,-12.,12.);
DisplaySurface(aDoc,aProjectionPlaneSurface);
此类的基类是Geom_BoundedSurface类;
此类的兄弟类还有
-Geom_BezierSurface,
-Geom_BSplineSurface
ConicalSurface类:
用来创建一个园锥表面;
构造表面的方法有:
--已知一个园锥表面,和空间一点,过此点的平行于已知园锥表面;
--已知一个园锥表面,和一个距离,创建一个平行于已知园锥表面的园锥表面;
--通过四个点构造一个园锥表面;
--通过一个轴和两个点;
--通过两个点和两个半径;
GeomAPI_IntCS类:
此类用来计算一个园弧和和一个表面的交点或相交线段;
GeomFill_BSplineCurves类:
此类用来构造一个可以填充的BSpline表面,构造它可以用两个三个或四个BSpline曲线作为边界;
填充类型有三种:
enumGeomFill_FillingStyle{
GeomFill_StretchStyle,
GeomFill_CoonsStyle,
GeomFill_CurvedStyle
};
以下示例为用两个样条曲线生成一个表面:
GeomFill_FillingStyleType=GeomFill_StretchStyle;
GeomFill_BSplineCurvesaGeomFill1(SPL1,SPL2,Type);
Handle(Geom_BSplineSurface) aBSplineSurface1=();
GeomFill_Pipe类:
此类用来构造一个pipe,沿着一个路径sweep一个截面,这两个都是曲线类型;一般来说,结果是一个BSpline表面;
常见的有几种方法:
--给定一个路径和一个半径,截面是个园,位置是路径的第一个点,
比如:
GeomFill_PipeaPipe(SPL1,1);
();
Handle(Geom_Surface)aSurface=();
Standard_CStringaSurfaceEntityTypeName="NotComputed";
if(!
())
aSurfaceEntityTypeName=aSurface->DynamicType()->Name();
--给定一个路径和一个截面。
比如:
Handle(Geom_Ellipse)E=GC_MakeEllipse(gp:
:
XOY(),3,1).Value();
GeomFill_PipeaPipe2(SPL1,E);
();
Handle(Geom_Surface)aSurface2=();
Standard_CStringaSurfaceEntityTypeName2="NotComputed";
if(!
()) {
aSurfaceEntityTypeName2=aSurface2->DynamicType()->Name();
aSurface2->Translate(gp_Vec(5,0,0)); }
--给定一个路径和两个截面,中间截面为过度线;
示例:
Handle(Geom_TrimmedCurve)TC1=
GC_MakeSegment(gp_Pnt(1,1,1),gp_Pnt(5,5,5));
Handle(Geom_TrimmedCurve)TC2=
GC_MakeSegment(gp_Pnt(1,1,0),gp_Pnt(4,5,6));
GeomFill_PipeaPipe3(SPL1,TC1,TC2);
();
Handle(Geom_Surface)aSurface3=();
Standard_CStringaSurfaceEntityTypeName3="NotComputed";
if(!
())
{
aSurfaceEntityTypeName3=aSurface3->DynamicType()->Name();
aSurface3->Translate(gp_Vec(10,0,0));
}
--给定一个路径和N个截面,中间为过渡线;
一般情况下,所生结果为:
NURBS,但是,在一些特殊的情况下,可以生成平面,园柱,球,园锥等;
参数,U,沿着截面的方向,V沿着路径方向;
Geom_BezierSurface类:
生成一个Bezier表面;
Geom_OffsetSurface类:
用来偏移一个表面;
比如:
Standard_Realoffset=1;
Handle(Geom_OffsetSurface)GOS=newGeom_OffsetSurface(aGeomSurface,offset);
Geom_SweptSurface类:
有两个派生类,分别用来生成一个回转体表面和一个延展体表面;
Geom_SurfaceOfLinearExtrusion:
用来描述一个线性延展表面;
它的基类是:
Geom_Surface类
比如:
Handle(Geom_BSplineCurve)aCurve=GeomAPI_PointsToBSpline(array).Curve();
gp_DiraDir(1,2,3);
Handle(Geom_SurfaceOfLinearExtrusion)SOLE=newGeom_SurfaceOfLinearExtrusion(aCurve,aDir);
Handle(Geom_RectangularTrimmedSurface)aTrimmedSurface=newGeom_RectangularTrimmedSurface(SOLE,-10,10,false);
Geom_SurfaceOfRevolution类,表示一个回转体表面;
比如:
Handle(Geom_BSplineCurve)aCurve=GeomAPI_PointsToBSpline(array).Curve();
Handle(Geom_SurfaceOfRevolution)SOR=newGeom_SurfaceOfRevolution(aCurve,gp:
:
OX());
1:
利用一个二维数组来生成曲面的方法:
TColgp_Array2OfPntarray3(1,5,1,5);
(1,1,gp_Pnt(-4,-4,5));
...
(2,1,gp_Pnt(-2,-4,4));
...
Handle(Geom_BSplineSurface)aSurf2=GeomAPI_PointsToBSplineSurface(array3).Surface();
2:
GeomAPI_ExtremaSurfaceSurface类:
计算两个表面之间的极值点;
主要方法:
(1):
Quantity_LengthLowerDistance()const;计算两个表面的最短距离;
(2):
Standard_EXPORT voidLowerDistanceParameters(Quantity_Parameter&U1,Quantity_Parameter&V1,Quantity_Parameter&U2,Quantity_Parameter&V2)const;
得到第一个表面上的极值点的UV参数和第二个表面上的极值点的UV参数;
(3):
voidNearestPoints(gp_Pnt&P1,gp_Pnt&P2)const;得到第一个表面上的极值点和第二个表面上的极值点;
(4):
Quantity_LengthDistance(constStandard_IntegerIndex)const;得到第N个极值点的距离;
(5):
Standard_IntegerNbExtrema()const;极值的数目;
......
示例:
GeomAPI_ExtremaSurfaceSurfaceESS(aSurf1,aSurf2);
Quantity_Lengthdist=();
gp_PntP1,P2;
(P1,P2);
gp_PntP3,P4;
Handle(Geom_Curve)aCurve;
Standard_IntegerNbExtrema=();
for(Standard_Integerk=1;k<=NbExtrema;k++){
(k,P3,P4);
aCurve=GC_MakeSegment(P3,P4).Value();
DisplayCurve(aDoc,aCurve,Quantity_NOC_YELLOW3,false);
}
一些OCC的基础知识,愿与各位OCC爱好者共同学习;
一:
关于体的类
BRepBuilderAPI_MakeVertex类
创建点;
BRepBuilderAPI_MakeEdge类
此类用来创建边;
比如,由直线生成边:
gp_Linline(gp_Ax1(gp_Pnt(10,10,10),gp_Dir(1,0,0)));
WhiteEdge=BRepBuilderAPI_MakeEdge(line,-20,10);
下面为生成四分之一园边:
gp_ElipsElips(gp_Ax2(gp_Pnt(10,0,0),gp_Dir(1,1,1)),60,30);
RedEdge=BRepBuilderAPI_MakeEdge(Elips,0,PI/2);
下面是由曲线生成边:
Handle(Geom_BezierCurve)curve=newGeom_BezierCurve(array);
BRepBuilderAPI_MakeEdgeME(curve);
GreenEdge=ME;
V3=();
V4=();
BRepBuilderAPI_MakeWire类
用来创建一个Wire类;
用一个Wire和一个边来生成一个新的Wire:
ExistingWire=BRepBuilderAPI_MakeWire(Edge2);
Edge3=BRepBuilderAPI_MakeEdge(gp_Pnt(-300,0,-80),gp_Pnt(-90,20,-30));
BRepBuilderAPI_MakeWireMW1(ExistingWire,Edge3);
if()){YellowWire=MW1;}
用一个Wire和添加边的方法来生成Wire:
BRepBuilderAPI_MakeWireMW;
(ExistingWire2);
(Edge5);
(Edge6);
(Edge7);
if()){
WhiteWire=();
LastEdge=();
LastVertex=();
}
BRepBuilderAPI_MakeFace类
生成一个面;有多种生成面的方法;
--通过一个封闭曲线生成面:
BRepBuilderAPI_MakeFace(curve);
--通过一个Wire生成面:
BrownFace=BRepBuilderAPI_MakeFace(YellowWire);
Bnd_Box2d类:
定义一个二维空间的边界盒,可以得出边界盒各个点的值,有时,在某个方向是无限大,这种情况下,称为在此方向上是开放的;
示例:
Bnd_Box2daCBox;
Geom2dAdaptor_CurveGACC(C);
BndLib_Add2dCurve:
:
Add(GACC,Precision:
:
Approximation(),aCBox);
Bnd_Box类:
定义一个三维空间的边界盒,可以扩大或缩小边界盒,也可以合并两个轴对齐边界盒;
BRepPrimAPI_MakeBox类
用来生成一个立方体;
构造一个立方体可以是两个对角点,一个角点及三个方向长度,可以是非轴对称的:
TopoDS_ShapeB2=BRe