From a5505a1b1cda797cc1e0af52bb717cd310fc0765 Mon Sep 17 00:00:00 2001 From: PaddleStroke Date: Wed, 24 Jul 2024 10:17:00 +0200 Subject: [PATCH] Assembly: Replace ObjRefPairs std::pair by structure. --- src/Mod/Assembly/App/AssemblyObject.cpp | 50 +++++++++---------- src/Mod/Assembly/App/AssemblyObject.h | 17 ++++--- src/Mod/Assembly/Gui/ViewProviderAssembly.cpp | 15 +++--- 3 files changed, 42 insertions(+), 40 deletions(-) diff --git a/src/Mod/Assembly/App/AssemblyObject.cpp b/src/Mod/Assembly/App/AssemblyObject.cpp index b6bd2fe491..a68db6d72d 100644 --- a/src/Mod/Assembly/App/AssemblyObject.cpp +++ b/src/Mod/Assembly/App/AssemblyObject.cpp @@ -725,11 +725,10 @@ bool AssemblyObject::isJointTypeConnecting(App::DocumentObject* joint) } -bool AssemblyObject::isObjInSetOfObjRefPairs(App::DocumentObject* obj, - const std::set& set) +bool AssemblyObject::isObjInSetOfObjRefs(App::DocumentObject* obj, const std::vector& set) { for (const auto& pair : set) { - if (pair.first == obj) { + if (pair.obj == obj) { return true; } } @@ -739,11 +738,11 @@ bool AssemblyObject::isObjInSetOfObjRefPairs(App::DocumentObject* obj, void AssemblyObject::removeUnconnectedJoints(std::vector& joints, std::vector groundedObjs) { - std::set connectedParts; + std::vector connectedParts; // Initialize connectedParts with groundedObjs for (auto* groundedObj : groundedObjs) { - connectedParts.insert({groundedObj, nullptr}); + connectedParts.push_back({groundedObj, nullptr}); } // Perform a traversal from each grounded object @@ -759,8 +758,8 @@ void AssemblyObject::removeUnconnectedJoints(std::vector& [&](App::DocumentObject* joint) { App::DocumentObject* obj1 = getMovingPartFromRef(joint, "Reference1"); App::DocumentObject* obj2 = getMovingPartFromRef(joint, "Reference2"); - if (!isObjInSetOfObjRefPairs(obj1, connectedParts) - || !isObjInSetOfObjRefPairs(obj2, connectedParts)) { + if (!isObjInSetOfObjRefs(obj1, connectedParts) + || !isObjInSetOfObjRefs(obj2, connectedParts)) { Base::Console().Warning( "%s is unconnected to a grounded part so it is ignored.\n", joint->getFullName()); @@ -772,25 +771,25 @@ void AssemblyObject::removeUnconnectedJoints(std::vector& } void AssemblyObject::traverseAndMarkConnectedParts(App::DocumentObject* currentObj, - std::set& connectedParts, + std::vector& connectedParts, const std::vector& joints) { // getConnectedParts returns the objs connected to the currentObj by any joint auto connectedObjs = getConnectedParts(currentObj, joints); - for (auto nextObjRef : connectedObjs) { - if (!isObjInSetOfObjRefPairs(nextObjRef.first, connectedParts)) { - // Create a new ObjRefPair with the nextObj and a nullptr for PropertyXLinkSub* - connectedParts.insert(nextObjRef); - traverseAndMarkConnectedParts(nextObjRef.first, connectedParts, joints); + for (auto& nextObjRef : connectedObjs) { + if (!isObjInSetOfObjRefs(nextObjRef.obj, connectedParts)) { + // Create a new ObjRef with the nextObj and a nullptr for PropertyXLinkSub* + connectedParts.push_back(nextObjRef); + traverseAndMarkConnectedParts(nextObjRef.obj, connectedParts, joints); } } } -std::vector +std::vector AssemblyObject::getConnectedParts(App::DocumentObject* part, const std::vector& joints) { - std::vector connectedParts; + std::vector connectedParts; for (auto joint : joints) { if (!isJointTypeConnecting(joint)) { continue; @@ -836,11 +835,11 @@ bool AssemblyObject::isPartConnected(App::DocumentObject* obj) std::vector groundedObjs = getGroundedParts(); std::vector joints = getJoints(false); - std::set connectedParts; + std::vector connectedParts; // Initialize connectedParts with groundedObjs for (auto* groundedObj : groundedObjs) { - connectedParts.insert({groundedObj, nullptr}); + connectedParts.push_back({groundedObj, nullptr}); } // Perform a traversal from each grounded object @@ -848,8 +847,8 @@ bool AssemblyObject::isPartConnected(App::DocumentObject* obj) traverseAndMarkConnectedParts(groundedObj, connectedParts, joints); } - for (auto objRef : connectedParts) { - if (obj == objRef.first) { + for (auto& objRef : connectedParts) { + if (obj == objRef.obj) { return true; } } @@ -1515,8 +1514,8 @@ std::shared_ptr AssemblyObject::makeMbdMarker(std::string& name, Bas return mbdMarker; } -std::vector> -AssemblyObject::getDownstreamParts(App::DocumentObject* part, App::DocumentObject* joint) +std::vector AssemblyObject::getDownstreamParts(App::DocumentObject* part, + App::DocumentObject* joint) { // First we deactivate the joint bool state = getJointActivated(joint); @@ -1524,13 +1523,12 @@ AssemblyObject::getDownstreamParts(App::DocumentObject* part, App::DocumentObjec std::vector joints = getJoints(false); - std::set> connectedParts = { - {part, nullptr}}; + std::vector connectedParts = {{part, nullptr}}; traverseAndMarkConnectedParts(part, connectedParts, joints); - std::vector> downstreamParts; - for (auto parti : connectedParts) { - if (!isPartConnected(parti.first) && (parti.first != part)) { + std::vector downstreamParts; + for (auto& parti : connectedParts) { + if (!isPartConnected(parti.obj) && (parti.obj != part)) { downstreamParts.push_back(parti); } } diff --git a/src/Mod/Assembly/App/AssemblyObject.h b/src/Mod/Assembly/App/AssemblyObject.h index 65198b2b09..cd25217d66 100644 --- a/src/Mod/Assembly/App/AssemblyObject.h +++ b/src/Mod/Assembly/App/AssemblyObject.h @@ -62,7 +62,11 @@ namespace Assembly class JointGroup; class ViewGroup; -using ObjRefPair = std::pair; +struct ObjRef +{ + App::DocumentObject* obj; + App::PropertyXLinkSub* ref; +}; // This enum has to be the same as the one in JointObject.py enum class JointType @@ -202,19 +206,18 @@ public: bool isJointConnectingPartToGround(App::DocumentObject* joint, const char* partPropName); bool isJointTypeConnecting(App::DocumentObject* joint); - bool isObjInSetOfObjRefPairs(App::DocumentObject* obj, const std::set& pairs); + bool isObjInSetOfObjRefs(App::DocumentObject* obj, const std::vector& pairs); void removeUnconnectedJoints(std::vector& joints, std::vector groundedObjs); void traverseAndMarkConnectedParts(App::DocumentObject* currentPart, - std::set& connectedParts, + std::vector& connectedParts, const std::vector& joints); - std::vector getConnectedParts(App::DocumentObject* part, - const std::vector& joints); + std::vector getConnectedParts(App::DocumentObject* part, + const std::vector& joints); bool isPartGrounded(App::DocumentObject* part); bool isPartConnected(App::DocumentObject* part); - std::vector getDownstreamParts(App::DocumentObject* part, - App::DocumentObject* joint); + std::vector getDownstreamParts(App::DocumentObject* part, App::DocumentObject* joint); std::vector getUpstreamParts(App::DocumentObject* part, int limit = 0); App::DocumentObject* getUpstreamMovingPart(App::DocumentObject* part, App::DocumentObject*& joint, diff --git a/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp b/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp index 534db31b05..9945d05d1a 100644 --- a/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp +++ b/src/Mod/Assembly/Gui/ViewProviderAssembly.cpp @@ -712,22 +712,23 @@ ViewProviderAssembly::DragMode ViewProviderAssembly::findDragMode() jcsGlobalPlc = global_plc * jcsPlc; // Add downstream parts so that they move together - auto downstreamParts = assemblyPart->getDownstreamParts(docsToMove[0].obj, movingJoint); - for (auto partRef : downstreamParts) { - auto* pPlc = dynamic_cast( - partRef.first->getPropertyByName("Placement")); + std::vector downstreamParts = + assemblyPart->getDownstreamParts(docsToMove[0].obj, movingJoint); + for (auto& partRef : downstreamParts) { + auto* pPlc = + dynamic_cast(partRef.obj->getPropertyByName("Placement")); if (pPlc) { - App::DocumentObject* selRoot = partRef.second->getValue(); + App::DocumentObject* selRoot = partRef.ref->getValue(); if (!selRoot) { return DragMode::None; } - std::vector subs = partRef.second->getSubValues(); + std::vector subs = partRef.ref->getSubValues(); if (subs.empty()) { return DragMode::None; } - docsToMove.emplace_back(partRef.first, pPlc->getValue(), selRoot, subs[0]); + docsToMove.emplace_back(partRef.obj, pPlc->getValue(), selRoot, subs[0]); } }