From c5b3ee7a72db9d8542618ba479e68cb1abc90f5b Mon Sep 17 00:00:00 2001 From: wmayer Date: Sat, 30 Oct 2021 17:57:52 +0200 Subject: [PATCH] Part: in ViewProviderSpline use the ViewProviderSplineExtension to avoid code duplication --- src/Mod/Part/Gui/ViewProviderSpline.cpp | 240 +----------------------- src/Mod/Part/Gui/ViewProviderSpline.h | 47 ++--- 2 files changed, 19 insertions(+), 268 deletions(-) diff --git a/src/Mod/Part/Gui/ViewProviderSpline.cpp b/src/Mod/Part/Gui/ViewProviderSpline.cpp index e9d1ce23c4..fa6d67a912 100644 --- a/src/Mod/Part/Gui/ViewProviderSpline.cpp +++ b/src/Mod/Part/Gui/ViewProviderSpline.cpp @@ -63,10 +63,9 @@ namespace bp = boost::placeholders; PROPERTY_SOURCE(PartGui::ViewProviderSpline, PartGui::ViewProviderPartExt) ViewProviderSpline::ViewProviderSpline() - : pcControlPoints(0) { sPixmap = "Part_Spline_Parametric"; - ADD_PROPERTY(ControlPoints,(false)); + extension.initExtension(this); } ViewProviderSpline::~ViewProviderSpline() @@ -78,243 +77,6 @@ QIcon ViewProviderSpline::getIcon(void) const return Gui::BitmapFactory().pixmap(sPixmap); } -void ViewProviderSpline::setupContextMenu(QMenu* menu, QObject* receiver, const char* member) -{ - ViewProviderPartExt::setupContextMenu(menu, receiver, member); - - // toggle command to display components - Gui::ActionFunction* func = new Gui::ActionFunction(menu); - QAction* act = menu->addAction(QObject::tr("Show control points")); - act->setCheckable(true); - act->setChecked(ControlPoints.getValue()); - func->toggle(act, boost::bind(&ViewProviderSpline::toggleControlPoints, this, bp::_1)); -} - -void ViewProviderSpline::toggleControlPoints(bool on) -{ - ControlPoints.setValue(on); -} - -void ViewProviderSpline::updateData(const App::Property* prop) -{ - ViewProviderPartExt::updateData(prop); - if (prop->getTypeId() == Part::PropertyPartShape::getClassTypeId() && strcmp(prop->getName(), "Shape") == 0) { - // update control points if there - if (pcControlPoints) { - Gui::coinRemoveAllChildren(pcControlPoints); - showControlPoints(this->ControlPoints.getValue(), prop); - } - } -} - -void ViewProviderSpline::onChanged(const App::Property* prop) -{ - if (prop == &ControlPoints) { - App::DocumentObject* obj = this->pcObject; - App::Property* shape = obj->getPropertyByName("Shape"); - showControlPoints(ControlPoints.getValue(), shape); - } - else { - ViewProviderPartExt::onChanged(prop); - } -} - -void ViewProviderSpline::showControlPoints(bool show, const App::Property* prop) -{ - if (!pcControlPoints && show) { - pcControlPoints = new SoSwitch(); - pcRoot->addChild(pcControlPoints); - } - - if (pcControlPoints) { - pcControlPoints->whichChild = (show ? SO_SWITCH_ALL : SO_SWITCH_NONE); - } - - if (!show || !pcControlPoints || pcControlPoints->getNumChildren() > 0) - return; - - // ask for the property we are interested in - if (prop && prop->getTypeId() == Part::PropertyPartShape::getClassTypeId()) { - const TopoDS_Shape& shape = static_cast(prop)->getValue(); - if (shape.IsNull()) - return; // empty shape - - for (TopExp_Explorer xp(shape, TopAbs_SHELL); xp.More(); xp.Next()) { - const TopoDS_Shell& shell = TopoDS::Shell(xp.Current()); - for (TopExp_Explorer xp2(shell, TopAbs_FACE); xp2.More(); xp2.Next()) { - const TopoDS_Face& face = TopoDS::Face(xp2.Current()); - showControlPointsOfFace(face); - } - } - for (TopExp_Explorer xp(shape, TopAbs_FACE, TopAbs_SHELL); xp.More(); xp.Next()) { - const TopoDS_Face& face = TopoDS::Face(xp.Current()); - showControlPointsOfFace(face); - } - for (TopExp_Explorer xp(shape, TopAbs_WIRE, TopAbs_FACE); xp.More(); xp.Next()) { - const TopoDS_Wire& wire = TopoDS::Wire(xp.Current()); - for (TopExp_Explorer xp2(wire, TopAbs_EDGE); xp2.More(); xp2.Next()) { - const TopoDS_Edge& edge = TopoDS::Edge(xp2.Current()); - showControlPointsOfEdge(edge); - } - } - for (TopExp_Explorer xp(shape, TopAbs_EDGE, TopAbs_WIRE); xp.More(); xp.Next()) { - const TopoDS_Edge& edge = TopoDS::Edge(xp.Current()); - showControlPointsOfEdge(edge); - } - } -} - -void ViewProviderSpline::showControlPointsOfEdge(const TopoDS_Edge& edge) -{ - std::list poles, knots; - Standard_Integer nCt=0; - - TopoDS_Edge edge_loc(edge); - TopLoc_Location aLoc; - edge_loc.Location(aLoc); - - BRepAdaptor_Curve curve(edge_loc); - switch (curve.GetType()) - { - case GeomAbs_BezierCurve: - { - Handle(Geom_BezierCurve) hBezier = curve.Bezier(); - nCt = hBezier->NbPoles(); - for (Standard_Integer i = 1; i <= nCt; i++) - poles.push_back(hBezier->Pole(i)); - if (hBezier->IsClosed()) { - nCt++; - poles.push_back(hBezier->Pole(1)); - } - } break; - case GeomAbs_BSplineCurve: - { - Handle(Geom_BSplineCurve) hBSpline = curve.BSpline(); - nCt = hBSpline->NbPoles(); - for (Standard_Integer i = 1; i <= nCt; i++) - poles.push_back(hBSpline->Pole(i)); - if (hBSpline->IsClosed()) { - nCt++; - poles.push_back(hBSpline->Pole(1)); - } - for (Standard_Integer i = hBSpline->FirstUKnotIndex()+1; i <= hBSpline->LastUKnotIndex()-1; i++) - knots.push_back(hBSpline->Value(hBSpline->Knot(i))); - } break; - default: - break; - } - - if (poles.empty()) - return; // nothing to do - - SoCoordinate3 * controlcoords = new SoCoordinate3; - controlcoords->point.setNum(nCt + knots.size()); - - int index=0; - SbVec3f* verts = controlcoords->point.startEditing(); - for (std::list::iterator p = poles.begin(); p != poles.end(); ++p) { - verts[index++].setValue((float)p->X(), (float)p->Y(), (float)p->Z()); - } - for (std::list::iterator k = knots.begin(); k != knots.end(); ++k) { - verts[index++].setValue((float)k->X(), (float)k->Y(), (float)k->Z()); - } - controlcoords->point.finishEditing(); - - - SoFCControlPoints* controlpoints = new SoFCControlPoints(); - controlpoints->numPolesU = nCt; - controlpoints->numPolesV = 1; - - SoSeparator* nodes = new SoSeparator(); - nodes->addChild(controlcoords); - nodes->addChild(controlpoints); - - pcControlPoints->addChild(nodes); -} - -void ViewProviderSpline::showControlPointsOfFace(const TopoDS_Face& face) -{ - std::list knots; - std::vector > poles; - Standard_Integer nCtU=0, nCtV=0; - - TopoDS_Face face_loc(face); - TopLoc_Location aLoc; - face_loc.Location(aLoc); - - BRepAdaptor_Surface surface(face_loc); - switch (surface.GetType()) - { - case GeomAbs_BezierSurface: - { - Handle(Geom_BezierSurface) hBezier = surface.Bezier(); - nCtU = hBezier->NbUPoles(); - nCtV = hBezier->NbVPoles(); - poles.resize(nCtU); - for (Standard_Integer u = 1; u <= nCtU; u++) { - poles[u-1].resize(nCtV); - for (Standard_Integer v = 1; v <= nCtV; v++) - poles[u-1][v-1] = hBezier->Pole(u, v); - } - } break; - case GeomAbs_BSplineSurface: - { - Handle(Geom_BSplineSurface) hBSpline = surface.BSpline(); - nCtU = hBSpline->NbUPoles(); - nCtV = hBSpline->NbVPoles(); - poles.resize(nCtU); - for (Standard_Integer u = 1; u <= nCtU; u++) { - poles[u-1].resize(nCtV); - for (Standard_Integer v = 1; v <= nCtV; v++) - poles[u-1][v-1] = hBSpline->Pole(u, v); - } - - //Standard_Integer nKnU = hBSpline->NbUKnots(); - //Standard_Integer nKnV = hBSpline->NbVKnots(); - for (Standard_Integer u = 1; u <= hBSpline->NbUKnots(); u++) { - for (Standard_Integer v = 1; v <= hBSpline->NbVKnots(); v++) - knots.push_back(hBSpline->Value(hBSpline->UKnot(u), hBSpline->VKnot(v))); - } - } break; - default: - break; - } - - if (poles.empty()) - return; // nothing to do - - SoCoordinate3 * coords = new SoCoordinate3; - coords->point.setNum(nCtU * nCtV + knots.size()); - - int index=0; - SbVec3f* verts = coords->point.startEditing(); - for (std::vector >::iterator u = poles.begin(); u != poles.end(); ++u) { - for (std::vector::iterator v = u->begin(); v != u->end(); ++v) { - verts[index++].setValue((float)v->X(), (float)v->Y(), (float)v->Z()); - } - } - for (std::list::iterator k = knots.begin(); k != knots.end(); ++k) { - verts[index++].setValue((float)k->X(), (float)k->Y(), (float)k->Z()); - } - coords->point.finishEditing(); - - - SoFCControlPoints* control = new SoFCControlPoints(); - control->numPolesU = nCtU; - control->numPolesV = nCtV; - - //if (knots.size() > 0) { - // control->numKnotsU = nKnU; - // control->numKnotsV = nKnV; - //} - - SoSeparator* nodes = new SoSeparator(); - nodes->addChild(coords); - nodes->addChild(control); - - pcControlPoints->addChild(nodes); -} - // ---------------------------------------------------------------------------- EXTENSION_PROPERTY_SOURCE(PartGui::ViewProviderSplineExtension, Gui::ViewProviderExtension) diff --git a/src/Mod/Part/Gui/ViewProviderSpline.h b/src/Mod/Part/Gui/ViewProviderSpline.h index 6861a2cdfe..2786e9fe01 100644 --- a/src/Mod/Part/Gui/ViewProviderSpline.h +++ b/src/Mod/Part/Gui/ViewProviderSpline.h @@ -23,46 +23,19 @@ #ifndef PARTGUI_VIEWPROVIDERPARTSPLINE_H #define PARTGUI_VIEWPROVIDERPARTSPLINE_H -#include "ViewProviderExt.h" +#include #include namespace PartGui { -class PartGuiExport ViewProviderSpline : public ViewProviderPartExt -{ - PROPERTY_HEADER(PartGui::ViewProviderSpline); - -public: - /// constructor - ViewProviderSpline(); - /// destructor - virtual ~ViewProviderSpline(); - - // Display properties - App::PropertyBool ControlPoints; - - QIcon getIcon(void) const; - void updateData(const App::Property* prop); - void setupContextMenu(QMenu* menu, QObject* receiver, const char* member); - -protected: - void onChanged(const App::Property* prop); - void toggleControlPoints(bool); - void showControlPoints(bool, const App::Property* prop); - void showControlPointsOfEdge(const TopoDS_Edge&); - void showControlPointsOfFace(const TopoDS_Face&); - - SoSwitch *pcControlPoints; -}; - class PartGuiExport ViewProviderSplineExtension : public Gui::ViewProviderExtension { EXTENSION_PROPERTY_HEADER_WITH_OVERRIDE(PartGui::ViewProviderSplineExtension); public: /// Constructor - ViewProviderSplineExtension(void); + ViewProviderSplineExtension(); virtual ~ViewProviderSplineExtension() = default; App::PropertyBool ControlPoints; @@ -80,6 +53,22 @@ protected: SoSwitch *pcControlPoints; }; +class PartGuiExport ViewProviderSpline : public ViewProviderPartExt +{ + PROPERTY_HEADER(PartGui::ViewProviderSpline); + +public: + /// constructor + ViewProviderSpline(); + /// destructor + virtual ~ViewProviderSpline(); + + QIcon getIcon() const; + +private: + ViewProviderSplineExtension extension; +}; + typedef Gui::ViewProviderExtensionPythonT ViewProviderSplineExtensionPython; } //namespace PartGui