当前位置:   article > 正文

Open CASCADE学习| 几何建模

Open CASCADE学习| 几何建模

目录

1、二维几何

gp_XY定义二维坐标值

gp_Pnt2d定义二维点

gp_Dir2d描述了二维空间中的一个单位向量。

gp_Vec2d描述了二维空间中的一个向量。

2、三维几何

gp_XYZ定义三维坐标值

gp_Pnt定义三维点

gp_Dir描述了三维空间中的一个单位向量。

gp_Ax1定义旋转轴、对称轴、直线的方向等

gp_Ax2定义几何位置(几何的Position即是此坐标系的原点),如圆的位置,球体的位置。

gp_Ax3与Ax2基本一致,只是其可以定义为左旋坐标系。

3、创建直线段

4、创建圆

5、Bezier曲线

6、Bezier和直线围城曲面

7、在曲线上生成点

8、创建带孔面

9、创建圆形拉伸面

10、创建圆形拉伸面

11、在曲面上生成点


1、二维几何

gp_XY定义二维坐标值

gp_Pnt2d定义二维点

gp_Dir2d描述了二维空间中的一个单位向量。

gp_Vec2d描述了二维空间中的一个向量。

2、三维几何

gp_XYZ定义三维坐标值

gp_Pnt定义三维点

gp_Dir描述了三维空间中的一个单位向量。

gp_Ax1定义旋转轴、对称轴、直线的方向等

gp_Ax2定义几何位置(几何的Position即是此坐标系的原点),如圆的位置,球体的位置。

gp_Ax3与Ax2基本一致,只是其可以定义为左旋坐标系。

3、创建直线段

  1. #include <GC_MakeSegment.hxx>
  2. #include <BRepBuilderAPI_MakeEdge.hxx>
  3. #include <TopoDS_Edge.hxx>
  4. #include"Viewer.h"
  5. int main(int argc, char* argv[])
  6. {
  7. //两点创建直线
  8. gp_Pnt P1(0., 0., 0.);
  9. gp_Pnt P2(0., 10., 0.);
  10. GC_MakeSegment MC(P1, P2);
  11. Handle(Geom_TrimmedCurve) C = MC.Value();
  12. TopoDS_Edge edge11 = BRepBuilderAPI_MakeEdge(C);
  13. Viewer vout(50, 50, 500, 500);
  14. vout << edge11;
  15. vout.StartMessageLoop();
  16. return 0;
  17. }

4、创建圆

  1. #include <gce_MakeCirc.hxx>
  2. #include <GC_MakeCircle.hxx>
  3. #include <BRepBuilderAPI_MakeEdge.hxx>
  4. #include <GC_MakeHyperbola.hxx>
  5. #include <BRepBuilderAPI_MakeWire.hxx>
  6. #include <BRepPrimAPI_MakePrism.hxx>
  7. #include"Viewer.h"
  8. int main(int argc, char* argv[])
  9. {
  10. //三点创建圆弧
  11. gp_Pnt P1(0., 0., 0.);
  12. gp_Pnt P2(0., 10., 0.);
  13. gp_Pnt P3(10., 0., 0.);
  14. gce_MakeCirc MC(P1, P2, P3);
  15. if (MC.IsDone())
  16. {
  17. const gp_Circ& C = MC.Value();
  18. }
  19. else {
  20. gce_ErrorType type = MC.Status();
  21. //对各种错误进行处理
  22. }
  23. TopoDS_Edge edge11 = BRepBuilderAPI_MakeEdge(MC);
  24. Viewer vout(50, 50, 500, 500);
  25. vout << edge11;
  26. vout.StartMessageLoop();
  27. return 0;
  28. }

