diff options
author | meta-androcto <meta.androcto1@gmail.com> | 2016-08-12 10:26:04 +0300 |
---|---|---|
committer | meta-androcto <meta.androcto1@gmail.com> | 2016-08-12 10:26:04 +0300 |
commit | 840f04f1addce56c0449451091df1c90f6bbbaef (patch) | |
tree | b2bfc416422764b113ce82180b81b2837016d3f3 /oscurart_tools | |
parent | a04af35e720b10c776f2e0ea94a09c08cd14a842 (diff) |
update oscurart tools: clean up & restore functions thanks lijenstina, oscurart
Diffstat (limited to 'oscurart_tools')
-rw-r--r-- | oscurart_tools/__init__.py | 218 | ||||
-rw-r--r-- | oscurart_tools/oscurart_animation.py | 21 | ||||
-rw-r--r-- | oscurart_tools/oscurart_files.py | 54 | ||||
-rw-r--r-- | oscurart_tools/oscurart_meshes.py | 50 | ||||
-rw-r--r-- | oscurart_tools/oscurart_objects.py | 33 | ||||
-rw-r--r-- | oscurart_tools/oscurart_overrides.py | 294 | ||||
-rw-r--r-- | oscurart_tools/oscurart_render.py | 280 |
7 files changed, 814 insertions, 136 deletions
diff --git a/oscurart_tools/__init__.py b/oscurart_tools/__init__.py index 7c64b462..07beb3fc 100644 --- a/oscurart_tools/__init__.py +++ b/oscurart_tools/__init__.py @@ -20,18 +20,29 @@ bl_info = { "name": "Oscurart Tools", - "author": "Oscurart, CodemanX, Meta-Androcto", - "version": (3, 2), + "author": "Oscurart, CodemanX", + "version": (3, 2, 1), "blender": (2, 77, 0), "location": "View3D > Tools > Oscurart Tools", "description": "Tools for objects, render, shapes, and files.", "warning": "", "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/Scripts/3D_interaction/Oscurart_Tools", + "tracker_url": "https://developer.blender.org/maniphest/task/edit/form/2/", "category": "Object", } import bpy + +from . import oscurart_files +from . import oscurart_meshes +from . import oscurart_objects +from . import oscurart_shapes +from . import oscurart_render +from . import oscurart_overrides +from . import oscurart_animation + +import bpy from bpy.types import ( AddonPreferences, Panel, @@ -44,62 +55,26 @@ from bpy.props import ( IntProperty, ) -from . import oscurart_files -from . import oscurart_meshes -from . import oscurart_objects -from . import oscurart_shapes -from . import oscurart_render -from . import oscurart_animation - - class View3DOscPanel(PropertyGroup): + bl_space_type = 'VIEW_3D' + bl_region_type = 'TOOLS' + # CREA PANELES EN TOOLS - osc_object_tools = BoolProperty(default=True) - osc_mesh_tools = BoolProperty(default=True) - osc_shapes_tools = BoolProperty(default=True) - osc_render_tools = BoolProperty(default=True) - osc_files_tools = BoolProperty(default=True) - osc_animation_tools = BoolProperty(default=True) - - quick_animation_in = IntProperty( - default=1 - ) - quick_animation_out = IntProperty( - default=250 - ) - # SETEO VARIABLE DE ENTORNO - SearchAndSelectOt = StringProperty( - default="Object name initials" - ) - # RENDER CROP - rcPARTS = IntProperty( - default=1, - min=2, - max=50, - step=1 - ) - RenameObjectOt = StringProperty( - default="Type here" - ) - - -class VarColArchivos(PropertyGroup): - filename = bpy.props.StringProperty( - name="", - default="" - ) - value = bpy.props.IntProperty( - name="", - default=10 - ) - fullpath = bpy.props.StringProperty( - name="", - default="" - ) - checkbox = bpy.props.BoolProperty( - name="", - default=True - ) + osc_object_tools = BoolProperty(default=False) + osc_mesh_tools = BoolProperty(default=False) + osc_shapes_tools = BoolProperty(default=False) + osc_render_tools = BoolProperty(default=False) + osc_files_tools = BoolProperty(default=False) + osc_overrides_tools = BoolProperty(default=False) + osc_animation_tools = BoolProperty(default=False) + + # PARA ESCENAS NUEVAS + overrides = bpy.props.StringProperty(default="[]") + + +class OscOverridesProp(PropertyGroup): + matoverride = bpy.props.StringProperty() + grooverride = bpy.props.StringProperty() # PANELES @@ -123,6 +98,7 @@ class OscPanelControl(Panel): col.prop(oscurart, "osc_animation_tools", text="Animation", icon="POSE_DATA") col.prop(oscurart, "osc_render_tools", text="Render", icon="SCENE") col.prop(oscurart, "osc_files_tools", text="Files", icon="IMASEL") + col.prop(oscurart, "osc_overrides_tools", text="Overrides", icon="GREASEPENCIL") class OscPanelObject(Panel): @@ -149,10 +125,10 @@ class OscPanelObject(Panel): colrow = col.row(align=1) colrow.operator("object.objects_to_groups", icon="GROUP") colrow = col.row(align=1) - colrow.prop(bpy.context.scene.oscurart, "SearchAndSelectOt", text="") + colrow.prop(bpy.context.scene, "SearchAndSelectOt", text="") colrow.operator("object.search_and_select_osc", icon="ZOOM_SELECTED") colrow = col.row(align=1) - colrow.prop(bpy.context.scene.oscurart, "RenameObjectOt", text="") + colrow.prop(bpy.context.scene, "RenameObjectOt", text="") colrow.operator("object.rename_objects_osc", icon="SHORTDISPLAY") col.operator( "object.distribute_osc", @@ -267,6 +243,14 @@ class OscPanelRender(Panel): "render.copy_render_settings_osc", icon="LIBRARY_DATA_DIRECT", text="Copy Cycles Settings").mode = "cycles" + col.operator( + "file.create_batch_maker_osc", + icon="LINENUMBERS_ON", + text="Make Render Batch") + col.operator( + "file.create_batch_python", + icon="LINENUMBERS_ON", + text="Make Python Batch") colrow = col.row(align=1) colrow.operator( "render.render_all_scenes_osc", @@ -286,7 +270,7 @@ class OscPanelRender(Panel): colrow = col.row(align=1) colrow.operator("render.render_crop_osc", icon="RENDER_REGION") - colrow.prop(bpy.context.scene.oscurart, "rcPARTS", text="Parts") + colrow.prop(bpy.context.scene, "rcPARTS", text="Parts") boxcol = layout.box().column(align=1) colrow = boxcol.row(align=1) @@ -296,7 +280,7 @@ class OscPanelRender(Panel): text="Selected Scenes").frametype = False colrow.operator( "render.render_selected_scenes_osc", - text="> Frame").frametype = True + text="> Fame").frametype = True for sc in bpy.data.scenes[:]: boxcol.prop(sc, "use_render_scene", text=sc.name) @@ -317,8 +301,58 @@ class OscPanelFiles(Panel): def draw(self, context): layout = self.layout col = layout.column(align=1) + col.operator("file.save_incremental_osc", icon="NEW") col.operator("image.reload_images_osc", icon="IMAGE_COL") col.operator("file.sync_missing_groups", icon="LINK_AREA") + col = layout.column(align=1) + colrow = col.row(align=1) + colrow.prop(bpy.context.scene, "oscSearchText", text="") + colrow.prop(bpy.context.scene, "oscReplaceText", text="") + col.operator("file.replace_file_path_osc", icon="SHORTDISPLAY") + + +class OscPanelOverrides(Panel): + bl_idname = "Oscurart Overrides" + bl_label = "Overrides Tools" + bl_category = "Oscurart Tools" + bl_space_type = 'VIEW_3D' + bl_region_type = 'TOOLS' + bl_options = {'DEFAULT_CLOSED'} + + @classmethod + def poll(cls, context): + return context.scene.oscurart.osc_overrides_tools + + def draw(self, context): + layout = self.layout + box = layout.box() + col = box.column(align=1) + + # col.operator("render.overrides_set_list", text="Create Override + # List", icon="GREASEPENCIL") + col.label(text="Active Scene: " + bpy.context.scene.name) + col.label(text="Example: [[Group,Material]]") + col.prop(bpy.context.scene.oscurart, "overrides", text="") + col.operator( + "render.check_overrides", + text="Check List", + icon="ZOOM_ALL") + col.operator("render.overrides_on", text="On / Off", icon="QUIT") + col.label( + text=str("OVERRIDES: ON" if bpy.use_overrides else "OVERRIDES: OFF")) + + box = layout.box() + boxcol = box.column(align=1) + boxcol.label(text="Danger Zone") + boxcolrow = boxcol.row(align=1) + boxcolrow.operator( + "render.apply_overrides", + text="Apply Overrides", + icon="ERROR") + boxcolrow.operator( + "render.restore_overrides", + text="Restore Overrides", + icon="ERROR") class OscPanelAnimation(Panel): @@ -340,8 +374,43 @@ class OscPanelAnimation(Panel): col.operator("anim.quick_parent_osc", icon="OUTLINER_DATA_POSE") row = col.row(align=1) - row.prop(bpy.context.scene.oscurart, "quick_animation_in", text="") - row.prop(bpy.context.scene.oscurart, "quick_animation_out", text="") + row.prop(bpy.context.scene, "quick_animation_in", text="") + row.prop(bpy.context.scene, "quick_animation_out", text="") + + +# Addons Preferences Update Panel + +def update_panel(self, context): + try: + bpy.utils.unregister_class(OscPanelControl) + bpy.utils.unregister_class(OscPanelObject) + bpy.utils.unregister_class(OscPanelMesh) + bpy.utils.unregister_class(OscPanelShapes) + bpy.utils.unregister_class(OscPanelRender) + bpy.utils.unregister_class(OscPanelFiles) + bpy.utils.unregister_class(OscPanelOverrides) + bpy.utils.unregister_class(OscPanelAnimation) + except: + pass + + addon_prefs = context.user_preferences.addons[__name__].preferences + + OscPanelControl.bl_category = addon_prefs.category + bpy.utils.register_class(OscPanelControl) + OscPanelObject.bl_category = addon_prefs.category + bpy.utils.register_class(OscPanelObject) + OscPanelMesh.bl_category = addon_prefs.category + bpy.utils.register_class(OscPanelMesh) + OscPanelShapes.bl_category = addon_prefs.category + bpy.utils.register_class(OscPanelShapes) + OscPanelRender.bl_category = addon_prefs.category + bpy.utils.register_class(OscPanelRender) + OscPanelFiles.bl_category = addon_prefs.category + bpy.utils.register_class(OscPanelFiles) + OscPanelOverrides.bl_category = addon_prefs.category + bpy.utils.register_class(OscPanelOverrides) + OscPanelAnimation.bl_category = addon_prefs.category + bpy.utils.register_class(OscPanelAnimation) class OscurartToolsAddonPreferences(bpy.types.AddonPreferences): @@ -349,13 +418,15 @@ class OscurartToolsAddonPreferences(bpy.types.AddonPreferences): # when defining this in a submodule of a python package. bl_idname = __name__ - category = StringProperty( + category = bpy.props.StringProperty( name="Category", description="Choose a name for the category of the panel", default="Oscurart Tools", + update=update_panel, ) def draw(self, context): + layout = self.layout row = layout.row() col = row.column() @@ -368,20 +439,23 @@ class OscurartToolsAddonPreferences(bpy.types.AddonPreferences): def register(): bpy.utils.register_module(__name__) - bpy.types.Scene.oscurart = bpy.props.PointerProperty( - type=View3DOscPanel - ) - bpy.types.Scene.use_render_scene = bpy.props.BoolProperty() + bpy.types.Scene.oscurart = bpy.props.PointerProperty(type=View3DOscPanel) + + bpy.types.Scene.ovlist = bpy.props.CollectionProperty(type=OscOverridesProp) - bpy.types.Scene.broken_files = bpy.props.CollectionProperty( - type=VarColArchivos - ) + bpy.types.Scene.quick_animation_in = bpy.props.IntProperty(default=1) + bpy.types.Scene.quick_animation_out = bpy.props.IntProperty(default=250) + + # SETEO VARIABLE DE ENTORNO + bpy.types.Scene.SearchAndSelectOt = bpy.props.StringProperty( + default="Object name initials") def unregister(): del bpy.types.Scene.oscurart - del bpy.types.Scene.use_render_scene - del bpy.types.Scene.broken_files + del bpy.types.Scene.quick_animation_in + del bpy.types.Scene.quick_animation_out + del bpy.types.Scene.SearchAndSelectOt bpy.utils.unregister_module(__name__) diff --git a/oscurart_tools/oscurart_animation.py b/oscurart_tools/oscurart_animation.py index 8a3e552a..bf2095b8 100644 --- a/oscurart_tools/oscurart_animation.py +++ b/oscurart_tools/oscurart_animation.py @@ -21,16 +21,16 @@ import bpy from mathutils import Matrix -# -------------------------QUICK PARENT------------------ +# ---------------------------QUICK PARENT------------------ def DefQuickParent(inf, out): if bpy.context.object.type == "ARMATURE": ob = bpy.context.object target = [object for object in bpy.context.selected_objects if object != ob][0] - ob = (bpy.context.active_pose_bone if bpy.context.object.type == 'ARMATURE' else bpy.context.object) + ob = bpy.context.active_pose_bone if bpy.context.object.type == 'ARMATURE' else bpy.context.object target.select = False - bpy.context.scene.frame_set(frame=bpy.context.scene.oscurart.quick_animation_in) + bpy.context.scene.frame_set(frame=bpy.context.scene.quick_animation_in) a = Matrix(target.matrix_world) a.invert() i = Matrix(ob.matrix) @@ -41,9 +41,9 @@ def DefQuickParent(inf, out): else: ob = bpy.context.object target = [object for object in bpy.context.selected_objects if object != ob][0] - ob = (bpy.context.active_pose_bone if bpy.context.object.type == 'ARMATURE' else bpy.context.object) + ob = bpy.context.active_pose_bone if bpy.context.object.type == 'ARMATURE' else bpy.context.object target.select = False - bpy.context.scene.frame_set(frame=bpy.context.scene.oscurart.quick_animation_in) + bpy.context.scene.frame_set(frame=bpy.context.scene.quick_animation_in) a = Matrix(target.matrix_world) a.invert() i = Matrix(ob.matrix_world) @@ -53,18 +53,13 @@ def DefQuickParent(inf, out): bpy.ops.anim.keyframe_insert(type="LocRotScale") -class QuickParent(bpy.types.Operator): +class QuickParent (bpy.types.Operator): bl_idname = "anim.quick_parent_osc" bl_label = "Quick Parent" bl_options = {"REGISTER", "UNDO"} - @classmethod - def poll(cls, context): - return (context.active_object is not None and - len(context.selected_objects) > 1) - def execute(self, context): DefQuickParent( - bpy.context.scene.oscurart.quick_animation_in, - bpy.context.scene.oscurart.quick_animation_out) + bpy.context.scene.quick_animation_in, + bpy.context.scene.quick_animation_out) return {'FINISHED'} diff --git a/oscurart_tools/oscurart_files.py b/oscurart_tools/oscurart_files.py index c3a82d7f..b829e8d9 100644 --- a/oscurart_tools/oscurart_files.py +++ b/oscurart_tools/oscurart_files.py @@ -22,9 +22,10 @@ import bpy from bpy.types import Operator -# ---------------------RELOAD IMAGES------------------ +# ---------------------------RELOAD IMAGES------------------ -class reloadImages(Operator): + +class reloadImages (Operator): bl_idname = "image.reload_images_osc" bl_label = "Reload Images" bl_options = {"REGISTER", "UNDO"} @@ -35,7 +36,54 @@ class reloadImages(Operator): return {'FINISHED'} -# --------------- SYNC MISSING GROUPS ----------------- +# ------------------------ SAVE INCREMENTAL ------------------------ + +class saveIncremental(Operator): + bl_idname = "file.save_incremental_osc" + bl_label = "Save Incremental File" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + filepath = bpy.data.filepath + if filepath.count("_v"): + strnum = filepath.rpartition("_v")[-1].rpartition(".blend")[0] + intnum = int(strnum) + modnum = strnum.replace(str(intnum), str(intnum + 1)) + output = filepath.replace(strnum, modnum) + basename = os.path.basename(filepath) + bpy.ops.wm.save_as_mainfile( + filepath=os.path.join(os.path.dirname(filepath), "%s_v%s.blend" % + (basename.rpartition("_v")[0], str(modnum)))) + + else: + output = filepath.rpartition(".blend")[0] + "_v01" + bpy.ops.wm.save_as_mainfile(filepath=output) + + return {'FINISHED'} + +# ------------------------ REPLACE FILE PATHS ------------------------ + +bpy.types.Scene.oscSearchText = bpy.props.StringProperty(default="Search Text") +bpy.types.Scene.oscReplaceText = bpy.props.StringProperty( + default="Replace Text") + + +class replaceFilePath(Operator): + bl_idname = "file.replace_file_path_osc" + bl_label = "Replace File Path" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + TEXTSEARCH = bpy.context.scene.oscSearchText + TEXTREPLACE = bpy.context.scene.oscReplaceText + + for image in bpy.data.images: + image.filepath = image.filepath.replace(TEXTSEARCH, TEXTREPLACE) + + return {'FINISHED'} + + +# ---------------------- SYNC MISSING GROUPS -------------------------- class reFreshMissingGroups(Operator): bl_idname = "file.sync_missing_groups" diff --git a/oscurart_tools/oscurart_meshes.py b/oscurart_tools/oscurart_meshes.py index 99116a08..4269e6a8 100644 --- a/oscurart_tools/oscurart_meshes.py +++ b/oscurart_tools/oscurart_meshes.py @@ -32,9 +32,12 @@ import time import blf from bpy_extras.view3d_utils import location_3d_to_region_2d +C = bpy.context +D = bpy.data # -----------------------------RECONST--------------------------- + def defReconst(self, OFFSET): bpy.ops.object.mode_set(mode='EDIT', toggle=False) bpy.context.tool_settings.mesh_select_mode = (True, True, True) @@ -73,7 +76,7 @@ def defReconst(self, OFFSET): use_subsurf_data=0) -class reConst(Operator): +class reConst (Operator): bl_idname = "mesh.reconst_osc" bl_label = "ReConst Mesh" bl_options = {"REGISTER", "UNDO"} @@ -93,9 +96,9 @@ class reConst(Operator): defReconst(self, self.OFFSET) return {'FINISHED'} - # -----------------------------------SELECT LEFT--------------------- + def side(self, nombre, offset): bpy.ops.object.mode_set(mode="EDIT", toggle=0) @@ -144,15 +147,15 @@ class SelectMenor (Operator): # -------------------------RESYM VG---------------------------------- -class resymVertexGroups(Operator): + +class resymVertexGroups (Operator): bl_idname = "mesh.resym_vertex_weights_osc" bl_label = "Resym Vertex Weights" bl_options = {"REGISTER", "UNDO"} @classmethod def poll(cls, context): - return (context.active_object is not None and - context.active_object.type == 'MESH') + return context.active_object is not None def execute(self, context): @@ -175,15 +178,14 @@ class resymVertexGroups(Operator): # ------------------------IMPORT EXPORT GROUPS-------------------- -class OscExportVG(Operator): +class OscExportVG (Operator): bl_idname = "file.export_groups_osc" bl_label = "Export Groups" bl_options = {"REGISTER", "UNDO"} @classmethod def poll(cls, context): - return (context.active_object is not None and - context.active_object.type == 'MESH') + return context.active_object is not None def execute(self, context): @@ -201,15 +203,14 @@ class OscExportVG(Operator): return {'FINISHED'} -class OscImportVG(Operator): +class OscImportVG (Operator): bl_idname = "file.import_groups_osc" bl_label = "Import Groups" bl_options = {"REGISTER", "UNDO"} @classmethod def poll(cls, context): - return (context.active_object is not None and - context.active_object.type == 'MESH') + return context.active_object is not None def execute(self, context): @@ -233,6 +234,7 @@ class OscImportVG(Operator): # ------------------------------------ RESYM MESH------------------------- + def reSymSave(self, quality): bpy.ops.object.mode_set(mode='OBJECT') @@ -302,7 +304,7 @@ def reSymMesh(self, SELECTED, SIDE): MEMA(SYMAP) -class OscResymSave(Operator): +class OscResymSave (Operator): bl_idname = "mesh.resym_save_map" bl_label = "Resym save XML Map" bl_options = {"REGISTER", "UNDO"} @@ -322,15 +324,14 @@ class OscResymSave(Operator): return {'FINISHED'} -class OscResymMesh(Operator): +class OscResymMesh (Operator): bl_idname = "mesh.resym_mesh" bl_label = "Resym save Apply XML" bl_options = {"REGISTER", "UNDO"} @classmethod def poll(cls, context): - return (context.active_object is not None and - context.active_object.type == 'MESH') + return context.active_object is not None selected = BoolProperty( default=False, @@ -364,9 +365,12 @@ def DefOscObjectToMesh(): class OscObjectToMesh(Operator): bl_idname = "mesh.object_to_mesh_osc" + bl_idname = "mesh.object_to_mesh_osc" + bl_label = "Object To Mesh" bl_label = "Object To Mesh" bl_description = "Works on Meshes, Meta objects, Curves and Surfaces" + @classmethod def poll(cls, context): return (context.active_object is not None and @@ -374,13 +378,14 @@ class OscObjectToMesh(Operator): {'MESH', 'META', 'CURVE', 'SURFACE'}) def execute(self, context): - print("Active type object is", context.object.type) - DefOscObjectToMesh() - return {'FINISHED'} + print("Active type object is", context.object.type) + DefOscObjectToMesh() + return {'FINISHED'} # ----------------------------- OVERLAP UV ------------------------------- + def DefOscOverlapUv(valpresicion): inicio = time.time() mode = bpy.context.object.mode @@ -423,7 +428,7 @@ def DefOscOverlapUv(valpresicion): for lloop in lif[l]: for rloop in lif[r]: if (verteqind[vertexvert[lloop]] == vertexvert[rloop] and - ob.data.uv_layers.active.data[rloop].select): + ob.data.uv_layers.active.data[rloop].select): ob.data.uv_layers.active.data[ lloop].uv = ob.data.uv_layers.active.data[ @@ -455,9 +460,9 @@ class OscOverlapUv(Operator): DefOscOverlapUv(self.presicion) return {'FINISHED'} - # ------------------------------- IO VERTEX COLORS -------------------- + def DefOscExportVC(): with open(os.path.join(os.path.dirname(bpy.data.filepath), bpy.context.object.name) + ".vc", mode="w") as file: ob = bpy.context.object @@ -474,7 +479,7 @@ def DefOscImportVC(): loopind].color = di[loopind] -class OscExportVC(Operator): +class OscExportVC (Operator): bl_idname = "mesh.export_vertex_colors" bl_label = "Export Vertex Colors" bl_options = {"REGISTER", "UNDO"} @@ -489,7 +494,7 @@ class OscExportVC(Operator): return {'FINISHED'} -class OscImportVC(Operator): +class OscImportVC (Operator): bl_idname = "mesh.import_vertex_colors" bl_label = "Import Vertex Colors" bl_options = {"REGISTER", "UNDO"} @@ -506,6 +511,7 @@ class OscImportVC(Operator): # ------------------ PRINT VERTICES ---------------------- + def dibuja_callback(self, context): font_id = 0 bm = bmesh.from_edit_mesh(bpy.context.object.data) diff --git a/oscurart_tools/oscurart_objects.py b/oscurart_tools/oscurart_objects.py index ffae4aae..01d4e0d3 100644 --- a/oscurart_tools/oscurart_objects.py +++ b/oscurart_tools/oscurart_objects.py @@ -19,18 +19,17 @@ # <pep8 compliant> import bpy +import os from bpy.types import Operator from bpy.props import BoolProperty -import os from bpy_extras.object_utils import world_to_camera_view - # ------------------------ SEARCH AND SELECT ------------------------ -class SearchAndSelectOt(Operator): + +class SearchAndSelectOt(bpy.types.Operator): bl_idname = "object.search_and_select_osc" bl_label = "Search And Select" - bl_description = "Selection based upon object names in the scene" bl_options = {"REGISTER", "UNDO"} start = BoolProperty(name="Start With", default=True) @@ -39,7 +38,7 @@ class SearchAndSelectOt(Operator): def execute(self, context): for objeto in bpy.context.scene.objects: - variableNombre = bpy.context.scene.oscurart.SearchAndSelectOt + variableNombre = bpy.context.scene.SearchAndSelectOt if self.start: if objeto.name.startswith(variableNombre): objeto.select = True @@ -54,6 +53,10 @@ class SearchAndSelectOt(Operator): # -------------------------RENAME OBJECTS---------------------------------- +# CREO VARIABLE +bpy.types.Scene.RenameObjectOt = bpy.props.StringProperty(default="Type here") + + class renameObjectsOt (Operator): bl_idname = "object.rename_objects_osc" bl_label = "Rename Objects" @@ -62,7 +65,7 @@ class renameObjectsOt (Operator): def execute(self, context): listaObj = bpy.context.selected_objects[:] for objeto in listaObj: - objeto.name = bpy.context.scene.oscurart.RenameObjectOt + objeto.name = bpy.context.scene.RenameObjectOt return {'FINISHED'} @@ -71,7 +74,6 @@ class renameObjectsOt (Operator): class oscRemModifiers (Operator): bl_idname = "object.modifiers_remove_osc" bl_label = "Remove modifiers" - bl_description = "Removes all modifiers on all selected objects" bl_options = {"REGISTER", "UNDO"} def execute(self, context): @@ -86,8 +88,6 @@ class oscRemModifiers (Operator): class oscApplyModifiers (Operator): bl_idname = "object.modifiers_apply_osc" bl_label = "Apply modifiers" - bl_description = ("Applies all modifiers on all selected objects \n" - "Warning: Make single user will be applied on Linked Object data") bl_options = {"REGISTER", "UNDO"} def execute(self, context): @@ -117,14 +117,17 @@ class oscApplyModifiers (Operator): # ------------------------------------ RELINK OBJECTS--------------------- + def relinkObjects(self): + LISTSCENE = [] if bpy.selection_osc: for SCENE in bpy.data.scenes[:]: if SCENE.objects: if bpy.selection_osc[-1] in SCENE.objects[:]: LISTSCENE.append(SCENE) + if LISTSCENE: OBJECTS = bpy.selection_osc[:-1] @@ -135,6 +138,7 @@ def relinkObjects(self): bpy.ops.object.select_all(action='DESELECT') + for OBJETO in OBJECTS: if OBJETO.users != len(bpy.data.scenes): print(OBJETO.name) @@ -150,7 +154,7 @@ def relinkObjects(self): self.report({'INFO'}, message="Scenes are empty") -class OscRelinkObjectsBetween(Operator): +class OscRelinkObjectsBetween (Operator): bl_idname = "object.relink_objects_between_scenes" bl_label = "Relink Objects Between Scenes" bl_options = {"REGISTER", "UNDO"} @@ -162,9 +166,11 @@ class OscRelinkObjectsBetween(Operator): # ------------------------------------ COPY GROUPS AND LAYERS------------- + def CopyObjectGroupsAndLayers(self): OBSEL = bpy.selection_osc[:] + if OBSEL: GLOBALLAYERS = list(OBSEL[-1].layers[:]) ACTSCENE = bpy.context.scene @@ -247,9 +253,9 @@ class OscSelection(bpy.types.Header): row.label("Sels: "+str(len(bpy.selection_osc))) """ - # =============== DISTRIBUTE ====================== + def ObjectDistributeOscurart(self, X, Y, Z): if len(bpy.selection_osc[:]) > 1: # VARIABLES @@ -295,6 +301,7 @@ class DialogDistributeOsc(Operator): # ======================== SET LAYERS TO OTHER SCENES ==================== + def DefSetLayersToOtherScenes(): actsc = bpy.context.screen.scene for object in bpy.context.selected_objects[:]: @@ -489,7 +496,7 @@ def duplicateSymmetrical(self, disconect): bpy.context.active_object.driver_remove("scale") -class oscDuplicateSymmetricalOp(Operator): +class oscDuplicateSymmetricalOp (Operator): bl_idname = "object.duplicate_object_symmetry_osc" bl_label = "Oscurart Duplicate Symmetrical" bl_options = {"REGISTER", "UNDO"} @@ -516,7 +523,7 @@ def DefObjectToGroups(): scgr.objects.link(ob) -class ObjectsToGroups(Operator): +class ObjectsToGroups (Operator): bl_idname = "object.objects_to_groups" bl_label = "Objects to Groups" bl_options = {"REGISTER", "UNDO"} diff --git a/oscurart_tools/oscurart_overrides.py b/oscurart_tools/oscurart_overrides.py new file mode 100644 index 00000000..994b766a --- /dev/null +++ b/oscurart_tools/oscurart_overrides.py @@ -0,0 +1,294 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +# <pep8 compliant> + +import bpy +from bpy.types import Operator, Panel +import os + + +# ------------------APPLY AND RESTORE OVERRIDES ------------------ + +def DefOscApplyOverrides(self): + types = {'MESH', 'META', 'CURVE'} + for ob in bpy.data.objects: + if ob.type in types: + if not len(ob.material_slots): + ob.data.materials.append(None) + slotlist = {ob: [sl.material for sl in ob.material_slots] + for ob in bpy.data.objects if ob.type in types if len(ob.material_slots)} + with open("%s_override.txt" % (os.path.join(os.path.dirname(bpy.data.filepath), + bpy.context.scene.name)), mode="w") as file: + file.write(str(slotlist)) + scene = bpy.context.scene + proptolist = list(eval(scene.oscurart.overrides)) + for group, material in proptolist: + for object in bpy.data.groups[group].objects: + lenslots = len(object.material_slots) + if object.type in types: + if len(object.data.materials): + object.data.materials.clear() + for newslot in range(lenslots): + object.data.materials.append( + bpy.data.materials[material]) + + +def DefOscRestoreOverrides(self): + with open("%s_override.txt" % (os.path.join(os.path.dirname(bpy.data.filepath), + bpy.context.scene.name)), mode="r") as file: + slotlist = eval(file.read()) + for ob, slots in slotlist.items(): + ob.data.materials.clear() + for slot in slots: + ob.data.materials.append(slot) + + +# HAND OPERATOR + +class OscApplyOverrides(Operator): + bl_idname = "render.apply_overrides" + bl_label = "Apply Overrides in this Scene" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + DefOscApplyOverrides(self) + return {'FINISHED'} + + +class OscRestoreOverrides(Operator): + bl_idname = "render.restore_overrides" + bl_label = "Restore Overrides in this Scene" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + DefOscRestoreOverrides(self) + return {'FINISHED'} + +bpy.use_overrides = False + + +class OscOverridesOn(Operator): + bl_idname = "render.overrides_on" + bl_label = "Turn On Overrides" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + if bpy.use_overrides is False: + bpy.app.handlers.render_pre.append(DefOscApplyOverrides) + bpy.app.handlers.render_post.append(DefOscRestoreOverrides) + bpy.use_overrides = True + print("Overrides on!") + else: + bpy.app.handlers.render_pre.remove(DefOscApplyOverrides) + bpy.app.handlers.render_post.remove(DefOscRestoreOverrides) + bpy.use_overrides = False + print("Overrides off!") + return {'FINISHED'} + + +# -------------------- CHECK OVERRIDES ------------------- + +class OscCheckOverrides(Operator): + bl_idname = "render.check_overrides" + bl_label = "Check Overrides" + bl_options = {"REGISTER", "UNDO"} + + def execute(self, context): + GROUPI = False + GLOBAL = 0 + GLOBALERROR = 0 + + print("==== STARTING CHECKING ====") + print("") + + for SCENE in bpy.data.scenes[:]: + MATLIST = [] + MATI = False + + for MATERIAL in bpy.data.materials[:]: + MATLIST.append(MATERIAL.name) + + GROUPLIST = [] + for GROUP in bpy.data.groups[:]: + if GROUP.users > 0: + GROUPLIST.append(GROUP.name) + + print(" %s Scene is checking" % (SCENE.name)) + + for OVERRIDE in list(eval(SCENE.oscurart.overrides)): + # REVISO OVERRIDES EN GRUPOS + if OVERRIDE[0] in GROUPLIST: + pass + else: + print("** %s group are in conflict." % (OVERRIDE[0])) + GROUPI = True + GLOBALERROR += 1 + # REVISO OVERRIDES EN GRUPOS + if OVERRIDE[1] in MATLIST: + pass + else: + print("** %s material are in conflict." % (OVERRIDE[1])) + MATI = True + GLOBALERROR += 1 + + if MATI is False: + print("-- Materials are ok.") + else: + GLOBAL += 1 + if GROUPI is False: + print("-- Groups are ok.") + else: + GLOBAL += 1 + + if GLOBAL < 1: + self.report({'INFO'}, "Materials And Groups are Ok") + if GLOBALERROR > 0: + self.report({'WARNING'}, "Override Error: Look in the Console") + print("") + + return {'FINISHED'} + +# --------------------------------- OVERRIDES PANEL ---------------------- + + +class OscOverridesGUI(Panel): + bl_label = "Oscurart Material Overrides" + bl_idname = "Oscurart Overrides List" + bl_space_type = "PROPERTIES" + bl_region_type = "WINDOW" + bl_context = "render" + + def draw(self, context): + + layout = self.layout + col = layout.column(align=1) + colrow = col.row(align=1) + colrow.operator("render.overrides_add_slot", icon="ZOOMIN") + colrow.operator("render.overrides_remove_slot", icon="ZOOMOUT") + col.operator("render.overrides_transfer", icon="SHORTDISPLAY") + + for i, m in enumerate(bpy.context.scene.ovlist): + colrow = col.row(align=1) + colrow.prop_search(m, "grooverride", bpy.data, "groups", text="") + colrow.prop_search( + m, + "matoverride", + bpy.data, + "materials", + text="") + if i != len(bpy.context.scene.ovlist) - 1: + pa = colrow.operator( + "ovlist.move_down", + text="", + icon="TRIA_DOWN") + pa.index = i + if i > 0: + p = colrow.operator("ovlist.move_up", text="", icon="TRIA_UP") + p.index = i + pb = colrow.operator("ovlist.kill", text="", icon="X") + pb.index = i + + +class OscOverridesUp(Operator): + bl_idname = 'ovlist.move_up' + bl_label = 'Move Override up' + bl_options = {'INTERNAL'} + + index = bpy.props.IntProperty(min=0) + + @classmethod + def poll(self, context): + return len(context.scene.ovlist) + + def execute(self, context): + ovlist = context.scene.ovlist + ovlist.move(self.index, self.index - 1) + + return {'FINISHED'} + + +class OscOverridesDown(Operator): + bl_idname = 'ovlist.move_down' + bl_label = 'Move Override down' + bl_options = {'INTERNAL'} + + index = bpy.props.IntProperty(min=0) + + @classmethod + def poll(self, context): + return len(context.scene.ovlist) + + def execute(self, context): + ovlist = context.scene.ovlist + ovlist.move(self.index, self.index + 1) + return {'FINISHED'} + + +class OscOverridesKill(Operator): + bl_idname = 'ovlist.kill' + bl_label = 'Kill Override' + bl_options = {'INTERNAL'} + + index = bpy.props.IntProperty(min=0) + + @classmethod + def poll(self, context): + return len(context.scene.ovlist) + + def execute(self, context): + ovlist = context.scene.ovlist + ovlist.remove(self.index) + return {'FINISHED'} + + +class OscTransferOverrides(Operator): + """Tooltip""" + bl_idname = "render.overrides_transfer" + bl_label = "Transfer Overrides" + + def execute(self, context): + # CREO LISTA + OSCOV = [[OVERRIDE.grooverride, OVERRIDE.matoverride] + for OVERRIDE in bpy.context.scene.ovlist[:] + if OVERRIDE.matoverride != "" and OVERRIDE.grooverride != ""] + + bpy.context.scene.oscurart.overrides = str(OSCOV) + return {'FINISHED'} + + +class OscAddOverridesSlot(Operator): + """Tooltip""" + bl_idname = "render.overrides_add_slot" + bl_label = "Add Override Slot" + + def execute(self, context): + prop = bpy.context.scene.ovlist.add() + prop.matoverride = "" + prop.grooverride = "" + return {'FINISHED'} + + +class OscRemoveOverridesSlot(Operator): + """Tooltip""" + bl_idname = "render.overrides_remove_slot" + bl_label = "Remove Override Slot" + + def execute(self, context): + context.scene.ovlist.remove(len(bpy.context.scene.ovlist) - 1) + return {'FINISHED'} diff --git a/oscurart_tools/oscurart_render.py b/oscurart_tools/oscurart_render.py index a20aafee..8e7fc05f 100644 --- a/oscurart_tools/oscurart_render.py +++ b/oscurart_tools/oscurart_render.py @@ -25,7 +25,6 @@ from bpy.types import ( ) import os - # -------------------------------- RENDER ALL SCENES --------------------- def defRenderAll(frametype, scenes): @@ -46,6 +45,7 @@ def defRenderAll(frametype, scenes): for ob in bpy.data.objects if ob.type in types if len(ob.material_slots)} for scene in scenes: + proptolist = list(eval(scene.oscurart.overrides)) renpath = scene.render.filepath if frametype: @@ -54,6 +54,15 @@ def defRenderAll(frametype, scenes): scene.frame_end = FC scene.frame_start = FC + for group, material in proptolist: + for object in bpy.data.groups[group].objects: + lenslots = len(object.material_slots) + if object.type in types: + if len(object.data.materials): + object.data.materials.clear() + for newslot in range(lenslots): + object.data.materials.append( + bpy.data.materials[material]) filename = os.path.basename(bpy.data.filepath.rpartition(".")[0]) uselayers = {layer: layer.use for layer in scene.render.layers} for layer, usado in uselayers.items(): @@ -63,6 +72,7 @@ def defRenderAll(frametype, scenes): layer.use = 1 print("SCENE: %s" % scene.name) print("LAYER: %s" % layer.name) + print("OVERRIDE: %s" % str(proptolist)) scene.render.filepath = os.path.join( os.path.dirname(renpath), filename, scene.name, layer.name, "%s_%s_%s" % (filename, scene.name, layer.name)) @@ -103,6 +113,9 @@ class renderAll (Operator): # --------------------------------RENDER SELECTED SCENES------------------ +bpy.types.Scene.use_render_scene = bpy.props.BoolProperty() + + class renderSelected (Operator): bl_idname = "render.render_selected_scenes_osc" bl_label = "Render Selected Scenes" @@ -112,12 +125,12 @@ class renderSelected (Operator): def execute(self, context): defRenderAll( self.frametype, - [sc for sc in bpy.data.scenes if sc.oscurart.use_render_scene]) + [sc for sc in bpy.data.scenes if sc.use_render_scene]) return {'FINISHED'} - # --------------------------------RENDER CURRENT SCENE-------------------- + class renderCurrent (Operator): bl_idname = "render.render_current_scene_osc" bl_label = "Render Current Scene" @@ -132,13 +145,14 @@ class renderCurrent (Operator): # --------------------------RENDER CROP---------------------- +bpy.types.Scene.rcPARTS = bpy.props.IntProperty( + default=0, min=2, max=50, step=1) + def OscRenderCropFunc(): SCENENAME = os.path.split(bpy.data.filepath)[-1].partition(".")[0] - rcParts = bpy.context.scene.oscurart.rcPARTS - # don't divide by zero - PARTS = (rcParts if rcParts and rcParts > 0 else 1) + PARTS = bpy.context.scene.rcPARTS CHUNKYSIZE = 1 / PARTS FILEPATH = bpy.context.scene.render.filepath bpy.context.scene.render.use_border = True @@ -148,12 +162,11 @@ def OscRenderCropFunc(): bpy.context.scene.render.border_max_y = ( PART * CHUNKYSIZE) + CHUNKYSIZE bpy.context.scene.render.filepath = "%s_part%s" % ( - os.path.join(FILEPATH, - SCENENAME, - bpy.context.scene.name, - SCENENAME), - PART - ) + os.path.join(FILEPATH, + SCENENAME, + bpy.context.scene.name, + SCENENAME), + PART) bpy.ops.render.render(animation=False, write_still=True) bpy.context.scene.render.filepath = FILEPATH @@ -167,9 +180,231 @@ class renderCrop (Operator): OscRenderCropFunc() return {'FINISHED'} +# ---------------------------BATCH MAKER------------------ + + +def defoscBatchMaker(TYPE, BIN): + + if os.name == "nt": + print("PLATFORM: WINDOWS") + SYSBAR = os.sep + EXTSYS = ".bat" + QUOTES = '"' + else: + print("PLATFORM:LINUX") + SYSBAR = os.sep + EXTSYS = ".sh" + QUOTES = '' + + FILENAME = bpy.data.filepath.rpartition(SYSBAR)[-1].rpartition(".")[0] + BINDIR = bpy.app[4] + SHFILE = os.path.join( + bpy.data.filepath.rpartition(SYSBAR)[0], + FILENAME + EXTSYS) + + with open(SHFILE, "w") as FILE: + # assign permission in linux + if EXTSYS == ".sh": + try: + os.chmod(SHFILE, stat.S_IRWXU) + except: + print( + "** Oscurart Batch maker can not modify the permissions.") + if not BIN: + FILE.writelines("%s%s%s -b %s -x 1 -o %s -P %s%s.py -s %s -e %s -a" % + (QUOTES, BINDIR, QUOTES, bpy.data.filepath, bpy.context.scene.render.filepath, + bpy.data.filepath.rpartition(SYSBAR)[0] + SYSBAR, TYPE, + str(bpy.context.scene.frame_start), str(bpy.context.scene.frame_end))) + else: + FILE.writelines("%s -b %s -x 1 -o %s -P %s%s.py -s %s -e %s -a" % + ("blender", bpy.data.filepath, bpy.context.scene.render.filepath, + bpy.data.filepath.rpartition(SYSBAR)[0] + SYSBAR, TYPE, + str(bpy.context.scene.frame_start), str(bpy.context.scene.frame_end))) + + RLATFILE = "%s%sosRlat.py" % ( + bpy.data.filepath.rpartition(SYSBAR)[0], + SYSBAR) + if not os.path.isfile(RLATFILE): + with open(RLATFILE, "w") as file: + if EXTSYS == ".sh": + try: + os.chmod(RLATFILE, stat.S_IRWXU) + except: + print( + "** Oscurart Batch maker can not modify the permissions.") + file.writelines( + "import bpy \nbpy.ops.render.render_all_scenes_osc()\nbpy.ops.wm.quit_blender()") + + else: + print("The All Python files Skips: Already exist!") + + RSLATFILE = "%s%sosRSlat.py" % ( + bpy.data.filepath.rpartition(SYSBAR)[0], + SYSBAR) + if not os.path.isfile(RSLATFILE): + with open(RSLATFILE, "w") as file: + if EXTSYS == ".sh": + try: + os.chmod(RSLATFILE, stat.S_IRWXU) + except: + print( + "** Oscurart Batch maker can not modify the permissions.") + file.writelines( + "import bpy \nbpy.ops.render.render_selected_scenes_osc()\nbpy.ops.wm.quit_blender()") + else: + print("The Selected Python files Skips: Already exist!") + + +class oscBatchMaker (Operator): + bl_idname = "file.create_batch_maker_osc" + bl_label = "Make render batch" + bl_options = {'REGISTER', 'UNDO'} + + type = bpy.props.EnumProperty( + name="Render Mode", + description="Select Render Mode", + items=(('osRlat', "All Scenes", "Render All Layers At Time"), + ('osRSlat', "Selected Scenes", "Render Only The Selected Scenes")), + default='osRlat', + ) + + bin = bpy.props.BoolProperty( + default=False, + name="Use Environment Variable") + + def execute(self, context): + defoscBatchMaker(self.type, self.bin) + return {'FINISHED'} + +# --------------------------------------PYTHON BATCH---------------------- + + +def defoscPythonBatchMaker(BATCHTYPE, SIZE): + + # REVISO SISTEMA + if os.name == "nt": + print("PLATFORM: WINDOWS") + SYSBAR = "\\" + EXTSYS = ".bat" + QUOTES = '"' + else: + print("PLATFORM:LINUX") + SYSBAR = "/" + EXTSYS = ".sh" + QUOTES = '' + + # CREO VARIABLES + FILENAME = bpy.data.filepath.rpartition(SYSBAR)[-1].rpartition(".")[0] + SHFILE = "%s%s%s_PythonSecureBatch.py" % ( + bpy.data.filepath.rpartition(SYSBAR)[0], + SYSBAR, + FILENAME) + BATCHLOCATION = "%s%s%s%s" % ( + bpy.data.filepath.rpartition(SYSBAR)[0], + SYSBAR, + FILENAME, + EXTSYS) + + with open(SHFILE, "w") as FILEBATCH: + + if EXTSYS == ".bat": + BATCHLOCATION = BATCHLOCATION.replace("\\", "/") + + # SI EL OUTPUT TIENE DOBLE BARRA LA REEMPLAZO + FRO = bpy.context.scene.render.filepath + if bpy.context.scene.render.filepath.count("//"): + FRO = bpy.context.scene.render.filepath.replace( + "//", + bpy.data.filepath.rpartition(SYSBAR)[0] + SYSBAR) + if EXTSYS == ".bat": + FRO = FRO.replace("\\", "/") + + # CREO BATCH + bpy.ops.file.create_batch_maker_osc(type=BATCHTYPE) + + SCRIPT = (''' +import os +REPITE= True +BAT= '%s' +SCENENAME ='%s' +DIR='%s%s' +def RENDER(): + os.system(BAT) +def CLEAN(): + global REPITE + FILES = [root+'/'+FILE for root, dirs, files in os.walk(os.getcwd()) if + len(files) > 0 for FILE in files if FILE.count('~') == False] + RESPUESTA=False + for FILE in FILES: + if os.path.getsize(FILE) < %s: + os.remove(FILE) + RESPUESTA= True + if RESPUESTA: + REPITE=True + else: + REPITE=False +REPITE=True +while REPITE: + REPITE=False + RENDER() + os.chdir(DIR) + CLEAN() +''' % (BATCHLOCATION, FILENAME, FRO, FILENAME, SIZE)) + + # DEFINO ARCHIVO DE BATCH + FILEBATCH.writelines(SCRIPT) + + # ARCHIVO CALL + CALLFILENAME = bpy.data.filepath.rpartition(SYSBAR)[-1].rpartition(".")[0] + CALLFILE = "%s%s%s_CallPythonSecureBatch%s" % ( + bpy.data.filepath.rpartition(SYSBAR)[0], + SYSBAR, + CALLFILENAME, + EXTSYS) + + with open(CALLFILE, "w") as CALLFILEBATCH: + + SCRIPT = "python %s" % (SHFILE) + CALLFILEBATCH.writelines(SCRIPT) + + if EXTSYS == ".sh": + try: + os.chmod(CALLFILE, stat.S_IRWXU) + os.chmod(SHFILE, stat.S_IRWXU) + except: + print("** Oscurart Batch maker can not modify the permissions.") + + +class oscPythonBatchMaker (Operator): + bl_idname = "file.create_batch_python" + bl_label = "Make Batch Python" + bl_options = {'REGISTER', 'UNDO'} + + size = bpy.props.IntProperty(name="Size in Bytes", default=10, min=0) + + type = bpy.props.EnumProperty( + name="Render Mode", + description="Select Render Mode", + items=(('osRlat', "All Scenes", "Render All Layers At Time"), + ('osRSlat', "Selected Scenes", "Render Only The Selected Scenes")), + default='osRlat', + ) + + def execute(self, context): + defoscPythonBatchMaker(self.type, self.size) + return {'FINISHED'} + # ---------------------------------- BROKEN FRAMES --------------------- +class VarColArchivos (bpy.types.PropertyGroup): + filename = bpy.props.StringProperty(name="", default="") + value = bpy.props.IntProperty(name="", default=10) + fullpath = bpy.props.StringProperty(name="", default="") + checkbox = bpy.props.BoolProperty(name="", default=True) +bpy.utils.register_class(VarColArchivos) + + class SumaFile(Operator): bl_idname = "object.add_broken_file" bl_label = "Add Broken Files" @@ -213,7 +448,11 @@ class DeleteFiles(Operator): return {'FINISHED'} -class BrokenFramesPanel(Panel): +bpy.types.Scene.broken_files = bpy.props.CollectionProperty( + type=VarColArchivos) + + +class BrokenFramesPanel (Panel): bl_label = "Oscurart Broken Render Files" bl_idname = "OBJECT_PT_osc_broken_files" bl_space_type = 'PROPERTIES' @@ -285,6 +524,7 @@ def defCopyRenderSettings(mode): 'keying_sets_all', 'sequence_editor', '__doc__', + 'ovlist', 'file_extension', 'users', 'node_tree', @@ -309,6 +549,7 @@ def defCopyRenderSettings(mode): '__weakref__', 'string', 'double', + 'overrides', 'use_render_scene', 'engine', 'use_nodes', @@ -342,6 +583,13 @@ def defCopyRenderSettings(mode): except: print("%s does not exist." % (prop)) + """ + scenerenderdict = {prop: getattr(bpy.context.scene.render, prop) for prop in dir(bpy.context.scene.render)} + scenedict = {prop: getattr(bpy.context.scene, prop) for prop in dir(bpy.context.scene) if prop not in excludes} + sceneimagesettingdict = {prop: getattr(bpy.context.scene.render.image_settings, prop) + for prop in dir(bpy.context.scene.render.image_settings)} + """ + # render for escena in sceneslist: for prop, value in scenerenderdict.items(): @@ -350,6 +598,7 @@ def defCopyRenderSettings(mode): except: print("%s was not copied!" % (prop)) pass + # scene for escena in sceneslist: for prop, value in scenedict.items(): @@ -376,6 +625,10 @@ def defCopyRenderSettings(mode): bpy.context.scene.cycles, prop) except: print("%s does not exist." % (prop)) + + """ + scenecyclesdict = {prop: getattr(bpy.context.scene.cycles, prop) for prop in dir(bpy.context.scene.cycles)} + """ # cycles for escena in sceneslist: for prop, value in scenecyclesdict.items(): @@ -389,6 +642,7 @@ def defCopyRenderSettings(mode): class copyRenderSettings(Operator): bl_idname = "render.copy_render_settings_osc" bl_label = "Copy Render Settings" + # bl_options = {'REGISTER', 'UNDO'} mode = bpy.props.StringProperty(default="") |