- Main Page
- Related Pages
- Modules
- Classes
- Examples

# blindDoubleDataCmd.py

    #-
    # ==========================================================================
    # Copyright (C) 1995 - 2006 Autodesk, Inc. and/or its licensors.  All
    # rights reserved.
    #
    # The coded instructions, statements, computer programs, and/or related
    # material (collectively the "Data") in these files contain unpublished
    # information proprietary to Autodesk, Inc. ("Autodesk") and/or its
    # licensors, which is protected by U.S. and Canadian federal copyright
    # law and by international treaties.
    #
    # The Data is provided for use exclusively by You. You have the right
    # to use, modify, and incorporate this Data into other products for
    # purposes authorized by the Autodesk software license agreement,
    # without fee.
    #
    # The copyright notices in the Software and this entire statement,
    # including the above license grant, this restriction and the
    # following disclaimer, must be included in all copies of the
    # Software, in whole or in part, and all derivative works of
    # the Software, unless such copies or derivative works are solely
    # in the form of machine-executable object code generated by a
    # source language processor.
    #
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND.
    # AUTODESK DOES NOT MAKE AND HEREBY DISCLAIMS ANY EXPRESS OR IMPLIED
    # WARRANTIES INCLUDING, BUT NOT LIMITED TO, THE WARRANTIES OF
    # NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR
    # PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE, OR
    # TRADE PRACTICE. IN NO EVENT WILL AUTODESK AND/OR ITS LICENSORS
    # BE LIABLE FOR ANY LOST REVENUES, DATA, OR PROFITS, OR SPECIAL,
    # DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES, EVEN IF AUTODESK
    # AND/OR ITS LICENSORS HAS BEEN ADVISED OF THE POSSIBILITY
    # OR PROBABILITY OF SUCH DAMAGES.
    #
    # ==========================================================================
    #+

    # import maya.cmds
    # maya.cmds.loadPlugin("blindDoubleDataCmd.py")
    # maya.cmds.sphere()
    # maya.cmds.spBlindDoubleData()

    import sys
    import maya.OpenMaya as OpenMaya
    import maya.OpenMayaMPx as OpenMayaMPx

    kPluginName = "spBlindDoubleData"
    kPluginDataId = OpenMaya.MTypeId(0x87011)

    #
    fValueDictionary={}

    # testing function
    def printMsg(msg):
        print msg
        stream=OpenMaya.MStreamUtils.stdOutStream()
        OpenMaya.MStreamUtils.writeCharBuffer(stream,msg)

    # data
    class blindDoubleData(OpenMayaMPx.MPxData):
        def __init__(self):
            OpenMayaMPx.MPxData.__init__(self)
            self.__fValue = 0.0
            fValueDictionary[OpenMayaMPx.asHashable(self)]=self.__fValue

        def readASCII(self, args, lastParsedElement):
            try:
                if args.length() > 0:
                    parsedIndex = OpenMaya.MScriptUtil.getUint(lastParsedElement)
                    self.__fValue = args.asDouble( parsedIndex )
                    parsedIndex += 1
                    OpenMaya.MScriptUtil.setUint(lastParsedElement,parsedIndex)
                    fValueDictionary[OpenMayaMPx.asHashable(self)]=self.__fValue
            except:
                sys.stderr.write("Failed to read ASCII value.")
                raise

        def readBinary(self, inStream, length):
            readParam = OpenMaya.MScriptUtil()
            readParam.createFromDouble(0.0)
            readPtr = readParam.asDoublePtr()
            OpenMaya.MStreamUtils.readDouble(inStream, readPtr, True )
            self.__fValue = OpenMaya.MScriptUtil.getDouble( readPtr )

        def writeASCII(self, out):
            try:
                OpenMaya.MStreamUtils.writeDouble(out, self.__fValue, False)
            except:
                sys.stderr.write("Failed to write ASCII value.")
                raise

        def writeBinary(self, out):
            try:
                OpenMaya.MStreamUtils.writeDouble(out, self.__fValue, True)
            except:
                sys.stderr.write("Failed to write binary value.")
                raise

        def copy(self, other):
            # Cannot convert other to self.  Use a dictionary
            # to hold the information we need.
            self.__fValue = fValueDictionary[OpenMayaMPx.asHashable(other)]

        def typeId(self):
            return kPluginDataId

        def name(self):
            return kPluginName

        def value(self):
            return self.__fValue

        def setValue(self, newVal):
            self.__fValue = newVal

    # command
    class blindDoubleDataCmd(OpenMayaMPx.MPxCommand):
        def __init__(self):
            OpenMayaMPx.MPxCommand.__init__(self)
            self.__iter = None

        def doIt(self, args):
            selList = OpenMaya.MSelectionList()
            OpenMaya.MGlobal.getActiveSelectionList(selList)
            self.__iter = OpenMaya.MItSelectionList(selList)
            self.redoIt()

        def redoIt(self):
            dependNode = OpenMaya.MObject() # Selected dependency node
            # show message and advance iterator
            def error(msg):
                sys.stderr.write(err)
                self.__iter.next()

            # Iterate over all selected dependency nodes
            #
            while not self.__iter.isDone():
                # Get the selected dependency node and create
                # a function set for it
                #
                try:
                    self.__iter.getDependNode(dependNode)
                except:
                    error("Error getting the dependency node")
                    continue

                try:
                    fnDN = OpenMaya.MFnDependencyNode(dependNode)
                except:
                    error("Error creating MFnDependencyNode")
                    continue

                # Create a new attribute for our blind data
                #
                fnAttr = OpenMaya.MFnTypedAttribute()
                newAttr = fnAttr.create("blindDoubleData", "BDD", kPluginDataId)

                # Now add the new attribute to the current dependency node
                #
                fnDN.addAttribute(newAttr, OpenMaya.MFnDependencyNode.kLocalDynamicAttr)

                # Create a plug to set and retrive value off the node.
                #
                plug = OpenMaya.MPlug(dependNode, newAttr)

                # Instantiate blindDoubleData and set its value.
                #
                newData = OpenMayaMPx.asMPxPtr(blindDoubleData())
                newData.setValue(3.2)

                # Set the value for the plug.
                #
                plug.setMPxData(newData)

                # Now try to retrieve the value off the plug as an MObject.
                #
                try:
                    sData = plug.asMObject()
                except:
                    error("Error getting value off plug")
                    continue

                # Convert the data back to MPxData.
                #
                pdFn = OpenMaya.MFnPluginData(sData)
                data = pdFn.constData()

                # Get the value.
                #
                if not data:
                    error("Error: failed to retrieve data.")
                    continue

                self.__iter.next()

        def undoIt(self):
            pass

        def isUndoable(self):
            return True

    ########################################################################

    # Creators
    def cmdCreator():
        return OpenMayaMPx.asMPxPtr(blindDoubleDataCmd())

    def dataCreator():
        return OpenMayaMPx.asMPxPtr(blindDoubleData())

    # Initialize the script plug-in
    def initializePlugin(mobject):
        mplugin = OpenMayaMPx.MFnPlugin(mobject, "Autodesk", "1.0", "Any")
        try:
            mplugin.registerData(kPluginName, kPluginDataId, dataCreator)
        except:
            sys.stderr.write("Failed to register new data type: %s\n" % kPluginName)
            raise

        try:
            mplugin.registerCommand(kPluginName, cmdCreator)
        except:
            sys.stderr.write("Failed to register command: %s\n" % kPluginName)
            raise

    # Uninitialize the script plug-in
    def uninitializePlugin(mobject):
        mplugin = OpenMayaMPx.MFnPlugin(mobject)
        try:
            mplugin.deregisterCommand(kPluginName)
        except:
            sys.stderr.write("Failed to unregister command: %s\n" % kPluginName)
            raise

        try:
            mplugin.deregisterData(kPluginDataId)
        except:
            sys.stderr.write("Failed to unregister data type: %s\n" % kPluginName)
            raise