5、Bezier曲线

  1. #include <Geom_BezierCurve.hxx>
  2. #include <BRepBuilderAPI_MakeEdge.hxx>
  3. #include <TopoDS_Edge.hxx>
  4. #include"Viewer.h"
  5. int main(int argc, char* argv[])
  6. {
  7. //Non Rational B-Spline
  8. gp_Pnt points1[8] = {
  9. gp_Pnt(0.0,-100.0,0.0),
  10. gp_Pnt(10.0,10.0,0.0),
  11. gp_Pnt(30.0,-100.0,0.0),
  12. gp_Pnt(100.0,0.0,0.0),
  13. gp_Pnt(150.0,50.0,0.0),
  14. gp_Pnt(200.0,0.0,0.0),
  15. gp_Pnt(400.0,200.0,0.0),
  16. gp_Pnt(450.0,0.0,0.0)
  17. };
  18. NCollection_Array1<gp_Pnt> points(points1[0], 1, 8);//Control points
  19. Standard_Real realsWeight[8] = { 1.0,1.0,1.0,1.0,1.0,1.0,10.0,1.0 };
  20. NCollection_Array1<Standard_Real> weight(realsWeight[0], 1, 8);//权系数,倒数第二个点的权系数是其他的10倍。
  21. Geom_BezierCurve bezier(points); //Non-Rational
  22. Geom_BezierCurve rationalBezier(points, weight);//Rational
  23. Handle(Geom_BezierCurve) bezier1 = &bezier;
  24. Handle(Geom_BezierCurve) bezier2 = &rationalBezier;
  25. TopoDS_Edge edge11 = BRepBuilderAPI_MakeEdge(bezier1);
  26. TopoDS_Edge edge12 = BRepBuilderAPI_MakeEdge(bezier2);
  27. Viewer vout(50, 50, 500, 500);
  28. vout << edge11;
  29. vout << edge12;
  30. vout.StartMessageLoop();
  31. return 0;
  32. }

6、Bezier和直线围城曲面

  1. #include <Geom_BezierCurve.hxx>
  2. #include <BRepBuilderAPI_MakeEdge.hxx>
  3. #include <TopoDS_Edge.hxx>
  4. #include <TopoDS_Wire.hxx>
  5. #include <BRepBuilderAPI_MakeWire.hxx>
  6. #include <TopoDS_Face.hxx>
  7. #include <BRepBuilderAPI_MakeFace.hxx>
  8. #include"Viewer.h"
  9. int main(int argc, char* argv[])
  10. {
  11. gp_Pnt pointsSur1[4] =
  12. {
  13. gp_Pnt(0.0,0.0,0.0),
  14. gp_Pnt(100.0,100.0,0.0),
  15. gp_Pnt(150.0,20.0,0.0),
  16. gp_Pnt(300.0,0.0,0.0)
  17. };
  18. gp_Pnt pointsSur2[4] =
  19. {
  20. gp_Pnt(0.0,0.0,0.0),
  21. gp_Pnt(-20,-50.0,0.0),
  22. gp_Pnt(20.0,-150.0,0.0),
  23. gp_Pnt(100.0,-300.0,0.0)
  24. };
  25. NCollection_Array1<gp_Pnt> pointsFace1(pointsSur1[0], 1, 4);
  26. NCollection_Array1<gp_Pnt> pointsFace2(pointsSur2[0], 1, 4);
  27. Geom_BezierCurve bezierFace1(pointsFace1);
  28. Geom_BezierCurve bezierFace2(pointsFace2);
  29. Handle(Geom_BezierCurve) bezierSur1 = &bezierFace1;
  30. Handle(Geom_BezierCurve) bezierSur2 = &bezierFace2;
  31. TopoDS_Edge edgeSur1 = BRepBuilderAPI_MakeEdge(bezierSur1);
  32. TopoDS_Edge edgeSur2 = BRepBuilderAPI_MakeEdge(bezierSur2);
  33. TopoDS_Edge edgeSur3 = BRepBuilderAPI_MakeEdge(gp_Pnt(300.0, 0.0, 0.0), gp_Pnt(100.0, -300.0, 0.0));
  34. TopoDS_Wire wireSur = BRepBuilderAPI_MakeWire(edgeSur1, edgeSur2, edgeSur3);
  35. TopoDS_Face face = BRepBuilderAPI_MakeFace(wireSur);
  36. Viewer vout(50, 50, 500, 500);
  37. vout << face;
  38. vout.StartMessageLoop();
  39. return 0;
  40. }

7、在曲线上生成点

  1. Handle(Geom_Curve) mycurve = ... ;
  2. GeomAdaptor_Curve C (mycurve);
  3. GCPnts_UniformDeflection myAlgo ();
  4. Standard_Real Deflection = ... ;// 定义容差
  5. myAlgo.Initialize (C, Deflection);
  6. if (myAlgo.IsDone())
  7. {
  8. Standard_Integer nbr = myAlgo.NbPoints();//生成点的个数
  9. Standard_Real param;
  10. for (Standard_Integer i = 1; i <= nbr; i++)
  11. {
  12. param = myAlgo.Parameter (i);// 获取每个点的参数
  13. gp_Pnt p=mycurve->Value(param); //得到点
  14. ...
  15. }
  16. }

