OCC类基础.docx

上传人:b****7 文档编号:10502867 上传时间:2023-02-17 格式:DOCX 页数:54 大小:189.97KB
下载 相关 举报
OCC类基础.docx_第1页
第1页 / 共54页
OCC类基础.docx_第2页
第2页 / 共54页
OCC类基础.docx_第3页
第3页 / 共54页
OCC类基础.docx_第4页
第4页 / 共54页
OCC类基础.docx_第5页
第5页 / 共54页
点击查看更多>>
下载资源
资源描述

OCC类基础.docx

《OCC类基础.docx》由会员分享,可在线阅读,更多相关《OCC类基础.docx(54页珍藏版)》请在冰豆网上搜索。

OCC类基础.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 成考

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1