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