diff --git a/src/Mod/Part/App/AppPart.cpp b/src/Mod/Part/App/AppPart.cpp index e2fa70b015..48eba53431 100644 --- a/src/Mod/Part/App/AppPart.cpp +++ b/src/Mod/Part/App/AppPart.cpp @@ -145,9 +145,10 @@ void PartExport initPart() Part::Fuse ::init(); Part::MultiFuse ::init(); Part::Section ::init(); + Part::FilletBase ::init(); + Part::Fillet ::init(); Part::Chamfer ::init(); Part::Extrusion ::init(); - Part::Fillet ::init(); Part::Revolution ::init(); Part::Mirroring ::init(); Part::ImportStep ::init(); diff --git a/src/Mod/Part/App/FeatureChamfer.cpp b/src/Mod/Part/App/FeatureChamfer.cpp index c30c9ae2cc..3c694f0128 100644 --- a/src/Mod/Part/App/FeatureChamfer.cpp +++ b/src/Mod/Part/App/FeatureChamfer.cpp @@ -40,20 +40,10 @@ using namespace Part; -PROPERTY_SOURCE(Part::Chamfer, Part::Feature) +PROPERTY_SOURCE(Part::Chamfer, Part::FilletBase) Chamfer::Chamfer() { - ADD_PROPERTY(Base,(0)); - ADD_PROPERTY(Edges,(0,0,0)); - Edges.setSize(0); -} - -short Chamfer::mustExecute() const -{ - if (Base.isTouched() || Edges.isTouched()) - return 1; - return 0; } App::DocumentObjectExecReturn *Chamfer::execute(void) diff --git a/src/Mod/Part/App/FeatureChamfer.h b/src/Mod/Part/App/FeatureChamfer.h index 64e9a38fb4..27a9c5726e 100644 --- a/src/Mod/Part/App/FeatureChamfer.h +++ b/src/Mod/Part/App/FeatureChamfer.h @@ -30,21 +30,17 @@ namespace Part { -class Chamfer : public Part::Feature +class Chamfer : public Part::FilletBase { PROPERTY_HEADER(Part::Chamfer); public: Chamfer(); - App::PropertyLink Base; - PropertyFilletEdges Edges; - /** @name methods override feature */ //@{ /// recalculate the feature App::DocumentObjectExecReturn *execute(void); - short mustExecute() const; /// returns the type name of the view provider const char* getViewProviderName(void) const { return "PartGui::ViewProviderChamfer"; diff --git a/src/Mod/Part/App/FeatureFillet.cpp b/src/Mod/Part/App/FeatureFillet.cpp index c17a225599..032bcde7da 100644 --- a/src/Mod/Part/App/FeatureFillet.cpp +++ b/src/Mod/Part/App/FeatureFillet.cpp @@ -39,20 +39,10 @@ using namespace Part; -PROPERTY_SOURCE(Part::Fillet, Part::Feature) +PROPERTY_SOURCE(Part::Fillet, Part::FilletBase) Fillet::Fillet() { - ADD_PROPERTY(Base,(0)); - ADD_PROPERTY(Edges,(0,0,0)); - Edges.setSize(0); -} - -short Fillet::mustExecute() const -{ - if (Base.isTouched() || Edges.isTouched()) - return 1; - return 0; } App::DocumentObjectExecReturn *Fillet::execute(void) diff --git a/src/Mod/Part/App/FeatureFillet.h b/src/Mod/Part/App/FeatureFillet.h index 1b8472f941..e17a216493 100644 --- a/src/Mod/Part/App/FeatureFillet.h +++ b/src/Mod/Part/App/FeatureFillet.h @@ -30,21 +30,17 @@ namespace Part { -class Fillet : public Part::Feature +class Fillet : public Part::FilletBase { PROPERTY_HEADER(Part::Fillet); public: Fillet(); - App::PropertyLink Base; - PropertyFilletEdges Edges; - /** @name methods override feature */ //@{ /// recalculate the feature App::DocumentObjectExecReturn *execute(void); - short mustExecute() const; /// returns the type name of the view provider const char* getViewProviderName(void) const { return "PartGui::ViewProviderFillet"; diff --git a/src/Mod/Part/App/PartFeature.cpp b/src/Mod/Part/App/PartFeature.cpp index 0307040e39..508009317f 100644 --- a/src/Mod/Part/App/PartFeature.cpp +++ b/src/Mod/Part/App/PartFeature.cpp @@ -132,6 +132,24 @@ const char* Feature::getViewProviderName(void) const { // --------------------------------------------------------- +PROPERTY_SOURCE(Part::FilletBase, Part::Feature) + +FilletBase::FilletBase() +{ + ADD_PROPERTY(Base,(0)); + ADD_PROPERTY(Edges,(0,0,0)); + Edges.setSize(0); +} + +short FilletBase::mustExecute() const +{ + if (Base.isTouched() || Edges.isTouched()) + return 1; + return 0; +} + +// --------------------------------------------------------- + PROPERTY_SOURCE(Part::FeatureExt, Part::Feature) diff --git a/src/Mod/Part/App/PartFeature.h b/src/Mod/Part/App/PartFeature.h index ce90f4756f..efa0b7a836 100644 --- a/src/Mod/Part/App/PartFeature.h +++ b/src/Mod/Part/App/PartFeature.h @@ -68,6 +68,19 @@ protected: TopLoc_Location getLocation() const; }; +class FilletBase : public Part::Feature +{ + PROPERTY_HEADER(Part::FilletBase); + +public: + FilletBase(); + + App::PropertyLink Base; + PropertyFilletEdges Edges; + + short mustExecute() const; +}; + typedef App::FeaturePythonT FeaturePython; diff --git a/src/Mod/Part/Gui/Command.cpp b/src/Mod/Part/Gui/Command.cpp index 6bcce90fad..1b616525a7 100644 --- a/src/Mod/Part/Gui/Command.cpp +++ b/src/Mod/Part/Gui/Command.cpp @@ -817,6 +817,33 @@ bool CmdPartFillet::isActive(void) return (hasActiveDocument() && !Gui::Control().activeDialog()); } +//=========================================================================== +// Part_Chamfer +//=========================================================================== +DEF_STD_CMD_A(CmdPartChamfer); + +CmdPartChamfer::CmdPartChamfer() + :Command("Part_Chamfer") +{ + sAppModule = "Part"; + sGroup = QT_TR_NOOP("Part"); + sMenuText = QT_TR_NOOP("Chamfer..."); + sToolTipText = QT_TR_NOOP("Chamfer the selected edges of a shape"); + sWhatsThis = sToolTipText; + sStatusTip = sToolTipText; + sPixmap = "Part_Chamfer"; +} + +void CmdPartChamfer::activated(int iMsg) +{ + Gui::Control().showDialog(new PartGui::TaskChamferEdges(0)); +} + +bool CmdPartChamfer::isActive(void) +{ + return (hasActiveDocument() && !Gui::Control().activeDialog()); +} + //=========================================================================== // Part_Mirror //=========================================================================== @@ -1152,6 +1179,7 @@ void CreatePartCommands(void) rcCmdMgr.addCommand(new CmdPartRevolve()); rcCmdMgr.addCommand(new CmdPartCrossSections()); rcCmdMgr.addCommand(new CmdPartFillet()); + rcCmdMgr.addCommand(new CmdPartChamfer()); rcCmdMgr.addCommand(new CmdPartCommon()); rcCmdMgr.addCommand(new CmdPartCut()); rcCmdMgr.addCommand(new CmdPartFuse()); diff --git a/src/Mod/Part/Gui/DlgFilletEdges.cpp b/src/Mod/Part/Gui/DlgFilletEdges.cpp index 7f73722100..654fd579c4 100644 --- a/src/Mod/Part/Gui/DlgFilletEdges.cpp +++ b/src/Mod/Part/Gui/DlgFilletEdges.cpp @@ -49,6 +49,7 @@ #include "../App/PartFeature.h" #include "../App/FeatureFillet.h" +#include "../App/FeatureChamfer.h" #include #include #include @@ -155,7 +156,7 @@ namespace PartGui { public: App::DocumentObject* object; EdgeSelection* selection; - Part::Fillet* fillet; + Part::FilletBase* fillet; typedef boost::signals::connection Connection; Connection connectApplicationDeletedObject; Connection connectApplicationDeletedDocument; @@ -164,7 +165,7 @@ namespace PartGui { /* TRANSLATOR PartGui::DlgFilletEdges */ -DlgFilletEdges::DlgFilletEdges(Part::Fillet* fillet, QWidget* parent, Qt::WFlags fl) +DlgFilletEdges::DlgFilletEdges(Part::FilletBase* fillet, QWidget* parent, Qt::WFlags fl) : QWidget(parent, fl), ui(new Ui_DlgFilletEdges()), d(new DlgFilletEdgesP()) { ui->setupUi(this); @@ -544,6 +545,11 @@ void DlgFilletEdges::on_filletEndRadius_valueChanged(double radius) } } +const char* DlgFilletEdges::getFilletType() const +{ + return "Fillet"; +} + bool DlgFilletEdges::accept() { if (!d->object) { @@ -558,16 +564,17 @@ bool DlgFilletEdges::accept() bool todo = false; QString shape, type, name; + std::string fillet = getFilletType(); int index = ui->shapeObject->currentIndex(); shape = ui->shapeObject->itemData(index).toString(); - type = QString::fromAscii("Part::Fillet"); + type = QString::fromAscii("Part::%1").arg(QString::fromAscii(fillet.c_str())); if (d->fillet) name = QString::fromAscii(d->fillet->getNameInDocument()); else - name = QString::fromAscii(activeDoc->getUniqueObjectName("Fillet").c_str()); + name = QString::fromAscii(activeDoc->getUniqueObjectName(fillet.c_str()).c_str()); - activeDoc->openTransaction("Fillet"); + activeDoc->openTransaction(fillet.c_str()); QString code; if (!d->fillet) { code = QString::fromAscii( @@ -627,7 +634,7 @@ bool DlgFilletEdges::accept() // --------------------------------------- -FilletEdgesDialog::FilletEdgesDialog(Part::Fillet* fillet, QWidget* parent, Qt::WFlags fl) +FilletEdgesDialog::FilletEdgesDialog(Part::FilletBase* fillet, QWidget* parent, Qt::WFlags fl) : QDialog(parent, fl) { widget = new DlgFilletEdges(fillet, this); @@ -693,4 +700,63 @@ bool TaskFilletEdges::reject() return true; } +// -------------------------------------------------------------- + +/* TRANSLATOR PartGui::DlgChamferEdges */ + +DlgChamferEdges::DlgChamferEdges(Part::FilletBase* chamfer, QWidget* parent, Qt::WFlags fl) + : DlgFilletEdges(chamfer, parent, fl) +{ + this->setWindowTitle(tr("Chamfer Edges")); +} + +/* + * Destroys the object and frees any allocated resources + */ +DlgChamferEdges::~DlgChamferEdges() +{ +} + +const char* DlgChamferEdges::getFilletType() const +{ + return "Chamfer"; +} + +TaskChamferEdges::TaskChamferEdges(Part::Chamfer* chamfer) +{ + widget = new DlgChamferEdges(chamfer); + taskbox = new Gui::TaskView::TaskBox( + Gui::BitmapFactory().pixmap("Part_Chamfer"), + widget->windowTitle(), true, 0); + taskbox->groupLayout()->addWidget(widget); + Content.push_back(taskbox); +} + +TaskChamferEdges::~TaskChamferEdges() +{ + // automatically deleted in the sub-class +} + +void TaskChamferEdges::open() +{ +} + +void TaskChamferEdges::clicked(int) +{ +} + +bool TaskChamferEdges::accept() +{ + bool ok = widget->accept(); + if (ok) + Gui::Command::doCommand(Gui::Command::Gui,"Gui.activeDocument().resetEdit()"); + return ok; +} + +bool TaskChamferEdges::reject() +{ + Gui::Command::doCommand(Gui::Command::Gui,"Gui.activeDocument().resetEdit()"); + return true; +} + #include "moc_DlgFilletEdges.cpp" diff --git a/src/Mod/Part/Gui/DlgFilletEdges.h b/src/Mod/Part/Gui/DlgFilletEdges.h index 5f8c46ea74..4c36cd9c66 100644 --- a/src/Mod/Part/Gui/DlgFilletEdges.h +++ b/src/Mod/Part/Gui/DlgFilletEdges.h @@ -29,7 +29,11 @@ #include #include -namespace Part { class Fillet; } +namespace Part { + class FilletBase; + class Fillet; + class Chamfer; +} namespace PartGui { @@ -72,7 +76,7 @@ class DlgFilletEdges : public QWidget, public Gui::SelectionObserver Q_OBJECT public: - DlgFilletEdges(Part::Fillet*, QWidget* parent = 0, Qt::WFlags fl = 0); + DlgFilletEdges(Part::FilletBase*, QWidget* parent = 0, Qt::WFlags fl = 0); ~DlgFilletEdges(); bool accept(); @@ -80,6 +84,7 @@ protected: void findShapes(); void setupFillet(const std::vector&); void changeEvent(QEvent *e); + virtual const char* getFilletType() const; private: void onSelectionChanged(const Gui::SelectionChanges& msg); @@ -105,7 +110,7 @@ class FilletEdgesDialog : public QDialog Q_OBJECT public: - FilletEdgesDialog(Part::Fillet* fillet, QWidget* parent = 0, Qt::WFlags fl = 0); + FilletEdgesDialog(Part::FilletBase* fillet, QWidget* parent = 0, Qt::WFlags fl = 0); ~FilletEdgesDialog(); void accept(); @@ -113,6 +118,18 @@ private: DlgFilletEdges* widget; }; +class DlgChamferEdges : public DlgFilletEdges +{ + Q_OBJECT + +public: + DlgChamferEdges(Part::FilletBase*, QWidget* parent = 0, Qt::WFlags fl = 0); + ~DlgChamferEdges(); + +protected: + virtual const char* getFilletType() const; +}; + class TaskFilletEdges : public Gui::TaskView::TaskDialog { Q_OBJECT @@ -135,6 +152,28 @@ private: Gui::TaskView::TaskBox* taskbox; }; +class TaskChamferEdges : public Gui::TaskView::TaskDialog +{ + Q_OBJECT + +public: + TaskChamferEdges(Part::Chamfer*); + ~TaskChamferEdges(); + +public: + virtual void open(); + virtual void clicked(int); + virtual bool accept(); + virtual bool reject(); + + virtual QDialogButtonBox::StandardButtons getStandardButtons() const + { return QDialogButtonBox::Ok|QDialogButtonBox::Cancel; } + +private: + DlgChamferEdges* widget; + Gui::TaskView::TaskBox* taskbox; +}; + } // namespace PartGui #endif // PARTGUI_DLGFILLETEDGES_H diff --git a/src/Mod/Part/Gui/ViewProviderMirror.cpp b/src/Mod/Part/Gui/ViewProviderMirror.cpp index 4741bc692a..2c9c2023d0 100644 --- a/src/Mod/Part/Gui/ViewProviderMirror.cpp +++ b/src/Mod/Part/Gui/ViewProviderMirror.cpp @@ -38,6 +38,7 @@ #include #include +#include #include #include #include @@ -253,3 +254,43 @@ ViewProviderChamfer::ViewProviderChamfer() ViewProviderChamfer::~ViewProviderChamfer() { } + +void ViewProviderChamfer::setupContextMenu(QMenu* menu, QObject* receiver, const char* member) +{ + QAction* act; + act = menu->addAction(QObject::tr("Edit chamfer edges"), receiver, member); + act->setData(QVariant((int)ViewProvider::Default)); + PartGui::ViewProviderPart::setupContextMenu(menu, receiver, member); +} + +bool ViewProviderChamfer::setEdit(int ModNum) +{ + if (ModNum == ViewProvider::Default ) { + if (Gui::Control().activeDialog()) + return false; + Part::Chamfer* chamfer = static_cast(getObject()); + Gui::Control().showDialog(new PartGui::TaskChamferEdges(chamfer)); + return true; + } + else { + ViewProviderPart::setEdit(ModNum); + return true; + } +} + +void ViewProviderChamfer::unsetEdit(int ModNum) +{ + if (ModNum == ViewProvider::Default) { + Gui::Control().closeDialog(); + } + else { + ViewProviderPart::unsetEdit(ModNum); + } +} + +std::vector ViewProviderChamfer::claimChildren() const +{ + std::vector temp; + temp.push_back(static_cast(getObject())->Base.getValue()); + return temp; +} diff --git a/src/Mod/Part/Gui/ViewProviderMirror.h b/src/Mod/Part/Gui/ViewProviderMirror.h index fd609329d0..d0438e1b9c 100644 --- a/src/Mod/Part/Gui/ViewProviderMirror.h +++ b/src/Mod/Part/Gui/ViewProviderMirror.h @@ -80,6 +80,15 @@ public: ViewProviderChamfer(); /// destructor virtual ~ViewProviderChamfer(); + /** @name Edit methods */ + //@{ + void setupContextMenu(QMenu*, QObject*, const char*); + std::vector claimChildren() const; + +protected: + bool setEdit(int ModNum); + void unsetEdit(int ModNum); + //@} }; } // namespace PartGui diff --git a/src/Mod/Part/Gui/Workbench.cpp b/src/Mod/Part/Gui/Workbench.cpp index eb6e737b87..bceedc0936 100644 --- a/src/Mod/Part/Gui/Workbench.cpp +++ b/src/Mod/Part/Gui/Workbench.cpp @@ -66,7 +66,7 @@ Gui::MenuItem* Workbench::setupMenuBar() const << "Part_MakeSolid" << "Part_ReverseShape" << "Part_SimpleCopy" << "Part_RefineShape" << "Separator" << "Part_Boolean" << "Part_CrossSections" << "Part_Extrude" - << "Part_Revolve" << "Part_Mirror" << "Part_Fillet" + << "Part_Revolve" << "Part_Mirror" << "Part_Fillet" << "Part_Chamfer" << "Part_RuledSurface" << "Part_Loft" << "Part_Builder"; @@ -94,7 +94,7 @@ Gui::ToolBarItem* Workbench::setupToolBars() const Gui::ToolBarItem* tool = new Gui::ToolBarItem(root); tool->setCommand("Part tools"); - *tool << "Part_Extrude" << "Part_Revolve" << "Part_Mirror" << "Part_Fillet" << "Part_RuledSurface"; + *tool << "Part_Extrude" << "Part_Revolve" << "Part_Mirror" << "Part_Fillet" << "Part_Chamfer" << "Part_RuledSurface"; Gui::ToolBarItem* boolop = new Gui::ToolBarItem(root); boolop->setCommand("Boolean");