From 94c2d4fff134f7bca071573ad5ddf7e470776142 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Mon, 1 Apr 2024 14:57:38 -0400 Subject: [PATCH] [TD]fix fail on corrupt dimension reference --- src/Mod/TechDraw/App/DrawViewDimension.cpp | 131 +++++++++++++++++++-- src/Mod/TechDraw/App/DrawViewDimension.h | 2 + 2 files changed, 120 insertions(+), 13 deletions(-) diff --git a/src/Mod/TechDraw/App/DrawViewDimension.cpp b/src/Mod/TechDraw/App/DrawViewDimension.cpp index af497d6a1c..1b4d83be62 100644 --- a/src/Mod/TechDraw/App/DrawViewDimension.cpp +++ b/src/Mod/TechDraw/App/DrawViewDimension.cpp @@ -446,7 +446,7 @@ App::DocumentObjectExecReturn* DrawViewDimension::execute() { // Base::Console().Message("DVD::execute() - %s\n", getNameInDocument()); if (!okToProceed()) { - return App::DocumentObject::StdReturn; + return new App::DocumentObjectExecReturn("Dimension could not execute"); } resetLinear(); @@ -479,13 +479,6 @@ App::DocumentObjectExecReturn* DrawViewDimension::execute() // references are good, we can proceed m_referencesCorrect = true; - // is this check still relevant or is it replace by the autocorrect and - // validate methods? - if (References3D.getValues().empty() && !checkReferences2D()) { - Base::Console().Warning("%s has invalid 2D References\n", getNameInDocument()); - return new App::DocumentObjectExecReturn("Dimension object has invalid 2d references"); - } - // we have either or both valid References3D and References2D ReferenceVector references = getEffectiveReferences(); @@ -544,7 +537,8 @@ bool DrawViewDimension::okToProceed() if (!has2DReferences() && !has3DReferences()) { // no references, can't do anything - return App::DocumentObject::StdReturn; + Base::Console().Warning("Dimension object has no valid references\n"); + return false; } if (!getViewPart()->hasGeometry()) { @@ -552,7 +546,13 @@ bool DrawViewDimension::okToProceed() return false; } - return true; + // is this check still relevant or is it replaced by the autocorrect and + // validate methods? + if (References3D.getValues().empty() && !checkReferences2D()) { + Base::Console().Warning("%s has invalid 2D References\n", getNameInDocument()); + return false; + } + return validateReferenceForm(); } bool DrawViewDimension::isMultiValueSchema() const @@ -1451,8 +1451,8 @@ bool DrawViewDimension::hasBroken3dReferences() const void DrawViewDimension::updateSavedGeometry() { - // Base::Console().Message("DVD::updateSavedGeometry() - %s - savedGeometry: %d\n", - // getNameInDocument(), SavedGeometry.getValues().size()); + // Base::Console().Message("DVD::updateSavedGeometry() - %s - savedGeometry: %d\n", + // getNameInDocument(), SavedGeometry.getValues().size()); ReferenceVector references = getEffectiveReferences(); if (references.empty()) { // no references to save @@ -1624,6 +1624,108 @@ void DrawViewDimension::setAll3DMeasurement() } } +//! check the effective references have the correct number and type for this +//! dimension. +bool DrawViewDimension::validateReferenceForm() const +{ + // we have either or both valid References3D and References2D + ReferenceVector references = getEffectiveReferences(); + if (references.empty()) { + return false; + } + + if (Type.isValue("Distance") || Type.isValue("DistanceX") || Type.isValue("DistanceY")) { + if (getRefType() == oneEdge) { + if (references.size() != 1) { + return false; + } + std::string subGeom = DrawUtil::getGeomTypeFromName(references.front().getSubName()); + if (subGeom != "Edge") { + return false; + } + return true; + } + else if (getRefType() == twoEdge) { + if (references.size() != 2) { + return false; + } + std::string subGeom0 = DrawUtil::getGeomTypeFromName(references.front().getSubName()); + std::string subGeom1 = DrawUtil::getGeomTypeFromName(references.back().getSubName()); + if (subGeom0 != "Edge" || subGeom1 != "Edge") { + return false; + } + return true; + } + else if (getRefType() == twoVertex) { + if (references.size() != 2) { + return false; + } + std::string subGeom0 = DrawUtil::getGeomTypeFromName(references.front().getSubName()); + std::string subGeom1 = DrawUtil::getGeomTypeFromName(references.back().getSubName()); + if (subGeom0 != "Vertex" || subGeom1 != "Vertex") { + return false; + } + return true; + } + else if (getRefType() == vertexEdge) { + if (references.size() != 2) { + return false; + } + std::string subGeom0 = DrawUtil::getGeomTypeFromName(references.front().getSubName()); + std::string subGeom1 = DrawUtil::getGeomTypeFromName(references.back().getSubName()); + if ( (subGeom0 == "Vertex" && subGeom1 == "Edge") || + (subGeom0 == "Edge" && subGeom1 == "Vertex") ) { + return true; + } + return false; + } + } + else if (Type.isValue("Radius")) { + if (references.size() != 1) { + return false; + } + std::string subGeom = DrawUtil::getGeomTypeFromName(references.front().getSubName()); + if (subGeom != "Edge") { + return false; + } + return true; + } + else if (Type.isValue("Diameter")) { + if (references.size() != 1) { + return false; + } + std::string subGeom = DrawUtil::getGeomTypeFromName(references.front().getSubName()); + if (subGeom != "Edge") { + return false; + } + return true; + } + else if (Type.isValue("Angle")) { + if (references.size() != 2) { + return false; + } + std::string subGeom0 = DrawUtil::getGeomTypeFromName(references.front().getSubName()); + std::string subGeom1 = DrawUtil::getGeomTypeFromName(references.back().getSubName()); + if (subGeom0 != "Edge" || subGeom1 != "Edge") { + return false; + } + return true; + } + else if (Type.isValue("Angle3Pt")) { + if (references.size() != 3) { + return false; + } + std::string subGeom0 = DrawUtil::getGeomTypeFromName(references.at(0).getSubName()); + std::string subGeom1 = DrawUtil::getGeomTypeFromName(references.at(1).getSubName()); + std::string subGeom2 = DrawUtil::getGeomTypeFromName(references.at(2).getSubName()); + if (subGeom0 != "Vertex" || subGeom1 != "Vertex" || subGeom2 != "Vertex") { + return false; + } + return true; + } + return false; +} + // delete all previous measurements void DrawViewDimension::clear3DMeasurements() { @@ -1862,5 +1964,8 @@ Base::BoundBox3d DrawViewDimension::getSavedBox() Base::BoundBox3d DrawViewDimension::getFeatureBox() { - return getViewPart()->getBoundingBox(); + if (getViewPart() && getViewPart()->getBoundingBox().IsValid()) { + return getViewPart()->getBoundingBox(); + } + return Base::BoundBox3d(); } diff --git a/src/Mod/TechDraw/App/DrawViewDimension.h b/src/Mod/TechDraw/App/DrawViewDimension.h index 67987b8beb..babc4de683 100644 --- a/src/Mod/TechDraw/App/DrawViewDimension.h +++ b/src/Mod/TechDraw/App/DrawViewDimension.h @@ -237,6 +237,8 @@ protected: bool okToProceed(); void updateSavedGeometry(); + bool validateReferenceForm() const; + private: static const char* TypeEnums[]; static const char* MeasureTypeEnums[];