OCC教学:预备基础

预备基础:1.概览

什么是Open CASCADE Technology?

Open CASCADE Technology (OCCT) 是一个功能强大的开源 C++ 库,由数千个类组
成,并提供以下领域的解决方案:

  • 表面和实体建模:对任何对象进行建模。
  • 3D 和 2D 可视化:显示对象并为其设置动画。
  • 数据交换:导入和导出标准 CAD 格式。
  • 快速应用程序开发:操作自定义应用程序数据。
    OCCT 还适用于 CAD/CAM/CAE 的许多其他领域,包括 AEC、GIS 和 PDM。OCCT 专为需要良好质量、可靠性和强大工具集的 3D 建模和可视化应用程序的工业开发而设计。
    OCCT 库在 GNU 宽通用公共许可证 (LGPL) 版本 2.1 下以开源方式分发给多个平台。
怎么获取OCCT?

您可以通过以下方式获取 Open CASCADE Technology:

  • 从官方网站下载版本:
    • 在OPEN CASCADE公司官方网站上创建帐户。
    • 注册后,您将可以访问下载页面。
  • 从源码(Git 存储库)构建 OCCT。
    要从官方 Git 存储库获取 OCCT 源码,应该:
  • 在协作开发门户上创建一个帐户。
  • 克隆 OCCT Git 存储库(使用您的 ssh 密钥)。
  • 下载必要的第3方库。
    下载 OCCT 源代码后,可以使用 CMake 为 IDE 生成项目文件。
从源码构建

从源码构建 OCCT 涉及几个步骤:

  1. 下载OCCT源码;
  2. 下载必要的第三方库(TCL 和 FreeType 是标准构建的最低要求);
  3. 配置CMake:
    1. 点击“configure”按钮;
    2. 设置 3RDPARTY_DIR 变量指向解压的第三方文件夹;
    3. 将 INSTALL_DIR 更改为所需的目录;
    4. 启用必要的功能;
    5. 如果不需要OCCT开发环境,则启用 BUILD_USE_PCH 以使用预编译头加速计算;
  4. 再次点击“configure”按钮;
  5. 点击“generate”按钮。
源码包中的内容是什么?
对象库

对象库分为模块:

  • Foundation classes
  • Modeling data
  • Modeling algorithms
  • Visualization
  • Data exchange
  • Shape healing
  • Applicattion framework(OCAF)
    每个模块包含多个库,每个库包含分组到包中的类:
    在这里插入图片描述
文档
  • 从 Doxygen 注释自动生成;
  • 手动编写的用户和开发人员指南。
编程示例

使用不同 GUI 的编程示例:

  • MFC
  • C#
  • Qt
  • Java
测试套件应用
  • 基于 TCL 的命令解释器
  • 一组预定义的命令
  • 大多数 OCCT API 都可以在测试套件( Test Harness )中使用
  • Test Harness 是 OCCT的原型框架
  • 该应用程序用于测试 OCCT本身
应该提前了解的内容

必修知识:

  • C++面向对象语言
  • 编程技术
  • 常见数学、代数、几何
    可选知识:
  • 计算机辅助设计基础
文献书籍

![[Pasted image 20231116114543.png]]

![[Pasted image 20231116114657.png]]

性能提示
并行模式

一些算法具有并行模式:

  • BRepAlgoAPI
  • BRepMesh_IncrementalMesh
  • BVH Tree construction
Part-related

使用简单的对象可以获得更好的性能:

  • C2连续性;
  • 低阶样条;
  • 小结点矢量
    尽可能使用规范几何:
  • 许多算法的有效实现
    使用拓扑信息代替几何数据:
  • 数据共享、连接等
数据模型

利用数据共享。这种技术称为实例化:

  • 多次使用同一形状部分,对它们进行不同的变换
  • 此外,这个概念可以在可视化级别上重复使用(AIS Connected Interactives)
可视化

尽量保持渲染批次的数量尽可能少:

  • 每批次都涉及相应的 OpenGL 操作集 (glDrawArrays /gIDrawElements)。这些调用的计算成本很高。
  • 大量的渲染批次会影响CPU性能。每个组应在 CPU 端单独处理。对于 OpenGL,该过程以单线程模式工作。
编写程序
  • 对于大阶矩阵,不要使用 OCCT 线性代数,因为它是为低阶输入设计的;
  • 使用 OCCT 分配器来避免动态内存分配;
  • 使用 BVH 等加速数据结构;
  • 尽可能使用局部操作;
  • 在布尔算法之后使用面(face)最大化;
  • 避免使用 NCollection_Sequence。请改用 NCollection_Vector 或NCollection_List。

