diff --git a/src/Gui/Selection.cpp b/src/Gui/Selection.cpp
index 769dab0b577d..f5c087a8f2ba 100644
--- a/src/Gui/Selection.cpp
+++ b/src/Gui/Selection.cpp
@@ -44,6 +44,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -853,11 +854,45 @@ void SelectionSingleton::setPreselectCoord( float x, float y, float z)
CurrentPreselection.x = x;
CurrentPreselection.y = y;
CurrentPreselection.z = z;
+
+ Base::Quantity mmx(Base::Quantity::MilliMetre);
+ mmx.setValue((double)x);
+ Base::Quantity mmy(Base::Quantity::MilliMetre);
+ mmy.setValue((double)y);
+ Base::Quantity mmz(Base::Quantity::MilliMetre);
+ mmz.setValue((double)z);
+
+ double xfactor, yfactor, zfactor, factor;
+ QString xunit, yunit, zunit, unit;
+
+ QString xval = Base::UnitsApi::schemaTranslate(mmx, xfactor, xunit);
+ QString yval = Base::UnitsApi::schemaTranslate(mmy, yfactor, yunit);
+ QString zval = Base::UnitsApi::schemaTranslate(mmz, zfactor, zunit);
+
+ if (xfactor <= yfactor && xfactor <= zfactor)
+ {
+ factor = xfactor;
+ unit = xunit;
+ }
+ else if (yfactor <= xfactor && yfactor <= zfactor)
+ {
+ factor = yfactor;
+ unit = yunit;
+ }
+ else
+ {
+ factor = zfactor;
+ unit = zunit;
+ }
+
+ float xuser = x / factor;
+ float yuser = y / factor;
+ float zuser = z / factor;
- snprintf(buf,512,"Preselected: %s.%s.%s (%f,%f,%f)",CurrentPreselection.pDocName
+ snprintf(buf,512,"Preselected: %s.%s.%s (%f,%f,%f) %s",CurrentPreselection.pDocName
,CurrentPreselection.pObjectName
,CurrentPreselection.pSubName
- ,x,y,z);
+ ,xuser,yuser,zuser,unit.toLatin1().data());
if (getMainWindow())
getMainWindow()->showMessage(QString::fromLatin1(buf));
diff --git a/src/Gui/SoFCSelection.cpp b/src/Gui/SoFCSelection.cpp
index 35a5cc63b68f..1818de1b1245 100644
--- a/src/Gui/SoFCSelection.cpp
+++ b/src/Gui/SoFCSelection.cpp
@@ -52,6 +52,7 @@
#include "View3DInventorViewer.h"
#include
+#include
#include "SoFCSelection.h"
#include "MainWindow.h"
#include "Selection.h"
@@ -401,13 +402,46 @@ SoFCSelection::handleEvent(SoHandleEventAction * action)
}
const auto &pt = pp->getPoint();
- snprintf(buf,512,"Preselected: %s.%s.%s (%g, %g, %g)",documentName.getValue().getString()
+
+ Base::Quantity mmx(Base::Quantity::MilliMetre);
+ mmx.setValue(fabs(pt[0])>1e-7?(double)pt[0]:0.0);
+ Base::Quantity mmy(Base::Quantity::MilliMetre);
+ mmy.setValue(fabs(pt[1])>1e-7?(double)pt[1]:0.0);
+ Base::Quantity mmz(Base::Quantity::MilliMetre);
+ mmz.setValue(fabs(pt[2])>1e-7?(double)pt[2]:0.0);
+
+ double xfactor, yfactor, zfactor, factor;
+ QString xunit, yunit, zunit, unit;
+
+ QString xval = Base::UnitsApi::schemaTranslate(mmx, xfactor, xunit);
+ QString yval = Base::UnitsApi::schemaTranslate(mmy, yfactor, yunit);
+ QString zval = Base::UnitsApi::schemaTranslate(mmz, zfactor, zunit);
+
+ if (xfactor <= yfactor && xfactor <= zfactor)
+ {
+ factor = xfactor;
+ unit = xunit;
+ }
+ else if (yfactor <= xfactor && yfactor <= zfactor)
+ {
+ factor = yfactor;
+ unit = yunit;
+ }
+ else
+ {
+ factor = zfactor;
+ unit = zunit;
+ }
+
+ float xuser = fabs(pt[0])>1e-7 ? pt[0] / factor : 0.0;
+ float yuser = fabs(pt[1])>1e-7 ? pt[1] / factor : 0.0;
+ float zuser = fabs(pt[2])>1e-7 ? pt[2] / factor : 0.0;
+
+ snprintf(buf,512,"Preselected: %s.%s.%s (%f, %f, %f) %s",documentName.getValue().getString()
,objectName.getValue().getString()
,subElementName.getValue().getString()
- ,fabs(pt[0])>1e-7?pt[0]:0.0
- ,fabs(pt[1])>1e-7?pt[1]:0.0
- ,fabs(pt[2])>1e-7?pt[2]:0.0);
-
+ ,xuser,yuser,zuser,unit.toLatin1().data());
+
getMainWindow()->showMessage(QString::fromLatin1(buf));
}
else { // picked point
diff --git a/src/Gui/SoFCUnifiedSelection.cpp b/src/Gui/SoFCUnifiedSelection.cpp
index b3b3098f3808..e4790983f6fd 100644
--- a/src/Gui/SoFCUnifiedSelection.cpp
+++ b/src/Gui/SoFCUnifiedSelection.cpp
@@ -79,6 +79,7 @@
#include
#include
+#include
#include
#include
#include
@@ -479,14 +480,46 @@ bool SoFCUnifiedSelection::setHighlight(SoFullPath *path, const SoDetail *det,
{
const char *docname = vpd->getObject()->getDocument()->getName();
const char *objname = vpd->getObject()->getNameInDocument();
-
+
+ Base::Quantity mmx(Base::Quantity::MilliMetre);
+ mmx.setValue(fabs(x)>1e-7?(double)x:0.0);
+ Base::Quantity mmy(Base::Quantity::MilliMetre);
+ mmy.setValue(fabs(y)>1e-7?(double)y:0.0);
+ Base::Quantity mmz(Base::Quantity::MilliMetre);
+ mmz.setValue(fabs(z)>1e-7?(double)z:0.0);
+
+ double xfactor, yfactor, zfactor, factor;
+ QString xunit, yunit, zunit, unit;
+
+ QString xval = Base::UnitsApi::schemaTranslate(mmx, xfactor, xunit);
+ QString yval = Base::UnitsApi::schemaTranslate(mmy, yfactor, yunit);
+ QString zval = Base::UnitsApi::schemaTranslate(mmz, zfactor, zunit);
+
+ if (xfactor <= yfactor && xfactor <= zfactor)
+ {
+ factor = xfactor;
+ unit = xunit;
+ }
+ else if (yfactor <= xfactor && yfactor <= zfactor)
+ {
+ factor = yfactor;
+ unit = yunit;
+ }
+ else
+ {
+ factor = zfactor;
+ unit = zunit;
+ }
+
+ float xuser = fabs(x)>1e-7 ? x / factor : 0.0;
+ float yuser = fabs(y)>1e-7 ? y / factor : 0.0;
+ float zuser = fabs(z)>1e-7 ? z / factor : 0.0;
+
this->preSelection = 1;
static char buf[513];
- snprintf(buf,512,"Preselected: %s.%s.%s (%g, %g, %g)"
+ snprintf(buf,512,"Preselected: %s.%s.%s (%f, %f, %f) %s"
,docname,objname,element
- ,fabs(x)>1e-7?x:0.0
- ,fabs(y)>1e-7?y:0.0
- ,fabs(z)>1e-7?z:0.0);
+ ,xuser,yuser,zuser,unit.toLatin1().data());
getMainWindow()->showMessage(QString::fromLatin1(buf));