Geom2d模块案例

 如下案例进行了 2d平面点,线,圆,线段,圆弧的创建,及曲线求交点,曲线偏置操作,以及将2d平面曲线转3d平面进行显示。

void ViewWindow::OnGen2dCurve()
{
      _ctrlUi->listView->Clear();
      try
      {

          //构造2d线段 
          gp_Pnt2d point11(10.328, 5.492);
          gp_Pnt2d point12(30, 35);
          gp_Vec2d vector1(point11, point12);
          Handle(Geom2d_Line) line1=new Geom2d_Line(point11, vector1);

          Handle(Geom2d_TrimmedCurve) Curve1=new Geom2d_TrimmedCurve(line1,0, vector1.Magnitude() );
		  // 获取线段的起点和终点
		  gp_Pnt2d trimmedStartPoint = Curve1->Value(0.0);
		  gp_Pnt2d trimmedEndPoint = Curve1->Value(vector1.Magnitude());

		  qDebug()<< "Trimmed curve start point: (" << trimmedStartPoint.X() << ", " << trimmedStartPoint.Y() << ")";
          qDebug() << "Trimmed curve end point: (" << trimmedEndPoint.X() << ", " << trimmedEndPoint.Y() << ")";

		  gp_Pnt2d point21(21.372, 37.633);
		  gp_Pnt2d point22(42.715, 22.798);
          gp_Vec2d vector2(point21, point22);
          Handle(Geom2d_Line)  line2=new Geom2d_Line(point21, vector2);
          Handle(Geom2d_TrimmedCurve) Curve2= new Geom2d_TrimmedCurve(line2, 0, vector2.Magnitude());

		  gp_Pnt2d point31(27.593, 23.851);
		  gp_Pnt2d point32(35.728, 10.643);
		  gp_Vec2d vector3(point31, point32);
		  Handle(Geom2d_Line)  line3 = new Geom2d_Line(point31, vector3);
		  Handle(Geom2d_TrimmedCurve) Curve3 = new Geom2d_TrimmedCurve(line3, 0, vector3.Magnitude());


          //求两个线段的交点
          Geom2dAPI_InterCurveCurve  Inter12(Curve1, Curve2);

		  if ( Inter12.NbPoints() > 0)
		  {
			  const gp_Pnt2d intersectionPoint12 = Inter12.Point(1);
			  const Standard_Real x12 = intersectionPoint12.X();
			  const Standard_Real y12 = intersectionPoint12.Y();

			  qDebug() << "Intersection Point12: (" << x12 << ", " << y12 << ")";

		  }


		  Geom2dAPI_InterCurveCurve  Inter13(Curve1, Curve3);

          IntAna2d_AnaIntersection InterLine13(line1->Lin2d(), line3->Lin2d());

		  if (Inter13.NbPoints() > 0)
		  {
			  const gp_Pnt2d intersectionPoint13 = Inter13.Point(1);
			  const Standard_Real x13 = intersectionPoint13.X();
			  const Standard_Real y13 = intersectionPoint13.Y();
			  qDebug() << "Intersection Point13: (" << x13 << ", " << y13 << ")";

		  }
		  if (InterLine13.IsDone()&&InterLine13.NbPoints() > 0 )
		  {
			  const IntAna2d_IntPoint& intersectionPoint13 = InterLine13.Point(1);
			  const Standard_Real x13 = intersectionPoint13.Value().X();
			  const Standard_Real y13 = intersectionPoint13.Value().Y();
			  qDebug() << "Intersection PointLine13: (" << x13 << ", " << y13 << ")";

		  }

          //求直线与圆弧的交点
		  Handle(Geom2d_Circle)  Circle1 = new Geom2d_Circle(gp_Ax2d(gp_Pnt2d(15.202, 13.905), gp_Dir2d(1, 0)), 9.722);
		  Handle(Geom2d_TrimmedCurve) CurveCircle1 = new Geom2d_TrimmedCurve(Circle1, M_PI, 2*M_PI);
          Geom2dAPI_InterCurveCurve  InterLine1Circle1(Curve1, Circle1, Precision::Confusion());
		  for (int i = 1; i <= InterLine1Circle1.NbPoints(); i++) {
			  gp_Pnt2d interPoint = InterLine1Circle1.Point(i);
              qDebug() << "InterLine1Circle1" << i << "(" << interPoint.X() << "," << interPoint.Y() << ")";
		  }

		  Geom2dAPI_InterCurveCurve  InterLine1CurveCircle1(Curve1, CurveCircle1, Precision::Confusion());
		  for (int i = 1; i <= InterLine1CurveCircle1.NbPoints(); i++) {
			  gp_Pnt2d interPoint = InterLine1CurveCircle1.Point(i);
			  qDebug() << "InterLine1CurveCircle1" << i << "(" << interPoint.X() << "," << interPoint.Y() << ")";
		  }

		  //求圆弧与圆弧的交点
		  Handle(Geom2d_Circle)  Circle2 = new Geom2d_Circle(gp_Ax2d(gp_Pnt2d(21.996, 5.928), gp_Dir2d(1, 0)), 5.622);
		  Handle(Geom2d_TrimmedCurve) CurveCircle2 = new Geom2d_TrimmedCurve(Circle2, 0, M_PI);
		  Geom2dAPI_InterCurveCurve  InterCircle1Circle2(Circle1, Circle2, Precision::Confusion());
		  for (int i = 1; i <= InterCircle1Circle2.NbPoints(); i++) {
			  gp_Pnt2d interPoint = InterCircle1Circle2.Point(i);
			  qDebug() << "InterCircle1Circle2" << i << "(" << interPoint.X() << "," << interPoint.Y() << ")";
		  }

		  Geom2dAPI_InterCurveCurve  InteCurveCircle1CurveCircle2(CurveCircle1, CurveCircle2, Precision::Confusion());
		  for (int i = 1; i <= InteCurveCircle1CurveCircle2.NbPoints(); i++) {
			  gp_Pnt2d interPoint = InteCurveCircle1CurveCircle2.Point(i);
			  qDebug() << "InteCurveCircle1CurveCircle2" << i << "(" << interPoint.X() << "," << interPoint.Y() << ")";
		  }

          //偏移直线

		  gp_Pnt2d point51(0,0);
		  gp_Pnt2d point52(0, 10);
		  gp_Vec2d vector5(point51, point52);
		  Handle(Geom2d_Line) line5 = new Geom2d_Line(point51, vector5);

		  Handle(Geom2d_TrimmedCurve) Curve5 = new Geom2d_TrimmedCurve(line5, 0, vector5.Magnitude());

		  Handle(Geom2d_OffsetCurve) OffsetLineCurve5 = new Geom2d_OffsetCurve(Curve5, 0.2);

		  double firstParOffsetLineCurve5 = OffsetLineCurve5->FirstParameter();
		  double lastParOffsetLineCurve5 = OffsetLineCurve5->LastParameter();
           
          gp_Pnt2d OffsetLineCurve1Point51= OffsetLineCurve5->Value(firstParOffsetLineCurve5);
          gp_Pnt2d OffsetLineCurve1Point52 = OffsetLineCurve5->Value(lastParOffsetLineCurve5);
          qDebug() << "OffsetLineCurve5 Point1: (" << OffsetLineCurve1Point51.X() << ", " << OffsetLineCurve1Point51.Y() << ")";

		  qDebug() << "OffsetLineCurve5 Point2: (" << OffsetLineCurve1Point52.X() << ", " << OffsetLineCurve1Point52.Y() << ")";


          //偏移曲线
          Handle(Geom2d_OffsetCurve) OffsetCircleCurve1=new Geom2d_OffsetCurve(CurveCircle1,0.2);
       
          double firstParOffsetCircleCurve1 = CurveCircle1->FirstParameter();
          double lastParOffsetCircleCurve1 = CurveCircle1->LastParameter();
          //
          Handle(Geom2d_OffsetCurve) OffsetCircleCurve2 = new Geom2d_OffsetCurve(CurveCircle2, 0.2);
		  double firstParOffsetCircleCurve2 = CurveCircle2->FirstParameter();
		  double lastParOffsetCircleCurve2 = CurveCircle2->LastParameter();


          Geom2dAPI_InterCurveCurve  InteOffsetCircleCurve1OffsetCircleCurve2(OffsetCircleCurve1, OffsetCircleCurve2, Precision::Confusion());
		  for (int i = 1; i <= InteOffsetCircleCurve1OffsetCircleCurve2.NbPoints(); i++) {
			  gp_Pnt2d interPoint = InteOffsetCircleCurve1OffsetCircleCurve2.Point(i);
			  qDebug() << "InteOffsetCircleCurve1OffsetCircleCurve2" << i << "(" << interPoint.X() << "," << interPoint.Y() << ")";
		  }

          //定义圆弧6与圆弧7,直线8
	
		  Handle(Geom2d_Circle)  Circle6 = new Geom2d_Circle(gp_Ax2d(gp_Pnt2d(41.277, -12.47), gp_Dir2d(1, 0)), 49.418);
		  Handle(Geom2d_TrimmedCurve) CurveCircle6 = new Geom2d_TrimmedCurve(Circle6,  94.481 * M_PI/180, 98.82 * M_PI / 180, Standard_True);
          CurveCircle6->Reverse();
		  gp_Pnt2d CurveCircle6Point1 = CurveCircle6->Value(CurveCircle6->FirstParameter());
		  gp_Pnt2d CurveCircle6Point2 = CurveCircle6->Value(CurveCircle6->LastParameter());
		  qDebug() << "CurveCircle6Point1: (" << CurveCircle6Point1.X() << ", " << CurveCircle6Point1.Y() << ")";

		  qDebug() << "CurveCircle6Point2: (" << CurveCircle6Point2.X() << ", " << CurveCircle6Point2.Y() << ")";


		  gp_Pln plane(gp::XOY()); // 创建一个平行于 XY 平面的平面
		  Handle(Geom_Plane) surface = new Geom_Plane(plane);

		  BRepBuilderAPI_MakeEdge edgeCurveCircle1_shape(CurveCircle6, surface);

		  Handle(AIS_Shape) CurveCircle1_shape = new AIS_Shape(edgeCurveCircle1_shape.Shape());
          _ctrlUi->listView->RecordModel(CurveCircle1_shape, QString("CurveCircle1_shape"));
          CurveCircle1_shape->SetColor(Quantity_NOC_YELLOW);

          //偏移曲线
		  Handle(Geom2d_OffsetCurve) OffsetCurveCircle6 = new Geom2d_OffsetCurve(CurveCircle6, 0.2);

		  double firstParOffsetCurveCircle6 = OffsetCurveCircle6->FirstParameter();
		  double lastParOffsetCurveCircle6 = OffsetCurveCircle6->LastParameter();

		  gp_Pnt2d OffsetCurveCircle6Point1 = OffsetCurveCircle6->Value(firstParOffsetCurveCircle6);
		  gp_Pnt2d OffsetCurveCircle6Point2 = OffsetCurveCircle6->Value(lastParOffsetCurveCircle6);
		  qDebug() << "OffsetCurveCircle6Point1: (" << OffsetCurveCircle6Point1.X() << ", " << OffsetCurveCircle6Point1.Y() << ")";

		  qDebug() << "OffsetCurveCircle6Point2: (" << OffsetCurveCircle6Point2.X() << ", " << OffsetCurveCircle6Point2.Y() << ")";
		  BRepBuilderAPI_MakeEdge edgeOffsetCurveCircle6_shape(OffsetCurveCircle6, surface);

		  Handle(AIS_Shape) OffsetCurveCircle6_shape = new AIS_Shape(edgeOffsetCurveCircle6_shape.Shape());
		  _ctrlUi->listView->RecordModel(OffsetCurveCircle6_shape, QString("OffsetCurveCircle6_shape"));
          OffsetCurveCircle6_shape->SetColor(Quantity_NOC_RED);



          _view->fitAll();
      }
      catch (Standard_Failure const& theFailure)
      {
          qDebug() << "info: " << theFailure.GetMessageString();
      }



}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值