diff --git a/src/Mod/ReverseEngineering/Gui/Command.cpp b/src/Mod/ReverseEngineering/Gui/Command.cpp
index 1c35d21361..67fd948b2e 100644
--- a/src/Mod/ReverseEngineering/Gui/Command.cpp
+++ b/src/Mod/ReverseEngineering/Gui/Command.cpp
@@ -55,6 +55,7 @@
#include
#include
#include
+#include
#include "../App/ApproxSurface.h"
#include "FitBSplineSurface.h"
@@ -223,8 +224,22 @@ void CmdApproxCylinder::activated(int)
const MeshCore::MeshKernel& kernel = mesh.getKernel();
MeshCore::CylinderFit fit;
fit.AddPoints(kernel.GetPoints());
+
+ // get normals
+ {
+ std::vector facets(kernel.CountFacets());
+ std::generate(facets.begin(), facets.end(), Base::iotaGen(0));
+ std::vector normals = kernel.GetFacetNormals(facets);
+ Base::Vector3f base = fit.GetGravity();
+ Base::Vector3f axis = fit.GetInitialAxisFromNormals(normals);
+ fit.SetInitialValues(base, axis);
+ }
+
if (fit.Fit() < FLOAT_MAX) {
- Base::Vector3f base = fit.GetBase();
+ Base::Vector3f base, top;
+ fit.GetBounding(base, top);
+ float height = Base::Distance(base, top);
+
Base::Rotation rot;
rot.setValue(Base::Vector3d(0,0,1), Base::convertTo(fit.GetAxis()));
double q0, q1, q2, q3;
@@ -234,6 +249,7 @@ void CmdApproxCylinder::activated(int)
str << "from FreeCAD import Base" << std::endl;
str << "App.ActiveDocument.addObject('Part::Cylinder','Cylinder_fit')" << std::endl;
str << "App.ActiveDocument.ActiveObject.Radius = " << fit.GetRadius() << std::endl;
+ str << "App.ActiveDocument.ActiveObject.Height = " << height << std::endl;
str << "App.ActiveDocument.ActiveObject.Placement = Base.Placement("
<< "Base.Vector(" << base.x << "," << base.y << "," << base.z << "),"
<< "Base.Rotation(" << q0 << "," << q1 << "," << q2 << "," << q3 << "))" << std::endl;