diff --git a/src/Mod/Sketcher/Gui/CMakeLists.txt b/src/Mod/Sketcher/Gui/CMakeLists.txt index 8e2149596..3a88305c0 100644 --- a/src/Mod/Sketcher/Gui/CMakeLists.txt +++ b/src/Mod/Sketcher/Gui/CMakeLists.txt @@ -36,6 +36,7 @@ set(SketcherGui_MOC_HDRS TaskSketcherValidation.h TaskDlgEditSketch.h SketchOrientationDialog.h + SketchMirrorDialog.h SketcherSettings.h SketchRectangularArrayDialog.h PropertyConstraintListItem.h @@ -54,6 +55,7 @@ set(SketcherGui_UIC_SRCS TaskSketcherValidation.ui InsertDatum.ui SketchOrientationDialog.ui + SketchMirrorDialog.ui SketcherSettings.ui SketchRectangularArrayDialog.ui ) @@ -110,6 +112,8 @@ SET(SketcherGui_SRCS EditDatumDialog.h SketchOrientationDialog.cpp SketchOrientationDialog.h + SketchMirrorDialog.cpp + SketchMirrorDialog.h SketcherSettings.cpp SketcherSettings.h SketchRectangularArrayDialog.h diff --git a/src/Mod/Sketcher/Gui/Command.cpp b/src/Mod/Sketcher/Gui/Command.cpp index aefaf42f7..c1f8770ce 100644 --- a/src/Mod/Sketcher/Gui/Command.cpp +++ b/src/Mod/Sketcher/Gui/Command.cpp @@ -46,6 +46,7 @@ #include #include "SketchOrientationDialog.h" +#include "SketchMirrorDialog.h" #include "ViewProviderSketch.h" #include "TaskSketcherValidation.h" #include "../App/Constraint.h" @@ -506,10 +507,121 @@ bool CmdSketcherValidateSketch::isActive(void) return (hasActiveDocument() && !Gui::Control().activeDialog()); } +DEF_STD_CMD_A(CmdSketcherMirrorSketch); + +CmdSketcherMirrorSketch::CmdSketcherMirrorSketch() +: Command("Sketcher_MirrorSketch") +{ + sAppModule = "Sketcher"; + sGroup = QT_TR_NOOP("Sketcher"); + sMenuText = QT_TR_NOOP("Mirror sketch"); + sToolTipText = QT_TR_NOOP("Mirror sketch"); + sWhatsThis = "Sketcher_MirrorSketch"; + sStatusTip = sToolTipText; + eType = 0; + sPixmap = "Sketcher_MirrorSketch"; +} + +void CmdSketcherMirrorSketch::activated(int iMsg) +{ + std::vector selection = getSelection().getSelectionEx(0, Sketcher::SketchObject::getClassTypeId()); + if (selection.size() < 1) { + QMessageBox::warning(Gui::getMainWindow(), + qApp->translate("CmdSketcherMirrorSketch", "Wrong selection"), + qApp->translate("CmdSketcherMirrorSketch", "Select one or more sketches, please.")); + return; + } + + // Ask the user which kind of mirroring he wants + SketchMirrorDialog * smd = new SketchMirrorDialog(); + + int refgeoid=-1; + Sketcher::PointPos refposid=Sketcher::none; + + if( smd->exec() == QDialog::Accepted ){ + refgeoid=smd->RefGeoid; + refposid=smd->RefPosid; + + delete smd; + } + else { + delete smd; + return; + } + + App::Document* doc = App::GetApplication().getActiveDocument(); + + openCommand("Create a mirror Sketch for each sketch"); + + for (std::vector::const_iterator it=selection.begin(); it != selection.end(); ++it) { + // create Sketch + std::string FeatName = getUniqueObjectName("MirroredSketch"); + + doCommand(Doc,"App.activeDocument().addObject('Sketcher::SketchObject','%s')",FeatName.c_str()); + + Sketcher::SketchObject* mirrorsketch = static_cast(doc->getObject(FeatName.c_str())); + + const Sketcher::SketchObject* Obj = static_cast((*it).getObject()); + + Base::Placement pl = Obj->Placement.getValue(); + + Base::Vector3d p = pl.getPosition(); + Base::Rotation r = pl.getRotation(); + + doCommand(Doc,"App.activeDocument().%s.Placement = App.Placement(App.Vector(%f,%f,%f),App.Rotation(%f,%f,%f,%f))", + FeatName.c_str(), + p.x,p.y,p.z,r[0],r[1],r[2],r[3]); + + Sketcher::SketchObject* tempsketch = new Sketcher::SketchObject(); + + int addedGeometries=tempsketch->addGeometry(Obj->getInternalGeometry()); + + int addedConstraints=tempsketch->addConstraints(Obj->Constraints.getValues()); + + std::vector geoIdList; + + for(int i=0;i<=addedGeometries;i++) + geoIdList.push_back(i); + + tempsketch->addSymmetric(geoIdList, refgeoid, refposid); + + std::vector tempgeo = tempsketch->getInternalGeometry(); + std::vector tempconstr = tempsketch->Constraints.getValues(); + + int nconstraints = tempconstr.size(); + + std::vector mirrorgeo (tempgeo.begin()+addedGeometries+1,tempgeo.end()); + std::vector mirrorconstr (tempconstr.begin()+addedConstraints+1,tempconstr.end()); + + for(std::vector::const_iterator itc=mirrorconstr.begin(); itc != mirrorconstr.end(); ++itc) { + + if((*itc)->First!=Sketcher::Constraint::GeoUndef || (*itc)->First==-1 || (*itc)->First==-2) // not x, y axes or origin + (*itc)->First-=(addedGeometries+1); + if((*itc)->Second!=Sketcher::Constraint::GeoUndef || (*itc)->Second==-1 || (*itc)->Second==-2) // not x, y axes or origin + (*itc)->Second-=(addedGeometries+1); + if((*itc)->Third!=Sketcher::Constraint::GeoUndef || (*itc)->Third==-1 || (*itc)->Third==-2) // not x, y axes or origin + (*itc)->Third-=(addedGeometries+1); + } + + mirrorsketch->addGeometry(mirrorgeo); + mirrorsketch->addConstraints(mirrorconstr); + + delete tempsketch; + } + + doCommand(Gui,"App.activeDocument().recompute()"); + +} + +bool CmdSketcherMirrorSketch::isActive(void) +{ + return (hasActiveDocument() && !Gui::Control().activeDialog()); +} + DEF_STD_CMD_A(CmdSketcherMergeSketches); CmdSketcherMergeSketches::CmdSketcherMergeSketches() - : Command("Sketcher_MergeSketches") +: Command("Sketcher_MergeSketches") { sAppModule = "Sketcher"; sGroup = QT_TR_NOOP("Sketcher"); @@ -526,18 +638,18 @@ void CmdSketcherMergeSketches::activated(int iMsg) std::vector selection = getSelection().getSelectionEx(0, Sketcher::SketchObject::getClassTypeId()); if (selection.size() < 2) { QMessageBox::warning(Gui::getMainWindow(), - qApp->translate("CmdSketcherMergeSketches", "Wrong selection"), - qApp->translate("CmdSketcherMergeSketches", "Select at least two sketches, please.")); + qApp->translate("CmdSketcherMergeSketches", "Wrong selection"), + qApp->translate("CmdSketcherMergeSketches", "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()); @@ -553,16 +665,16 @@ void CmdSketcherMergeSketches::activated(int iMsg) 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; - } + 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; } @@ -576,8 +688,6 @@ bool CmdSketcherMergeSketches::isActive(void) return (hasActiveDocument() && !Gui::Control().activeDialog()); } - - void CreateSketcherCommands(void) { Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager(); @@ -589,5 +699,6 @@ void CreateSketcherCommands(void) rcCmdMgr.addCommand(new CmdSketcherMapSketch()); rcCmdMgr.addCommand(new CmdSketcherViewSketch()); rcCmdMgr.addCommand(new CmdSketcherValidateSketch()); + rcCmdMgr.addCommand(new CmdSketcherMirrorSketch()); rcCmdMgr.addCommand(new CmdSketcherMergeSketches()); } diff --git a/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp b/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp index b8b04fd62..7e223013f 100644 --- a/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp +++ b/src/Mod/Sketcher/Gui/CommandSketcherTools.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (c) 2014 Abdullah Tahiri +# include +#endif + +#include +#include +#include +#include + +#include "ui_SketchMirrorDialog.h" +#include "SketchMirrorDialog.h" + +using namespace SketcherGui; + +SketchMirrorDialog::SketchMirrorDialog(void) + : QDialog(Gui::getMainWindow()), ui(new Ui_SketchMirrorDialog), RefGeoid(-1), RefPosid(Sketcher::none) +{ + ui->setupUi(this); +} + +SketchMirrorDialog::~SketchMirrorDialog() +{ + +} + +void SketchMirrorDialog::accept() +{ + if (ui->XAxisRadioButton->isChecked()) { + RefGeoid=-1; + RefPosid=Sketcher::none; + } + else if (ui->YAxisRadioButton->isChecked()) { + RefGeoid=-2; + RefPosid=Sketcher::none; + } + else if (ui->OriginRadioButton->isChecked()) { + RefGeoid=-1; + RefPosid=Sketcher::start; + } + + QDialog::accept(); +} + +#include "moc_SketchMirrorDialog.cpp" diff --git a/src/Mod/Sketcher/Gui/SketchMirrorDialog.h b/src/Mod/Sketcher/Gui/SketchMirrorDialog.h new file mode 100644 index 000000000..a1475064c --- /dev/null +++ b/src/Mod/Sketcher/Gui/SketchMirrorDialog.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * Copyright (c) 2015 Abdullah Tahiri +#include "../App/Constraint.h" + +namespace SketcherGui { + +class Ui_SketchMirrorDialog; +class SketchMirrorDialog : public QDialog +{ + Q_OBJECT + +public: + SketchMirrorDialog(void); + ~SketchMirrorDialog(); + + int RefGeoid; + Sketcher::PointPos RefPosid; + + void accept(); + +private: + Ui_SketchMirrorDialog* ui; +}; + +} + +#endif // SKETCHERGUI_SketchMirrorDialog_H diff --git a/src/Mod/Sketcher/Gui/SketchMirrorDialog.ui b/src/Mod/Sketcher/Gui/SketchMirrorDialog.ui new file mode 100644 index 000000000..e1e5ab203 --- /dev/null +++ b/src/Mod/Sketcher/Gui/SketchMirrorDialog.ui @@ -0,0 +1,110 @@ + + + SketcherGui::SketchMirrorDialog + + + + 0 + 0 + 220 + 171 + + + + Select Mirror Axis/Point + + + + + + Select Mirror Axis/Point + + + + + + X-Axis + + + true + + + + + + + Y-Axis + + + + + + + Origin + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + buttonBox + accepted() + SketcherGui::SketchMirrorDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + SketcherGui::SketchMirrorDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/Mod/Sketcher/Gui/Workbench.cpp b/src/Mod/Sketcher/Gui/Workbench.cpp index f1682397f..b091d6684 100644 --- a/src/Mod/Sketcher/Gui/Workbench.cpp +++ b/src/Mod/Sketcher/Gui/Workbench.cpp @@ -271,7 +271,8 @@ template <> inline void SketcherAddWorkspaceSketchExtra(Gui::MenuItem& sketch){ sketch << "Sketcher_ReorientSketch" << "Sketcher_ValidateSketch" - << "Sketcher_MergeSketches"; + << "Sketcher_MergeSketches" + << "Sketcher_MirrorSketch"; } template