diff --git a/src/Mod/TechDraw/Gui/DrawGuiUtil.cpp b/src/Mod/TechDraw/Gui/DrawGuiUtil.cpp index 024cbb4b05..83d6e0c79b 100644 --- a/src/Mod/TechDraw/Gui/DrawGuiUtil.cpp +++ b/src/Mod/TechDraw/Gui/DrawGuiUtil.cpp @@ -383,14 +383,29 @@ std::pair DrawGuiUtil::get3DDirAndRot() return std::make_pair(viewDir, viewRight); } + // Coin is giving us a values like 0.000000134439 instead of 0.000000000000. + // This small difference caused circles to be projected as ellipses among other + // problems. + // Since SbVec3f is single precision floating point, it is only good to 6-9 + // significant decimal digits, and the rest of TechDraw works with doubles + // that are good to 15-18 significant decimal digits. + // But. When a float is promoted to double the value is supposed to be unchanged! + // So where do the garbage digits come from??? + // In any case, if we restrict directions to 6 digits, we avoid the problem. + int digits(6); SbVec3f dvec = viewer->getViewDirection(); - SbVec3f upvec = viewer->getUpDirection(); - - viewDir = Base::Vector3d(dvec[0], dvec[1], dvec[2]); + double dvecX = roundToDigits(dvec[0], digits); + double dvecY = roundToDigits(dvec[1], digits); + double dvecZ = roundToDigits(dvec[2], digits); + viewDir = Base::Vector3d(dvecX, dvecY, dvecZ); viewDir = viewDir * (-1.0);// Inventor dir is opposite TD projection dir - viewUp = Base::Vector3d(upvec[0], upvec[1], upvec[2]); - // Base::Vector3d dirXup = viewDir.Cross(viewUp); + SbVec3f upvec = viewer->getUpDirection(); + double upvecX = roundToDigits(upvec[0], digits); + double upvecY = roundToDigits(upvec[1], digits); + double upvecZ = roundToDigits(upvec[2], digits); + viewUp = Base::Vector3d(upvecX, upvecY, upvecZ); + Base::Vector3d right = viewUp.Cross(viewDir); result = std::make_pair(viewDir, right); @@ -436,3 +451,13 @@ std::pair DrawGuiUtil::getProjDirFromFace(App::D return std::make_pair(projDir, rotVec); } + +// converts original value to one with only digits significant figures +double DrawGuiUtil::roundToDigits(double original, int digits) +{ + double factor = std::pow(10.0, digits); + double temp = original * factor; + double rounded = std::round(temp); + temp = rounded / factor; + return temp; +} diff --git a/src/Mod/TechDraw/Gui/DrawGuiUtil.h b/src/Mod/TechDraw/Gui/DrawGuiUtil.h index ec8e06db31..f5082f9fee 100644 --- a/src/Mod/TechDraw/Gui/DrawGuiUtil.h +++ b/src/Mod/TechDraw/Gui/DrawGuiUtil.h @@ -71,6 +71,8 @@ class TechDrawGuiExport DrawGuiUtil { std::string faceName); static void loadArrowBox(QComboBox* qcb); + static double roundToDigits(double original, int digits); + };