From a2736e8a37d0fafb88b5b612aadffe66616932a1 Mon Sep 17 00:00:00 2001 From: Bas Ruigrok Date: Wed, 28 Aug 2024 19:17:54 +0200 Subject: [PATCH] Move splitSubName from AssemblyObject to Base::Tools --- src/Base/Tools.cpp | 21 +++++++++++++++ src/Base/Tools.h | 2 ++ src/Mod/Assembly/App/AssemblyObject.cpp | 27 +++---------------- src/Mod/Assembly/App/AssemblyObject.h | 1 - src/Mod/Assembly/Gui/ViewProviderAssembly.cpp | 4 ++- 5 files changed, 29 insertions(+), 26 deletions(-) diff --git a/src/Base/Tools.cpp b/src/Base/Tools.cpp index b164164489..eab37f5860 100644 --- a/src/Base/Tools.cpp +++ b/src/Base/Tools.cpp @@ -372,3 +372,24 @@ std::string Base::Tools::currentDateTimeString() .toString(Qt::ISODate) .toStdString(); } + +std::vector Base::Tools::splitSubName(const std::string& subname) +{ + // Turns 'Part.Part001.Body.Pad.Edge1' + // Into ['Part', 'Part001', 'Body', 'Pad', 'Edge1'] + std::vector subNames; + std::string subName; + std::istringstream subNameStream(subname); + while (std::getline(subNameStream, subName, '.')) { + subNames.push_back(subName); + } + + // Check if the last character of the input string is the delimiter. + // If so, add an empty string to the subNames vector. + // Because the last subname is the element name and can be empty. + if (!subname.empty() && subname.back() == '.') { + subNames.push_back(""); // Append empty string for trailing dot. + } + + return subNames; +} diff --git a/src/Base/Tools.h b/src/Base/Tools.h index b17907bbc4..e2018b9889 100644 --- a/src/Base/Tools.h +++ b/src/Base/Tools.h @@ -325,6 +325,8 @@ struct BaseExport Tools static std::string joinList(const std::vector& vec, const std::string& sep = ", "); static std::string currentDateTimeString(); + + static std::vector splitSubName(const std::string& subname); }; diff --git a/src/Mod/Assembly/App/AssemblyObject.cpp b/src/Mod/Assembly/App/AssemblyObject.cpp index 70c1c3c136..07438b18f1 100644 --- a/src/Mod/Assembly/App/AssemblyObject.cpp +++ b/src/Mod/Assembly/App/AssemblyObject.cpp @@ -2105,7 +2105,7 @@ Base::Placement AssemblyObject::getGlobalPlacement(App::DocumentObject* targetOb if (!targetObj || !rootObj || sub == "") { return Base::Placement(); } - std::vector names = splitSubName(sub); + std::vector names = Base::Tools::splitSubName(sub); App::Document* doc = rootObj->getDocument(); Base::Placement plc = getPlacementFromProp(rootObj, "Placement"); @@ -2193,7 +2193,7 @@ std::vector AssemblyObject::getSubAsList(App::PropertyXLinkSub* pro return {}; } - return splitSubName(subs[0]); + return Base::Tools::splitSubName(subs[0]); } std::vector AssemblyObject::getSubAsList(App::DocumentObject* obj, const char* pName) @@ -2203,27 +2203,6 @@ std::vector AssemblyObject::getSubAsList(App::DocumentObject* obj, return getSubAsList(prop); } -std::vector AssemblyObject::splitSubName(const std::string& sub) -{ - // Turns 'Part.Part001.Body.Pad.Edge1' - // Into ['Part', 'Part001','Body','Pad','Edge1'] - std::vector subNames; - std::string subName; - std::istringstream subNameStream(sub); - while (std::getline(subNameStream, subName, '.')) { - subNames.push_back(subName); - } - - // Check if the last character of the input string is the delimiter. - // If so, add an empty string to the subNames vector. - // Because the last subname is the element name and can be empty. - if (!sub.empty() && sub.back() == '.') { - subNames.push_back(""); // Append empty string for trailing dot. - } - - return subNames; -} - std::string AssemblyObject::getElementFromProp(App::DocumentObject* obj, const char* pName) { std::vector names = getSubAsList(obj, pName); @@ -2370,7 +2349,7 @@ App::DocumentObject* AssemblyObject::getMovingPartFromRef(App::DocumentObject* o App::Document* doc = obj->getDocument(); - std::vector names = splitSubName(sub); + std::vector names = Base::Tools::splitSubName(sub); names.insert(names.begin(), obj->getNameInDocument()); bool assemblyPassed = false; diff --git a/src/Mod/Assembly/App/AssemblyObject.h b/src/Mod/Assembly/App/AssemblyObject.h index 1615ffae31..247e7d0939 100644 --- a/src/Mod/Assembly/App/AssemblyObject.h +++ b/src/Mod/Assembly/App/AssemblyObject.h @@ -280,7 +280,6 @@ public: const char* propName); static std::vector getSubAsList(App::PropertyXLinkSub* prop); static std::vector getSubAsList(App::DocumentObject* joint, const char* propName); - static std::vector splitSubName(const std::string& subName); static Base::Placement getPlacementFromProp(App::DocumentObject* obj, const char* propName); static Base::Placement getGlobalPlacement(App::DocumentObject* targetObj, diff --git a/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp b/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp index 834006cb84..ecfb467001 100644 --- a/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp +++ b/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp @@ -46,6 +46,8 @@ #include #include +#include + #include #include #include @@ -618,7 +620,7 @@ bool ViewProviderAssembly::getSelectedObjectsWithinAssembly(bool addPreselection std::vector objsSubNames = selObj.getSubNames(); for (auto& subNamesStr : objsSubNames) { - std::vector subNames = AssemblyObject::splitSubName(subNamesStr); + std::vector subNames = Base::Tools::splitSubName(subNamesStr); if (subNames.empty()) { continue; }