预备基础:2.Draw

什么是Draw?

Draw 是OCCT的基本测试工具。它提供:

  • 基于TCL语言的命令解释器;
  • 一组预定义的命令;
  • 添加自定义命令的可能性
    可以创建和操作、保存和恢复实体,在视图中显示它们等。Draw 可以是用于自动化测试等的自定义场景的原型。OCCT发行版是名为 DRAWEXE 的 Draw 可执行文件的即用型实现。按如下方式启动:
    ![[Pasted image 20231116141909.png]]

DRAWEXE 提供了一个用于从插件库加载新命令的接口。技术模块中定义的绘
制命令被组织到此类插件中,并且可以通过运行 pload 命令加载到 DRAWEXE。
pload [-PluginResourceFile] [Key1] [key2] …
Draw 插件的默认资源文件是 %CASROOT%/src/DrawResources/DrawPlugin,它
收集所有标准插件的定义。为了加载所有标准绘图命令,请运行:
Draw[1]> pload ALL

Draw命令语言

命令由一个或多个单词组成:第一个单词是命令的名称,其他单词是参数。单词之间用空格或制表符分隔。以下命令构造一个盒子:
Draw[1]> box b 10 10 10
命令由换行符或分号分隔:
Draw[1]> box b 10 10 10; fit
可以使用 source命令从文件中读取命令:
Draw[1]> source myscript.txt

基础命令

help 命令提供有关命令的帮助:
Draw[1]> help [command]
exit命令终止程序执行:
Draw[1]> exit
source 命令从文件中读取命令:
Draw[1]> source box
directory 命令用于返回与模式匹配的所有绘制全局变量的列表:
Draw[1]> directory [command]
Whatis 命令获取有关Draw变量的信息:
Draw[1]> whatis <varname>
dump 命令获取有关Draw变量的长信息:
Draw[1]> dump <varname>
save 将Draw变量的值放入文件中
Draw[1]> save <varname> <filename>
restore 将文件的内容放入Draw变量中:
Draw[1]> restore <filename> <varname>

视图命令

Draw 提供了一组标准的屏幕布局命令:
Draw[1]> axo; pers; top; bottom; left; right; front; back; mu4; v2d; av2d
wzoom 命令允许用鼠标选择要缩放的区域:
Draw[1]> wzoom
平移视图的命令:
Draw[1]> pu; pd; pr; pl; 2pdu; 2dpd; 2dpr; 2dpl
向上、向下、向右、向左旋转视图的命令:
Draw[1]> u; d; l; r;
display 命令使对象可见:
Draw[1]> display <varname> [ … ]
donly 命令使对象可见并删除所有其他对象:
Draw[1]> donly <varname> [ … ]
erase 命令从所有视图中擦除对象:
Draw[1]> erase <varname> [ … ]
从视图中清除对象的命令:
Draw[1]> clear; 2dclear

3D视图命令

vinit 命令初始化 3D 视图:
Draw[1]> vinit
vdisplay 命令使对象可见:
Draw[1]> vdisplay <varname> [ … ]
从视图中清除对象的命令:
Draw[1]> vclear [varname] [ … ]
设置背景颜色:
Draw[1]> vsetcolorrbg <r> <b> <g>
设置相机选项:
Draw[1]> vcamera [options]
设置视图参数
Draw[1]> vviewparams [options]
设置光照参数:
Draw[1]> vlight [options]

DrawTrSurf package

DrawTrSurf 包用于连接 C++ 几何实体与 Draw 实例。该包的方法允许:

  • 将对象设置为具有给定名称的 Draw 几何变量![[Pasted image 20231116145300.png]]

  • 从具有给定名称的 Draw 几何变量获取对象![[Pasted image 20231116145333.png]]

![[Pasted image 20231116145348.png]]

DBRep package

DBRep包用于连接C++拓扑实体与Draw实例。该包的方法允许:

  • 将 TopoDS_Shape 设置为具有给定名称的绘制拓扑变量![[Pasted image 20231116145538.png]]

  • 从具有给定名称的 Draw 拓扑变量获取 TopoDS_Shape![[Pasted image 20231116145617.png]]

![[Pasted image 20231116145633.png]]

基于Draw的应用

要编写 Draw 程序,必须遵守以下结构:

  • 从 main 函数启动并初始化 Draw:![[Pasted image 20231116145809.png]]

  • 或者,可以使用宏来启动:![[Pasted image 20231116145845.png]]

新命令的定义

当运行Draw时,系统调用函数Draw_InitAppli。该函数必须定义在可执行文件,并且必须在该函数内的 Draw 命令解释器中添加(注册)命令。
![[Pasted image 20231116150005.png]]

