Open CASCADE学习|BRepFill_SectionPlacement

BRepFill_SectionPlacement 是一个与计算机辅助设计(CAD)相关的术语,通常用于指代一个几何对象或操作,它是Open CASCADE Technology(OCCT)中的一个类。Open CASCADE Technology是一个开源的CAD内核,广泛应用于工业软件中,用于处理3D模型的创建、编辑和数据交换。

在OCCT中,BRepFill_SectionPlacement 类的作用是将一个截面(或称为剖面)放置在特定的位置和方向上。这个类是用于填充操作的一部分,填充操作涉及创建一个3D实体,这个实体是通过将一个2D截面沿着一个路径或导线扫掠(sweep)形成的。

以下是关于 BRepFill_SectionPlacement 类的一些关键点:

截面(Section):这是填充操作中的2D几何形状,可以是任何形状的轮廓,比如圆形、矩形或其他复杂形状。

放置(Placement):这定义了截面在3D空间中的确切位置和方向。放置可以通过平移(translation)和旋转(rotation)来指定。

路径(Path):在某些情况下,截面不是简单地放置在一个位置,而是沿着一个路径移动,从而创建一个更为复杂的3D形状。

生成实体(Generating Solids):通过 BRepFill_SectionPlacement 可以生成3D实体,这些实体可以是实体的几何形状,如块、圆柱、管道等。

参数化(Parametric):OCCT中的类通常是参数化的,这意味着它们的行为可以通过设置不同的参数来控制。

API(Application Programming Interface):BRepFill_SectionPlacement 是OCCT提供的API的一部分,允许开发者在他们的应用程序中实现复杂的几何建模功能。

