Open cascade中如何使用BRepAlgoAPI_Splitter分割一個Face

理論介紹

在OpenCASCADE幾何建模內核中,BRepAlgoAPI_Splitter是一個強大的工具,用于將一個形狀(Shape)用另一個形狀(Tool)進行分割。這種操作在CAD建模中非常常見,比如用平面切割實體、用曲線分割曲面等。

BRepAlgoAPI_Splitter的工作原理是基于布爾運算的切割算法。它能夠處理各種拓撲形狀之間的分割操作,包括:

  • 用邊分割面
  • 用面分割體
  • 用線分割邊

分割操作的結果取決于輸入形狀和工具的幾何關系。當工具完全穿過被分割形狀時,通常會產生多個子形狀;當工具只部分接觸時,則可能只修改原有形狀而不分割。

核心代碼分析

1. 創建被分割的面

TopoDS_Face makeFace(){gp_Pnt P1(-1.0/2.0, -1.0/2.0, 0);gp_Pnt P2(-1.0/2.0, 1.0/2.0, 0);gp_Pnt P3(1.0/2.0, 1.0/2.0, 0);gp_Pnt P4(1.0/2.0, -1.0/2.0, 0);BRepBuilderAPI_MakePolygon mkPoly(P1,P2,P3,P4);mkPoly.Add(mkPoly.FirstVertex());TopoDS_Wire wire = mkPoly.Wire();BRepBuilderAPI_MakeFace face(wire);return face.Face();
}

這個函數創建一個正方形面,位于XY平面,邊長1個單位,中心在原點。我們使用BRepBuilderAPI_MakePolygon創建多邊形,然后將其閉合為Wire,最后用Wire創建Face。

2. 創建分割工具

TopoDS_Face makeTool(){static constexpr double bigNumber {100};gp_Pnt P1(0, -bigNumber, -bigNumber);gp_Pnt P極2(0, -bigNumber, bigNumber);gp_Pnt P3(0, bigNumber, bigNumber);gp_Pnt P4(0, bigNumber, -bigNumber);BRepBuilderAPI_MakePoly極gon mkPoly(P1,P2,P3,P4);mkPoly.Add(mkPoly.FirstVertex());TopoDS_Wire wire = mkPoly.Wire();BRepBuilderAPI_MakeFace tool(wire);return tool.Face();}

這里創建一個無限大的YZ平面(實際用大數100近似),作為分割工具。這個平面將垂直于X軸,穿過原點。

3. 執行分割操作

TopoDS_Face face = makeFace();TopoDS_Face tool = makeTool();TopTools_ListOfShape originalArguments;originalArguments.Append (face);TopTools_ListOfShape firstSplitLine;firstSplitLine.Append(tool);auto squareSplitOnce = BRepAlgoAPI_Splitter();squareSplitOnce.SetArguments(originalArguments);squareSplitOnce.SetTools(firstSplitLine);squareSplitOnce.Build();

關鍵步驟:

  1. 創建被分割的面和分割工具
  2. 將面添加到參數列表(Arguments)
  3. 將工具添加到工具列表(Tools)
  4. 創建BRepAlgoAPI_Splitter對象并設置參數和工具
  5. 調用Build()方法執行分割

4. 分析結果

Handle(BRepTools_History) hist = squareSplitOnce.History();hist->Dump(std::cout);auto generated = squareSplitOnce.Generated(face);std::cout << "generated: " << generated.Size() << '\n';auto modified = squareSplitOnce.Modified(face);std::cout << "modified: " << modified.Size() << '\n';

History()方法返回操作的歷史記錄,可以查詢哪些形狀被修改、生成或移除。Generated()Modified()方法分別返回由輸入形狀生成的新形狀和被修改的形狀。

完整代碼

