From d5db3ff5887bd34a51957dc887fb26c814c4830a Mon Sep 17 00:00:00 2001 From: tomate44 Date: Tue, 3 Jul 2018 13:47:31 +0200 Subject: [PATCH] add OCC defeaturing to PartWB Gui --- src/Mod/Part/Gui/CommandSimple.cpp | 96 +++++++ src/Mod/Part/Gui/Resources/Part.qrc | 1 + .../Gui/Resources/icons/Part_Defeaturing.svg | 253 ++++++++++++++++++ src/Mod/Part/Gui/Workbench.cpp | 2 + 4 files changed, 352 insertions(+) create mode 100644 src/Mod/Part/Gui/Resources/icons/Part_Defeaturing.svg diff --git a/src/Mod/Part/Gui/CommandSimple.cpp b/src/Mod/Part/Gui/CommandSimple.cpp index 7b2edf5dfc..821417f157 100644 --- a/src/Mod/Part/Gui/CommandSimple.cpp +++ b/src/Mod/Part/Gui/CommandSimple.cpp @@ -26,6 +26,7 @@ # include # include # include +# include # include # include #endif @@ -39,6 +40,7 @@ #include #include #include +#include #include "../App/PartFeature.h" #include "../App/TopoShape.h" @@ -259,6 +261,99 @@ bool CmdPartRefineShape::isActive(void) return Gui::Selection().countObjectsOfType(partid) > 0; } +//=========================================================================== +// Part_Defeaturing +//=========================================================================== +DEF_STD_CMD_A(CmdPartDefeaturing); + +CmdPartDefeaturing::CmdPartDefeaturing() + : Command("Part_Defeaturing") +{ + sAppModule = "Part"; + sGroup = QT_TR_NOOP("Part"); + sMenuText = QT_TR_NOOP("Defeaturing"); + sToolTipText = QT_TR_NOOP("Remove feature from a shape"); + sWhatsThis = "Part_Defeaturing"; + sStatusTip = sToolTipText; + sPixmap = "Part_Defeaturing"; +} + +void CmdPartDefeaturing::activated(int iMsg) +{ + Q_UNUSED(iMsg); + Gui::WaitCursor wc; + Base::Type partid = Base::Type::fromName("Part::Feature"); + std::vector objs = Gui::Selection().getSelectionEx(0, partid); + openCommand("Defeaturing"); + for (std::vector::iterator it = objs.begin(); it != objs.end(); ++it) { + try { + std::string shape; + shape.append("sh=App."); + shape.append(it->getDocName()); + shape.append("."); + shape.append(it->getFeatName()); + shape.append(".Shape\n"); + + std::string faces; + std::vector subnames = it->getSubNames(); + for (std::vector::iterator sub = subnames.begin(); sub != subnames.end(); ++sub) { + faces.append("sh."); + faces.append(*sub); + faces.append(","); + } + + doCommand(Doc,"\nsh = App.getDocument('%s').%s.Shape\n" + "nsh = sh.defeaturing([%s])\n" + "if not sh.isPartner(nsh):\n" + "\t\tdefeat = App.ActiveDocument.addObject('Part::Feature','Defeatured').Shape = nsh\n" + "\t\tGui.ActiveDocument.%s.hide()\n" + "else:\n" + "\t\tFreeCAD.Console.PrintError('Defeaturing failed\\n')", + it->getDocName(), + it->getFeatName(), + faces.c_str(), + it->getFeatName()); + } + catch (const Base::Exception& e) { + Base::Console().Warning("%s: %s\n", it->getFeatName(), e.what()); + } + } + commitCommand(); + updateActive(); +} + +bool CmdPartDefeaturing::isActive(void) +{ + Base::Type partid = Base::Type::fromName("Part::Feature"); + std::vector objs = Gui::Selection().getSelectionEx(0, partid); + for (std::vector::iterator it = objs.begin(); it != objs.end(); ++it) { + std::vector subnames = it->getSubNames(); + for (std::vector::iterator sub = subnames.begin(); sub != subnames.end(); ++sub) { + if (sub->substr(0,4) == "Face") { +#if OCC_VERSION_HEX < 0x070300 + return true; +#else + return false; +#endif + } + } + } + return false; +} + + +// { +// if (getActiveGuiDocument()) +// #if OCC_VERSION_HEX < 0x060900 +// return false; +// #else +// return true; +// #endif +// else +// return false; +// } + + //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void CreateSimplePartCommands(void) @@ -268,4 +363,5 @@ void CreateSimplePartCommands(void) rcCmdMgr.addCommand(new CmdPartShapeFromMesh()); rcCmdMgr.addCommand(new CmdPartSimpleCopy()); rcCmdMgr.addCommand(new CmdPartRefineShape()); + rcCmdMgr.addCommand(new CmdPartDefeaturing()); } diff --git a/src/Mod/Part/Gui/Resources/Part.qrc b/src/Mod/Part/Gui/Resources/Part.qrc index 11f49edd00..9603411328 100644 --- a/src/Mod/Part/Gui/Resources/Part.qrc +++ b/src/Mod/Part/Gui/Resources/Part.qrc @@ -41,6 +41,7 @@ icons/preferences-part_design.svg icons/Tree_Part.svg icons/Part_CheckGeometry.svg + icons/Part_Defeaturing.svg icons/Part_Ellipse_Parametric.svg icons/Part_Helix_Parametric.svg icons/Part_Spiral_Parametric.svg diff --git a/src/Mod/Part/Gui/Resources/icons/Part_Defeaturing.svg b/src/Mod/Part/Gui/Resources/icons/Part_Defeaturing.svg new file mode 100644 index 0000000000..fda2de1000 --- /dev/null +++ b/src/Mod/Part/Gui/Resources/icons/Part_Defeaturing.svg @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + [triplus] + + + + 2016-02-26 + http://www.freecadweb.org/wiki/index.php?title=Artwork + + + FreeCAD + + + FreeCAD/src/Mod/Part/Gui/Resources/icons/PartWorkbench.svg + + + FreeCAD LGPL2+ + + + https://www.gnu.org/copyleft/lesser.html + + + [agryson] Alexander Gryson + + + + + + + + + + + + + + + + + + + diff --git a/src/Mod/Part/Gui/Workbench.cpp b/src/Mod/Part/Gui/Workbench.cpp index 27bf6cad87..fd94722087 100644 --- a/src/Mod/Part/Gui/Workbench.cpp +++ b/src/Mod/Part/Gui/Workbench.cpp @@ -106,6 +106,7 @@ Gui::MenuItem* Workbench::setupMenuBar() const << "Part_SimpleCopy" << "Part_RefineShape" << "Part_CheckGeometry" + << "Part_Defeaturing" << "Separator" << bop << join << split << compound << "Separator" @@ -188,6 +189,7 @@ Gui::ToolBarItem* Workbench::setupToolBars() const << "Part_CompJoinFeatures" << "Part_CompSplitFeatures" << "Part_CheckGeometry" + << "Part_Defeaturing" << "Part_Section" << "Part_CrossSections";