| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395 | import bpyfrom bpy.types import NodeTree, Node, NodeSocketfrom .base_definitions import LinkNode, GraphErrorfrom .utilities import (prRed, prGreen, prPurple, prWhite,                              prOrange,                              wrapRed, wrapGreen, wrapPurple, wrapWhite,                              wrapOrange,)from .base_definitions import get_signature_from_edited_treefrom .link_socket_templates import *def TellClasses():    return [ LinkInheritNode,             LinkInverseKinematics,             LinkCopyLocationNode,             LinkCopyRotationNode,             LinkCopyScaleNode,             LinkInheritConstraintNode,             LinkCopyTransformNode,             LinkStretchToNode,             LinkDampedTrackNode,             LinkLockedTrackNode,             LinkTrackToNode,             LinkLimitLocationNode,             LinkLimitScaleNode,             LinkLimitRotationNode,             LinkLimitDistanceNode,             LinkDrivenParameterNode,             LinkArmatureNode,             LinkSplineIKNode,             LinkTransformationNode,           ]from mathutils import Color # these colors were sampled from Blender's UI# TODO: maybe read the relevant colors from the ThemelinkColor = Color((0.028034, 0.093164, 0.070379)).from_scene_linear_to_srgb()inheritColor = Color((0.083213, 0.131242, 0.116497)).from_scene_linear_to_srgb()trackingColor = Color((0.033114, 0.049013, 0.131248)).from_scene_linear_to_srgb()ikColor = Color((0.131117, 0.131248, 0.006971)).from_scene_linear_to_srgb()driverColor = Color((0.043782, 0.014745, 0.131248,)).from_scene_linear_to_srgb()class LinkInheritNode(Node, LinkNode):    '''A node representing inheritance'''    # cuss, messed this up    bl_idname = 'linkInherit' # l should be L    # need to fix this    bl_label = "Inherit"    bl_icon = 'CONSTRAINT_BONE'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name="LinkInherit"        def init(self, context):        self.init_sockets(LinkInheritSockets)        self.initialized = True        self.use_custom_color = True        self.color = inheritColor        def display_update(self, parsed_tree, context):        node_tree = context.space_data.path[0].node_tree        nc = parsed_tree.get(get_signature_from_edited_tree(self, context))        if nc:            bone_prev, bone_next = False, False            if (inp := nc.inputs["Parent"]).is_connected:                if  from_node := inp.links[0].from_node:                    if from_node.__class__.__name__ in ["xFormBone"]:                        bone_prev=True            bone_next=True            try:                xForm = nc.GetxForm()                if xForm.__class__.__name__ not in "xFormBone":                                        bone_next=False            except GraphError:                bone_next=False            # print(bone_prev, bone_next )            if bone_next and bone_prev:                self.inputs["Inherit Rotation"].hide = False                self.inputs["Inherit Scale"].hide    = False                self.inputs["Connected"].hide       = False            else:                self.inputs["Inherit Rotation"].hide = True or self.inputs["Inherit Rotation"].is_connected                self.inputs["Inherit Scale"].hide    = True or self.inputs["Inherit Scale"].is_connected                self.inputs["Connected"].hide        = True or self.inputs["Connected"].is_connected            # the node_groups on the way here ought to be active if there            #  is no funny business going on.    # DO: make another node for ITASC IK, eh?class LinkInverseKinematics(Node, LinkNode):    '''A node representing inverse kinematics'''    bl_idname = 'LinkInverseKinematics'    bl_label = "Inverse Kinematics"    bl_icon = 'CON_KINEMATIC'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname    def init(self, context):        self.init_sockets(LinkInverseKinematicsSockets)        self.initialized = True        self.use_custom_color = True        self.color = ikColorclass LinkCopyLocationNode(Node, LinkNode):    '''A node representing Copy Location'''    bl_idname = 'LinkCopyLocation'    bl_label = "Copy Location"    bl_icon = 'CON_LOCLIKE'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname    def init(self, context):        self.init_sockets(LinkCopyLocationSockets)        self.use_custom_color = True        self.color = linkColor        self.initialized = True        class LinkCopyRotationNode(Node, LinkNode):    '''A node representing Copy Rotation'''    bl_idname = 'LinkCopyRotation'    bl_label = "Copy Rotation"    bl_icon = 'CON_ROTLIKE'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname    def init(self, context):        self.init_sockets(LinkCopyRotationSockets)        self.use_custom_color = True        self.color = linkColor        self.initialized = True        class LinkCopyScaleNode(Node, LinkNode):    '''A node representing Copy Scale'''    bl_idname = 'LinkCopyScale'    bl_label = "Copy Scale"    bl_icon = 'CON_SIZELIKE'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname    def init(self, context):        self.init_sockets(LinkCopyScaleSockets)        self.use_custom_color = True        self.color = linkColor        self.initialized = True        class LinkInheritConstraintNode(Node, LinkNode):    # === Basics ===    # Description string    '''A node representing a parent constraint'''    bl_idname = 'LinkInheritConstraint'    bl_label = "Inherit (constraint)"    bl_icon = 'CON_CHILDOF'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname    # === Optional Functions ===    def init(self, context):        self.init_sockets(LinkInheritConstraintSockets)        self.use_custom_color = True        self.color = inheritColor        self.initialized = Trueclass LinkCopyTransformNode(Node, LinkNode):    # === Basics ===    # Description string    '''A node representing Copy Transform'''    bl_idname = 'LinkCopyTransforms'    bl_label = "Copy Transform"    bl_icon = 'CON_TRANSLIKE'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname    # === Optional Functions ===    def init(self, context):        self.init_sockets(LinkCopyTransformsSockets)        self.use_custom_color = True        self.color = linkColor        self.initialized = True        class LinkStretchToNode(Node, LinkNode):    '''A node representing Stretch-To'''    bl_idname = 'LinkStretchTo'    bl_label = "Stretch To"    bl_icon = 'CON_STRETCHTO'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname    def init(self, context):        self.init_sockets(LinkStretchToSockets)        self.initialized = True        self.use_custom_color = True        self.color = trackingColorclass LinkDampedTrackNode(Node, LinkNode):    '''A node representing Stretch-To'''    bl_idname = 'LinkDampedTrack'    bl_label = "Damped Track"    bl_icon = 'CON_TRACKTO'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname    def init(self, context):        self.init_sockets(LinkDampedTrackSockets)        self.initialized = True        self.use_custom_color = True        self.color = trackingColor        class LinkLockedTrackNode(Node, LinkNode):    '''A node representing Stretch-To'''    bl_idname = 'LinkLockedTrack'    bl_label = "Locked Track"    bl_icon = 'CON_LOCKTRACK'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname    def init(self, context):        self.init_sockets(LinkLockedTrackSockets)        self.initialized = True        self.use_custom_color = True        self.color = trackingColor        class LinkTrackToNode(Node, LinkNode):    '''A node representing Stretch-To'''    bl_idname = 'LinkTrackTo'    bl_label = "Track To"    bl_icon = 'CON_TRACKTO'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname    def init(self, context):        self.init_sockets(LinkTrackToSockets)        self.initialized = True        self.use_custom_color = True        self.color = trackingColorclass LinkLimitLocationNode(Node, LinkNode):    '''A node representing Limit Location'''    bl_idname = 'LinkLimitLocation'    bl_label = "Limit Location"    bl_icon = 'CON_LOCLIMIT'    mantis_node_class_name=bl_idname    initialized : bpy.props.BoolProperty(default = False)    def init(self, context):        self.init_sockets(LinkLimitLocationScaleSockets)        self.initialized = True        self.use_custom_color = True        self.color = linkColorclass LinkLimitScaleNode(Node, LinkNode):    '''A node representing Limit Scale'''    bl_idname = 'LinkLimitScale'    bl_label = "Limit Scale"    bl_icon = 'CON_SIZELIMIT'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname    def init(self, context):        self.init_sockets(LinkLimitLocationScaleSockets)        self.initialized = True        self.use_custom_color = True        self.color = linkColor class LinkLimitRotationNode(Node, LinkNode):    '''A node representing Limit Rotation'''    bl_idname = 'LinkLimitRotation'    bl_label = "Limit Rotation"    bl_icon = 'CON_ROTLIMIT'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname    def init(self, context):        self.init_sockets(LinkLimitRotationSockets)        self.initialized = True        # color        self.use_custom_color = True        self.color = linkColorclass LinkLimitDistanceNode(Node, LinkNode):    '''A node representing Limit Distance'''    bl_idname = 'LinkLimitDistance'    bl_label = "Limit Distance"    bl_icon = 'CON_DISTLIMIT'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname    def init(self, context):        self.init_sockets(LinkLimitDistanceSockets)        self.use_custom_color = True        self.color = linkColor        self.initialized = Trueclass LinkTransformationNode(Node, LinkNode):    '''A node representing Transformation (Constraint)'''    bl_idname = 'LinkTransformation'    bl_label = "Transformation"    bl_icon = 'CON_TRANSFORM'    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname    def init(self, context):        self.init_sockets(LinkTransformationSockets)        self.use_custom_color = True        self.color = linkColor        self.initialized = True    def display_update(self, parsed_tree, context):        node_tree = context.space_data.path[0].node_tree        nc = parsed_tree.get(get_signature_from_edited_tree(self, context))        if nc:            if nc.evaluate_input("Map From") == "ROTATION":                self.inputs["Rotation Mode"].hide=False            else:                self.inputs["Rotation Mode"].hide=True            if   nc.evaluate_input("Map To") == "TRANSLATION":                    self.inputs["Rotation Order"].hide=True                    self.inputs["Mix Mode (Translation)"].hide=False                    self.inputs["Mix Mode (Rotation)"].hide=True                    self.inputs["Mix Mode (Scale)"].hide=True            elif nc.evaluate_input("Map To") == "ROTATION":                    self.inputs["Rotation Order"].hide=False                    self.inputs["Mix Mode (Translation)"].hide=True                    self.inputs["Mix Mode (Rotation)"].hide=False                    self.inputs["Mix Mode (Scale)"].hide=True            elif nc.evaluate_input("Map To") == "SCALE":                    self.inputs["Rotation Order"].hide=True                    self.inputs["Mix Mode (Translation)"].hide=True                    self.inputs["Mix Mode (Rotation)"].hide=True                    self.inputs["Mix Mode (Scale)"].hide=Falseclass LinkArmatureNode(Node, LinkNode):    """A node representing Blender's Armature Constraint"""    bl_idname = "LinkArmature"    bl_label = "Armature (Constraint)"    bl_icon = "CON_ARMATURE"    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname        def init(self, context):        self.init_sockets(LinkArmatureSockets)        self.use_custom_color = True        self.color = inheritColor        self.initialized = True        def draw_buttons(self, context, layout):        # return        layout.operator( 'mantis.link_armature_node_add_target' )        if (len(self.inputs) > 6):            layout.operator( 'mantis.link_armature_node_remove_target' )        else:            layout.label(text="")class LinkSplineIKNode(Node, LinkNode):    """"A node representing Spline IK"""    bl_idname = "LinkSplineIK"    bl_label = "Spline IK"    bl_icon = "CON_SPLINEIK"    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname        def init(self, context):        self.init_sockets(LinkSplineIKSockets)        self.use_custom_color = True        self.color = ikColor        self.initialized = True        # DRIVERS!!class LinkDrivenParameterNode(Node, LinkNode):    """Represents a driven parameter in the downstream xForm node."""    bl_idname = "LinkDrivenParameter"    bl_label = "Driven Parameter"    bl_icon = "CONSTRAINT_BONE"    initialized : bpy.props.BoolProperty(default = False)    mantis_node_class_name=bl_idname        def init(self, context):        self.init_sockets(LinkDrivenParameterSockets)        self.use_custom_color = True        self.color = linkColor        self.initialized = True# Set up the class property that ties the UI classes to the Mantis classes.for cls in TellClasses():    cls.set_mantis_class()
 |