From 2b0757c3a6665cdc07bafd5434f66f75e2da01aa Mon Sep 17 00:00:00 2001 From: wmayer Date: Sun, 7 Jul 2013 16:13:38 +0200 Subject: [PATCH] 0000735: Feature request for better Fillet/Chamfer --- src/Mod/Part/App/FeatureChamfer.cpp | 4 ++ src/Mod/Part/App/FeatureFillet.cpp | 4 ++ src/Mod/Part/Gui/DlgFilletEdges.cpp | 1 - src/Mod/Part/Gui/ViewProvider.cpp | 14 ++++ src/Mod/Part/Gui/ViewProvider.h | 7 ++ src/Mod/Part/Gui/ViewProviderBoolean.cpp | 14 ---- src/Mod/Part/Gui/ViewProviderMirror.cpp | 82 ++++++++++++++++++++++++ src/Mod/Part/Gui/ViewProviderMirror.h | 2 + 8 files changed, 113 insertions(+), 15 deletions(-) diff --git a/src/Mod/Part/App/FeatureChamfer.cpp b/src/Mod/Part/App/FeatureChamfer.cpp index 3c694f012..e857000b0 100644 --- a/src/Mod/Part/App/FeatureChamfer.cpp +++ b/src/Mod/Part/App/FeatureChamfer.cpp @@ -75,7 +75,11 @@ App::DocumentObjectExecReturn *Chamfer::execute(void) TopoDS_Shape shape = mkChamfer.Shape(); if (shape.IsNull()) return new App::DocumentObjectExecReturn("Resulting shape is null"); + ShapeHistory history = buildHistory(mkChamfer, TopAbs_FACE, shape, base->Shape.getValue()); this->Shape.setValue(shape); + PropertyShapeHistory prop; + prop.setContainer(this); + prop.setValue(history); return App::DocumentObject::StdReturn; } catch (Standard_Failure) { diff --git a/src/Mod/Part/App/FeatureFillet.cpp b/src/Mod/Part/App/FeatureFillet.cpp index 032bcde7d..550fcaf3e 100644 --- a/src/Mod/Part/App/FeatureFillet.cpp +++ b/src/Mod/Part/App/FeatureFillet.cpp @@ -74,7 +74,11 @@ App::DocumentObjectExecReturn *Fillet::execute(void) TopoDS_Shape shape = mkFillet.Shape(); if (shape.IsNull()) return new App::DocumentObjectExecReturn("Resulting shape is null"); + ShapeHistory history = buildHistory(mkFillet, TopAbs_FACE, shape, base->Shape.getValue()); this->Shape.setValue(shape); + PropertyShapeHistory prop; + prop.setContainer(this); + prop.setValue(history); return App::DocumentObject::StdReturn; } catch (Standard_Failure) { diff --git a/src/Mod/Part/Gui/DlgFilletEdges.cpp b/src/Mod/Part/Gui/DlgFilletEdges.cpp index 46066a5f2..f241f656b 100644 --- a/src/Mod/Part/Gui/DlgFilletEdges.cpp +++ b/src/Mod/Part/Gui/DlgFilletEdges.cpp @@ -703,7 +703,6 @@ bool DlgFilletEdges::accept() QByteArray to = name.toAscii(); QByteArray from = shape.toAscii(); - Gui::Command::copyVisual(to, "ShapeColor", from); Gui::Command::copyVisual(to, "LineColor", from); Gui::Command::copyVisual(to, "PointColor", from); return true; diff --git a/src/Mod/Part/Gui/ViewProvider.cpp b/src/Mod/Part/Gui/ViewProvider.cpp index 9bf99796a..ec2ffe269 100644 --- a/src/Mod/Part/Gui/ViewProvider.cpp +++ b/src/Mod/Part/Gui/ViewProvider.cpp @@ -120,6 +120,20 @@ bool ViewProviderPart::doubleClicked(void) return true; } +void ViewProviderPart::applyColor(const Part::ShapeHistory& hist, + const std::vector& colBase, + std::vector& colBool) +{ + std::map >::const_iterator jt; + // apply color from modified faces + for (jt = hist.shapeMap.begin(); jt != hist.shapeMap.end(); ++jt) { + std::vector::const_iterator kt; + for (kt = jt->second.begin(); kt != jt->second.end(); ++kt) { + colBool[*kt] = colBase[jt->first]; + } + } +} + #else PROPERTY_SOURCE(PartGui::ViewProviderPart, PartGui::ViewProviderPartBase) diff --git a/src/Mod/Part/Gui/ViewProvider.h b/src/Mod/Part/Gui/ViewProvider.h index 50b4b8642..4d9058fd3 100644 --- a/src/Mod/Part/Gui/ViewProvider.h +++ b/src/Mod/Part/Gui/ViewProvider.h @@ -50,6 +50,8 @@ class SoScale; // Set this to use the fast rendering of shapes #define FC_USE_FAST_SHAPE_RENDERING +namespace Part { struct ShapeHistory; } + namespace PartGui { class ViewProviderShapeBuilder : public Gui::ViewProviderBuilder @@ -157,6 +159,11 @@ public: /// destructor virtual ~ViewProviderPart(); virtual bool doubleClicked(void); + +protected: + void applyColor(const Part::ShapeHistory& hist, + const std::vector& colBase, + std::vector& colBool); }; #else class PartGuiExport ViewProviderPart : public ViewProviderPartBase diff --git a/src/Mod/Part/Gui/ViewProviderBoolean.cpp b/src/Mod/Part/Gui/ViewProviderBoolean.cpp index 74aadfad5..cd7c99088 100644 --- a/src/Mod/Part/Gui/ViewProviderBoolean.cpp +++ b/src/Mod/Part/Gui/ViewProviderBoolean.cpp @@ -77,20 +77,6 @@ QIcon ViewProviderBoolean::getIcon(void) const return ViewProviderPart::getIcon(); } -void applyColor(const Part::ShapeHistory& hist, - const std::vector& colBase, - std::vector& colBool) -{ - std::map >::const_iterator jt; - // apply color from modified faces - for (jt = hist.shapeMap.begin(); jt != hist.shapeMap.end(); ++jt) { - std::vector::const_iterator kt; - for (kt = jt->second.begin(); kt != jt->second.end(); ++kt) { - colBool[*kt] = colBase[jt->first]; - } - } -} - void ViewProviderBoolean::updateData(const App::Property* prop) { PartGui::ViewProviderPart::updateData(prop); diff --git a/src/Mod/Part/Gui/ViewProviderMirror.cpp b/src/Mod/Part/Gui/ViewProviderMirror.cpp index d7c8ea5d5..9be1540ab 100644 --- a/src/Mod/Part/Gui/ViewProviderMirror.cpp +++ b/src/Mod/Part/Gui/ViewProviderMirror.cpp @@ -28,6 +28,10 @@ # include # include # include +# include +# include +# include +# include # include # include # include @@ -225,6 +229,45 @@ ViewProviderFillet::~ViewProviderFillet() { } +void ViewProviderFillet::updateData(const App::Property* prop) +{ + PartGui::ViewProviderPart::updateData(prop); + if (prop->getTypeId() == Part::PropertyShapeHistory::getClassTypeId()) { + const std::vector& hist = static_cast + (prop)->getValues(); + if (hist.size() != 1) + return; + Part::Fillet* objFill = dynamic_cast(getObject()); + Part::Feature* objBase = dynamic_cast(objFill->Base.getValue()); + if (objBase) { + const TopoDS_Shape& baseShape = objBase->Shape.getValue(); + const TopoDS_Shape& fillShape = objFill->Shape.getValue(); + + TopTools_IndexedMapOfShape baseMap, fillMap; + TopExp::MapShapes(baseShape, TopAbs_FACE, baseMap); + TopExp::MapShapes(fillShape, TopAbs_FACE, fillMap); + + Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase); + std::vector colBase = static_cast(vpBase)->DiffuseColor.getValues(); + std::vector colFill; + colFill.resize(fillMap.Extent(), static_cast(vpBase)->ShapeColor.getValue()); + + bool setColor=false; + if (colBase.size() == baseMap.Extent()) { + applyColor(hist[0], colBase, colFill); + setColor = true; + } + else if (!colBase.empty() && colBase[0] != this->ShapeColor.getValue()) { + colBase.resize(baseMap.Extent(), colBase[0]); + applyColor(hist[0], colBase, colFill); + setColor = true; + } + if (setColor) + this->DiffuseColor.setValues(colFill); + } + } +} + void ViewProviderFillet::setupContextMenu(QMenu* menu, QObject* receiver, const char* member) { QAction* act; @@ -289,6 +332,45 @@ ViewProviderChamfer::~ViewProviderChamfer() { } +void ViewProviderChamfer::updateData(const App::Property* prop) +{ + PartGui::ViewProviderPart::updateData(prop); + if (prop->getTypeId() == Part::PropertyShapeHistory::getClassTypeId()) { + const std::vector& hist = static_cast + (prop)->getValues(); + if (hist.size() != 1) + return; + Part::Chamfer* objCham = dynamic_cast(getObject()); + Part::Feature* objBase = dynamic_cast(objCham->Base.getValue()); + if (objBase) { + const TopoDS_Shape& baseShape = objBase->Shape.getValue(); + const TopoDS_Shape& chamShape = objCham->Shape.getValue(); + + TopTools_IndexedMapOfShape baseMap, chamMap; + TopExp::MapShapes(baseShape, TopAbs_FACE, baseMap); + TopExp::MapShapes(chamShape, TopAbs_FACE, chamMap); + + Gui::ViewProvider* vpBase = Gui::Application::Instance->getViewProvider(objBase); + std::vector colBase = static_cast(vpBase)->DiffuseColor.getValues(); + std::vector colCham; + colCham.resize(chamMap.Extent(), static_cast(vpBase)->ShapeColor.getValue()); + + bool setColor=false; + if (colBase.size() == baseMap.Extent()) { + applyColor(hist[0], colBase, colCham); + setColor = true; + } + else if (!colBase.empty() && colBase[0] != this->ShapeColor.getValue()) { + colBase.resize(baseMap.Extent(), colBase[0]); + applyColor(hist[0], colBase, colCham); + setColor = true; + } + if (setColor) + this->DiffuseColor.setValues(colCham); + } + } +} + void ViewProviderChamfer::setupContextMenu(QMenu* menu, QObject* receiver, const char* member) { QAction* act; diff --git a/src/Mod/Part/Gui/ViewProviderMirror.h b/src/Mod/Part/Gui/ViewProviderMirror.h index ab0ec4c2d..802ffcc94 100644 --- a/src/Mod/Part/Gui/ViewProviderMirror.h +++ b/src/Mod/Part/Gui/ViewProviderMirror.h @@ -70,6 +70,7 @@ public: bool onDelete(const std::vector &); protected: + void updateData(const App::Property*); bool setEdit(int ModNum); void unsetEdit(int ModNum); //@} @@ -91,6 +92,7 @@ public: bool onDelete(const std::vector &); protected: + void updateData(const App::Property*); bool setEdit(int ModNum); void unsetEdit(int ModNum); //@}