From 34fa5c84b23a23970ba8136e7bd45423a9bcfdb1 Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 21 Nov 2020 11:46:59 +0100 Subject: [PATCH] Mesh: [skip ci] add command to split a mesh into its components --- src/Mod/Mesh/Gui/Command.cpp | 47 ++++++++++++++++++++++++++++++++++ src/Mod/Mesh/Gui/Workbench.cpp | 1 + 2 files changed, 48 insertions(+) diff --git a/src/Mod/Mesh/Gui/Command.cpp b/src/Mod/Mesh/Gui/Command.cpp index 648b22513d..6c9aaec2a3 100644 --- a/src/Mod/Mesh/Gui/Command.cpp +++ b/src/Mod/Mesh/Gui/Command.cpp @@ -1821,6 +1821,52 @@ bool CmdMeshMerge::isActive(void) //-------------------------------------------------------------------------------------- +DEF_STD_CMD_A(CmdMeshSplitComponents) + +CmdMeshSplitComponents::CmdMeshSplitComponents() + : Command("Mesh_SplitComponents") +{ + sAppModule = "Mesh"; + sGroup = QT_TR_NOOP("Mesh"); + sMenuText = QT_TR_NOOP("Split by components"); + sToolTipText = QT_TR_NOOP("Split selected mesh into its components"); + sWhatsThis = "Mesh_SplitComponents"; + sStatusTip = sToolTipText; + //sPixmap = "Mesh_SplitComponents"; +} + +void CmdMeshSplitComponents::activated(int) +{ + App::Document *pcDoc = App::GetApplication().getActiveDocument(); + if (!pcDoc) + return; + + openCommand("Mesh split"); + std::vector objs = Gui::Selection().getObjectsOfType(Mesh::Feature::getClassTypeId()); + for (std::vector::const_iterator it = objs.begin(); it != objs.end(); ++it) { + const MeshObject& mesh = static_cast(*it)->Mesh.getValue(); + std::vector > comps = mesh.getComponents(); + + for (const auto comp : comps ) { + std::unique_ptr kernel(mesh.meshFromSegment(comp)); + kernel->setTransform(mesh.getTransform()); + + Mesh::Feature* feature = static_cast(pcDoc->addObject("Mesh::Feature", "Component")); + feature->Mesh.setValuePtr(kernel.release()); + } + } + + updateActive(); + commitCommand(); +} + +bool CmdMeshSplitComponents::isActive(void) +{ + return getSelection().countObjectsOfType(Mesh::Feature::getClassTypeId()) == 1; +} + +//-------------------------------------------------------------------------------------- + DEF_STD_CMD_A(CmdMeshScale) CmdMeshScale::CmdMeshScale() @@ -1909,5 +1955,6 @@ void CreateMeshCommands(void) rcCmdMgr.addCommand(new CmdMeshSegmentation()); rcCmdMgr.addCommand(new CmdMeshSegmentationBestFit); rcCmdMgr.addCommand(new CmdMeshMerge()); + rcCmdMgr.addCommand(new CmdMeshSplitComponents()); rcCmdMgr.addCommand(new CmdMeshScale()); } diff --git a/src/Mod/Mesh/Gui/Workbench.cpp b/src/Mod/Mesh/Gui/Workbench.cpp index 8443589716..9faa733849 100644 --- a/src/Mod/Mesh/Gui/Workbench.cpp +++ b/src/Mod/Mesh/Gui/Workbench.cpp @@ -226,6 +226,7 @@ Gui::MenuItem* Workbench::setupMenuBar() const << cutting << "Separator" << "Mesh_Merge" + << "Mesh_SplitComponents" << "Separator"; Gui::CommandManager& mgr = Gui::Application::Instance->commandManager(); if (mgr.getCommandByName("MeshPart_CreateFlatMesh"))