C# OCCT Winform 界面搭建

news2024/11/20 10:32:41

目录

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 也在学习中,希望互相交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1838135.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习课程复习——支持向量机

支持向量机是一种二类分类模型。基本模型:定义在特征空间上的间隔最大的线性分类器模型升级:线性分类器+核技巧=非线性分类器学习策略:间隔最大化(可形式化为求解凸二次规划的问题;可等价于正则化的合页损失函数的最小化问题)学习算法:求解图二次规划的最优化算法支持向…

什么是Linux挂载

首先先说一下在Linux中一切皆文件(硬件设备也是文件),所有文件都是存放在以根目录为树形目录结构中;下面来说说一下什么是挂载 挂载:指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是…

架构师篇-1、总体架构设计

业务架构哲学本质 定位:赋予业务架构设计能力,具备业务架构设计思维模型,掌握业务架构哲学本质,形成以不变应万变的业务架构设计能力。 架构师所需要的能力: 带领业务成功通过框架思维赋能业务架构师知识体系构建掌…

如何卸载windows系统自带游戏

为了清晰地指导如何卸载Windows系统自带游戏,我们可以参考以下步骤进行: 方法一:通过控制面板卸载 打开控制面板进入程序和功能在控制面板中,找到并点击“程序和功能”。在程序列表中,找到你想要卸载的自带游戏。 方…

反激开关电源压敏电阻选型及计算

作用:在浪涌时间里面吸收一个很高的浪涌电压 压敏电阻对电压敏感,有变阻电压阈值 在电压阈值以下,表现出阻抗很大,超过电压阈值,表现出阻抗很小 压敏的选型及计算 压敏电阻的作用是抑制来自电源在异常时的尖峰电压和瞬态过电压&a…

C++编程入门,五个学习阶段让你变成高手

C是一门非常复杂而强大的编程语言,涵盖了广泛的知识领域,从语法基础到高级特性,再到网络通信和数据库操作,都需要逐步掌握。如果你是一个编程新手,尤其是对C感兴趣的新手,可能会发现这门语言的学习曲线有些…

【Linux】进程间通信3——system V共享内存

1.system V进程间通信 管道通信本质是基于文件的,也就是说操作系统并没有为此做过多的设计工作,而system V IPC是操作系统特地设计的一种通信方式。但是不管怎么样,它们的本质都是一样的,都是在想尽办法让不同的进程看到同一份由操…

HTML静态网页成品作业(HTML+CSS)——新媒体专业介绍介绍网页(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…

韩国裸机云站群服务器托管租用方案

随着网络技术的飞速发展,站群服务器在网站运营中扮演着越来越重要的角色。韩国裸机云站群服务器,以其独特的优势,如地理位置优越、价格相对较低、技术实力雄厚等,吸引了众多企业的关注。本文将为您详细介绍韩国裸机云站群服务器的…

机器学习课程复习——朴素贝叶斯

1. 定义 是一种基于贝叶斯定理与特征条件独立假设的生成式分类方法。 2. 公式 原版公式 简化版公式 由于上述公式无法计算,引入条件独立假设 条件独立版公式 3. 贝叶斯分类器 由上述公式可得贝叶斯分类器 化简为 4. 参数估计 4.1. 极大似然估计 4.2. 学习与分…

Psim仿真教程-电路仿真软件功能介绍/电源工程师初级到高级进阶之路

点击下面文字下载需要的版本: Psim2022中文版下载链接: Psim2022中文版软件下载地址 Psim9.1经典版本下载链接: Psim 9.1软件下载地址 有了Psim仿真软件后,无论是电气系统设计还是软件控制设计,都让自己有了质的提升,因此对控制领域感兴趣的朋友们,一定要跟着作者去…

ruoyi框架第二天,自定义接口,在若依框架显示数据

书接上文,搭建好若依,并且创建自己想要的模块。 让ruoyi框架显示自己想要的模块。 今天,我们就要自定义接口,模仿ruoyi框架收发数据模式,来创建自己的模块。 我们创建好自己想要的接口,我这个是无参的查…

【面试干货】Java方法重载规则

【面试干货】Java方法重载规则 1、方法重载的规则和注意事项1.1 方法名必须一致1.2 参数列表必须不同1.3 代码示例1.4 与方法的返回值无关1.5 存在于父类和子类或同类中1.6 可以抛出不同的异常1.7 可以有不同的修饰符 2、注意事项3、总结 💖The Begin💖点…

据APO Research(阿谱尔)统计,2023年全球乳酸企业产能约119.3万吨

乳酸又称 2-羟基丙酸,一种天然有机酸,分子式是 C3H6O3。是自然界中最为广泛存在的羟基酸,于 1780 年被瑞典科学家 Scheele 首次发现。乳酸是自然界最小的手性分子,以两种立体异构体的形式存在于自然界中,即左旋型 L-乳…

白酒:酒文化传承中的挑战与机遇

随着时代的变迁,酒文化传承面临着许多挑战与机遇。我们来看看酒文化传承面临的挑战。随着现代生活方式的改变,人们对于传统酒文化的认知逐渐淡化。与此同时,年轻一代对于酒文化的兴趣不如老一辈浓厚,这使得酒文化的传承面临断层的…

001、DM8安装

参照:https://eco.dameng.com/document/dm/zh-cn/pm/install-uninstall.html 1. 准备工作 操作系统查看 [rootora19c ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core)新建用户 [rootora19c ~]# groupadd dinstall -g 2001 [rootora19c ~]# …

聚观早报 | 小米15配置规格曝光;比亚迪车险开售

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 6月19日消息 小米15配置规格曝光 比亚迪车险开售 真我GT6细节曝光 极星汽车加速全球扩张 Model 3高性能版开启交…

部署LVS-NAT群集

目录 LVS-NAT模式部署 ​1.准备工具 2.所有虚拟机初始化 3.配置NFS共享存储(20.0.0.40) 3.1安装软件包 3.2创建共享目录和测试文件 4.web服务器部署(20.0.0.20 20.0.0.30配置相同) 4.1yum安装nginx服务 4.2测试nfs共享服…

SpringCloud Alibaba Sentinel基础入门与安装

GitHub地址:https://github.com/alibaba/Sentinel 中文文档:https://sentinelguard.io/zh-cn/docs/introduction.html 下载地址:https://github.com/alibaba/Sentinel/releases Spring Cloud Alibaba 官方说明文档:Spring Clou…

Handler机制

目录 一、简介二、相关概念解释2.1 Message(消息)2.2 Handler(处理器)2.2.1 Handler的构造方法2.2.2 Handler sendMessage()相关的方法2.2.3 Handler dispatchMessage()方法 2.3 Mes…