import bpy from .. import fn from .simplify_conflicts import list_simplify_affected_objects ## WIP : checker operator to perform all check at once (sometimes a limited version of the check) to expose useful solving operators. # region Scene check class RT_OT_scene_checker(Operator): bl_idname = "rt.scene_checker" bl_label = "Check Scene " bl_description = "Check / correct some aspect of the scene and objects, properties, etc. and report" bl_options = {"REGISTER"} ## List of possible actions calls : # set scene res # set scene percentage at 100: # Disabled animation # Objects visibility conflict # Objects modifiers visibility conflict apply_fixes : bpy.props.BoolProperty(name="Apply Fixes", default=False, description="Apply possible fixes instead of just listing (pop the list again in fix mode)", options={'SKIP_SAVE'}) def invoke(self, context, event): self.ctrl = event.ctrl return self.execute(context) def execute(self, context): problems = [] ## Old method : Apply fixes based on pref (inverted by ctrl key) # # If Ctrl is pressed, invert behavior (invert boolean) # apply ^= self.ctrl # apply = self.apply_fixes # if self.ctrl: # apply = True ## Object visibility conflict viz_ct = 0 for o in context.scene.objects: if not (o.hide_get() == o.hide_viewport == o.hide_render): hv = 'No' if o.hide_get() else 'Yes' vp = 'No' if o.hide_viewport else 'Yes' rd = 'No' if o.hide_render else 'Yes' viz_ct += 1 print(f'{o.name} : viewlayer {hv} - viewport {vp} - render {rd}') if viz_ct: problems.append(['rt.list_object_visibility_conflicts', f'{viz_ct} objects visibility conflicts (details in console)', 'OBJECT_DATAMODE']) ## GP modifiers visibility conflict mod_viz_ct = 0 for o in context.scene.objects: for m in o.modifiers: if m.show_viewport != m.show_render: vp = 'Yes' if m.show_viewport else 'No' rd = 'Yes' if m.show_render else 'No' mod_viz_ct += 1 print(f'{o.name} - modifier {m.name}: viewport {vp} != render {rd}') if mod_viz_ct: problems.append(['rt.list_modifier_visibility', f'{mod_viz_ct} modifiers visibility conflicts (details in console)', 'MODIFIER_DATA']) ## Collection # TODO: add check for collection visibility conflicts ## Simplify affected object if context.scene.render.use_simplify and list_simplify_affected_objects(context): problems.append(['rt.list_object_affected_by_simplify', 'Some objects are affected by simplify (details in console)', 'MOD_SIMPLIFY']) #### --- print fix/problems report if problems: print('===File check===') for p in problems: if isinstance(p, str): print(p) else: print(p[0]) if not self.apply_fixes: ## button to call the operator again with apply_fixes set to True problems.append(['OPERATOR', 'gp.file_checker', 'Apply Fixes', 'FORWARD', {'apply_fixes': True}]) # Show in viewport title = "Changed Settings" if apply else "Checked Settings (nothing changed)" fn.show_message_box(problems, _title = title, _icon = 'INFO') else: self.report({'INFO'}, 'All good') return {'FINISHED'} # endregion # RT_OT_scene_checker,