opencascade 基础篇 gp_Pln类: 原创

概述:

定义一个平面,构造的方法可以是
点法式:gp_Pln( gp_Pnt P, gp_Dir V)
ABCD系数:gp_Pln(double A, double B, double C, double D)
//! Creates a plane from its cartesian equation :
//! @code
//! theA * X + theB * Y + theC * Z + theD = 0.0
//! @endcode
//! Raises ConstructionError if Sqrt (theAtheA + theBtheB + theC*theC) <= Resolution from gp.

//! 根据其笛卡尔方程创建平面:
//! @代码
//! AX+BY+CZ+theD=0.0
//! @结束代码
//! 如果Sqrt(A
aA+theBtheB+theCtheC)<=来自gp的分辨率,则引发构造错误。

//! 平面的坐标系由轴定义
//! 放置A3。
//! A3的“方向”定义平面的法线。
//! A3的“位置”定义了平面的位置(原点)。
//! A3的“X方向”和“Y方向”定义了“X轴”和
//! 用于参数化平面的平面的“Y轴”。
gp_Pln( gp_Ax3 A3)

另外,还提供了一些常用的方法,比如:

–求点到平面,线到平面,平面与平面的距离及平方距离;

–点是否在平面内,线是否在平面内;

–通过一个点,一个轴的镜像平面;

–平面的旋转,缩放与平移;

Geom_ElementarySurface类:

此类用来描述一个表面,此类的派生类有:

平面;园柱面;锥面;球面;园环面;

它的基类是Geom_Surface,是一个抽象类;

Geom_Surface类的基类是Geom_Geometry类;

Geom_RectangularTrimmedSurface类:

用来生成一个有边界的平面;

比如:

Handle(Geom_Plane) aProjectionPlane = GC_MakePlane(ProjectionPlane).Value();

Handle(Geom_RectangularTrimmedSurface) aProjectionPlaneSurface=

new Geom_RectangularTrimmedSurface(aProjectionPlane,-8.,8.,-12.,12.);

DisplaySurface(aDoc,aProjectionPlaneSurface);

此类的基类是Geom_BoundedSurface类;

此类的兄弟类还有

Geom_BezierSurface,

Geom_BSplineSurface

ConicalSurface类:用来创建一个园锥表面;

构造表面的方法有:

–已知一个园锥表面,和空间一点,过此点的平行于已知园锥表面;

–已知一个园锥表面,和一个距离,创建一个平行于已知园锥表面的园锥表面;

–通过四个点构造一个园锥表面;

–通过一个轴和两个点;

–通过两个点和两个半径;

GeomAPI_IntCS类:

此类用来计算一个圆弧和和一个表面的交点或相交线段;

GeomFill_BSplineCurves类:

此类用来构造一个可以填充的BSpline表面,构造它可以用两个三个或四个BSpline曲线作为边界;

填充类型有三种:

enum GeomFill_FillingStyle {
GeomFill_StretchStyle,

GeomFill_CoonsStyle,

GeomFill_CurvedStyle

};

以下示例为用两个样条曲线生成一个表面:

GeomFill_FillingStyle Type = GeomFill_StretchStyle;

GeomFill_BSplineCurves aGeomFill1(SPL1,SPL2,Type);

Handle(Geom_BSplineSurface) aBSplineSurface1 = aGeomFill1.Surface();

GeomFill_Pipe类:

此类用来构造一个pipe,沿着一个路径sweep一个截面,这两个都是曲线类型;一般来说,结果是一个BSpline表面;

常见的有几种方法:

–给定一个路径和一个半径,截面是个园,位置是路径的第一个点,

比如:

GeomFill_Pipe aPipe(SPL1,1);

aPipe.Perform();

Handle(Geom_Surface) aSurface= aPipe.Surface();

Standard_CString aSurfaceEntityTypeName=“Not Computed”;

if (!aSurface.IsNull())

aSurfaceEntityTypeName = aSurface->DynamicType()->Name();

–给定一个路径和一个截面。

比如:

Handle(Geom_Ellipse) E = GC_MakeEllipse( gp::XOY() ,3,1).Value();

GeomFill_Pipe aPipe2(SPL1,E);

aPipe2.Perform();

Handle(Geom_Surface) aSurface2= aPipe2.Surface();

Standard_CString aSurfaceEntityTypeName2=“Not Computed”;

