diff options
Diffstat (limited to 'release/scripts/op')
-rw-r--r-- | release/scripts/op/add_armature_human.py | 2 | ||||
-rw-r--r-- | release/scripts/op/add_mesh_torus.py | 2 | ||||
-rw-r--r-- | release/scripts/op/console_python.py | 10 | ||||
-rw-r--r-- | release/scripts/op/fcurve_euler_filter.py | 7 | ||||
-rw-r--r-- | release/scripts/op/image.py | 35 | ||||
-rw-r--r-- | release/scripts/op/mesh.py | 20 | ||||
-rw-r--r-- | release/scripts/op/nla.py | 4 | ||||
-rw-r--r-- | release/scripts/op/object.py | 38 | ||||
-rw-r--r-- | release/scripts/op/object_align.py | 5 | ||||
-rw-r--r-- | release/scripts/op/object_randomize_transform.py | 2 | ||||
-rw-r--r-- | release/scripts/op/presets.py | 29 | ||||
-rw-r--r-- | release/scripts/op/screen_play_rendered_anim.py | 8 | ||||
-rw-r--r-- | release/scripts/op/sequencer.py | 21 | ||||
-rw-r--r-- | release/scripts/op/uv.py | 9 | ||||
-rw-r--r-- | release/scripts/op/uvcalc_follow_active.py | 5 | ||||
-rw-r--r-- | release/scripts/op/uvcalc_smart_project.py | 5 | ||||
-rw-r--r-- | release/scripts/op/vertexpaint_dirt.py | 4 | ||||
-rw-r--r-- | release/scripts/op/wm.py | 191 |
18 files changed, 241 insertions, 156 deletions
diff --git a/release/scripts/op/add_armature_human.py b/release/scripts/op/add_armature_human.py index 164bbfb100b..5d6ec1f559f 100644 --- a/release/scripts/op/add_armature_human.py +++ b/release/scripts/op/add_armature_human.py @@ -606,12 +606,10 @@ menu_func = (lambda self, context: self.layout.operator(AddHuman.bl_idname, def register(): - bpy.types.register(AddHuman) bpy.types.INFO_MT_armature_add.append(menu_func) def unregister(): - bpy.types.unregister(AddHuman) bpy.types.INFO_MT_armature_add.remove(menu_func) if __name__ == "__main__": diff --git a/release/scripts/op/add_mesh_torus.py b/release/scripts/op/add_mesh_torus.py index 16bf4e1c92c..d64b92a8b19 100644 --- a/release/scripts/op/add_mesh_torus.py +++ b/release/scripts/op/add_mesh_torus.py @@ -137,12 +137,10 @@ def menu_func(self, context): def register(): - bpy.types.register(AddTorus) bpy.types.INFO_MT_mesh_add.append(menu_func) def unregister(): - bpy.types.unregister(AddTorus) bpy.types.INFO_MT_mesh_add.remove(menu_func) if __name__ == "__main__": diff --git a/release/scripts/op/console_python.py b/release/scripts/op/console_python.py index 2881e87fe00..cc0f3673e5c 100644 --- a/release/scripts/op/console_python.py +++ b/release/scripts/op/console_python.py @@ -44,16 +44,17 @@ def get_console(console_id): from code import InteractiveConsole consoles = getattr(get_console, "consoles", None) + hash_next = hash(bpy.context.manager) if consoles is None: consoles = get_console.consoles = {} + get_console.consoles_namespace_hash = hash_next else: # check if clearning the namespace is needed to avoid a memory leak. # the window manager is normally loaded with new blend files # so this is a reasonable way to deal with namespace clearing. # bpy.data hashing is reset by undo so cant be used. hash_prev = getattr(get_console, "consoles_namespace_hash", 0) - hash_next = hash(bpy.context.manager) if hash_prev != hash_next: get_console.consoles_namespace_hash = hash_next @@ -205,6 +206,10 @@ def autocomplete(context): scrollback = "" scrollback_error = "" + if _BPY_MAIN_OWN: + main_mod_back = sys.modules["__main__"] + sys.modules["__main__"] = console._bpy_main_mod + try: current_line = sc.history[-1] line = current_line.line @@ -223,6 +228,9 @@ def autocomplete(context): import traceback scrollback_error = traceback.format_exc() + if _BPY_MAIN_OWN: + sys.modules["__main__"] = main_mod_back + # Separate automplete output by command prompts if scrollback != '': bpy.ops.console.scrollback_append(text=sc.prompt + current_line.line, type='INPUT') diff --git a/release/scripts/op/fcurve_euler_filter.py b/release/scripts/op/fcurve_euler_filter.py index 39c226294ee..c6f5ddd12e4 100644 --- a/release/scripts/op/fcurve_euler_filter.py +++ b/release/scripts/op/fcurve_euler_filter.py @@ -48,7 +48,8 @@ class DiscontFilterOp(bpy.types.Operator): bl_idname = "graph.euler_filter" bl_label = "Filter out discontinuities in the active fcurves" - def poll(self, context): + @classmethod + def poll(cls, context): return context.active_object != None def execute(self, context): @@ -56,10 +57,10 @@ class DiscontFilterOp(bpy.types.Operator): return {'FINISHED'} def register(): - bpy.types.register(DiscontFilterOp) + pass def unregister(): - bpy.types.unregister(DiscontFilterOp) + pass if __name__ == "__main__": register() diff --git a/release/scripts/op/image.py b/release/scripts/op/image.py index be583012d7a..c393041d22c 100644 --- a/release/scripts/op/image.py +++ b/release/scripts/op/image.py @@ -56,13 +56,15 @@ class EditExternally(bpy.types.Operator): return image_editor def execute(self, context): + import os import subprocess - filepath = self.properties.filepath - image_editor = self._editor_guess(context) + filepath = bpy.path.abspath(self.properties.filepath) + + if not os.path.exists(filepath): + self.report('ERROR', "Image path '%s' not found." % filepath) + return {'CANCELLED'} - cmd = [] - cmd.extend(image_editor) - cmd.append(bpy.utils.expandpath(filepath)) + cmd = self._editor_guess(context) + [filepath] subprocess.Popen(cmd) @@ -91,7 +93,7 @@ class SaveDirty(bpy.types.Operator): unique_paths = set() for image in bpy.data.images: if image.dirty: - filepath = bpy.utils.expandpath(image.filepath) + filepath = bpy.path.abspath(image.filepath) if "\\" not in filepath and "/" not in filepath: self.report({'WARNING'}, "Invalid path: " + filepath) elif filepath in unique_paths: @@ -133,7 +135,7 @@ class ProjectEdit(bpy.types.Operator): filepath = os.path.basename(bpy.data.filepath) filepath = os.path.splitext(filepath)[0] - # filepath = bpy.utils.clean_name(filepath) # fixes <memory> rubbish, needs checking + # filepath = bpy.path.clean_name(filepath) # fixes <memory> rubbish, needs checking if filepath.startswith(".") or filepath == "": # TODO, have a way to check if the file is saved, assume .B25.blend @@ -145,12 +147,12 @@ class ProjectEdit(bpy.types.Operator): obj = context.object if obj: - filepath += "_" + bpy.utils.clean_name(obj.name) + filepath += "_" + bpy.path.clean_name(obj.name) filepath_final = filepath + "." + EXT i = 0 - while os.path.exists(bpy.utils.expandpath(filepath_final)): + while os.path.exists(bpy.path.abspath(filepath_final)): filepath_final = filepath + ("%.3d.%s" % (i, EXT)) i += 1 @@ -186,23 +188,12 @@ class ProjectApply(bpy.types.Operator): return {'FINISHED'} -classes = [ - EditExternally, - SaveDirty, - ProjectEdit, - ProjectApply] - def register(): - register = bpy.types.register - for cls in classes: - register(cls) - + pass def unregister(): - unregister = bpy.types.unregister - for cls in classes: - unregister(cls) + pass if __name__ == "__main__": register() diff --git a/release/scripts/op/mesh.py b/release/scripts/op/mesh.py index b63997b8eba..736ec41ba14 100644 --- a/release/scripts/op/mesh.py +++ b/release/scripts/op/mesh.py @@ -28,7 +28,8 @@ class MeshSelectInteriorFaces(bpy.types.Operator): bl_label = "Select Interior Faces" bl_options = {'REGISTER', 'UNDO'} - def poll(self, context): + @classmethod + def poll(cls, context): ob = context.active_object return (ob and ob.type == 'MESH') @@ -69,7 +70,8 @@ class MeshMirrorUV(bpy.types.Operator): bl_label = "Copy Mirrored UV coords" bl_options = {'REGISTER', 'UNDO'} - def poll(self, context): + @classmethod + def poll(cls, context): ob = context.active_object return (ob and ob.type == 'MESH') @@ -172,22 +174,12 @@ class MeshMirrorUV(bpy.types.Operator): return {'FINISHED'} -# Register the operator -classes = [ - MeshSelectInteriorFaces, - MeshMirrorUV] - - def register(): - register = bpy.types.register - for cls in classes: - register(cls) + pass def unregister(): - unregister = bpy.types.unregister - for cls in classes: - unregister(cls) + pass if __name__ == "__main__": register() diff --git a/release/scripts/op/nla.py b/release/scripts/op/nla.py index ceb4621d643..bec5f5b3909 100644 --- a/release/scripts/op/nla.py +++ b/release/scripts/op/nla.py @@ -178,12 +178,12 @@ class BakeAction(bpy.types.Operator): def register(): - bpy.types.register(BakeAction) + pass # bpy.types.INFO_MT_mesh_add.append(menu_func) def unregister(): - bpy.types.unregister(BakeAction) + pass # bpy.types.INFO_MT_mesh_add.remove(menu_func) if __name__ == "__main__": diff --git a/release/scripts/op/object.py b/release/scripts/op/object.py index 403491bfa28..476db76735e 100644 --- a/release/scripts/op/object.py +++ b/release/scripts/op/object.py @@ -80,7 +80,8 @@ class SelectCamera(bpy.types.Operator): bl_label = "Select Camera" bl_options = {'REGISTER', 'UNDO'} - def poll(self, context): + @classmethod + def poll(cls, context): return context.scene.camera is not None def execute(self, context): @@ -109,7 +110,8 @@ class SelectHierarchy(bpy.types.Operator): extend = BoolProperty(name="Extend", description="Extend the existing selection", default=False) - def poll(self, context): + @classmethod + def poll(cls, context): return context.object def execute(self, context): @@ -167,7 +169,8 @@ class SubdivisionSet(bpy.types.Operator): relative = BoolProperty(name="Relative", description="Apply the subsurf level as an offset relative to the current level", default=False) - def poll(self, context): + @classmethod + def poll(cls, context): obs = context.selected_editable_objects return (obs is not None) @@ -379,7 +382,8 @@ class ShapeTransfer(bpy.types.Operator): return {'FINISHED'} - def poll(self, context): + @classmethod + def poll(cls, context): obj = context.active_object return (obj and obj.mode != 'EDIT') @@ -409,7 +413,8 @@ class JoinUVs(bpy.types.Operator): bl_idname = "object.join_uvs" bl_label = "Join as UVs" - def poll(self, context): + @classmethod + def poll(cls, context): obj = context.active_object return (obj and obj.type == 'MESH') @@ -467,7 +472,8 @@ class MakeDupliFace(bpy.types.Operator): bl_idname = "object.make_dupli_face" bl_label = "Make DupliFace" - def poll(self, context): + @classmethod + def poll(cls, context): obj = context.active_object return (obj and obj.type == 'MESH') @@ -558,28 +564,12 @@ class ClearAllRestrictRender(bpy.types.Operator): return {'FINISHED'} -classes = [ - SelectPattern, - SelectCamera, - SelectHierarchy, - SubdivisionSet, - ShapeTransfer, - JoinUVs, - IsolateTypeRender, - MakeDupliFace, - ClearAllRestrictRender] - - def register(): - register = bpy.types.register - for cls in classes: - register(cls) + pass def unregister(): - unregister = bpy.types.unregister - for cls in classes: - unregister(cls) + pass if __name__ == "__main__": register()
\ No newline at end of file diff --git a/release/scripts/op/object_align.py b/release/scripts/op/object_align.py index 6e5eef0fbc2..dc9b7c34523 100644 --- a/release/scripts/op/object_align.py +++ b/release/scripts/op/object_align.py @@ -263,7 +263,8 @@ class AlignObjects(bpy.types.Operator): align_z = BoolProperty(name="Align Z", description="Align in the Z axis", default=False) - def poll(self, context): + @classmethod + def poll(cls, context): return context.mode == 'OBJECT' def execute(self, context): @@ -286,12 +287,10 @@ def menu_func(self, context): def register(): - bpy.types.register(AlignObjects) bpy.types.VIEW3D_MT_transform.append(menu_func) def unregister(): - bpy.types.unregister(AlignObjects) bpy.types.VIEW3D_MT_transform.remove(menu_func) if __name__ == "__main__": diff --git a/release/scripts/op/object_randomize_transform.py b/release/scripts/op/object_randomize_transform.py index 89884b1767f..8c3f4eb6dfd 100644 --- a/release/scripts/op/object_randomize_transform.py +++ b/release/scripts/op/object_randomize_transform.py @@ -140,12 +140,10 @@ def menu_func(self, context): def register(): - bpy.types.register(RandomizeLocRotSize) bpy.types.VIEW3D_MT_transform.append(menu_func) def unregister(): - bpy.types.unregister(RandomizeLocRotSize) bpy.types.VIEW3D_MT_transform.remove(menu_func) if __name__ == "__main__": diff --git a/release/scripts/op/presets.py b/release/scripts/op/presets.py index f80c5e69ddd..2012ba913fb 100644 --- a/release/scripts/op/presets.py +++ b/release/scripts/op/presets.py @@ -22,7 +22,7 @@ import bpy import os -class AddPresetBase(bpy.types.Operator): +class AddPresetBase(): '''Base preset class, only for subclassing subclasses must define - preset_values @@ -91,7 +91,7 @@ class ExecutePreset(bpy.types.Operator): return {'FINISHED'} -class AddPresetRender(AddPresetBase): +class AddPresetRender(AddPresetBase, bpy.types.Operator): '''Add a Render Preset''' bl_idname = "render.preset_add" bl_label = "Add Render Preset" @@ -113,7 +113,7 @@ class AddPresetRender(AddPresetBase): preset_subdir = "render" -class AddPresetSSS(AddPresetBase): +class AddPresetSSS(AddPresetBase, bpy.types.Operator): '''Add a Subsurface Scattering Preset''' bl_idname = "material.sss_preset_add" bl_label = "Add SSS Preset" @@ -138,7 +138,7 @@ class AddPresetSSS(AddPresetBase): preset_subdir = "sss" -class AddPresetCloth(AddPresetBase): +class AddPresetCloth(AddPresetBase, bpy.types.Operator): '''Add a Cloth Preset''' bl_idname = "cloth.preset_add" bl_label = "Add Cloth Preset" @@ -156,7 +156,7 @@ class AddPresetCloth(AddPresetBase): preset_subdir = "cloth" -class AddPresetSunSky(AddPresetBase): +class AddPresetSunSky(AddPresetBase, bpy.types.Operator): '''Add a Sky & Atmosphere Preset''' bl_idname = "lamp.sunsky_preset_add" bl_label = "Add Sunsky Preset" @@ -181,7 +181,7 @@ class AddPresetSunSky(AddPresetBase): preset_subdir = "sunsky" -class AddPresetInteraction(AddPresetBase): +class AddPresetInteraction(AddPresetBase, bpy.types.Operator): '''Add an Application Interaction Preset''' bl_idname = "wm.interaction_preset_add" bl_label = "Add Interaction Preset" @@ -203,25 +203,12 @@ class AddPresetInteraction(AddPresetBase): preset_subdir = "interaction" -classes = [ - ExecutePreset, - AddPresetRender, - AddPresetSSS, - AddPresetCloth, - AddPresetSunSky, - AddPresetInteraction] - - def register(): - register = bpy.types.register - for cls in classes: - register(cls) + pass def unregister(): - unregister = bpy.types.unregister - for cls in classes: - unregister(cls) + pass if __name__ == "__main__": register() diff --git a/release/scripts/op/screen_play_rendered_anim.py b/release/scripts/op/screen_play_rendered_anim.py index 2ecd445df1d..8775a144b2d 100644 --- a/release/scripts/op/screen_play_rendered_anim.py +++ b/release/scripts/op/screen_play_rendered_anim.py @@ -79,7 +79,7 @@ class PlayRenderedAnim(bpy.types.Operator): preset = prefs.filepaths.animation_player_preset player_path = prefs.filepaths.animation_player - file_path = bpy.utils.expandpath(rd.output_path) + file_path = bpy.path.abspath(rd.output_path) is_movie = rd.is_movie_format # try and guess a command line if it doesn't exist @@ -105,7 +105,7 @@ class PlayRenderedAnim(bpy.types.Operator): # works for movies and images file = rd.frame_path(frame=scene.frame_start) - file = bpy.utils.expandpath(file) # expand '//' + file = bpy.path.abspath(file) # expand '//' cmd = [player_path] # extra options, fps controls etc. @@ -144,11 +144,11 @@ class PlayRenderedAnim(bpy.types.Operator): def register(): - bpy.types.register(PlayRenderedAnim) + pass def unregister(): - bpy.types.unregister(PlayRenderedAnim) + pass if __name__ == "__main__": register() diff --git a/release/scripts/op/sequencer.py b/release/scripts/op/sequencer.py index 432486b70cf..cbb7d00e659 100644 --- a/release/scripts/op/sequencer.py +++ b/release/scripts/op/sequencer.py @@ -30,7 +30,8 @@ class SequencerCrossfadeSounds(bpy.types.Operator): bl_label = "Crossfade sounds" bl_options = {'REGISTER', 'UNDO'} - def poll(self, context): + @classmethod + def poll(cls, context): if context.scene and context.scene.sequence_editor and context.scene.sequence_editor.active_strip: return context.scene.sequence_editor.active_strip.type == 'SOUND' else: @@ -83,7 +84,8 @@ class SequencerCutMulticam(bpy.types.Operator): camera = IntProperty(name="Camera", default=1, min=1, max=32, soft_min=1, soft_max=32) - def poll(self, context): + @classmethod + def poll(cls, context): if context.scene and context.scene.sequence_editor and context.scene.sequence_editor.active_strip: return context.scene.sequence_editor.active_strip.type == 'MULTICAM' else: @@ -117,7 +119,8 @@ class SequencerDeinterlaceSelectedMovies(bpy.types.Operator): bl_label = "Deinterlace Movies" bl_options = {'REGISTER', 'UNDO'} - def poll(self, context): + @classmethod + def poll(cls, context): if context.scene and context.scene.sequence_editor: return True else: @@ -132,19 +135,11 @@ class SequencerDeinterlaceSelectedMovies(bpy.types.Operator): def register(): - register = bpy.types.register - - register(SequencerCrossfadeSounds) - register(SequencerCutMulticam) - register(SequencerDeinterlaceSelectedMovies) + pass def unregister(): - unregister = bpy.types.unregister - - unregister(SequencerCrossfadeSounds) - unregister(SequencerCutMulticam) - unregister(SequencerDeinterlaceSelectedMovies) + pass if __name__ == "__main__": diff --git a/release/scripts/op/uv.py b/release/scripts/op/uv.py index a7abd475b8d..7d677181858 100644 --- a/release/scripts/op/uv.py +++ b/release/scripts/op/uv.py @@ -39,7 +39,8 @@ class ExportUVLayout(bpy.types.Operator): description="File format to export the UV layout to", default='SVG') - def poll(self, context): + @classmethod + def poll(cls, context): obj = context.active_object return (obj and obj.type == 'MESH') @@ -113,7 +114,9 @@ class ExportUVLayout(bpy.types.Operator): mode = self.properties.mode - file = open(self.properties.filepath, "w") + filepath = self.properties.filepath + filepath = bpy.path.ensure_ext(filepath, "." + mode.lower()) + file = open(filepath, "w") fw = file.write if mode == 'SVG': @@ -216,12 +219,10 @@ def menu_func(self, context): def register(): - bpy.types.register(ExportUVLayout) bpy.types.IMAGE_MT_uvs.append(menu_func) def unregister(): - bpy.types.unregister(ExportUVLayout) bpy.types.IMAGE_MT_uvs.remove(menu_func) if __name__ == "__main__": diff --git a/release/scripts/op/uvcalc_follow_active.py b/release/scripts/op/uvcalc_follow_active.py index 6466d48a9fe..f02ee497999 100644 --- a/release/scripts/op/uvcalc_follow_active.py +++ b/release/scripts/op/uvcalc_follow_active.py @@ -249,7 +249,8 @@ class FollowActiveQuads(bpy.types.Operator): description="Method to space UV edge loops", default="LENGTH") - def poll(self, context): + @classmethod + def poll(cls, context): obj = context.active_object return (obj is not None and obj.type == 'MESH') @@ -263,12 +264,10 @@ menu_func = (lambda self, context: self.layout.operator(FollowActiveQuads.bl_idn def register(): - bpy.types.register(FollowActiveQuads) bpy.types.VIEW3D_MT_uv_map.append(menu_func) def unregister(): - bpy.types.unregister(FollowActiveQuads) bpy.types.VIEW3D_MT_uv_map.remove(menu_func) if __name__ == "__main__": diff --git a/release/scripts/op/uvcalc_smart_project.py b/release/scripts/op/uvcalc_smart_project.py index 78cef26f78c..fbda1955013 100644 --- a/release/scripts/op/uvcalc_smart_project.py +++ b/release/scripts/op/uvcalc_smart_project.py @@ -1124,7 +1124,8 @@ class SmartProject(bpy.types.Operator): description="Margin to reduce bleed from adjacent islands.", default=0.0, min=0.0, max=1.0) - def poll(self, context): + @classmethod + def poll(cls, context): return context.active_object != None def execute(self, context): @@ -1138,12 +1139,10 @@ menu_func = (lambda self, context: self.layout.operator(SmartProject.bl_idname, def register(): - bpy.types.register(SmartProject) bpy.types.VIEW3D_MT_uv_map.append(menu_func) def unregister(): - bpy.types.unregister(SmartProject) bpy.types.VIEW3D_MT_uv_map.remove(menu_func) if __name__ == "__main__": diff --git a/release/scripts/op/vertexpaint_dirt.py b/release/scripts/op/vertexpaint_dirt.py index 63a3aa3896b..21c19d528cc 100644 --- a/release/scripts/op/vertexpaint_dirt.py +++ b/release/scripts/op/vertexpaint_dirt.py @@ -180,11 +180,11 @@ class VertexPaintDirt(bpy.types.Operator): def register(): - bpy.types.register(VertexPaintDirt) + pass def unregister(): - bpy.types.unregister(VertexPaintDirt) + pass if __name__ == "__main__": register() diff --git a/release/scripts/op/wm.py b/release/scripts/op/wm.py index ed77f32ff6d..cc35a0ab3dd 100644 --- a/release/scripts/op/wm.py +++ b/release/scripts/op/wm.py @@ -21,7 +21,7 @@ import bpy from bpy.props import * - +from rna_prop_ui import rna_idprop_ui_prop_get, rna_idprop_ui_prop_clear class MESH_OT_delete_edgeloop(bpy.types.Operator): '''Delete an edge loop by merging the faces on each side to a single face loop''' @@ -325,6 +325,42 @@ class WM_OT_context_cycle_enum(bpy.types.Operator): exec("context.%s=advance_enum" % self.properties.data_path) return {'FINISHED'} + +class WM_OT_context_set_id(bpy.types.Operator): + '''Toggle a context value.''' + bl_idname = "wm.context_set_id" + bl_label = "Set Library ID" + bl_options = {'UNDO'} + + data_path = rna_path_prop + value = StringProperty(name="Value", + description="Assign value", maxlen=1024, default="") + + def execute(self, context): + value = self.properties.value + data_path = self.properties.data_path + + # match the pointer type from the target property to bpy.data.* + # so we lookup the correct list. + data_path_base, data_path_prop = data_path.rsplit(".", 1) + data_prop_rna = eval("context.%s" % data_path_base).rna_type.properties[data_path_prop] + data_prop_rna_type = data_prop_rna.fixed_type + + id_iter = None + + for prop in bpy.data.rna_type.properties: + if prop.rna_type.identifier == "CollectionProperty": + if prop.fixed_type == data_prop_rna_type: + id_iter = prop.identifier + break + + if id_iter: + value_id = getattr(bpy.data, id_iter).get(value) + exec("context.%s=value_id" % data_path) + + return {'FINISHED'} + + doc_id = StringProperty(name="Doc ID", description="", maxlen=1024, default="", options={'HIDDEN'}) @@ -442,7 +478,7 @@ class WM_OT_path_open(bpy.types.Operator): import os import subprocess - filepath = bpy.utils.expandpath(self.properties.filepath) + filepath = bpy.path.abspath(self.properties.filepath) filepath = os.path.normpath(filepath) if not os.path.exists(filepath): @@ -576,46 +612,139 @@ class WM_OT_doc_edit(bpy.types.Operator): return wm.invoke_props_dialog(self, width=600) -import rna_prop_ui +from bpy.props import * + + +rna_path = StringProperty(name="Property Edit", + description="Property data_path edit", maxlen=1024, default="", options={'HIDDEN'}) + +rna_value = StringProperty(name="Property Value", + description="Property value edit", maxlen=1024, default="") + +rna_property = StringProperty(name="Property Name", + description="Property name edit", maxlen=1024, default="") + +rna_min = FloatProperty(name="Min", default=0.0, precision=3) +rna_max = FloatProperty(name="Max", default=1.0, precision=3) + + +class WM_OT_properties_edit(bpy.types.Operator): + '''Internal use (edit a property data_path)''' + bl_idname = "wm.properties_edit" + bl_label = "Edit Property" + + data_path = rna_path + property = rna_property + value = rna_value + min = rna_min + max = rna_max + description = StringProperty(name="Tip", default="") + + def execute(self, context): + data_path = self.properties.data_path + value = self.properties.value + prop = self.properties.property + prop_old = self._last_prop[0] + + try: + value_eval = eval(value) + except: + value_eval = value + + # First remove + item = eval("context.%s" % data_path) + + rna_idprop_ui_prop_clear(item, prop_old) + exec_str = "del item['%s']" % prop_old + # print(exec_str) + exec(exec_str) + + + # Reassign + exec_str = "item['%s'] = %s" % (prop, repr(value_eval)) + # print(exec_str) + exec(exec_str) + self._last_prop[:] = [prop] + + prop_type = type(item[prop]) + + prop_ui = rna_idprop_ui_prop_get(item, prop) + + if prop_type in (float, int): + + prop_ui['soft_min'] = prop_ui['min'] = prop_type(self.properties.min) + prop_ui['soft_max'] = prop_ui['max'] = prop_type(self.properties.max) + + prop_ui['description'] = self.properties.description + + return {'FINISHED'} + + def invoke(self, context, event): + + self._last_prop = [self.properties.property] + + item = eval("context.%s" % self.properties.data_path) + + # setup defaults + prop_ui = rna_idprop_ui_prop_get(item, self.properties.property, False) # dont create + if prop_ui: + self.properties.min = prop_ui.get("min", -1000000000) + self.properties.max = prop_ui.get("max", 1000000000) + self.properties.description = prop_ui.get("description", "") + + wm = context.manager + # This crashes, TODO - fix + #return wm.invoke_props_popup(self, event) + + wm.invoke_props_popup(self, event) + return {'RUNNING_MODAL'} + + +class WM_OT_properties_add(bpy.types.Operator): + '''Internal use (edit a property data_path)''' + bl_idname = "wm.properties_add" + bl_label = "Add Property" -classes = [ - MESH_OT_delete_edgeloop, + data_path = rna_path - WM_OT_context_set_boolean, - WM_OT_context_set_int, - WM_OT_context_scale_int, - WM_OT_context_set_float, - WM_OT_context_set_string, - WM_OT_context_set_enum, - WM_OT_context_set_value, - WM_OT_context_toggle, - WM_OT_context_toggle_enum, - WM_OT_context_cycle_enum, - WM_OT_context_cycle_int, - WM_OT_context_modal_mouse, + def execute(self, context): + item = eval("context.%s" % self.properties.data_path) + + def unique_name(names): + prop = 'prop' + prop_new = prop + i = 1 + while prop_new in names: + prop_new = prop + str(i) + i += 1 + + return prop_new + + property = unique_name(item.keys()) + + item[property] = 1.0 + return {'FINISHED'} - WM_OT_url_open, - WM_OT_path_open, - WM_OT_doc_view, - WM_OT_doc_edit, +class WM_OT_properties_remove(bpy.types.Operator): + '''Internal use (edit a property data_path)''' + bl_idname = "wm.properties_remove" + bl_label = "Remove Property" - # experemental! - rna_prop_ui.WM_OT_properties_edit, - rna_prop_ui.WM_OT_properties_add, - rna_prop_ui.WM_OT_properties_remove] + data_path = rna_path + property = rna_property + def execute(self, context): + item = eval("context.%s" % self.properties.data_path) + del item[self.properties.property] + return {'FINISHED'} def register(): - register = bpy.types.register - for cls in classes: - register(cls) + pass def unregister(): - unregister = bpy.types.unregister - for cls in classes: - unregister(cls) + pass if __name__ == "__main__": register() |