Draw插件机制

或者,新的 Draw 命令可以组合到一些动态库中并加载到 DRAWEXE 中具有插件接口的可执行文件。插件的入口点应实现为静态方法某个类的 Factory() 应该用宏 DPLUGIN 声明,例如:![[Pasted image 20231116150304.png]]

OCCT 与位于 $CASROOT/src/DrawResources 目录中的 DrawPlugin 资源文件一起提供。该文件的格式符合标准 OCCT 资源文件(有关详细信息,请参阅Resource_Manager.hxx 文件)。每个键定义了一系列其他(嵌套)键或动态库的名
称。键可以嵌套到任意级别。但是,不会检查键之间的循环依赖关系。例子:![[Pasted image 20231116150437.png]]

命令定义

新绘制命令的定义示例如下:![[Pasted image 20231116150601.png]]

预备基础:3.OCCT基础

标准类型

OCCT 定义了一组基本数据类型的别名,在整个库中使用中这些别名替代纯 C++ 数据类型名称:![[Pasted image 20231116150901.png]]

Standard_Boolean 可以采用以下两个值之一:![[Pasted image 20231116150936.png]]

Handle机制

handle是整个 OCCT 中使用的智能指针。一般来说,handle机制基于两种要素:

  • 存储对内存中对象的引用次数的计数器
  • 指向内存中对象的指针
    每次创建对象的新handle时,该对象的引用计数器都会递增。
    ![[Pasted image 20231116151258.png]]

每次删除对象的handle时,该对象的引用计数器就会递减。一旦引用计数器达到 0,该对象就会被自动删除。
在这里插入图片描述

这样,引用计数器就保证了删除功能。handle不能像通常的指针那样引用任何东西。

Handle 和智能指针

从C++11标准开始就有内置的智能指针。 OCСТ handle和智能指针有什么区别?
![[Pasted image 20231116151704.png]]

很容易看出 OCCT 的handle与 C++11 中的共享指针完全等效。 OCCT 可以不包含其他智能指针类型的等效项。

Handle实现

本节介绍如何实现由 OCCT handle机制包装的新类。新类应该继承自 Standard_Transient 类或其后代:![[Pasted image 20231116152011.png]]

应在类定义中声明特殊宏,以便创建handle:![[Pasted image 20231116152108.png]]

完整的示例可以在 OCCT 源代码中找到 \src\BRepAdaptor\BRepAdaptor_HCurve.hxx

操作系统抽象层

OCCT 为 OSD 包中的低级操作系统设施提供独立于平台的接口。该包类似“python”编程语言中的“os”模块。提供以下功能:

  • 方法 OSD::SetSignal() 设置一个 C 信号处理程序,用于转换软件信号(例如浮点错误、访问冲突等)到常见的 C++ 异常。
  • OSD_File、OSD_Path、OSD_Directory 类为文件系统提供了统一的接口。
  • OSD_Mutex 和 OSD_Thread 类为互斥锁和线程的系统相关实现提供了统一的接口。
  • OSD_Timer 类实现了一个方便的计时器对象。
  • 类 OSD_Host、OSD_Process 提供对当前计算机上的信息的访问过程。
容器

从历史上看,OCCT 中有两个容器集。
![[Pasted image 20231116152624.png]]

TCollection 包在 1998 年标准化之前用于模拟模板。从 OССТ 开始7.0 中,它被相应的 NCollection 实例取代。
NCollection 包是一个较新的基于模板的包,提供现代容器。应该使用它尽可能代替 TCollection 类。
OCCT 中索引从 1 开始,NCollection_Vector 除外(其中索引从 0 开始)。这样做是为了与基于 STL 的算法兼容。
容器类通过值进行操作;还为大多数实例提供了由 Handle 操作的版本,请参见 TCollection_HArray1。

容器和STL

OCCT中有很多容器;将它们与 STL 集合进行比较是富有成效的,因为它们是 C++ 语言的通用参考点。与往常一样,与 STL 相比,有几个优点和缺点。

优点:
  • 接口,OCCT 容器的设计和实现是为了人类可读。以下代码段演示了 OCCT 的 Seek() map方法的 STL 等效项:![[Pasted image 20231116153226.png]]

  • 内存效率,OCCT 容器旨在提高内存效率。例如,当一个新元素添加到NCollection_Vector 并需要重新打包时;将分配固定大小的新块,而不是完全重新分配内存。新的元素将被添加到新的块中,而不是内存复制和元素移动。

缺点
  • 随机索引访问比 STL 容器慢。可测量的差异可以观察到一些极端的情况。在低级内存优化期间可能会遇到这个问题在间接寻址场景。
