Split Shape by Plane in OpenCASCADE
Split Shape by Plane in OpenCASCADE
Abstract. Sometimes you want to split a shape by plane or even split a shape by a B Spline surface, OpenCASCADE provide a feature class BRepFeat_SplitShape to implement the function. The paper give a sample code to split a cylinder by plane.
Key Words. Split Shape, BRep Feature Algorithms.
1. Introduction
OpenCASCADE提供了Boolean Operation实现了任意两个形状的交、并、差的布尔操作。但是如何实现用一个面将一个形状切割成两半呢?其实Boolean Operation中已经有求交分割的算法,但是没有直接提供一个分割的功能类,而是在BRepFeat_SplitShape提供了分割功能。
![]()
Figure 1. Split Cylinder by Plane
2. Code Demo
使用类BRepAlgoAPI_Section和类BRepFeat_SplitShape相结合来实现分割Split形状的功能。完整代码示例如下:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->/*
Copyright(C) 2017 Shing Liu(eryar@163.com)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files(the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions :
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
// Visual Studio 2013 & OpenCASCADE7.1.0
#include <gp_Pln.hxx>
#include <TopoDS.hxx>
#include <TopExp.hxx>
#include <TopExp_Explorer.hxx>
#include <BRepTools.hxx>
#include <BRepPrimAPI_MakeCylinder.hxx>
#include <BRepAlgoAPI_Section.hxx>
#include <BRepFeat_SplitShape.hxx>
#pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")
#pragma comment(lib, "TKG2d.lib")
#pragma comment(lib, "TKG3d.lib")
#pragma comment(lib, "TKGeomBase.lib")
#pragma comment(lib, "TKGeomAlgo.lib")
#pragma comment(lib, "TKBRep.lib")
#pragma comment(lib, "TKTopAlgo.lib")
#pragma comment(lib, "TKBO.lib")
#pragma comment(lib, "TKPrim.lib")
#pragma comment(lib, "TKFeat.lib")
//! Test split a cylinder by plane.
//! You can use the algorithm to split other shapes.
void testSplit()
{
BRepPrimAPI_MakeCylinder aCylinderMaker(10.0, 20.0);
TopoDS_Shape aCylinder = aCylinderMaker.Shape();
// Build section by the split plane for the cylinder.
BRepAlgoAPI_Section aSection(aCylinder, gp_Pln(gp_Pnt(0.0, 0.0, 15.0), gp::DZ()), Standard_False);
aSection.ComputePCurveOn1(Standard_True);
aSection.Approximation(Standard_True);
aSection.Build();
// Split the cylinder shape.
BRepFeat_SplitShape aShapeSpliter(aCylinder);
for (TopExp_Explorer i(aSection.Shape(), TopAbs_EDGE); i.More(); i.Next())
{
TopoDS_Shape anEdge = i.Current();
TopoDS_Shape aFace;
if (aSection.HasAncestorFaceOn1(anEdge, aFace))
{
TopoDS_Edge E = TopoDS::Edge(anEdge);
TopoDS_Face F = TopoDS::Face(aFace);
aShapeSpliter.Add(E, F);
}
}
aShapeSpliter.Build();
// Rebuild left and right shape.
BRep_Builder aBuilder;
TopoDS_Compound aLeftCompound;
TopoDS_Compound aRightCompound;
aBuilder.MakeCompound(aLeftCompound);
aBuilder.MakeCompound(aRightCompound);
// Left shape.
TopTools_MapOfShape aLeftShapeMap;
const TopTools_ListOfShape& aLeftShapes = aShapeSpliter.Left();
for (auto i = aLeftShapes.cbegin(); i != aLeftShapes.cend(); i++)
{
aLeftShapeMap.Add(*i);
aBuilder.Add(aLeftCompound, *i);
}
// Right shape.
TopTools_IndexedMapOfShape aShapeMap;
TopExp::MapShapes(aShapeSpliter.Shape(), TopAbs_FACE, aShapeMap);
for (auto i = aShapeMap.cbegin(); i != aShapeMap.cend(); i++)
{
if (!aLeftShapeMap.Contains(*i))
{
aBuilder.Add(aRightCompound, *i);
}
}
// Output left and right shape.
BRepTools::Write(aLeftCompound, "d:/left.brep");
BRepTools::Write(aRightCompound, "d:/right.brep");
}
int main(int argc, char* argv[])
{
testSplit();
return 0;
}
先创建一个圆柱体,再使用类BRepAlgoAPI_Section将圆柱体用平面进行分割,最后使用类BRepFeat_SplitShape进行分类,得到切割后的形状及Left()形状,把切割后形状中的Left过滤后剩下就是切割另一半的形状;最后导出被平面切割后得到的两半形状。结果用动画演示如下:
![]()
Figure 2. Split Shape animation demo
3. Conclusion
OpenCASCADE提供类BRepFeat_SplitShape来实现对一个形状进行切割的功能,但是要配合BRepAlgoAPI_Section使用。因为Boolean Operation中已经实现了求交、分类的功能,所以在最新版本的源码7.2.0中已经将分割功能集成到了Boolean Operation中。分割后如果没有被改变的面还是原来的面。
Split Shape by Plane in OpenCASCADE的更多相关文章
- OpenCASCADE PCurve of Topological Face
OpenCASCADE PCurve of Topological Face eryar@163.com Abstract. OpenCASCADE provides a class BRepBuil ...
- Mesh Algorithm in OpenCascade
Mesh Algorithm in OpenCascade eryar@163.com Abstract. Rendering a generic surface is a two steps pro ...
- FreeType in OpenCASCADE
FreeType in OpenCASCADE eryar@163.com Abstract. FreeType is required for text display in the 3D view ...
- Egret中使用P2物理引擎
游戏中的对象按照物理规律移动,体现重力.引力.反作用力.加速度等物体特性,实现自由落体.摇摆运动.抛物线运动,以及物理碰撞现象的模拟.用于模拟物理碰撞.物理运动的引擎称为物理引擎. 来自瑞典斯德哥尔摩 ...
- 那些我离不开的 Sketch 插件
当谈论到插件时,我是一名极客.各种新颖的 Sketch 插件层出不穷,但是有那么几个是我怎么也离不开的. Sketch 运行器 多层的插件菜单再也不会影响我的效率了. 我推迟了好几年才使用这个插件,因 ...
- p2 形状
形状是物理引擎进行碰撞模拟计算的依据,是刚体最基本的属性. P2中使用Shape类来表示形状,通过刚体的addShape()方法,将形状添加到刚体中之后, 就可以随着刚体的移动.旋转不断更新,并进行碰 ...
- css3动画效果:3 3D动画
立方体旋转动画效果 css #container{ width: 400px; height: 400px; ; ; -webkit-perspective-origin:50% 225px; per ...
- OpenCASCADE Shape Location
OpenCASCADE Shape Location eryar@163.com Abstract. The TopLoc package of OpenCASCADE gives resources ...
- OpenCascade Shape Representation in OpenSceneGraph
OpenCascade Shape Representation in OpenSceneGraph eryar@163.com 摘要Abstract:本文通过程序实例,将OpenCascade中的拓 ...
随机推荐
- zzulioj--1831-- 周末出游(vector建图+dfs)
1831: 周末出游 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 22 Solved: 8 SubmitStatusWeb Board Descr ...
- Spring深入浅出(一)IOC的基本知识
Spring前言 Spring是一个企业级开发框架,为解决企业级项目开发过于复杂而创建的,框架的主要优势之一就是分层架构,允许开发者自主选择组件. Spring的两大核心机制是IOC(控制反转)和AO ...
- 使用ShareSDK分享-图片的链接
微信中使用ShareSDK分享,需要申请微信开放平台账号,并且以微信中的声明的应用签名打包程序. private void showShare(String url, String title, St ...
- C# fixed语句固定变量详解
相信很多人在这样或那样的项目中,或者无意间看到了fixed语句块,看到之后你肯定会疑问: 1,这个fixed关键字是做什么用的? 2,什么情况下需要该关键字? 3,这个关键字该怎么用? 我相信解决了上 ...
- python(2) 图像通道,几何变换,裁剪
一.图像通道 1.彩色图像转灰度图 from PIL import Image import matplotlib.pyplot as plt img=Image.open('d:/ex.jpg') ...
- git rebase 的使用 (用于撤销某次commit)
Q: I wrote the wrong thing in a commit message. Alternatively, I've forgotten to include some files. ...
- js利用点击事件做一个简单的计算器
先放一个样式图: 源代码如下: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...
- Java基础学习总结(21)——数组
一.数组的基本概念 数组可以看成是多个相同类型数据组合,对这些数据的统一管理. 数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量. 数组的元素可以是任何数据类型,包括基 ...
- oracle 10g/11g RAC 启停归档模式
oracle 10g rac 启停归档模式 假设Oracle数据库执行在归档模式,当进行数据库维护时,可能须要暂停数据库的归档,在完毕维护后,再又一次启动归档模式. 通过下面步骤能够从归档 ...
- Android 中图能够用到的图片处理类 BitmapUtils
Android在实际开发中非常多时候都要对图片进行一定的处理,这里总结的BitmapUtils 类包含一下几个功能: 1.Android图片倒影, 2.Android图片模糊处理, 3.Android ...