from lnx.logicnode.lnx_advanced_draw import * from lnx.logicnode.lnx_nodes import * from bpy.props import * from bpy.types import Node class BlendSpaceNode(LnxLogicTreeNode): """Activates the output when the given event is received. @seeNode Send Event to Object @seeNode Send Event""" bl_idname = 'LNBlendSpaceNode' bl_label = 'Blend Space' lnx_version = 1 lnx_section = 'custom' property2: HaxeBoolProperty( 'property2', name="Enable or Disable", description="A bool property", default = False ) advanced_draw_run: BoolProperty( name = "Advance draw enabled", description="", default = False ) def stop_modal(self): self.property2 = False def my_float_update(self, context): if self.property2: self.set_x_y_socket() property0: HaxeFloatVectorProperty( 'property0', name = "Point Coordionates", description="", default = (0.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.5, 0.5), size = 22, update = my_float_update ) active_point_index: IntProperty( default = -1 ) show_numbers: BoolProperty( name = "Show Point Numbers", description="", default = False ) active_point_index_ref: IntProperty( default = 0 ) gui_bounds: FloatVectorProperty( name = "GUI bounds", description = "", default = (0.0, 0.0, 0.0), size = 3 ) point_size: FloatProperty( name = "Point Size", description = "", default = 0.015 ) property1: HaxeBoolVectorProperty( 'property1', name = "Point enabled for view", description = "", default = (True,True,True,True, False, False, False, False, False, False, True), size = 11 ) draw_handler_dict = {} modal_handler_dict = {} def __init__(self): array_nodes[str(id(self))] = self if self.advanced_draw_run: self.add_advanced_draw() def create_blend_space(self): self.blend_space = BlendSpaceGUI(self) def free(self): self.remove_advanced_draw() def get_blend_space_points(self): if bpy.context.space_data.edit_tree == self.get_tree(): return self.blend_space.points def draw_advanced(self): if bpy.context.space_data.edit_tree == self.get_tree(): self.blend_space.draw() def lnx_init(self, context): self.add_input('LnxNodeSocketObject', 'Object') self.add_input('LnxNodeSocketArray', 'Actions') self.add_input('ArmBlendSpaceSocket', 'Cursor X') self.add_input('ArmBlendSpaceSocket', 'Cursor Y') self.add_output('LnxNodeSocketAnimTree', 'Out') def add_advanced_draw(self): self.advanced_draw_run = True handler = self.draw_handler_dict.get(str(self.as_pointer())) if handler is None: self.create_blend_space() editor = getattr(bpy.types, 'SpaceNodeEditor') handler = editor.draw_handler_add(self.draw_advanced, (), 'WINDOW', 'POST_VIEW') self.draw_handler_dict[str(self.as_pointer())] = handler self.property2 = False def remove_advanced_draw(self): self.advanced_draw_run = False handler = self.draw_handler_dict.get(str(self.as_pointer())) if handler is not None: editor = getattr(bpy.types, 'SpaceNodeEditor') editor.draw_handler_remove(handler, 'WINDOW') self.draw_handler_dict.pop(str(self.as_pointer())) def set_x_y_cursor(self): self.property0[20] = self.inputs[2].get_default_value() self.property0[21] = self.inputs[3].get_default_value() def set_x_y_socket(self): self.inputs[2].set_default_value(self.property0[20]) self.inputs[3].set_default_value(self.property0[21]) def add_point(self): for i in range(len(self.property1)): if not self.property1[i]: self.property1[i] = True self.property0[i * 2] = 0.5 self.property0[i * 2 + 1] = 0.5 break def remove_point(self): for i in range(len(self.property1) - 2, 2, -1): if self.property1[i]: self.property1[i] = False self.active_point_index_ref = i - 1 break def draw_buttons(self, context, layout): row = layout.row(align=True) row.alignment = 'EXPAND' op = row.operator('lnx.node_call_func', text='Show', icon='FULLSCREEN_ENTER', emboss=True, depress = self.advanced_draw_run) op.node_index = str(id(self)) op.callback_name = 'add_advanced_draw' op = row.operator('lnx.node_call_func', text='Hide', icon='FULLSCREEN_EXIT', emboss=True, depress = not self.advanced_draw_run) op.node_index = str(id(self)) op.callback_name = 'remove_advanced_draw' if self.advanced_draw_run: col = layout.column() row = col.row(align=True) op = row.operator('lnx.blend_space_operator', text = 'Edit', icon = 'EDITMODE_HLT', emboss = True, depress = self.property2) op.node_index = str(id(self)) op = row.operator('lnx.node_call_func', text = 'Exit Edit', icon = 'OBJECT_DATAMODE', emboss = True, depress = not self.property2) op.node_index = str(id(self)) op.callback_name = 'stop_modal' layout.prop(self, 'show_numbers') if self.property2: col = layout.column() row = col.row(align=True) op = row.operator('lnx.node_call_func', text = 'Add Point', icon = 'PLUS', emboss = True) op.node_index = str(id(self)) op.callback_name = 'add_point' op = row.operator('lnx.node_call_func', text = 'Remove Point', icon = 'X', emboss = True) op.node_index = str(id(self)) op.callback_name = 'remove_point' cl =layout.column() actie_point = self.active_point_index_ref pos = ", Pos = " + str(round(self.property0[actie_point * 2], 2)) + ", " + str(round(self.property0[actie_point * 2 + 1], 2)) if actie_point > 9: cl.label(text = "Selected: Cursor" + pos) else: cl.label(text = "Selected: " + str(self.active_point_index_ref + 1) + pos) else: self.set_x_y_cursor()