容器比较

![[Pasted image 20231116153759.png]]

异常

按照惯例,Open CASCADE 库中使用的所有异常类均继承自Standard_Failure 类。从它派生的异常类的层次结构在 Standard 包中定义。
为了在数值不稳定的情况下 OCCT 算法稳健工作,有必要调用该方OSD::SetSignal() 在应用程序中的某处(一次;在 Windows 上 - 每个执行线程一次)。
之后,标准C++异常和软件信号都可以在通常的C++中以统一的方式处理方式:![[Pasted image 20231116155409.png]]

消息

Message Package 为 OCCT 和应用程序级算法提供了以抽象且可定制的方式与用户沟通:

  • Message_Messenger 类是字符串消息输出的接口。它可以根据应用程序的需要,通过将输出定向到一个或多个流、GUI 窗口或其他任何内容来进行定制。
  • Message_Msg 类提供消息本地化的方法。它由消息密钥初始化,参数并构造相应的消息作为文本字符串。消息的定义与键关联的字符串是从资源文件中加载的。
  • Message_Algorithm 类为类提供了一种实现复杂算法的便捷方法返回执行的扩展状态,包括有关遇到问题的面向用户的消息和情况。
进度指示器

进度指示器是一个实体,允许跟踪下游算法的进度并报告它。Message_ProgressIndicator 类为复杂算法提供了一个接口,以告知其在运行时的当前执行状态,并有可能根据用户命令中断。目前(OCCT7.4.0),不支持在多线程应用程序中使用并发进度指示器。进度指示器的典型封装如下所示:
![[Pasted image 20231116160731.png]]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

制造业数据标准化的优势分析

之前我们介绍过>>数据驱动工作效率提升的5个层次——以PreMaint设备数字化平台为例&#xff0c;这次我们将深入分析数据标准化在制造业中的优势。 从持续的供应链中断和疯狂的通货膨胀&#xff0c;到日益昂贵和难以采购的原材料&#xff0c;制造企业正面对越来越多的挑战…

APM/PX4/betaflight/inav开源飞控之IMU方向

APM/PX4/betaflight/inav开源飞控之IMU方向 1. 源由2. 坐标系2.1 APM/PX4&#xff1a;机体坐标 右手系规则2.2 betaflight/inav&#xff1a;xEast-yNorth-zUp yaw反向 右手系规则 3. 转向定义3.1 APM/PX43.2 betaflight/inav 4. 实例4.1 I C M 42688 P ICM42688P ICM42688P…

把jar包打到本地仓库然后上传到私服

1.首先把需要打成maven的包放到本地 2.然后本地配置maven的环境变量 没有配置的话可以看看下面这个&#xff0c;教程很详细 Windows系统配置maven环境_windows配置maven环境变量-CSDN博客 3.WinR cmd 输入如下的指令&#xff1a; mvn install:install-file -Dfile.\device…

unity shaderGraph实例-扫描效果

文章目录 效果展示整体结构各区域内容区域1区域2区域3区域4区域5区域6GraphSetttings注意事项使用方法 效果展示 整体结构 各区域内容 区域1 用场景深度减去顶点的View空间的视野深度&#xff08;Z值&#xff09;&#xff0c;这里Z值需要乘-1是因为从相机看到的物体顶点的视野…

Kontakt Factory Library 2(Kontakt原厂音色库2)

Kontakt Factory Library 2是一款由Native Instruments开发的音乐采样库。它是Kontakt采样器软件的官方库之一&#xff0c;提供了丰富的音色和音乐资源&#xff0c;可用于制作各种类型的音乐。 Kontakt Factory Library 2包含了数千个高质量的乐器采样&#xff0c;涵盖了各种乐…

不会英语能学编程吗?0基础学编程什么软件好?

不会英语能学编程吗&#xff1f;0基础学编程什么软件好&#xff1f; 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;象如图这个…

【数据分享】1961—2022年全国范围的逐日降水栅格数据

降水数据是我们在各项研究中最常用的气象指标之一&#xff01;之前我们给大家分享过来源于国家青藏高原科学数据中心发布的1901-2022年1km分辨率逐月降水栅格数据以及1901-2022年1km分辨率逐年降水栅格数据&#xff08;均可戳我跳转&#xff09;&#xff01;很多小伙伴拿到数据…

OpenCV基础应用(4)— 如何改变图像的透明度

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。本节课就手把手教你如何改变图像的透明度&#xff0c;希望大家学习之后能够有所收获~&#xff01;&#x1f308; 目录 &#x1f680;1.技术介绍 &#x1f680;2.实现代码 &#x1f680;1.技术介绍 改变图像透明度的实…

