import FreeCAD as App import FreeCADGui as Gui doc = App.ActiveDocument if not doc: raise RuntimeError("No active Doc") def find_body(): sel = Gui.Selection.getSelection() if sel: o = sel[0] if getattr(o, "TypeId", "") == "PartDesign::Body": return o if hasattr(o, "getParentGeoFeatureGroup"): parent = o.getParentGeoFeatureGroup() if parent and getattr(parent, "TypeId", "") == "PartDesign::Body": return parent try: adoc = Gui.ActiveDocument if adoc: b = adoc.getActiveObject("pdbody") if b and getattr(b, "TypeId", "") == "PartDesign::Body": return b except: pass return None old_body = find_body() if old_body is None: raise RuntimeError( "No body found\n" ) doc.openTransaction("Freeze Body final") old_name = old_body.Name old_label = old_body.Label old_placement = old_body.Placement frozen = doc.addObject("Part::Feature", f"{old_name}_Frozen") frozen.Shape = old_body.Shape.copy() frozen.Label = f"{old_label} (Frozen)" frozen.ViewObject.Visibility = False refs = doc.getObject("_References") if refs is None: refs = doc.addObject("App::DocumentObjectGroup", "_References") refs.addObject(frozen) new_body = doc.addObject("PartDesign::Body", "TempBody") new_body.Label = old_label new_body.Placement = old_placement base = new_body.newObject("PartDesign::FeatureBase", "BaseFeature") base.BaseFeature = frozen doc.recompute() body_contents = list(getattr(old_body, "Group", [])) for obj in reversed(body_contents): try: parent = obj.getParentGeoFeatureGroup() if hasattr(obj, "getParentGeoFeatureGroup") else None except Exception: parent = None if parent is not None and parent != old_body: continue if doc.getObject(obj.Name): try: doc.removeObject(obj.Name) except: pass if doc.getObject(old_name): try: doc.removeObject(old_name) except: pass doc.recompute() try: doc.renameObject(new_body.Name, old_name) new_body = doc.getObject(old_name) except Exception: pass new_body.Label = old_label doc.recompute() Gui.ActiveDocument.ActiveView.setActiveObject("pdbody", new_body) Gui.Selection.clearSelection() Gui.Selection.addSelection(new_body) doc.commitTransaction() refs = doc.getObject("_References") if refs: for obj in list(getattr(refs, "Group", [])): if obj and (obj.Name.endswith("_Frozen") or "(Frozen)" in obj.Label): users = [u for u in getattr(obj, "InList", []) if u and u != refs] if len(users) == 0: try: doc.removeObject(obj.Name) except: pass doc.recompute()