opencascade 基础 原创

获取图形起点、终点

Standard_Real First=1, Last=2;
Handle(Geom_Curve) curve = BRep_Tool::Curve(TopoDS::Edge(shape), First, Last);
gp_Pnt Milieu = curve->Value(First);
qDebug()<< curve->Value(First).X()<< curve->Value(First).Y();
qDebug()<< curve->Value(Last).X()<< curve->Value(Last).Y();

opencascade 曲线去锯齿

mView->ChangeRenderingParams().IsAntialiasingEnabled = true
mView->ChangeRenderingParams().NbMsaaSamples = 4;

BRepClass_FaceClassifier 点和面的关系

计算线和面的关系
BRepExtrema_DistShapeShape dis = BRepExtrema_DistShapeShape((BRepBuilderAPI_MakeVertex(ResultPoint)).Shape(), occCurve);
if (((aClassifier.State() == TopAbs_State.TopAbs_ON) ||
(aClassifier.State() == TopAbs_State.TopAbs_IN)))
{
//点在面上
}

opencaccade 线面相交 求距离 求三角面片的顶点

GeomConvert

BSpline曲线、曲面拆分,Handle(Geom_Curve)转BSpline曲线

BRepExtrema_DistShapeShape

求两个TopoDS_Shape(TopoDS_Face、TopoDS_Vertex、TopoDS_Edge、TopoDS_Wire…)的最近距离,得到这个距离所对应的点【在TopoDS_Shape1上的和TopoDS_Shape2上的都可以得到】、最近距离的值、最近距离点的个数

GeomAPI_IntCS

求Geom_Curve和Geom_Surface的交点、交点,得到交点的个数和对应的交点、曲线段的条数、对应的曲线(Geom_Curve)

GeomAPI_IntSS

求Geom_Surface和Geom_Surface的交线,得到交线的条数和对应的交线

BRepAlgoAPI_Section

求TopoDS_Shape和TopoDS_Shape、Geom_Surface和TopoDS_Shape、TopoDS_Shape和gp_Pln相交后的数据,得到TopoDS_Shape【包含相交部分的数据,BRepAlgoAPI_Section继承于BRepBuilderAPI_MakeShape】

BRep_Tool

TopoDS_Face转Geom_Surface、TopoDS_Edge转Geom_Curve(转完后可以得到曲线U值范围)、TopoDS_Vertex转gp_Pnt

StlTransfer

TopoDS_Shape转StlMesh_Mesh

StlMesh_MeshExplorer

StlMesh_Mesh的遍历器、获得三角面片的三个顶点的x、y、z值

opencascade 绘制文字有两种方法

方法一 TopoDS_Shape Font_BRepTextBuilder

 //字体类型:路径
    //字体大小:大小
    //字体内容:内容
    Font_BRepFont font( "字体路径 ", size);
    Font_BRepTextBuilder aTextBuilder;
    TopoDS_Shape aTextShape = aTextBuilder.Perform(font, textStr);
    gp_Vec x(gp_Pnt(0,0,0),pnt1);
    gp_Trsf trsf;
    trsf.SetTranslation(x);
    BRepBuilderAPI_Transform transform(trsf);
    transform.Perform(aTextShape);
    TopoDS_Shape shape = transform.Shape();
    return shape;

方法二 AIS_TextLabe

TCollection_ExtendedString tostr;
Standard_CString str= "OpenCasCade 你好啊 1234";
Resource_Unicode::ConvertGBToUnicode(str,tostr);
Handle(AIS_TextLabel) aLabel = new AIS_TextLabel();
aLabel -> SetText(tostr);
aLabel -> SetColor(Quantity_NOC_RED);
aLabel -> SetFont("SimHei")
myAISContext->Display(aLabel,Standard_False);

opencascade 布尔运算

BrepAlgoAPI_Common

可求两个形状相交部分构成的的新形状
结果如图所示
在这里插入图片描述

BrepAlgoAPI_Section

求两个图形相交在一起的相交线
结果如图所示
在这里插入图片描述

BrepAlgoAPI_Cut

减法,可以从一个形状中减去另一种形状

