青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

Split Shape by Plane in OpenCASCADE

Posted on 2017-07-01 12:21 eryar 閱讀(4051) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

Split Shape by Plane in OpenCASCADE

eryar@163.com

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提供了分割功能。

wps69BE.tmp

Figure 1. Split Cylinder by Plane

2. Code Demo

使用類BRepAlgoAPI_Section和類BRepFeat_SplitShape相結合來實現分割Split形狀的功能。完整代碼示例如下:

/*
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過濾后剩下就是切割另一半的形狀;最后導出被平面切割后得到的兩半形狀。結果用動畫演示如下:

split shape

Figure 2. Split Shape animation demo

3. Conclusion

OpenCASCADE提供類BRepFeat_SplitShape來實現對一個形狀進行切割的功能,但是要配合BRepAlgoAPI_Section使用。因為Boolean Operation中已經實現了求交、分類的功能,所以在最新版本的源碼7.2.0中已經將分割功能集成到了Boolean Operation中。分割后如果沒有被改變的面還是原來的面。

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久综合九色综合欧美就去吻| 亚洲激情女人| 激情伊人五月天久久综合| 黑丝一区二区| aa级大片欧美| 久久中文字幕导航| 日韩视频精品在线观看| 久久久999国产| 国产精品美女主播在线观看纯欲| 在线看片日韩| 久久精品欧洲| 中文有码久久| 欧美日韩hd| 亚洲黄一区二区| 久久久久久综合网天天| 99国产一区| 母乳一区在线观看| 国内精品美女在线观看| 销魂美女一区二区三区视频在线| 亚洲精品美女在线观看| 久久亚洲精品一区| 国一区二区在线观看| 欧美激情欧美狂野欧美精品| 久久精品国产一区二区电影| 亚洲激情第一页| 亚洲天堂成人| 国产精品免费一区二区三区观看| 久久久久99精品国产片| 欧美一区二区免费| 国产欧美在线观看| 久久gogo国模啪啪人体图| 国产精品99久久久久久久久| 国内精品亚洲| 夜夜精品视频| 91久久综合亚洲鲁鲁五月天| 亚洲国产天堂网精品网站| 久久躁狠狠躁夜夜爽| 亚洲一区二区视频在线| 亚洲福利小视频| 美女成人午夜| 亚洲狼人综合| 一本色道久久综合一区 | 久久久久综合| 欧美日韩精品一区二区在线播放| 久久激情中文| 欧美日韩亚洲系列| 亚洲一区尤物| 欧美国产精品v| 亚洲综合色网站| 免费看av成人| 裸体女人亚洲精品一区| 免费亚洲电影在线观看| 久久精品国产第一区二区三区最新章节| 韩日欧美一区二区三区| 亚洲高清中文字幕| 精品动漫3d一区二区三区免费版| 一区二区电影免费观看| 亚洲精品国产精品乱码不99| 亚洲精品乱码久久久久久蜜桃91| 激情丁香综合| 久久99伊人| 99伊人成综合| 欧美激情视频一区二区三区免费| 亚洲男人av电影| 欧美伊人久久久久久久久影院| 亚洲欧美韩国| 欧美日韩一区三区| 亚洲日韩成人| 在线午夜精品自拍| 久久另类ts人妖一区二区| 夜夜精品视频| 欧美视频不卡| 久久先锋影音| 亚洲福利在线视频| 中文有码久久| 午夜在线精品| 国产视频一区欧美| 亚洲精品久久久久久久久久久| 亚洲久久在线| 欧美日韩免费| 亚洲一区二区三区四区视频| 亚洲国产综合91精品麻豆| 久久尤物视频| 亚洲精品综合| 亚洲欧洲在线一区| 模特精品在线| 一本一道久久综合狠狠老精东影业| 一本在线高清不卡dvd| 国产精品久久久久久久久久久久久久 | 亚洲午夜精品久久久久久app| 亚洲欧美国产高清| 国产欧美精品| 欧美aa国产视频| 在线亚洲自拍| 久久最新视频| 99在线|亚洲一区二区| 国产精品无码永久免费888| 亚洲欧洲在线视频| 亚洲综合电影| 激情久久中文字幕| 欧美日本免费一区二区三区| 欧美电影在线免费观看网站 | 欧美亚洲在线播放| 欧美国产日韩一区二区| 亚洲自拍都市欧美小说| 精品1区2区| 欧美视频中文在线看| 久久精品久久综合| 亚洲精品中文字幕在线| 久久黄金**| 夜夜嗨av一区二区三区网站四季av| 国产精品久久二区| 榴莲视频成人在线观看| 亚洲一区二区三区国产| 老司机精品视频一区二区三区| 一本久道久久综合婷婷鲸鱼| 国内精品视频在线播放| 国产精品久久久久高潮| 欧美成人精品1314www| 亚洲国产你懂的| 欧美一区二区观看视频| 国产精品揄拍500视频| 性感少妇一区| 美女国内精品自产拍在线播放| 精品动漫3d一区二区三区免费| 欧美日韩国产一区精品一区| 久久久午夜电影| 先锋影音一区二区三区| 一区二区三区精品视频| 欧美黑人在线播放| 久久久久亚洲综合| 欧美一区二区视频在线| 在线一区二区三区做爰视频网站 | 亚洲电影av在线| 国产午夜精品视频免费不卡69堂| 欧美日韩亚洲精品内裤| 欧美成人日韩| 欧美gay视频激情| 久久综合给合久久狠狠色| 欧美亚洲综合网| 午夜精品久久99蜜桃的功能介绍| 久久综合久久88| 久久精品72免费观看| 亚洲专区欧美专区| 亚洲永久视频| 亚洲欧美日韩爽爽影院| 午夜精彩国产免费不卡不顿大片| 国一区二区在线观看| 国产在线精品二区| 国产日产欧产精品推荐色 | 亚洲美女视频在线观看| 亚洲黄色免费电影| 最新成人在线| 99视频国产精品免费观看| 亚洲日本欧美| 一区二区不卡在线视频 午夜欧美不卡在| 久久精品国产清自在天天线| 亚洲高清激情| 亚洲日本理论电影| 亚洲精品中文字幕有码专区| 91久久黄色| 日韩一区二区精品| 亚洲一区欧美| 欧美在线www| 狂野欧美一区| 欧美视频在线一区| 国产欧美激情| 亚洲激情视频在线播放| 亚洲天堂av图片| 亚洲精品国产精品国自产观看浪潮| 亚洲黄色一区| 亚洲一卡久久| 久久综合999| 91久久精品一区| 亚洲欧美一区二区视频| 久久久亚洲精品一区二区三区 | 一区二区精品国产| 性亚洲最疯狂xxxx高清| 久久伊人一区二区| 欧美日韩国产区一| 国内成人精品视频| 亚洲免费观看在线观看| 欧美影院视频| 亚洲激情成人网| 性一交一乱一区二区洋洋av| 蜜月aⅴ免费一区二区三区| 国产精品国产三级国产aⅴ无密码| 国产一区二区黄色| 国产区精品在线观看| 亚洲精品激情| 久久久亚洲影院你懂的| 亚洲免费播放| 久久亚洲综合色一区二区三区| 欧美性做爰毛片| 国产精品一区在线观看| 亚洲激情社区| 久久色在线播放| 亚洲私拍自拍| 欧美日本在线看| 影音国产精品|