###################################################################################################### # A simple add-on to allows the user to precisly place the border render region (Ctrl+B in cam view) # # using numerical input, witch can be animated # # Actualy uncommented (see further version) # # Author: Lapineige # # License: GPL v3 # ###################################################################################################### ############# Add-on description (used by Blender) bl_info = { "name": "Precise Render Border Adjust", "description": 'Allows to modify and animate the "Border Render" region with numerical input.', "author": "Lapineige", "version": (1, 3), "blender": (2, 71, 0), "location": "Properties > Render > Precise Render Border Adjust (panel)", "warning": "", # used for warning icon and text in addons panel "wiki_url": "http://le-terrier-de-lapineige.over-blog.com/2014/07/precise-render-border-adjust-mon-add-on-pour-positionner-precisement-le-border-render.html", "tracker_url": "http://blenderclan.tuxfamily.org/html/modules/newbb/viewtopic.php?topic_id=42159", "category": "Render"} ############## import bpy bpy.types.Scene.x_min_pixels = bpy.props.IntProperty(min=0, description="Minimum X value (in pixel) for the render border") bpy.types.Scene.x_max_pixels = bpy.props.IntProperty(min=0, description="Maximum X value (in pixel) for the render border") bpy.types.Scene.y_min_pixels = bpy.props.IntProperty(min=0, description="Minimum Y value (in pixel) for the render border") bpy.types.Scene.y_max_pixels = bpy.props.IntProperty(min=0, description="Maximum Y value (in pixel) for the render border") class PreciseRenderBorderAdjust(bpy.types.Panel): """Creates the tools in a Panel, in the scene context of the properties editor""" bl_label = "Precise Render Border Adjust" bl_idname = "Precise_Render_Border_Adjust" bl_space_type = 'PROPERTIES' bl_region_type = 'WINDOW' bl_context = "render" def draw(self, context): layout = self.layout scene = context.scene if not scene.render.use_border: sub = layout.split(percentage=0.7) sub.label(icon="ERROR", text="Border Render not activated:") sub.prop(scene.render, "use_border") sub = layout.column() row = sub.row() row.label(text="") row.prop(scene.render, "border_max_y", text="Max", slider=True) row.label(text="") row = sub.row(align=True) row.prop(scene.render, "border_min_x", text="Min", slider=True) row.prop(scene.render, "border_max_x", text="Max", slider=True) row = sub.row() row.label(text="") row.prop(scene.render, "border_min_y", text="Min", slider=True) row.label(text="") row = layout.row() row.label(text="Convert values to pixels:") row.operator("render.bordertopixels", text="Border -> Pixels") layout.label(text="Pixels position X:") row = layout.row(align=True) row.prop(scene, "x_min_pixels", text="Min") row.prop(scene, "x_max_pixels", text="Max") layout.label(text="Pixels position Y:") row = layout.row(align=True) row.prop(scene, "y_min_pixels", text="Min") row.prop(scene, "y_max_pixels", text="Max") layout.label(icon="INFO", text="Don't forget to apply pixels values") row = layout.row() row.operator("render.pixelstoborder", text="Pixels -> Border") class PixelsToBorder(bpy.types.Operator): """ Convert the pixel value into the proportion needed by the Blender native property """ bl_idname = "render.pixelstoborder" bl_label = "Convert Pixels to Border proportion" @classmethod def poll(cls, context): return True def execute(self, context): C = bpy.context X = C.scene.render.resolution_x Y = C.scene.render.resolution_y C.scene.render.border_min_x = C.scene.x_min_pixels / X C.scene.render.border_max_x = C.scene.x_max_pixels / X C.scene.render.border_min_y = C.scene.y_min_pixels / Y C.scene.render.border_max_y = C.scene.y_max_pixels / Y if C.scene.x_min_pixels > X: C.scene.x_min_pixels = X if C.scene.x_max_pixels > X: C.scene.x_max_pixels = X if C.scene.y_min_pixels > Y: C.scene.y_min_pixels = Y if C.scene.y_max_pixels > Y: C.scene.y_max_pixels = Y return {'FINISHED'} class BorderToPixels(bpy.types.Operator): """ Convert the Blender native property value to pixels""" bl_idname = "render.bordertopixels" bl_label = "Convert border values to pixels" @classmethod def poll(cls, context): return True def execute(self, context): C = bpy.context X = C.scene.render.resolution_x Y = C.scene.render.resolution_y C.scene.x_min_pixels = int(C.scene.render.border_min_x * X) C.scene.x_max_pixels = int(C.scene.render.border_max_x * X) C.scene.y_min_pixels = int(C.scene.render.border_min_y * Y) C.scene.y_max_pixels = int(C.scene.render.border_max_y * Y) return {'FINISHED'} def register(): bpy.utils.register_class(PreciseRenderBorderAdjust) bpy.utils.register_class(PixelsToBorder) bpy.utils.register_class(BorderToPixels) def unregister(): bpy.utils.unregister_class(PreciseRenderBorderAdjust) bpy.utils.unregister_class(PixelsToBorder) bpy.utils.unregister_class(BorderToPixels) if __name__ == "__main__": C = bpy.context X = C.scene.render.resolution_x Y = C.scene.render.resolution_y C.scene.x_min_pixels = 0 C.scene.x_max_pixels = X C.scene.y_min_pixels = 0 C.scene.y_max_pixels = Y register()