8、创建带孔面

 Point->Curve->Edge->Wire->Face

  1. #include <gp_Circ.hxx>
  2. #include <GC_MakeSegment.hxx>
  3. #include <GC_MakeCircle.hxx>
  4. #include <BRepBuilderAPI_MakeEdge.hxx>
  5. #include <TopoDS_Wire.hxx>
  6. #include <BRepBuilderAPI_MakeWire.hxx>
  7. #include <TopoDS_Face.hxx>
  8. #include <BRepBuilderAPI_MakeFace.hxx>
  9. #include <BRepAlgoAPI_Cut.hxx>
  10. #include"Viewer.h"
  11. int main(int argc, char* argv[])
  12. {
  13. gp_Pnt p1(0.0, 0.0, 0.0);
  14. gp_Pnt p2(100.0, 0.0, 0.0);
  15. gp_Pnt p3(100.0, 100.0, 0.0);
  16. gp_Pnt p4(0.0, 100.0, 0.0);
  17. gp_Pnt center(50.0, 50.0, 0.0);
  18. gp_Dir Z(0.0, 0.0, 1.0);
  19. gp_Ax2 coor(center, Z);
  20. gp_Circ circle(coor, 20.0);
  21. Handle(Geom_TrimmedCurve) triCurve1 = GC_MakeSegment(p1, p2);
  22. Handle(Geom_TrimmedCurve) triCurve2 = GC_MakeSegment(p2, p3);
  23. Handle(Geom_TrimmedCurve) triCurve3 = GC_MakeSegment(p3, p4);
  24. Handle(Geom_TrimmedCurve) triCurve4 = GC_MakeSegment(p4, p1);
  25. Handle(Geom_Circle) triCurve5 = GC_MakeCircle(circle); //hole
  26. //Edge,topology
  27. TopoDS_Edge e1 = BRepBuilderAPI_MakeEdge(triCurve1);
  28. TopoDS_Edge e2 = BRepBuilderAPI_MakeEdge(triCurve2);
  29. TopoDS_Edge e3 = BRepBuilderAPI_MakeEdge(triCurve3);
  30. TopoDS_Edge e4 = BRepBuilderAPI_MakeEdge(triCurve4);
  31. TopoDS_Edge e5 = BRepBuilderAPI_MakeEdge(triCurve5);//可以直接接受一个circle
  32. //comibe edge to wire:wire is the assembly of edges, BRepBuilderAPI_MakeWire class can build a wire from one or more edges or connect new edges to an existing wire.
  33. TopoDS_Wire wire = BRepBuilderAPI_MakeWire(e1,e2,e3,e4);
  34. TopoDS_Wire hole = BRepBuilderAPI_MakeWire(e5);
  35. //create face:Use BRepBuilderAPI_MakeFace class to create a face from a surface and wires
  36. TopoDS_Face face = BRepBuilderAPI_MakeFace(wire);
  37. TopoDS_Face holeFace = BRepBuilderAPI_MakeFace(hole);
  38. //Boolean Operation,face-holeFace
  39. TopoDS_Shape shape = BRepAlgoAPI_Cut(face, holeFace);
  40. Viewer vout(50, 50, 500, 500);
  41. vout << shape;
  42. vout.StartMessageLoop();
  43. return 0;
  44. }

9、创建圆形拉伸面

  1. #include <gp_Circ.hxx>
  2. #include <GC_MakeCircle.hxx>
  3. #include <BRepBuilderAPI_MakeEdge.hxx>
  4. #include <TopoDS_Wire.hxx>
  5. #include <BRepBuilderAPI_MakeWire.hxx>
  6. #include <BRepPrimAPI_MakePrism.hxx>
  7. #include"Viewer.h"
  8. int main(int argc, char* argv[])
  9. {
  10. gp_Pnt center(50.0, 50.0, 0.0);
  11. gp_Dir Z(0.0, 0.0, 1.0);
  12. gp_Ax2 coor(center, Z);
  13. gp_Circ circle(coor, 20.0);
  14. Handle(Geom_Circle) triCurve5 = GC_MakeCircle(circle);
  15. TopoDS_Edge e5 = BRepBuilderAPI_MakeEdge(triCurve5);
  16. gp_Vec aPrismVec(0, 0, 20);
  17. TopoDS_Shape myBody = BRepPrimAPI_MakePrism(e5, aPrismVec);//first parameter is TopoDS_Shape
  18. Viewer vout(50, 50, 500, 500);
  19. vout << myBody;
  20. vout.StartMessageLoop();
  21. return 0;
  22. }

