Core: In View3DInventorViewer::getPointOnXYPlaneOfPlacement throw exception

If no intersection point can be found throw a Base::RuntimeError
This commit is contained in:
wmayer
2024-11-11 01:10:44 +01:00
parent 3a7c8ed1c5
commit 72728ece52
2 changed files with 7 additions and 11 deletions

View File

@@ -2657,14 +2657,14 @@ SbVec2f View3DInventorViewer::getNormalizedPosition(const SbVec2s& pnt) const
return {pX, pY};
}
SbVec3f View3DInventorViewer::getPointOnXYPlaneOfPlacement(const SbVec2s& pnt, Base::Placement& plc) const
SbVec3f View3DInventorViewer::getPointOnXYPlaneOfPlacement(const SbVec2s& pnt,
const Base::Placement& plc) const
{
SbVec2f pnt2d = getNormalizedPosition(pnt);
SoCamera* pCam = this->getSoRenderManager()->getCamera();
if (!pCam) {
// return invalid point
return {};
throw Base::RuntimeError("No camera node found");
}
SbViewVolume vol = pCam->getViewVolume();
@@ -2674,23 +2674,19 @@ SbVec3f View3DInventorViewer::getPointOnXYPlaneOfPlacement(const SbVec2s& pnt, B
// Calculate the plane using plc
Base::Rotation rot = plc.getRotation();
Base::Vector3d normalVector = rot.multVec(Base::Vector3d(0, 0, 1));
SbVec3f planeNormal(normalVector.x, normalVector.y, normalVector.z);
SbVec3f planeNormal = Base::convertTo<SbVec3f>(normalVector);
// Get the position and convert Base::Vector3d to SbVec3f
Base::Vector3d pos = plc.getPosition();
SbVec3f planePosition(pos.x, pos.y, pos.z);
SbVec3f planePosition = Base::convertTo<SbVec3f>(pos);
SbPlane xyPlane(planeNormal, planePosition);
SbVec3f pt;
if (xyPlane.intersect(line, pt)) {
return pt; // Intersection point on the XY plane
}
else {
// No intersection found
return {};
}
return pt;
throw Base::RuntimeError("No intersection found");
}
SbVec3f projectPointOntoPlane(const SbVec3f& point, const SbPlane& plane) {

View File

@@ -309,7 +309,7 @@ public:
SbVec3f getPointOnLine(const SbVec2s&, const SbVec3f& axisCenter, const SbVec3f& axis) const;
/** Returns the 3d point on the XY plane of a placement to the given 2d point. */
SbVec3f getPointOnXYPlaneOfPlacement(const SbVec2s&, Base::Placement&) const;
SbVec3f getPointOnXYPlaneOfPlacement(const SbVec2s&, const Base::Placement&) const;
/** Returns the 2d coordinates on the viewport to the given 3d point. */
SbVec2s getPointOnViewport(const SbVec3f&) const;