diff --git a/__init__.py b/__init__.py index 124f611..2a1183c 100644 --- a/__init__.py +++ b/__init__.py @@ -4,7 +4,7 @@ bl_info = { "name": "Background plane manager", "description": "Manage the background image planes and grease pencil object relative to a camera", "author": "Samuel Bernou", - "version": (0, 7, 0), + "version": (0, 7, 1), "blender": (4, 3, 0), "location": "View3D", "warning": "", diff --git a/operators/__init__.py b/operators/__init__.py index 029148b..6125546 100644 --- a/operators/__init__.py +++ b/operators/__init__.py @@ -1,11 +1,16 @@ # SPDX-License-Identifier: GPL-2.0-or-later -from . import (manage_objects, manage_planes, convert_planes) +from . import (manage_objects, + manage_planes, + convert_planes, + # fit_plane_to_camera_frame, + ) modules = ( manage_objects, manage_planes, - convert_planes + convert_planes, + # fit_plane_to_camera_frame, ) # if 'bpy' in locals(): diff --git a/operators/fit_plane_to_camera_frame.py b/operators/fit_plane_to_camera_frame.py new file mode 100644 index 0000000..e8bba2f --- /dev/null +++ b/operators/fit_plane_to_camera_frame.py @@ -0,0 +1,69 @@ +import bpy +from .. import core + +## Unexposed operator: +## Adjust individual "scale" custom property to fit camera frame +## Note: usually we do not want ot touch the custom prop "scale" of the plane and only adjust the focal of the BGcam + + +class BPM_OT_fit_plane_to_camera_frame(bpy.types.Operator): + bl_idname = "bpm.fit_plane_to_camera_frame" + bl_label = "Fit Plane To Camera Frame" + bl_description = "Adjust selected planes 'scale' custom property to fit width in camera frame\ + \nCtrl + clic to adjust all planes instead of selection only" + bl_options = {"REGISTER", "UNDO"} + + @classmethod + def poll(cls, context): + return True + + def invoke(self, context, event): + self.active = context.scene.bg_props.planes[context.scene.bg_props.index].plane + # self.plane_list = [self.active] + + # if event.ctrl: # affect all + if context.scene.bg_props.move_hidden: + self.plane_list = [i.plane for i in context.scene.bg_props.planes if i.type == 'bg'] + else: + # o.visible_get() << if not get_view_layer_col(o.users_collection[0]).exclude + self.plane_list = [i.plane for i in context.scene.bg_props.planes if i.type == 'bg' and i.plane.visible_get()] + + if not self.plane_list: + self.report({'ERROR'}, f'No plane found in list with current filter') + return {"CANCELLED"} + + if not event.ctrl: + self.plane_list = [p for p in self.plane_list if p.select_get()] + + #self.active_index = self.plane_list.index(self.active) + #self.init_dist = [o.get('distance') for o in self.plane_list] + return self.execute(context) + + def execute(self, context): + # print(self.active.name, '<<-') + scn_res_x = context.scene.render.resolution_x + for plane in self.plane_list: + plane_scale = plane["scale"] + old_scale = plane['scale'] + ## get Image resolution to calculate offset + im_data, transparency = core.get_image_infos_from_object(plane.children[0]) + plane['scale'] = plane_scale * (scn_res_x / im_data.size[0]) + + print(f"{plane.name}: scale {old_scale} -> {plane['scale']}") + plane.update_tag() + plane.data.update() + + return {'FINISHED'} + + +classes=( +BPM_OT_fit_plane_to_camera_frame, +) + +def register(): + for cls in classes: + bpy.utils.register_class(cls) + +def unregister(): + for cls in reversed(classes): + bpy.utils.unregister_class(cls) diff --git a/operators/manage_planes.py b/operators/manage_planes.py index ccac4bc..3835e21 100644 --- a/operators/manage_planes.py +++ b/operators/manage_planes.py @@ -168,7 +168,7 @@ class BPM_OT_set_distance(Operator): context.window_manager.modal_handler_add(self) self.active = context.scene.bg_props.planes[context.scene.bg_props.index].plane - if context.scene.bg_props.move_hided: + if context.scene.bg_props.move_hidden: self.plane_list = [i.plane for i in context.scene.bg_props.planes if i.type == 'bg'] else: # o.visible_get() << if not get_view_layer_col(o.users_collection[0]).exclude diff --git a/ui/panels.py b/ui/panels.py index 401f946..373a087 100644 --- a/ui/panels.py +++ b/ui/panels.py @@ -138,7 +138,7 @@ class BPM_PT_bg_manager_panel(Panel): row.label(text='Move:') if active_item.type == 'bg': row.operator("bpm.set_distance", text=f"Distance {ob['distance']:.1f}m") - row.prop(scn.bg_props, 'move_hided', text='Hided') + row.prop(scn.bg_props, 'move_hidden', text='Hidden') elif active_item.type == 'obj': cam = context.scene.objects.get('bg_cam') or context.scene.camera diff --git a/ui/ui_list.py b/ui/ui_list.py index e268a54..43255ed 100644 --- a/ui/ui_list.py +++ b/ui/ui_list.py @@ -330,7 +330,7 @@ class BPM_bg_settings(PropertyGroup): planes : bpy.props.CollectionProperty(type=BPM_bg_list_prop) show_distance : BoolProperty(name='Show Distance', default=False) opacity : FloatProperty(name='Opacity', default=1.0, min=0.0, max=1.0, update=update_opacity) - move_hided : BoolProperty(name='Move hided', default=True) + move_hidden : BoolProperty(name='Move Hidden', default=True) ui_list_scale : FloatProperty(name='UI Item Y Scale', default=1.6, min=0.6, soft_min=1.0, max=2.0) # distance : FloatProperty(name='Distance', default=0.0, update=update_distance)