C# OCCT Winform 界面搭建

2024-06-19 13:20

本文主要是介绍C# OCCT Winform 界面搭建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.创建一个WInform项目

2.代码总览

代码解析

3.添加模型到场景

4.鼠标交互


1.创建一个WInform项目

2.代码总览

using Macad.Occt.Helper;
using Macad.Occt;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Contexts;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Kitware.VTK;
using static System.Net.Mime.MediaTypeNames;namespace OCCTTestProject
{public class OCCTView : Form{private V3d_Viewer _viewer;private AIS_InteractiveContext _context;private WNT_Window _window;private V3d_View _view;protected int myXmin;protected int myYmin;protected int myXmax;protected int myYmax;public OCCTView( ){//InitWindow();}public void InitWindow(){// 创建 OpenGL 驱动var ocGraphicDriver = Graphic3d.CreateOpenGlDriver();// 初始化 Viewer_viewer = new V3d_Viewer(ocGraphicDriver);_viewer.SetDefaultViewSize(1000.0);_viewer.SetDefaultLights();_viewer.SetDefaultViewProj(V3d_TypeOfOrientation.XnegYposZpos);_viewer.SetDefaultBackgroundColor(new Quantity_Color(Quantity_NameOfColor.BLACK));_viewer.SetDefaultVisualization(V3d_TypeOfVisualization.ZBUFFER);_viewer.SetLightOn();// 创建 WNT_Window 并绑定到 Panel 控件_window = new WNT_Window(this.Handle);_window.SetBackground(new Quantity_Color(Quantity_NameOfColor.BLACK));_window.Map();// 创建 View_view = _viewer.CreateView();_view.SetWindow(_window);//AIS_AnimationCamera AisAnimationCamera = new AIS_AnimationCamera(new TCollection_AsciiString("ViewCamera"), _view);// 设置视图属性// 设置小坐标轴 1.位置左下角 2.xyz 字体颜色 3.大小 4.箭头粗细_view.TriedronDisplay(Aspect_TypeOfTriedronPosition.LEFT_LOWER, new Quantity_Color(Quantity_NameOfColor.RED), 0.2, V3d_TypeOfVisualization.WIREFRAME);_view.SetBackgroundColor(new Quantity_Color(Quantity_NameOfColor.RED4));_view.SetBgGradientColors(new Quantity_Color(Quantity_NameOfColor.SKYBLUE), new Quantity_Color(Quantity_NameOfColor.WHEAT), Aspect_GradientFillMethod.Vertical, false);// 配置渲染参数var renderParams = _view.ChangeRenderingParams();renderParams.NbMsaaSamples = 4;renderParams.IsAntialiasingEnabled = true;renderParams.TransparencyMethod = Graphic3d_RenderTransparentMethod.BLEND_OIT;renderParams.Method = Graphic3d_RenderingMode.RASTERIZATION;renderParams.RaytracingDepth = 3;renderParams.IsShadowEnabled = true;renderParams.IsReflectionEnabled = true;renderParams.IsTransparentShadowEnabled = true;// 关闭计算模式并更新视图_view.SetComputedMode(false);_view.Update();_view.MustBeResized();_view.SetImmediateUpdate(false);_view.Redraw();// 创建交互上下文_context = new AIS_InteractiveContext(_viewer);_context.UpdateCurrentViewer();_view.MustBeResized();_view.Redraw();}private void RenderShape(){// 创建一个简单的立方体var box = new BRepPrimAPI_MakeBox(100.0, 100.0, 100.0).Shape();var aisShape = new AIS_Shape(box);// 显示形状_context.Display(aisShape, 1, 1, true); // 实体// _context.Display(aisShape, true); // 线框var sphere = new BRepPrimAPI_MakeSphere(new Pnt(100,100,150),30).Shape();var aissphere = new AIS_Shape(sphere);// 显示形状_context.Display(aissphere,1, 1,true); // 实体// _context.Display(aissphere, true); // 线框// 调整视图_view.FitAll();_view.MustBeResized();_view.Redraw();}protected override void OnResize(EventArgs e){base.OnResize(e);if (_view != null){_view.MustBeResized();_view.Redraw();}}protected override void OnMouseDown(MouseEventArgs e){if(e.Button ==MouseButtons.Left){}else if(e.Button == MouseButtons.Right){SetDegenerateModeOn();StartRotation(e.X, e.Y);}myXmin = e.X; myYmin = e.Y;myXmax = e.X; myYmax = e.Y;}protected override void OnMouseUp(MouseEventArgs e){}protected override void OnMouseMove(MouseEventArgs e){if(e.Button == MouseButtons.Left){Zoom(myXmax, myYmax, e.X, e.Y);myXmax = e.X; myYmax = e.Y;}else if(e.Button == MouseButtons.Right){Rotation(e.X, e.Y);}else if(e.Button == MouseButtons.Middle){Pan(e.X - myXmax, myYmax - e.Y);myXmax = e.X; myYmax = e.Y;}else{Move(e.X, e.Y);}_view.Redraw();}protected void Move(int x, int y){_context.MoveTo(x, y, _view, true);}protected void Zoom(int x1, int y1, int x2, int y2){_view.Zoom(x1, y1, x2,y2);}protected void Rotation(int x, int y){_view.Rotation(x, y);}protected void StartRotation(int x, int y){_view.StartRotation(x, y);}protected void SetDegenerateModeOn(){_view.SetComputedMode(false);_view.Redraw();}protected void Pan(int x, int y){_view.Pan(x,y);}}
}

代码解析

1.OCCT 与 Winform控件建立联系 是通过 WNT_Window  

_window = new WNT_Window(this.Handle);

因为this 是继承了 Form 所以相当于把Form 做为显示界面,和vtk 使用panel 的方式不同。Form 想要作为子控件使用需要通过MDI 方式嵌入到主Form中。

  public Form1(){InitializeComponent();oCCTView = new OCCTView();oCCTView.MdiParent = this;oCCTView.Show();this.WindowState = FormWindowState.Maximized;oCCTView.WindowState = FormWindowState.Maximized;}private void Form1_Load(object sender, EventArgs e){oCCTView.InitWindow();}

  oCCTView.InitWindow(); 这里不放在Load 会报错,原因未知。

2.V3d_Viewer

①SetDefaultViewProj 当前视角

SetDefaultViewProj(V3d_TypeOfOrientation.XnegZpos)

SetDefaultViewProj(V3d_TypeOfOrientation.XnegYposZpos)

②SetLightOn 设置平行光、点光源或聚光灯 

关闭光源时

 _viewer.SetLightOff();

③V3d_View

TriedronDisplay:小坐标轴设置

参数:1.坐标轴位置  2.xyz 字体颜色  3.坐标轴大小  4.箭头粗细

SetBackgroundColor:在不使用SetBgGradientColors情况下设置单一背景色

 _view.SetBackgroundColor(new Quantity_Color(Quantity_NameOfColor.YELLOW));

SetBgGradientColors:创建渐变色背景。

1.渐变起点色

2.渐变终点色

3.渐变方向:水平,垂直,对角线,中心扩散

中心渐变

 renderParams.NbMsaaSamples 抗锯齿 MSAA 是一种抗锯齿技术,用于减少图像中的锯齿边缘。较高的采样数会提供更好的图像质量,但也会增加计算负担。

 renderParams.NbMsaaSamples = 0;             renderParams.NbMsaaSamples = 4;

RaytracingDepth:光线追踪的递归深度。光线追踪是一种渲染技术,通过模拟光线的传播路径来生成图像。较高的深度可以生成更真实的图像,但会增加计算复杂度。

Redraw:更新场景。

MustBeResized:标记视图需要调整大小,并在下次更新时重新计算视图的投影矩阵和其他尺寸相关的参数

3.添加模型到场景

 // 创建一个简单的立方体var box = new BRepPrimAPI_MakeBox(100.0, 100.0, 100.0).Shape();var aisShape = new AIS_Shape(box);// 显示形状_context.Display(aisShape, 1, 1, true); // 实体// _context.Display(aisShape, true); // 线框var sphere = new BRepPrimAPI_MakeSphere(new Pnt(100,100,150),30).Shape();var aissphere = new AIS_Shape(sphere);// 显示形状_context.Display(aissphere,1, 1,true); // 实体// _context.Display(aissphere, true); // 线框// 调整视图_view.FitAll();_view.MustBeResized();_view.Redraw();

线框:

 _view.FitAll(); 调整模型在场景合适位置。

4.鼠标交互

因为 OCCTView  是一个Form 因此直接使用Form的鼠标交互

   protected override void OnResize(EventArgs e){base.OnResize(e);if (_view != null){_view.MustBeResized();_view.Redraw();}}protected override void OnMouseDown(MouseEventArgs e){if(e.Button ==MouseButtons.Left){}else if(e.Button == MouseButtons.Right){SetDegenerateModeOn();StartRotation(e.X, e.Y);}myXmin = e.X; myYmin = e.Y;myXmax = e.X; myYmax = e.Y;}protected override void OnMouseUp(MouseEventArgs e){}protected override void OnMouseMove(MouseEventArgs e){if(e.Button == MouseButtons.Left){Zoom(myXmax, myYmax, e.X, e.Y);myXmax = e.X; myYmax = e.Y;}else if(e.Button == MouseButtons.Right){Rotation(e.X, e.Y);}else if(e.Button == MouseButtons.Middle){Pan(e.X - myXmax, myYmax - e.Y);myXmax = e.X; myYmax = e.Y;}else{Move(e.X, e.Y);}_view.Redraw();}protected void Move(int x, int y){_context.MoveTo(x, y, _view, true);}protected void Zoom(int x1, int y1, int x2, int y2){_view.Zoom(x1, y1, x2,y2);}protected void Rotation(int x, int y){_view.Rotation(x, y);}protected void StartRotation(int x, int y){_view.StartRotation(x, y);}protected void SetDegenerateModeOn(){_view.SetComputedMode(false);_view.Redraw();}protected void Pan(int x, int y){_view.Pan(x,y);}

我也刚刚接触 OCCT 也在学习中,希望互相交流。

这篇关于C# OCCT Winform 界面搭建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075147

相关文章

如何使用Haporxy搭建Web群集

《如何使用Haporxy搭建Web群集》Haproxy是目前比较流行的一种群集调度工具,同类群集调度工具有很多如LVS和Nginx,本案例介绍使用Haproxy及Nginx搭建一套Web群集,感兴趣的... 目录一、案例分析1.案例概述2.案例前置知识点2.1 HTTP请求2.2 负载均衡常用调度算法 2.

CSS3打造的现代交互式登录界面详细实现过程

《CSS3打造的现代交互式登录界面详细实现过程》本文介绍CSS3和jQuery在登录界面设计中的应用,涵盖动画、选择器、自定义字体及盒模型技术,提升界面美观与交互性,同时优化性能和可访问性,感兴趣的朋... 目录1. css3用户登录界面设计概述1.1 用户界面设计的重要性1.2 CSS3的新特性与优势1.

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

C#如何去掉文件夹或文件名非法字符

《C#如何去掉文件夹或文件名非法字符》:本文主要介绍C#如何去掉文件夹或文件名非法字符的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#去掉文件夹或文件名非法字符net类库提供了非法字符的数组这里还有个小窍门总结C#去掉文件夹或文件名非法字符实现有输入字

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

pytest+allure环境搭建+自动化实践过程

《pytest+allure环境搭建+自动化实践过程》:本文主要介绍pytest+allure环境搭建+自动化实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、pytest下载安装1.1、安装pytest1.2、检测是否安装成功二、allure下载安装2.

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L