Compare commits
	
		
			2 Commits
		
	
	
		
			f5c20a3499
			...
			abb61ca6d4
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | abb61ca6d4 | ||
|  | 7430bca02f | 
| @ -2,6 +2,8 @@ | ||||
| import bpy | ||||
| import mathutils | ||||
| from bpy_extras import view3d_utils | ||||
| from bpy.app.handlers import persistent | ||||
| 
 | ||||
| from .utils import get_gp_draw_plane, region_to_location, get_view_origin_position | ||||
| 
 | ||||
| ## override all sursor snap shortcut with this in keymap | ||||
| @ -105,11 +107,11 @@ def swap_keymap_by_id(org_idname, new_idname): | ||||
|             k.idname = new_idname | ||||
| 
 | ||||
| 
 | ||||
| # prev_matrix = mathutils.Matrix() | ||||
| prev_matrix = None | ||||
| 
 | ||||
| # @call_once(bpy.app.handlers.frame_change_post) | ||||
| 
 | ||||
| ## used in properties file to register in boolprop update | ||||
| def cursor_follow_update(self, context): | ||||
|     '''append or remove cursor_follow handler according a boolean''' | ||||
|     global prev_matrix | ||||
| @ -155,6 +157,35 @@ def cursor_follow(scene): | ||||
|     # store for next use | ||||
|     prev_matrix = current_matrix.copy() | ||||
| 
 | ||||
| prev_active_obj = None | ||||
| 
 | ||||
| ## Add check for object selection change | ||||
| def selection_changed(): | ||||
|     """Callback function for selection changes""" | ||||
|     if not bpy.context.scene.gptoolprops.cursor_follow: | ||||
|         return | ||||
|     print('select_changed') | ||||
|     global prev_matrix, prev_active_obj | ||||
|     if prev_active_obj != bpy.context.object: | ||||
|         ## Set stored matrix to active object | ||||
|         prev_matrix = bpy.context.object.matrix_world | ||||
|         prev_active_obj = bpy.context.object | ||||
| 
 | ||||
| ## Note: Same owner as layer manager (will be removed as well) | ||||
| def subscribe_object_change(): | ||||
|     subscribe_to = (bpy.types.LayerObjects, 'active') | ||||
|     bpy.msgbus.subscribe_rna( | ||||
|         key=subscribe_to, | ||||
|         # owner of msgbus subcribe (for clearing later) | ||||
|         owner=bpy.types.GreasePencilv3, # <-- attach to ID during it's lifetime. | ||||
|         args=(), | ||||
|         notify=selection_changed, | ||||
|         options={'PERSISTENT'}, | ||||
|     ) | ||||
| 
 | ||||
| @persistent | ||||
| def subscribe_object_change_handler(dummy): | ||||
|     subscribe_object_change() | ||||
| 
 | ||||
