diff options
Diffstat (limited to 'add_curve_extra_objects/__init__.py')
-rw-r--r-- | add_curve_extra_objects/__init__.py | 126 |
1 files changed, 109 insertions, 17 deletions
diff --git a/add_curve_extra_objects/__init__.py b/add_curve_extra_objects/__init__.py index ec45c1c1..e24b770f 100644 --- a/add_curve_extra_objects/__init__.py +++ b/add_curve_extra_objects/__init__.py @@ -45,8 +45,91 @@ else: from . import add_surface_plane_cone import bpy -from bpy.types import Menu +from bpy.types import Menu, AddonPreferences +from bpy.props import StringProperty, IntProperty, BoolProperty +def convert_old_presets(data_path, msg_data_path, old_preset_subdir, new_preset_subdir, fixdic={}, ext=".py"): + ''' convert old presets ''' + + def convert_presets(self, context): + if not getattr(self, data_path, False): + return None + import os + + target_path = os.path.join("presets", old_preset_subdir) + target_path = bpy.utils.user_resource('SCRIPTS', + target_path) + + # created an anytype op to run against preset + op = type('', (), {})() + + files = [f for f in os.listdir(target_path) if f.endswith(ext)] + if not files: + print("No old presets in %s" % target_path) + setattr(self, msg_data_path, "No old presets") + return None + + new_target_path = os.path.join("presets", new_preset_subdir) + new_target_path = bpy.utils.user_resource('SCRIPTS', + new_target_path, + create=True) + for f in files: + file = open(os.path.join(target_path, f)) + for line in file: + if line.startswith("op."): + exec(line) + file.close() + for key, items in fixdic.items(): + if hasattr(op, key) and isinstance(getattr(op, key), int): + setattr(op, key, items[getattr(op, key)]) + # create a new one + new_file_path = os.path.join(new_target_path, f) + if os.path.isfile(new_file_path): + # do nothing + print("Preset %s already exists, passing..." % f) + continue + file_preset = open(new_file_path, 'w') + file_preset.write("import bpy\n") + file_preset.write("op = bpy.context.active_operator\n") + for prop, value in vars(op).items(): + file_preset.write("op.%s = %s\n" % (prop, str(value))) + file_preset.close() + print("Writing new preset to %s" % new_file_path) + + setattr(self, msg_data_path, "Converted %d old presets" % len(files)) + return None + return convert_presets + + +class CurveExtraObjectsAddonPreferences(AddonPreferences): + bl_idname = __name__ + + spiral_fixdic = {"spiral_type": ['ARCH', 'ARCH', 'LOG', 'SPHERE', 'TORUS'], + "curve_type": ['POLY', 'NURB'], + "spiral_direction": ['COUNTER_CLOCKWISE', 'CLOCKWISE'] + } + update_spriral_presets_msg = StringProperty(default="Nothing to do") + update_spiral_presets = BoolProperty( + name="Update Old Presets", + description="Update presets to reflect data changes", + default=False, + update=convert_old_presets("update_spiral_presets", # this props name + "update_spiral_presets_msg", # message prop + "operator/curve.spirals", + "curve_extras/curve.spirals", + fixdic=spiral_fixdic) + ) + + def draw(self, context): + layout = self.layout + layout.label(text="Spirals") + if self.update_spiral_presets: + layout.label(self.update_spriral_presets_msg, icon='FILE_TICK') + else: + layout.prop(self, "update_spiral_presets") + + +# TODO check if this is even used. class INFO_MT_curve_extras_add(Menu): # Define the "Extras" menu bl_idname = "curve_extra_objects_add" @@ -55,31 +138,40 @@ class INFO_MT_curve_extras_add(Menu): def draw(self, context): layout = self.layout layout.operator_context = 'INVOKE_REGION_WIN' - layout.operator("mesh.curveaceous_galore", - text="Curve Profiles") - layout.operator("curve.spirals", - text="Spirals") + layout.operator_menu_enum("mesh.curveaceous_galore", + "ProfileType", + ) + layout.operator_menu_enum("curve.spirals", + "spiral_type", + icon='FORCE_VORTEX') layout.operator("curve.torus_knot_plus", text="Torus Knot Plus") # Define "Extras" menus def menu_func(self, context): - self.layout.separator() - self.layout.operator("mesh.curveaceous_galore", - text="Curve Profiles") - self.layout.operator("curve.torus_knot_plus", - text="Torus Knot Plus") - self.layout.operator("curve.spirals", - text="Spirals") + if context.mode != 'OBJECT': + # fix in D2142 will allow to work in EDIT_CURVE + return None + layout = self.layout + layout.separator() + layout.operator_menu_enum("mesh.curveaceous_galore", + "ProfileType", + ) + layout.operator_menu_enum("curve.spirals", + "spiral_type", + icon='FORCE_VORTEX') + layout.operator("curve.torus_knot_plus", text="Torus Knot Plus") def menu_surface(self, context): layout = self.layout self.layout.separator() - self.layout.operator("object.add_surface_wedge", text="Wedge", icon="MOD_CURVE") - self.layout.operator("object.add_surface_cone", text="Cone", icon="MOD_CURVE") - self.layout.operator("object.add_surface_star", text="Star", icon="MOD_CURVE") - self.layout.operator("object.add_surface_plane", text="Plane", icon="MOD_CURVE") - self.layout.operator("curve.smooth_x_times", text="Special Smooth", icon="MOD_CURVE") + if context.mode == 'EDIT_SURFACE': + self.layout.operator("curve.smooth_x_times", text="Special Smooth", icon="MOD_CURVE") + elif context.mode == 'OBJECT': + self.layout.operator("object.add_surface_wedge", text="Wedge", icon="MOD_CURVE") + self.layout.operator("object.add_surface_cone", text="Cone", icon="MOD_CURVE") + self.layout.operator("object.add_surface_star", text="Star", icon="MOD_CURVE") + self.layout.operator("object.add_surface_plane", text="Plane", icon="MOD_CURVE") def register(): bpy.utils.register_module(__name__) |