Skip to content

Commit

Permalink
[TD]fix crash on corrupt reference
Browse files Browse the repository at this point in the history
  • Loading branch information
WandererFan committed Apr 17, 2024
1 parent 6d504a0 commit d611611
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 23 deletions.
10 changes: 9 additions & 1 deletion src/Mod/TechDraw/App/DimensionReferences.cpp
Expand Up @@ -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();
}
}
Expand All @@ -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<App::GeoFeature*>(getObject());
if (geoFeat) {
Expand Down
3 changes: 2 additions & 1 deletion src/Mod/TechDraw/App/DrawUtil.cpp
Expand Up @@ -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<TechDraw::DrawViewPart*>(owner);
auto vertex = ownerView->getVertex(element);
auto vertexIndex = DrawUtil::getIndexFromName(element);
auto vertex = ownerView->getProjVertexByIndex(vertexIndex);
if (vertex) {
return vertex->getCosmetic();
}
Expand Down
31 changes: 10 additions & 21 deletions src/Mod/TechDraw/App/DrawViewPart.cpp
Expand Up @@ -774,18 +774,10 @@ const std::vector<TechDraw::VertexPtr> DrawViewPart::getVertexGeometry() const
//! TechDraw vertex names run from 0 to n-1
TechDraw::VertexPtr DrawViewPart::getVertex(std::string vertexName) const
{
const std::vector<TechDraw::VertexPtr> 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
Expand All @@ -795,11 +787,11 @@ TechDraw::BaseGeomPtr DrawViewPart::getEdge(std::string edgeName) const
const std::vector<TechDraw::BaseGeomPtr>& 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);
}
Expand All @@ -812,11 +804,11 @@ TechDraw::FacePtr DrawViewPart::getFace(std::string faceName) const
const std::vector<TechDraw::FacePtr>& 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);
}
Expand Down Expand Up @@ -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);
Expand All @@ -859,10 +849,9 @@ TechDraw::VertexPtr DrawViewPart::getProjVertexByIndex(int idx) const
{
const std::vector<TechDraw::VertexPtr>& 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);
Expand Down

0 comments on commit d611611

Please sign in to comment.