当前位置: 首页 > news >正文

opencascade15解析导出为step格式

#include "DisplayScene.h" // 包含显示场景的头文件
#include "Viewer.h" // 包含查看器的头文件// OpenCascade 包含
#include <BRepPrimAPI_MakeCylinder.hxx> // 创建圆柱体
#include <BinXCAFDrivers.hxx> // 二进制XCAF驱动程序
#include <gp_Quaternion.hxx> // 四元数
#include <Interface_Static.hxx> // 静态接口
#include <STEPCAFControl_Writer.hxx> // STEP CAF 控制写入器
#include <TDF_ChildIterator.hxx> // 子迭代器
#include <TDataStd_Name.hxx> // 标准数据名称
#include <TDocStd_Application.hxx> // 文档标准应用
#include <TDocStd_Document.hxx> // 文档标准文件
#include <TopExp.hxx> // 顶部表达式
#include <TopoDS.hxx> // 拓扑数据结构
#include <XCAFDoc_ColorTool.hxx> // 颜色工具
#include <XCAFDoc_DocumentTool.hxx> // 文档工具
#include <XCAFDoc_ShapeTool.hxx> // 形状工具namespace
{// 写入带有元数据的STEP文件bool WriteStepWithMeta(const Handle(TDocStd_Document)& doc,const char*                     filename){STEPCAFControl_Writer Writer;// 为了使子形状名称起作用,我们必须打开OpenCascade的以下静态变量。Interface_Static::SetIVal("write.stepcaf.subshapes.name", 1);// 将XDE文档写入文件。try{if ( !Writer.Transfer(doc, STEPControl_AsIs) ) // 转移XDE文档{return false;}const IFSelect_ReturnStatus ret = Writer.Write(filename); // 将XDE文档写入文件if ( ret != IFSelect_RetDone ){return false;}}catch ( ... ){return false;}return true;}namespace ShapeReflection{// 创建表示车轮的简化形状的圆柱体原语,包括其边缘和与之相融的轮胎。TopoDS_Shape CreateWheel(const double OD,const double W){return BRepPrimAPI_MakeCylinder(gp_Ax2( gp_Pnt(-W/2, 0., 0.), gp::DX() ), OD/2, W);}// 创建表示轮轴的几何原语。TopoDS_Shape CreateAxle(const double D,const double L){return BRepPrimAPI_MakeCylinder(gp_Ax2( gp_Pnt(-L/2, 0., 0.), gp::DX() ), D/2, L);}// 创建车轮轴子组件形状。TopoDS_Shape CreateWheelAxle(const TopoDS_Shape& wheel,const TopoDS_Shape& axle,const double        L){TopoDS_Compound compShape;BRep_Builder bbuilder;bbuilder.MakeCompound(compShape);gp_Trsf wright_T;wright_T.SetTranslationPart( gp_Vec(L/2, 0, 0) );gp_Quaternion qn(gp::DY(), M_PI);gp_Trsf wleft_TR;wleft_TR.SetRotation(qn);//gp_Trsf wleft_T = wright_T.Inverted() * wleft_TR;bbuilder.Add( compShape, wheel.Moved(wleft_T) );bbuilder.Add( compShape, wheel.Moved(wright_T) );bbuilder.Add( compShape, axle ); // 不带变换的轮轴。return compShape;}// 创建车轮轴。TopoDS_Shape CreateChassis(const TopoDS_Shape& wheelAxle,const double        CL){TopoDS_Compound compShape;BRep_Builder bbuilder;bbuilder.MakeCompound(compShape);gp_Trsf wfront_T; wfront_T .SetTranslationPart( gp_Vec(0,  CL/2, 0) );gp_Trsf wrear_T;  wrear_T  .SetTranslationPart( gp_Vec(0, -CL/2, 0) );bbuilder.Add( compShape, wheelAxle.Moved(wfront_T) );bbuilder.Add( compShape, wheelAxle.Moved(wrear_T) );return compShape;}}
}// 程序入口
int main(int argc, char** argv)
{Viewer vout(50, 50, 500, 500); // 创建查看器// 创建XDE文档Handle(TDocStd_Application) app = new TDocStd_Application;BinXCAFDrivers::DefineFormat(app);Handle(TDocStd_Document) doc;app->NewDocument("BinXCAF", doc);// 工具Handle(XCAFDoc_ShapeTool)ST = XCAFDoc_DocumentTool::ShapeTool( doc->Main() ); // 形状工具Handle(XCAFDoc_ColorTool)CT = XCAFDoc_DocumentTool::ColorTool( doc->Main() ); // 颜色工具// 准备装配文档// 参数const double OD = 500;const double W  = 100;const double L  = 1000;const double CL = 1000;// 创建一个轮子原型t_wheelPrototype wheelPrototype;wheelPrototype.shape = ::ShapeReflection::CreateWheel(OD, W);wheelPrototype.label = ST->AddShape(wheelPrototype.shape, false); // 将其添加到XDE文档// 创建一个轴原型t_prototype axlePrototype;axlePrototype.shape = ::ShapeReflection::CreateAxle(OD/10, L);axlePrototype.label = ST->AddShape(axlePrototype.shape, false); // 将其添加到XDE文档// 创建一个轮轴子组件。 注意,不会复制形状。// 此时,输出的STEP文件仅包含两个MANIFOLD_SOLID_BREP实体。t_prototype wheelAxlePrototype;wheelAxlePrototype.shape = ::ShapeReflection::CreateWheelAxle(wheelPrototype.shape, axlePrototype.shape, L);wheelAxlePrototype.label = ST->AddShape(wheelAxlePrototype.shape, true); // 将其添加到XDE文档// 主装配。// STEP文件仍然只包含几个实体。t_prototype chassisPrototype;chassisPrototype.shape = ::ShapeReflection::CreateChassis(wheelAxlePrototype.shape, CL);chassisPrototype.label = ST->AddShape(chassisPrototype.shape, true); // 将其添加到XDE文档// 将颜色分配给部件。CT->SetColor( wheelPrototype.label, Quantity_Color(1, 0, 0, Quantity_TOC_RGB), XCAFDoc_ColorGen );CT->SetColor( axlePrototype.label,  Quantity_Color(0, 1, 0, Quantity_TOC_RGB), XCAFDoc_ColorGen );// 设置原型的名称TDataStd_Name::Set(wheelPrototype.label,     "wheel");TDataStd_Name::Set(axlePrototype.label,      "axle");TDataStd_Name::Set(wheelAxlePrototype.label, "wheel-axle");TDataStd_Name::Set(chassisPrototype.label,   "chassis");// 设置子组件实例的名称。for ( TDF_ChildIterator cit(chassisPrototype.label); cit.More(); cit.Next() ){TDataStd_Name::Set(cit.Value(), "wheel-axle-ref");}// 通过面展开轮子形状。TopTools_IndexedMapOfShape wheelFaces;TopExp::MapShapes(wheelPrototype.shape, TopAbs_FACE, wheelFaces);//wheelPrototype.frontFace      = TopoDS::Face( wheelFaces(2) );wheelPrototype.frontFaceLabel = ST->AddSubShape(wheelPrototype.label, wheelPrototype.frontFace);CT->SetColor( wheelPrototype.frontFaceLabel, Quantity_Color(0, 0, 1, Quantity_TOC_RGB), XCAFDoc_ColorSurf );// 为子形状设置名称。TDataStd_Name::Set(wheelPrototype.frontFaceLabel, "front-face");// 完成。// 显示场景DisplayScene cmd( doc, vout.GetContext() );if ( !cmd.Execute() ){std::cout << "Failed to visualize CAD model with `DisplayScene` command." << std::endl;return 1;}// 保存到文件if ( argc > 1 ){if ( !::WriteStepWithMeta(doc, argv[1]) ){std::cout << "Failed to write XDE document to a STEP file " << argv[1] << std::endl;return 1;}}// 保存以便调试PCDM_StoreStatus sstatus = app->SaveAs(doc, "E:/CAD/xinjiazi8_asm.xbf");if ( sstatus != PCDM_SS_OK ){app->Close(doc);std::cout << "Cannot write OCAF document." << std::endl;return 1;}// 进入消息循环vout.StartMessageLoop();app->Close(doc); // 在退出消息循环时关闭文档。return 0;
}