| classes = ( | ||||
| GPTB_OT_cusor_snap, | ||||
| @ -163,14 +194,18 @@ GPTB_OT_cusor_snap, | ||||
| def register(): | ||||
|     for cls in classes: | ||||
|         bpy.utils.register_class(cls) | ||||
|      | ||||
|     # swap_keymap_by_id('view3d.cursor3d','view3d.cursor_snap')#auto swap to custom GP snap wrap | ||||
|      | ||||
|     # bpy.app.handlers.frame_change_post.append(cursor_follow) | ||||
|     ## Follow cursor matrix update on object change | ||||
|     # bpy.app.handlers.load_post.append(subscribe_object_change_handler) # select_change | ||||
|     # ## Directly set msgbus to work at first addon activation # select_change | ||||
|     # bpy.app.timers.register(subscribe_object_change, first_interval=1) # select_change | ||||
| 
 | ||||
|     ## No need to frame_change_post.append(cursor_follow). Added by property update, when activating 'cursor follow' | ||||
| 
 | ||||
| 
 | ||||
| def unregister(): | ||||
|     # bpy.app.handlers.frame_change_post.remove(cursor_follow) | ||||
|     # bpy.app.handlers.load_post.remove(subscribe_object_change_handler) # select_change | ||||
| 
 | ||||
|     # swap_keymap_by_id('view3d.cursor_snap','view3d.cursor3d')#Restore normal snap | ||||
| 
 | ||||
| @ -180,3 +215,5 @@ def unregister(): | ||||
|     # force remove handler if it's there at unregister | ||||
|     if cursor_follow.__name__ in [hand.__name__ for hand in bpy.app.handlers.frame_change_post]: | ||||
|             bpy.app.handlers.frame_change_post.remove(cursor_follow) | ||||
|      | ||||
|     bpy.msgbus.clear_by_owner(bpy.types.GreasePencilv3) | ||||
| @ -475,7 +475,7 @@ class GPTB_OT_toggle_hide_gp_modifier(Operator): | ||||
|         for o in pool: | ||||
|             if o.type != 'GREASEPENCIL': | ||||
|                 continue | ||||
|             for m in o.modifier: | ||||
|             for m in o.modifiers: | ||||
|                 # skip modifier that are not visible in render | ||||
|                 if not m.show_render: | ||||
|                     continue | ||||
|  | ||||
| @ -78,7 +78,7 @@ def layer_name_build(layer, prefix='', desc='', suffix=''): | ||||
|             # maybe a more elegant way exists to find all objects users ? | ||||
| 
 | ||||
|             # update Gpencil modifier targets | ||||
|             for mod in ob_user.modifier: | ||||
|             for mod in ob_user.modifiers: | ||||
|                 if not hasattr(mod, 'layer_filter'): | ||||
|                     continue | ||||
|                 if mod.layer_filter == old: | ||||
| @ -675,14 +675,28 @@ def obj_layer_name_callback(): | ||||
|     # print('inc:', res.group('inc')) | ||||
|     bpy.context.scene.gptoolprops['layer_name'] = res.group('name') | ||||
| 
 | ||||
| ## old gpv2 | ||||
| # def subscribe_layer_change(): | ||||
| #     subscribe_to = (bpy.types.GreasePencilLayers, "active_index") | ||||
| #     bpy.msgbus.subscribe_rna( | ||||
| #         key=subscribe_to, | ||||
| #         # owner of msgbus subcribe (for clearing later) | ||||
| #         # owner=handle, | ||||
| #         owner=bpy.types.GreasePencil, # <-- can attach to an ID during all it's lifetime... | ||||
| #         # Args passed to callback function (tuple) | ||||
| #         args=(), | ||||
| #         # Callback function for property update | ||||
| #         notify=obj_layer_name_callback, | ||||
| #         options={'PERSISTENT'}, | ||||
| #     ) | ||||
| 
 | ||||
| def subscribe_layer_change(): | ||||
|     subscribe_to = (bpy.types.GreasePencilLayers, "active_index") | ||||
|     subscribe_to = (bpy.types.GreasePencilv3Layers, "active") | ||||
|     bpy.msgbus.subscribe_rna( | ||||
|         key=subscribe_to, | ||||
|         # owner of msgbus subcribe (for clearing later) | ||||
|         # owner=handle, | ||||
|         owner=bpy.types.GreasePencil, # <-- can attach to an ID during all it's lifetime... | ||||
|         owner=bpy.types.GreasePencilv3, # <-- can attach to an ID during all it's lifetime... | ||||
|         # Args passed to callback function (tuple) | ||||
|         args=(), | ||||
|         # Callback function for property update | ||||
| @ -690,6 +704,7 @@ def subscribe_layer_change(): | ||||
|         options={'PERSISTENT'}, | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| @persistent | ||||
| def subscribe_layer_change_handler(dummy): | ||||
|     subscribe_layer_change() | ||||
| @ -723,7 +738,7 @@ class GPTB_PT_layer_name_ui(bpy.types.Panel): | ||||
|         row = layout.row() | ||||
|         row.activate_init = True | ||||
|         row.label(icon='OUTLINER_DATA_GP_LAYER') | ||||
|         row.prop(context.object.data.layers.active, 'info', text='') | ||||
|         row.prop(context.object.data.layers.active, 'name', text='') | ||||
| 
 | ||||
| def add_layer(context): | ||||
|     bpy.ops.gpencil.layer_add() | ||||
| @ -836,5 +851,6 @@ def unregister(): | ||||
|     for cls in reversed(classes): | ||||
|         bpy.utils.unregister_class(cls) | ||||
| 
 | ||||
|     # delete layer index trigger | ||||
|     bpy.msgbus.clear_by_owner(bpy.types.GreasePencil) | ||||
|     # Delete layer index trigger | ||||
|     # /!\ can remove msgbus made for other functions or other addons using same owner | ||||
|     bpy.msgbus.clear_by_owner(bpy.types.GreasePencilv3) | ||||
| @ -26,10 +26,10 @@ class GPT_OT_layer_nav(bpy.types.Operator): | ||||
|         prefs = utils.get_addon_prefs() | ||||
|         if not prefs.nav_use_fade: | ||||
|             if self.direction == 'DOWN': | ||||
|                 utils.iterate_selector(context.object.data.layers, 'active_index', -1, info_attr = 'info') | ||||
|                 utils.iterate_selector(context.object.data.layers, 'active_index', -1, info_attr = 'name') | ||||
| 
 | ||||
|             if self.direction == 'UP': | ||||
|                 utils.iterate_selector(context.object.data.layers, 'active_index', 1, info_attr = 'info') | ||||
|                 utils.iterate_selector(context.object.data.layers, 'active_index', 1, info_attr = 'name') | ||||
|             return {'FINISHED'} | ||||
|          | ||||
|         ## get up and down keys for use in modal | ||||
| @ -91,12 +91,12 @@ class GPT_OT_layer_nav(bpy.types.Operator): | ||||
|                 context.space_data.overlay.gpencil_fade_layer = fade | ||||
| 
 | ||||
|         if self.direction == 'DOWN' or ((event.type in self.down_keys) and event.value == 'PRESS'): | ||||
|             _val = utils.iterate_selector(context.object.data.layers, 'active_index', -1, info_attr = 'info') | ||||
|             _val = utils.iterate_selector(context.object.data.layers, 'active_index', -1, info_attr = 'name') | ||||
|             trigger = True | ||||
| 
 | ||||
|         if self.direction == 'UP' or ((event.type in self.up_keys) and event.value == 'PRESS'): | ||||
|             _val = utils.iterate_selector(context.object.data.layers, 'active_index', 1, info_attr = 'info') | ||||
|             # utils.iterate_selector(bpy.context.scene.grease_pencil.layers, 'active_index', 1, info_attr = 'info')#layers | ||||
|             _val = utils.iterate_selector(context.object.data.layers, 'active_index', 1, info_attr = 'name') | ||||
|             # utils.iterate_selector(bpy.context.scene.grease_pencil.layers, 'active_index', 1, info_attr = 'name')#layers | ||||
|             trigger = True | ||||
| 
 | ||||
|         if trigger: | ||||
|  | ||||
							
								
								
									
										4
									
								
								utils.py
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								utils.py
									
									
									
									
									
								
							| @ -1396,7 +1396,7 @@ def all_object_modifier_enabled(objects) -> bool: | ||||
|     for o in objects: | ||||
|         if o.type != 'GREASEPENCIL': | ||||
|             continue | ||||
|         for m in o.modifier: | ||||
|         for m in o.modifiers: | ||||
|             if m.show_render and not m.show_viewport: | ||||
|                 return False | ||||
| 
 | ||||
| @ -1500,7 +1500,7 @@ def gp_modifier_status(objects) -> tuple((str, str)): | ||||
|         ## Skip hided object | ||||
|         if o.hide_get() and o.hide_render: | ||||
|             continue | ||||
|         for m in o.modifier: | ||||
|         for m in o.modifiers: | ||||
|             if m.show_render and not m.show_viewport: | ||||
|                 off_count += 1 | ||||
|             else: | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user