diff --git a/src/Mod/Part/Gui/Command.cpp b/src/Mod/Part/Gui/Command.cpp
index 891a75fec..5b900aa50 100644
--- a/src/Mod/Part/Gui/Command.cpp
+++ b/src/Mod/Part/Gui/Command.cpp
@@ -38,6 +38,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -291,17 +292,31 @@ void CmdPartCut::activated(int iMsg)
}
std::string FeatName = getUniqueObjectName("Cut");
- std::string BaseName = Sel[0].getFeatName();
- std::string ToolName = Sel[1].getFeatName();
openCommand("Part Cut");
doCommand(Doc,"App.activeDocument().addObject(\"Part::Cut\",\"%s\")",FeatName.c_str());
- doCommand(Doc,"App.activeDocument().%s.Base = App.activeDocument().%s",FeatName.c_str(),BaseName.c_str());
- doCommand(Doc,"App.activeDocument().%s.Tool = App.activeDocument().%s",FeatName.c_str(),ToolName.c_str());
- doCommand(Gui,"Gui.activeDocument().hide('%s')",BaseName.c_str());
- doCommand(Gui,"Gui.activeDocument().hide('%s')",ToolName.c_str());
- copyVisual(FeatName.c_str(), "ShapeColor", BaseName.c_str());
- copyVisual(FeatName.c_str(), "DisplayMode", BaseName.c_str());
+ doCommand(Doc,"App.activeDocument().%s.Base = App.activeDocument().%s",FeatName.c_str(),Sel[0].getFeatName());
+ doCommand(Doc,"App.activeDocument().%s.Tool = App.activeDocument().%s",FeatName.c_str(),Sel[1].getFeatName());
+
+ // hide the input objects and remove them from the parent group
+ App::DocumentObjectGroup* targetGroup = 0;
+ for (std::vector::iterator it = Sel.begin(); it != Sel.end(); ++it) {
+ doCommand(Gui,"Gui.activeDocument().%s.Visibility=False",it->getFeatName());
+ App::DocumentObjectGroup* group = it->getObject()->getGroup();
+ if (group) {
+ targetGroup = group;
+ doCommand(Doc, "App.activeDocument().%s.removeObject(App.activeDocument().%s)",
+ group->getNameInDocument(), it->getFeatName());
+ }
+ }
+
+ if (targetGroup) {
+ doCommand(Doc, "App.activeDocument().%s.addObject(App.activeDocument().%s)",
+ targetGroup->getNameInDocument(), FeatName.c_str());
+ }
+
+ copyVisual(FeatName.c_str(), "ShapeColor", Sel[0].getFeatName());
+ copyVisual(FeatName.c_str(), "DisplayMode", Sel[0].getFeatName());
updateActive();
commitCommand();
}
@@ -340,7 +355,8 @@ void CmdPartCommon::activated(int iMsg)
bool askUser = false;
std::string FeatName = getUniqueObjectName("Common");
std::stringstream str;
- std::vector tempSelNames;
+ std::vector partObjects;
+
str << "App.activeDocument()." << FeatName << ".Shapes = [";
for (std::vector::iterator it = Sel.begin(); it != Sel.end(); ++it) {
App::DocumentObject* obj = it->getObject();
@@ -355,7 +371,7 @@ void CmdPartCommon::activated(int iMsg)
askUser = true;
}
str << "App.activeDocument()." << it->getFeatName() << ",";
- tempSelNames.push_back(it->getFeatName());
+ partObjects.push_back(*it);
}
}
str << "]";
@@ -363,10 +379,26 @@ void CmdPartCommon::activated(int iMsg)
openCommand("Common");
doCommand(Doc,"App.activeDocument().addObject(\"Part::MultiCommon\",\"%s\")",FeatName.c_str());
runCommand(Doc,str.str().c_str());
- for (std::vector::iterator it = tempSelNames.begin(); it != tempSelNames.end(); ++it)
- doCommand(Gui,"Gui.activeDocument().%s.Visibility=False",it->c_str());
- copyVisual(FeatName.c_str(), "ShapeColor", tempSelNames.front().c_str());
- copyVisual(FeatName.c_str(), "DisplayMode", tempSelNames.front().c_str());
+
+ // hide the input objects and remove them from the parent group
+ App::DocumentObjectGroup* targetGroup = 0;
+ for (std::vector::iterator it = partObjects.begin(); it != partObjects.end(); ++it) {
+ doCommand(Gui,"Gui.activeDocument().%s.Visibility=False",it->getFeatName());
+ App::DocumentObjectGroup* group = it->getObject()->getGroup();
+ if (group) {
+ targetGroup = group;
+ doCommand(Doc, "App.activeDocument().%s.removeObject(App.activeDocument().%s)",
+ group->getNameInDocument(), it->getFeatName());
+ }
+ }
+
+ if (targetGroup) {
+ doCommand(Doc, "App.activeDocument().%s.addObject(App.activeDocument().%s)",
+ targetGroup->getNameInDocument(), FeatName.c_str());
+ }
+
+ copyVisual(FeatName.c_str(), "ShapeColor", partObjects.front().getFeatName());
+ copyVisual(FeatName.c_str(), "DisplayMode", partObjects.front().getFeatName());
updateActive();
commitCommand();
}
@@ -405,7 +437,8 @@ void CmdPartFuse::activated(int iMsg)
bool askUser = false;
std::string FeatName = getUniqueObjectName("Fusion");
std::stringstream str;
- std::vector tempSelNames;
+ std::vector partObjects;
+
str << "App.activeDocument()." << FeatName << ".Shapes = [";
for (std::vector::iterator it = Sel.begin(); it != Sel.end(); ++it) {
App::DocumentObject* obj = it->getObject();
@@ -420,7 +453,7 @@ void CmdPartFuse::activated(int iMsg)
askUser = true;
}
str << "App.activeDocument()." << it->getFeatName() << ",";
- tempSelNames.push_back(it->getFeatName());
+ partObjects.push_back(*it);
}
}
str << "]";
@@ -428,10 +461,26 @@ void CmdPartFuse::activated(int iMsg)
openCommand("Fusion");
doCommand(Doc,"App.activeDocument().addObject(\"Part::MultiFuse\",\"%s\")",FeatName.c_str());
runCommand(Doc,str.str().c_str());
- for (std::vector::iterator it = tempSelNames.begin(); it != tempSelNames.end(); ++it)
- doCommand(Gui,"Gui.activeDocument().%s.Visibility=False",it->c_str());
- copyVisual(FeatName.c_str(), "ShapeColor", tempSelNames.front().c_str());
- copyVisual(FeatName.c_str(), "DisplayMode", tempSelNames.front().c_str());
+
+ // hide the input objects and remove them from the parent group
+ App::DocumentObjectGroup* targetGroup = 0;
+ for (std::vector::iterator it = partObjects.begin(); it != partObjects.end(); ++it) {
+ doCommand(Gui,"Gui.activeDocument().%s.Visibility=False",it->getFeatName());
+ App::DocumentObjectGroup* group = it->getObject()->getGroup();
+ if (group) {
+ targetGroup = group;
+ doCommand(Doc, "App.activeDocument().%s.removeObject(App.activeDocument().%s)",
+ group->getNameInDocument(), it->getFeatName());
+ }
+ }
+
+ if (targetGroup) {
+ doCommand(Doc, "App.activeDocument().%s.addObject(App.activeDocument().%s)",
+ targetGroup->getNameInDocument(), FeatName.c_str());
+ }
+
+ copyVisual(FeatName.c_str(), "ShapeColor", partObjects.front().getFeatName());
+ copyVisual(FeatName.c_str(), "DisplayMode", partObjects.front().getFeatName());
updateActive();
commitCommand();
}
diff --git a/src/Mod/Part/Gui/DlgBooleanOperation.cpp b/src/Mod/Part/Gui/DlgBooleanOperation.cpp
index a85ddffa8..2d045a2bd 100644
--- a/src/Mod/Part/Gui/DlgBooleanOperation.cpp
+++ b/src/Mod/Part/Gui/DlgBooleanOperation.cpp
@@ -37,6 +37,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -454,6 +455,29 @@ void DlgBooleanOperation::accept()
"Gui.activeDocument().hide(\"%s\")",shapeOne.c_str());
Gui::Command::doCommand(Gui::Command::Gui,
"Gui.activeDocument().hide(\"%s\")",shapeTwo.c_str());
+
+ // add/remove fromgroup if needed
+ App::DocumentObjectGroup* targetGroup = 0;
+
+ App::DocumentObjectGroup* group1 = obj1->getGroup();
+ if (group1) {
+ targetGroup = group1;
+ Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.removeObject(App.activeDocument().%s)",
+ group1->getNameInDocument(), obj1->getNameInDocument());
+ }
+
+ App::DocumentObjectGroup* group2 = obj2->getGroup();
+ if (group2) {
+ targetGroup = group2;
+ Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.removeObject(App.activeDocument().%s)",
+ group2->getNameInDocument(), obj2->getNameInDocument());
+ }
+
+ if (targetGroup) {
+ Gui::Command::doCommand(Gui::Command::Doc, "App.activeDocument().%s.addObject(App.activeDocument().%s)",
+ targetGroup->getNameInDocument(), objName.c_str());
+ }
+
Gui::Command::copyVisual(objName.c_str(), "ShapeColor", shapeOne.c_str());
Gui::Command::copyVisual(objName.c_str(), "DisplayMode", shapeOne.c_str());
activeDoc->commitTransaction();