Part: in ViewProviderSpline use the ViewProviderSplineExtension to avoid code duplication
This commit is contained in:
@@ -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<const Part::PropertyPartShape*>(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<gp_Pnt> 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<gp_Pnt>::iterator p = poles.begin(); p != poles.end(); ++p) {
|
||||
verts[index++].setValue((float)p->X(), (float)p->Y(), (float)p->Z());
|
||||
}
|
||||
for (std::list<gp_Pnt>::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<gp_Pnt> knots;
|
||||
std::vector<std::vector<gp_Pnt> > 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<std::vector<gp_Pnt> >::iterator u = poles.begin(); u != poles.end(); ++u) {
|
||||
for (std::vector<gp_Pnt>::iterator v = u->begin(); v != u->end(); ++v) {
|
||||
verts[index++].setValue((float)v->X(), (float)v->Y(), (float)v->Z());
|
||||
}
|
||||
}
|
||||
for (std::list<gp_Pnt>::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)
|
||||
|
||||
@@ -23,46 +23,19 @@
|
||||
#ifndef PARTGUI_VIEWPROVIDERPARTSPLINE_H
|
||||
#define PARTGUI_VIEWPROVIDERPARTSPLINE_H
|
||||
|
||||
#include "ViewProviderExt.h"
|
||||
#include <Mod/Part/Gui/ViewProviderExt.h>
|
||||
#include <Gui/ViewProviderExtension.h>
|
||||
|
||||
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<PartGui::ViewProviderSplineExtension> ViewProviderSplineExtensionPython;
|
||||
|
||||
} //namespace PartGui
|
||||
|
||||
Reference in New Issue
Block a user