diff --git a/src/Mod/TechDraw/App/DrawBrokenView.cpp b/src/Mod/TechDraw/App/DrawBrokenView.cpp index 09d0bd49da..c44b216f94 100644 --- a/src/Mod/TechDraw/App/DrawBrokenView.cpp +++ b/src/Mod/TechDraw/App/DrawBrokenView.cpp @@ -350,7 +350,7 @@ std::pair DrawBrokenView::breakPointsFromObj(con } TopoDS_Shape locShape = ShapeExtractor::getLocatedShape(&breakObj); - if (locShape.ShapeType() == TopAbs_EDGE) { + if (!locShape.IsNull() && locShape.ShapeType() == TopAbs_EDGE) { return breakPointsFromEdge(breakObj); } return {Base::Vector3d(), Base::Vector3d()}; @@ -383,7 +383,7 @@ bool DrawBrokenView::isBreakObject(const App::DocumentObject& breakObj) return isBreakObjectSketch(breakObj); } TopoDS_Shape locShape = ShapeExtractor::getLocatedShape(&breakObj); - if (locShape.ShapeType() == TopAbs_EDGE) { + if (!locShape.IsNull() && locShape.ShapeType() == TopAbs_EDGE) { // TODO: add check for vertical or horizontal? return true; } @@ -397,6 +397,9 @@ bool DrawBrokenView::isBreakObjectSketch(const App::DocumentObject& breakObj) { // Base::Console().Message("DBV::isBreakObjectSketch()\n"); TopoDS_Shape locShape = ShapeExtractor::getLocatedShape(&breakObj); + if (locShape.IsNull()) { + return false; + } // get the edges from the shape. std::vector sketchEdges; @@ -421,6 +424,9 @@ std::pair DrawBrokenView::breakPointsFromSketch( { // Base::Console().Message("DBV::breakPointsFromSketch()\n"); TopoDS_Shape locShape = ShapeExtractor::getLocatedShape(&breakObj); + if (locShape.IsNull()) { + return {Base::Vector3d(), Base::Vector3d()};; + } // get the edges from the shape. // vertical or horizontal @@ -457,7 +463,7 @@ std::pair DrawBrokenView::breakPointsFromSketch( std::pair DrawBrokenView::breakPointsFromEdge(const App::DocumentObject& breakObj) const { TopoDS_Shape locShape = ShapeExtractor::getLocatedShape(&breakObj); - if (locShape.ShapeType() != TopAbs_EDGE) { + if (locShape.IsNull() || locShape.ShapeType() != TopAbs_EDGE) { return {Base::Vector3d(), Base::Vector3d()}; } @@ -478,7 +484,7 @@ std::pair DrawBrokenView::breakBoundsFromObj(con } TopoDS_Shape locShape = ShapeExtractor::getLocatedShape(&breakObj); - if (locShape.ShapeType() == TopAbs_EDGE) { + if (!locShape.IsNull() && locShape.ShapeType() == TopAbs_EDGE) { auto unscaled = breakBoundsFromEdge(breakObj); return scalePair(unscaled); } @@ -520,7 +526,7 @@ std::pair DrawBrokenView::breakBoundsFromEdge(co { // Base::Console().Message("DBV::breakBoundsFromEdge()\n"); TopoDS_Shape locShape = ShapeExtractor::getLocatedShape(&breakObj); - if (locShape.ShapeType() != TopAbs_EDGE) { + if (locShape.IsNull() || locShape.ShapeType() != TopAbs_EDGE) { return {Base::Vector3d(), Base::Vector3d()}; } @@ -566,7 +572,7 @@ double DrawBrokenView::breaklineLength(const App::DocumentObject& breakObj) cons } TopoDS_Shape locShape = ShapeExtractor::getLocatedShape(&breakObj); - if (locShape.ShapeType() == TopAbs_EDGE) { + if (!locShape.IsNull() && locShape.ShapeType() == TopAbs_EDGE) { return breaklineLengthFromEdge(breakObj); } return 0.0; @@ -577,7 +583,9 @@ double DrawBrokenView::breaklineLengthFromSketch(const App::DocumentObject& brea { // Base::Console().Message("DBV::breaklineLengthFromSketch()\n"); TopoDS_Shape locShape = ShapeExtractor::getLocatedShape(&breakObj); - + if (locShape.IsNull()) { + return 0; + } // get the edges from the sketch std::vector sketchEdges; TopExp_Explorer expl(locShape, TopAbs_EDGE); @@ -615,7 +623,7 @@ double DrawBrokenView::breaklineLengthFromEdge(const App::DocumentObject& breakO { // Base::Console().Message("DBV::breaklineLengthFromEdge()\n"); TopoDS_Shape locShape = ShapeExtractor::getLocatedShape(&breakObj); - if (locShape.ShapeType() != TopAbs_EDGE) { + if (!locShape.IsNull() && locShape.ShapeType() != TopAbs_EDGE) { return 0.0; } // the breakline could be very long. do we need a max breakline length? diff --git a/src/Mod/TechDraw/Gui/Command.cpp b/src/Mod/TechDraw/Gui/Command.cpp index b814960a2c..397b5438e0 100644 --- a/src/Mod/TechDraw/Gui/Command.cpp +++ b/src/Mod/TechDraw/Gui/Command.cpp @@ -459,10 +459,17 @@ void CmdTechDrawBrokenView::activated(int iMsg) App::DocumentObject* faceObj = nullptr; std::string faceName; getSelectedShapes(this, shapes, xShapes, faceObj, faceName); + if (shapes.empty() && + xShapes.empty()) { + QMessageBox::warning(Gui::getMainWindow(), QObject::tr("Empty selection"), + QObject::tr("Please select objects to break and break objects.")); + return; + } // pick the Break objects out of the selected pile std::vector selection = getSelection().getSelectionEx( nullptr, App::DocumentObject::getClassTypeId(), Gui::ResolveMode::NoResolve); + std::vector breakObjects; for (auto& selObj : selection) { auto temp = selObj.getObject();