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;