这段代码是一个完整的程序,它创建了一个包含车轮、轮轴和底盘的简单 CAD 模型,并将其保存为 STEP 文件。逐行注释已经说明了代码的作用。

相关文章:

opencascade15解析导出为step格式

#include "DisplayScene.h" // 包含显示场景的头文件 #include "Viewer.h" // 包含查看器的头文件// OpenCascade 包含 #include <BRepPrimAPI_MakeCylinder.hxx> // 创建圆柱体 #include <BinXCAFDrivers.hxx> // 二进制XCAF驱动程序 #includ…...

【软件设计模式之模板方法模式】

文章目录 前言一、什么是模板方法模式&#xff1f;二、模板方法模式的结构1. 抽象类定义2. 具体实现 三、模板方法模式的应用场景1. 算法重用2. 操作中的固定步骤3. 扩展框架的功能4. 提供回调方法5. 遵循开闭原则 四、模板方法模式的优缺点1. 优点代码复用扩展性好符合开闭原则…...

Spring Boot项目怎么对System.setProperty(key, value)设置的属性进行读取加解密

一、前言 之前我写过一篇文章使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置&#xff08;读取时自动解密&#xff09;&#xff0c;对Spring Boot项目的属性读取时进行加解密&#xff0c;但是没有说明对System.setProperty(key, value)设…...

