From b74b6af60d3abb3002e4b63edfec9045eb6ae17b Mon Sep 17 00:00:00 2001 From: Filip Leonarski Date: Fri, 14 Nov 2025 20:51:16 +0100 Subject: [PATCH] jfjoch_viewer: Handle better ROI result --- viewer/widgets/JFJochAzIntImage.cpp | 2 + viewer/widgets/JFJochDiffractionImage.cpp | 2 + viewer/widgets/JFJochImage.cpp | 75 ++++++++++++----------- viewer/widgets/JFJochImage.h | 3 +- viewer/widgets/JFJochSimpleImage.cpp | 2 + 5 files changed, 45 insertions(+), 39 deletions(-) diff --git a/viewer/widgets/JFJochAzIntImage.cpp b/viewer/widgets/JFJochAzIntImage.cpp index fa362c9c..9b4073fa 100644 --- a/viewer/widgets/JFJochAzIntImage.cpp +++ b/viewer/widgets/JFJochAzIntImage.cpp @@ -21,6 +21,7 @@ void JFJochAzIntImage::Clear() { void JFJochAzIntImage::imageLoaded(std::shared_ptr in_image) { if (!in_image) { Clear(); + CalcROI(); return; } @@ -68,6 +69,7 @@ void JFJochAzIntImage::imageLoaded(std::shared_ptr in_i // Generate pixmap and redraw using base class functionality GeneratePixmap(); Redraw(); + CalcROI(); } else { Clear(); } diff --git a/viewer/widgets/JFJochDiffractionImage.cpp b/viewer/widgets/JFJochDiffractionImage.cpp index f8182c80..c569b7bb 100644 --- a/viewer/widgets/JFJochDiffractionImage.cpp +++ b/viewer/widgets/JFJochDiffractionImage.cpp @@ -293,11 +293,13 @@ void JFJochDiffractionImage::loadImage(std::shared_ptr LoadImageInternal(); GeneratePixmap(); Redraw(); + CalcROI(); } else { image.reset(); W = 0; H = 0; if (scene()) scene()->clear(); + CalcROI(); } } diff --git a/viewer/widgets/JFJochImage.cpp b/viewer/widgets/JFJochImage.cpp index a0f3dab9..96d6408d 100644 --- a/viewer/widgets/JFJochImage.cpp +++ b/viewer/widgets/JFJochImage.cpp @@ -23,9 +23,6 @@ JFJochImage::JFJochImage(QWidget *parent) : QGraphicsView(parent) { // Optional: a sensible default colormap color_scale.Select(ColorScaleEnum::Indigo); - - connect(this, &JFJochImage::roiBoxUpdated, this, &JFJochImage::CalcROIBox); - connect(this, &JFJochImage::roiCircleUpdated, this, &JFJochImage::CalcROICircle); } void JFJochImage::onScroll(int value) { @@ -332,22 +329,23 @@ void JFJochImage::updateROI() { } emit roiBoxUpdated(roiBox.toRect()); } else { + double radius; if (mouse_event_type == MouseEventType::DrawingROI) { // Center at roiStartPos, radius from start->end QPointF delta = roiStartPos - roiEndPos; - double radius = std::sqrt(delta.x() * delta.x() + delta.y() * delta.y()); + radius = std::sqrt(delta.x() * delta.x() + delta.y() * delta.y()); roiBox = QRectF(roiStartPos.x() - radius, roiStartPos.y() - radius, 2 * radius, 2 * radius).normalized(); - emit roiCircleUpdated(roiStartPos.x(), roiStartPos.y(), radius); } else { // Moving/resizing: infer center/radius from roiBox const QPointF c = roiBox.center(); - const double radius = 0.5 * std::min(roiBox.width(), roiBox.height()); + radius = 0.5 * std::min(roiBox.width(), roiBox.height()); roiStartPos = c; // treat start as center for consistency roiEndPos = QPointF(c.x() + radius, c.y()); // arbitrary point on radius - emit roiCircleUpdated(c.x(), c.y(), radius); } + emit roiCircleUpdated(roiStartPos.x(), roiStartPos.y(), radius); } + CalcROI(); updateOverlay(); } @@ -641,8 +639,16 @@ ROIMessage JFJochImage::accumulateROI( }; } -void JFJochImage::CalcROIBox(QRect box) { - auto box_norm = box.normalized(); +void JFJochImage::CalcROI() { + if (W*H == 0) { + auto msg = ROIMessage{ + .pixels = 0, + .pixels_masked = 0}; + emit roiCalculated(msg); + return; + } + + auto box_norm = roiBox.normalized(); // Using the rectangle as-is; you can adjust inclusivity if needed int64_t xmin = box_norm.left(); @@ -650,32 +656,27 @@ void JFJochImage::CalcROIBox(QRect box) { int64_t ymin = box_norm.top(); int64_t ymax = box_norm.bottom(); - ROIMessage msg = accumulateROI( - xmin, xmax, ymin, ymax, - [](int64_t, int64_t) { return true; } // everything in the rectangle - ); - emit roiCalculated(msg); -} - -void JFJochImage::CalcROICircle(double in_x, double in_y, double radius) { - const double margin = 1.0; - int64_t xmin = static_cast(std::floor(in_x - radius - margin)); - int64_t xmax = static_cast(std::ceil(in_x + radius + margin)); - int64_t ymin = static_cast(std::floor(in_y - radius - margin)); - int64_t ymax = static_cast(static_cast(std::ceil(in_y + radius + margin))); - - const float cx = static_cast(in_x); - const float cy = static_cast(in_y); - const float r2 = static_cast(radius * radius); - - ROIMessage msg = accumulateROI( - xmin, xmax, ymin, ymax, - [cx, cy, r2](int64_t x, int64_t y) { - const float dx = static_cast(x) - cx; - const float dy = static_cast(y) - cy; - const float dist2 = dx * dx + dy * dy; - return dist2 <= r2; - } - ); - emit roiCalculated(msg); + ROIMessage msg{}; + if (roi_type == RoiType::RoiBox) + msg = accumulateROI( + xmin, xmax, ymin, ymax, + [](int64_t, int64_t) { return true; } // everything in the rectangle + ); + else { + QPointF delta = roiStartPos - roiEndPos; + double radius2 = delta.x() * delta.x() + delta.y() * delta.y(); + const float cx = static_cast(roiStartPos.x()); + const float cy = static_cast(roiStartPos.y()); + const float r2 = static_cast(radius2); + msg = accumulateROI( + xmin, xmax, ymin, ymax, + [cx, cy, r2](int64_t x, int64_t y) { + const float dx = static_cast(x) - cx; + const float dy = static_cast(y) - cy; + const float dist2 = dx * dx + dy * dy; + return dist2 <= r2; + } + ); + } + emit roiCalculated(msg); } diff --git a/viewer/widgets/JFJochImage.h b/viewer/widgets/JFJochImage.h index 846b3d1f..4ec8ab64 100644 --- a/viewer/widgets/JFJochImage.h +++ b/viewer/widgets/JFJochImage.h @@ -67,6 +67,7 @@ protected: void updateOverlay(); void GeneratePixmap(); void Redraw(); + void CalcROI(); signals: void foregroundChanged(float v); void backgroundChanged(float v); @@ -76,8 +77,6 @@ signals: void roiCalculated(ROIMessage &output); private slots: void onScroll(int value); - void CalcROIBox(QRect box); - void CalcROICircle(double x, double y, double radius); public slots: void setFeatureColor(QColor input); void setColorMap(int color_map); diff --git a/viewer/widgets/JFJochSimpleImage.cpp b/viewer/widgets/JFJochSimpleImage.cpp index 39e4e5cd..24101ef1 100644 --- a/viewer/widgets/JFJochSimpleImage.cpp +++ b/viewer/widgets/JFJochSimpleImage.cpp @@ -26,11 +26,13 @@ void JFJochSimpleImage::setImage(std::shared_ptr img) { loadImageInternal(); GeneratePixmap(); Redraw(); + CalcROI(); } else { image_.reset(); W = 0; H = 0; if (scene()) scene()->clear(); + CalcROI(); } }