diff --git a/mirrordlg.cpp b/mirrordlg.cpp index 95403981..21d37106 100644 --- a/mirrordlg.cpp +++ b/mirrordlg.cpp @@ -114,7 +114,9 @@ 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)); + 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); @@ -144,6 +146,27 @@ double mirrorDlg::getMinorAxis(){ bool mirrorDlg::isEllipse(){ return m_outlineShape == ELLIPSE; } + +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; @@ -211,6 +234,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,8 +310,10 @@ 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)); + enforceEllipseMajorAxis(); FNumber = roc/(2. * diameter); ui->FNumber->blockSignals(true); @@ -418,6 +444,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 @@ -425,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); @@ -462,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)); @@ -482,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); @@ -694,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)); } @@ -707,10 +739,13 @@ 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)); } + enforceEllipseMajorAxis(); } diff --git a/mirrordlg.h b/mirrordlg.h index a810e1e8..38c1ce16 100644 --- a/mirrordlg.h +++ b/mirrordlg.h @@ -136,6 +136,8 @@ private slots: private: 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;