diff --git a/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp b/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp index d4b7ead815..671942ae82 100644 --- a/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp +++ b/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp @@ -1101,6 +1101,19 @@ bool CmdSketcherSymmetry::isActive(void) return isSketcherAcceleratorActive( getActiveGuiDocument(), true ); } + +class SketcherCopy : public Gui::Command { +public: + enum Op { + Copy, + Clone, + Move + }; + SketcherCopy(const char* name); + void activate(SketcherCopy::Op op); + virtual void activate() = 0; +}; + static const char *cursor_createcopy[]={ "32 32 3 1", "+ c white", @@ -1142,18 +1155,18 @@ static const char *cursor_createcopy[]={ class DrawSketchHandlerCopy: public DrawSketchHandler { public: - DrawSketchHandlerCopy(string geoidlist, int origingeoid, Sketcher::PointPos originpos, int nelements, bool clone) + DrawSketchHandlerCopy(string geoidlist, int origingeoid, Sketcher::PointPos originpos, int nelements, SketcherCopy::Op op) : Mode(STATUS_SEEK_First) , geoIdList(geoidlist) , Origin() , OriginGeoId(origingeoid) , OriginPos(originpos) , nElements(nelements) - , Clone(clone) + , Op(op) , EditCurve(2) { } - + virtual ~DrawSketchHandlerCopy(){} /// mode table enum SelectMode { @@ -1183,7 +1196,7 @@ static const char *cursor_createcopy[]={ renderSuggestConstraintsCursor(sugConstr1); return; } - + } applyCursor(); } @@ -1195,7 +1208,7 @@ static const char *cursor_createcopy[]={ sketchgui->drawEdit(EditCurve); Mode = STATUS_End; } - + return true; } @@ -1211,15 +1224,24 @@ static const char *cursor_createcopy[]={ int currentgeoid = static_cast(sketchgui->getObject())->getHighestCurveIndex(); - Gui::Command::openCommand("Create copy of geometry"); - + Gui::Command::openCommand("Copy/clone/move geometry"); + try{ - Gui::Command::doCommand( - Gui::Command::Doc, "App.ActiveDocument.%s.addCopy(%s,App.Vector(%f,%f,0),%s)", + if( Op != SketcherCopy::Move) { + + Gui::Command::doCommand( + Gui::Command::Doc, "App.ActiveDocument.%s.addCopy(%s,App.Vector(%f,%f,0),%s)", sketchgui->getObject()->getNameInDocument(), geoIdList.c_str(), vector.x, vector.y, - (Clone?"True":"False")); - + (Op == SketcherCopy::Clone?"True":"False")); + } + else { + Gui::Command::doCommand( + Gui::Command::Doc, "App.ActiveDocument.%s.addMove(%s,App.Vector(%f,%f,0))", + sketchgui->getObject()->getNameInDocument(), + geoIdList.c_str(), vector.x, vector.y); + } + Gui::Command::commitCommand(); } catch (const Base::Exception& e) { @@ -1227,10 +1249,18 @@ static const char *cursor_createcopy[]={ Gui::Command::abortCommand(); } - // add auto constraints for the destination copy - if (sugConstr1.size() > 0) { - createAutoConstraints(sugConstr1, currentgeoid+nElements, OriginPos); - sugConstr1.clear(); + if( Op != SketcherCopy::Move) { + // add auto constraints for the destination copy + if (sugConstr1.size() > 0) { + createAutoConstraints(sugConstr1, currentgeoid+nElements, OriginPos); + sugConstr1.clear(); + } + } + else { + if (sugConstr1.size() > 0) { + createAutoConstraints(sugConstr1, OriginGeoId, OriginPos); + sugConstr1.clear(); + } } tryAutoRecomputeIfNotSolve(static_cast(sketchgui->getObject())); @@ -1249,44 +1279,39 @@ static const char *cursor_createcopy[]={ int OriginGeoId; Sketcher::PointPos OriginPos; int nElements; - bool Clone; + SketcherCopy::Op Op; std::vector EditCurve; std::vector sugConstr1; }; -class SketcherCopy : public Gui::Command { -public: - SketcherCopy(const char* name); - void activate(bool clone); -}; - +/*---- SketcherCopy definition ----*/ SketcherCopy::SketcherCopy(const char* name): Command(name) {} -void SketcherCopy::activate(bool clone) +void SketcherCopy::activate(SketcherCopy::Op op) { // get the selection std::vector selection = getSelection().getSelectionEx(); - + // only one sketch with its subelements are allowed to be selected if (selection.size() != 1) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select elements from a single sketch.")); + QObject::tr("Select elements from a single sketch.")); return; } - + // get the needed lists and objects const std::vector &SubNames = selection[0].getSubNames(); if (SubNames.empty()) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("Select elements from a single sketch.")); + QObject::tr("Select elements from a single sketch.")); return; } - + Sketcher::SketchObject* Obj = static_cast(selection[0].getObject()); - + getSelection().clearSelection(); - + int LastGeoId = 0; Sketcher::PointPos LastPointPos = Sketcher::none; const Part::Geometry *LastGeo = 0; @@ -1294,15 +1319,12 @@ void SketcherCopy::activate(bool clone) // create python command with list of elements std::stringstream stream; int geoids = 0; - for (std::vector::const_iterator it=SubNames.begin(); it != SubNames.end(); ++it) { // only handle non-external edges if (it->size() > 4 && it->substr(0,4) == "Edge") { LastGeoId = std::atoi(it->substr(4,4000).c_str()) - 1; LastPointPos = Sketcher::none; - LastGeo = Obj->getGeometry(LastGeoId); - // lines to copy if (LastGeoId>=0) { geoids++; @@ -1341,7 +1363,7 @@ void SketcherCopy::activate(bool clone) if (geoids < 1) { QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Wrong selection"), - QObject::tr("A copy requires at least one selected non-external geometric element")); + QObject::tr("A copy requires at least one selected non-external geometric element")); return; } @@ -1359,28 +1381,30 @@ void SketcherCopy::activate(bool clone) if (LastGeo->getTypeId() == Part::GeomCircle::getClassTypeId() || LastGeo->getTypeId() == Part::GeomEllipse::getClassTypeId()) { LastPointPos = Sketcher::mid; - } - else { - LastPointPos = Sketcher::start; - } + } + else { + LastPointPos = Sketcher::start; + } } // Ask the user if he wants to clone or to simple copy /*int ret = QMessageBox::question(Gui::getMainWindow(), QObject::tr("Dimensional/Geometric constraints"), - QObject::tr("Do you want to clone the object, i.e. substitute dimensional constraints by geometric constraints?"), - QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel); - // use an equality constraint - if (ret == QMessageBox::Yes) { - clone = true; - } - else if (ret == QMessageBox::Cancel) { - // do nothing - return; - }*/ - - ActivateAcceleratorHandler(getActiveGuiDocument(),new DrawSketchHandlerCopy(geoIdList, LastGeoId, LastPointPos, geoids, clone)); + * QObject::tr("Do you want to clone the object, i.e. substitute dimensional constraints by geometric constraints?"), + * QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel); + * // use an equality constraint + * if (ret == QMessageBox::Yes) { + * clone = true; } - +else if (ret == QMessageBox::Cancel) { + // do nothing + return; +}*/ + + ActivateAcceleratorHandler(getActiveGuiDocument(),new DrawSketchHandlerCopy(geoIdList, LastGeoId, LastPointPos, geoids, op)); +} + + + class CmdSketcherCopy : public SketcherCopy { public: @@ -1388,6 +1412,7 @@ public: virtual ~CmdSketcherCopy(){} virtual const char* className() const { return "CmdSketcherCopy"; } + virtual void activate(); protected: virtual void activated(int iMsg); virtual bool isActive(void); @@ -1410,7 +1435,13 @@ CmdSketcherCopy::CmdSketcherCopy() void CmdSketcherCopy::activated(int iMsg) { Q_UNUSED(iMsg); - activate(false); + SketcherCopy::activate(SketcherCopy::Copy); +} + + +void CmdSketcherCopy::activate() +{ + SketcherCopy::activate(SketcherCopy::Copy); } bool CmdSketcherCopy::isActive(void) @@ -1425,6 +1456,7 @@ public: virtual ~CmdSketcherClone(){} virtual const char* className() const { return "CmdSketcherClone"; } + virtual void activate(); protected: virtual void activated(int iMsg); virtual bool isActive(void); @@ -1447,7 +1479,12 @@ CmdSketcherClone::CmdSketcherClone() void CmdSketcherClone::activated(int iMsg) { Q_UNUSED(iMsg); - activate(true); + SketcherCopy::activate(SketcherCopy::Clone); +} + +void CmdSketcherClone::activate() +{ + SketcherCopy::activate(SketcherCopy::Clone); } bool CmdSketcherClone::isActive(void) @@ -1455,6 +1492,49 @@ bool CmdSketcherClone::isActive(void) return isSketcherAcceleratorActive( getActiveGuiDocument(), true ); } +class CmdSketcherMove : public SketcherCopy +{ +public: + CmdSketcherMove(); + virtual ~CmdSketcherMove(){} + virtual const char* className() const + { return "CmdSketcherMove"; } + virtual void activate(); +protected: + virtual void activated(int iMsg); + virtual bool isActive(void); +}; + +CmdSketcherMove::CmdSketcherMove() +:SketcherCopy("Sketcher_Move") +{ + sAppModule = "Sketcher"; + sGroup = QT_TR_NOOP("Sketcher"); + sMenuText = QT_TR_NOOP("Move"); + sToolTipText = QT_TR_NOOP("Moves the geometry taking as reference the last selected point"); + sWhatsThis = "Sketcher_Move"; + sStatusTip = sToolTipText; + sPixmap = "Sketcher_Move"; + sAccel = "CTRL+M"; + eType = ForEdit; +} + +void CmdSketcherMove::activated(int iMsg) +{ + Q_UNUSED(iMsg); + SketcherCopy::activate(SketcherCopy::Move); +} + +void CmdSketcherMove::activate() +{ + SketcherCopy::activate(SketcherCopy::Move); +} + + +bool CmdSketcherMove::isActive(void) +{ + return isSketcherAcceleratorActive( getActiveGuiDocument(), true ); +} DEF_STD_CMD_ACL(CmdSketcherCompCopy); @@ -1473,25 +1553,34 @@ CmdSketcherCompCopy::CmdSketcherCompCopy() void CmdSketcherCompCopy::activated(int iMsg) { - if (iMsg==0){ - CmdSketcherClone sc; - sc.activate(true); - } - else if (iMsg==1) { - CmdSketcherCopy sc; - sc.activate(false); - } - else + if (iMsg<0 || iMsg>2) return; // Since the default icon is reset when enabing/disabling the command we have // to explicitly set the icon of the used command. Gui::ActionGroup* pcAction = qobject_cast(_pcAction); QList a = pcAction->actions(); - + assert(iMsg < a.size()); pcAction->setIcon(a[iMsg]->icon()); - pcAction->setShortcut(QString::fromLatin1(this->sAccel)); + + if (iMsg==0){ + CmdSketcherClone sc; + sc.activate(); + pcAction->setShortcut(QString::fromLatin1(this->sAccel)); + } + else if (iMsg==1) { + CmdSketcherCopy sc; + sc.activate(); + pcAction->setShortcut(QString::fromLatin1(this->sAccel)); + } + else if (iMsg==2) { + CmdSketcherMove sc; + sc.activate(); + pcAction->setShortcut(QString::fromLatin1("")); + } + else + return; } Gui::Action * CmdSketcherCompCopy::createAction(void) @@ -1504,6 +1593,8 @@ Gui::Action * CmdSketcherCompCopy::createAction(void) clone->setIcon(Gui::BitmapFactory().pixmap("Sketcher_Clone")); QAction* copy = pcAction->addAction(QString()); copy->setIcon(Gui::BitmapFactory().pixmap("Sketcher_Copy")); + QAction* move = pcAction->addAction(QString()); + move->setIcon(Gui::BitmapFactory().pixmap("Sketcher_Move")); _pcAction = pcAction; languageChange(); @@ -1534,6 +1625,10 @@ void CmdSketcherCompCopy::languageChange() copy->setText(QApplication::translate("Sketcher_CompCopy","Copy")); copy->setToolTip(QApplication::translate("Sketcher_Copy","Creates a simple copy of the geometry taking as reference the last selected point")); copy->setStatusTip(QApplication::translate("Sketcher_Copy","Creates a simple copy of the geometry taking as reference the last selected point")); + QAction* move = a[2]; + move->setText(QApplication::translate("Sketcher_CompCopy","Move")); + move->setToolTip(QApplication::translate("Sketcher_Move","Moves the geometry taking as reference the last selected point")); + move->setStatusTip(QApplication::translate("Sketcher_Move","Moves the geometry taking as reference the last selected point")); } bool CmdSketcherCompCopy::isActive(void) @@ -1928,6 +2023,7 @@ void CreateSketcherCommandsConstraintAccel(void) rcCmdMgr.addCommand(new CmdSketcherSymmetry()); rcCmdMgr.addCommand(new CmdSketcherCopy()); rcCmdMgr.addCommand(new CmdSketcherClone()); + rcCmdMgr.addCommand(new CmdSketcherMove()); rcCmdMgr.addCommand(new CmdSketcherCompCopy()); rcCmdMgr.addCommand(new CmdSketcherRectangularArray()); rcCmdMgr.addCommand(new CmdSketcherDeleteAllGeometry()); diff --git a/src/Mod/Sketcher/Gui/Workbench.cpp b/src/Mod/Sketcher/Gui/Workbench.cpp index 62def0edb6..945a428cc0 100644 --- a/src/Mod/Sketcher/Gui/Workbench.cpp +++ b/src/Mod/Sketcher/Gui/Workbench.cpp @@ -279,6 +279,7 @@ inline void SketcherAddWorkbenchTools(Gui::MenuItem& consaccel){ << "Sketcher_Symmetry" << "Sketcher_Clone" << "Sketcher_Copy" + << "Sketcher_Move" << "Sketcher_RectangularArray" << "Sketcher_DeleteAllGeometry"; }