Append GP render workspace from dopepsheet panel
1.2.1 - added: bundle app_template to load "GR Render" workspace from it - added: ui button in dopesheet to load GP render workspace
This commit is contained in:
		
							parent
							
								
									544cd7bf56
								
							
						
					
					
						commit
						f3646e37df
					
				| @ -14,6 +14,11 @@ Activate / deactivate layer opacity according to prefix | |||||||
| Activate / deactivate all masks using MA layers | Activate / deactivate all masks using MA layers | ||||||
| --> | --> | ||||||
| 
 | 
 | ||||||
|  | 1.2.1 | ||||||
|  | 
 | ||||||
|  | - added: bundle app_template to load "GR Render" workspace from it | ||||||
|  | - added: ui button in dopesheet to load GP render workspace if not loaded | ||||||
|  | 
 | ||||||
| 1.2.0 | 1.2.0 | ||||||
| 
 | 
 | ||||||
| - changed: enabled when launched in background | - changed: enabled when launched in background | ||||||
|  | |||||||
| @ -241,24 +241,11 @@ class GPEXP_OT_render_auto_build(bpy.types.Operator): | |||||||
|                 if (render_wkspace := bpy.data.workspaces.get('GP Render')): |                 if (render_wkspace := bpy.data.workspaces.get('GP Render')): | ||||||
|                     context.window.workspace = render_wkspace |                     context.window.workspace = render_wkspace | ||||||
|                 else: |                 else: | ||||||
|                     render_wkspace_filepath = Path(bpy.utils.user_resource('SCRIPTS'), 'startup', 'bl_app_templates_user', 'GP', 'startup.blend') |                     ret = fn.activate_workspace('GP Render') | ||||||
|                     ret = bpy.ops.workspace.append_activate(idname='GP Render', filepath=str(render_wkspace_filepath)) |                     # render_wkspace_filepath = Path(__file__).parent / 'app_templates' / 'GP_render' / 'startup.blend' | ||||||
| 
 |                     # ret = bpy.ops.workspace.append_activate(idname='GP Render', filepath=str(render_wkspace_filepath)) | ||||||
|                     if ret != {'FINISHED'}: |                     if not ret: | ||||||
|                         print(f'Fallback to addon stored workspaces: (No "GP Render" found in {render_wkspace_filepath})') |  | ||||||
|                         # Fallback to workspace template shipped with addon (TODO : add template blend file in addon) |  | ||||||
|                         render_wkspace_filepath = Path(__file__).parent / 'workspaces' / 'startup.blend' |  | ||||||
|                         ret = bpy.ops.workspace.append_activate(idname='GP Render', filepath=str(render_wkspace_filepath)) |  | ||||||
|                      |  | ||||||
|                     if ret != {'FINISHED'}: |  | ||||||
|                         print('No GP render workspace available') |                         print('No GP render workspace available') | ||||||
|                      |  | ||||||
|                     ## extra retry after append activate ?... |  | ||||||
|                     if ret == {'FINISHED'}: |  | ||||||
|                         render_wkspace = bpy.data.workspaces.get('GP Render') |  | ||||||
|                         if render_wkspace: |  | ||||||
|                             context.window.workspace = render_wkspace |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
|         # context.workspace.update_tag() |         # context.workspace.update_tag() | ||||||
|         # context.scene.update_tag() |         # context.scene.update_tag() | ||||||
|  | |||||||
| @ -89,9 +89,20 @@ class GPEXP_OT_swap_render_cams(bpy.types.Operator): | |||||||
| 
 | 
 | ||||||
|         return {"FINISHED"} |         return {"FINISHED"} | ||||||
| 
 | 
 | ||||||
|  | class GPEXP_OT_set_gp_render_workspace(bpy.types.Operator): | ||||||
|  |     bl_idname = "gp.set_gp_render_workspace" | ||||||
|  |     bl_label = 'Set GP Render Workspace' | ||||||
|  |     bl_description = "Switch to GP render workspace, append and activate if not exists" | ||||||
|  |     bl_options = {'REGISTER', 'INTERNAL'} | ||||||
|  | 
 | ||||||
|  |     def execute(self, context): | ||||||
|  |         fn.activate_workspace(name='GP Render', context=context) | ||||||
|  |         return {"FINISHED"} | ||||||
|  | 
 | ||||||
