Esempio n. 1
0
 def _is_influence(self, obj):
     """
     Supported influences are joints and nurbsSurface.
     :return:
     """
     return libPymel.isinstance_of_transform(obj, pymel.nodetypes.Joint) or \
            libPymel.isinstance_of_shape(obj, pymel.nodetypes.NurbsSurface)
Esempio n. 2
0
 def _is_influence(self, obj):
     """
     Supported influences are joints and nurbsSurface.
     :return:
     """
     return libPymel.isinstance_of_transform(obj, pymel.nodetypes.Joint) or \
            libPymel.isinstance_of_shape(obj, pymel.nodetypes.NurbsSurface)
Esempio n. 3
0
    def build(self, stretch=True, squash=False, *args, **kwargs):
        # TODO: Use self.chain_jnt
        self._joints = [input for input in self.input if libPymel.isinstance_of_transform(input, pymel.nodetypes.Joint)]
        self._curves = [input for input in self.input if libPymel.isinstance_of_shape(input, pymel.nodetypes.CurveShape)]

        if len(self._joints) < 2:
            raise Exception("Can't build SplineIK. Expected at least two joints, got {0}".format(self._joints))
        if len(self._curves) < 1:
            raise Exception("Can't build SplineIK. Expected at least one nurbsCurve, got {0}".format(self._curves))

        super(SplineIK, self).build(*args, **kwargs)

        nomenclature_rig = self.get_nomenclature_rig()

        # todo: handle multiple curves?
        curve = next(iter(self._curves), None)
        curve_shape = next((shape for shape in curve.getShapes() if isinstance(shape, pymel.nodetypes.NurbsCurve)), None)

        # Create ik solver
        handle_name = nomenclature_rig.resolve('ikHandle')
        eff_name = nomenclature_rig.resolve('ikEffector')
        self.ikHandle, self.ikEffector = pymel.ikHandle(
            solver="ikSplineSolver",
            curve=curve,
            startJoint=self._joints[0],
            endEffector=self._joints[-1],
            createCurve=False,
            name=handle_name,
            parentCurve=False,
            snapCurve=False)
        self.ikHandle.setParent(self.grp_rig)
        self.ikEffector.rename(eff_name)

        # Create stretch
        # Todo: use shape instead of transform as curve input?
        if stretch:
            stretch_attr = libRigging.create_strech_attr_from_curve(curve_shape)
            for jnt in self._joints:
                pymel.connectAttr(stretch_attr, jnt.sx, force=True)

            # Create squash
            if squash:
                num_joints = len(self._joints)
                squash_attrs = libRigging.create_squash_atts(stretch_attr, num_joints)
                # Todo: Find correct axis orient
                for jnt, squash in zip(self._joints, squash_attrs):
                    pymel.connectAttr(squash, jnt.sy, force=True)
                    pymel.connectAttr(squash, jnt.sz, force=True)
Esempio n. 4
0
 def jnts(self):
     fn_is_jnt = lambda obj: libPymel.isinstance_of_transform(
         obj, pymel.nodetypes.Joint)
     jnts = filter(fn_is_jnt, self.input)
     jnts = sorted(jnts)
     return jnts
Esempio n. 5
0
    def build(self, stretch=True, squash=False, *args, **kwargs):
        # TODO: Use self.chain_jnt
        self._joints = [
            input for input in self.input
            if libPymel.isinstance_of_transform(input, pymel.nodetypes.Joint)
        ]
        self._curves = [
            input for input in self.input
            if libPymel.isinstance_of_shape(input, pymel.nodetypes.CurveShape)
        ]

        if len(self._joints) < 2:
            raise Exception(
                "Can't build SplineIK. Expected at least two joints, got {0}".
                format(self._joints))
        if len(self._curves) < 1:
            raise Exception(
                "Can't build SplineIK. Expected at least one nurbsCurve, got {0}"
                .format(self._curves))

        super(SplineIK, self).build(*args, **kwargs)

        nomenclature_rig = self.get_nomenclature_rig()

        # todo: handle multiple curves?
        curve = next(iter(self._curves), None)
        curve_shape = next((shape for shape in curve.getShapes()
                            if isinstance(shape, pymel.nodetypes.NurbsCurve)),
                           None)

        # Create ik solver
        handle_name = nomenclature_rig.resolve('ikHandle')
        eff_name = nomenclature_rig.resolve('ikEffector')
        self.ikHandle, self.ikEffector = pymel.ikHandle(
            solver="ikSplineSolver",
            curve=curve,
            startJoint=self._joints[0],
            endEffector=self._joints[-1],
            createCurve=False,
            name=handle_name,
            parentCurve=False,
            snapCurve=False)
        self.ikHandle.setParent(self.grp_rig)
        self.ikEffector.rename(eff_name)

        # Create stretch
        # Todo: use shape instead of transform as curve input?
        if stretch:
            stretch_attr = libRigging.create_strech_attr_from_curve(
                curve_shape)
            for jnt in self._joints:
                pymel.connectAttr(stretch_attr, jnt.sx, force=True)

            # Create squash
            if squash:
                num_joints = len(self._joints)
                squash_attrs = libRigging.create_squash_atts(
                    stretch_attr, num_joints)
                # Todo: Find correct axis orient
                for jnt, squash in zip(self._joints, squash_attrs):
                    pymel.connectAttr(squash, jnt.sy, force=True)
                    pymel.connectAttr(squash, jnt.sz, force=True)
Esempio n. 6
0
 def _post_setattr_inputs(self):
     super(SplineIK, self)._post_setattr_inputs()
     self._joints = [input for input in self.input if libPymel.isinstance_of_transform(input, pymel.nodetypes.Joint)]
     self._curves = [input for input in self.input if libPymel.isinstance_of_shape(input, pymel.nodetypes.CurveShape)]
Esempio n. 7
0
 def jnts(self):
     """
     :return: A list of all inputs of type pymel.nodetypes.Joint.
     """
     jnts = [obj for obj in self.input if libPymel.isinstance_of_transform(obj, pymel.nodetypes.Joint)]
     return jnts
Esempio n. 8
0
 def jnts(self):
     fn_is_jnt = lambda obj: libPymel.isinstance_of_transform(obj, pymel.nodetypes.Joint)
     jnts = filter(fn_is_jnt, self.input)
     return jnts
Esempio n. 9
0
 def jnts(self):
     fn_is_nurbsSurface = lambda obj: libPymel.isinstance_of_transform(obj, pymel.nodetypes.Joint)
     return filter(fn_is_nurbsSurface, self.input)
Esempio n. 10
0
 def jnts(self):
     fn_is_nurbsSurface = lambda obj: libPymel.isinstance_of_transform(
         obj, pymel.nodetypes.Joint)
     return filter(fn_is_nurbsSurface, self.input)