#include <BRepFill_LocationLaw.hxx>
#include <BRepFill_SectionPlacement.hxx>
#include <TopoDS_Shape.hxx>
#include <gp_Trsf.hxx>
#include <TColgp_HArray1OfPnt.hxx>
#include <Geom_CylindricalSurface.hxx>
#include <GeomAPI_PointsToBSpline.hxx>
#include <Geom_BSplineCurve.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <TopoDS_Edge.hxx>
#include <GC_MakeSegment.hxx>
#include <gp_Lin2d.hxx>
#include <GC_MakeArcOfCircle.hxx>
#include <IntAna2d_AnaIntersection.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepPrimAPI_MakeRevol.hxx>
#include <BRepBuilderAPI_Transform.hxx>
#include <GeomFill_TrihedronLaw.hxx>
#include <GeomFill_Frenet.hxx>
#include <GeomFill_CurveAndTrihedron.hxx>
#include <BRepFill_Edge3DLaw.hxx>
#include"Viewer.h"
TopoDS_Edge createHelix(const Standard_Real HelixRadius, const Standard_Real HelixAngle, const Standard_Real HelixLength)
{Standard_Real u0 = 0.0;Standard_Real u1 = 2 * M_PI;Standard_Real v0 = 0.0;Standard_Real v1 = HelixLength;double uInter = (u1 - u0) / 1000;double vInter = (v1 - v0) / 1000;TColgp_HArray1OfPnt Points(1, 1001);Handle(Geom_CylindricalSurface) aCylinder = new Geom_CylindricalSurface(gp::XOY(), HelixRadius);double u;double v;//生成点for (int i = 0; i < 1001; i++) {u = i * vInter * tan(HelixAngle) / HelixRadius;v = i * vInter;Points[i + 1] = aCylinder->Value(u, v);}GeomAPI_PointsToBSpline Approx(Points);Handle_Geom_BSplineCurve K = Approx.Curve();TopoDS_Edge aHelixEdge = BRepBuilderAPI_MakeEdge(K);return aHelixEdge;
}
​
TopoDS_Shape createGrindingwheel2()
{Standard_Real Line1_angle = 280 * M_PI / 180;Standard_Real Line1_length = 0.5031;Standard_Real Line2_angle = 236 * M_PI / 180;Standard_Real Line2_length = 0.5925;Standard_Real Arc1_r = 0.112;Standard_Real Arc1_angle = (180 + 10 + 50) * M_PI / 180;gp_Pnt Line1_p1(-0.6822 / 2, 0, 0);gp_Pnt Line2_p1(0.6822 / 2, 0, 0);gp_Lin Line1(Line1_p1, gp_Dir(cos(Line1_angle), sin(Line1_angle), 0.));gp_Lin Line2(Line2_p1, gp_Dir(cos(Line2_angle), sin(Line2_angle), 0.));Handle(Geom_TrimmedCurve) L1 = GC_MakeSegment(Line1, 0., Line1_length);TopoDS_Edge L1e = BRepBuilderAPI_MakeEdge(L1);Handle(Geom_TrimmedCurve) L2 = GC_MakeSegment(Line2, 0., Line2_length);TopoDS_Edge L2e = BRepBuilderAPI_MakeEdge(L2);gp_Pnt l1end = L1->EndPoint();gp_Pnt l2end = L2->EndPoint();gp_Lin Line1v(l1end, gp_Dir(cos(Line1_angle + M_PI_2), sin(Line1_angle + M_PI_2), 0.));gp_Lin2d Line2v(gp_Pnt2d(l2end.X(), l2end.Y()), gp_Dir2d(cos(Line2_angle - M_PI_2), sin(Line2_angle - M_PI_2)));gp_Lin Line2v3d(l2end, gp_Dir(cos(Line2_angle - M_PI_2), sin(Line2_angle - M_PI_2), 0.));Handle(Geom_TrimmedCurve) L1v = GC_MakeSegment(Line1v, 0., Arc1_r);gp_Pnt l1vend = L1v->EndPoint();gp_Circ c1(gp_Ax2(l1vend, gp_Dir(0, 0, 1)), Arc1_r);Handle(Geom_TrimmedCurve) c1c = GC_MakeArcOfCircle(c1, l1end, Arc1_angle, 1);gp_Pnt c1end = c1c->EndPoint();gp_Lin2d Line3(gp_Pnt2d(c1end.X(), c1end.Y()), gp_Dir2d(l2end.X() - c1end.X(), l2end.Y() - c1end.Y()));gp_Lin2d Line3v = Line3.Normal(gp_Pnt2d((l2end.X() + c1end.X()) / 2, (l2end.Y() + c1end.Y()) / 2));IntAna2d_AnaIntersection aIntAna;aIntAna.Perform(Line2v, Line3v);IntAna2d_IntPoint aIntPoint = aIntAna.Point(1);gp_Pnt o2(aIntPoint.Value().X(), aIntPoint.Value().Y(), 0.);Handle(Geom_TrimmedCurve) L2v = GC_MakeSegment(Line2v3d, l2end, o2);Standard_Real r2 = L2v->LastParameter();gp_Circ c2(gp_Ax2(o2, gp_Dir(0, 0, 1)), r2);Handle(Geom_TrimmedCurve) c2c = GC_MakeArcOfCircle(c2, c1end, l2end, 0);gp_Pnt c2low = c2c->Value(M_PI_2);
​TopoDS_Edge c1ce = BRepBuilderAPI_MakeEdge(c1c);TopoDS_Edge L1ev = BRepBuilderAPI_MakeEdge(L1v);TopoDS_Edge c2ce = BRepBuilderAPI_MakeEdge(c2c);
​gp_Pnt Line1_up(-0.9832 / 2, 5, 0);gp_Pnt Line2_up(0.9832 / 2, 5, 0);TopoDS_Edge anEdge1 = BRepBuilderAPI_MakeEdge(Line1_p1, Line1_up);TopoDS_Edge anEdge2 = BRepBuilderAPI_MakeEdge(Line1_up, Line2_up);TopoDS_Edge anEdge3 = BRepBuilderAPI_MakeEdge(Line2_up, Line2_p1);TopTools_ListOfShape listEdge;listEdge.Append(anEdge1);listEdge.Append(anEdge2);listEdge.Append(anEdge3);listEdge.Append(L1e);listEdge.Append(c1ce);listEdge.Append(c2ce);listEdge.Append(L2e);BRepBuilderAPI_MakeWire mw;mw.Add(listEdge);mw.Build();
​TopoDS_Shape gwheel = BRepPrimAPI_MakeRevol(mw, gp_Ax1(gp_Pnt(0, 5, 0), gp_Dir(1, 0, 0)), 2 * M_PI);//平移:gp_Trsf theTransformation1;gp_Vec theVectorOfTranslation1(-c2low.X(), -c2low.Y(), 0.);theTransformation1.SetTranslation(theVectorOfTranslation1);
​BRepBuilderAPI_Transform myBRepTransformation1(gwheel, theTransformation1);TopoDS_Shape outzero = myBRepTransformation1.Shape();
​
​gp_Trsf theTransformation2;gp_Vec theVectorOfTranslation2(0., 0.525 / 2, 0.);theTransformation2.SetTranslation(theVectorOfTranslation2);//绕一个轴旋转:gp_Trsf theTransformation3;gp_Ax1 axez = gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(0., 0., 1.));theTransformation3.SetRotation(axez, -90 * M_PI / 180);
​gp_Trsf theTransformation4;gp_Ax1 axex = gp_Ax1(gp_Pnt(0, 0, 0), gp_Dir(1., 0., 0.));theTransformation4.SetRotation(axex, -50 * M_PI / 180);
​BRepBuilderAPI_Transform myBRepTransformation(outzero, theTransformation4 * theTransformation3 * theTransformation2);TopoDS_Shape TransformedShape = myBRepTransformation.Shape();
​return TransformedShape;
}
​
int main() {// 假设已经有了一个截面形状 sectionShape 和一个路径定律 lawTopoDS_Shape sectionShape = createGrindingwheel2(); // 这里需要你填入实际的截面形状Standard_Real R = 0.306 / 2;TopoDS_Edge aE = createHelix(R, M_PI / 4, 6.);TopoDS_Wire spine = BRepBuilderAPI_MakeWire(aE);Handle(GeomFill_TrihedronLaw) TLaw;TLaw = new GeomFill_Frenet();Handle(GeomFill_CurveAndTrihedron) Loc = new (GeomFill_CurveAndTrihedron) (TLaw);Handle(BRepFill_LocationLaw) law; // 这里需要你填入实际的路径定律law = new (BRepFill_Edge3DLaw) (spine, Loc);// 创建 BRepFill_SectionPlacement 对象进行自动放置BRepFill_SectionPlacement placement(law, sectionShape, Standard_False, Standard_False);
​// 获取放置操作产生的变换矩阵gp_Trsf transformation = placement.Transformation();
​// 打印变换矩阵(或者进行其他操作)std::cout << "Transformation matrix:" << std::endl;for (Standard_Integer i = 1; i <= 3; ++i) {for (Standard_Integer j = 1; j <= 4; ++j) {std::cout << transformation.Value(i, j) << " ";}std::cout << std::endl;}
​// 获取截面在路径上的曲线坐标Standard_Real abscissa = placement.AbscissaOnPath();std::cout << "Abscissa on path: " << abscissa << std::endl;TopoDS_Shape ch = BRepBuilderAPI_Transform(sectionShape, transformation, Standard_True);
​Viewer vout(50, 50, 500, 500);vout << sectionShape;vout << spine;vout << ch;
​vout.StartMessageLoop();return 0;
}
​

