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:
authorlijenstina <lijenstina@gmail.com>2017-06-05 15:53:42 +0300
committerlijenstina <lijenstina@gmail.com>2017-06-05 15:53:42 +0300
commitbe1ffdc175be417a0f9eabc95e6c7c6f243dab01 (patch)
tree728a3c73d32c84aece48de779e0cbf96f4bff3ed /object_fracture_crack/operator.py
parent6feeb4de6d939c17d931f2763043ea9224154949 (diff)
Cell Fracture Crack It: Fixes, clean up
Bumped verison to 0.1.1 Pep8 cleanup Replace deprecated imp calls with importlib Small UI changes Make the Panel by default closed Move scene properties to a PropertyGroup they can be accessed with context.scene.crackit Fixed some polling issues related to using Fracture (as the operator will ignore objects that are not processed) causing the operation to fail further on Added an option for using the original names or the Enum ones for the materials shipped in the Blend file More robust error handling Add a button for the wm.addon_userpref_show to open the Cell Fracture add-on if it is not enabled
Diffstat (limited to 'object_fracture_crack/operator.py')
-rw-r--r--object_fracture_crack/operator.py229
1 files changed, 141 insertions, 88 deletions
diff --git a/object_fracture_crack/operator.py b/object_fracture_crack/operator.py
index 5f1b51e7..d6b2da7b 100644
--- a/object_fracture_crack/operator.py
+++ b/object_fracture_crack/operator.py
@@ -1,111 +1,164 @@
+# gpl: author Nobuyuki Hirakata
+
import bpy
+from bpy.types import (
+ Operator,
+ Panel,
+ )
from . import crack_it
-# Class for input and execution settings.
-class FractureOperation(bpy.types.Operator):
- bl_idname = 'mesh.crackit_fracture' # Access by bpy.ops.mesh.crackit_fracture.
- bl_label = "Crack It!" # Label of button on menu.
- bl_description = "Make crack by cell fracture addon."
+def check_object_cell_fracture():
+ if "object_fracture_cell" in bpy.context.user_preferences.addons.keys():
+ return True
+ return False
+
+
+# Access by bpy.ops.mesh.crackit_fracture
+class FractureOperation(Operator):
+ bl_idname = "mesh.crackit_fracture"
+ bl_label = "Crack it!"
+ bl_description = ("Make cracks using the cell fracture add-on\n"
+ "Needs only one Selected Mesh Object")
bl_options = {'REGISTER', 'UNDO'}
- # Input after execution------------------------
- # Reference by self.~ in execute().
-
- # -----------------------------------------
-
- '''
@classmethod
def poll(cls, context):
- return (context.object is not None)
-
- '''
+ obj = context.active_object
+ sel_obj = len(context.selected_objects) == 1
+
+ return (obj is not None and obj.type == "MESH" and sel_obj)
def execute(self, context):
- sce = context.scene
-
- crack_it.makeFracture(child_verts=sce.crackit_fracture_childverts, division=sce.crackit_fracture_div,
- scaleX=sce.crackit_fracture_scalex, scaleY=sce.crackit_fracture_scaley, scaleZ=sce.crackit_fracture_scalez,
- margin=sce.crackit_fracture_margin)
- crack_it.addModifiers()
- crack_it.multiExtrude(off=sce.crackit_extrude_offset,
- var2=sce.crackit_extrude_random, var3=sce.crackit_extrude_random)
- bpy.ops.object.shade_smooth()
+ if check_object_cell_fracture():
+ crackit = context.scene.crackit
+ try:
+ crack_it.makeFracture(
+ child_verts=crackit.fracture_childverts,
+ division=crackit.fracture_div, scaleX=crackit.fracture_scalex,
+ scaleY=crackit.fracture_scaley, scaleZ=crackit.fracture_scalez,
+ margin=crackit.fracture_margin
+ )
+ crack_it.addModifiers()
+ crack_it.multiExtrude(
+ off=crackit.extrude_offset,
+ var2=crackit.extrude_random, var3=crackit.extrude_random
+ )
+ bpy.ops.object.shade_smooth()
+
+ except Exception as e:
+ crack_it.error_handlers(
+ self, "mesh.crackit_fracture", e, "Crack It! could not be completed."
+ )
+ return {"CANCELLED"}
+ else:
+ self.report({'WARNING'},
+ "Depends on Object: Cell Fracture addon. Please enable it first. "
+ "Operation Cancelled"
+ )
+ return {"CANCELLED"}
+
return {'FINISHED'}
-# Apply material preset.
-class MaterialOperation(bpy.types.Operator):
- bl_idname = 'mesh.crackit_material' # Access by bpy.ops.mesh.crackit_material.
- bl_label = "Apply Material" # Label of button on menu.
- bl_description = "Apply a preset material"
+# Apply material preset
+# Access by bpy.ops.mesh.crackit_material
+class MaterialOperation(Operator):
+ bl_idname = "mesh.crackit_material"
+ bl_label = "Apply Material"
+ bl_description = ("Apply a preset material\n"
+ "The Material will be applied to the Active Object\n"
+ "from the type of Mesh, Curve, Surface, Font, Meta")
bl_options = {'REGISTER', 'UNDO'}
- # Input after execution------------------------
- # Reference by self.~ in execute().
-
- # -----------------------------------------
-
- '''
@classmethod
def poll(cls, context):
- return (context.object is not None)
-
- '''
+ obj = context.active_object
+ # included - type that can have materials
+ included = ['MESH', 'CURVE', 'SURFACE', 'FONT', 'META']
+ return (obj is not None and obj.type in included)
def execute(self, context):
- sce = context.scene
+ crackit = context.scene.crackit
+ mat_name = crackit.material_preset
+ mat_lib_name = crackit.material_lib_name
+ mat_ui_name = crack_it.get_ui_mat_name(mat_name) if not mat_lib_name else mat_name
+
+ try:
+ crack_it.appendMaterial(
+ addon_path=crackit.material_addonpath,
+ material_name=mat_name,
+ mat_ui_names=mat_ui_name
+ )
+ except Exception as e:
+ crack_it.error_handlers(
+ self, "mesh.crackit_material", e,
+ "The active Object could not have the Material {} applied".format(mat_ui_name)
+ )
+ return {"CANCELLED"}
- crack_it.appendMaterial(addon_path=sce.crackit_material_addonpath, material_name=sce.crackit_material_preset)
return {'FINISHED'}
-# Menu settings.
-class crackitPanel(bpy.types.Panel):
- bl_label = "Crack it!" # title.
- bl_idname = 'crack_it' # id to reference.
- bl_space_type = 'VIEW_3D' # 3Dview.
- bl_region_type = 'TOOLS' # make menu on tool shelf.
- bl_category = 'Create' # Tab name on tool shelf.
- bl_context = (('objectmode')) # Mode to show the menu.
-
- # Menu.
+
+# Menu settings
+class crackitPanel(Panel):
+ bl_label = "Crack it!"
+ bl_idname = 'crack_it'
+ bl_space_type = "VIEW_3D"
+ bl_region_type = "TOOLS"
+ bl_category = "Create"
+ bl_context = 'objectmode'
+ bl_options = {"DEFAULT_CLOSED"}
+
def draw(self, context):
- obj = context.object
- sce = context.scene
- layout = self.layout
-
- # Crack input
- box = layout.box()
- row = box.row()
- row.label("Crack")
- # Warning if fracture cell addon is not enabled.
- if 'object_fracture_cell' not in bpy.context.user_preferences.addons.keys():
- row = box.row()
- row.label("Note: Please enable 'Object: Cell Fracture' addon!")
- row = box.row()
- row.prop(sce, 'crackit_fracture_childverts')
- row = box.row()
- row.prop(sce, 'crackit_fracture_scalex') # bpy.types.Scene.crackit_fracture_scalex.
- row = box.row()
- row.prop(sce, 'crackit_fracture_scaley')
- row = box.row()
- row.prop(sce, 'crackit_fracture_scalez')
- row = box.row()
- row.prop(sce, 'crackit_fracture_div')
- row = box.row()
- row.prop(sce, 'crackit_fracture_margin')
- row = box.row()
- row.prop(sce, 'crackit_extrude_offset')
- row = box.row()
- row.prop(sce, 'crackit_extrude_random')
- row = box.row()
- row.operator(FractureOperation.bl_idname) # Execute button.
-
- # material Preset:
- box = layout.box()
- row = box.row()
- row.label("Material Preset")
- row = box.row()
- row.prop(sce, 'crackit_material_preset')
- row = box.row()
- row.operator(MaterialOperation.bl_idname) # Execute button. \ No newline at end of file
+ crackit = context.scene.crackit
+ layout = self.layout
+
+ # Crack input
+ box = layout.box()
+ row = box.row()
+
+ # Warning if the fracture cell addon is not enabled
+ if not check_object_cell_fracture():
+ col = box.column()
+ col.label(text="Please enable Object: Cell Fracture addon", icon="INFO")
+ col.separator()
+ col.operator("wm.addon_userpref_show",
+ text="Go to Cell Fracture addon",
+ icon="PREFERENCES").module = "object_fracture_cell"
+
+ layout.separator()
+ return
+ else:
+ row.operator(FractureOperation.bl_idname, icon="SPLITSCREEN")
+
+ row = box.row()
+ row.prop(crackit, "fracture_childverts")
+
+ col = box.column(align=True)
+ col.prop(crackit, "fracture_scalex")
+ col.prop(crackit, "fracture_scaley")
+ col.prop(crackit, "fracture_scalez")
+
+ col = box.column(align=True)
+ col.label("Settings:")
+ col.prop(crackit, "fracture_div")
+ col.prop(crackit, "fracture_margin")
+
+ col = box.column(align=True)
+ col.label("Extrude:")
+ col.prop(crackit, "extrude_offset")
+ col.prop(crackit, "extrude_random")
+
+ # material Preset:
+ box = layout.box()
+ row = box.row()
+ row.label("Material Preset:")
+ row_sub = row.row()
+ row_sub.prop(crackit, "material_lib_name", text="",
+ toggle=True, icon="LONGDISPLAY")
+ row = box.row()
+ row.prop(crackit, "material_preset")
+
+ row = box.row()
+ row.operator(MaterialOperation.bl_idname)