192 lines
7.5 KiB
Python
192 lines
7.5 KiB
Python
import bpy
|
|
from . import ui
|
|
|
|
|
|
#### ------------------------------ FUNCTIONS ------------------------------ ####
|
|
|
|
def update_sidebar_category(self, context):
|
|
"""Change sidebar category of add-ons panel."""
|
|
|
|
panel_classes = [
|
|
ui.VIEW3D_PT_boolean,
|
|
ui.VIEW3D_PT_boolean_properties,
|
|
ui.VIEW3D_PT_boolean_cutters,
|
|
]
|
|
|
|
for cls in panel_classes:
|
|
try:
|
|
bpy.utils.unregister_class(cls)
|
|
except:
|
|
pass
|
|
cls.bl_category = self.sidebar_category
|
|
bpy.utils.register_class(cls)
|
|
|
|
|
|
|
|
#### ------------------------------ PREFERENCES ------------------------------ ####
|
|
|
|
class BoolToolPreferences(bpy.types.AddonPreferences):
|
|
bl_idname = __package__
|
|
|
|
# UI
|
|
show_in_sidebar: bpy.props.BoolProperty(
|
|
name = "Show Addon Panel in Sidebar",
|
|
description = "Add a sidebar panel in 3D Viewport with add-ons operators and properties",
|
|
default = True,
|
|
)
|
|
sidebar_category: bpy.props.StringProperty(
|
|
name = "Category Name",
|
|
description = "Sidebar category name. Using the name of the existing category will add panel there",
|
|
default = "Edit",
|
|
update = update_sidebar_category,
|
|
)
|
|
|
|
# Defaults
|
|
solver: bpy.props.EnumProperty(
|
|
name = "Boolean Solver",
|
|
description = "Which solver to use for automatic and brush booleans",
|
|
items = [('FLOAT', "Float", ""),
|
|
('EXACT', "Exact", ""),
|
|
('MANIFOLD', "Manifold", "")],
|
|
default = 'FLOAT',
|
|
)
|
|
wireframe: bpy.props.BoolProperty(
|
|
name = "Display Cutters as Wireframe",
|
|
description = ("When enabled cutters will be displayed as wireframes, instead of bounding boxes.\n"
|
|
"It's better for visualizating the shape, but might be harder to see and have performance cost"),
|
|
default = False,
|
|
)
|
|
show_in_editmode: bpy.props.BoolProperty(
|
|
name = "Enable 'Show in Edit Mode' by Default",
|
|
description = "Every new boolean modifier created with brush boolean wil have 'Show in Edit Mode' enabled by default",
|
|
default = True,
|
|
)
|
|
|
|
# Advanced
|
|
use_collection: bpy.props.BoolProperty(
|
|
name = "Put Cutters in Collection",
|
|
description = ("Brush boolean operators will put all cutters in same collection, and create one if it doesn't exist.\n"
|
|
"Useful for scene management, and quickly selecting and removing all clutter when needed"),
|
|
default = True,
|
|
)
|
|
collection_name: bpy.props.StringProperty(
|
|
name = "Collection Name",
|
|
default = "boolean_cutters",
|
|
)
|
|
parent: bpy.props.BoolProperty(
|
|
name = "Parent Cutters to Object",
|
|
description = ("Cutters will be parented to first canvas they're applied to. Works best when one cutter is used one canvas.\n"
|
|
"NOTE: This doesn't affect Carver tool, which has its own property for this"),
|
|
default = True,
|
|
)
|
|
apply_order: bpy.props.EnumProperty(
|
|
name = "When Applying Cutters...",
|
|
description = ("What happens when boolean cutters are applied on object.\n"
|
|
"Either when performing auto-boolean, using 'Apply All Cutters' operator.\n"
|
|
"NOTE: This doesn't apply to Carver tool on 'Destructive' mode; or when applying individual cutters"),
|
|
items = (('ALL', "Apply All Modifiers", "All modifiers on object will be applied (this includes shape keys as well)"),
|
|
('BEFORE', "Apply Booleans & Everything Before", "Alongside boolean modifiers all modifiers will be applied that come before the last boolean"),
|
|
('BOOLEANS', "Only Apply Booleans", "Only apply boolean modifiers. This method will fail if object has shape keys")),
|
|
default = 'ALL',
|
|
)
|
|
pin: bpy.props.BoolProperty(
|
|
name = "Pin Boolean Modifiers",
|
|
description = ("When enabled boolean modifiers will be placed above every other modifier on the object (if there are any).\n"
|
|
"Order of modifiers can drastically affect the result (especially when performing auto boolean).\n"
|
|
"NOTE: This doesn't affect Carver tool, which has its own property for this"),
|
|
default = False,
|
|
)
|
|
|
|
# Features
|
|
fast_modifier_apply: bpy.props.BoolProperty(
|
|
name = "Faster Destructive Booleans",
|
|
description = ("Experimental method of applying modifiers that results in 30-50% faster destructive booleans.\n"
|
|
"Performance improvements also affect the add-ons operators that apply cutters.\n"
|
|
"However, changing modifier properties in the redo panel (like material transfer)\n"
|
|
"is not available for this method yet."),
|
|
default = False,
|
|
)
|
|
double_click: bpy.props.BoolProperty(
|
|
name = "Double-click Select",
|
|
description = ("Select boolean cutters by dbl-clicking on the boolean modifier.\n"
|
|
"This feature works in entire modifier properties area, not just on boolean modifier header,\n"
|
|
"therefore can result in lot of misclicks and unintended selections."),
|
|
default = False,
|
|
)
|
|
|
|
# Debug
|
|
versioning: bpy.props.BoolProperty(
|
|
name = "Versioning",
|
|
description = ("Because of the drastic changes in add-on data, it's necessary to do versioning when loading old files\n"
|
|
"where Bool Tool cutters(brushes) are not applied. If you don't have files like that, you can ignore this")
|
|
)
|
|
experimental: bpy.props.BoolProperty(
|
|
name = "Experimental",
|
|
description = "Enable experimental features",
|
|
default = False,
|
|
)
|
|
|
|
def draw(self, context):
|
|
layout = self.layout
|
|
layout.use_property_split = True
|
|
layout.use_property_decorate = False
|
|
|
|
# UI
|
|
col = layout.column(align=True, heading="Show in Sidebar")
|
|
row = col.row(align=True)
|
|
sub = row.row(align=True)
|
|
sub.prop(self, "show_in_sidebar", text="")
|
|
sub = sub.row(align=True)
|
|
sub.active = self.show_in_sidebar
|
|
sub.prop(self, "sidebar_category", text="")
|
|
|
|
# Defaults
|
|
layout.separator()
|
|
col = layout.column(align=True)
|
|
row = col.row(align=True)
|
|
row.prop(self, "solver", text="Solver", expand=True)
|
|
col.prop(self, "wireframe")
|
|
col.prop(self, "show_in_editmode")
|
|
|
|
# Advanced
|
|
layout.separator()
|
|
col = layout.column(align=True, heading="Put Cutters in Collection")
|
|
row = col.row(align=True)
|
|
sub = row.row(align=True)
|
|
sub.prop(self, "use_collection", text="")
|
|
sub = sub.row(align=True)
|
|
sub.active = self.show_in_sidebar
|
|
sub.prop(self, "collection_name", text="")
|
|
|
|
col.prop(self, "parent")
|
|
col.prop(self, "apply_order")
|
|
col.prop(self, "pin")
|
|
|
|
# Features
|
|
layout.separator()
|
|
col = layout.column(align=True, heading="Features")
|
|
col.prop(self, "fast_modifier_apply")
|
|
col.prop(self, "double_click")
|
|
|
|
# Experimentals
|
|
layout.separator()
|
|
col = layout.column(align=True)
|
|
col.prop(self, "versioning", text="⚠ Versioning")
|
|
col.prop(self, "experimental", text="⚠ Experimental")
|
|
|
|
|
|
|
|
#### ------------------------------ REGISTRATION ------------------------------ ####
|
|
|
|
classes = [
|
|
BoolToolPreferences,
|
|
]
|
|
|
|
def register():
|
|
for cls in classes:
|
|
bpy.utils.register_class(cls)
|
|
|
|
def unregister():
|
|
for cls in reversed(classes):
|
|
bpy.utils.unregister_class(cls)
|