BrepAlgoAPI_Fuse

加法,将两个图形结合成一个图形

Extrema_ExtPE1C::Perform

点到线的距离

在OpenCascade中,计算点到线的距离可以通过几种不同的方法实现。这里我们假设“线”是指三维空间中的一条曲线,例如线段或无限长的直线。

一种方法是使用Extrema_ExtPC类。这个类可以用来计算点到参数化曲线的最短距离。以下是一个使用Extrema_ExtPC计算点到线段距离的示例代码:

// 假设我们有一个点和一个线段
gp_Pnt aPoint(1.0, 2.0, 3.0);
Adaptor3d_Line aLine(gp_Pnt(0.0, 0.0, 0.0), gp_Pnt(1.0, 1.0, 1.0)); // 构造线段

// 创建Extrema_ExtPC对象
Extrema_ExtPC anExtrema(aPoint, aLine);

// 执行计算
anExtrema.Perform();

// 检查计算是否成功,并获取最短距离
if (anExtrema.IsDone() && anExtrema.NbSolution() > 0) {
    Standard_Real distance = anExtrema.SquareDistance(1); // 获取第一个(也是唯一的)解决方案的距离
    std::cout << "The distance from the point to the line segment is: " << std::sqrt(distance) << std::endl;
} else {
    std::cout << "No solutions found." << std::endl;
}

注意

Extrema_ExtPC计算的是点到参数化曲线的距离,因此它适用于线段(有限长的直线段)而不是无限长的直线。对于无限长的直线,你可能需要使用不同的方法,例如通过计算点到直线上最近点的距离。

另一种方法是使用BRepExtrema_DistShapeShape类,它用于计算两个形状之间的最短距离。然而,这种方法通常用于计算点到线段或更复杂形状的距离,而不是点到直线的距离。

请确保你理解了OpenCascade中的曲线和形状表示,以及它们如何与你的具体应用场景相关。

opencascade 求两 物体shape 距离

BRepExtrema_DistShapeShape BRepExtrema_DistShapeShape(line1,line2);
RepExtrema_DistShapeShape.Value();

例子

// TopoDS_Shape line1 =
BRepBuilderAPI_MakeEdge(GC_MakeSegment(gp_Pnt(0,0,0),gp_Pnt(100,0,0)).
Value()) ;
// TopoDS_Shape line2 =
BRepBuilderAPI_MakeEdge(GC_MakeSegment(gp_Pnt(0,50,0),gp_Pnt(50,100,0)
).Value()) ;
// BRepExtrema_DistShapeShape
BRepExtrema_DistShapeShape(line1,line2);
// qDebug()<< BRepExtrema_DistShapeShape.Value();
// qDebug()<< BRepExtrema_DistShapeShape.NbSolution();
// gp_Pnt hhh= BRepExtrema_DistShapeShape.PointOnShape2(2);
// qDebug()<<hhh.X()<<hhh.Y();

其中 BRepExtrema_DistShapeShape.PointOnShape2(2);的(2)为第几个交点,一
个交点只能填 1,2 个填 2.
在这里插入图片描述
浮动边:不属于任何面;
自由边:只属于一个面;
共享边:属于多个面;
缝制的面:彼此共享的边缘;
缝合的边:具有彼此共享的顶点。

opencscade 测量线的长度

方法一

CPnts_AbscissaPoint::Length

方法二

GProp_Gprops pros;
BRepGrop::LinearProperties(edge,pros);
double length = pros.Mass;

创建球体

BRepPrimAPI_MakeSphere makeSphere = new BRepPrimAPI_MakeSphere(neckLocation, radius);

创建长方体、立方体

BRepPrimAPI_MakeBox

创建圆柱体

BRepPrimAPI_MakeCylinder

创建圆锥体

BRepPrimAPI_MakeCone

创建拉伸体

BRepPrimAPI_MakePrism

创建放样

BRepOffsetAPI_ThruSections

创建管状扫略体

BRepOffsetAPI_MakePipeShell

将壳/面加厚为实心

BRepOffsetAPI_MakeThickSolid

偏移平面导线

BRepOffsetAPI_MakeOffsetShap

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