From f10ccfc0fbe416fc853da6057bd51fd4e90c86f3 Mon Sep 17 00:00:00 2001 From: Ajinkya Dahale Date: Tue, 8 Mar 2022 05:28:01 -0500 Subject: [PATCH] [Sketcher] Safeguard against spurious pre-selection Preselection is sometimes not updated under some circumstances 1. when deleting an object through python; 2. before autoconstraint when deleting previous pole in bspline creation mode. When the preselected curve is the deleted object, segfault/crash can happen. --- src/Mod/Sketcher/Gui/DrawSketchHandler.cpp | 13 ++++++++----- .../Sketcher/Gui/EditModeGeometryCoinManager.cpp | 4 +++- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp b/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp index 2edd655d94..d67bda66fc 100644 --- a/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp +++ b/src/Mod/Sketcher/Gui/DrawSketchHandler.cpp @@ -411,12 +411,15 @@ int DrawSketchHandler::seekAutoConstraint(std::vector &suggested if (preSelPnt != -1) sketchgui->getSketchObject()->getGeoVertexIndex(preSelPnt, GeoId, PosId); else if (preSelCrv != -1){ - GeoId = preSelCrv; - const Part::Geometry *geom = sketchgui->getSketchObject()->getGeometry(GeoId); + const Part::Geometry *geom = sketchgui->getSketchObject()->getGeometry(preSelCrv); - if(geom->getTypeId() == Part::GeomLineSegment::getClassTypeId()){ - const Part::GeomLineSegment *line = static_cast(geom); - hitShapeDir= line->getEndPoint()-line->getStartPoint(); + // ensure geom exists in case object was called before preselection is updated + if (geom) { + GeoId = preSelCrv; + if (geom->getTypeId() == Part::GeomLineSegment::getClassTypeId()) { + const Part::GeomLineSegment *line = static_cast(geom); + hitShapeDir= line->getEndPoint()-line->getStartPoint(); + } } } diff --git a/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.cpp b/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.cpp index 6c145101b0..5dae35b766 100644 --- a/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.cpp +++ b/src/Mod/Sketcher/Gui/EditModeGeometryCoinManager.cpp @@ -303,7 +303,9 @@ void EditModeGeometryCoinManager::updateGeometryColor(const GeoListFacade & geol } else if (preselectpoint != -1) { preselectpointmfid = coinMapping.getIndexLayer(preselectpoint); - if (l == preselectpointmfid.layerId && preselectpointmfid.fieldIndex < PtNum) + if (MultiFieldId::Invalid != preselectpointmfid && + preselectpointmfid.layerId == l && + preselectpointmfid.fieldIndex < PtNum) pcolor[preselectpointmfid.fieldIndex] = drawingParameters.PreselectColor; }