From e28344c3a8e30d8f2830d78dd5b22eb1ec379225 Mon Sep 17 00:00:00 2001 From: Julien STAUB Date: Thu, 6 Aug 2026 10:40:07 +0200 Subject: [PATCH 1/2] fix #301 enable elliptical flat control --- mirrordlg.cpp | 12 ++++++++++++ mirrordlg.h | 1 + 2 files changed, 13 insertions(+) diff --git a/mirrordlg.cpp b/mirrordlg.cpp index 95403981..82e2aca0 100644 --- a/mirrordlg.cpp +++ b/mirrordlg.cpp @@ -114,6 +114,7 @@ mirrorDlg::mirrorDlg(QWidget *parent) : if (m_verticalAxis == 0) m_verticalAxis = diameter; ui->ellipseShape->setChecked(m_outlineShape == ELLIPSE); + setEllipseControlsEnabled(m_outlineShape == ELLIPSE); ui->minorAxisEdit->setText(QString().number(m_verticalAxis)); ui->diameter->setText(QString("%1").arg(diameter, 6, 'f', 2)); ui->obs->setText(QString("%1").arg(obs, 6, 'f', 2)); @@ -144,6 +145,12 @@ double mirrorDlg::getMinorAxis(){ bool mirrorDlg::isEllipse(){ return m_outlineShape == ELLIPSE; } + +void mirrorDlg::setEllipseControlsEnabled(bool enabled) +{ + ui->minorAxisEdit->setEnabled(enabled); +} + void mirrorDlg::saveJson(const QString &fileName){ QJsonObject jDoc, jMirror,jIgram, jEllipse, jAnnulus; jDoc["name"] = m_name; @@ -211,6 +218,7 @@ void mirrorDlg::loadFile(QString & fileName){ // clear ellipse in case this is an old config that does not have it. ui->ellipseShape->setChecked(false); + setEllipseControlsEnabled(false); m_outlineShape = CIRCLE; QFileInfo info(fileName); QSettings settings; @@ -286,6 +294,7 @@ void mirrorDlg::loadFile(QString & fileName){ ui->z8->setText(QString().number(z8)); ui->ellipseShape->setChecked(m_outlineShape == ELLIPSE); + setEllipseControlsEnabled(m_outlineShape == ELLIPSE); ui->minorAxisEdit->setText(QString::number(m_verticalAxis)); @@ -418,6 +427,7 @@ void mirrorDlg::loadFile(QString & fileName){ file.read(buf,4); m_outlineShape = *(outlineShape*)buf; ui->ellipseShape->setChecked(m_outlineShape == ELLIPSE); + setEllipseControlsEnabled(m_outlineShape == ELLIPSE); } // vertical axis @@ -707,6 +717,8 @@ void mirrorDlg::on_ellipseShape_clicked(bool checked) if (checked) m_outlineShape = ELLIPSE; else m_outlineShape = CIRCLE; + setEllipseControlsEnabled(checked); + if (m_verticalAxis == 0){ m_verticalAxis = diameter; ui->minorAxisEdit->setText(QString().number(m_verticalAxis)); diff --git a/mirrordlg.h b/mirrordlg.h index a810e1e8..77de1274 100644 --- a/mirrordlg.h +++ b/mirrordlg.h @@ -136,6 +136,7 @@ private slots: private: explicit mirrorDlg(QWidget *parent = 0); void setclearAp(); + void setEllipseControlsEnabled(bool enabled); Ui::mirrorDlg *ui; bool m_aperatureReductionValueChanged; From 7dddf2cdf2dbd1e51dfa113ccc751600aa09d900 Mon Sep 17 00:00:00 2001 From: Julien STAUB Date: Thu, 6 Aug 2026 10:53:41 +0200 Subject: [PATCH 2/2] check ellispe is always is same direction --- mirrordlg.cpp | 23 +++++++++++++++++++++++ mirrordlg.h | 1 + surfacemanager.cpp | 7 +++++++ 3 files changed, 31 insertions(+) diff --git a/mirrordlg.cpp b/mirrordlg.cpp index 82e2aca0..21d37106 100644 --- a/mirrordlg.cpp +++ b/mirrordlg.cpp @@ -116,6 +116,7 @@ mirrorDlg::mirrorDlg(QWidget *parent) : ui->ellipseShape->setChecked(m_outlineShape == ELLIPSE); setEllipseControlsEnabled(m_outlineShape == ELLIPSE); ui->minorAxisEdit->setText(QString().number(m_verticalAxis)); + enforceEllipseMajorAxis(); ui->diameter->setText(QString("%1").arg(diameter, 6, 'f', 2)); ui->obs->setText(QString("%1").arg(obs, 6, 'f', 2)); ui->FNumber->blockSignals(false); @@ -151,6 +152,21 @@ void mirrorDlg::setEllipseControlsEnabled(bool enabled) ui->minorAxisEdit->setEnabled(enabled); } +void mirrorDlg::enforceEllipseMajorAxis() +{ + if (m_outlineShape != ELLIPSE || diameter <= 0) + return; + + if (m_verticalAxis > diameter){ + const double originalVerticalAxis = m_verticalAxis; + m_verticalAxis = diameter; + const QSignalBlocker blocker(ui->minorAxisEdit); + ui->minorAxisEdit->setText(QString::number(m_verticalAxis)); + spdlog::get("logger")->info("Ellipse axis clamp applied: vertical axis {} exceeded horizontal axis {}. Vertical axis was clamped to {}.", + originalVerticalAxis, diameter, m_verticalAxis); + } +} + void mirrorDlg::saveJson(const QString &fileName){ QJsonObject jDoc, jMirror,jIgram, jEllipse, jAnnulus; jDoc["name"] = m_name; @@ -297,6 +313,7 @@ void mirrorDlg::loadFile(QString & fileName){ setEllipseControlsEnabled(m_outlineShape == ELLIPSE); ui->minorAxisEdit->setText(QString::number(m_verticalAxis)); + enforceEllipseMajorAxis(); FNumber = roc/(2. * diameter); ui->FNumber->blockSignals(true); @@ -435,6 +452,7 @@ void mirrorDlg::loadFile(QString & fileName){ file.read(buf,8); m_verticalAxis = *(double*)buf; ui->minorAxisEdit->setText(QString::number(m_verticalAxis)); + enforceEllipseMajorAxis(); } FNumber = roc/(2. * diameter); @@ -472,6 +490,7 @@ void mirrorDlg::on_diameter_textChanged(const QString &arg1) { ui->minorAxisEdit->setText(QString().number(m_verticalAxis)); } diameter = diam; + enforceEllipseMajorAxis(); FNumber = roc/(2. * diameter); ui->FNumber->blockSignals(true); ui->FNumber->setText(QString("%1").arg(FNumber, 6, 'f', 2)); @@ -492,6 +511,7 @@ void mirrorDlg::on_diameter_Changed(const double diam) ui->minorAxisEdit->setText(QString().number(m_verticalAxis)); } diameter = diam ; + enforceEllipseMajorAxis(); FNumber = roc/(2. * diameter); ui->FNumber->blockSignals(true); const QSignalBlocker blocker(ui->diameter); @@ -704,11 +724,13 @@ void mirrorDlg::on_minorAxisEdit_textChanged(const QString &arg1) { m_verticalAxis = arg1.toDouble(); + enforceEllipseMajorAxis(); } void mirrorDlg::setMinorAxis(double val){ m_verticalAxis = val; ui->minorAxisEdit->setText(QString::number(val)); + enforceEllipseMajorAxis(); //on_minorAxisEdit_textChanged( QString::number(val)); } @@ -723,6 +745,7 @@ void mirrorDlg::on_ellipseShape_clicked(bool checked) m_verticalAxis = diameter; ui->minorAxisEdit->setText(QString().number(m_verticalAxis)); } + enforceEllipseMajorAxis(); } diff --git a/mirrordlg.h b/mirrordlg.h index 77de1274..38c1ce16 100644 --- a/mirrordlg.h +++ b/mirrordlg.h @@ -137,6 +137,7 @@ private slots: explicit mirrorDlg(QWidget *parent = 0); void setclearAp(); void setEllipseControlsEnabled(bool enabled); + void enforceEllipseMajorAxis(); Ui::mirrorDlg *ui; bool m_aperatureReductionValueChanged; diff --git a/surfacemanager.cpp b/surfacemanager.cpp index 228f2e35..0203bc7b 100644 --- a/surfacemanager.cpp +++ b/surfacemanager.cpp @@ -1407,6 +1407,13 @@ wavefront * SurfaceManager::readWaveFront(const QString &fileName){ } } + + if (md->isEllipse() && md->m_verticalAxis > md->diameter){ + spdlog::get("logger")->info("Wavefront load ellipse axis clamp: vertical axis {} exceeded horizontal axis {}. Vertical axis was clamped to {}.", + md->m_verticalAxis, md->diameter, md->diameter); + md->setMinorAxis(md->diameter); + } + wf->diameter = diam; wf->roc = roc; wf->lambda = lambda;