| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 | import bpyfrom .base_definitions import SchemaNodefrom bpy.types import Nodefrom .utilities import (prRed, prGreen, prPurple, prWhite,                              prOrange,                              wrapRed, wrapGreen, wrapPurple, wrapWhite,                              wrapOrange,)from bpy.props import BoolPropertyfrom .utilities import get_socket_maps, relink_socket_map, do_relinkdef TellClasses():    return [        # tree i/o        SchemaIndex,        SchemaArrayInput,        SchemaArrayInputGet,        SchemaArrayOutput,        SchemaConstInput,        SchemaConstOutput,        SchemaOutgoingConnection,        SchemaIncomingConnection,        # # iterators        # SchemaIntMath,        # SchemaDeclarationValidWhen,        ]# IMPORTANT TODO:# - check what happens when these get plugged into each other# - probably disallow all or most of these connections in insert_link or updateclass SchemaIndex(Node, SchemaNode):    '''The current index of the schema execution'''    bl_idname = 'SchemaIndex'    bl_label = "Index"    bl_icon = 'GIZMO'    initialized : bpy.props.BoolProperty(default = False)        def init(self, context):        self.outputs.new("IntSocket", "Index")        self.outputs.new("IntSocket", "Schema Length")        self.initialized = Trueclass SchemaArrayInput(Node, SchemaNode):    '''Array Inputs'''    bl_idname = 'SchemaArrayInput'    bl_label = "Array Input"    bl_icon = 'GIZMO'    initialized : bpy.props.BoolProperty(default = False)    def init(self, context):        self.update()    def update(self):        # self.initialized = False        output_map = get_socket_maps(self)[1]        self.outputs.clear()        for item in self.id_data.interface.items_tree:            if item.item_type == 'PANEL': continue            if item.parent and item.in_out == 'INPUT' and item.parent.name == 'Array':                relink_socket_map(self, self.outputs, output_map, item, in_out='OUTPUT')        if '__extend__' in output_map.keys() and output_map['__extend__']:            do_relink(self, None, output_map, in_out='OUTPUT', parent_name='Array' )        if len(self.inputs)<1 or self.inputs[-1].bl_idname not in ["WildcardSocket"]:            self.outputs.new('WildcardSocket', '', identifier='__extend__')        # self.initialized = Trueclass SchemaArrayInputGet(Node, SchemaNode):    '''Array Inputs'''    bl_idname = 'SchemaArrayInputGet'    bl_label = "Array Input at Index"    bl_icon = 'GIZMO'    initialized : bpy.props.BoolProperty(default = False)    def init(self, context):        self.inputs.new('EnumArrayGetOptions', 'OoB Behaviour')        self.inputs.new("IntSocket", "Index")        self.update()    def update(self):        # self.initialized = False        output_map = get_socket_maps(self)[1]        self.outputs.clear()        for item in self.id_data.interface.items_tree:            if item.item_type == 'PANEL': continue            if item.parent and item.in_out == 'INPUT' and item.parent.name == 'Array':                relink_socket_map(self, self.outputs, output_map, item, in_out='OUTPUT')        if '__extend__' in output_map.keys() and output_map['__extend__']:            do_relink(self, None, output_map, in_out='OUTPUT', parent_name='Array' )        if len(self.inputs)<1 or self.inputs[-1].bl_idname not in ["WildcardSocket"]:            self.outputs.new('WildcardSocket', '', identifier='__extend__')        # self.initialized = Trueclass SchemaArrayOutput(Node, SchemaNode):    '''Array Inputs'''    bl_idname = 'SchemaArrayOutput'    bl_label = "Array Output"    bl_icon = 'GIZMO'    initialized : bpy.props.BoolProperty(default = False)    def init(self, context):        self.update()    def update(self):        self.initialized = False        input_map = get_socket_maps(self)[0]        self.inputs.clear()        for item in self.id_data.interface.items_tree:            if item.item_type == 'PANEL': continue            if item.parent and item.in_out == 'OUTPUT' and item.parent.name == 'Array':                relink_socket_map(self, self.inputs, input_map, item, in_out='INPUT')        if '__extend__' in input_map.keys() and input_map['__extend__']:            do_relink(self, None, input_map, in_out='INPUT', parent_name='Array' )        if len(self.inputs)<1 or self.inputs[-1].bl_idname not in ["WildcardSocket"]:            self.inputs.new('WildcardSocket', '', identifier='__extend__')        for s in self.outputs:            s.input= True        self.initialized = Trueclass SchemaConstInput(Node, SchemaNode):    '''Constant Inputs'''    bl_idname = 'SchemaConstInput'    bl_label = "Constant Input"    bl_icon = 'GIZMO'    initialized : bpy.props.BoolProperty(default = False)        def init(self, context):        self.update()    def update(self):        self.initialized = False        output_map = get_socket_maps(self)[1]        self.outputs.clear()        for item in self.id_data.interface.items_tree:            if item.item_type == 'PANEL': continue            if item.parent and item.in_out == 'INPUT' and item.parent.name == 'Constant':                relink_socket_map(self, self.outputs, output_map, item, in_out='OUTPUT')        if '__extend__' in output_map.keys() and output_map['__extend__']:            do_relink(self, None, output_map, in_out='OUTPUT', parent_name='Constant' )        if len(self.inputs)<1 or self.inputs[-1].bl_idname not in ["WildcardSocket"]:            self.outputs.new('WildcardSocket', '', identifier='__extend__')        self.initialized = Trueclass SchemaConstOutput(Node, SchemaNode):    '''Constant Outputs'''    bl_idname = 'SchemaConstOutput'    bl_label = "Constant Output"    bl_icon = 'GIZMO'    initialized : bpy.props.BoolProperty(default = False)        def init(self, context):        self.update()    def update(self):        self.initialized = False        input_map = get_socket_maps(self)[0]        self.inputs.clear()        s = self.inputs.new('IntSocket', "Expose when N==")        for item in self.id_data.interface.items_tree:            if item.item_type == 'PANEL': continue            if item.parent and item.in_out == 'OUTPUT' and item.parent.name == 'Constant':                relink_socket_map(self, self.inputs, input_map, item, in_out='INPUT')        if '__extend__' in input_map.keys() and input_map['__extend__']:            do_relink(self, None, input_map, in_out='INPUT', parent_name='Constant' )        if len(self.inputs)<1 or self.inputs[-1].bl_idname not in ["WildcardSocket"]:            self.inputs.new('WildcardSocket', '', identifier='__extend__')        do_relink(self, s, input_map, in_out='INPUT')        for s in self.outputs:            s.input= True                self.initialized = Trueclass SchemaOutgoingConnection(Node, SchemaNode):    '''Outgoing Connections'''    bl_idname = 'SchemaOutgoingConnection'    bl_label = "Outgoing Connection"    bl_icon = 'GIZMO'    initialized : bpy.props.BoolProperty(default = False)        def init(self, context):        # self.inputs.new('IntSocket', 'Valid From')        # self.inputs.new('IntSocket', 'Valid Until')        self.update()    def update(self):        self.initialized = False        input_map = get_socket_maps(self)[0]        self.inputs.clear()        for item in self.id_data.interface.items_tree:            if item.item_type == 'PANEL': continue            if item.parent and item.in_out == 'OUTPUT' and item.parent.name == 'Connection':                relink_socket_map(self, self.inputs, input_map, item, in_out='INPUT')        if '__extend__' in input_map.keys() and input_map['__extend__']:            do_relink(self, None, input_map, in_out='INPUT', parent_name='Connection' )        if len(self.inputs)<1 or self.inputs[-1].bl_idname not in ["WildcardSocket"]:            self.inputs.new('WildcardSocket', '', identifier='__extend__')        for s in self.outputs:            s.input= True        self.initialized = Trueclass SchemaIncomingConnection(Node, SchemaNode):    '''Incoming Connections'''    bl_idname = 'SchemaIncomingConnection'    bl_label = "Incoming Connection"    bl_icon = 'GIZMO'    initialized : bpy.props.BoolProperty(default = False)    def init(self, context):        self.update()    def update(self):        self.initialized = False        output_map = get_socket_maps(self)[1]        self.outputs.clear()        for item in self.id_data.interface.items_tree:            if item.item_type == 'PANEL': continue            if item.parent and item.in_out == 'INPUT' and item.parent.name == 'Connection':                relink_socket_map(self, self.outputs, output_map, item, in_out='OUTPUT')        if '__extend__' in output_map.keys() and output_map['__extend__']:            do_relink(self, None, output_map, in_out='OUTPUT', parent_name='Connection' )        if len(self.inputs)<1 or self.inputs[-1].bl_idname not in ["WildcardSocket"]:            self.outputs.new('WildcardSocket', '', identifier='__extend__')        self.initialized = True# have a string for name# assign/get# and a fallback if none# get should take an integer: 0 = index, -1 = index -1, etc., no positive ints allowed# class SchemaLocalVariable(Node, SchemaNode):#     '''Constant Inputs'''#     bl_idname = 'SchemaIncomingConnection'#     bl_label = "Incoming Connection"#     bl_icon = 'GIZMO'    #     def init(self, context):#         # self.outputs.new("IntSocket", "Index")#         pass# class SchemaIntMath(Node, SchemaNode):#     '''Int Math'''#     bl_idname = 'SchemaIntMath'#     bl_label = "Int Math"#     bl_icon = 'GIZMO'    #     # def init(self, context):#     #     self.update()# class SchemaDeclarationValidWhen(Node, SchemaNode):#     '''Declaration Valid When'''#     bl_idname = 'SchemaDeclarationValidWhen'#     bl_label = "Declaration Valid When"#     bl_icon = 'GIZMO'    #     def init(self, context):#         self.inputs.new('IntSocket', 'Valid From')#         self.inputs.new('IntSocket', 'Valid Until')#         self.inputs.new('IntSocket', 'Add to N') # +#         self.inputs.new('IntSocket', 'Multiply N') # *#         self.inputs.new('IntSocket', 'Modulo of N') # %#         # self.inputs.new('IntSocket', 'n')# I need to figure out what to do with this right here...# There are a few options:#  - an actual control flow (if, then) -- but I don' like that because it's not declarative#  - "declaration valid when" statement that is basically a range with simple math rules#      - this is funcionally almost entirely the same#      - perhaps this sort of range plugs into the end of the schema?#      - but I want it to operate kind of like a frame or simulation zone#  - Begin / End declaration makes it more like a framed region#      - hypothetically I don't need to have any begin and I can just imply it#      - I don't wanna have to develop a bunch of code for dealing with new links that are only there for the sake of schema#  - then I ran into the problem that the in/out connections are relevant to a specific declaration#  - what I need is a way to modify the declaration in the loop, not a way to construct a bunch of different iterators....#  - so maybe I can get away with basic maths only# so I need a way to control a declaration by the index#   - a switch node, maybe one with an arbitrary socket type like wildcard that just adapts#   - it should be possible to do math with the index and len(schema)#       - example, for naming a bone 'Center' if index == len(schema)//2#            - the "if" is what annoys me about this#       - making numbers and chiral identifiers for names#       - array gets#   - # class SchemaChoose(Node, SchemaNode):#     '''Choose'''#     bl_idname = 'SchemaChoose'#     bl_label = "Choose"#     bl_icon = 'GIZMO'#     initialized : bpy.props.BoolProperty(default = False)    #     def init(self, context):#         self.inputs.new('IntSocket', 'Number of Choices')#         self.inputs.new('IntSocket', 'Choose Index')#         self.outputs.new('WildcardSocket', 'Choice')#         self.update()#     def update(self):#         self.initialized = False#         input_map = get_socket_maps(self)[0]#         # print (input_map)#         self.inputs.clear()#         self.inputs.new('IntSocket', 'Number of Choices')#         self.inputs.new('IntSocket', 'Choose Index')#         ##         # update on this one requires being able to read the tree!#             # self.inputs.new("WildcardSocket", "")#         self.initialized = True
 |