from __future__ import annotations import bpy from . import registry from .core.nodeslicer import sockets, nodes, tree # sockets and nodes need also to be imported in order for them to be autoregistered from .ui import panels from .property_groups.bpy_property_groups import SlicerObjectPropertyGroup bl_info = { "name": "NodeSlicer", "author": "Nicolas Predella", "version": (0, 1, 0), "blender": (3, 6, 0), "location": "Node Editor > Add", "description": "Prepare GCodes with Nodes", "category": "Node", } _registered_nodeslicer = False _keymaps = [] def register(): global _registered_nodeslicer registry.blender_register_classes() bpy.types.NODE_MT_add.append(tree.draw_add_menu) bpy.app.handlers.depsgraph_update_post.append(tree.depsgraph_update_handler) if not hasattr(bpy.types.Object, "nodeslicer"): bpy.types.Object.nodeslicer = bpy.props.PointerProperty(type=SlicerObjectPropertyGroup, name="nodeslicer") #type: ignore _registered_nodeslicer = True # Register Keymaps wm = bpy.context.window_manager if wm.keyconfigs.addon: km = wm.keyconfigs.addon.keymaps.new(name='Node Editor', space_type='NODE_EDITOR') kmi = km.keymap_items.new("slicenode.group_make", 'G', 'PRESS', ctrl=True) _keymaps.append((km, kmi)) kmi = km.keymap_items.new("node.group_ungroup", 'G', 'PRESS', ctrl=True, alt=True) _keymaps.append((km, kmi)) # Custom Tab toggle for groups kmi = km.keymap_items.new("slicenode.group_toggle", 'TAB', 'PRESS') _keymaps.append((km, kmi)) print('Nodeslicer Loaded') def unregister(): global _registered_nodeslicer try: if tree.depsgraph_update_handler in bpy.app.handlers.depsgraph_update_post: bpy.app.handlers.depsgraph_update_post.remove(tree.depsgraph_update_handler) except Exception as e: print(f"Error removing handler: {e}") try: bpy.types.NODE_MT_add.remove(tree.draw_add_menu) except Exception as e: print(f"Error removing menu: {e}") # Unregister Keymaps safely try: for km, kmi in _keymaps: km.keymap_items.remove(kmi) except Exception as e: print(f"Error removing keymaps: {e}") finally: _keymaps.clear() registry.blender_unregister_classes() if _registered_nodeslicer: try: if hasattr(bpy.types.Object, "nodeslicer"): del bpy.types.Object.nodeslicer #type: ignore except Exception as e: print(f"Error removing property: {e}") finally: _registered_nodeslicer = False print('Nodeslicer Unloaded') if __name__ == "__main__": register()