#include <BRepBuilderAPI_MakeFace.hxx>
#include <BRepBuilderAPI_MakePolygon.hxx>
#include <BRepAlgoAPI_Splitter.hxx>
#include <TopoDS.hxx>
#include <TopoDS_Face.hxx>
#include <TopoDS_Wire.hxx>
#include <TopoDS_Iterator.hxx>
#include <TopExp_Explorer.hxx>
#include <TopTools_IndexedMapOfShape.hxx>
#include <iostream>TopoDS_Face makeFace()
{gp_Pnt P1(-1.0/2.0, -1.0/2.0, 0);gp_Pnt P2(-1.0/2.0, 1.0/2.0, 0);gp_Pnt P3(1.0/2.0, 1.0/2.0, 0);gp_Pnt P4(1.0/2.0, -1.0/2.0, 0);BRepBuilderAPI_MakePolygon mkPoly(P1,P2,P3,P4);mkPoly.Add(mkPoly.FirstVertex());TopoDS_Wire wire = mkPoly.Wire();BRepBuilderAPI_MakeFace face(wire);return face.Face();
}TopoDS_Face makeTool()
{static constexpr double bigNumber {100};gp_Pnt P1(0, -bigNumber, -bigNumber);gp_Pnt P2(0, -bigNumber, bigNumber);gp_Pnt P3(0, bigNumber, bigNumber);gp_Pnt P4(0, bigNumber, -bigNumber);BRepBuilderAPI_MakePolygon mkPoly(P1,P2,P3,P4);mkPoly.Add(mkPoly.FirstVertex());TopoDS_Wire wire = mkPoly.Wire();BRepBuilderAPI_MakeFace tool(wire);return tool.Face();
}void CountSubShape(const TopoDS_Face& face)
{TopTools_IndexedMapOfShape faces;TopTools_IndexedMapOfShape wires;TopTools_IndexedMapOfShape edges;TopTools_IndexedMapOfShape vertexes;for (TopExp_Explorer it(face, TopAbs_FACE); it.More(); it.Next()) {faces.Add(it.Current());}for (TopExp_Explorer it(face, TopAbs_WIRE); it.More(); it.Next()) {wires.Add(it.Current());}for (TopExp_Explorer it(face, TopAbs_EDGE); it.More(); it.Next()) {edges.Add(it.Current());}for (TopExp_Explorer it(face, TopAbs_VERTEX); it.More(); it.Next()) {vertexes.Add(it.Current());}std::cout << " faces=" << faces.Size()<< " wires=" << wires.Size()<< " edges=" << edges.Size()<< " vertexes=" << vertexes.Size()<< '\n';
}void PrintHistory(const TopTools_IndexedMapOfShape& map, Handle(BRepTools_History) hist)
{for (Standard_Integer i = 1; i <= map.Extent(); i++) {const TopoDS_Shape& shape = map(i);std::cout << "    modified: " << hist->Modified(shape).Size() << '\n';std::cout << "    generated: " << hist->Generated(shape).Size() << '\n';std::cout << "    removed: " << hist->IsRemoved(shape) << '\n';}
}void PrintHistory(const TopoDS_Face& face, Handle(BRepTools_History) hist)
{TopTools_IndexedMapOfShape faces;TopTools_IndexedMapOfShape wires;TopTools_IndexedMapOfShape edges;TopTools_IndexedMapOfShape vertexes;for (TopExp_Explorer it(face, TopAbs_FACE); it.More(); it.Next()) {faces.Add(it.Current());}for (TopExp_Explorer it(face, TopAbs_WIRE); it.More(); it.Next()) {wires.Add(it.Current());}for (TopExp_Explorer it(face, TopAbs_EDGE); it.More(); it.Next()) {edges.Add(it.Current());}for (TopExp_Explorer it(face, TopAbs_VERTEX); it.More(); it.Next()) {vertexes.Add(it.Current());}std::cout << "  faces:\n";PrintHistory(faces, hist);std::cout << "  wires:\n";PrintHistory(wires, hist);std::cout << "  edges:\n";PrintHistory(edges, hist);std::cout << "  vertexes:\n";PrintHistory(vertexes, hist);
}int main()
{TopoDS_Face face = makeFace();//CountSubShape(face);TopoDS_Face tool = makeTool();//CountSubShape(tool);TopTools_ListOfShape originalArguments;originalArguments.Append (face);TopTools_ListOfShape firstSplitLine;firstSplitLine.Append(tool);auto squareSplitOnce = BRepAlgoAPI_Splitter();squareSplitOnce.SetArguments(originalArguments);squareSplitOnce.SetTools(firstSplitLine);squareSplitOnce.Build();Handle(BRepTools_History) hist = squareSplitOnce.History();hist->Dump(std::cout);auto generated = squareSplitOnce.Generated(face);std::cout << "generated: " << generated.Size() << '\n';auto modified = squareSplitOnce.Modified(face);std::cout << "modified: " << modified.Size() << '\n';
#if 0std::cout << "\nface:\n";PrintHistory(face, hist);std::cout << "\ntool:\n";PrintHistory(tool, hist);
#endif
}

結論