Linux C 线程间同步机制

线程间同步机制 概述保护机制互斥锁创建互斥锁  pthread_mutex_init加锁  pthread_mutex_lock解锁  pthread_mutex_unlock删除锁  pthread_mutex_destroy 条件变量创建条件变量  pthread_cond_init激活条件变量  pthread_cond_signal等待条件变量  pthread_cond_…

媒体行业的3D建模:在影视中创造特效纹理

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 在本文中&#xff0c;我们将探讨 3D 建模在媒体行业中的作用&#xff0c;特别是它在影视特效创作…

某60工业互联网安全测试技术学习记录

系列文章目录 文章目录 系列文章目录前言工业互联网安全测试技术安全工具分类常用安全工具介绍 主机安全测试5.1 主机安全测试概览5.2 通用主机安全测试技术主机信息扫描 5.3 Linux主机安全测试5.4 Android 安全测试5.5 Windows主机安全测试5.6 UNIX 主机安全测试 工业渗透测试…

COS对象存储

一. 什么是对象存储 腾讯云叫COS&#xff0c;在阿里云叫OSS&#xff0c;是一样的对象存储&#xff08;Cloud Object Storage&#xff0c;COS&#xff09;是腾讯云提供的一种存储海量文件的分布式存储服务&#xff0c;具有高扩展性、低成本、可靠安全等优点。通过控制台、API、…

【深度学习】吴恩达课程笔记(五)——超参数调试、batch norm、Softmax 回归

笔记为自我总结整理的学习笔记&#xff0c;若有错误欢迎指出哟~ 【吴恩达课程笔记专栏】 【深度学习】吴恩达课程笔记(一)——深度学习概论、神经网络基础 【深度学习】吴恩达课程笔记(二)——浅层神经网络、深层神经网络 【深度学习】吴恩达课程笔记(三)——参数VS超参数、深度…

开源短剧付费变现小程序源码系统+在线开通会员+在线充值 带完整的搭建教程

说起微短剧&#xff0c;相信大家都不会陌生。相比传统网剧冗长的剧情&#xff0c;微短剧最大的看点&#xff0c;是时长短、高浓缩&#xff0c;顺应了当下用户娱乐时间碎片化趋势。其故事题材多为赘婿、霸道总裁、穿越、重生等看似夸张、无厘头&#xff0c;但却非常“上头”的虚…

PyTorch:GPU的使用

在深度学习领域&#xff0c;神经网络模型训练所需的计算量巨大&#xff0c;这就对计算资源提出了高要求。为了处理这一问题&#xff0c;图形处理器&#xff08;GPU&#xff09;被引入到深度学习中&#xff0c;其并行计算能力可以极大加速神经网络的训练过程。PyTorch作为一款出…

什么是脏读、不可重复读、幻读讲解

数据库隔离级别是数据库管理系统中一个重要的概念&#xff0c;它定义了事务之间的可见性和影响。在多用户并发访问数据库时&#xff0c;隔离级别能够确保事务之间的相互独立性&#xff0c;避免数据不一致的问题。本文将深入探讨三种常见的并发问题&#xff1a;脏读、不可重复读…

Java8Stream快速使用

将List集合存入流中 List<String> list new ArrayList<>();list.add("张一");list.add("张二");list.add("张三");list.add("李四");list.add("赵五");list.add("张六");list.add("王八"…

Android---Gradle 构建问题解析

想必做 Android App 开发的对 Gradle 都不太陌生。因为有 Android Studio 的帮助&#xff0c;Android 工程师使用 Gradle 的门槛不算太高&#xff0c;基本的配置都大同小异。只要在 Android Studio 默认生成的 build.gradle 中稍加修改&#xff0c;就都能满足项目要求。但是&am…

为什么红帽Linux值得学习?红帽Linux是什么

为什么红帽Linux值得学习 物联网、云计算、大数据&#xff0c;或许你都耳熟能详&#xff0c;但是Linux可能你却感觉到有点陌生。这些未来趋势的行业使用的嵌入式、c、JAVA、PHP等底层应用软件都是在Linux操作系统上Linux运维工程师作为移动互联网的关键支撑岗位&#xff0c;缺口…

朝夕光年「红砖」搭建平台架构设计和应用落地

在游戏产品的生命周期中&#xff0c;游戏运营需要实现各类营销活动&#xff0c;通过 Native 和 H5 页面&#xff0c;投放到游戏端内和各种社交媒体&#xff0c;实现“拉新&#xff0c;促活&#xff0c;回流&#xff0c;付费”等核心目标。然而&#xff0c;一个游戏一生可能需要…