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

相关文章

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

C# dateTimePicker 显示年月日,时分秒

dateTimePicker默认只显示日期,如果需要显示年月日,时分秒,只需要以下两步: 1.dateTimePicker1.Format = DateTimePickerFormat.Time 2.dateTimePicker1.CustomFormat = yyyy-MM-dd HH:mm:ss Tips:  a. dateTimePicker1.ShowUpDown = t

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

C# 防止按钮botton重复“点击”的方法

在使用C#的按钮控件的时候,经常我们想如果出现了多次点击的时候只让其在执行的时候只响应一次。这个时候很多人可能会想到使用Enable=false, 但是实际情况是还是会被多次触发,因为C#采用的是消息队列机制,这个时候我们只需要在Enable = true 之前加一句 Application.DoEvents();就能达到防止重复点击的问题。 private void btnGenerateSh

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };