Newer
Older
Jonathan Williamson
committed
bl_info = {
"name": "Boolean Operators",
"location": "View3D > Toolshelf > Addons",
"description": "Add Boolean Tools for running boolean operations on two selected objects.",
Jonathan Williamson
committed
"author": "Jonathan Williamson",
CoDEmanX
committed
"version": (0, 4),
"wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/3D_interaction/booleanoperators",
CoDEmanX
committed
"tracker_url": "https://developer.blender.org/T34502",
CoDEmanX
committed
Jonathan Williamson
committed
import bpy
###------ Create Boolean Operators -------###
CoDEmanX
committed
Jonathan Williamson
committed
class boolean(bpy.types.Operator):
"""Boolean the currently selected objects"""
bl_idname = "mesh.boolean"
bl_label = "Boolean Operator"
CoDEmanX
committed
bl_options = {'REGISTER', 'UNDO'}
Jonathan Williamson
committed
modOp = bpy.props.StringProperty()
CoDEmanX
committed
@classmethod
def poll(cls, context):
return len(context.selected_objects) > 0
CoDEmanX
committed
Jonathan Williamson
committed
def execute(self, context):
CoDEmanX
committed
scene = bpy.context.scene
CoDEmanX
committed
Jonathan Williamson
committed
modName = "Bool"
CoDEmanX
committed
Jonathan Williamson
committed
activeObj = context.active_object
selected = context.selected_objects
if selected:
if len(selected) > 1:
if len(selected) == 2:
for ob in selected:
Jonathan Williamson
committed
nonActive = ob
CoDEmanX
committed
bpy.ops.object.modifier_add(type="BOOLEAN")
Jonathan Williamson
committed
for mod in activeObj.modifiers:
if mod.type == 'BOOLEAN':
mod.operation = self.modOp
mod.object = nonActive
mod.name = modName
CoDEmanX
committed
Jonathan Williamson
committed
bpy.ops.object.modifier_apply(apply_as='DATA', modifier=modName)
CoDEmanX
committed
scene.objects.active = nonActive
Jonathan Williamson
committed
activeObj.select = False
bpy.ops.object.delete(use_global=False)
activeObj.select = True
Jonathan Williamson
committed
else:
self.report({'INFO'}, "Select only 2 objects at a time")
else:
self.report({'INFO'}, "Only 1 object selected")
else:
self.report({'INFO'}, "No objects selected")
CoDEmanX
committed
return {"FINISHED"}
Jonathan Williamson
committed
CoDEmanX
committed
###------- Create the Boolean Menu --------###
Jonathan Williamson
committed
class booleanMenu(bpy.types.Menu):
bl_label = "Boolean Tools"
bl_idname = "object.boolean_menu"
CoDEmanX
committed
Jonathan Williamson
committed
def draw(self, context):
layout = self.layout
CoDEmanX
committed
Jonathan Williamson
committed
union = layout.operator("mesh.boolean", "Union")
union.modOp = 'UNION'
CoDEmanX
committed
Jonathan Williamson
committed
intersect = layout.operator("mesh.boolean", "Intersect")
intersect.modOp = 'INTERSECT'
CoDEmanX
committed
Jonathan Williamson
committed
difference = layout.operator("mesh.boolean", "Difference")
difference.modOp = 'DIFFERENCE'
CoDEmanX
committed
###------- Create the Boolean Toolbar --------###
Jonathan Williamson
committed
class booleanToolbar(bpy.types.Panel):
bl_label = "Boolean Tools"
bl_idname = "object.boolean_toolbar"
bl_space_type = 'VIEW_3D'
bl_region_type = 'TOOLS'
bl_context = 'objectmode'
CoDEmanX
committed
Jonathan Williamson
committed
def draw(self, context):
layout = self.layout
CoDEmanX
committed
Jonathan Williamson
committed
col = layout.column(align=True)
CoDEmanX
committed
Jonathan Williamson
committed
col.label(text="Operation:", icon="MOD_BOOLEAN")
CoDEmanX
committed
Jonathan Williamson
committed
row = col.row()
union = row.operator("mesh.boolean", "Union")
union.modOp = 'UNION'
CoDEmanX
committed
Jonathan Williamson
committed
intersect = row.operator("mesh.boolean", "Intersect")
intersect.modOp = 'INTERSECT'
CoDEmanX
committed
Jonathan Williamson
committed
difference = row.operator("mesh.boolean", "Difference")
difference.modOp = 'DIFFERENCE'
CoDEmanX
committed
Jonathan Williamson
committed
###------- Define the Hotkeys and Register Operators ---------###
CoDEmanX
committed
Jonathan Williamson
committed
def register():
bpy.utils.register_class(boolean)
bpy.utils.register_class(booleanMenu)
bpy.utils.register_class(booleanToolbar)
CoDEmanX
committed
Jonathan Williamson
committed
wm = bpy.context.window_manager
CoDEmanX
committed
Jonathan Williamson
committed
# create the boolean menu hotkey
# 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 = 'object.boolean_menu'
Jonathan Williamson
committed
CoDEmanX
committed
Jonathan Williamson
committed
def unregister():
bpy.utils.unregister_class(boolean)
bpy.utils.unregister_class(booleanMenu)
bpy.utils.unregister_class(booleanToolbar)
CoDEmanX
committed
Jonathan Williamson
committed
# remove keymaps when add-on is deactivated
wm = bpy.context.window_manager
for km in addon_keymaps:
wm.keyconfigs.addon.keymaps.remove(km)
del addon_keymaps[:]
CoDEmanX
committed
Jonathan Williamson
committed
if __name__ == "__main__":
register()