Linux理解

VMware安装Linux安装 目录 VMware安装Linux安装 1.1 什么是Linux 1.2 为什么要学Linux 1.3 学完Linux能干什么 2.1 主流操作系统 2.2 Linux系统版本 VMware安装Linux安装 1.1 什么是Linux Linux是一套免费使用和自由传播的操作系统。 1.2 为什么要学Linux 1). 企业用人…...

常用芯片学习——YC688语音芯片

YC688 广州语创公司语音芯片 使用说明 YC688是一款工业级的MP3语音芯片 &#xff0c;完美的集成了MP3、WAV的硬解码。支持SPI-Flash、TF卡、U盘三种存储设备。可通过电脑直接更新SPI-Flash的内容&#xff0c;无需上位机软件。通过简单的串口指令即可完成三种存储设备的音频插…...

C语言:指针的进阶讲解

目录 1. 二级指针 1.1 二级指针是什么&#xff1f; 1.2 二级指针的作用 2. 一维数组和二维数组的本质 3. 指针数组 4. 数组指针 5. 函数指针 6. typedef的使用 7. 函数指针数组 7.1 转移表 1. 二级指针 如果了解了一级指针&#xff0c;那二级指针也是可以很好的理解…...

基于SSM的车位租赁系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的车位租赁系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…...

Java pyhon C C++ R JS 主流语言的区别-03

以下是对这几种语言的数据类型进行简要归纳&#xff1a; Java的数据类型&#xff1a; 基本数据类型&#xff1a;包括整数类型&#xff08;byte、short、int、long&#xff09;、浮点数类型&#xff08;float、double&#xff09;、字符类型&#xff08;char&#xff09;和布尔…...

5 buuctf解题

命令执行 [BJDCTF2020]EasySearch1 打开题目 尝试弱口令&#xff0c;发现没有用 扫描一下后台&#xff0c;最后用御剑扫描到了index.php.swp 访问一下得到源码 源码如下 <?phpob_start();function get_hash(){$chars ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu…...

微服务三十五关

1.微服务有什么好处&#xff1f; 微服务优点很多&#xff0c;但是我们通常说一个东西好肯定会跟另一个东西比较&#xff0c; 通常说微服务好会和单体项目进行比较。以下是微服务相对于单体项目的一些显著好处&#xff1a; 首先&#xff0c;让我们讨论单体项目的一些主要缺点&a…...

第一个 Angular 项目 - 添加服务

