jfjoch_viewer: Handle better ROI result
All checks were successful
Build Packages / build:rpm (ubuntu2404_nocuda) (push) Successful in 10m51s
Build Packages / build:rpm (rocky8_nocuda) (push) Successful in 12m21s
Build Packages / Generate python client (push) Successful in 15s
Build Packages / build:rpm (ubuntu2204_nocuda) (push) Successful in 12m43s
Build Packages / build:rpm (rocky8) (push) Successful in 12m57s
Build Packages / Create release (push) Has been skipped
Build Packages / Build documentation (push) Successful in 35s
Build Packages / build:rpm (rocky9_nocuda) (push) Successful in 13m15s
Build Packages / build:rpm (rocky8_sls9) (push) Successful in 13m11s
Build Packages / build:rpm (ubuntu2204) (push) Successful in 13m9s
Build Packages / build:rpm (rocky9) (push) Successful in 14m26s
Build Packages / build:rpm (ubuntu2404) (push) Successful in 7m4s
Build Packages / Unit tests (push) Successful in 53m10s

This commit is contained in:
2025-11-14 20:51:16 +01:00
parent ac62f50707
commit b74b6af60d
5 changed files with 45 additions and 39 deletions

View File

@@ -21,6 +21,7 @@ void JFJochAzIntImage::Clear() {
void JFJochAzIntImage::imageLoaded(std::shared_ptr<const JFJochReaderImage> in_image) {
if (!in_image) {
Clear();
CalcROI();
return;
}
@@ -68,6 +69,7 @@ void JFJochAzIntImage::imageLoaded(std::shared_ptr<const JFJochReaderImage> in_i
// Generate pixmap and redraw using base class functionality
GeneratePixmap();
Redraw();
CalcROI();
} else {
Clear();
}

View File

@@ -293,11 +293,13 @@ void JFJochDiffractionImage::loadImage(std::shared_ptr<const JFJochReaderImage>
LoadImageInternal();
GeneratePixmap();
Redraw();
CalcROI();
} else {
image.reset();
W = 0; H = 0;
if (scene())
scene()->clear();
CalcROI();
}
}

View File

@@ -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<int64_t>(std::floor(in_x - radius - margin));
int64_t xmax = static_cast<int64_t>(std::ceil(in_x + radius + margin));
int64_t ymin = static_cast<int64_t>(std::floor(in_y - radius - margin));
int64_t ymax = static_cast<int64_t>(static_cast<int64_t>(std::ceil(in_y + radius + margin)));
const float cx = static_cast<float>(in_x);
const float cy = static_cast<float>(in_y);
const float r2 = static_cast<float>(radius * radius);
ROIMessage msg = accumulateROI(
xmin, xmax, ymin, ymax,
[cx, cy, r2](int64_t x, int64_t y) {
const float dx = static_cast<float>(x) - cx;
const float dy = static_cast<float>(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<float>(roiStartPos.x());
const float cy = static_cast<float>(roiStartPos.y());
const float r2 = static_cast<float>(radius2);
msg = accumulateROI(
xmin, xmax, ymin, ymax,
[cx, cy, r2](int64_t x, int64_t y) {
const float dx = static_cast<float>(x) - cx;
const float dy = static_cast<float>(y) - cy;
const float dist2 = dx * dx + dy * dy;
return dist2 <= r2;
}
);
}
emit roiCalculated(msg);
}

View File

@@ -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);

View File

@@ -26,11 +26,13 @@ void JFJochSimpleImage::setImage(std::shared_ptr<const SimpleImage> img) {
loadImageInternal();
GeneratePixmap();
Redraw();
CalcROI();
} else {
image_.reset();
W = 0; H = 0;
if (scene())
scene()->clear();
CalcROI();
}
}