| classes=( | classes=( | ||||||
| GPEXP_OT_render_scene_switch, | GPEXP_OT_render_scene_switch, | ||||||
| GPEXP_OT_swap_render_cams, | GPEXP_OT_swap_render_cams, | ||||||
|  | GPEXP_OT_set_gp_render_workspace, | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| def register():  | def register():  | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ bl_info = { | |||||||
|     "name": "GP Render", |     "name": "GP Render", | ||||||
|     "description": "Organise export of gp layers through compositor output", |     "description": "Organise export of gp layers through compositor output", | ||||||
|     "author": "Samuel Bernou", |     "author": "Samuel Bernou", | ||||||
|     "version": (1, 2, 0), |     "version": (1, 2, 1), | ||||||
|     "blender": (2, 93, 0), |     "blender": (2, 93, 0), | ||||||
|     "location": "View3D", |     "location": "View3D", | ||||||
|     "warning": "", |     "warning": "", | ||||||
|  | |||||||
							
								
								
									
										22
									
								
								app_templates/GP_Render/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								app_templates/GP_Render/__init__.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,22 @@ | |||||||
|  | import bpy | ||||||
|  | from bpy.app.handlers import persistent | ||||||
|  | 
 | ||||||
|  | @persistent | ||||||
|  | def setup_gp_render_workspace(): | ||||||
|  | 
 | ||||||
|  |     scn = bpy.context.scene | ||||||
|  |     if not scn.camera: | ||||||
|  |         scn.camera = next((o for o in scn.objects if o.type == 'CAMERA'), None) | ||||||
|  | 
 | ||||||
|  |     # Use rendered preview shading. | ||||||
|  |     for screen in bpy.data.screens: | ||||||
|  |         for area in screen.areas: | ||||||
|  |             for space in area.spaces: | ||||||
|  |                 if space.type == 'VIEW_3D': | ||||||
|  |                     space.region_3d.view_perspective = 'CAMERA' | ||||||
|  |      | ||||||
|  | def register(): | ||||||
|  |     bpy.app.handlers.load_post.append(setup_gp_render_workspace) | ||||||
|  | 
 | ||||||
|  | def unregister(): | ||||||
|  |     bpy.app.handlers.load_factory_startup_post.remove(setup_gp_render_workspace) | ||||||
							
								
								
									
										
											BIN
										
									
								
								app_templates/GP_Render/startup.blend
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								app_templates/GP_Render/startup.blend
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										26
									
								
								fn.py
									
									
									
									
									
								
							
							
						
						
									
										26
									
								
								fn.py
									
									
									
									
									
								
							| @ -92,6 +92,31 @@ def create_aa_nodegroup(tree): | |||||||
| 
 | 
 | ||||||
| ## -- object and scene settings  | ## -- object and scene settings  | ||||||
| 
 | 
 | ||||||
|  | def activate_workspace(name='', context=None): | ||||||
|  |     if not name: | ||||||
|  |         return | ||||||
|  |     if context is None: | ||||||
|  |         context = bpy.context | ||||||
|  | 
 | ||||||
|  |     if context.window.workspace.name == name: | ||||||
|  |         print(f'Already in {name} workspace') | ||||||
|  |         return | ||||||
|  | 
 | ||||||
|  |     if (wkspace := bpy.data.workspaces.get(name)): | ||||||
|  |         context.window.workspace = wkspace | ||||||
|  |         return True | ||||||
|  |      | ||||||
|  |     # Same name with spaces as underscore | ||||||
|  |     dir_name = name.replace(' ', '_') | ||||||
|  |     filepath = Path(__file__).parent / 'app_templates' / dir_name / 'startup.blend' | ||||||
|  |      | ||||||
|  |     ret = bpy.ops.workspace.append_activate(idname=name, filepath=str(filepath)) | ||||||
|  |     if ret != {'FINISHED'}: | ||||||
|  |         print(f'Could not found {name} at {filepath}') | ||||||
|  |         return False | ||||||
|  | 
 | ||||||
|  |     return context.window.workspace | ||||||
|  | 
 | ||||||
| def copy_settings(obj_a, obj_b): | def copy_settings(obj_a, obj_b): | ||||||
|     exclusion = ['bl_rna', 'id_data', 'identifier','name_property','rna_type','properties', 'stamp_note_text','use_stamp_note', |     exclusion = ['bl_rna', 'id_data', 'identifier','name_property','rna_type','properties', 'stamp_note_text','use_stamp_note', | ||||||
|      'settingsFilePath', 'settingsStamp', 'select', 'matrix_local', 'matrix_parent_inverse',  |      'settingsFilePath', 'settingsStamp', 'select', 'matrix_local', 'matrix_parent_inverse',  | ||||||
| @ -706,7 +731,6 @@ def clean_nodegroup_inputs(ng, skip_existing_pass=True): | |||||||
|                 # a render layer of this name still exists |                 # a render layer of this name still exists | ||||||
|                 continue |                 continue | ||||||
|             ngroup.inputs.remove(ngroup.inputs[i]) |             ngroup.inputs.remove(ngroup.inputs[i]) | ||||||
|      |  | ||||||
|     # clear_nodegroup_content_if_disconnected(ngroup) |     # clear_nodegroup_content_if_disconnected(ngroup) | ||||||
| 
 | 
 | ||||||
| def bridge_reconnect_nodegroup(ng, socket_name=None): | def bridge_reconnect_nodegroup(ng, socket_name=None): | ||||||
|  | |||||||
| @ -222,7 +222,7 @@ def get_set_viewlayer_from_gp(ob, l, scene=None): | |||||||
|         else: |         else: | ||||||
|             scene = fn.get_render_scene() |             scene = fn.get_render_scene() | ||||||
| 
 | 
 | ||||||
|     print('Set viewlayer Scene: ', scene.name) |     # print('Set viewlayer Scene: ', scene.name) | ||||||
|     node_tree = scene.node_tree |     node_tree = scene.node_tree | ||||||
|     nodes = node_tree.nodes |     nodes = node_tree.nodes | ||||||
| 
 | 
 | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								ui.py
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								ui.py
									
									
									
									
									
								
							| @ -1,5 +1,6 @@ | |||||||
| import bpy | import bpy | ||||||
| from bpy.types import Panel | from bpy.types import Panel | ||||||
|  | from pathlib import Path | ||||||
| from .prefs import get_addon_prefs | from .prefs import get_addon_prefs | ||||||
| # from .preferences import get_addon_prefs | # from .preferences import get_addon_prefs | ||||||
| 
 | 
 | ||||||
| @ -122,7 +123,6 @@ class GPEXP_PT_gp_node_ui(Panel): | |||||||
|         if advanced: |         if advanced: | ||||||
|             subcol.operator('gp.set_output_node_format', icon='OUTPUT', text='Copy Active Output Format') |             subcol.operator('gp.set_output_node_format', icon='OUTPUT', text='Copy Active Output Format') | ||||||
|             subcol.operator('gp.set_active_fileout_to_compout', icon='OUTPUT', text='Active Slot to Composite') |             subcol.operator('gp.set_active_fileout_to_compout', icon='OUTPUT', text='Active Slot to Composite') | ||||||
|          |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|         layout.separator() |         layout.separator() | ||||||
| @ -236,7 +236,11 @@ class GPEXP_PT_gp_dopesheet_ui(Panel): | |||||||
|         row = layout.row() |         row = layout.row() | ||||||
|         row.operator('gp.export_as_pdf', icon='RENDER_STILL', text='Render All to PDF Sequences') |         row.operator('gp.export_as_pdf', icon='RENDER_STILL', text='Render All to PDF Sequences') | ||||||
|         if bpy.app.version < (3,0,0):  |         if bpy.app.version < (3,0,0):  | ||||||
|             row.label(text='Not Blender 3.0.0') |             row.label(text='Not Blender 3.0.0+') | ||||||
|  |          | ||||||
|  |         ## Append GP Render workspace (usefull for user with disabled 'load_UI') | ||||||
|  |         if not bpy.data.workspaces.get('GP Render'): | ||||||
|  |             layout.operator('gp.set_gp_render_workspace') | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class GPEXP_MT_multi_user_doc(bpy.types.Menu): | class GPEXP_MT_multi_user_doc(bpy.types.Menu): | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user