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-))
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!!
Open Cascade:使用鼠标画线的更多相关文章
- HTML5自学笔记[ 12 ]canvas绘图小示例之鼠标画线
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 使用JavaScript实现使用鼠标画线的效果
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- MFC画线功能总结
本文仅用于学习交流,商业用途请支持正版!转载请注明:http://www.cnblogs.com/mxbs/p/6216464.html MFC画线功能要点有二:其一,鼠标按下时记录初始位置为线的起始 ...
- MFC消息映射机制以及画线功能实现
---此仅供用于学习交流,切勿用于商业用途,转载请注明http://www.cnblogs.com/mxbs/p/6213404.html. 利用VS2010创建一个单文档标准MFC工程,工程名为Dr ...
- C#使用 DirectX SDK 9做视频播放器 并在视频画线添加文字 VMR9
视频图像处理系列 索引 VS2013下测试通过. 在百度中搜索关键字“DirectX SDk”,或者进入微软官网https://www.microsoft.com/en-us/download/det ...
- 纯JS画点、画线、画圆的方法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- VC动态轨迹画线
分类: 2.4 线程/图形学2010-04-30 22:14 1878人阅读 评论(0) 收藏 举报 文档null 这是一个绘制直线的简单绘图程序,能过实现动态轨迹画线,在拖动时产生临时线来表示可能画 ...
- H5中画图标签Canvas---画矩形,画线,画圆,渐变色,图形载入
一: 1.鼠标监视坐标值 <!DOCTYPE html> <head> <meta charset=UTF-8> <title>canvas的演示< ...
- 计算机图形学DDA画线法+中点画线法+Bresenham画线法
#include <cstdio> #include <cstring> #include <conio.h> #include <graphics.h> ...
随机推荐
- ASP.NET Core:WebAppCoreRESTful
ylbtech-ASP.NET Core:WebAppCoreRESTFul 1.返回顶部 1. 2. 3. 4. 2. Controllers返回顶部 1.HomeControlle ...
- vue随笔2
vue2.0中移除.sync修饰符 .sync可是实现props的双向数据绑定,但是会破坏[单向数据流]的假设.这样的话在改变子组件时,父组件同时也改变,你完全不知道它是何时悄悄地改变了父组件的状态. ...
- HTTP 请求的组成 方法 已经 请求的状态码
HTTP请求是指从客户端到服务器端的请求消息. 包括:消息首行中,对资源的请求方法.资源的标识符及使用的协议.从客户端到服务器端的请求消息包括,消息首行中,对资源的请求方法.资源的标识符及使用的协议. ...
- nodejs supvisor模块
在测试nodejs程序的时候,每次都需要在控制台编译,非常的麻烦.supervisor是一款无需重复手动编译,自动后台监听文件变化来自动编译,并且不需要在项目内require,使用非常的方便. 使用方 ...
- 启动和测试oracle是否安装成功
转自:https://www.cnblogs.com/justdo-it/articles/5112576.html 测试步骤1:请执行操作系统级的命令:tnsping orcl 测试步骤 2:请执行 ...
- div 加滚动条的方法
div 加滚动条的方法: <div style="position:absolute; height:400px; overflow:auto"></div> ...
- Codeforces Round #408 (Div. 2) C.Bank Hacking(二分)
传送门 题意 给出n个银行,银行之间总共有n-1条边,定义i与j有边相连为neighboring,i到j,j到k有边,则定义i到k的关系为semi- neighboring, 每家银行hack的难度为 ...
- 51nod 1433【数学】
思路: 不晓得阿,n%9==0即n数值各个位加起来要%9==0: 如果知道这个,那么%90==0就是末尾多个0就好了,那么后面就是随便搞吧: #include <stdio.h> #inc ...
- poj 1988 Cube Stacking【带权并查集】
设s[x]为x所在栈里的个数,c[x]表示x下面有几个,合并的时候直接合并s,然后路径压缩的时候更新c即可 #include<iostream> #include<cstdio> ...
- 洛谷P2219 [HAOI2007]修筑绿化带(单调队列)
传送门 啧……明明以前做到过这种类型的题结果全忘了…… 这种矩阵的,一般都是先枚举行,然后对列进行一遍单调队列,搞出右下角在每一行中合法位置时的最小权值 再枚举列,对行做一遍单调队列,用之前搞出来的最 ...