10、创建圆形拉伸面

  1. #include <gp_Hypr.hxx>
  2. #include <GC_MakeCircle.hxx>
  3. #include <BRepBuilderAPI_MakeEdge.hxx>
  4. #include <GC_MakeHyperbola.hxx>
  5. #include <BRepBuilderAPI_MakeWire.hxx>
  6. #include <BRepPrimAPI_MakePrism.hxx>
  7. #include"Viewer.h"
  8. int main(int argc, char* argv[])
  9. {
  10. gp_Ax2 cooor(gp_Pnt(0.0, 0.0, 0.0), gp_Dir(0.0, 0.0, 1.0));
  11. gp_Hypr hyperbolaGp(cooor, 20.0, 8.0);
  12. Handle(Geom_Hyperbola) hyperbolaGeom = GC_MakeHyperbola(hyperbolaGp);
  13. TopoDS_Edge edge1 = BRepBuilderAPI_MakeEdge(hyperbolaGeom, 0.1, 1.0);//将双曲线的某一部分形成Edge,至于两个参数如何控制,不懂。
  14. gp_Vec aPrismVec(10, 0, 0);
  15. TopoDS_Shape myBody = BRepPrimAPI_MakePrism(edge1, aPrismVec);
  16. Viewer vout(50, 50, 500, 500);
  17. vout << myBody;
  18. vout.StartMessageLoop();
  19. return 0;
  20. }

11、在曲面上生成点

  1. #include <gp_Sphere.hxx>
  2. #include <BRepBuilderAPI_MakeFace.hxx>
  3. #include <IMeshTools_Parameters.hxx>
  4. #include <BRepMeshData_Face.hxx>
  5. #include <BRepMesh_SphereRangeSplitter.hxx>
  6. #include <TopoDS_Vertex.hxx>
  7. #include <BRepBuilderAPI_MakeVertex.hxx>
  8. #include"Viewer.h"
  9. int main(int argc, char* argv[])
  10. {
  11. std::vector<TopoDS_Shape> verts; //点集合
  12. const Standard_Real pi = 3.1415926;
  13. gp_Sphere aSpere(gp_Ax2(), 10);
  14. TopoDS_Face aSpFace = BRepBuilderAPI_MakeFace(aSpere, 0.0, 2 * pi, -pi / 2, pi / 2);
  15. IMeshTools_Parameters aMeshParams; //离散的准则
  16. aMeshParams.Deflection = .01;
  17. aMeshParams.Angle = 0.1;
  18. aMeshParams.Relative = Standard_False;
  19. aMeshParams.InParallel = Standard_True;
  20. aMeshParams.MinSize = Precision::Confusion();
  21. aMeshParams.InternalVerticesMode = Standard_True;
  22. aMeshParams.ControlSurfaceDeflection = Standard_True;
  23. aMeshParams.InParallel = Standard_False;
  24. BRepMeshData_Face MeshFace(aSpFace, new NCollection_IncAllocator);
  25. BRepMesh_SphereRangeSplitter mySplitter;
  26. mySplitter.Reset(&MeshFace, aMeshParams);
  27. //此处是使BRepMesh_SphereRangeSplitter获得正确的UV参数范围;
  28. //在OCC的Mesh中,在MeshAlgo里边也调用了AddPoint()方法。
  29. BRepAdaptor_Surface BS1(aSpFace);
  30. Standard_Real u_1 = BS1.FirstUParameter();
  31. Standard_Real u_2 = BS1.LastUParameter();
  32. Standard_Real v_1 = BS1.FirstVParameter();
  33. Standard_Real v_2 = BS1.LastVParameter();
  34. gp_Pnt2d p0(u_1, v_1);
  35. gp_Pnt2d p1(u_1, v_2);
  36. gp_Pnt2d p2(u_2, v_1);
  37. gp_Pnt2d p3(u_2, v_2);
  38. //
  39. mySplitter.AddPoint(p0);
  40. mySplitter.AddPoint(p1);
  41. mySplitter.AddPoint(p2);
  42. mySplitter.AddPoint(p3);
  43. mySplitter.AdjustRange();
  44. Handle(IMeshData::ListOfPnt2d) nodes2D = mySplitter.GenerateSurfaceNodes(aMeshParams);
  45. for (auto iter = nodes2D->begin(); iter != nodes2D->end(); iter++) {
  46. gp_Pnt pnd3D = mySplitter.Point(*iter);
  47. TopoDS_Vertex aVer = BRepBuilderAPI_MakeVertex(gp_Pnt((*iter).X(), (*iter).Y(), 0));
  48. verts.push_back(aVer);
  49. }
  50. Viewer vout(50, 50, 500, 500);
  51. std::vector<TopoDS_Shape>::iterator it = verts.begin();
  52. while (it != verts.end())
  53. {
  54. vout << *it;
  55. it++;
  56. }
  57. vout.StartMessageLoop();
  58. return 0;
  59. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/45927
推荐阅读
相关标签
  

闽ICP备14008679号