Forráskód Böngészése

Add Join,Child nodes for Collection Declarations

Joseph Brandenburg 3 hónapja
szülő
commit
70d853ba61
4 módosított fájl, 99 hozzáadás és 1 törlés
  1. 2 0
      __init__.py
  2. 57 1
      misc_nodes.py
  3. 16 0
      misc_nodes_socket_templates.py
  4. 24 0
      misc_nodes_ui.py

+ 2 - 0
__init__.py

@@ -128,6 +128,8 @@ utility_category = [
         NodeItem("MathStaticFloat"),
         NodeItem("MathStaticVector"),
         NodeItem("UtilityCatStrings"),
+        NodeItem("UtilityCollectionJoin"),
+        NodeItem("UtilityCollectionHierarchy"),
         NodeItem("UtilityGeometryOfXForm"),
         NodeItem("UtilityNameOfXForm"),
         NodeItem("UtilityCombineThreeBool"),

+ 57 - 1
misc_nodes.py

@@ -19,6 +19,8 @@ def TellClasses():
              InputExistingGeometryObject,
              InputExistingGeometryData,
              UtilityDeclareCollections,
+             UtilityCollectionJoin,
+             UtilityCollectionHierarchy,
              UtilityGeometryOfXForm,
              UtilityNameOfXForm,
              UtilityPointFromCurve,
@@ -1283,7 +1285,6 @@ class UtilityDeclareCollections(MantisNode):
         from .utilities import get_node_prototype
         ui_node = get_node_prototype(self.ui_signature, self.base_tree)
         self.gen_outputs(ui_node)
-        print(self.outputs)
         self.init_parameters()
         self.fill_parameters(ui_node)
         self.node_type = "UTILITY"
@@ -1307,6 +1308,61 @@ class UtilityDeclareCollections(MantisNode):
         for out in ui_node.outputs:
             self.parameters[out.name] = out.default_value
 
+class UtilityCollectionJoin(MantisNode):
+    '''A node to help manage bone collections'''
+    def __init__(self, signature, base_tree):
+        super().__init__(signature, base_tree, CollectionJoinSockets)
+        self.init_parameters()
+        self.node_type = "UTILITY"
+        self.prepared, self.executed = False, False
+
+    def reset_execution(self):
+        super().reset_execution()
+        self.prepared, self.executed = False, False
+    
+    def bPrepare(self, bContext = None,):
+        if self.inputs['Collections'].links:
+            bCol_groups = []
+            for i, l in enumerate(self.inputs['Collections'].links):
+                bCol_group = self.evaluate_input("Collections", index=i)
+                if not isinstance(bCol_group, str):
+                    bCol_group = str(bCol_group)
+                    prOrange(f"Warning: coercing invalid input ({i}) to String in node: {self}")
+                bCol_groups.append(bCol_group)
+            bCols = '|'.join(bCol_groups)
+        else:
+            bCols = self.evaluate_input("Collections")
+            if not isinstance(bCols, str):
+                bCols = str(bCols)
+                prOrange(f"Warning: coercing invalid input to String in node: {self}")
+        self.parameters['Collection']=bCols
+        self.prepared, self.executed = True, True
+
+class UtilityCollectionHierarchy(MantisNode):
+    '''A node to help manage bone collections'''
+    def __init__(self, signature, base_tree):
+        super().__init__(signature, base_tree, CollectionHierarchySockets)
+        self.init_parameters()
+        self.node_type = "UTILITY"
+        self.prepared, self.executed = False, False
+
+    def reset_execution(self):
+        super().reset_execution()
+        self.prepared, self.executed = False, False
+
+    def bPrepare(self, bContext = None,):
+        parent_col = self.evaluate_input('Parent Collection')
+        if not isinstance(parent_col, str):
+            parent_col = str(parent_col)
+            prOrange(f"Warning: coercing invalid Parent Collection to String in node: {self}")
+        child_col = self.evaluate_input('Child Collection')
+        if not isinstance(child_col, str):
+            child_col = str(child_col)
+            prOrange(f"Warning: coercing invalid Child Collection to String in node: {self}")
+        result = parent_col +">"+child_col
+        self.parameters['Collection']=result
+        self.prepared, self.executed = True, True
+
 class UtilityGeometryOfXForm(MantisNode):
     '''A node representing existing object data'''
     def __init__(self, signature, base_tree):

+ 16 - 0
misc_nodes_socket_templates.py

@@ -101,3 +101,19 @@ NumberOfSplinesSockets=[
     NumberOfSplinesOut := SockTemplate(name="Number of Splines",
         bl_idname='UnsignedIntSocket', is_input=False),
 ]
+
+CollectionJoinSockets = [
+    JoinCollections := SockTemplate(name='Collections', is_input=True,
+        bl_idname="BoneCollectionSocket", display_shape='SQUARE_DOT',
+        use_multi_input=True,),
+    CollectionDeclarationOutput := SockTemplate(name='Collection',
+        bl_idname="BoneCollectionSocket", is_input=False,)
+]
+
+CollectionHierarchySockets = [
+    ParentCollection := SockTemplate(name='Parent Collection', is_input=True,
+        bl_idname="BoneCollectionSocket",),
+    ChildCollection := SockTemplate(name='Child Collection', is_input=True,
+        bl_idname="BoneCollectionSocket",),
+    CollectionDeclarationOutput,
+]

+ 24 - 0
misc_nodes_ui.py

@@ -22,6 +22,8 @@ def TellClasses():
              InputExistingGeometryObjectNode,
              InputExistingGeometryDataNode,
              UtilityDeclareCollections,
+             UtilityCollectionJoin,
+             UtilityCollectionHierarchy,
              UtilityGeometryOfXForm,
              UtilityNameOfXForm,
             #  ComposeMatrixNode,
@@ -805,6 +807,28 @@ class UtilityDeclareCollections(Node, MantisUINode):
         op_props.socket_invoked = '' # this isn't reset between invocations
         # so we have to make sure to unset it when running it from the node
 
+class UtilityCollectionJoin(Node, MantisUINode):
+    """A utility used to join bone collection declarations."""
+    bl_idname = "UtilityCollectionJoin"
+    bl_label  = "Join Collection Declarations"
+    bl_icon   = "NODE"
+    initialized : bpy.props.BoolProperty(default = False)
+    mantis_node_class_name=bl_idname
+    def init(self, context):
+        self.init_sockets(CollectionJoinSockets)
+        self.initialized = True
+
+class UtilityCollectionHierarchy(Node, MantisUINode):
+    """A utility used to declare bone collection hierarchies."""
+    bl_idname = "UtilityCollectionHierarchy"
+    bl_label  = "Collection Child Declaration"
+    bl_icon   = "NODE"
+    initialized : bpy.props.BoolProperty(default = False)
+    mantis_node_class_name=bl_idname
+    def init(self, context):
+        self.init_sockets(CollectionHierarchySockets)
+        self.initialized = True
+        
 class UtilityGeometryOfXForm(Node, MantisUINode):
     """Retrieves a mesh or curve datablock from an xForm."""
     bl_idname = "UtilityGeometryOfXForm"