通過BRepAlgoAPI_Splitter,我們可以方便地在OpenCASCADE中實現形狀的分割操作。本文展示了如何用一個大平面分割一個正方形面,實際應用中可以根據需要調整被分割形狀和分割工具的幾何參數。操作的歷史記錄功能對于理解分割過程和結果分析非常有幫助。

在實際項目中,分割操作常用于創建復雜幾何形狀、進行幾何分析或準備有限元網格劃分等場景。掌握這些基礎操作是使用OpenCASCADE進行高級幾何建模的重要一步。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/99111.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/99111.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/99111.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【醫療 AI】Baichuan-M2 醫療大模型:技術解讀與使用方法

【醫療 AI】Baichuan-M2 醫療大模型&#xff1a;技術解讀與使用方法1. Baichuan-M2 醫療大模型簡介1.1 基本信息1.2 下載地址1.3 技術特點2. Baichuan-M2 模型技術報告2.1 摘要2.2 醫學性能評估2.2.1 HealthBench基準2.2.2 中國醫療場景對比評估2.3 系統架構2.3.1 驗證器系統2.…

unity pcd 二進制版 簡單顯示文件對象(單色)

unity Point Cloud Viewer and Tool 那個插件不支持pcd二進制&#xff0c;而且網上到處都是AI 我恨這種AI濫用&#xff0c;提供不了一點價值 好了&#xff0c;言歸正傳 可以在Point Cloud Viewer and Tool這個插件報錯地方轉用這個代碼&#xff0c;具體咋結合請自行研究。 …

強大的開源文檔問答工具-Kotaemon

Kotaemon 是一個基于 RAG&#xff08;Retrieval-Augmented Generation&#xff09;架構的開源文檔問答工具&#xff0c;為用戶提供與文檔對話的智能交互體驗。該項目同時服務于終端用戶和開發者&#xff0c;具有高度的可擴展性和定制化能力。技術棧分析核心技術棧后端框架Pytho…

區塊鏈:搭建簡單Fabric網絡并調用智能合約

使用docker服務搭建Hyperledger/fabric網絡的詳細教程&#xff0c;實現構建多節點的簡單聯盟鏈&#xff0c;并編寫、調用智能合約實現投票業務。 目錄 背景知識 Hyperledger Fabric 基本組件 交易(Transaction) 智能合約 實驗目的 實驗環境 基礎依賴 安裝Golang 安裝do…

Web前端面試題(2)

Web前端面試題(附答案及解析)&#xff08;2025.9月最新版&#xff09;-CSDN博客 1.link 與 import 的區別和用法 主要區別 特性<link>import語法類型HTML標簽CSS規則加載方式并行加載&#xff08;與其他資源同時加載&#xff09;串行加載&#xff08;必須等待主CSS文件…

Paxos協議

目錄 Paxos 是什么&#xff08;What&#xff09; Paxos 的目的&#xff08;Why&#xff09; 角色與職責&#xff08;Who&#xff09; 基本流程&#xff08;How&#xff09; 常見問題與對策 什么是多數派&#xff08;Quorum&#xff09; Paxos vs Raft 異同點 Paxos 是什…

第十二篇:Qcom Camx打印實時幀率 FPS

一、第一種方式(有些低平臺可能沒有) adb shell setprop persist.vendor.camera.enableFPSLog TRUE adb shell setprop persist.vendor.camera.systemLogEnable TRUE adb shell setprop vendor.debug.camera.overrideLogLevels 0xff chi-cdk/core/chiframework/chxextensi…

TRAE通用6A規則+敏捷開發5S規則

網上研究別人的一些規則,也搞一份給大家 6A工作流項目規則 身份定義 你是一位資深的軟件架構師和工程師,具備豐富的項目經驗和系統思維能力。你的核心優勢在于: 上下文工程專家:構建完整的任務上下文,而非簡單的提示響應 規范驅動思維:將模糊需求轉化為精確、可執行的規…

【Nginx開荒攻略】Nginx主配置文件結構與核心模塊詳解:從0到1掌握nginx.conf:

目錄 引言 1 nginx.conf的整體結構 2 main全局塊詳解 2.1 核心指令解析 2.1.1 user&#xff1a;運行用戶 2.1.2 worker_processes&#xff1a;工作進程數 2.1.3 pid&#xff1a;PID文件路徑 2.1.4 worker_rlimit_nofile&#xff1a;文件描述符限制 2.2 main塊配置示例…

【前端教程】從基礎到優化:一個登錄頁面的完善過程