Transformation matrix:

-0.985547 -0.133209 0.104656 0.150789

0.167884 -0.685475 0.708476 -0.0256862

-0.0226364 0.715806 0.697932 0.00346336

Abscissa on path: 0

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

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

相关文章

在AndroidStudio创建Flutter项目并运行到模拟器

1.Flutter简介 Flutter是Google开源的构建用户界面&#xff08;UI&#xff09;工具包&#xff0c;帮助开发者通过一套代码库高效构建多平台精美应用&#xff0c;支持移动、Web、桌面和嵌入式平台。Flutter 开源、免费&#xff0c;拥有宽松的开源协议&#xff0c;适合商…

HTML中input输入框(详解输入框的用法)

目录 一、input介绍 1.概念 2.好处 3.用法 4.应用 二、input语法 1.文本输入框 (type"text") 2.密码输入框 (type"password") 3.数字输入框 (type"number") 4.电子邮件输入框 (type"email") 5.复选框 (type"checkbox&…

Centos7 安装Git、使用

Centos7 安装Git 一、安装步骤1.1 查看版本1.2 卸载1.3 安装 二、创建仓库2.1 新增仓库2.2 新增配置项 三、管理文件3.1 文件创建3.2 文件修改、add、commit3.3 tree结构探索 四、分支4.1 创建分支&#xff1a;4.2 查看分支4.3 切换分支4.4 删除分支4.5 合并冲突 一、安装步骤 …

运行DeepSORT_YOLOv5_Pytorch时出现的问题

文章目录 前言问题1&#xff1a;Loaderyaml.FullLoader问题2&#xff1a;utils. -> yolov5.utils.问题3&#xff1a;np.float -> float问题4&#xff1a;np.int -> int问题5&#xff1a;ImportError: cannot import name time_synchronized from yolov5.utils.torch_u…

TCP协议关于速率的优化机制-滑动窗口详解

在上一章中&#xff0c;我们讲述了TCP协议在传输过程中的可靠性http://t.csdnimg.cn/BsImO&#xff0c;这里衔接上一篇文章继续讲&#xff0c;TCP协议的特性&#xff0c;TCP协议写完之后就写&#xff0c;Http和Https等内容吧 1. 滑动窗口 这里的滑动窗口不是指算法里面的双指…

Jetson Orin NX L4T35.5.0平台相机stop导致系统死机问题调试

1. 环境 硬件:国产OrinNX套件 系统版本: L4T35.5.0 相机: SDI 相机,1080P50fps 2. 问题描述 移植驱动已经开始正常采集相机图像,但是会出现以下问题: 采集流程如下: (1)start SDI camera (2)gst-launch-1.0采集图像 gst-launch-1.0 v4l2src device=/dev/vide…

30天拿下Rust之图形编程

概述 Rust语言以其卓越的安全性、性能和可靠性赢得了广大开发者的青睐&#xff0c;逐渐在系统编程、网络服务、游戏开发等领域崭露头角。随着Rust生态的日益繁荣&#xff0c;图形编程领域也涌现出一批优秀的框架和库&#xff0c;使得用Rust进行高效、安全的图形应用开发成为可能…

QT学习之QtXlsx

背景&#xff1a; 本来我是想提取xml中的信息存在xlsx文件中的&#xff0c;网上很多说是使用QtXlsx&#xff1b; 于是我找了一些帖&#xff0c; 像&#xff1a;https://www.cnblogs.com/liming19680104/p/14398459.html&#xff1b; 大家的说法都是安装第三方库到QT中&#xff…

「AIGC」如何理解大语言模型

一、Transformer模型 Transformer模型是一种基于自注意力机制的架构&#xff0c;由Vaswani等人在2017年的论文《Attention Is All You Need》中首次提出。它主要用于处理序列到序列的任务&#xff0c;如机器翻译、文本摘要等。 案例&#xff1a;机器翻译 假设我们想将英文句子…

OLTP和OLAP,StarRocks数据库,TiDB数据库

OLTP和OLAP&#xff0c;StarRocks数据库&#xff0c;TiDB数据库 一、OLTP和OLAP二、StarRocks数据库三、TiDB数据库 一、OLTP和OLAP OLTP和OLAP是两种不同的数据处理方式&#xff0c;用于处理不同类型的工作负载。OLTP&#xff08;Online Transaction Processing&#xff09;是…

leetcode18-4Sum

题目 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; 0 &l…

ECharts在网页中添加可视化图标-在网页中添加交互图表+option模块案列详解

一、引言 ECharts 是一个使用 JavaScript 编写的开源可视化库&#xff0c;它可以在浏览器中生成交互式的图表。无论是折线图、柱状图、散点图还是饼图&#xff0c;ECharts 都能轻松应对。本文将带领大家了解如何在网页中添加 ECharts 可视化图标。 本章可以直接跳到第五点完整…

XML 映射文件(Mapper 文件)的命名空间

MyBatis 中&#xff0c;mapper 命名空间是指一个 XML 映射文件&#xff08;Mapper 文件&#xff09;的命名空间。每个 Mapper 文件都有一个命名空间&#xff0c;用于定义与特定数据库表相关联的 SQL 映射规则和操作方法。 mapper 命名空间的作用包括&#xff1a; 命名空间的唯…

EOCR-SS-05W电子式过电流继电器 0.5-6A 施耐德韩国三和

三和EOCR株式会社是韩国的电动机保护器生产企业&#xff0c;公司由金仁锡博士&#xff08;施耐德电气集团韩国执行官&#xff09;于1981年建立。 2001年&#xff0c;为了把企业发展成性的、战略性企业&#xff0c;随后加入了法国施耐德电气集团公司。 EOCR主要产品有电子式电…

LeetCode 刷题 -- Day 6

今日题目 题目难度备注102. 二叉树的层序遍历 中等一招鲜吃遍天107. 二叉树的层序遍历 II &#xff09;中等199. 二叉树的右视图 中等637. 二叉树的层平均值简单429. N 叉树的层序遍历中等515. 在每个树行中找最大值中等116. 填充每个节点的下一个右侧节点指针中等104. 二叉树…

JAVA相关面试题分享

Java 基础知识 1.1 面向对象的特征&#xff08;了解&#xff09; 面向对象的特征&#xff1a;封装、继承、多态、抽象。 封装&#xff1a;就是把对象的属性和行为&#xff08;数据&#xff09;结合为一个独立的整体&#xff0c;并尽可能隐藏对 象的内部实现细节&#xff0c;就…

spring boot 定义启动页 到 login

当前办法只是针对 项目启动后 直接跳转到 指定静态页面 如果有验证身份 安全等问题 可以另外想办法 去添加 &#xff0c;需要的直接 拉过去使用 修改 【"redirect: 需要启动后访问到文件位置得地址 ”】 直接上代码 &#xff1a; import org.springframework.context…

Android手势识别面试问题及回答

问题 1: 如何在Android中实现基本的手势识别&#xff1f; 答案: 在Android中&#xff0c;可以通过使用GestureDetector类来实现基本的手势识别。首先需要创建一个GestureDetector的实例&#xff0c;并实现GestureDetector.OnGestureListener接口来响应各种手势事件&#xff0c…

LeeCode 1728 任意图上博弈

题意 传送门 LeeCode 1728 猫和老鼠 II 题解 任意图上博弈&#xff0c;可参考 Games on arbitrary graphs。具体而言&#xff0c;将博弈双方位置加之先后手状态看作任意图上的一个节点&#xff0c;并根据状态转移建立反图。对于可以确定胜负态的节点&#xff0c;以其为起点&…

【百度Apollo】探索自动驾驶:Apollo 新版本 Beta 全新的Dreamview+,便捷灵活更丰富

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引入一、Dreamview介绍二、Dreamview 新特性2.1、基于模式的多场景——流程更简洁地图视角调节&#xff1a;调试流…