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
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:
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user