最近做了一個簡單的登錄頁面,主要練習了文本框的onfocus與onblur事件的使用。雖然功能實現了,但仔細想想還有不少可以改進的地方。今天就來分享一下這個登錄頁面的開發過程和優化思路。 初始實現與解析 先來看一下最初的實現代碼: <!DOCTYPE html> <html> &l…

獨家 | 抖音生活服務調整:涂晴接管市場和達人運營,旭凱擔任北部大區負責人

文/刀客doc(頭條精選作者)刀客doc獨家獲悉&#xff0c;9月8日抖音生活服務完成新一輪組織調整&#xff0c;并已在內部all hands完成官宣。此次調整主要涉及北部大區、達人運營與市場部三大條線的人事輪換與匯報關系變更。核心變動如下&#xff1a;涂晴&#xff0c;原抖音生活服…

class_9:java 抽象類和接口

抽象類 需要用abstract 修飾類和接口abstract class Person{String address;String name;abstract public void eat();abstract public void drink();public void printInfo(){System.out.println("name " name);}} class Student extends Person{public void eat()…

【C++】隊列queue的使用

語法 在 C 中&#xff0c;隊列的語法如下&#xff1a; #include <queue>// 聲明隊列 std::queue<Type> q;這里 Type 是隊列中存儲元素的數據類型。 常用操作 隊列提供了以下常用操作&#xff1a; empty(): 檢查隊列是否為空。 size(): 返回隊列中的元素數量。 fron…

HTTP 協議的基本格式

目錄 &#xff08;一&#xff09;HTTP是什么 &#xff08;二&#xff09;報文格式 &#xff08;1&#xff09;請求 ①首行 1.URL 2.方法&#xff08;method&#xff09; Ⅰ.GET Ⅱ.POST Ⅲ.PUT Ⅳ.DELETE 3.版本號 ②請求頭&#xff08;header&#xff09; 1.鍵值對…

計算機網絡的基本概念-2

1、數據交換技術&#xff1a;電路交換、報文交換與分組交換網絡核心部分的關鍵設備是路由器&#xff0c;其工作方式是分組交換。要理解分組交換&#xff0c;必須先了解其前兩種技術。1. 電路交換 (Circuit Switching)核心思想&#xff1a;通信前必須預先建立一條專用的物理通路…

車載網絡技術--SOME_IP協議詳解

文章目錄前言SOME/IP概念SOME/IP協議格式SOME/IP功能介紹序列化序列化規則發布和訂閱服務發現&#xff08;SOME/IP-SD&#xff09;SOME/IP-TP協議使用場景SOME/IP-TP協議參考文章&#xff1a;前言 本文介紹了SOME/IP協議的具體內容&#xff0c;包括報文格式&#xff0c;協議選…

JVM 核心知識全解析:從類加載到垃圾回收的深度認知

什么是JVM&#xff1f; JVM全稱&#xff08;Java Virtual Machine&#xff09;&#xff0c;中譯為&#xff1a;Java虛擬機 本質&#xff1a;是一個運行在計算機上的程序 職責&#xff1a;運行Java字節碼文件&#xff08;因為計算機只能認識機器碼文件&#xff0c;所以需要JVM將…

Keepalived 負載均衡

Keepalived 負載均衡 Keepalived 可以與 LVS&#xff08;Linux Virtual Server&#xff09;結合&#xff0c;提供強大的四層負載均衡功能。它通過 IPVS&#xff08;IP Virtual Server&#xff09;內核模塊實現高性能的負載分發。 核心組件 Virtual Server&#xff1a;虛擬服務器…

拷打DeepSeek實現自動生成差分電荷計算文件和后處理

差分電荷&#xff08;charge density difference&#xff09;是材料模擬中分析電子結構變化的直觀工具。 它把成鍵后的真實電荷密度減去成鍵前各碎片疊加的電荷密度&#xff0c;得到一張“電子遷移地圖” 于是可以一眼看出化學鍵形成時電子從哪里來到哪里去&#xff0c;表面吸…

AI問答-Nuxt4:什么時候發布的,有哪些特性,和Nuxt3相比 有哪些優勢 / Nuxt4 / Nuxt-v4

Nuxt 4于2025年7月至8月期間正式發布&#xff0c;作為Nuxt框架的重大版本更新&#xff0c;其核心聚焦于穩定性提升、開發者體驗優化及性能增強&#xff0c;與Nuxt 3相比&#xff0c;優勢體現在項目結構、數據獲取、類型系統、開發工具鏈等多個層面。一、Nuxt 4 發布時間線測試階…