From a46d84aa2ebeeda63f17c5248b99960f15626abb Mon Sep 17 00:00:00 2001 From: wandererfan Date: Mon, 2 Jun 2025 22:40:17 -0400 Subject: [PATCH] [TD]fix dim reference repair --- src/Mod/TechDraw/Gui/TaskDimRepair.cpp | 46 ++++++++++++++++---------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/Mod/TechDraw/Gui/TaskDimRepair.cpp b/src/Mod/TechDraw/Gui/TaskDimRepair.cpp index aaa73f94e8..6c0ff02956 100644 --- a/src/Mod/TechDraw/Gui/TaskDimRepair.cpp +++ b/src/Mod/TechDraw/Gui/TaskDimRepair.cpp @@ -70,12 +70,13 @@ void TaskDimRepair::setUiPrimary() ui->leName->setText(QString::fromStdString(m_dim->getNameInDocument())); ui->leLabel->setText(QString::fromStdString(m_dim->Label.getValue())); - std::string objName = m_dim->getViewPart()->getNameInDocument(); - std::string objLabel = m_dim->getViewPart()->Label.getValue(); + DrawViewPart* viewPart = m_dim->getViewPart(); + std::string objName = viewPart ? viewPart->getNameInDocument() : ""; + std::string objLabel = viewPart ? viewPart->Label.getValue() : ""; ui->leObject2d->setText(QString::fromStdString(objName + " / " + objLabel)); const std::vector& subElements2d = m_dim->References2D.getSubValues(); - std::vector noLabels(subElements2d.size()); - fillList(ui->lwGeometry2d, subElements2d, noLabels); + std::vector labelsInOut(subElements2d.size()); + fillList(ui->lwGeometry2d, labelsInOut, subElements2d); QStringList headers; headers << tr("Object Name") << tr("Object Label") << tr("SubElement"); @@ -119,11 +120,14 @@ void TaskDimRepair::slotUseSelection() ReferenceVector references2d; ReferenceVector references3d; TechDraw::DrawViewPart* dvp = TechDraw::getReferencesFromSelection(references2d, references3d); - if (dvp != m_saveDvp) { - QMessageBox::warning(Gui::getMainWindow(), - QObject::tr("Incorrect Selection"), - QObject::tr("Can not use references from a different View")); - return; + if (dvp != m_saveDvp) { + int ret = QMessageBox::warning(Gui::getMainWindow(), + QObject::tr("Incorrect Selection?"), + QObject::tr("This will change the dimension's owner view. Continue?"), + QMessageBox::Cancel | QMessageBox::Ok); + if (ret == QMessageBox::Cancel) { + return; + } } StringVector acceptableGeometry({ "Edge", "Vertex", "Face" }); @@ -161,16 +165,24 @@ void TaskDimRepair::slotUseSelection() void TaskDimRepair::updateUi() { - std::string objName = m_dim->getViewPart()->getNameInDocument(); - std::string objLabel = m_dim->getViewPart()->Label.getValue(); + // if the dimension is very broken, it may not have a valid 2d view reference. This can happen if the + // restore process breaks and the reference target object does not get properly loaded. + + DrawViewPart* viewPart = m_dim->getViewPart(); + if (!viewPart && !m_toApply2d.empty()) { + viewPart = Base::freecad_cast(m_toApply2d.front().getObject()); + } + + std::string objName = viewPart ? viewPart->getNameInDocument() : ""; + std::string objLabel = viewPart ? viewPart->Label.getValue() : ""; ui->leObject2d->setText(QString::fromStdString(objName + " / " + objLabel)); std::vector subElements2d; for (auto& ref : m_toApply2d) { subElements2d.push_back(ref.getSubName()); } - std::vector noLabels(subElements2d.size()); - fillList(ui->lwGeometry2d, subElements2d, noLabels); + std::vector labelsInOut(subElements2d.size()); + fillList(ui->lwGeometry2d, labelsInOut, subElements2d); loadTableWidget(ui->twReferences3d, m_toApply3d); } @@ -218,12 +230,12 @@ void TaskDimRepair::fillList(QListWidget* lwItems, std::vector labe } void TaskDimRepair::replaceReferences() { - if (!m_dim) { + if (!m_dim || m_toApply2d.empty()) { return; } - if (!m_toApply2d.empty()) { - m_dim->setReferences2d(m_toApply2d); - } + + m_dim->setReferences2d(m_toApply2d); + if (!m_toApply3d.empty()) { m_dim->setReferences3d(m_toApply3d); }