diff --git a/src/Mod/Sketcher/App/SketchObject.cpp b/src/Mod/Sketcher/App/SketchObject.cpp index e30ced754c..7acdc2b6f3 100644 --- a/src/Mod/Sketcher/App/SketchObject.cpp +++ b/src/Mod/Sketcher/App/SketchObject.cpp @@ -11351,26 +11351,72 @@ Data::IndexedName SketchObject::checkSubName(const char *subname) const{ bio::stream iss(mappedSubname+1, std::strlen(mappedSubname+1)); int id = -1; - switch(mappedSubname[0]) { - case '\0': // check length != 0 + bool valid = false; + switch (mappedSubname[0]) { + case '\0': // check length != 0 + break; + + case 'g': // = geometry + case 'e': // = external geometry + if (iss >> id) { + valid = true; + } + break; + + // for RootPoint, H_Axis, V_Axis + default: { + const char* dot = strchr(mappedSubname, '.'); + if (dot) { + mappedSubname = dot + 1; + } + return Data::IndexedName(mappedSubname, types, false); + } + } + + if (!valid) { FC_ERR("invalid subname " << subname); - break; + return Data::IndexedName(); + } - case 'g': // = geometry - case 'e': // = external geometry - if(!(iss>>id)) - FC_ERR("invalid subname " << subname); - break; - - // for RootPoint, H_Axis, V_Axis - default: { - const char *dot = strchr(mappedSubname,'.'); - if(dot) - mappedSubname = dot+1; - return Data::IndexedName(mappedSubname, types, false); - }} - - // TNP July '24: omitted code related to external and internal sketcher stuff implemented in LS3 + int geoId; + const Part::Geometry* geo = 0; + switch (mappedSubname[0]) { + case 'g': { + auto it = geoMap.find(id); + if (it != geoMap.end()) { + geoId = it->second; + geo = getGeometry(geoId); + } + break; + } + case 'e': { + auto it = externalGeoMap.find(id); + if (it != externalGeoMap.end()) { + geoId = -it->second - 1; + geo = getGeometry(geoId); + } + break; + } + } + if (geo && GeometryFacade::getId(geo) == id) { + char sep; + int posId = static_cast(PointPos::none); + if ((iss >> sep >> posId) && sep == 'v') { + int idx = getVertexIndexGeoPos(geoId, static_cast(posId)); + if (idx < 0) { + FC_ERR("invalid subname " << subname); + return Data::IndexedName(); + } + return Data::IndexedName::fromConst("Vertex", idx + 1); + } + else if (geoId >= 0) { + return Data::IndexedName::fromConst("Edge", geoId + 1); + } + else { + return Data::IndexedName::fromConst("ExternalEdge", -geoId - 2); + } + } + FC_ERR("cannot find subname " << subname); return Data::IndexedName(); } diff --git a/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp index 95d88cf886..c062242de9 100644 --- a/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp +++ b/src/Mod/Sketcher/Gui/TaskSketcherElements.cpp @@ -1452,6 +1452,7 @@ void TaskSketcherElements::onSelectionChanged(const Gui::SelectionChanges& msg) static_cast(ui->listWidgetElements->item(i)); if (item->ElementNbr == ElementId) { item->isLineSelected = select; + modified_item = item; break; } }