diff options
Diffstat (limited to 'space_view3d_stored_views/operators.py')
-rw-r--r-- | space_view3d_stored_views/operators.py | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/space_view3d_stored_views/operators.py b/space_view3d_stored_views/operators.py new file mode 100644 index 00000000..1ec3026b --- /dev/null +++ b/space_view3d_stored_views/operators.py @@ -0,0 +1,170 @@ +# gpl authors: nfloyd, Francesco Siddi + +import bpy +from bpy.props import ( + IntProperty, + StringProperty, + ) +from bpy.types import Operator +from .core import ( + stored_view_factory, + DataStore, + ) +from .ui import init_draw + + +class VIEW3D_stored_views_save(Operator): + bl_idname = "stored_views.save" + bl_label = "Save Current" + bl_description = "Save the view 3d current state" + + index = IntProperty() + + def execute(self, context): + mode = context.scene.stored_views.mode + sv = stored_view_factory(mode, self.index) + sv.save() + context.scene.stored_views.view_modified = False + init_draw(context) + + return {'FINISHED'} + + +class VIEW3D_stored_views_set(Operator): + bl_idname = "stored_views.set" + bl_label = "Set" + bl_description = "Update the view 3D according to this view" + + index = IntProperty() + + def execute(self, context): + mode = context.scene.stored_views.mode + sv = stored_view_factory(mode, self.index) + sv.set() + context.scene.stored_views.view_modified = False + init_draw(context) + + return {'FINISHED'} + + +class VIEW3D_stored_views_delete(Operator): + bl_idname = "stored_views.delete" + bl_label = "Delete" + bl_description = "Delete this view" + + index = IntProperty() + + def execute(self, context): + data = DataStore() + data.delete(self.index) + + return {'FINISHED'} + + +class VIEW3D_New_Camera_to_View(Operator): + bl_idname = "stored_views.newcamera" + bl_label = "New Camera To View" + bl_description = "Add a new Active Camera and align it to this view" + + def execute(self, context): + try: + # check for operator's poll (there is no active object, for instance) + if bpy.ops.object.mode_set.poll(): + bpy.ops.object.mode_set(mode='OBJECT') + + bpy.ops.object.camera_add(view_align=True) + cam = bpy.context.active_object + bpy.ops.view3d.object_as_camera() + bpy.ops.view3d.camera_to_view() + + # this will name the Camera Object + if 'View_Camera' not in context.scene.objects: + cam.name = "View_Camera" + else: + cam.name = "View_Camera.000" + + return {'FINISHED'} + except: + self.report({'WARNING'}, + "Operation Cancelled. New Camera to View failed to add a new camera") + return {'CANCELLED'} + + +# Camera marker & switcher by Fsiddi +class SetSceneCamera(Operator): + bl_idname = "cameraselector.set_scene_camera" + bl_label = "Set Scene Camera" + bl_description = "Set chosen camera as the scene's active camera" + + chosen_camera = StringProperty() + select_chosen = False + + def execute(self, context): + chosen_camera = bpy.data.objects.get(self.chosen_camera, None) + scene = context.scene + if not chosen_camera: + self.report({'ERROR'}, "Camera %s not found.") + return {'CANCELLED'} + + if self.select_chosen: + if context.mode == 'OBJECT': + for o in context.selected_objects: + o.select = False + chosen_camera.select = True + scene.objects.active = chosen_camera + for c in [o for o in scene.objects if o.type == 'CAMERA']: + c.hide = (c != chosen_camera) + scene.camera = chosen_camera + bpy.context.scene.objects.active = chosen_camera + bpy.ops.object.select_all(action='TOGGLE') + chosen_camera.select = True + return {'FINISHED'} + + def invoke(self, context, event): + if event.ctrl: + self.select_chosen = True + + return self.execute(context) + + +class AddCameraMarker(Operator): + bl_idname = "cameraselector.add_camera_marker" + bl_label = "Add Camera Marker" + bl_description = "Add a timeline marker bound to chosen camera" + + chosen_camera = StringProperty() + + def execute(self, context): + chosen_camera = bpy.data.objects.get(self.chosen_camera, None) + scene = context.scene + if not chosen_camera: + self.report({'WARNING'}, "Camera %s not found. Operation Cancelled") + return {'CANCELLED'} + + current_frame = scene.frame_current + marker = None + for m in reversed(sorted(filter(lambda m: m.frame <= current_frame, + scene.timeline_markers), + key=lambda m: m.frame)): + marker = m + break + if marker and (marker.camera == chosen_camera): + # Cancel if the last marker at or immediately before + # current frame is already bound to the camera. + return {'CANCELLED'} + + marker_name = "F_%02d_%s" % (current_frame, self.chosen_camera) + if marker and (marker.frame == current_frame): + # Reuse existing marker at current frame to avoid + # overlapping bound markers. + marker.name = marker_name + else: + marker = scene.timeline_markers.new(marker_name) + marker.frame = scene.frame_current + marker.camera = chosen_camera + marker.select = True + + for other_marker in [m for m in scene.timeline_markers if m != marker]: + other_marker.select = False + + return {'FINISHED'} |