Open Cascade:使用鼠标画线

Open Cascade:使用鼠标画线

在View类文件中创建以下代码:

 1.创建鼠标消息:

  afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
  afx_msg void OnMouseMove(UINT nFlags, CPoint point); 
 gp_Pnt ConvertClickToPoint(Standard_Real theX, Standard_Real theY, Handle(V3d_View) theView)

2.添加消息映射宏:

ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()

3.实现函数:

复制代码
gp_Pnt ConvertClickToPoint(Standard_Real theX, Standard_Real theY, Handle(V3d_View) theView)
{
Standard_Real XEye,YEye,ZEye,XAt,YAt,ZAt;
theView->Eye(XEye,YEye,ZEye);
theView->At(XAt,YAt,ZAt);
gp_Pnt EyePoint(XEye,YEye,ZEye);
gp_Pnt AtPoint(XAt,YAt,ZAt);

gp_Vec EyeVector(EyePoint,AtPoint);
gp_Dir EyeDir(EyeVector);

gp_Pln PlaneOfTheView = gp_Pln(AtPoint,EyeDir);
Standard_Real X,Y,Z;
theView->Convert(int(theX),int(theY),X,Y,Z);
gp_Pnt ConvertedPoint(X,Y,Z);
gp_Pnt2d ConvertedPointOnPlane = ProjLib::Project(PlaneOfTheView,ConvertedPoint);

gp_Pnt ResultPoint = ElSLib::Value(ConvertedPointOnPlane.X(),
ConvertedPointOnPlane.Y(),
PlaneOfTheView);
return ResultPoint;
}

void CMyOCCView::OnLButtonDown(UINT nFlags, CPoint point)
{
  myPointStart = ConvertClickToPoint(point.x,point.y,myView);
}

void CMyOCCView::OnMouseMove(UINT nFlags, CPoint point)
{

  if(nFlags & MK_LBUTTON){  
    gp_Pnt aPnt = ConvertClickToPoint(point.x,point.y,myView);
    //myView->Rotation(aPnt);
    CMyOCCDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
      return;
    pDoc->DrawLineByMouse(myPointStart, aPnt);
  }
  
}
复制代码

在Doc类文件中创建DrawLineByMouse函数代码:

Doc.h头文件中创建如下代码:

复制代码
public: 
 void DrawLineByMouse(gp_Pnt thePnt1, gp_Pnt thePnt2);

private:    
  gp_Pnt myPntStart;
  gp_Pnt myPntEnd;
  Handle(Geom_TrimmedCurve) mySegment1;
  TopoDS_Edge myEdge1;
  Handle(AIS_Shape) myAISShape;
  Handle(AIS_InteractiveContext) myAISContext;



 
复制代码
在Doc.cpp文件加入实现函数代码:
复制代码
void CMyOCCDoc::DrawLineByMouse(gp_Pnt thePntStart, gp_Pnt thePntEnd)
{
  //检查传入参数
  if(thePntStart.IsEqual(thePntEnd,1e-3))
      return;

  //构建拓扑线段
  Handle(Geom_TrimmedCurve) aSegment = 
  GC_MakeSegment(thePntStart, thePntEnd);
  TopoDS_Edge aEdge = BRepBuilderAPI_MakeEdge(aSegment);

  //将构建的拓扑线段设置至AIS_Shape形状中
  myAISShape->SetShape(aEdge);

 //移除前面绘画的旧线段, 绘制新线段。
 myAISContext->Remove(myAISShape,myViewer);
 myAISContext->Display (myAISShape, Standard_False);

 //更新View
 myAISContext->UpdateCurrentViewer();
}
复制代码

 

OK!!


posted @   余生以学  阅读(1512)  评论(2编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2018-05-29 VS2008 ActiveX(ocx控件)的调试工具ActiveX Control Test Container安装说明
点击右上角即可分享
微信分享提示