diff --git a/src/Mod/Part/App/AppPart.cpp b/src/Mod/Part/App/AppPart.cpp index 3905c2644..e2fa70b01 100644 --- a/src/Mod/Part/App/AppPart.cpp +++ b/src/Mod/Part/App/AppPart.cpp @@ -156,6 +156,7 @@ void PartExport initPart() Part::CurveNet ::init(); Part::Polygon ::init(); Part::Circle ::init(); + Part::Ellipse ::init(); Part::Vertex ::init(); Part::Line ::init(); Part::Ellipsoid ::init(); diff --git a/src/Mod/Part/App/PrimitiveFeature.cpp b/src/Mod/Part/App/PrimitiveFeature.cpp index 004166532..2aef7aa07 100644 --- a/src/Mod/Part/App/PrimitiveFeature.cpp +++ b/src/Mod/Part/App/PrimitiveFeature.cpp @@ -38,6 +38,7 @@ # include # include # include +# include # include # include # include @@ -725,3 +726,61 @@ void Wedge::onChanged(const App::Property* prop) } Part::Primitive::onChanged(prop); } + +App::PropertyFloatConstraint::Constraints Ellipse::angleRange = {0.0,360.0,1.0}; + +PROPERTY_SOURCE(Part::Ellipse, Part::Primitive) + + +Ellipse::Ellipse() +{ + ADD_PROPERTY(MajorRadius,(4.0f)); + ADD_PROPERTY(MinorRadius,(4.0f)); + ADD_PROPERTY(Angle0,(0.0f)); + Angle0.setConstraints(&angleRange); + ADD_PROPERTY(Angle1,(360.0f)); + Angle1.setConstraints(&angleRange); +} + +Ellipse::~Ellipse() +{ +} + +short Ellipse::mustExecute() const +{ + if (Angle0.isTouched() || + Angle1.isTouched() || + MajorRadius.isTouched() || + MinorRadius.isTouched()) + return 1; + return Part::Feature::mustExecute(); +} + +App::DocumentObjectExecReturn *Ellipse::execute(void) +{ + gp_Elips ellipse; + ellipse.SetMajorRadius(this->MajorRadius.getValue()); + ellipse.SetMinorRadius(this->MinorRadius.getValue()); + + BRepBuilderAPI_MakeEdge clMakeEdge(ellipse, Base::toRadians(this->Angle0.getValue()), + Base::toRadians(this->Angle1.getValue())); + const TopoDS_Edge& edge = clMakeEdge.Edge(); + this->Shape.setValue(edge); + + return App::DocumentObject::StdReturn; +} + +void Ellipse::onChanged(const App::Property* prop) +{ + if (!isRestoring()) { + if (prop == &MajorRadius || prop == &MinorRadius || prop == &Angle0 || prop == &Angle1){ + try { + App::DocumentObjectExecReturn *ret = recompute(); + delete ret; + } + catch (...) { + } + } + } + Part::Feature::onChanged(prop); +} diff --git a/src/Mod/Part/App/PrimitiveFeature.h b/src/Mod/Part/App/PrimitiveFeature.h index 250bf1564..fe1eb0609 100644 --- a/src/Mod/Part/App/PrimitiveFeature.h +++ b/src/Mod/Part/App/PrimitiveFeature.h @@ -265,6 +265,31 @@ protected: void onChanged(const App::Property* prop); }; +class Ellipse : public Part::Primitive +{ + PROPERTY_HEADER(Part::Ellipse); + +public: + Ellipse(); + virtual ~Ellipse(); + + App::PropertyFloat MajorRadius; + App::PropertyFloat MinorRadius; + App::PropertyAngle Angle0; + App::PropertyAngle Angle1; + + /** @name methods override feature */ + //@{ + /// recalculate the Feature + App::DocumentObjectExecReturn *execute(void); + short mustExecute() const; + void onChanged(const App::Property*); + //@} + +private: + static App::PropertyFloatConstraint::Constraints angleRange; +}; + } //namespace Part diff --git a/src/Mod/Part/Gui/DlgPrimitives.cpp b/src/Mod/Part/Gui/DlgPrimitives.cpp index 30cdb79d1..04b5462f9 100644 --- a/src/Mod/Part/Gui/DlgPrimitives.cpp +++ b/src/Mod/Part/Gui/DlgPrimitives.cpp @@ -312,7 +312,23 @@ void DlgPrimitives::createPrimitive(const QString& placement) .arg(ui.circleAngle1->value(),0,'f',2) .arg(placement); } - else if (ui.comboBox1->currentIndex() == 10) { // vertex + else if (ui.comboBox1->currentIndex() == 10) { // ellipse + name = QString::fromAscii(doc->getUniqueObjectName("Ellipse").c_str()); + cmd = QString::fromAscii( + "App.ActiveDocument.addObject(\"Part::Ellipse\",\"%1\")\n" + "App.ActiveDocument.%1.MajorRadius=%2\n" + "App.ActiveDocument.%1.MinorRadius=%3\n" + "App.ActiveDocument.%1.Angle0=%4\n" + "App.ActiveDocument.%1.Angle1=%5\n" + "App.ActiveDocument.%1.Placement=%6\n") + .arg(name) + .arg(ui.ellipseMajorRadius->value(),0,'f',2) + .arg(ui.ellipseMinorRadius->value(),0,'f',2) + .arg(ui.ellipseAngle0->value(),0,'f',2) + .arg(ui.ellipseAngle1->value(),0,'f',2) + .arg(placement); + } + else if (ui.comboBox1->currentIndex() == 11) { // vertex name = QString::fromAscii(doc->getUniqueObjectName("Vertex").c_str()); cmd = QString::fromAscii( "App.ActiveDocument.addObject(\"Part::Vertex\",\"%1\")\n" @@ -326,7 +342,7 @@ void DlgPrimitives::createPrimitive(const QString& placement) .arg(ui.vertexZ->value(),0,'f',2) .arg(placement); } - else if (ui.comboBox1->currentIndex() == 11) { // line + else if (ui.comboBox1->currentIndex() == 12) { // 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 8612951db..8f227b6fb 100644 --- a/src/Mod/Part/Gui/DlgPrimitives.ui +++ b/src/Mod/Part/Gui/DlgPrimitives.ui @@ -84,6 +84,11 @@ Circle + + + Ellipse + + Point @@ -1320,6 +1325,101 @@ + + + + + + + + Major radius: + + + + + + + 1000000000.000000000000000 + + + 4.000000000000000 + + + + + + + Minor radius: + + + + + + + 1000000000.000000000000000 + + + 2.000000000000000 + + + + + + + Angle 1: + + + + + + + 360.000000000000000 + + + 0.000000000000000 + + + + + + + Angle 2: + + + + + + + 0.000000000000000 + + + 360.000000000000000 + + + 1.000000000000000 + + + 360.000000000000000 + + + + + + + + + Qt::Vertical + + + + 20 + 131 + + + + + +