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 界面搭建
目录 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.Co…...

System.Dynamic.ExpandoObject的使用说明
官方文档 ExpandoObject 类 (System.Dynamic) | Microsoft Learn https://learn.microsoft.com/zh-cn/dotnet/api/system.dynamic.expandoobject?viewnet-8.0 System.Dynamic.ExpandoObject 类 - .NET | Microsoft Learn https://learn.microsoft.com/zh-cn/dotnet/fundame…...
adb之ps命令用法
目录 前言一、命令参数二、输出结果含义 前言 在adb shell终端,输入 ps,可查看手机当前所有的进程状态,其中ps的英文全称是Process Status。 ps命令对于分析系统异常情况时都是必备的技能,需要通过这个简单命令来查看系统真实的状…...

Ubuntu-24.04-live-server-amd64安装界面中文版
系列文章目录 Ubuntu安装qemu-guest-agent Ubuntu-24.04-live-server-amd64启用ssh Ubuntu乌班图安装VIM文本编辑器工具 文章目录 系列文章目录前言一、准备工作二、开始安装三、测试效果总结 前言 Centos结束,转战Ubuntu。我之所以写这篇文章,是因为我…...

Git的3个主要区域
一般来说,日常使用只要记住下图6个命令,就可以了。但是熟练使用,恐怕要记住60~100个命令。 下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 Workspace:工作区 Index / Stage:暂存区 Reposito…...

【操作系统】操作系统实验02-生产者消费者程序改进
1. 说明文档中原有程序实现的功能、实现方法。(用语言、程序流程图、为原有程序添加注释等方式均可) 1.//const.h 2.//定义宏变量 3.#ifndef CONST_H 4.#define CONST_H 5. 6.#define TRUE 1 7.#define FALSE 0 8.#define ERROR 0 9.#define OVERFLOW -…...
TCP协议是安全的吗?
不安全 虽然 TCP 提供了一种可靠且高效的数据传输方式,但它不提供任何加密或身份验证机制来保护数据。因此,传输的数据可能会被未经授权的用户拦截和读取,而且其真实性无法验证。 因此,为了确保 TCP 通信的安全,必须…...

c语言回顾-结构体(2)
前言 前面讲了结构体的概念,定义,赋值,访问等知识,本节内容小编将讲解结构体的内存大小的计算以及通过结构体实现位段,话不多说,直接上干货!!! 1.结构体内存对齐 说到计…...

Prometheus常见exporter安装部署
Prometheus常见exporter安装部署 在稳定性环境的监控当中需要收集各种各样的数据,这样的数据收集是通过各种exporter进行的,在这里我们进行最常用稳定性数据的收集exporter安装部署介绍。 node_exporter安装部署 node_exporter主要监控服务器本身的一…...

DGit的使用
将Remix连接到远程Git仓库 1.指定克隆的分支和深度 2.清理,如果您不在工作区上工作,请将其删除或推送至 GitHub 或 IPFS 以确保安全。 为了进行推送和拉取,你需要一个 PAT — 个人访问令牌 当使用 dGIT 插件在 GitHub 上推送、拉取、访问私…...

ElasticSearch学习篇13_《检索技术核心20讲》进阶篇之LSM树
背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243,文档形式记录笔记。 内容 磁盘和内存数据读取特点 工业界中数据量往往很庞大,比如数据无法全部加载进内存,无法支持索引的高效实时更新&…...

简单好用的C++日志库spdlog使用示例
文章目录 前言一、spdlog的日志风格fmt风格printf风格 二、日志格式pattern三、sink,多端写入四、异步写入五、注意事项六、自己封装了的代码usespdlog.h封装代码解释使用示例 前言 C日志库有很多,glog,log4cpp,easylogging, eas…...
python 方法运行计时装饰模式实现
在代码开发过程中,需要记录方法的执行时间,每个方法都硬代码也可以实现,但是不是最好的方式,考虑到设计模式和模版代码,通过装饰模式实现方法运行计时 在Python中,装饰器可以接受参数,这样可以…...

【权威出版/投稿优惠】2024年水利水电与能源环境科学国际会议(WRHEES 2024)
2024 International Conference on Water Resources, Hydropower, Energy and Environmental Science 2024年水利水电与能源环境科学国际会议 【会议信息】 会议简称:WRHEES 2024 大会时间:点击查看 截稿时间:点击查看 大会地点:…...

阿赵UE引擎C++编程学习笔记——场景加载和切换
大家好,我是阿赵。 继续学习UE引擎,这次来学习一下切换和加载场景的各种做法。 一、 蓝图实现 1、 切换关卡 所谓切换关卡,就是从当前关卡进入到一个新的关卡, 旧关卡的数据将会被放弃。进入新的关卡后,将会执行…...

【LLM之RAG】RAFT论文阅读笔记
研究背景 论文针对的主要问题是如何将预训练的大型语言模型(LLMs)适应特定领域的检索增强生成(RAG)。这些模型通常在广泛的文本数据上进行预训练,已经表现出在广义知识推理任务上的优越性能。然而,在特定领…...

【Android】使用Binder(AIDL)实现利用自定义Bean进行的进程间通信(二)
项目前置 这是我之前写的关于Binder的一些知识点和使用基本数据类型在通信的文章,感兴趣的可以看一下: Binder(一)Binder的介绍和AIDL使用Binder的实例 项目目标 在两个APP之间进行数据传递,使用Android推荐的Binder通讯&#…...
HTTP中get与post的区别?在传输数据类型上有什么区别?【面试】
HTTP中的GET和POST是两种最常见的请求方法,它们在数据传输和使用场景上有一些关键的区别: GET请求: 数据传输方式:GET请求将数据附加在URL之后,形成查询字符串(namevalue的形式),数…...

「51媒体-年中大促」天津有哪些媒体资源-媒体宣传服务公司
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 天津的媒体资源相当丰富,涵盖了报纸、电视、广播、新闻门户网站、央媒驻天津机构、视频媒体以及全国媒体资源等多个方面。以下是详细的媒体资源分类和具体信息: 一…...

Thinkphp校园新闻发布系统源码 毕业设计项目实例
Thinkphp校园新闻发布系统源码 毕业设计项目实例 校园新闻发布系统模块: 用户模块:注册,登陆,查看个人信息,修改个人信息,站内搜索,新闻浏览等功能, 后台管理员模块:会员…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...

麒麟系统使用-进行.NET开发
文章目录 前言一、搭建dotnet环境1.获取相关资源2.配置dotnet 二、使用dotnet三、其他说明总结 前言 麒麟系统的内核是基于linux的,如果需要进行.NET开发,则需要安装特定的应用。由于NET Framework 是仅适用于 Windows 版本的 .NET,所以要进…...