Skip to content
Snippets Groups Projects
object_boolean_tools.py 40.1 KiB
Newer Older
  • Learn to ignore specific revisions
  •                     if mod.show_viewport:
    
                            EnableIcon = "RESTRICT_VIEW_OFF"
                        Enable = row.operator(BTool_EnableBrush.bl_idname, icon=EnableIcon, emboss=False)
                        Enable.thisObj = mod.object.name
    
    
                        Remove = row.operator("btool.remove", text="", icon="X", emboss=False)
    
                        Remove.thisObj = mod.object.name
                        Remove.Prop = "THIS"
    
                    else:
    
                    Up = row.operator("btool.move_stack", icon="TRIA_UP", emboss=False)
                    Up.modif = mod.name
                    Up.direction = "UP"
    
                    Dw = row.operator("btool.move_stack", icon="TRIA_DOWN", emboss=False)
                    Dw.modif = mod.name
                    Dw.direction = "DOWN"
    
    # ------------------ BOOL TOOL ADD-ON PREFERENCES ----------------------------
    
    
    shortcut_list = (
        ("3D View", None),
        ("Menu", "Ctrl Shift B"),
    
        ("Auto Operators", None),
        ("Difference", "Ctrl Shift Num -"),
        ("Union", "Ctrl Shift Num +"),
        ("Intersect", "Ctrl Shift Num *"),
        ("Slice", "Ctrl Shift Num /"),
    
        ("Brush Operators", None),
        ("Difference", "Ctrl Num -"),
        ("Union", "Ctrl Num +"),
        ("Intersect", "Ctrl Num *"),
        ("Slice", "Ctrl Num /"),
        ("Brush To Mesh", "Ctrl Num Enter"),
        ("All Brushes To Mesh", "Ctrl Shift Num Enter"),
    )
    
    
    
    def UpdateBoolTool_Pref(self, context):
        if self.fast_transform:
            RegisterFastT()
        else:
            UnRegisterFastT()
    
    
    
    # Define Panel classes for updating
    
        VIEW3D_PT_booltool_tools,
        VIEW3D_PT_booltool_config,
        VIEW3D_PT_booltool_bviewer,
    
    def update_panels(self, context):
    
            for panel in panels:
                if "bl_rna" in panel.__dict__:
                    bpy.utils.unregister_class(panel)
    
            for panel in panels:
    
                panel.bl_category = context.preferences.addons[
                    __name__
                ].preferences.category
    
                bpy.utils.register_class(panel)
    
        except Exception as e:
    
            message = "Bool Tool: Updating Panel locations has failed"
    
            print("\n[{}]\n{}\n\nError:\n{}".format(__name__, message, e))
    
    def icon_tria(prop):
        if prop:
            return "TRIA_DOWN"
        return "TRIA_RIGHT"
    
    
    
    class PREFS_BoolTool_Props(AddonPreferences):
    
        fast_transform: BoolProperty(
            name="Fast Transformations",
            update=UpdateBoolTool_Pref,
            description="Replace the Transform HotKeys (G,R,S)\n"
            "for a custom version that can optimize the visualization of Brushes",
        )
        use_wire: BoolProperty(
    
            name="Display As Wireframe",
    
            description="Display brush as wireframe instead of bounding box",
    
        )
        category: StringProperty(
    
            name="Tab Name",
            description="Set sidebar tab name",
    
            update=update_panels,
        )
    
        show_shortcuts: BoolProperty(name="Shortcuts")
    
        def draw(self, context):
            layout = self.layout
    
            layout.use_property_split = True
            layout.use_property_decorate = False
    
            col = layout.column()
            col.prop(self, "category")
            col.prop(self, "fast_transform")
            col.prop(self, "use_wire")
    
            col = layout.column()
            col.scale_y = 1.2
            col.use_property_split = False
            col.prop(self, "show_shortcuts", icon=icon_tria(self.show_shortcuts))
    
                col = layout.column()
    
                for key_name, key_comb in shortcut_list:
                    if key_comb is None:
                        col.separator()
                        col.label(text=key_name)
                    else:
                        row = col.row(align=True)
                        row.scale_y = 0.7
                        row.box().label(text=key_name)
                        row.box().label(text=key_comb)
    
    
    # ------------------- Class List ------------------------------------------------
    
        PREFS_BoolTool_Props,
        VIEW3D_MT_booltool_menu,
        VIEW3D_PT_booltool_tools,
        VIEW3D_PT_booltool_config,
        VIEW3D_PT_booltool_bviewer,
        OBJECT_OT_BoolTool_Auto_Union,
        OBJECT_OT_BoolTool_Auto_Difference,
        OBJECT_OT_BoolTool_Auto_Intersect,
        OBJECT_OT_BoolTool_Auto_Slice,
    
        BTool_Union,
        BTool_Diff,
        BTool_Inters,
        BTool_Slice,
    
        # TODO Draw Poly Brush
    
        # BTool_DrawPolyBrush,
    
        BTool_Remove,
        BTool_AllBrushToMesh,
        BTool_BrushToMesh,
        BTool_FindBrush,
        BTool_MoveStack,
        BTool_EnableBrush,
        BTool_EnableThisBrush,
        BTool_EnableFTransform,
        BTool_FastTransform,
    
    # ------------------- REGISTER ------------------------------------------------
    
    addon_keymaps = []
    addon_keymapsFastT = []
    
    
    # Fast Transform HotKeys Register
    def RegisterFastT():
        wm = bpy.context.window_manager
    
        km = wm.keyconfigs.addon.keymaps.new(name="Object Mode", space_type="EMPTY")
    
        kmi = km.keymap_items.new(BTool_FastTransform.bl_idname, "G", "PRESS")
    
        kmi.properties.operator = "Translate"
        addon_keymapsFastT.append((km, kmi))
    
    
        kmi = km.keymap_items.new(BTool_FastTransform.bl_idname, "R", "PRESS")
    
        kmi.properties.operator = "Rotate"
        addon_keymapsFastT.append((km, kmi))
    
    
        kmi = km.keymap_items.new(BTool_FastTransform.bl_idname, "S", "PRESS")
    
        kmi.properties.operator = "Scale"
        addon_keymapsFastT.append((km, kmi))
    
    
    # Fast Transform HotKeys UnRegister
    def UnRegisterFastT():
        wm = bpy.context.window_manager
    
        kc = wm.keyconfigs.addon
        if kc:
            for km, kmi in addon_keymapsFastT:
                km.keymap_items.remove(kmi)
    
    
        addon_keymapsFastT.clear()
    
    
    def register():
        for cls in classes:
            bpy.utils.register_class(cls)
    
        update_panels(None, bpy.context)
    
        bpy.types.Scene.BoolHide = BoolProperty(
    
            default=False,
            description="Hide boolean objects",
            update=update_BoolHide,
        )
    
        bpy.types.VIEW3D_MT_object.append(VIEW3D_BoolTool_Menu)
    
    
        wm = bpy.context.window_manager
    
        kc = wm.keyconfigs.addon
    
        # create the boolean menu hotkey
    
        if kc is not None:
            km = kc.keymaps.new(name="Object Mode")
    
            kmi = km.keymap_items.new("wm.call_menu", "B", "PRESS", ctrl=True, shift=True)
            kmi.properties.name = "VIEW3D_MT_booltool_menu"
            addon_keymaps.append((km, kmi))
    
            # Brush Operators
            kmi = km.keymap_items.new(BTool_Union.bl_idname, "NUMPAD_PLUS", "PRESS", ctrl=True)
            addon_keymaps.append((km, kmi))
            kmi = km.keymap_items.new(BTool_Diff.bl_idname, "NUMPAD_MINUS", "PRESS", ctrl=True)
            addon_keymaps.append((km, kmi))
            kmi = km.keymap_items.new(BTool_Inters.bl_idname, "NUMPAD_ASTERIX", "PRESS", ctrl=True)
            addon_keymaps.append((km, kmi))
            kmi = km.keymap_items.new(BTool_Slice.bl_idname, "NUMPAD_SLASH", "PRESS", ctrl=True)
            addon_keymaps.append((km, kmi))
            kmi = km.keymap_items.new(BTool_BrushToMesh.bl_idname, "NUMPAD_ENTER", "PRESS", ctrl=True)
            addon_keymaps.append((km, kmi))
            kmi = km.keymap_items.new(
                BTool_AllBrushToMesh.bl_idname,
                "NUMPAD_ENTER",
                "PRESS",
                ctrl=True,
                shift=True,
            )
            addon_keymaps.append((km, kmi))
    
            # Auto Operators
            kmi = km.keymap_items.new(
                OBJECT_OT_BoolTool_Auto_Union.bl_idname,
                "NUMPAD_PLUS",
                "PRESS",
                ctrl=True,
                shift=True,
            )
            addon_keymaps.append((km, kmi))
            kmi = km.keymap_items.new(
                OBJECT_OT_BoolTool_Auto_Difference.bl_idname,
                "NUMPAD_MINUS",
                "PRESS",
                ctrl=True,
                shift=True,
            )
            addon_keymaps.append((km, kmi))
            kmi = km.keymap_items.new(
                OBJECT_OT_BoolTool_Auto_Intersect.bl_idname,
                "NUMPAD_ASTERIX",
                "PRESS",
                ctrl=True,
                shift=True,
            )
            addon_keymaps.append((km, kmi))
            kmi = km.keymap_items.new(
                OBJECT_OT_BoolTool_Auto_Slice.bl_idname,
                "NUMPAD_SLASH",
                "PRESS",
                ctrl=True,
                shift=True,
            )
            addon_keymaps.append((km, kmi))
    
    
    
    def unregister():
        # Keymapping
        # remove keymaps when add-on is deactivated
        wm = bpy.context.window_manager
    
            for km, kmi in addon_keymaps:
                km.keymap_items.remove(kmi)
    
        addon_keymaps.clear()
        UnRegisterFastT()
    
        bpy.types.VIEW3D_MT_object.remove(VIEW3D_BoolTool_Menu)
        del bpy.types.Scene.BoolHide
    
        for cls in classes:
            bpy.utils.unregister_class(cls)
    
    
    if __name__ == "__main__":