diff --git a/src/Mod/Part/App/AppPart.cpp b/src/Mod/Part/App/AppPart.cpp index 02a6985b4..0c21b44e0 100644 --- a/src/Mod/Part/App/AppPart.cpp +++ b/src/Mod/Part/App/AppPart.cpp @@ -197,6 +197,7 @@ void PartExport initPart() Part::Cone ::init(); Part::Torus ::init(); Part::Helix ::init(); + Part::Spiral ::init(); Part::Wedge ::init(); Part::Part2DObject ::init(); Part::Part2DObjectPython ::init(); diff --git a/src/Mod/Part/App/PrimitiveFeature.cpp b/src/Mod/Part/App/PrimitiveFeature.cpp index c43e79eae..b8f5b52bf 100644 --- a/src/Mod/Part/App/PrimitiveFeature.cpp +++ b/src/Mod/Part/App/PrimitiveFeature.cpp @@ -39,6 +39,7 @@ # include # include # include +# include # include # include # include @@ -711,6 +712,98 @@ App::DocumentObjectExecReturn *Helix::execute(void) return App::DocumentObject::StdReturn; } +PROPERTY_SOURCE(Part::Spiral, Part::Primitive) + +Spiral::Spiral(void) +{ + ADD_PROPERTY_TYPE(Growth, (1.0),"Spiral",App::Prop_None,"The growth of the spiral per rotation"); + Growth.setConstraints(&floatRange); + ADD_PROPERTY_TYPE(Radius,(1.0),"Spiral",App::Prop_None,"The radius of the spiral"); + Radius.setConstraints(&floatRange); + ADD_PROPERTY_TYPE(Rotations,(2.0),"Spiral",App::Prop_None,"The number of rotations"); + Rotations.setConstraints(&floatRange); +} + +void Spiral::onChanged(const App::Property* prop) +{ + if (!isRestoring()) { + if (prop == &Growth || prop == &Rotations || prop == &Radius) { + try { + App::DocumentObjectExecReturn *ret = recompute(); + delete ret; + } + catch (...) { + } + } + } + Part::Feature::onChanged(prop); +} + +short Spiral::mustExecute() const +{ + if (Growth.isTouched()) + return 1; + if (Rotations.isTouched()) + return 1; + if (Radius.isTouched()) + return 1; + return Primitive::mustExecute(); +} + +App::DocumentObjectExecReturn *Spiral::execute(void) +{ + try { + Standard_Real myNumRot = Rotations.getValue(); + Standard_Real myRadius = Radius.getValue(); + Standard_Real myGrowth = Growth.getValue(); + Standard_Real myPitch = 1.0; + Standard_Real myHeight = myNumRot * myPitch; + Standard_Real myAngle = atan(myGrowth / myPitch); + TopoShape helix; + + if (myGrowth < Precision::Confusion()) + Standard_Failure::Raise("Growth too small"); + + if (myNumRot < Precision::Confusion()) + Standard_Failure::Raise("Number of rotations too small"); + + gp_Ax2 cylAx2(gp_Pnt(0.0,0.0,0.0) , gp::DZ()); + Handle_Geom_Surface surf = new Geom_ConicalSurface(gp_Ax3(cylAx2), myAngle, myRadius); + + gp_Pnt2d aPnt(0, 0); + gp_Dir2d aDir(2. * M_PI, myPitch); + gp_Ax2d aAx2d(aPnt, aDir); + + Handle(Geom2d_Line) line = new Geom2d_Line(aAx2d); + gp_Pnt2d beg = line->Value(0); + gp_Pnt2d end = line->Value(sqrt(4.0*M_PI*M_PI+myPitch*myPitch)*(myHeight/myPitch)); + + // calculate end point for conical helix + Standard_Real v = myHeight / cos(myAngle); + Standard_Real u = (myHeight/myPitch) * 2.0 * M_PI; + gp_Pnt2d cend(u, v); + end = cend; + + Handle(Geom2d_TrimmedCurve) segm = GCE2d_MakeSegment(beg , end); + + TopoDS_Edge edgeOnSurf = BRepBuilderAPI_MakeEdge(segm , surf); + TopoDS_Wire wire = BRepBuilderAPI_MakeWire(edgeOnSurf); + BRepLib::BuildCurves3d(wire); + + Handle_Geom_Plane aPlane = new Geom_Plane(gp_Pnt(0.0,0.0,0.0), gp::DZ()); + Standard_Real range = (myNumRot+1) * myGrowth + 1; + BRepBuilderAPI_MakeFace mkFace(aPlane, -range, range, -range, range); + BRepProj_Projection proj(wire, mkFace.Face(), gp::DZ()); + this->Shape.setValue(proj.Shape()); + } + catch (Standard_Failure) { + Handle_Standard_Failure e = Standard_Failure::Caught(); + return new App::DocumentObjectExecReturn(e->GetMessageString()); + } + + return App::DocumentObject::StdReturn; +} + PROPERTY_SOURCE(Part::Wedge, Part::Primitive) Wedge::Wedge() diff --git a/src/Mod/Part/App/PrimitiveFeature.h b/src/Mod/Part/App/PrimitiveFeature.h index f2c94121c..652943aed 100644 --- a/src/Mod/Part/App/PrimitiveFeature.h +++ b/src/Mod/Part/App/PrimitiveFeature.h @@ -300,6 +300,32 @@ private: static const char* LocalCSEnums[]; }; +class PartExport Spiral : public Primitive +{ + PROPERTY_HEADER(Part::Spiral); + +public: + Spiral(); + + App::PropertyFloatConstraint Growth; + App::PropertyFloatConstraint Rotations; + App::PropertyFloatConstraint Radius; + + /** @name methods override feature */ + //@{ + /// recalculate the feature + App::DocumentObjectExecReturn *execute(void); + short mustExecute() const; + /// returns the type name of the ViewProvider + const char* getViewProviderName(void) const { + return "PartGui::ViewProviderSpiralParametric"; + } + //@} + +protected: + void onChanged (const App::Property* prop); +}; + class PartExport Wedge : public Primitive { PROPERTY_HEADER(Part::Wedge); diff --git a/src/Mod/Part/Gui/AppPartGui.cpp b/src/Mod/Part/Gui/AppPartGui.cpp index 44396e269..66f820a3d 100644 --- a/src/Mod/Part/Gui/AppPartGui.cpp +++ b/src/Mod/Part/Gui/AppPartGui.cpp @@ -99,50 +99,51 @@ void PartGuiExport initPartGui() (void) Py_InitModule("PartGui", PartGui_methods); /* mod name, table ptr */ Base::Console().Log("Loading GUI of Part module... done\n"); - PartGui::SoBrepFaceSet ::initClass(); - PartGui::SoBrepEdgeSet ::initClass(); - PartGui::SoBrepPointSet ::initClass(); - PartGui::SoFCControlPoints ::initClass(); - PartGui::ViewProviderPartBase ::init(); - PartGui::ViewProviderPartExt ::init(); - PartGui::ViewProviderPart ::init(); - PartGui::ViewProviderEllipsoid ::init(); - PartGui::ViewProviderPython ::init(); - PartGui::ViewProviderBox ::init(); - PartGui::ViewProviderPrism ::init(); - PartGui::ViewProviderImport ::init(); - PartGui::ViewProviderCurveNet ::init(); - PartGui::ViewProviderExtrusion ::init(); - PartGui::ViewProvider2DObject ::init(); - PartGui::ViewProvider2DObjectPython ::init(); - PartGui::ViewProviderMirror ::init(); - PartGui::ViewProviderFillet ::init(); - PartGui::ViewProviderChamfer ::init(); - PartGui::ViewProviderRevolution ::init(); - PartGui::ViewProviderLoft ::init(); - PartGui::ViewProviderSweep ::init(); - PartGui::ViewProviderOffset ::init(); - PartGui::ViewProviderThickness ::init(); - PartGui::ViewProviderCustom ::init(); - PartGui::ViewProviderCustomPython ::init(); - PartGui::ViewProviderBoolean ::init(); - PartGui::ViewProviderMultiFuse ::init(); - PartGui::ViewProviderMultiCommon ::init(); - PartGui::ViewProviderCompound ::init(); - PartGui::ViewProviderCircleParametric ::init(); - PartGui::ViewProviderLineParametric ::init(); - PartGui::ViewProviderPointParametric ::init(); - PartGui::ViewProviderEllipseParametric ::init(); - PartGui::ViewProviderHelixParametric ::init(); - PartGui::ViewProviderPlaneParametric ::init(); - PartGui::ViewProviderSphereParametric ::init(); + PartGui::SoBrepFaceSet ::initClass(); + PartGui::SoBrepEdgeSet ::initClass(); + PartGui::SoBrepPointSet ::initClass(); + PartGui::SoFCControlPoints ::initClass(); + PartGui::ViewProviderPartBase ::init(); + PartGui::ViewProviderPartExt ::init(); + PartGui::ViewProviderPart ::init(); + PartGui::ViewProviderEllipsoid ::init(); + PartGui::ViewProviderPython ::init(); + PartGui::ViewProviderBox ::init(); + PartGui::ViewProviderPrism ::init(); + PartGui::ViewProviderImport ::init(); + PartGui::ViewProviderCurveNet ::init(); + PartGui::ViewProviderExtrusion ::init(); + PartGui::ViewProvider2DObject ::init(); + PartGui::ViewProvider2DObjectPython ::init(); + PartGui::ViewProviderMirror ::init(); + PartGui::ViewProviderFillet ::init(); + PartGui::ViewProviderChamfer ::init(); + PartGui::ViewProviderRevolution ::init(); + PartGui::ViewProviderLoft ::init(); + PartGui::ViewProviderSweep ::init(); + PartGui::ViewProviderOffset ::init(); + PartGui::ViewProviderThickness ::init(); + PartGui::ViewProviderCustom ::init(); + PartGui::ViewProviderCustomPython ::init(); + PartGui::ViewProviderBoolean ::init(); + PartGui::ViewProviderMultiFuse ::init(); + PartGui::ViewProviderMultiCommon ::init(); + PartGui::ViewProviderCompound ::init(); + PartGui::ViewProviderSpline ::init(); + PartGui::ViewProviderCircleParametric ::init(); + PartGui::ViewProviderLineParametric ::init(); + PartGui::ViewProviderPointParametric ::init(); + PartGui::ViewProviderEllipseParametric ::init(); + PartGui::ViewProviderHelixParametric ::init(); + PartGui::ViewProviderSpiralParametric ::init(); + PartGui::ViewProviderPlaneParametric ::init(); + PartGui::ViewProviderSphereParametric ::init(); PartGui::ViewProviderCylinderParametric ::init(); - PartGui::ViewProviderConeParametric ::init(); - PartGui::ViewProviderTorusParametric ::init(); - PartGui::ViewProviderRuledSurface ::init(); - PartGui::ViewProviderSpline ::init(); + PartGui::ViewProviderConeParametric ::init(); + PartGui::ViewProviderTorusParametric ::init(); + PartGui::ViewProviderRuledSurface ::init(); - PartGui::Workbench ::init(); + PartGui::Workbench ::init(); // instantiating the commands CreatePartCommands(); diff --git a/src/Mod/Part/Gui/DlgPrimitives.cpp b/src/Mod/Part/Gui/DlgPrimitives.cpp index 21a5742e9..3cc4dc0a6 100644 --- a/src/Mod/Part/Gui/DlgPrimitives.cpp +++ b/src/Mod/Part/Gui/DlgPrimitives.cpp @@ -514,7 +514,21 @@ void DlgPrimitives::createPrimitive(const QString& placement) .arg(ui.helixLocalCS->currentIndex()) .arg(placement); } - else if (ui.comboBox1->currentIndex() == 10) { // circle + else if (ui.comboBox1->currentIndex() == 10) { // spiral + name = QString::fromAscii(doc->getUniqueObjectName("Spiral").c_str()); + cmd = QString::fromAscii( + "App.ActiveDocument.addObject(\"Part::Spiral\",\"%1\")\n" + "App.ActiveDocument.%1.Growth=%2\n" + "App.ActiveDocument.%1.Rotations=%3\n" + "App.ActiveDocument.%1.Radius=%4\n" + "App.ActiveDocument.%1.Placement=%5\n") + .arg(name) + .arg(ui.spiralGrowth->value(),0,'f',2) + .arg(ui.spiralRotation->value(),0,'f',2) + .arg(ui.spiralRadius->value(),0,'f',2) + .arg(placement); + } + else if (ui.comboBox1->currentIndex() == 11) { // circle name = QString::fromAscii(doc->getUniqueObjectName("Circle").c_str()); cmd = QString::fromAscii( "App.ActiveDocument.addObject(\"Part::Circle\",\"%1\")\n" @@ -528,7 +542,7 @@ void DlgPrimitives::createPrimitive(const QString& placement) .arg(ui.circleAngle1->value(),0,'f',2) .arg(placement); } - else if (ui.comboBox1->currentIndex() == 11) { // ellipse + else if (ui.comboBox1->currentIndex() == 12) { // ellipse name = QString::fromAscii(doc->getUniqueObjectName("Ellipse").c_str()); cmd = QString::fromAscii( "App.ActiveDocument.addObject(\"Part::Ellipse\",\"%1\")\n" @@ -544,7 +558,7 @@ void DlgPrimitives::createPrimitive(const QString& placement) .arg(ui.ellipseAngle1->value(),0,'f',2) .arg(placement); } - else if (ui.comboBox1->currentIndex() == 12) { // vertex + else if (ui.comboBox1->currentIndex() == 13) { // vertex name = QString::fromAscii(doc->getUniqueObjectName("Vertex").c_str()); cmd = QString::fromAscii( "App.ActiveDocument.addObject(\"Part::Vertex\",\"%1\")\n" @@ -558,7 +572,7 @@ void DlgPrimitives::createPrimitive(const QString& placement) .arg(ui.vertexZ->value(),0,'f',2) .arg(placement); } - else if (ui.comboBox1->currentIndex() == 13) { // line + else if (ui.comboBox1->currentIndex() == 14) { // line name = QString::fromAscii(doc->getUniqueObjectName("Line").c_str()); cmd = QString::fromAscii( "App.ActiveDocument.addObject(\"Part::Line\",\"%1\")\n" diff --git a/src/Mod/Part/Gui/DlgPrimitives.ui b/src/Mod/Part/Gui/DlgPrimitives.ui index a0f4b9af9..058f150ee 100644 --- a/src/Mod/Part/Gui/DlgPrimitives.ui +++ b/src/Mod/Part/Gui/DlgPrimitives.ui @@ -78,6 +78,11 @@ Helix + + + Spiral + + Circle @@ -1351,7 +1356,91 @@ - + + + + 9 + + + 6 + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + 0 + + + 6 + + + + + Radius: + + + + + + + Growth: + + + + + + + 1000.000000000000000 + + + 1.000000000000000 + + + + + + + 1000.000000000000000 + + + 1.000000000000000 + + + + + + + 1000.000000000000000 + + + 2.000000000000000 + + + + + + + Number of rotations: + + + + + + + + @@ -1554,7 +1643,7 @@ - + @@ -1614,7 +1703,7 @@ - + diff --git a/src/Mod/Part/Gui/Resources/Part.qrc b/src/Mod/Part/Gui/Resources/Part.qrc index f931b8ece..9a848287b 100644 --- a/src/Mod/Part/Gui/Resources/Part.qrc +++ b/src/Mod/Part/Gui/Resources/Part.qrc @@ -36,6 +36,7 @@ icons/Part_CheckGeometry.svg icons/Part_Ellipse_Parametric.svg icons/Part_Helix_Parametric.svg + icons/Part_Spiral_Parametric.svg icons/Part_Line_Parametric.svg icons/Part_Circle_Parametric.svg icons/Part_Point_Parametric.svg diff --git a/src/Mod/Part/Gui/Resources/icons/Part_Spiral_Parametric.svg b/src/Mod/Part/Gui/Resources/icons/Part_Spiral_Parametric.svg new file mode 100644 index 000000000..862b01c49 --- /dev/null +++ b/src/Mod/Part/Gui/Resources/icons/Part_Spiral_Parametric.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/Mod/Part/Gui/ViewProviderHelixParametric.cpp b/src/Mod/Part/Gui/ViewProviderHelixParametric.cpp index bcd6e76e5..df2d65e0e 100644 --- a/src/Mod/Part/Gui/ViewProviderHelixParametric.cpp +++ b/src/Mod/Part/Gui/ViewProviderHelixParametric.cpp @@ -26,29 +26,17 @@ #ifndef _PreComp_ #endif -/// Here the FreeCAD includes sorted by Base,App,Gui...... -#include - #include "ViewProviderHelixParametric.h" - -//#include "Tree.h" - - - using namespace PartGui; -using namespace std; -//************************************************************************** -// Construction/Destruction +PROPERTY_SOURCE(PartGui::ViewProviderHelixParametric, PartGui::ViewProviderSpline) -PROPERTY_SOURCE(PartGui::ViewProviderHelixParametric, PartGui::ViewProviderPart) - ViewProviderHelixParametric::ViewProviderHelixParametric() { - sPixmap = "Part_Helix_Parametric.svg"; + sPixmap = "Part_Helix_Parametric.svg"; } ViewProviderHelixParametric::~ViewProviderHelixParametric() @@ -56,18 +44,37 @@ ViewProviderHelixParametric::~ViewProviderHelixParametric() } - - -// ********************************************************************************** - std::vector ViewProviderHelixParametric::getDisplayModes(void) const { - // get the modes of the father - std::vector StrList; + // add your own modes + std::vector StrList; + StrList.push_back("Wireframe"); + StrList.push_back("Points"); - // add your own modes - StrList.push_back("Wireframe"); - StrList.push_back("Points"); - - return StrList; + return StrList; +} + +// ------------------------------------------------------------------ + +PROPERTY_SOURCE(PartGui::ViewProviderSpiralParametric, PartGui::ViewProviderSpline) + + +ViewProviderSpiralParametric::ViewProviderSpiralParametric() +{ + sPixmap = "Part_Spiral_Parametric.svg"; +} + +ViewProviderSpiralParametric::~ViewProviderSpiralParametric() +{ + +} + +std::vector ViewProviderSpiralParametric::getDisplayModes(void) const +{ + // add your own modes + std::vector StrList; + StrList.push_back("Wireframe"); + StrList.push_back("Points"); + + return StrList; } diff --git a/src/Mod/Part/Gui/ViewProviderHelixParametric.h b/src/Mod/Part/Gui/ViewProviderHelixParametric.h index c8a9bfe0b..c2a557668 100644 --- a/src/Mod/Part/Gui/ViewProviderHelixParametric.h +++ b/src/Mod/Part/Gui/ViewProviderHelixParametric.h @@ -24,24 +24,12 @@ #ifndef PARTGUI_VIEWPROVIDERHELIXPARAMETRIC_H #define PARTGUI_VIEWPROVIDERHELIXPARAMETRIC_H -#include "ViewProvider.h" - - -class TopoDS_Shape; -class TopoDS_Face; -class SoSeparator; -class SbVec3f; -class SoTransform; - -namespace Gui { - class View3DInventorViewer; - class SoFCSelection; -} +#include "ViewProviderSpline.h" namespace PartGui { -class PartGuiExport ViewProviderHelixParametric:public ViewProviderPart +class PartGuiExport ViewProviderHelixParametric : public ViewProviderSpline { PROPERTY_HEADER(PartGui::ViewProviderHelixParametric); @@ -50,11 +38,19 @@ public: ViewProviderHelixParametric(); /// destructor virtual ~ViewProviderHelixParametric(); - std::vector getDisplayModes(void) const; +}; -protected: +class PartGuiExport ViewProviderSpiralParametric : public ViewProviderSpline +{ + PROPERTY_HEADER(PartGui::ViewProviderSpiralParametric); +public: + /// constructor + ViewProviderSpiralParametric(); + /// destructor + virtual ~ViewProviderSpiralParametric(); + std::vector getDisplayModes(void) const; }; } // namespace PartGui