From 4142fb90f1c06f2dce55047cfc2dee099c755c05 Mon Sep 17 00:00:00 2001 From: wmayer Date: Wed, 29 Jan 2020 16:43:35 +0100 Subject: [PATCH] Part: make reverse function parametric --- src/Mod/Part/App/AppPart.cpp | 7 ++++--- src/Mod/Part/App/PartFeatures.cpp | 26 +++++++++++++++++++++++++ src/Mod/Part/App/PartFeatures.h | 19 ++++++++++++++++++ src/Mod/Part/Gui/AppPartGui.cpp | 1 + src/Mod/Part/Gui/Command.cpp | 13 +++++++------ src/Mod/Part/Gui/ViewProviderMirror.cpp | 14 +++++++++++++ src/Mod/Part/Gui/ViewProviderMirror.h | 11 +++++++++++ 7 files changed, 82 insertions(+), 9 deletions(-) diff --git a/src/Mod/Part/App/AppPart.cpp b/src/Mod/Part/App/AppPart.cpp index 9a107dd194..3073d5e39b 100644 --- a/src/Mod/Part/App/AppPart.cpp +++ b/src/Mod/Part/App/AppPart.cpp @@ -487,12 +487,13 @@ PyMOD_INIT_FUNC(Part) Part::Offset2D ::init(); Part::Thickness ::init(); Part::Refine ::init(); + Part::Reverse ::init(); // Geometry types - Part::GeometryExtension ::init(); - Part::GeometryIntExtension ::init(); + Part::GeometryExtension ::init(); + Part::GeometryIntExtension ::init(); Part::GeometryStringExtension ::init(); - Part::GeometryBoolExtension ::init(); + Part::GeometryBoolExtension ::init(); Part::GeometryDoubleExtension ::init(); Part::Geometry ::init(); Part::GeomPoint ::init(); diff --git a/src/Mod/Part/App/PartFeatures.cpp b/src/Mod/Part/App/PartFeatures.cpp index 0d20733c48..3e83d22efd 100644 --- a/src/Mod/Part/App/PartFeatures.cpp +++ b/src/Mod/Part/App/PartFeatures.cpp @@ -694,3 +694,29 @@ App::DocumentObjectExecReturn *Refine::execute(void) return new App::DocumentObjectExecReturn(e.GetMessageString()); } } + +// ---------------------------------------------------------------------------- + +PROPERTY_SOURCE(Part::Reverse, Part::Feature) + +Reverse::Reverse() +{ + ADD_PROPERTY_TYPE(Source, (0), "Reverse", App::Prop_None, "Source shape"); +} + +App::DocumentObjectExecReturn* Reverse::execute(void) +{ + Part::Feature* source = Source.getValue(); + if (!source) + return new App::DocumentObjectExecReturn("No part object linked."); + + try { + TopoDS_Shape myShape = source->Shape.getValue(); + if (!myShape.IsNull()) + this->Shape.setValue(myShape.Reversed()); + return App::DocumentObject::StdReturn; + } + catch (Standard_Failure & e) { + return new App::DocumentObjectExecReturn(e.GetMessageString()); + } +} diff --git a/src/Mod/Part/App/PartFeatures.h b/src/Mod/Part/App/PartFeatures.h index 18a2db9ac8..898dce1945 100644 --- a/src/Mod/Part/App/PartFeatures.h +++ b/src/Mod/Part/App/PartFeatures.h @@ -173,6 +173,25 @@ public: //@} }; +class Reverse : public Part::Feature +{ + PROPERTY_HEADER(Part::Reverse); + +public: + Reverse(); + + App::PropertyLink Source; + + /** @name methods override feature */ + //@{ + /// recalculate the feature + App::DocumentObjectExecReturn* execute(void); + const char* getViewProviderName(void) const { + return "PartGui::ViewProviderReverse"; + } + //@} +}; + } //namespace Part diff --git a/src/Mod/Part/Gui/AppPartGui.cpp b/src/Mod/Part/Gui/AppPartGui.cpp index d5ee08c437..5237f53d0c 100644 --- a/src/Mod/Part/Gui/AppPartGui.cpp +++ b/src/Mod/Part/Gui/AppPartGui.cpp @@ -172,6 +172,7 @@ PyMOD_INIT_FUNC(PartGui) PartGui::ViewProviderOffset2D ::init(); PartGui::ViewProviderThickness ::init(); PartGui::ViewProviderRefine ::init(); + PartGui::ViewProviderReverse ::init(); PartGui::ViewProviderCustom ::init(); PartGui::ViewProviderCustomPython ::init(); PartGui::ViewProviderBoolean ::init(); diff --git a/src/Mod/Part/Gui/Command.cpp b/src/Mod/Part/Gui/Command.cpp index 445aa989c9..81417403b5 100644 --- a/src/Mod/Part/Gui/Command.cpp +++ b/src/Mod/Part/Gui/Command.cpp @@ -1235,17 +1235,15 @@ void CmdPartReverseShape::activated(int iMsg) Q_UNUSED(iMsg); std::vector objs = Gui::Selection().getObjectsOfType (Part::Feature::getClassTypeId()); - runCommand(Doc, "import Part"); + openCommand("Reverse"); for (std::vector::iterator it = objs.begin(); it != objs.end(); ++it) { const TopoDS_Shape& shape = Part::Feature::getShape(*it); if (!shape.IsNull()) { QString str = QString::fromLatin1( - "__s__=App.ActiveDocument.%1.Shape.copy()\n" - "__s__.reverse()\n" - "__o__=App.ActiveDocument.addObject(\"Part::Feature\",\"%1_rev\")\n" + "__o__=App.ActiveDocument.addObject(\"Part::Reverse\",\"%1_rev\")\n" + "__o__.Source=App.ActiveDocument.%1\n" "__o__.Label=\"%2 (Rev)\"\n" - "__o__.Shape=__s__\n" - "del __s__, __o__" + "del __o__" ) .arg(QLatin1String((*it)->getNameInDocument())) .arg(QLatin1String((*it)->Label.getValue())); @@ -1260,6 +1258,9 @@ void CmdPartReverseShape::activated(int iMsg) } } } + + commitCommand(); + updateActive(); } bool CmdPartReverseShape::isActive(void) diff --git a/src/Mod/Part/Gui/ViewProviderMirror.cpp b/src/Mod/Part/Gui/ViewProviderMirror.cpp index 35319da3a6..68eb9c30f6 100644 --- a/src/Mod/Part/Gui/ViewProviderMirror.cpp +++ b/src/Mod/Part/Gui/ViewProviderMirror.cpp @@ -686,3 +686,17 @@ ViewProviderRefine::ViewProviderRefine() ViewProviderRefine::~ViewProviderRefine() { } + +// --------------------------------------- + +PROPERTY_SOURCE(PartGui::ViewProviderReverse, PartGui::ViewProviderPart) + +ViewProviderReverse::ViewProviderReverse() +{ + //TODO: Need a specific icon here! + //sPixmap = "Part_Reverse_Shape"; +} + +ViewProviderReverse::~ViewProviderReverse() +{ +} diff --git a/src/Mod/Part/Gui/ViewProviderMirror.h b/src/Mod/Part/Gui/ViewProviderMirror.h index 839ee4ba6d..1753a66291 100644 --- a/src/Mod/Part/Gui/ViewProviderMirror.h +++ b/src/Mod/Part/Gui/ViewProviderMirror.h @@ -204,6 +204,17 @@ public: virtual ~ViewProviderRefine(); }; +class ViewProviderReverse : public ViewProviderPart +{ + PROPERTY_HEADER(PartGui::ViewProviderReverse); + +public: + /// constructor + ViewProviderReverse(); + /// destructor + virtual ~ViewProviderReverse(); +}; + } // namespace PartGui