Newer
Older
return False
def draw(self, context):
actObj = bpy.context.active_object
if isCanvas(actObj):
for mod in actObj.modifiers:
container = self.layout.box()
if mod.operation == "DIFFERENCE":
icon = "SELECT_SUBTRACT"
elif mod.operation == "UNION":
icon = "SELECT_EXTEND"
elif mod.operation == "INTERSECT":
icon = "SELECT_INTERSECT"
elif mod.operation == "SLICE":
icon = "SELECT_DIFFERENCE"
objSelect = row.operator("btool.find_brush", text=mod.object.name, icon=icon, emboss=False)
objSelect.obj = mod.object.name
EnableIcon = "RESTRICT_VIEW_ON"
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:
row.label(text=mod.name)
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 Help ----------------------------
class WM_OT_BoolTool_Help(Operator):
bl_idname = "wm.booltool_help"
bl_label = "Bool Tool Help"
bl_description = "Help - click to read basic information"
def draw(self, context):
layout = self.layout
layout.label(text="To use:")
layout.label(text="Select two or more objects,")
layout.label(text="choose one option from the panel")
layout.label(text="or from the Ctrl + Shift + B menu")
layout.separator()
layout.label(text="Auto Boolean:")
layout.label(text="Apply Boolean operation directly to mesh.")
layout.separator()
layout.label(text="Brush Boolean:")
layout.label(text="Create a Boolean brush modifier setup.")
def execute(self, context):
def invoke(self, context, event):
return context.window_manager.invoke_popup(self, width=220)
# ------------------ 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
panels = (
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):
bl_idname = __name__
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 Wirewrame",
description="Display brush as wireframe instead of bounding box",
)
category: StringProperty(
name="Tab Name",
description="Set sidebar tab name",
default="Edit",
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))
if 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,
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)
kc = wm.keyconfigs.addon
# create the boolean menu hotkey
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
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
kc = wm.keyconfigs.addon
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__":