第一个 Angular 项目 - 添加服务 这里主要用到的内容就是 [Angular 基础] - service 服务 提到的 前置项目在 第一个 Angular 项目 - 动态页面 这里查看 想要实现的功能是简化 shopping-list 和 recipe 之间的跨组件交流 回顾一下项目的结构&#xff1a; ❯ tree src/app/…...

红日靶场3

靶场链接&#xff1a;漏洞详情 在虚拟机的网络编辑器中添加两个仅主机网卡 信息搜集 端口扫描 外网机处于网端192.168.1.0/24中&#xff0c;扫描外网IP端口&#xff0c;开放了80 22 3306端口 80端口http服务&#xff0c;可以尝试登录网页 3306端口mysql服务&#xff0c;可…...

B树的介绍

R-B Tree 简介特性B树特性m阶B树的性质&#xff08;这些性质是B树规定的&#xff09; B树的搜索B树的添加B树的删除——非叶子结点 简介 R-B Tree又称为Red-Black Tree&#xff0c;红黑树。是一种特殊的二叉查找树&#xff0c;红黑树的每个节点上都有存储为表示结点的颜色&…...

《The Art of InnoDB》第二部分|第4章:深入结构-磁盘结构-撕裂的页面(doublewrite buffer)

4.5 撕裂的页面 目录 4.5 撕裂的页面 4.5.1 双写缓冲区的作用 4.5.2 双写缓冲区的结构 4.5.3 双写缓冲区与Redolog的协同工作流程 4.5.2 双写缓冲区写入时机 4.5.3 禁用双写缓冲区 4.5.4 小结 未完待续... 上文我们学习了redo log的结构和其工作原理,它是一个…...

提示工程(Prompt Engineering)、微调(Fine-tuning) 和 嵌入(Embedding)

主要参考资料&#xff1a; 还没搞懂嵌入&#xff08;Embedding&#xff09;、微调&#xff08;Fine-tuning&#xff09;和提示工程&#xff08;Prompt Engineering&#xff09;&#xff1f;: https://blog.csdn.net/DynmicResource/article/details/133638079 B站Up主Nenly同学…...

【Flink精讲】Flink 内存管理

面临的问题 目前&#xff0c; 大数据计算引擎主要用 Java 或是基于 JVM 的编程语言实现的&#xff0c;例如 Apache Hadoop、 Apache Spark、 Apache Drill、 Apache Flink 等。 Java 语言的好处在于程序员不需要太关注底层内存资源的管理&#xff0c;但同样会面临一个问题&…...

正则化概念及使用

正则化概念及使用 正则化概念正则化原理常用的两种正则化方法1. L1 正则化&#xff08;Lasso&#xff09;2. L2 正则化&#xff08;Ridge&#xff09; 正则化参数 正则化概念 在机器学习中&#xff0c;我们致力于通过从训练数据中学习模式或规律来构建模型。为了找到最佳的模型…...

让程序员设计B端界面,好比武大郎招聘:向我看齐。不忍直视!

hello&#xff0c;我是大美B端工场&#xff0c;B端系统的要求越来越高了&#xff0c;很多公司还让程序员负责页面&#xff0c;页面搞的没法看&#xff0c;也怪不得程序员。程序员来搞页面&#xff0c;那还不是武大郎招聘——向我看齐&#xff0c;以我的标准为标准吗&#xff1f…...

使用python构建Android,探索跨平台应用开发Kivy框架

使用python构建Android&#xff0c;探索跨平台应用开发Kivy框架 1. 介绍Kivy框架 Kivy是什么&#xff1f; Kivy是一个开源的Python跨平台应用程序开发框架&#xff0c;旨在帮助开发者快速构建创新的、可扩展的移动应用和多点触控应用。Kivy采用MIT许可证&#xff0c;允许开发…...

08 Redis之集群的搭建和复制原理+哨兵机制+CAP定理+Raft算法

5 Redis 集群 2.8版本之前, Redis采用主从集群模式. 实现了数据备份和读写分离 2.8版本之后, Redis采用Sentinel哨兵集群模式 , 实现了集群的高可用 5.1 主从集群搭建 首先, 基本所有系统 , “读” 的压力都大于 “写” 的压力 Redis 的主从集群是一个“一主多从”的读写分…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...