diff --git a/src/Mod/Sketcher/Gui/Command.cpp b/src/Mod/Sketcher/Gui/Command.cpp index 232d272b3..53214fbd1 100644 --- a/src/Mod/Sketcher/Gui/Command.cpp +++ b/src/Mod/Sketcher/Gui/Command.cpp @@ -48,6 +48,7 @@ #include "SketchOrientationDialog.h" #include "ViewProviderSketch.h" #include "TaskSketcherValidation.h" +#include "../App/Constraint.h" using namespace std; using namespace SketcherGui; @@ -496,7 +497,74 @@ bool CmdSketcherValidateSketch::isActive(void) return (hasActiveDocument() && !Gui::Control().activeDialog()); } +DEF_STD_CMD_A(CmdSketcherMergeSketchs); +CmdSketcherMergeSketchs::CmdSketcherMergeSketchs() + : Command("Sketcher_MergeSketchs") +{ + sAppModule = "Sketcher"; + sGroup = QT_TR_NOOP("Sketcher"); + sMenuText = QT_TR_NOOP("Merge sketches"); + sToolTipText = QT_TR_NOOP("Merge sketches"); + sWhatsThis = "Sketcher_MergeSketches"; + sStatusTip = sToolTipText; + eType = 0; +} + +void CmdSketcherMergeSketchs::activated(int iMsg) +{ + std::vector selection = getSelection().getSelectionEx(0, Sketcher::SketchObject::getClassTypeId()); + if (selection.size() < 2) { + QMessageBox::warning(Gui::getMainWindow(), + qApp->translate("CmdSketcherMergeSketchs", "Wrong selection"), + qApp->translate("CmdSketcherMergeSketchs", "Select at least two sketches, please.")); + return; + } + + Sketcher::SketchObject* Obj1 = static_cast(selection[0].getObject()); + + App::Document* doc = App::GetApplication().getActiveDocument(); + + // create Sketch + std::string FeatName = getUniqueObjectName("Sketch"); + + openCommand("Create a merge Sketch"); + doCommand(Doc,"App.activeDocument().addObject('Sketcher::SketchObject','%s')",FeatName.c_str()); + + Sketcher::SketchObject* mergesketch = static_cast(doc->getObject(FeatName.c_str())); + + int baseGeometry=0; + int baseConstraints=0; + + for (std::vector::const_iterator it=selection.begin(); it != selection.end(); ++it) { + const Sketcher::SketchObject* Obj = static_cast((*it).getObject()); + int addedGeometries=mergesketch->addGeometry(Obj->getInternalGeometry()); + + int addedConstraints=mergesketch->addConstraints(Obj->Constraints.getValues()); + + for(int i=0; i<=(addedConstraints-baseConstraints); i++){ + Sketcher::Constraint * constraint= mergesketch->Constraints.getValues()[i+baseConstraints]; + + if(constraint->First!=Sketcher::Constraint::GeoUndef || constraint->First==-1 || constraint->First==-2) // not x, y axes or origin + constraint->First+=baseGeometry; + if(constraint->Second!=Sketcher::Constraint::GeoUndef || constraint->Second==-1 || constraint->Second==-2) // not x, y axes or origin + constraint->Second+=baseGeometry; + if(constraint->Third!=Sketcher::Constraint::GeoUndef || constraint->Third==-1 || constraint->Third==-2) // not x, y axes or origin + constraint->Third+=baseGeometry; + } + + baseGeometry=addedGeometries+1; + baseConstraints=addedConstraints+1; + } + + doCommand(Gui,"App.activeDocument().recompute()"); + +} + +bool CmdSketcherMergeSketchs::isActive(void) +{ + return (hasActiveDocument() && !Gui::Control().activeDialog()); +} @@ -511,4 +579,5 @@ void CreateSketcherCommands(void) rcCmdMgr.addCommand(new CmdSketcherMapSketch()); rcCmdMgr.addCommand(new CmdSketcherViewSketch()); rcCmdMgr.addCommand(new CmdSketcherValidateSketch()); + rcCmdMgr.addCommand(new CmdSketcherMergeSketchs()); } diff --git a/src/Mod/Sketcher/Gui/Workbench.cpp b/src/Mod/Sketcher/Gui/Workbench.cpp index 2ee764826..69a0aadad 100644 --- a/src/Mod/Sketcher/Gui/Workbench.cpp +++ b/src/Mod/Sketcher/Gui/Workbench.cpp @@ -228,7 +228,8 @@ inline void SketcherAddWorkspaceSketchExtra(T& sketch){ template <> inline void SketcherAddWorkspaceSketchExtra(Gui::MenuItem& sketch){ sketch << "Sketcher_ReorientSketch" - << "Sketcher_ValidateSketch"; + << "Sketcher_ValidateSketch" + << "Sketcher_MergeSketchs"; } template