From d611611055695f75a39527989224d3fb1cc51a48 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Wed, 17 Apr 2024 10:09:10 -0400 Subject: [PATCH] [TD]fix crash on corrupt reference --- src/Mod/TechDraw/App/DimensionReferences.cpp | 10 ++++++- src/Mod/TechDraw/App/DrawUtil.cpp | 3 +- src/Mod/TechDraw/App/DrawViewPart.cpp | 31 +++++++------------- 3 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/Mod/TechDraw/App/DimensionReferences.cpp b/src/Mod/TechDraw/App/DimensionReferences.cpp index 9f82c903be7a..0cc62c842381 100644 --- a/src/Mod/TechDraw/App/DimensionReferences.cpp +++ b/src/Mod/TechDraw/App/DimensionReferences.cpp @@ -106,14 +106,23 @@ TopoDS_Shape ReferenceEntry::getGeometry() const // getVertex throws on not found, but we want to return null // shape auto vgeom = dvp->getVertex(getSubName()); + if (!vgeom) { + return {}; + } return vgeom->getOCCVertex(); } if (gType == "Edge") { auto egeom = dvp->getEdge(getSubName()); + if (!egeom) { + return {}; + } return egeom->getOCCEdge(); } if (gType == "Face") { auto fgeom = dvp->getFace(getSubName()); + if (!fgeom) { + return {}; + } return fgeom->toOccFace(); } } @@ -123,7 +132,6 @@ TopoDS_Shape ReferenceEntry::getGeometry() const } } - // Base::Console().Message("RE::getGeometry - getting 2d geometry\n"); Part::TopoShape shape = Part::Feature::getTopoShape(getObject()); auto geoFeat = dynamic_cast(getObject()); if (geoFeat) { diff --git a/src/Mod/TechDraw/App/DrawUtil.cpp b/src/Mod/TechDraw/App/DrawUtil.cpp index 0a35130312c1..b28bb8cd673c 100644 --- a/src/Mod/TechDraw/App/DrawUtil.cpp +++ b/src/Mod/TechDraw/App/DrawUtil.cpp @@ -1836,7 +1836,8 @@ std::string DrawUtil::translateArbitrary(std::string context, std::string baseNa bool DrawUtil::isCosmeticVertex(App::DocumentObject* owner, std::string element) { auto ownerView = static_cast(owner); - auto vertex = ownerView->getVertex(element); + auto vertexIndex = DrawUtil::getIndexFromName(element); + auto vertex = ownerView->getProjVertexByIndex(vertexIndex); if (vertex) { return vertex->getCosmetic(); } diff --git a/src/Mod/TechDraw/App/DrawViewPart.cpp b/src/Mod/TechDraw/App/DrawViewPart.cpp index 14cc5ecc87dd..f2876419bb19 100644 --- a/src/Mod/TechDraw/App/DrawViewPart.cpp +++ b/src/Mod/TechDraw/App/DrawViewPart.cpp @@ -774,18 +774,10 @@ const std::vector DrawViewPart::getVertexGeometry() const //! TechDraw vertex names run from 0 to n-1 TechDraw::VertexPtr DrawViewPart::getVertex(std::string vertexName) const { - const std::vector allVertex(DrawViewPart::getVertexGeometry()); - size_t iTarget = DrawUtil::getIndexFromName(vertexName); - if (allVertex.empty()) { - //should not happen - throw Base::IndexError("DVP::getVertex - No vertices found."); - } - if (iTarget >= allVertex.size()) { - //should not happen - throw Base::IndexError("DVP::getVertex - Vertex not found."); - } - - return allVertex.at(iTarget); + // Base::Console().Message("DVP::getVertex(%s)\n", vertexName.c_str()); + auto vertexIndex = DrawUtil::getIndexFromName(vertexName); + auto vertex = getProjVertexByIndex(vertexIndex); + return vertex; } //! returns existing BaseGeom of 2D Edge @@ -795,11 +787,11 @@ TechDraw::BaseGeomPtr DrawViewPart::getEdge(std::string edgeName) const const std::vector& geoms = getEdgeGeometry(); if (geoms.empty()) { //should not happen - throw Base::IndexError("DVP::getEdge - No edges found."); + return nullptr; } size_t iEdge = DrawUtil::getIndexFromName(edgeName); if ((unsigned)iEdge >= geoms.size()) { - throw Base::IndexError("DVP::getEdge - Edge not found."); + return nullptr; } return geoms.at(iEdge); } @@ -812,11 +804,11 @@ TechDraw::FacePtr DrawViewPart::getFace(std::string faceName) const const std::vector& faces = getFaceGeometry(); if (faces.empty()) { //should not happen - throw Base::IndexError("DVP::getFace - No faces found."); + return nullptr; } size_t iFace = DrawUtil::getIndexFromName(faceName); if (iFace >= faces.size()) { - throw Base::IndexError("DVP::getFace - Face not found."); + return nullptr; } return faces.at(iFace); } @@ -846,9 +838,7 @@ TechDraw::BaseGeomPtr DrawViewPart::getGeomByIndex(int idx) const if (geoms.empty()) { return nullptr; } - if ((unsigned)idx >= geoms.size()) { - Base::Console().Error("DVP::getGeomByIndex(%d) - invalid index - size: %d\n", idx, - geoms.size()); + if (idx >= (int)geoms.size()) { return nullptr; } return geoms.at(idx); @@ -859,10 +849,9 @@ TechDraw::VertexPtr DrawViewPart::getProjVertexByIndex(int idx) const { const std::vector& geoms = getVertexGeometry(); if (geoms.empty()) { - return nullptr; + return nullptr; } if ((unsigned)idx >= geoms.size()) { - Base::Console().Error("DVP::getProjVertexByIndex(%d) - invalid index - size: %d\n", idx); return nullptr; } return geoms.at(idx);