diff --git a/src/Mod/Points/Gui/Command.cpp b/src/Mod/Points/Gui/Command.cpp index 016f1d8e35..ab18b36fa8 100644 --- a/src/Mod/Points/Gui/Command.cpp +++ b/src/Mod/Points/Gui/Command.cpp @@ -24,6 +24,7 @@ #ifndef _PreComp_ #include #include +#include #include #endif @@ -98,7 +99,39 @@ void CmdPointsImport::activated(int iMsg) commitCommand(); updateActive(); + + /** check if boundbox contains the origin, offer to move it to the origin if not + * addresses issue #5808 where an imported points cloud that was far from the + * origin had inaccuracies in the relative positioning of the points due to + * imprecise floating point variables used in COIN + **/ + Points::Feature *pcFtr = dynamic_cast(doc->getDocument()->getActiveObject()); + if (pcFtr) { + auto points = pcFtr->Points.getValue(); + auto bbox = points.getBoundBox(); + auto center = bbox.GetCenter(); + + if (!bbox.IsInBox(Base::Vector3d(0,0,0))) { + QMessageBox msgBox; + msgBox.setIcon(QMessageBox::Question); + msgBox.setWindowTitle(QObject::tr( "Points not at Origin")); + msgBox.setText(QObject::tr("The Bounding Box of the imported points does not contain the origin. " + "Do you want to translate it to the origin?")); + msgBox.setStandardButtons(QMessageBox::Yes | QMessageBox::No); + msgBox.setDefaultButton(QMessageBox::Yes); + auto ret = msgBox.exec(); + + if (ret == QMessageBox::Yes) { + Points::PointKernel translatedPoints; + for (const auto& point : points) { + translatedPoints.push_back(point - center); + } + pcFtr->Points.setValue(translatedPoints); + } + } + } } + } bool CmdPointsImport::isActive()