diff --git a/src/Mod/Part/Gui/Command.cpp b/src/Mod/Part/Gui/Command.cpp index 69b17ac63..4fa38ba0c 100644 --- a/src/Mod/Part/Gui/Command.cpp +++ b/src/Mod/Part/Gui/Command.cpp @@ -1474,8 +1474,8 @@ CmdPartOffset::CmdPartOffset() { sAppModule = "Part"; sGroup = QT_TR_NOOP("Part"); - sMenuText = QT_TR_NOOP("Offset..."); - sToolTipText = QT_TR_NOOP("Utility to offset"); + sMenuText = QT_TR_NOOP("3D Offset..."); + sToolTipText = QT_TR_NOOP("Part_Offset: Utility to offset in 3D"); sWhatsThis = "Part_Offset"; sStatusTip = sToolTipText; sPixmap = "Part_Offset"; @@ -1510,6 +1510,147 @@ bool CmdPartOffset::isActive(void) return (objectsSelected && !Gui::Control().activeDialog()); } + +//=========================================================================== +// Part_Offset2D +//=========================================================================== + +DEF_STD_CMD_A(CmdPartOffset2D); + +CmdPartOffset2D::CmdPartOffset2D() + : Command("Part_Offset2D") +{ + sAppModule = "Part"; + sGroup = QT_TR_NOOP("Part"); + sMenuText = QT_TR_NOOP("2D Offset..."); + sToolTipText = QT_TR_NOOP("Part_Offset2D: Utility to offset planar shapes"); + sWhatsThis = "Part_Offset2D"; + sStatusTip = sToolTipText; + sPixmap = "Part_Offset2D"; +} + +void CmdPartOffset2D::activated(int iMsg) +{ + App::DocumentObject* shape = getSelection().getObjectsOfType(Part::Feature::getClassTypeId()).front(); + std::string offset = getUniqueObjectName("Offset2D"); + + openCommand("Make 2D Offset"); + doCommand(Doc,"App.ActiveDocument.addObject(\"Part::Offset2D\",\"%s\")",offset.c_str()); + doCommand(Doc,"App.ActiveDocument.%s.Source = App.ActiveDocument.%s" ,offset.c_str(), shape->getNameInDocument()); + doCommand(Doc,"App.ActiveDocument.%s.Value = 1.0",offset.c_str()); + updateActive(); + //if (isActiveObjectValid()) + // doCommand(Gui,"Gui.ActiveDocument.hide(\"%s\")",shape->getNameInDocument()); + doCommand(Gui,"Gui.ActiveDocument.setEdit('%s')",offset.c_str()); + + //commitCommand(); + adjustCameraPosition(); + + copyVisual(offset.c_str(), "ShapeColor", shape->getNameInDocument()); + copyVisual(offset.c_str(), "LineColor" , shape->getNameInDocument()); + copyVisual(offset.c_str(), "PointColor", shape->getNameInDocument()); +} + +bool CmdPartOffset2D::isActive(void) +{ + Base::Type partid = Base::Type::fromName("Part::Feature"); + bool objectsSelected = Gui::Selection().countObjectsOfType(partid) == 1; + return (objectsSelected && !Gui::Control().activeDialog()); +} + +//=========================================================================== +// Part_CompOffset (dropdown toolbar button for Offset features) +//=========================================================================== + +DEF_STD_CMD_ACL(CmdPartCompOffset); + +CmdPartCompOffset::CmdPartCompOffset() + : Command("Part_CompOffset") +{ + sAppModule = "Part"; + sGroup = QT_TR_NOOP("Part"); + sMenuText = QT_TR_NOOP("Offset:"); + sToolTipText = QT_TR_NOOP("Tools to offset shapes (construct parallel shapes)"); + sWhatsThis = "Part_CompOffset"; + sStatusTip = sToolTipText; +} + +void CmdPartCompOffset::activated(int iMsg) +{ + Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager(); + if (iMsg==0) + rcCmdMgr.runCommandByName("Part_Offset"); + else if (iMsg==1) + rcCmdMgr.runCommandByName("Part_Offset2D"); + else + 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 * CmdPartCompOffset::createAction(void) +{ + Gui::ActionGroup* pcAction = new Gui::ActionGroup(this, Gui::getMainWindow()); + pcAction->setDropDownMenu(true); + applyCommandData(this->className(), pcAction); + + QAction* cmd0 = pcAction->addAction(QString()); + cmd0->setIcon(Gui::BitmapFactory().pixmap("Part_Offset")); + QAction* cmd1 = pcAction->addAction(QString()); + cmd1->setIcon(Gui::BitmapFactory().pixmap("Part_Offset2D")); + + _pcAction = pcAction; + languageChange(); + + pcAction->setIcon(cmd0->icon()); + int defaultId = 0; + pcAction->setProperty("defaultAction", QVariant(defaultId)); + + return pcAction; +} + +void CmdPartCompOffset::languageChange() +{ + Command::languageChange(); + + if (!_pcAction) + return; + + Gui::CommandManager &rcCmdMgr = Gui::Application::Instance->commandManager(); + + Gui::ActionGroup* pcAction = qobject_cast(_pcAction); + QList a = pcAction->actions(); + + Gui::Command* cmdOffset = rcCmdMgr.getCommandByName("Part_Offset"); + if (cmdOffset) { + QAction* cmd0 = a[0]; + cmd0->setText(QApplication::translate("Part_Offset", cmdOffset->getMenuText())); + cmd0->setToolTip(QApplication::translate("Part_Offset", cmdOffset->getToolTipText())); + cmd0->setStatusTip(QApplication::translate("Part_Offset", cmdOffset->getStatusTip())); + } + + Gui::Command* cmdOffset2D = rcCmdMgr.getCommandByName("Part_Offset2D"); + if (cmdOffset2D) { + QAction* cmd1 = a[1]; + cmd1->setText(QApplication::translate("Part_Offset", cmdOffset2D->getMenuText())); + cmd1->setToolTip(QApplication::translate("Part_Offset", cmdOffset2D->getToolTipText())); + cmd1->setStatusTip(QApplication::translate("Part_Offset", cmdOffset2D->getStatusTip())); + } +} + +bool CmdPartCompOffset::isActive(void) +{ + Base::Type partid = Base::Type::fromName("Part::Feature"); + bool objectsSelected = Gui::Selection().countObjectsOfType(partid) == 1; + return (objectsSelected && !Gui::Control().activeDialog()); +} + //=========================================================================== // Part_Thickness //=========================================================================== @@ -2076,6 +2217,8 @@ void CreatePartCommands(void) rcCmdMgr.addCommand(new CmdPartLoft()); rcCmdMgr.addCommand(new CmdPartSweep()); rcCmdMgr.addCommand(new CmdPartOffset()); + rcCmdMgr.addCommand(new CmdPartOffset2D()); + rcCmdMgr.addCommand(new CmdPartCompOffset()); rcCmdMgr.addCommand(new CmdPartThickness()); rcCmdMgr.addCommand(new CmdCheckGeometry()); rcCmdMgr.addCommand(new CmdColorPerFace()); diff --git a/src/Mod/Part/Gui/Resources/Part.qrc b/src/Mod/Part/Gui/Resources/Part.qrc index 48ac2a6f9..3c28306e3 100644 --- a/src/Mod/Part/Gui/Resources/Part.qrc +++ b/src/Mod/Part/Gui/Resources/Part.qrc @@ -23,6 +23,7 @@ icons/Part_Mirror.svg icons/Part_MirrorPNG.png icons/Part_Offset.svg + icons/Part_Offset2D.svg icons/Part_Revolve.svg icons/Part_RuledSurface.svg icons/Part_Section.svg diff --git a/src/Mod/Part/Gui/Resources/icons/Part_Offset2D.svg b/src/Mod/Part/Gui/Resources/icons/Part_Offset2D.svg new file mode 100644 index 000000000..89c7439a9 --- /dev/null +++ b/src/Mod/Part/Gui/Resources/icons/Part_Offset2D.svg @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/src/Mod/Part/Gui/Workbench.cpp b/src/Mod/Part/Gui/Workbench.cpp index 560e284b9..0e8969f69 100644 --- a/src/Mod/Part/Gui/Workbench.cpp +++ b/src/Mod/Part/Gui/Workbench.cpp @@ -86,7 +86,7 @@ Gui::MenuItem* Workbench::setupMenuBar() const << "Part_CrossSections" << "Part_Compound" << "Part_MakeFace" << "Part_Extrude" << "Part_Revolve" << "Part_Mirror" << "Part_Fillet" << "Part_Chamfer" << "Part_RuledSurface" << "Part_Loft" << "Part_Sweep" - << "Part_Offset" << "Part_Thickness" << "Separator" << "Part_EditAttachment"; + << "Part_Offset" << "Part_Offset2D" << "Part_Thickness" << "Separator" << "Part_EditAttachment"; Gui::MenuItem* measure = new Gui::MenuItem; root->insertItem(item,measure); @@ -122,7 +122,7 @@ Gui::ToolBarItem* Workbench::setupToolBars() const tool->setCommand("Part tools"); *tool << "Part_Extrude" << "Part_Revolve" << "Part_Mirror" << "Part_Fillet" << "Part_Chamfer" << "Part_RuledSurface" << "Part_Loft" << "Part_Sweep" - << "Part_Offset" << "Part_Thickness"; + << "Part_CompOffset" << "Part_Thickness"; Gui::ToolBarItem* boolop = new Gui::ToolBarItem(root); boolop->setCommand("Boolean");