if (!aSurface2.IsNull()) {
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_Pipe aPipe3(SPL1,TC1,TC2);

aPipe3.Perform();

Handle(Geom_Surface) aSurface3 = aPipe3.Surface();

Standard_CString aSurfaceEntityTypeName3=“Not Computed”;

if (!aSurface3.IsNull())

{
aSurfaceEntityTypeName3 = aSurface3->DynamicType()->Name();

aSurface3->Translate(gp_Vec(10,0,0));

}

–给定一个路径和N个截面,中间为过渡线;

一般情况下,所生结果为:NURBS,但是,在一些特殊的情况下,可以生成平面,园柱,球,园锥等;

参数,U,沿着截面的方向,V沿着路径方向;

Geom_BezierSurface类:

生成一个Bezier表面;

Geom_OffsetSurface类:

用来偏移一个表面;

比如:

Standard_Real offset = 1;

Handle(Geom_OffsetSurface) GOS = new Geom_OffsetSurface(aGeomSurface, offset);

Geom_SweptSurface类:

有两个派生类,分别用来生成一个回转体表面和一个延展体表面;

Geom_SurfaceOfLinearExtrusion:用来描述一个线性延展表面;

它的基类是:Geom_Surface类

比如:

Handle(Geom_BSplineCurve) aCurve =GeomAPI_PointsToBSpline(array).Curve();

gp_Dir aDir(1,2,3);

Handle(Geom_SurfaceOfLinearExtrusion) SOLE =new Geom_SurfaceOfLinearExtrusion(aCurve,aDir);

Handle(Geom_RectangularTrimmedSurface) aTrimmedSurface =new Geom_RectangularTrimmedSurface(SOLE,-10,10,false);

Geom_SurfaceOfRevolution类,表示一个回转体表面;

比如:

Handle(Geom_BSplineCurve) aCurve = GeomAPI_PointsToBSpline(array).Curve();

Handle(Geom_SurfaceOfRevolution) SOR =new Geom_SurfaceOfRevolution(aCurve,gp::OX());

1:利用一个二维数组来生成曲面的方法:

TColgp_Array2OfPnt array3 (1,5,1,5);

array3.SetValue(1,1,gp_Pnt (-4,-4,5));


array3.SetValue(2,1,gp_Pnt (-2,-4,4));


Handle(Geom_BSplineSurface) aSurf2 =GeomAPI_PointsToBSplineSurface(array3).Surface();

2:GeomAPI_ExtremaSurfaceSurface类:

计算两个表面之间的极值点;

主要方法:

(1):Quantity_Length LowerDistance() const;计算两个表面的最短距离;

(2):Standard_EXPORT void LowerDistanceParameters(Quantity_Parameter& U1,Quantity_Parameter& V1,Quantity_Parameter& U2,Quantity_Parameter& V2) const;

得到第一个表面上的极值点的UV参数和第二个表面上的极值点的UV参数;

(3):void NearestPoints(gp_Pnt& P1,gp_Pnt& P2) const;得到第一个表面上的极值点和第二个表面上的极值点;

(4): Quantity_Length Distance(const Standard_Integer Index) const;得到第N个极值点的距离;

(5):Standard_Integer NbExtrema() const;极值的数目;

示例:

GeomAPI_ExtremaSurfaceSurface ESS(aSurf1,aSurf2);

Quantity_Length dist = ESS.LowerDistance();

gp_Pnt P1,P2;

ESS.NearestPoints(P1,P2);

gp_Pnt P3,P4;

Handle(Geom_Curve) aCurve;

Standard_Integer NbExtrema = ESS.NbExtrema();

for(Standard_Integer k=1;k<=NbExtrema;k++){
ESS.Points(k,P3,P4);

aCurve= GC_MakeSegment(P3,P4).Value();

DisplayCurve(aDoc,aCurve,Quantity_NOC_YELLOW3,false);

}

介绍

在OCC中,
gp_Pnt表示一个顶点,
gp_Vec表示一个向量,可以用两个顶点来生成一个向量。
比如:
gp_Pnt P1(0,0,0);
gp_Pnt P2(5,0,0);
gp_Vec V1 (P1,P2);

使用

向量是否平行

V1.IsOpposite(V2,Precision::Angular());

向量的大小

Standard_Real Magnitude() const;

向量的平方

Standard_Real SquareMagnitude() const;

向量的单位化

镜像向量

旋转向量

平移向量

缩放向量

一组空间点之间的关系

例子
TColgp_Array1OfPnt array (1,5); // sizing array
array.SetValue(1,gp_Pnt(0,0,1));
array.SetValue(2,gp_Pnt(1,2,2));
array.SetValue(3,gp_Pnt(2,3,3));
array.SetValue(4,gp_Pnt(4,4,4));
array.SetValue(5,gp_Pnt(5,5,5));
GProp_PEquation PE (array,1.5 );
if (PE.IsPoint()){ } //是否是同一个点
gp_Lin L;
if (PE.IsLinear()) { L = PE.Line(); } //是否位于一条直线上;
if (PE.IsPlanar()){ } //是否在一个平面内;
if (PE.IsSpace()) { }

posted @ 2024-04-24 20:04  一点灯  阅读(0)  评论(0编辑  收藏  举报  来源