Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikhail Rachinskiy <mikhail.rachinskiy@gmail.com>2019-03-11 16:18:40 +0300
committerMikhail Rachinskiy <mikhail.rachinskiy@gmail.com>2019-03-11 16:18:40 +0300
commitc7f6ef3fef1315e97fd7326c08b7c7ad7b82762a (patch)
tree97dd5db659bf695104743b45a70ef331309e1fea /object_boolean_tools.py
parent0509abc24242abb6e6e045e781d0b00ee29ad6c1 (diff)
Bool Tool: format the code with Black
Diffstat (limited to 'object_boolean_tools.py')
-rw-r--r--object_boolean_tools.py489
1 files changed, 259 insertions, 230 deletions
diff --git a/object_boolean_tools.py b/object_boolean_tools.py
index 42e99eae..e5688085 100644
--- a/object_boolean_tools.py
+++ b/object_boolean_tools.py
@@ -26,19 +26,19 @@ bl_info = {
"location": "View3D > Sidebar",
"description": "Bool Tool Hotkey: Ctrl Shift B",
"category": "Object",
- }
+}
import bpy
from bpy.types import (
- AddonPreferences,
- Operator,
- Panel,
- Menu,
- )
+ AddonPreferences,
+ Operator,
+ Panel,
+ Menu,
+)
from bpy.props import (
- BoolProperty,
- StringProperty,
- )
+ BoolProperty,
+ StringProperty,
+)
# ------------------- Bool Tool FUNCTIONS -------------------------
@@ -47,7 +47,7 @@ from bpy.props import (
# Hide boolean objects
def update_BoolHide(self, context):
ao = context.view_layer.objects.active
- objs = [i.object for i in ao.modifiers if i.type == 'BOOLEAN']
+ objs = [i.object for i in ao.modifiers if i.type == "BOOLEAN"]
hide_state = context.scene.BoolHide
for o in objs:
@@ -92,8 +92,8 @@ def FindCanvas(obj):
for ob in bpy.context.view_layer.objects:
if isCanvas(ob):
for mod in ob.modifiers:
- if ("BTool_" in mod.name):
- if (obj.name in mod.name):
+ if "BTool_" in mod.name:
+ if obj.name in mod.name:
return ob
@@ -116,12 +116,14 @@ def ConvertToMesh(obj):
# Do the Union, Difference and Intersection Operations with a Brush
def Operation(context, _operation):
-
prefs = bpy.context.preferences.addons[__name__].preferences
useWire = prefs.use_wire
for selObj in bpy.context.selected_objects:
- if selObj != context.active_object and (selObj.type == "MESH" or selObj.type == "CURVE"):
+ if (
+ selObj != context.active_object and
+ (selObj.type == "MESH" or selObj.type == "CURVE")
+ ):
if selObj.type == "CURVE":
ConvertToMesh(selObj)
actObj = context.active_object
@@ -181,8 +183,8 @@ def Remove(context, thisObj_name, Prop):
# Remove it from the Canvas
for mod in actObj.modifiers:
- if ("BTool_" in mod.name):
- if (_thisObj_name in mod.name):
+ if "BTool_" in mod.name:
+ if _thisObj_name in mod.name:
actObj.modifiers.remove(mod)
if Prop == "THIS":
@@ -195,8 +197,8 @@ def Remove(context, thisObj_name, Prop):
Canvas = FindCanvas(actObj)
if Canvas:
for mod in Canvas.modifiers:
- if ("BTool_" in mod.name):
- if (actObj.name in mod.name):
+ if "BTool_" in mod.name:
+ if actObj.name in mod.name:
Canvas.modifiers.remove(mod)
cyclesVis = actObj.cycles_visibility
actObj.display_type = "TEXTURED"
@@ -210,7 +212,7 @@ def Remove(context, thisObj_name, Prop):
if Prop == "CANVAS":
for mod in actObj.modifiers:
- if ("BTool_" in mod.name):
+ if "BTool_" in mod.name:
RemoveThis(mod.object.name)
@@ -218,9 +220,9 @@ def Remove(context, thisObj_name, Prop):
def EnableBrush(context, objList, canvas):
for obj in objList:
for mod in canvas.modifiers:
- if ("BTool_" in mod.name and mod.object.name == obj):
+ if "BTool_" in mod.name and mod.object.name == obj:
- if (mod.show_viewport):
+ if mod.show_viewport:
mod.show_viewport = False
mod.show_render = False
else:
@@ -235,22 +237,22 @@ def EnableThisBrush(context, set):
if obj != bpy.context.active_object:
if isCanvas(obj):
for mod in obj.modifiers:
- if ("BTool_" in mod.name):
+ if "BTool_" in mod.name:
if mod.object == bpy.context.active_object:
canvas = obj
for mod in canvas.modifiers:
- if ("BTool_" in mod.name):
+ if "BTool_" in mod.name:
if mod.object == bpy.context.active_object:
if set == "None":
- if (mod.show_viewport):
+ if mod.show_viewport:
mod.show_viewport = False
mod.show_render = False
else:
mod.show_viewport = True
mod.show_render = True
else:
- if (set == "True"):
+ if set == "True":
mod.show_viewport = True
else:
mod.show_viewport = False
@@ -274,23 +276,23 @@ def ApplyAll(context, list):
for selObj in list:
if isCanvas(selObj) and selObj == context.active_object:
for mod in selObj.modifiers:
- if ("BTool_" in mod.name):
+ if "BTool_" in mod.name:
objDeleteList.append(mod.object)
try:
bpy.ops.object.modifier_apply(modifier=mod.name)
except: # if fails the means it is multiuser data
context.active_object.data = context.active_object.data.copy() # so just make data unique
bpy.ops.object.modifier_apply(modifier=mod.name)
- del selObj['BoolToolRoot']
+ del selObj["BoolToolRoot"]
for obj in context.scene.objects:
if isCanvas(obj):
for mod in obj.modifiers:
- if mod.type == 'BOOLEAN':
- if mod.object in objDeleteList: # do not delete brush that is used by another canvas
- objDeleteList.remove(mod.object) # remove it from deletion
+ # do not delete brush that is used by another canvas
+ if mod.type == "BOOLEAN" and mod.object in objDeleteList:
+ objDeleteList.remove(mod.object) # remove it from deletion
- bpy.ops.object.select_all(action='DESELECT')
+ bpy.ops.object.select_all(action="DESELECT")
for obj in objDeleteList:
obj.select_set(state=True)
bpy.ops.object.delete()
@@ -301,8 +303,7 @@ def ApplyThisBrush(context, brush):
for obj in context.scene.objects:
if isCanvas(obj):
for mod in obj.modifiers:
- if ("BTool_" + brush.name in mod.name):
-
+ if "BTool_" + brush.name in mod.name:
# Apply This Brush
context.view_layer.objects.active = obj
try:
@@ -310,20 +311,24 @@ def ApplyThisBrush(context, brush):
except: # if fails the means it is multiuser data
context.active_object.data = context.active_object.data.copy() # so just make data unique
bpy.ops.object.modifier_apply(modifier=mod.name)
- bpy.ops.object.select_all(action='TOGGLE')
- bpy.ops.object.select_all(action='DESELECT')
+ bpy.ops.object.select_all(action="TOGGLE")
+ bpy.ops.object.select_all(action="DESELECT")
# Garbage Collector
brush.select_set(state=True)
# bpy.ops.object.delete()
+
# ------------------ Bool Tool OPERATORS --------------------------------------
+
class BTool_DrawPolyBrush(Operator):
bl_idname = "btool.draw_polybrush"
bl_label = "Draw Poly Brush"
- bl_description = ("Draw Polygonal Mask, can be applied to Canvas > Brush or Directly\n"
- "Note: ESC to Cancel, Enter to Apply, Right Click to erase the Lines")
+ bl_description = (
+ "Draw Polygonal Mask, can be applied to Canvas > Brush or Directly\n"
+ "Note: ESC to Cancel, Enter to Apply, Right Click to erase the Lines"
+ )
count = 0
store_cont_draw = False
@@ -348,30 +353,30 @@ class BTool_DrawPolyBrush(Operator):
actObj = bpy.context.active_object
if self.count == 1:
actObj.select_set(state=True)
- bpy.ops.gpencil.draw('INVOKE_DEFAULT', mode="DRAW_POLY")
+ bpy.ops.gpencil.draw("INVOKE_DEFAULT", mode="DRAW_POLY")
- if event.type in {'RIGHTMOUSE'}:
+ if event.type in {"RIGHTMOUSE"}:
# use this to pass to the Grease Pencil eraser (see T52321)
pass
- if event.type in {'RET', 'NUMPAD_ENTER'}:
+ if event.type in {"RET", "NUMPAD_ENTER"}:
- bpy.ops.gpencil.convert(type='POLY')
+ bpy.ops.gpencil.convert(type="POLY")
self.set_cont_draw(context)
for obj in context.selected_objects:
if obj.type == "CURVE":
obj.name = "PolyDraw"
bpy.context.view_layer.objects.active = obj
- bpy.ops.object.select_all(action='DESELECT')
+ bpy.ops.object.select_all(action="DESELECT")
obj.select_set(state=True)
bpy.ops.object.convert(target="MESH")
- bpy.ops.object.mode_set(mode='EDIT')
- bpy.ops.mesh.select_all(action='SELECT')
+ bpy.ops.object.mode_set(mode="EDIT")
+ bpy.ops.mesh.select_all(action="SELECT")
bpy.ops.mesh.edge_face_add()
bpy.ops.mesh.flip_normals()
- bpy.ops.object.mode_set(mode='OBJECT')
- bpy.ops.object.origin_set(type='ORIGIN_CENTER_OF_MASS')
+ bpy.ops.object.mode_set(mode="OBJECT")
+ bpy.ops.object.origin_set(type="ORIGIN_CENTER_OF_MASS")
bpy.ops.object.modifier_add(type="SOLIDIFY")
for mod in obj.modifiers:
if mod.name == "Solidify":
@@ -380,7 +385,7 @@ class BTool_DrawPolyBrush(Operator):
mod.offset = 0
obj["BoolToolPolyBrush"] = True
- bpy.ops.object.select_all(action='DESELECT')
+ bpy.ops.object.select_all(action="DESELECT")
bpy.context.view_layer.objects.active = actObj
bpy.context.view_layer.update()
actObj.select_set(state=True)
@@ -389,26 +394,25 @@ class BTool_DrawPolyBrush(Operator):
bpy.context.view_layer.grease_pencil.clear()
bpy.ops.gpencil.data_unlink()
- return {'FINISHED'}
+ return {"FINISHED"}
- if event.type in {'ESC'}:
+ if event.type in {"ESC"}:
bpy.ops.ed.undo() # remove o Grease Pencil
self.set_cont_draw(context)
- self.report({'INFO'},
- "Draw Poly Brush: Operation Cancelled by User")
- return {'CANCELLED'}
+ self.report({"INFO"}, "Draw Poly Brush: Operation Cancelled by User")
+ return {"CANCELLED"}
- return {'RUNNING_MODAL'}
+ return {"RUNNING_MODAL"}
def invoke(self, context, event):
if context.object:
self.set_cont_draw(context, start=True)
context.window_manager.modal_handler_add(self)
- return {'RUNNING_MODAL'}
+ return {"RUNNING_MODAL"}
else:
- self.report({'WARNING'}, "No active object, could not finish")
- return {'CANCELLED'}
+ self.report({"WARNING"}, "No active object, could not finish")
+ return {"CANCELLED"}
# Fast Transform
@@ -417,7 +421,7 @@ class BTool_FastTransform(Operator):
bl_label = "Fast Transform"
bl_description = "Enable Fast Transform"
- operator : StringProperty("")
+ operator: StringProperty("")
count = 0
@@ -435,33 +439,33 @@ class BTool_FastTransform(Operator):
actObj.display_type = "BOUNDS"
if self.operator == "Translate":
- bpy.ops.transform.translate('INVOKE_DEFAULT')
+ bpy.ops.transform.translate("INVOKE_DEFAULT")
if self.operator == "Rotate":
- bpy.ops.transform.rotate('INVOKE_DEFAULT')
+ bpy.ops.transform.rotate("INVOKE_DEFAULT")
if self.operator == "Scale":
- bpy.ops.transform.resize('INVOKE_DEFAULT')
+ bpy.ops.transform.resize("INVOKE_DEFAULT")
- if event.type == 'LEFTMOUSE':
+ if event.type == "LEFTMOUSE":
if isBrush(actObj):
EnableThisBrush(bpy.context, "True")
actObj.display_type = "WIRE"
- return {'FINISHED'}
+ return {"FINISHED"}
- if event.type in {'RIGHTMOUSE', 'ESC'}:
+ if event.type in {"RIGHTMOUSE", "ESC"}:
if isBrush(actObj):
EnableThisBrush(bpy.context, "True")
actObj.display_type = "WIRE"
- return {'CANCELLED'}
+ return {"CANCELLED"}
- return {'RUNNING_MODAL'}
+ return {"RUNNING_MODAL"}
def invoke(self, context, event):
if context.object:
context.window_manager.modal_handler_add(self)
- return {'RUNNING_MODAL'}
+ return {"RUNNING_MODAL"}
else:
- self.report({'WARNING'}, "No active object, could not finish")
- return {'CANCELLED'}
+ self.report({"WARNING"}, "No active object, could not finish")
+ return {"CANCELLED"}
# ------------------- Bool Tool OPERATOR CLASSES --------------------------------------------------------
@@ -480,7 +484,7 @@ class BTool_Union(Operator):
def execute(self, context):
Operation(context, "UNION")
- return {'FINISHED'}
+ return {"FINISHED"}
# Boolean Intersection Operator
@@ -495,7 +499,7 @@ class BTool_Inters(Operator):
def execute(self, context):
Operation(context, "INTERSECT")
- return {'FINISHED'}
+ return {"FINISHED"}
# Boolean Difference Operator
@@ -510,7 +514,7 @@ class BTool_Diff(Operator):
def execute(self, context):
Operation(context, "DIFFERENCE")
- return {'FINISHED'}
+ return {"FINISHED"}
# Boolean Slices Operator
@@ -525,7 +529,7 @@ class BTool_Slice(Operator):
def execute(self, context):
Operation(context, "SLICE")
- return {'FINISHED'}
+ return {"FINISHED"}
# Auto Boolean operators
@@ -533,24 +537,23 @@ class BTool_Slice(Operator):
class Auto_Boolean:
-
def objects_prepare(self):
for ob in bpy.context.selected_objects:
- if ob.type != 'MESH':
+ if ob.type != "MESH":
ob.select_set(state=False)
bpy.ops.object.make_single_user(object=True, obdata=True)
- bpy.ops.object.convert(target='MESH')
+ bpy.ops.object.convert(target="MESH")
def mesh_selection(self, ob, select_action):
obj = bpy.context.active_object
bpy.context.view_layer.objects.active = ob
- bpy.ops.object.mode_set(mode='EDIT')
+ bpy.ops.object.mode_set(mode="EDIT")
bpy.ops.mesh.reveal()
bpy.ops.mesh.select_all(action=select_action)
- bpy.ops.object.mode_set(mode='OBJECT')
+ bpy.ops.object.mode_set(mode="OBJECT")
bpy.context.view_layer.objects.active = obj
def boolean_operation(self):
@@ -558,14 +561,14 @@ class Auto_Boolean:
obj.select_set(state=False)
obs = bpy.context.selected_objects
- self.mesh_selection(obj, 'DESELECT')
+ self.mesh_selection(obj, "DESELECT")
for ob in obs:
- self.mesh_selection(ob, 'SELECT')
+ self.mesh_selection(ob, "SELECT")
self.boolean_mod(obj, ob, self.mode)
obj.select_set(state=True)
def boolean_mod(self, obj, ob, mode, ob_delete=True):
- md = obj.modifiers.new("Auto Boolean", 'BOOLEAN')
+ md = obj.modifiers.new("Auto Boolean", "BOOLEAN")
md.show_viewport = False
md.operation = mode
md.object = ob
@@ -580,49 +583,49 @@ class OBJECT_OT_BoolTool_Auto_Union(Operator, Auto_Boolean):
bl_idname = "object.booltool_auto_union"
bl_label = "Bool Tool Union"
bl_description = "Combine selected objects"
- bl_options = {'REGISTER', 'UNDO'}
+ bl_options = {"REGISTER", "UNDO"}
- mode = 'UNION'
+ mode = "UNION"
def execute(self, context):
self.objects_prepare()
self.boolean_operation()
- return {'FINISHED'}
+ return {"FINISHED"}
class OBJECT_OT_BoolTool_Auto_Difference(Operator, Auto_Boolean):
bl_idname = "object.booltool_auto_difference"
bl_label = "Bool Tool Difference"
bl_description = "Subtract selected objects from active object"
- bl_options = {'REGISTER', 'UNDO'}
+ bl_options = {"REGISTER", "UNDO"}
- mode = 'DIFFERENCE'
+ mode = "DIFFERENCE"
def execute(self, context):
self.objects_prepare()
self.boolean_operation()
- return {'FINISHED'}
+ return {"FINISHED"}
class OBJECT_OT_BoolTool_Auto_Intersect(Operator, Auto_Boolean):
bl_idname = "object.booltool_auto_intersect"
bl_label = "Bool Tool Intersect"
bl_description = "Keep only intersecting geometry"
- bl_options = {'REGISTER', 'UNDO'}
+ bl_options = {"REGISTER", "UNDO"}
- mode = 'INTERSECT'
+ mode = "INTERSECT"
def execute(self, context):
self.objects_prepare()
self.boolean_operation()
- return {'FINISHED'}
+ return {"FINISHED"}
class OBJECT_OT_BoolTool_Auto_Slice(Operator, Auto_Boolean):
bl_idname = "object.booltool_auto_slice"
bl_label = "Bool Tool Slice"
bl_description = "Slice active object along the selected object"
- bl_options = {'REGISTER', 'UNDO'}
+ bl_options = {"REGISTER", "UNDO"}
def execute(self, context):
self.objects_prepare()
@@ -631,19 +634,19 @@ class OBJECT_OT_BoolTool_Auto_Slice(Operator, Auto_Boolean):
obj.select_set(state=False)
ob = context.selected_objects[0]
- self.mesh_selection(obj, 'DESELECT')
- self.mesh_selection(ob, 'SELECT')
+ self.mesh_selection(obj, "DESELECT")
+ self.mesh_selection(ob, "SELECT")
obj_copy = obj.copy()
obj_copy.data = obj.data.copy()
context.collection.objects.link(obj_copy)
- self.boolean_mod(obj, ob, 'DIFFERENCE', ob_delete=False)
+ self.boolean_mod(obj, ob, "DIFFERENCE", ob_delete=False)
bpy.context.view_layer.objects.active = obj_copy
- self.boolean_mod(obj_copy, ob, 'INTERSECT')
+ self.boolean_mod(obj_copy, ob, "INTERSECT")
obj_copy.select_set(state=True)
- return {'FINISHED'}
+ return {"FINISHED"}
# Utils Class ---------------------------------------------------------------
@@ -654,7 +657,7 @@ class BTool_FindBrush(Operator):
bl_label = ""
bl_description = "Find the selected brush"
- obj : StringProperty("")
+ obj: StringProperty("")
@classmethod
def poll(cls, context):
@@ -662,12 +665,12 @@ class BTool_FindBrush(Operator):
def execute(self, context):
for ob in bpy.context.view_layer.objects:
- if (ob.name == self.obj):
- bpy.ops.object.select_all(action='TOGGLE')
- bpy.ops.object.select_all(action='DESELECT')
+ if ob.name == self.obj:
+ bpy.ops.object.select_all(action="TOGGLE")
+ bpy.ops.object.select_all(action="DESELECT")
bpy.context.view_layer.objects.active = ob
ob.set_select(state=True)
- return {'FINISHED'}
+ return {"FINISHED"}
# Move The Modifier in The Stack Up or Down
@@ -676,19 +679,19 @@ class BTool_MoveStack(Operator):
bl_label = ""
bl_description = "Move this Brush Up/Down in the Stack"
- modif : StringProperty("")
- direction : StringProperty("")
+ modif: StringProperty("")
+ direction: StringProperty("")
@classmethod
def poll(cls, context):
return context.active_object is not None
def execute(self, context):
- if (self.direction == "UP"):
+ if self.direction == "UP":
bpy.ops.object.modifier_move_up(modifier=self.modif)
- if (self.direction == "DOWN"):
+ if self.direction == "DOWN":
bpy.ops.object.modifier_move_down(modifier=self.modif)
- return {'FINISHED'}
+ return {"FINISHED"}
# Enable or Disable a Brush in the Three View
@@ -697,7 +700,7 @@ class BTool_EnableBrush(Operator):
bl_label = ""
bl_description = "Removes all BoolTool config assigned to it"
- thisObj : StringProperty("")
+ thisObj: StringProperty("")
@classmethod
def poll(cls, context):
@@ -706,7 +709,7 @@ class BTool_EnableBrush(Operator):
def execute(self, context):
# in this case is just one object but the function accept more than one at once
EnableBrush(context, [self.thisObj], context.active_object)
- return {'FINISHED'}
+ return {"FINISHED"}
# Enable or Disable a Brush Directly
@@ -721,7 +724,7 @@ class BTool_EnableThisBrush(Operator):
def execute(self, context):
EnableThisBrush(context, "None")
- return {'FINISHED'}
+ return {"FINISHED"}
# Enable or Disable a Brush Directly
@@ -736,7 +739,7 @@ class BTool_EnableFTransform(Operator):
def execute(self, context):
EnableFTransf(context)
- return {'FINISHED'}
+ return {"FINISHED"}
# Other Operations -------------------------------------------------------
@@ -746,10 +749,10 @@ class BTool_Remove(Operator):
bl_idname = "btool.remove"
bl_label = ""
bl_description = "Removes all BoolTool config assigned to it"
- bl_options = {'UNDO'}
+ bl_options = {"UNDO"}
- thisObj : StringProperty("")
- Prop : StringProperty("")
+ thisObj: StringProperty("")
+ Prop: StringProperty("")
@classmethod
def poll(cls, context):
@@ -757,7 +760,7 @@ class BTool_Remove(Operator):
def execute(self, context):
Remove(context, self.thisObj, self.Prop)
- return {'FINISHED'}
+ return {"FINISHED"}
# Apply All to Canvas
@@ -765,7 +768,7 @@ class BTool_AllBrushToMesh(Operator):
bl_idname = "btool.to_mesh"
bl_label = "Apply All Canvas"
bl_description = "Apply all brushes of this canvas"
- bl_options = {'UNDO'}
+ bl_options = {"UNDO"}
@classmethod
def poll(cls, context):
@@ -774,7 +777,7 @@ class BTool_AllBrushToMesh(Operator):
def execute(self, context):
lists = bpy.context.selected_objects
ApplyAll(context, lists)
- return {'FINISHED'}
+ return {"FINISHED"}
# Apply This Brush to the Canvas
@@ -782,7 +785,7 @@ class BTool_BrushToMesh(Operator):
bl_idname = "btool.brush_to_mesh"
bl_label = "Apply this Brush to Canvas"
bl_description = "Apply this brush to the canvas"
- bl_options = {'UNDO'}
+ bl_options = {"UNDO"}
@classmethod
def poll(cls, context):
@@ -794,7 +797,7 @@ class BTool_BrushToMesh(Operator):
def execute(self, context):
ApplyThisBrush(context, bpy.context.active_object)
- return {'FINISHED'}
+ return {"FINISHED"}
# TODO
@@ -812,27 +815,27 @@ class VIEW3D_MT_booltool_menu(Menu):
layout = self.layout
layout.label(text="Auto Boolean")
- layout.operator(OBJECT_OT_BoolTool_Auto_Difference.bl_idname, text='Difference', icon='PIVOT_ACTIVE')
- layout.operator(OBJECT_OT_BoolTool_Auto_Union.bl_idname, text='Union', icon='PIVOT_INDIVIDUAL')
- layout.operator(OBJECT_OT_BoolTool_Auto_Intersect.bl_idname, text='Intersect', icon='PIVOT_MEDIAN')
- layout.operator(OBJECT_OT_BoolTool_Auto_Slice.bl_idname, text='Slice', icon='PIVOT_MEDIAN')
+ layout.operator(OBJECT_OT_BoolTool_Auto_Difference.bl_idname, text="Difference", icon="PIVOT_ACTIVE")
+ layout.operator(OBJECT_OT_BoolTool_Auto_Union.bl_idname, text="Union", icon="PIVOT_INDIVIDUAL")
+ layout.operator(OBJECT_OT_BoolTool_Auto_Intersect.bl_idname, text="Intersect", icon="PIVOT_MEDIAN")
+ layout.operator(OBJECT_OT_BoolTool_Auto_Slice.bl_idname, text="Slice", icon="PIVOT_MEDIAN")
layout.separator()
layout.label(text="Brush Boolean")
- layout.operator(BTool_Diff.bl_idname, icon='PIVOT_ACTIVE')
- layout.operator(BTool_Union.bl_idname, icon='PIVOT_INDIVIDUAL')
- layout.operator(BTool_Inters.bl_idname, icon='PIVOT_MEDIAN')
- layout.operator(BTool_Slice.bl_idname, icon='PIVOT_MEDIAN')
+ layout.operator(BTool_Diff.bl_idname, icon="PIVOT_ACTIVE")
+ layout.operator(BTool_Union.bl_idname, icon="PIVOT_INDIVIDUAL")
+ layout.operator(BTool_Inters.bl_idname, icon="PIVOT_MEDIAN")
+ layout.operator(BTool_Slice.bl_idname, icon="PIVOT_MEDIAN")
- if (isCanvas(context.active_object)):
+ if isCanvas(context.active_object):
layout.separator()
layout.operator(BTool_AllBrushToMesh.bl_idname, icon="MOD_LATTICE", text="Apply All")
Rem = layout.operator(BTool_Remove.bl_idname, icon="CANCEL", text="Remove All")
Rem.thisObj = ""
Rem.Prop = "CANVAS"
- if (isBrush(context.active_object)):
+ if isBrush(context.active_object):
layout.separator()
layout.operator(BTool_BrushToMesh.bl_idname, icon="MOD_LATTICE", text="Apply Brush")
Rem = layout.operator(BTool_Remove.bl_idname, icon="CANCEL", text="Remove Brush")
@@ -846,12 +849,13 @@ def VIEW3D_BoolTool_Menu(self, context):
# ---------------- Toolshelf: Tools ---------------------
+
class VIEW3D_PT_booltool_tools(Panel):
- bl_category = 'objectmode'
+ bl_category = "objectmode"
bl_label = "Bool Tool"
- bl_space_type = 'VIEW_3D'
- bl_region_type = 'UI'
- bl_context = 'objectmode'
+ bl_space_type = "VIEW_3D"
+ bl_region_type = "UI"
+ bl_context = "objectmode"
@classmethod
def poll(cls, context):
@@ -868,18 +872,18 @@ class VIEW3D_PT_booltool_tools(Panel):
row.operator("wm.booltool_help", text="", icon="QUESTION")
main = layout.column(align=True)
- main.enabled = obj.type == 'MESH' and obs_len > 0
+ main.enabled = obj.type == "MESH" and obs_len > 0
col = main.column(align=True)
col.enabled = obs_len > 1
col.label(text="Auto Boolean", icon="MODIFIER")
col.separator()
- col.operator(OBJECT_OT_BoolTool_Auto_Difference.bl_idname, text='Difference', icon='PIVOT_ACTIVE')
- col.operator(OBJECT_OT_BoolTool_Auto_Union.bl_idname, text='Union', icon='PIVOT_INDIVIDUAL')
- col.operator(OBJECT_OT_BoolTool_Auto_Intersect.bl_idname, text='Intersect', icon='PIVOT_MEDIAN')
+ col.operator(OBJECT_OT_BoolTool_Auto_Difference.bl_idname, text="Difference", icon="PIVOT_ACTIVE")
+ col.operator(OBJECT_OT_BoolTool_Auto_Union.bl_idname, text="Union", icon="PIVOT_INDIVIDUAL")
+ col.operator(OBJECT_OT_BoolTool_Auto_Intersect.bl_idname, text="Intersect", icon="PIVOT_MEDIAN")
sub = col.column(align=True)
sub.enabled = obs_len == 2
- sub.operator(OBJECT_OT_BoolTool_Auto_Slice.bl_idname, text='Slice', icon='PIVOT_MEDIAN')
+ sub.operator(OBJECT_OT_BoolTool_Auto_Slice.bl_idname, text="Slice", icon="PIVOT_MEDIAN")
main.separator()
@@ -887,10 +891,10 @@ class VIEW3D_PT_booltool_tools(Panel):
col.enabled = obs_len > 1
col.label(text="Brush Boolean", icon="MODIFIER")
col.separator()
- col.operator(BTool_Diff.bl_idname, text="Difference", icon='PIVOT_ACTIVE')
- col.operator(BTool_Union.bl_idname, text="Union", icon='PIVOT_INDIVIDUAL')
- col.operator(BTool_Inters.bl_idname, text="Intersect", icon='PIVOT_MEDIAN')
- col.operator(BTool_Slice.bl_idname, text="Slice", icon='PIVOT_MEDIAN')
+ col.operator(BTool_Diff.bl_idname, text="Difference", icon="PIVOT_ACTIVE")
+ col.operator(BTool_Union.bl_idname, text="Union", icon="PIVOT_INDIVIDUAL")
+ col.operator(BTool_Inters.bl_idname, text="Intersect", icon="PIVOT_MEDIAN")
+ col.operator(BTool_Slice.bl_idname, text="Slice", icon="PIVOT_MEDIAN")
# TODO Draw Poly Brush
# main.separator()
@@ -903,19 +907,20 @@ class VIEW3D_PT_booltool_tools(Panel):
# ---------- Toolshelf: Properties --------------------------------------------------------
+
class VIEW3D_PT_booltool_config(Panel):
- bl_category = 'objectmode'
+ bl_category = "objectmode"
bl_label = "Properties"
- bl_space_type = 'VIEW_3D'
- bl_region_type = 'UI'
- bl_context = 'objectmode'
+ bl_space_type = "VIEW_3D"
+ bl_region_type = "UI"
+ bl_context = "objectmode"
@classmethod
def poll(cls, context):
result = False
actObj = bpy.context.active_object
- if (isCanvas(actObj) or isBrush(actObj) or isPolyBrush(actObj)):
+ if isCanvas(actObj) or isBrush(actObj) or isPolyBrush(actObj):
result = True
return result
@@ -930,7 +935,7 @@ class VIEW3D_PT_booltool_config(Panel):
if isCanvas(actObj):
row.label(text="CANVAS", icon="MESH_GRID")
row = layout.row()
- row.prop(context.scene, 'BoolHide', text="Hide Bool objects")
+ row.prop(context.scene, "BoolHide", text="Hide Bool objects")
row = layout.row(align=True)
row.operator(BTool_AllBrushToMesh.bl_idname, icon="MOD_LATTICE", text="Apply All")
@@ -945,13 +950,13 @@ class VIEW3D_PT_booltool_config(Panel):
# BRUSH ------------------------------------------------------
if isBrush(actObj):
- if (actObj["BoolToolBrush"] == "UNION"):
+ if actObj["BoolToolBrush"] == "UNION":
icon = "PIVOT_INDIVIDUAL"
- if (actObj["BoolToolBrush"] == "DIFFERENCE"):
+ if actObj["BoolToolBrush"] == "DIFFERENCE":
icon = "PIVOT_MEDIAN"
- if (actObj["BoolToolBrush"] == "INTERSECT"):
+ if actObj["BoolToolBrush"] == "INTERSECT":
icon = "PIVOT_ACTIVE"
- if (actObj["BoolToolBrush"] == "SLICE"):
+ if actObj["BoolToolBrush"] == "SLICE":
icon = "PIVOT_MEDIAN"
row = layout.row(align=True)
@@ -995,12 +1000,13 @@ class VIEW3D_PT_booltool_config(Panel):
# ---------- Toolshelf: Brush Viewer -------------------------------------------------------
+
class VIEW3D_PT_booltool_bviewer(Panel):
- bl_category = 'objectmode'
+ bl_category = "objectmode"
bl_label = "Brush Viewer"
- bl_space_type = 'VIEW_3D'
- bl_region_type = 'UI'
- bl_context = 'objectmode'
+ bl_space_type = "VIEW_3D"
+ bl_region_type = "UI"
+ bl_context = "objectmode"
@classmethod
def poll(cls, context):
@@ -1022,21 +1028,21 @@ class VIEW3D_PT_booltool_bviewer(Panel):
container = self.layout.box()
row = container.row(align=True)
icon = ""
- if ("BTool_" in mod.name):
- if (mod.operation == "UNION"):
+ if "BTool_" in mod.name:
+ if mod.operation == "UNION":
icon = "PIVOT_INDIVIDUAL"
- if (mod.operation == "DIFFERENCE"):
+ if mod.operation == "DIFFERENCE":
icon = "PIVOT_MEDIAN"
- if (mod.operation == "INTERSECT"):
+ if mod.operation == "INTERSECT":
icon = "PIVOT_ACTIVE"
- if (mod.operation == "SLICE"):
+ if mod.operation == "SLICE":
icon = "PIVOT_MEDIAN"
objSelect = row.operator("btool.find_brush", text=mod.object.name, icon=icon, emboss=False)
objSelect.obj = mod.object.name
EnableIcon = "RESTRICT_VIEW_ON"
- if (mod.show_viewport):
+ if mod.show_viewport:
EnableIcon = "RESTRICT_VIEW_OFF"
Enable = row.operator(BTool_EnableBrush.bl_idname, icon=EnableIcon, emboss=False)
Enable.thisObj = mod.object.name
@@ -1072,10 +1078,11 @@ class VIEW3D_PT_booltool_bviewer(Panel):
class WM_OT_BoolTool_Help(Operator):
bl_idname = "wm.booltool_help"
bl_label = "Bool Tool Help"
- bl_description = "Tool Help - click to read some basic information"
+ 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")
@@ -1083,16 +1090,16 @@ class WM_OT_BoolTool_Help(Operator):
layout.separator()
- layout.label(text="Auto Boolean")
+ layout.label(text="Auto Boolean:")
layout.label(text="Apply Boolean operation directly.")
layout.separator()
- layout.label(text="Brush Boolean")
+ layout.label(text="Brush Boolean:")
layout.label(text="Create a Boolean brush setup.")
def execute(self, context):
- return {'FINISHED'}
+ return {"FINISHED"}
def invoke(self, context, event):
return context.window_manager.invoke_popup(self, width=220)
@@ -1115,7 +1122,7 @@ panels = (
VIEW3D_PT_booltool_tools,
VIEW3D_PT_booltool_config,
VIEW3D_PT_booltool_bviewer,
- )
+)
def update_panels(self, context):
@@ -1125,7 +1132,9 @@ def update_panels(self, context):
bpy.utils.unregister_class(panel)
for panel in panels:
- panel.bl_category = context.preferences.addons[__name__].preferences.category
+ panel.bl_category = context.preferences.addons[
+ __name__
+ ].preferences.category
bpy.utils.register_class(panel)
except Exception as e:
@@ -1136,39 +1145,37 @@ def update_panels(self, context):
class PREFS_BoolTool_Props(AddonPreferences):
bl_idname = __name__
- fast_transform : BoolProperty(
- name="Fast Transformations",
- default=False,
- update=UpdateBoolTool_Pref,
- description="Replace the Transform HotKeys (G,R,S)\n"
- "for a custom version that can optimize the visualization of Brushes",
- )
- make_vertex_groups : BoolProperty(
- name="Make Vertex Groups",
- default=False,
- description="When Applying a Brush to the Object it will create\n"
- "a new vertex group for the new faces",
- )
- make_boundary : BoolProperty(
- name="Make Boundary",
- default=False,
- description="When Apply a Brush to the Object it will create a\n"
- "new vertex group of the boundary boolean area",
- )
- use_wire : BoolProperty(
- name="Use Bmesh",
- default=False,
- description="Use The Wireframe Instead of Bounding Box for visualization",
- )
- category : StringProperty(
- name="Tab Category",
- description="Choose a name for the category of the panel",
- default="Tools",
- update=update_panels,
- )
- Enable_Tab_01 : BoolProperty(
- default=False
- )
+ fast_transform: BoolProperty(
+ name="Fast Transformations",
+ default=False,
+ update=UpdateBoolTool_Pref,
+ description="Replace the Transform HotKeys (G,R,S)\n"
+ "for a custom version that can optimize the visualization of Brushes",
+ )
+ make_vertex_groups: BoolProperty(
+ name="Make Vertex Groups",
+ default=False,
+ description="When Applying a Brush to the Object it will create\n"
+ "a new vertex group for the new faces",
+ )
+ make_boundary: BoolProperty(
+ name="Make Boundary",
+ default=False,
+ description="When Apply a Brush to the Object it will create a\n"
+ "new vertex group of the boundary boolean area",
+ )
+ use_wire: BoolProperty(
+ name="Use Bmesh",
+ default=False,
+ description="Use The Wireframe Instead of Bounding Box for visualization",
+ )
+ category: StringProperty(
+ name="Tab Category",
+ description="Choose a name for the category of the panel",
+ default="Tools",
+ update=update_panels,
+ )
+ Enable_Tab_01: BoolProperty(default=False)
def draw(self, context):
layout = self.layout
@@ -1220,17 +1227,14 @@ class PREFS_BoolTool_Props(AddonPreferences):
classes = (
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,
@@ -1246,9 +1250,8 @@ classes = (
BTool_EnableThisBrush,
BTool_EnableFTransform,
BTool_FastTransform,
-
WM_OT_BoolTool_Help,
- )
+)
# ------------------- REGISTER ------------------------------------------------
@@ -1260,17 +1263,17 @@ 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')
+ km = wm.keyconfigs.addon.keymaps.new(name="Object Mode", space_type="EMPTY")
- kmi = km.keymap_items.new(BTool_FastTransform.bl_idname, 'G', 'PRESS')
+ 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 = 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 = km.keymap_items.new(BTool_FastTransform.bl_idname, "S", "PRESS")
kmi.properties.operator = "Scale"
addon_keymapsFastT.append((km, kmi))
@@ -1293,10 +1296,10 @@ def register():
# Scene variables
bpy.types.Scene.BoolHide = BoolProperty(
- default=False,
- description="Hide boolean objects",
- update=update_BoolHide,
- )
+ default=False,
+ description="Hide boolean objects",
+ update=update_BoolHide,
+ )
bpy.types.VIEW3D_MT_object.append(VIEW3D_BoolTool_Menu)
try:
@@ -1307,38 +1310,64 @@ def register():
wm = bpy.context.window_manager
# create the boolean menu hotkey
- km = wm.keyconfigs.addon.keymaps.new(name='Object Mode')
+ km = wm.keyconfigs.addon.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'
+ 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)
+ 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)
+ 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)
+ 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)
+ 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)
+ 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)
+ 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)
+ 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)
+ 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)
+ 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)
+ kmi = km.keymap_items.new(
+ OBJECT_OT_BoolTool_Auto_Slice.bl_idname,
+ "NUMPAD_SLASH",
+ "PRESS",
+ ctrl=True,
+ shift=True,
+ )
addon_keymaps.append((km, kmi))
@@ -1367,4 +1396,4 @@ def unregister():
if __name__ == "__main__":
- register() \ No newline at end of file
+ register()