diff --git a/src/Mod/Part/App/AppPart.cpp b/src/Mod/Part/App/AppPart.cpp index 689903ebc..02a6985b4 100644 --- a/src/Mod/Part/App/AppPart.cpp +++ b/src/Mod/Part/App/AppPart.cpp @@ -38,6 +38,7 @@ #include "FeaturePartCurveNet.h" #include "FeaturePartCircle.h" #include "FeaturePartPolygon.h" +#include "FeaturePartSpline.h" #include "FeatureGeometrySet.h" #include "FeatureChamfer.h" #include "FeatureCompound.h" @@ -164,6 +165,7 @@ void PartExport initPart() Part::CustomFeaturePython ::init(); Part::Primitive ::init(); Part::Box ::init(); + Part::Spline ::init(); Part::Boolean ::init(); Part::Common ::init(); Part::MultiCommon ::init(); diff --git a/src/Mod/Part/App/CMakeLists.txt b/src/Mod/Part/App/CMakeLists.txt index 28e7b43b2..fa8c86e12 100644 --- a/src/Mod/Part/App/CMakeLists.txt +++ b/src/Mod/Part/App/CMakeLists.txt @@ -101,6 +101,8 @@ SET(Features_SRCS FeaturePartPolygon.h FeaturePartSection.cpp FeaturePartSection.h + FeaturePartSpline.cpp + FeaturePartSpline.h FeatureChamfer.cpp FeatureChamfer.h FeatureCompound.cpp diff --git a/src/Mod/Part/App/FeaturePartSpline.cpp b/src/Mod/Part/App/FeaturePartSpline.cpp new file mode 100644 index 000000000..3917e01e9 --- /dev/null +++ b/src/Mod/Part/App/FeaturePartSpline.cpp @@ -0,0 +1,42 @@ +/*************************************************************************** + * Copyright (c) 2013 Werner Mayer * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + +#include "PreCompiled.h" +#ifndef _PreComp_ +#endif + + +#include "FeaturePartSpline.h" + + +using namespace Part; + + +PROPERTY_SOURCE(Part::Spline, Part::Feature) + + +Spline::Spline() +{ +} + + diff --git a/src/Mod/Part/App/FeaturePartSpline.h b/src/Mod/Part/App/FeaturePartSpline.h new file mode 100644 index 000000000..a771d890f --- /dev/null +++ b/src/Mod/Part/App/FeaturePartSpline.h @@ -0,0 +1,49 @@ +/*************************************************************************** + * Copyright (c) 2013 Werner Mayer * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + + +#ifndef PART_FEATUREPARTSPLINE_H +#define PART_FEATUREPARTSPLINE_H + +#include "PartFeature.h" + +namespace Part +{ + +class PartExport Spline :public Part::Feature +{ + PROPERTY_HEADER(Part::Spline); + +public: + Spline(); + /// returns the type name of the ViewProvider + const char* getViewProviderName(void) const { + return "PartGui::ViewProviderSpline"; + } +}; + +} //namespace Part + + +#endif // PART_FEATUREPARTSPLINE_H + diff --git a/src/Mod/Part/Gui/AppPartGui.cpp b/src/Mod/Part/Gui/AppPartGui.cpp index ae84470c9..44396e269 100644 --- a/src/Mod/Part/Gui/AppPartGui.cpp +++ b/src/Mod/Part/Gui/AppPartGui.cpp @@ -50,6 +50,7 @@ #include "ViewProviderTorusParametric.h" #include "ViewProviderRuledSurface.h" #include "ViewProviderPrism.h" +#include "ViewProviderSpline.h" #include "DlgSettingsGeneral.h" #include "DlgSettingsObjectColor.h" @@ -139,6 +140,7 @@ void PartGuiExport initPartGui() PartGui::ViewProviderConeParametric ::init(); PartGui::ViewProviderTorusParametric ::init(); PartGui::ViewProviderRuledSurface ::init(); + PartGui::ViewProviderSpline ::init(); PartGui::Workbench ::init(); diff --git a/src/Mod/Part/Gui/CMakeLists.txt b/src/Mod/Part/Gui/CMakeLists.txt index 87c4c2848..16d24db68 100644 --- a/src/Mod/Part/Gui/CMakeLists.txt +++ b/src/Mod/Part/Gui/CMakeLists.txt @@ -169,6 +169,8 @@ SET(PartGui_SRCS ViewProviderTorusParametric.h ViewProviderCurveNet.cpp ViewProviderCurveNet.h + ViewProviderSpline.cpp + ViewProviderSpline.h ViewProviderImport.cpp ViewProviderImport.h ViewProviderExtrusion.cpp diff --git a/src/Mod/Part/Gui/ViewProviderExt.cpp b/src/Mod/Part/Gui/ViewProviderExt.cpp index 12cff15d5..fa14bdebf 100644 --- a/src/Mod/Part/Gui/ViewProviderExt.cpp +++ b/src/Mod/Part/Gui/ViewProviderExt.cpp @@ -149,7 +149,6 @@ ViewProviderPartExt::ViewProviderPartExt() ADD_PROPERTY(PointSize,(lwidth)); ADD_PROPERTY(Deviation,(0.5f)); Deviation.setConstraints(&tessRange); - ADD_PROPERTY(ControlPoints,(false)); ADD_PROPERTY(Lighting,(1)); Lighting.setEnums(LightingEnums); ADD_PROPERTY(DrawStyle,((long int)0)); diff --git a/src/Mod/Part/Gui/ViewProviderExt.h b/src/Mod/Part/Gui/ViewProviderExt.h index 4e0839e7c..ca104b59b 100644 --- a/src/Mod/Part/Gui/ViewProviderExt.h +++ b/src/Mod/Part/Gui/ViewProviderExt.h @@ -75,7 +75,6 @@ public: App::PropertyColor PointColor; App::PropertyMaterial LineMaterial; App::PropertyMaterial PointMaterial; - App::PropertyBool ControlPoints; App::PropertyEnumeration Lighting; App::PropertyEnumeration DrawStyle; @@ -126,7 +125,6 @@ protected: SoMaterial * pcPointMaterial; SoDrawStyle * pcLineStyle; SoDrawStyle * pcPointStyle; - //SoSwitch * pcControlPoints; SoShapeHints * pShapeHints; SoCoordinate3 * coords; diff --git a/src/Mod/Part/Gui/ViewProviderSpline.cpp b/src/Mod/Part/Gui/ViewProviderSpline.cpp new file mode 100644 index 000000000..59d59cee3 --- /dev/null +++ b/src/Mod/Part/Gui/ViewProviderSpline.cpp @@ -0,0 +1,301 @@ +/*************************************************************************** + * Copyright (c) 2013 Werner Mayer * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + +#include "PreCompiled.h" +#ifndef _PreComp_ +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +# include +#endif + + +#include +#include +#include "SoFCShapeObject.h" +#include "ViewProviderSpline.h" + + +using namespace PartGui; + + +PROPERTY_SOURCE(PartGui::ViewProviderSpline, PartGui::ViewProviderPartExt) + +ViewProviderSpline::ViewProviderSpline() + : pcControlPoints(0) +{ + ADD_PROPERTY(ControlPoints,(false)); +} + +ViewProviderSpline::~ViewProviderSpline() +{ +} + +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 + switch (shape.ShapeType()) + { + case TopAbs_EDGE: + { + const TopoDS_Edge& edge = TopoDS::Edge(shape); + showControlPointsOfEdge(edge); + } break; + case TopAbs_WIRE: + { + const TopoDS_Wire& wire = TopoDS::Wire(shape); + showControlPointsOfWire(wire); + } break; + case TopAbs_FACE: + { + const TopoDS_Face& face = TopoDS::Face(shape); + showControlPointsOfFace(face); + } break; + default: + break; + } + } +} + +void ViewProviderSpline::showControlPointsOfEdge(const TopoDS_Edge& edge) +{ + std::list poles, knots; + Standard_Integer nCt=0; + BRepAdaptor_Curve curve(edge); + 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 * coords = new SoCoordinate3; + coords->point.setNum(nCt + knots.size()); + + int index=0; + SbVec3f* verts = coords->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()); + } + coords->point.finishEditing(); + + + SoFCControlPoints* control = new SoFCControlPoints(); + control->numPolesU = nCt; + control->numPolesV = 1; + + SoSeparator* nodes = new SoSeparator(); + nodes->addChild(coords); + nodes->addChild(control); + + pcControlPoints->addChild(nodes); +} + +void ViewProviderSpline::showControlPointsOfWire(const TopoDS_Wire& wire) +{ + TopoDS_Iterator it; + for (it.Initialize(wire); it.More(); it.Next()) { + if (it.Value().ShapeType() == TopAbs_EDGE) { + const TopoDS_Edge& edge = TopoDS::Edge(it.Value()); + BRepAdaptor_Curve curve(edge); + + std::list poles, knots; + gp_Pnt start, end; + switch (curve.GetType()) + { + case GeomAbs_BezierCurve: + { + Handle(Geom_BezierCurve) hBezier = curve.Bezier(); + for (Standard_Integer i = 1; i <= hBezier->NbPoles(); i++) + poles.push_back(hBezier->Pole(i)); + start = hBezier->StartPoint(); + end = hBezier->EndPoint(); + } break; + case GeomAbs_BSplineCurve: + { + Handle(Geom_BSplineCurve) hBSpline = curve.BSpline(); + for (Standard_Integer i = 1; i <= hBSpline->NbPoles(); i++) + poles.push_back(hBSpline->Pole(i)); + start = hBSpline->StartPoint(); + end = hBSpline->EndPoint(); + for (Standard_Integer i = hBSpline->FirstUKnotIndex()+1; i <= hBSpline->LastUKnotIndex()-1; i++) + knots.push_back(hBSpline->Value(hBSpline->Knot(i))); + } break; + default: + break; + } + } + } +} + +void ViewProviderSpline::showControlPointsOfFace(const TopoDS_Face& face) +{ + std::list knots; + std::vector > poles; + Standard_Integer nCtU=0, nCtV=0; + BRepAdaptor_Surface surface(face); + + BRepAdaptor_Surface clSurface(face); + switch (clSurface.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); +} diff --git a/src/Mod/Part/Gui/ViewProviderSpline.h b/src/Mod/Part/Gui/ViewProviderSpline.h new file mode 100644 index 000000000..09b4f382b --- /dev/null +++ b/src/Mod/Part/Gui/ViewProviderSpline.h @@ -0,0 +1,60 @@ +/*************************************************************************** + * Copyright (c) 2013 Werner Mayer * + * * + * This file is part of the FreeCAD CAx development system. * + * * + * This library is free software; you can redistribute it and/or * + * modify it under the terms of the GNU Library General Public * + * License as published by the Free Software Foundation; either * + * version 2 of the License, or (at your option) any later version. * + * * + * This library is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU Library General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this library; see the file COPYING.LIB. If not, * + * write to the Free Software Foundation, Inc., 59 Temple Place, * + * Suite 330, Boston, MA 02111-1307, USA * + * * + ***************************************************************************/ + + + +#ifndef PARTGUI_VIEWPROVIDERPARTSPLINE_H +#define PARTGUI_VIEWPROVIDERPARTSPLINE_H + +#include "ViewProviderExt.h" + +namespace PartGui +{ + +class PartGuiExport ViewProviderSpline : public ViewProviderPartExt +{ + PROPERTY_HEADER(PartGui::ViewProviderSpline); + +public: + /// constructor + ViewProviderSpline(); + /// destructor + virtual ~ViewProviderSpline(); + + // Display properties + App::PropertyBool ControlPoints; + +protected: + void onChanged(const App::Property* prop); + void showControlPoints(bool, const App::Property* prop); + void showControlPointsOfEdge(const TopoDS_Edge&); + void showControlPointsOfWire(const TopoDS_Wire&); + void showControlPointsOfFace(const TopoDS_Face&); + + SoSwitch *pcControlPoints; +}; + +} //namespace PartGui + + +#endif // PARTGUI_VIEWPROVIDERPARTSPLINE_H +