From 7fadaa0a55d4126d66bc6e6dc26b1730c93822b6 Mon Sep 17 00:00:00 2001 From: Johan K Date: Sun, 27 Jul 2014 00:25:40 +0200 Subject: [PATCH] Added more regular polygons to the sketcher gui --- src/Mod/PartDesign/Gui/CMakeLists.txt | 1 + src/Mod/PartDesign/Gui/Workbench.cpp | 86 +--- src/Mod/Sketcher/Gui/CommandCreateGeo.cpp | 476 ++++++++++++++++++++ src/Mod/Sketcher/Gui/Resources/Sketcher.qrc | 6 + src/Mod/Sketcher/Gui/ViewProviderSketch.cpp | 1 + src/Mod/Sketcher/Gui/Workbench.cpp | 216 +++++---- src/Mod/Sketcher/Gui/Workbench.h | 13 + 7 files changed, 643 insertions(+), 156 deletions(-) diff --git a/src/Mod/PartDesign/Gui/CMakeLists.txt b/src/Mod/PartDesign/Gui/CMakeLists.txt index 33a78e24d..a24dd4b11 100644 --- a/src/Mod/PartDesign/Gui/CMakeLists.txt +++ b/src/Mod/PartDesign/Gui/CMakeLists.txt @@ -22,6 +22,7 @@ link_directories(${OCC_LIBRARY_DIR}) set(PartDesignGui_LIBS PartDesign PartGui + SketcherGui FreeCADGui ) diff --git a/src/Mod/PartDesign/Gui/Workbench.cpp b/src/Mod/PartDesign/Gui/Workbench.cpp index 905a759b6..c1dcaac3d 100644 --- a/src/Mod/PartDesign/Gui/Workbench.cpp +++ b/src/Mod/PartDesign/Gui/Workbench.cpp @@ -28,6 +28,7 @@ #endif #include "Workbench.h" +#include #include #include #include @@ -166,53 +167,17 @@ Gui::MenuItem* Workbench::setupMenuBar() const Gui::MenuItem* geom = new Gui::MenuItem(); geom->setCommand("Sketcher geometries"); - *geom << "Sketcher_CreatePoint" - << "Sketcher_CreateArc" - << "Sketcher_Create3PointArc" - << "Sketcher_CreateCircle" - << "Sketcher_Create3PointCircle" - << "Sketcher_CreateLine" - << "Sketcher_CreatePolyline" - << "Sketcher_CreateRectangle" - << "Sketcher_CreateSlot" - << "Separator" - << "Sketcher_CreateFillet" - << "Sketcher_Trimming" - << "Sketcher_External" - << "Sketcher_ToggleConstruction" - /*<< "Sketcher_CreateText"*/ - /*<< "Sketcher_CreateDraftLine"*/; + SketcherGui::addSketcherWorkbenchGeometries( *geom ); Gui::MenuItem* cons = new Gui::MenuItem(); cons->setCommand("Sketcher constraints"); - *cons << "Sketcher_ConstrainCoincident" - << "Sketcher_ConstrainPointOnObject" - << "Sketcher_ConstrainVertical" - << "Sketcher_ConstrainHorizontal" - << "Sketcher_ConstrainParallel" - << "Sketcher_ConstrainPerpendicular" - << "Sketcher_ConstrainTangent" - << "Sketcher_ConstrainEqual" - << "Sketcher_ConstrainSymmetric" - << "Separator" - << "Sketcher_ConstrainLock" - << "Sketcher_ConstrainDistanceX" - << "Sketcher_ConstrainDistanceY" - << "Sketcher_ConstrainDistance" - << "Sketcher_ConstrainRadius" - << "Sketcher_ConstrainAngle"; + SketcherGui::addSketcherWorkbenchConstraints( *cons ); Gui::MenuItem* part = new Gui::MenuItem; root->insertItem(item, part); part->setCommand("&Part Design"); - *part << "Sketcher_NewSketch" - << "Sketcher_EditSketch" - << "Sketcher_LeaveSketch" - << "Sketcher_ViewSketch" - << "Sketcher_MapSketch" - << "Sketcher_ReorientSketch" - << "Sketcher_ValidateSketch" - << geom + SketcherGui::addSketcherWorkbenchSketchActions( *part ); + *part << geom << cons << "Separator" << "PartDesign_Pad" @@ -243,11 +208,8 @@ Gui::ToolBarItem* Workbench::setupToolBars() const Gui::ToolBarItem* root = StdWorkbench::setupToolBars(); Gui::ToolBarItem* part = new Gui::ToolBarItem(root); part->setCommand("Part Design"); - *part << "Sketcher_NewSketch" - << "Sketcher_ViewSketch" - << "Sketcher_MapSketch" - << "Sketcher_LeaveSketch" - << "Separator" + SketcherGui::addSketcherWorkbenchSketchActions( *part ); + *part << "Separator" << "PartDesign_Pad" << "PartDesign_Pocket" << "PartDesign_Revolution" @@ -263,41 +225,13 @@ Gui::ToolBarItem* Workbench::setupToolBars() const Gui::ToolBarItem* geom = new Gui::ToolBarItem(root); geom->setCommand("Sketcher geometries"); - *geom << "Sketcher_CreatePoint" - << "Sketcher_CompCreateArc" - << "Sketcher_CompCreateCircle" - << "Sketcher_CreateLine" - << "Sketcher_CreatePolyline" - << "Sketcher_CreateRectangle" - << "Sketcher_CreateSlot" - << "Separator" - << "Sketcher_CreateFillet" - << "Sketcher_Trimming" - << "Sketcher_External" - << "Sketcher_ToggleConstruction" - /*<< "Sketcher_CreateText"*/ - /*<< "Sketcher_CreateDraftLine"*/; + SketcherGui::addSketcherWorkbenchGeometries( *geom ); Gui::ToolBarItem* cons = new Gui::ToolBarItem(root); cons->setCommand("Sketcher constraints"); - *cons << "Sketcher_ConstrainCoincident" - << "Sketcher_ConstrainPointOnObject" - << "Sketcher_ConstrainVertical" - << "Sketcher_ConstrainHorizontal" - << "Sketcher_ConstrainParallel" - << "Sketcher_ConstrainPerpendicular" - << "Sketcher_ConstrainTangent" - << "Sketcher_ConstrainEqual" - << "Sketcher_ConstrainSymmetric" - << "Separator" - << "Sketcher_ConstrainLock" - << "Sketcher_ConstrainDistanceX" - << "Sketcher_ConstrainDistanceY" - << "Sketcher_ConstrainDistance" - << "Sketcher_ConstrainRadius" - << "Sketcher_ConstrainAngle"; + SketcherGui::addSketcherWorkbenchConstraints( *cons ); - return root; + return root; } Gui::ToolBarItem* Workbench::setupCommandBars() const diff --git a/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp b/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp index bbb949da1..a0bfae955 100644 --- a/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp +++ b/src/Mod/Sketcher/Gui/CommandCreateGeo.cpp @@ -3097,6 +3097,475 @@ bool CmdSketcherCreateSlot::isActive(void) return isCreateGeoActive(getActiveGuiDocument()); } + +/* Create Regular Polygon ==============================================*/ + +/* XPM */ +static const char *cursor_createregularpolygon[]={ +"32 32 3 1", +"+ c white", +"# c red", +". c None", +"......+.........................", +"......+.........................", +"......+.........................", +"......+.........................", +"......+.........................", +"................................", +"+++++...+++++...................", +"................................", +"......+.........................", +"......+.........................", +"......+.........................", +"......+................###......", +"......+.......##########.##.....", +".............#.........###......", +"............#.............#.....", +"...........#...............#....", +"...........#...............#....", +"..........#.................#...", +".........#...................#..", +".........#...................#..", +"........#.........###.........#.", +".......#..........#.#..........#", +"........#.........###.........#.", +".........#...................#..", +".........#...................#..", +"..........#.................#...", +"...........#...............#....", +"...........#...............#....", +"............#.............#.....", +".............#...........#......", +"..............###########.......", +"................................"}; + +class DrawSketchHandlerRegularPolygon: public DrawSketchHandler +{ +public: + DrawSketchHandlerRegularPolygon( size_t nof_corners ): + Corners( nof_corners ), + AngleOfSeparation( 2.0*M_PI/static_cast(Corners) ), + cos_v( cos( AngleOfSeparation ) ), + sin_v( sin( AngleOfSeparation ) ), + Mode(STATUS_SEEK_First), + EditCurve(Corners+1) + { + } + virtual ~DrawSketchHandlerRegularPolygon(){} + /// mode table + enum SelectMode { + STATUS_SEEK_First, /**< enum value ----. */ + STATUS_SEEK_Second, /**< enum value ----. */ + STATUS_End + }; + + virtual void activated(ViewProviderSketch *sketchgui) + { + setCursor(QPixmap(cursor_createregularpolygon),7,7); + } + + virtual void mouseMove(Base::Vector2D onSketchPos) + { + + if (Mode==STATUS_SEEK_First) { + setPositionText(onSketchPos); + if (seekAutoConstraint(sugConstr1, onSketchPos, Base::Vector2D(0.f,0.f))) { + renderSuggestConstraintsCursor(sugConstr1); + return; + } + } + else if (Mode==STATUS_SEEK_Second) { + EditCurve[0]= Base::Vector2D(onSketchPos.fX, onSketchPos.fY); + EditCurve[Corners]= Base::Vector2D(onSketchPos.fX, onSketchPos.fY); + + Base::Vector2D dV = onSketchPos - StartPos; + double rx = dV.fX; + double ry = dV.fY; + for (int i=1; i < static_cast(Corners); i++) { + const double old_rx = rx; + rx = cos_v * rx - sin_v * ry; + ry = cos_v * ry + sin_v * old_rx; + EditCurve[i] = Base::Vector2D(StartPos.fX + rx, StartPos.fY + ry); + } + + // Display radius for user + const float radius = dV.Length(); + const float angle = ( 180.0 / M_PI ) * atan2( dV.fY, dV.fX ); + + SbString text; + text.sprintf(" (%.1fR %.1fdeg)", radius, angle ); + setPositionText(onSketchPos, text); + + sketchgui->drawEdit(EditCurve); + if (seekAutoConstraint(sugConstr2, onSketchPos, dV)) { + renderSuggestConstraintsCursor(sugConstr2); + return; + } + } + applyCursor(); + } + + virtual bool pressButton(Base::Vector2D onSketchPos) + { + if (Mode==STATUS_SEEK_First){ + StartPos = onSketchPos; + Mode = STATUS_SEEK_Second; + } + else { + Mode = STATUS_End; + } + return true; + } + + virtual bool releaseButton(Base::Vector2D onSketchPos) + { + static const char* AddLineCommand = + "App.ActiveDocument.%s.addGeometry(Part.Line(App.Vector(%f,%f,0),App.Vector(%f,%f,0)))"; + static const char* AddConstraintCoincideCommand = + "App.ActiveDocument.%s.addConstraint(Sketcher.Constraint('Coincident',%i,2,%i,1))"; + static const char* AddConstraintEqualCommand = + "App.ActiveDocument.%s.addConstraint(Sketcher.Constraint('Equal',%i,%i)) "; + static const char* AddConstraintAngleCommand = + "App.ActiveDocument.%s.addConstraint(Sketcher.Constraint('Angle',%i,1,%i,2,%f))"; + + if (Mode==STATUS_End){ + unsetCursor(); + resetPositionText(); + Gui::Command::openCommand("Add hexagon"); + int firstCurve = getHighestCurveIndex() + 1; + // add the geometry to the sketch + + try { + for( int i = 0; i < static_cast(Corners); i++ ){ + Gui::Command::doCommand(Gui::Command::Doc, AddLineCommand, + sketchgui->getObject()->getNameInDocument(), + EditCurve[i].fX,EditCurve[i].fY,EditCurve[i+1].fX,EditCurve[i+1].fY); + } + // make line ends coincide and all lines equal length + Gui::Command::doCommand(Gui::Command::Doc, AddConstraintCoincideCommand, + sketchgui->getObject()->getNameInDocument(), + firstCurve+(Corners-1),firstCurve); + for( int i = 1; i < static_cast(Corners); i++ ){ + Gui::Command::doCommand(Gui::Command::Doc, AddConstraintCoincideCommand, + sketchgui->getObject()->getNameInDocument(), + firstCurve+(i-1),firstCurve+i); + Gui::Command::doCommand(Gui::Command::Doc,AddConstraintEqualCommand, + sketchgui->getObject()->getNameInDocument(), + firstCurve,firstCurve+i); + } + double angle_constraint_diff = (1. * Corners)/( 1. * Corners - 3.0 ); + for( int i = 0; i < (Corners-3); i++ ){ + int angle_constraint_index = angle_constraint_diff * i; + Gui::Command::doCommand(Gui::Command::Doc,AddConstraintAngleCommand, + sketchgui->getObject()->getNameInDocument(), + firstCurve + ( angle_constraint_index + 1 ), + firstCurve + ( angle_constraint_index ), + ( M_PI - AngleOfSeparation ) ); + } + + Gui::Command::commitCommand(); + Gui::Command::updateActive(); + + // add auto constraints at the start of the first side + if (sugConstr1.size() > 0) { + createAutoConstraints(sugConstr1, getHighestCurveIndex() - 3 , Sketcher::mid); + sugConstr1.clear(); + } + + // add auto constraints at the end of the second side + if (sugConstr2.size() > 0) { + createAutoConstraints(sugConstr2, getHighestCurveIndex() - 2, Sketcher::end); + sugConstr2.clear(); + } + } + catch (const Base::Exception& e) { + Base::Console().Error("%s\n", e.what()); + Gui::Command::abortCommand(); + Gui::Command::updateActive(); + } + + EditCurve.clear(); + sketchgui->drawEdit(EditCurve); + sketchgui->purgeHandler(); // no code after this line, Handler get deleted in ViewProvider + } + return true; + } +protected: + const size_t Corners; + const double AngleOfSeparation; + const double cos_v, sin_v; + SelectMode Mode; + Base::Vector2D StartPos; + std::vector EditCurve; + std::vector sugConstr1, sugConstr2; +}; + + +DEF_STD_CMD_A(CmdSketcherCreateTriangle); +CmdSketcherCreateTriangle::CmdSketcherCreateTriangle() + : Command("Sketcher_CreateTriangle") +{ + sAppModule = "Sketcher"; + sGroup = QT_TR_NOOP("Sketcher"); + sMenuText = QT_TR_NOOP("Create equilateral triangle"); + sToolTipText = QT_TR_NOOP("Create an equilateral triangle in the sketch"); + sWhatsThis = sToolTipText; + sStatusTip = sToolTipText; + sPixmap = "Sketcher_CreateTriangle"; + sAccel = ""; + eType = ForEdit; +} + +void CmdSketcherCreateTriangle::activated(int iMsg) +{ + ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerRegularPolygon(3) ); +} + +bool CmdSketcherCreateTriangle::isActive(void) +{ + return isCreateGeoActive(getActiveGuiDocument()); +} + +DEF_STD_CMD_A(CmdSketcherCreateSquare); +CmdSketcherCreateSquare::CmdSketcherCreateSquare() + : Command("Sketcher_CreateSquare") +{ + sAppModule = "Sketcher"; + sGroup = QT_TR_NOOP("Sketcher"); + sMenuText = QT_TR_NOOP("Create square"); + sToolTipText = QT_TR_NOOP("Create a square in the sketch"); + sWhatsThis = sToolTipText; + sStatusTip = sToolTipText; + sPixmap = "Sketcher_CreateSquare"; + sAccel = ""; + eType = ForEdit; +} + +void CmdSketcherCreateSquare::activated(int iMsg) +{ + ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerRegularPolygon(4) ); +} + +bool CmdSketcherCreateSquare::isActive(void) +{ + return isCreateGeoActive(getActiveGuiDocument()); +} + +DEF_STD_CMD_A(CmdSketcherCreatePentagon); +CmdSketcherCreatePentagon::CmdSketcherCreatePentagon() + : Command("Sketcher_CreatePentagon") +{ + sAppModule = "Sketcher"; + sGroup = QT_TR_NOOP("Sketcher"); + sMenuText = QT_TR_NOOP("Create pentagon"); + sToolTipText = QT_TR_NOOP("Create a pentagon in the sketch"); + sWhatsThis = sToolTipText; + sStatusTip = sToolTipText; + sPixmap = "Sketcher_CreatePentagon"; + sAccel = ""; + eType = ForEdit; +} + +void CmdSketcherCreatePentagon::activated(int iMsg) +{ + ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerRegularPolygon(5) ); +} + +bool CmdSketcherCreatePentagon::isActive(void) +{ + return isCreateGeoActive(getActiveGuiDocument()); +} + + +DEF_STD_CMD_A(CmdSketcherCreateHexagon); +CmdSketcherCreateHexagon::CmdSketcherCreateHexagon() + : Command("Sketcher_CreateHexagon") +{ + sAppModule = "Sketcher"; + sGroup = QT_TR_NOOP("Sketcher"); + sMenuText = QT_TR_NOOP("Create hexagon"); + sToolTipText = QT_TR_NOOP("Create a hexagon in the sketch"); + sWhatsThis = sToolTipText; + sStatusTip = sToolTipText; + sPixmap = "Sketcher_CreateHexagon"; + sAccel = ""; + eType = ForEdit; +} + +void CmdSketcherCreateHexagon::activated(int iMsg) +{ + ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerRegularPolygon(6) ); +} + +bool CmdSketcherCreateHexagon::isActive(void) +{ + return isCreateGeoActive(getActiveGuiDocument()); +} + +DEF_STD_CMD_A(CmdSketcherCreateHeptagon); +CmdSketcherCreateHeptagon::CmdSketcherCreateHeptagon() + : Command("Sketcher_CreateHeptagon") +{ + sAppModule = "Sketcher"; + sGroup = QT_TR_NOOP("Sketcher"); + sMenuText = QT_TR_NOOP("Create heptagon"); + sToolTipText = QT_TR_NOOP("Create a heptagon in the sketch"); + sWhatsThis = sToolTipText; + sStatusTip = sToolTipText; + sPixmap = "Sketcher_CreateHeptagon"; + sAccel = ""; + eType = ForEdit; +} + +void CmdSketcherCreateHeptagon::activated(int iMsg) +{ + ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerRegularPolygon(7) ); +} + +bool CmdSketcherCreateHeptagon::isActive(void) +{ + return isCreateGeoActive(getActiveGuiDocument()); +} + +DEF_STD_CMD_A(CmdSketcherCreateOctagon); +CmdSketcherCreateOctagon::CmdSketcherCreateOctagon() + : Command("Sketcher_CreateOctagon") +{ + sAppModule = "Sketcher"; + sGroup = QT_TR_NOOP("Sketcher"); + sMenuText = QT_TR_NOOP("Create octagon"); + sToolTipText = QT_TR_NOOP("Create an octagon in the sketch"); + sWhatsThis = sToolTipText; + sStatusTip = sToolTipText; + sPixmap = "Sketcher_CreateOctagon"; + sAccel = ""; + eType = ForEdit; +} + +void CmdSketcherCreateOctagon::activated(int iMsg) +{ + ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerRegularPolygon(8) ); +} + +bool CmdSketcherCreateOctagon::isActive(void) +{ + return isCreateGeoActive(getActiveGuiDocument()); +} + + +DEF_STD_CMD_ACL(CmdSketcherCompCreateRegularPolygon); + +CmdSketcherCompCreateRegularPolygon::CmdSketcherCompCreateRegularPolygon() + : Command("Sketcher_CompCreateRegularPolygon") +{ + sAppModule = "Sketcher"; + sGroup = QT_TR_NOOP("Sketcher"); + sMenuText = QT_TR_NOOP("Create regular polygon"); + sToolTipText = QT_TR_NOOP("Create an regular polygon in the sketcher"); + sWhatsThis = sToolTipText; + sStatusTip = sToolTipText; + eType = ForEdit; +} + +void CmdSketcherCompCreateRegularPolygon::activated(int iMsg) +{ + switch( iMsg ){ + case 0: + ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerRegularPolygon(3)); break; + case 1: + ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerRegularPolygon(4)); break; + case 2: + ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerRegularPolygon(5)); break; + case 3: + ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerRegularPolygon(6)); break; + case 4: + ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerRegularPolygon(7)); break; + case 5: + ActivateHandler(getActiveGuiDocument(),new DrawSketchHandlerRegularPolygon(8)); break; + default: + 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()); +} + +Gui::Action * CmdSketcherCompCreateRegularPolygon::createAction(void) +{ + Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow()); + pcAction->setDropDownMenu(true); + applyCommandData(pcAction); + + QAction* triangle = pcAction->addAction(QString()); + triangle->setIcon(Gui::BitmapFactory().pixmapFromSvg("Sketcher_CreateTriangle", QSize(24,24))); + QAction* square = pcAction->addAction(QString()); + square->setIcon(Gui::BitmapFactory().pixmapFromSvg("Sketcher_CreateSquare", QSize(24,24))); + QAction* pentagon = pcAction->addAction(QString()); + pentagon->setIcon(Gui::BitmapFactory().pixmapFromSvg("Sketcher_CreatePentagon", QSize(24,24))); + QAction* hexagon = pcAction->addAction(QString()); + hexagon->setIcon(Gui::BitmapFactory().pixmapFromSvg("Sketcher_CreateHexagon", QSize(24,24))); + QAction* heptagon = pcAction->addAction(QString()); + heptagon->setIcon(Gui::BitmapFactory().pixmapFromSvg("Sketcher_CreateHeptagon", QSize(24,24))); + QAction* octagon = pcAction->addAction(QString()); + octagon->setIcon(Gui::BitmapFactory().pixmapFromSvg("Sketcher_CreateOctagon", QSize(24,24))); + + _pcAction = pcAction; + languageChange(); + + pcAction->setIcon(hexagon->icon()); + int defaultId = 3; + pcAction->setProperty("defaultAction", QVariant(defaultId)); + + return pcAction; +} + +void CmdSketcherCompCreateRegularPolygon::languageChange() +{ + Command::languageChange(); + + if (!_pcAction) + return; + Gui::ActionGroup* pcAction = qobject_cast(_pcAction); + QList a = pcAction->actions(); + + QAction* triangle = a[0]; + triangle->setText(QApplication::translate("CmdSketcherCompCreateRegularPolygon","Triangle")); + triangle->setToolTip(QApplication::translate("Sketcher_CreateTriangle","Create an equilateral triangle by its center and by one corner")); + triangle->setStatusTip(QApplication::translate("Sketcher_CreateTriangle","Create an equilateral triangle by its center and by one corner")); + QAction* square = a[1]; + square->setText(QApplication::translate("CmdSketcherCompCreateRegularPolygon","Square")); + square->setToolTip(QApplication::translate("Sketcher_CreateSquare","Create a square by its center and by one corner")); + square->setStatusTip(QApplication::translate("Sketcher_CreateSquare","Create a square by its center and by one corner")); + QAction* pentagon = a[2]; + pentagon->setText(QApplication::translate("CmdSketcherCompCreateRegularPolygon","Pentagon")); + pentagon->setToolTip(QApplication::translate("Sketcher_CreatePentagon","Create a pentagon by its center and by one corner")); + pentagon->setStatusTip(QApplication::translate("Sketcher_CreatePentagon","Create a pentagon by its center and by one corner")); + QAction* hexagon = a[3]; + hexagon->setText(QApplication::translate("CmdSketcherCompCreateRegularPolygon","Hexagon")); + hexagon->setToolTip(QApplication::translate("Sketcher_CreateHexagon","Create a hexagon by its center and by one corner")); + hexagon->setStatusTip(QApplication::translate("Sketcher_CreateHexagon","Create a hexagon by its center and by one corner")); + QAction* heptagon = a[4]; + heptagon->setText(QApplication::translate("CmdSketcherCompCreateRegularPolygon","Heptagon")); + heptagon->setToolTip(QApplication::translate("Sketcher_CreateHeptagon","Create a heptagon by its center and by one corner")); + heptagon->setStatusTip(QApplication::translate("Sketcher_CreateHeptagon","Create a heptagon by its center and by one corner")); + QAction* octagon = a[5]; + octagon->setText(QApplication::translate("CmdSketcherCompCreateRegularPolygon","Octagon")); + octagon->setToolTip(QApplication::translate("Sketcher_CreateOctagon","Create an octagon by its center and by one corner")); + octagon->setStatusTip(QApplication::translate("Sketcher_CreateOctagon","Create an octagon by its center and by one corner")); +} + +bool CmdSketcherCompCreateRegularPolygon::isActive(void) +{ + return isCreateGeoActive(getActiveGuiDocument()); +} + + + void CreateSketcherCommandsCreateGeo(void) { Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager(); @@ -3111,6 +3580,13 @@ void CreateSketcherCommandsCreateGeo(void) rcCmdMgr.addCommand(new CmdSketcherCreateLine()); rcCmdMgr.addCommand(new CmdSketcherCreatePolyline()); rcCmdMgr.addCommand(new CmdSketcherCreateRectangle()); + rcCmdMgr.addCommand(new CmdSketcherCompCreateRegularPolygon()); + rcCmdMgr.addCommand(new CmdSketcherCreateTriangle()); + rcCmdMgr.addCommand(new CmdSketcherCreateSquare()); + rcCmdMgr.addCommand(new CmdSketcherCreatePentagon()); + rcCmdMgr.addCommand(new CmdSketcherCreateHexagon()); + rcCmdMgr.addCommand(new CmdSketcherCreateHeptagon()); + rcCmdMgr.addCommand(new CmdSketcherCreateOctagon()); rcCmdMgr.addCommand(new CmdSketcherCreateSlot()); rcCmdMgr.addCommand(new CmdSketcherCreateFillet()); //rcCmdMgr.addCommand(new CmdSketcherCreateText()); diff --git a/src/Mod/Sketcher/Gui/Resources/Sketcher.qrc b/src/Mod/Sketcher/Gui/Resources/Sketcher.qrc index af0ec61ab..13a030d32 100644 --- a/src/Mod/Sketcher/Gui/Resources/Sketcher.qrc +++ b/src/Mod/Sketcher/Gui/Resources/Sketcher.qrc @@ -60,6 +60,12 @@ icons/Sketcher_CreateRectangle.svg icons/Sketcher_CreateSlot.svg icons/Sketcher_CreateFillet.svg + icons/Sketcher_CreateTriangle.svg + icons/Sketcher_CreateSquare.svg + icons/Sketcher_CreatePentagon.svg + icons/Sketcher_CreateHexagon.svg + icons/Sketcher_CreateHeptagon.svg + icons/Sketcher_CreateOctagon.svg icons/Sketcher_CreateText.svg icons/Sketcher_DraftLine.svg icons/Sketcher_Trimming.svg diff --git a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp index 4c07947fd..52947c9e6 100644 --- a/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp +++ b/src/Mod/Sketcher/Gui/ViewProviderSketch.cpp @@ -763,6 +763,7 @@ bool ViewProviderSketch::mouseButtonPressed(int Button, bool pressed, const SbVe << "Sketcher_CreateLine" << "Sketcher_CreatePolyline" << "Sketcher_CreateRectangle" + << "Sketcher_CreateHexagon" << "Sketcher_CreateFillet" << "Sketcher_Trimming" << "Sketcher_External" diff --git a/src/Mod/Sketcher/Gui/Workbench.cpp b/src/Mod/Sketcher/Gui/Workbench.cpp index be268272d..49cb1e505 100644 --- a/src/Mod/Sketcher/Gui/Workbench.cpp +++ b/src/Mod/Sketcher/Gui/Workbench.cpp @@ -69,54 +69,16 @@ Gui::MenuItem* Workbench::setupMenuBar() const sketch->setCommand("S&ketch"); Gui::MenuItem* geom = new Gui::MenuItem(); geom->setCommand("Sketcher geometries"); - *geom << "Sketcher_CreatePoint" - << "Sketcher_CreateLine" - << "Sketcher_CreateArc" - << "Sketcher_Create3PointArc" - << "Sketcher_CreateCircle" - << "Sketcher_Create3PointCircle" - << "Separator" - << "Sketcher_CreatePolyline" - << "Sketcher_CreateRectangle" - << "Sketcher_CreateSlot" - << "Separator" - << "Sketcher_CreateFillet" - << "Sketcher_Trimming" - << "Sketcher_External" - << "Sketcher_ToggleConstruction" - /*<< "Sketcher_CreateText"*/ - /*<< "Sketcher_CreateDraftLine"*/; + addSketcherWorkbenchGeometries( *geom ); Gui::MenuItem* cons = new Gui::MenuItem(); cons->setCommand("Sketcher constraints"); - *cons << "Sketcher_ConstrainCoincident" - << "Sketcher_ConstrainPointOnObject" - << "Sketcher_ConstrainVertical" - << "Sketcher_ConstrainHorizontal" - << "Sketcher_ConstrainParallel" - << "Sketcher_ConstrainPerpendicular" - << "Sketcher_ConstrainTangent" - << "Sketcher_ConstrainEqual" - << "Sketcher_ConstrainSymmetric" - << "Separator" - << "Sketcher_ConstrainLock" - << "Sketcher_ConstrainDistanceX" - << "Sketcher_ConstrainDistanceY" - << "Sketcher_ConstrainDistance" - << "Sketcher_ConstrainRadius" - << "Sketcher_ConstrainAngle"; + addSketcherWorkbenchConstraints(*cons); - *sketch - << "Sketcher_NewSketch" - << "Sketcher_EditSketch" - << "Sketcher_LeaveSketch" - << "Sketcher_ViewSketch" - << "Sketcher_MapSketch" - << "Sketcher_ReorientSketch" - << "Sketcher_ValidateSketch" - << geom - << cons - ; + + addSketcherWorkbenchSketchActions( *sketch ); + *sketch << geom + << cons; return root; } @@ -127,48 +89,17 @@ Gui::ToolBarItem* Workbench::setupToolBars() const Gui::ToolBarItem* part = new Gui::ToolBarItem(root); part->setCommand("Sketcher"); - *part << "Sketcher_NewSketch" - << "Sketcher_ViewSketch" - << "Sketcher_MapSketch" - << "Sketcher_LeaveSketch"; + addSketcherWorkbenchSketchActions( *part ); Gui::ToolBarItem* geom = new Gui::ToolBarItem(root); geom->setCommand("Sketcher geometries"); - *geom << "Sketcher_CreatePoint" - << "Sketcher_CreateLine" - << "Sketcher_CompCreateArc" - << "Sketcher_CompCreateCircle" - << "Separator" - << "Sketcher_CreatePolyline" - << "Sketcher_CreateRectangle" - << "Sketcher_CreateSlot" - << "Separator" - << "Sketcher_CreateFillet" - << "Sketcher_Trimming" - << "Sketcher_External" - << "Sketcher_ToggleConstruction" - /*<< "Sketcher_CreateText"*/ - /*<< "Sketcher_CreateDraftLine"*/; + addSketcherWorkbenchGeometries(*geom); Gui::ToolBarItem* cons = new Gui::ToolBarItem(root); cons->setCommand("Sketcher constraints"); - *cons << "Sketcher_ConstrainCoincident" - << "Sketcher_ConstrainPointOnObject" - << "Sketcher_ConstrainVertical" - << "Sketcher_ConstrainHorizontal" - << "Sketcher_ConstrainParallel" - << "Sketcher_ConstrainPerpendicular" - << "Sketcher_ConstrainTangent" - << "Sketcher_ConstrainEqual" - << "Sketcher_ConstrainSymmetric" - << "Separator" - << "Sketcher_ConstrainLock" - << "Sketcher_ConstrainDistanceX" - << "Sketcher_ConstrainDistanceY" - << "Sketcher_ConstrainDistance" - << "Sketcher_ConstrainRadius" - << "Sketcher_ConstrainAngle"; - return root; + addSketcherWorkbenchConstraints( *cons ); + + return root; } Gui::ToolBarItem* Workbench::setupCommandBars() const @@ -178,3 +109,128 @@ Gui::ToolBarItem* Workbench::setupCommandBars() const return root; } + +namespace SketcherGui { + +template +void SketcherAddWorkbenchConstraints( T& cons ); +template +void Sketcher_addWorkbenchSketchActions( T& sketch ); +template +void SketcherAddWorkbenchGeometries( T& geom ); + + + +template +void SketcherAddWorkspaceArcs(T& geom); +template <> +inline void SketcherAddWorkspaceArcs(Gui::MenuItem& geom){ + geom << "Sketcher_CreateArc" + << "Sketcher_Create3PointArc" + << "Sketcher_CreateCircle" + << "Sketcher_Create3PointCircle"; +} +template <> +inline void SketcherAddWorkspaceArcs(Gui::ToolBarItem& geom){ + geom << "Sketcher_CompCreateArc" + << "Sketcher_CompCreateCircle"; +} +template +void SketcherAddWorkspaceRegularPolygon(T& geom); +template <> +inline void SketcherAddWorkspaceRegularPolygon(Gui::MenuItem& geom){ + geom << "Sketcher_CreateTriangle" + << "Sketcher_CreateSquare" + << "Sketcher_CreatePentagon" + << "Sketcher_CreateHexagon" + << "Sketcher_CreateHeptagon" + << "Sketcher_CreateOctagon"; +} +template <> +inline void SketcherAddWorkspaceRegularPolygon(Gui::ToolBarItem& geom){ + geom << "Sketcher_CompCreateRegularPolygon"; +} +template +inline void SketcherAddWorkbenchGeometries(T& geom){ + geom << "Sketcher_CreatePoint" + << "Sketcher_CreateLine"; + SketcherAddWorkspaceArcs( geom ); + geom << "Separator" + << "Sketcher_CreatePolyline" + << "Sketcher_CreateRectangle"; + SketcherAddWorkspaceRegularPolygon( geom ); + geom << "Sketcher_CreateSlot" + << "Separator" + << "Sketcher_CreateFillet" + << "Sketcher_Trimming" + << "Sketcher_External" + << "Sketcher_ToggleConstruction" + /*<< "Sketcher_CreateText"*/ + /*<< "Sketcher_CreateDraftLine"*/; +} + + +template +inline void SketcherAddWorkbenchConstraints(T& cons){ + cons << "Sketcher_ConstrainCoincident" + << "Sketcher_ConstrainPointOnObject" + << "Sketcher_ConstrainVertical" + << "Sketcher_ConstrainHorizontal" + << "Sketcher_ConstrainParallel" + << "Sketcher_ConstrainPerpendicular" + << "Sketcher_ConstrainTangent" + << "Sketcher_ConstrainEqual" + << "Sketcher_ConstrainSymmetric" + << "Separator" + << "Sketcher_ConstrainLock" + << "Sketcher_ConstrainDistanceX" + << "Sketcher_ConstrainDistanceY" + << "Sketcher_ConstrainDistance" + << "Sketcher_ConstrainRadius" + << "Sketcher_ConstrainAngle"; + +} + +template +inline void SketcherAddWorkspaceSketchExtra(T& sketch){ +} + +template <> +inline void SketcherAddWorkspaceSketchExtra(Gui::MenuItem& sketch){ + sketch << "Sketcher_ReorientSketch" + << "Sketcher_ValidateSketch"; +} + +template +inline void Sketcher_addWorkbenchSketchActions(T& sketch){ + sketch << "Sketcher_NewSketch" + << "Sketcher_EditSketch" + << "Sketcher_LeaveSketch" + << "Sketcher_ViewSketch" + << "Sketcher_MapSketch"; + SketcherAddWorkspaceSketchExtra( sketch ); +} + + + +void addSketcherWorkbenchConstraints( Gui::MenuItem& cons ){ + SketcherAddWorkbenchConstraints( cons ); +} +void addSketcherWorkbenchSketchActions( Gui::MenuItem& sketch ){ + Sketcher_addWorkbenchSketchActions( sketch ); +} +void addSketcherWorkbenchGeometries( Gui::MenuItem& geom ){ + SketcherAddWorkbenchGeometries(geom); +} + +void addSketcherWorkbenchConstraints( Gui::ToolBarItem& cons ){ + SketcherAddWorkbenchConstraints( cons ); +} +void addSketcherWorkbenchSketchActions( Gui::ToolBarItem& sketch ){ + Sketcher_addWorkbenchSketchActions( sketch ); +} +void addSketcherWorkbenchGeometries( Gui::ToolBarItem& geom ){ + SketcherAddWorkbenchGeometries(geom); +} + +} /* namespace SketcherGui */ diff --git a/src/Mod/Sketcher/Gui/Workbench.h b/src/Mod/Sketcher/Gui/Workbench.h index 80c3f7409..829b5de41 100644 --- a/src/Mod/Sketcher/Gui/Workbench.h +++ b/src/Mod/Sketcher/Gui/Workbench.h @@ -25,6 +25,8 @@ #define IMAGE_WORKBENCH_H #include +#include +#include namespace SketcherGui { @@ -45,6 +47,17 @@ protected: Gui::ToolBarItem* setupCommandBars() const; }; + + + +SketcherGuiExport void addSketcherWorkbenchConstraints( Gui::MenuItem& cons ); +SketcherGuiExport void addSketcherWorkbenchSketchActions( Gui::MenuItem& sketch ); +SketcherGuiExport void addSketcherWorkbenchGeometries( Gui::MenuItem& geom ); + +SketcherGuiExport void addSketcherWorkbenchConstraints( Gui::ToolBarItem& cons ); +SketcherGuiExport void addSketcherWorkbenchSketchActions( Gui::ToolBarItem& sketch ); +SketcherGuiExport void addSketcherWorkbenchGeometries( Gui::ToolBarItem& geom ); + } // namespace SketcherGui