From e478ea7d7727d73c0735aa0c2af65d3fb34d70a5 Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Sun, 17 Dec 2023 21:27:25 +0800 Subject: [PATCH 1/2] Gui: deduce object path when setting active object --- src/Gui/ActiveObjectList.cpp | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/Gui/ActiveObjectList.cpp b/src/Gui/ActiveObjectList.cpp index 976632da48..717a65ad2b 100644 --- a/src/Gui/ActiveObjectList.cpp +++ b/src/Gui/ActiveObjectList.cpp @@ -111,10 +111,34 @@ Gui::ActiveObjectList::ObjectInfo Gui::ActiveObjectList::getObjectInfo(App::Docu if (info.obj) break; } + if(!info.obj) { + // No selection is found, try to obtain the object hierarchy using + // DocumentObject::getParents() + unsigned long count = 0xffffffff; + for(auto &v : obj->getParents()) { + if(v.first->getDocument() != _Doc->getDocument()) + continue; - if (!info.obj && obj->getDocument()==_Doc->getDocument()) - info.obj = obj; + // We prioritize on non-linked group object having the least + // hierarchies. + unsigned long cnt = v.first->getSubObjectList(v.second.c_str()).size(); + if(v.first->getLinkedObject(false) != v.first) + cnt &= 0x8000000; + if(cnt < count) { + count = cnt; + info.obj = v.first; + info.subname = v.second; + } + } + + if(!info.obj) { + if (obj->getDocument()!=_Doc->getDocument()) + return info; + info.obj = obj; + } + } } + return info; } From 50fc8e86c70636dac747d8f19862473e1c874ffa Mon Sep 17 00:00:00 2001 From: "Zheng, Lei" Date: Sun, 17 Dec 2023 21:28:37 +0800 Subject: [PATCH 2/2] PD: fix creating new body in active part Add to active App::Part before setting active body in order to obtain correct object path when setting active body Fixes #10371 --- src/Mod/PartDesign/Gui/CommandBody.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Mod/PartDesign/Gui/CommandBody.cpp b/src/Mod/PartDesign/Gui/CommandBody.cpp index e5f49d5bad..356af20657 100644 --- a/src/Mod/PartDesign/Gui/CommandBody.cpp +++ b/src/Mod/PartDesign/Gui/CommandBody.cpp @@ -212,6 +212,12 @@ void CmdPartDesignBody::activated(int iMsg) } } addModule(Gui,"PartDesignGui"); // import the Gui module only once a session + + if (actPart) { + doCommand(Doc,"App.activeDocument().%s.addObject(App.ActiveDocument.%s)", + actPart->getNameInDocument(), bodyString); + } + doCommand(Gui::Command::Gui, "Gui.activateView('Gui::View3DInventor', True)\n" "Gui.activeView().setActiveObject('%s', App.activeDocument().%s)", PDBODYKEY, bodyString); @@ -219,10 +225,6 @@ void CmdPartDesignBody::activated(int iMsg) // Make the "Create sketch" prompt appear in the task panel doCommand(Gui,"Gui.Selection.clearSelection()"); doCommand(Gui,"Gui.Selection.addSelection(App.ActiveDocument.%s)", bodyString); - if (actPart) { - doCommand(Doc,"App.activeDocument().%s.addObject(App.ActiveDocument.%s)", - actPart->getNameInDocument(), bodyString); - } // check if a proxy object has been created for the base feature inside the body if (baseFeature) {