Ejemplo n.º 1
0
        //    Description:
        //        Given a clipboard and an ifstream, read the ifstream and add
        //        all of the anim curves described in ther stream into the
        //        API clipboard.
        //
        public void readClipboard(ref StreamReaderExt readAnim, MAnimCurveClipboard cb)
        {
            //	Set the default values for the start and end of the clipboard.
            //	The MAnimCurveClipboard::set() method will examine all of the
            //	anim curves are determine the proper start and end values, if the
            //	start time is greater than the end value.
            //
            //	By default, the start values are greater than the end values to
            //	ensure correct behavior if the file does not specify the start and
            //	end values.
            //
            double startTime = 1.0;
            double endTime = 0.0;
            double startUnitless = 1.0;
            double endUnitless = 0.0;

            resetUnits();
            convertAnglesFromV2To3 = false;
            convertAnglesFromV3To2 = false;

            //	Read the header. The header officially ends when the first non-header
            //	keyword is found. The header contains clipboard specific information
            //	where the body is anim curve specific.
            //
            string dataType = "";
            bool hasVersionString = false;
            while (!readAnim.EndOfStream)
            {
                advance(ref readAnim);
                dataType = asWord(ref readAnim);

                if (string.Compare(dataType, kAnimVersion) == 0)
                {
                    string version = asWord(ref readAnim);
                    animVersion = Convert.ToDouble(version);
                    string thisVersion = kAnimVersionString;

                    hasVersionString = true;

                    //	Add versioning control here.
                    //
                    if (version != thisVersion)
                    {
                        // Use format to place variable string into message
                        string msgFmt = MStringResource.getString(RegisterMStringResources.kInvalidVersion);
                        string msg = string.Format(msgFmt, thisVersion, version);
                        MGlobal.displayWarning(msg);
                    }
                }
                else if (string.Compare(dataType, kMayaVersion) == 0)
                {
                    string version = asWord(ref readAnim, true);
                    string currentVersion = MGlobal.mayaVersion;
                    if (currentVersion.Substring(0, 2) == "2.")
                    {
                        string vCheck = version.Substring(0, 2);
                        if (vCheck != "2.")
                            convertAnglesFromV3To2 = true;
                    }
                    else
                    {
                        //	If this is a pre-Maya 3.0 file, then the tangent angles
                        //	will need to be converted to work in Maya 3.0+
                        //
                        string vCheck = version.Substring(0, 2);
                        if (vCheck == "2.")
                        {
                            convertAnglesFromV2To3 = true;
                        }
                    }
                }
                else if (string.Compare(dataType, kTimeUnit) == 0)
                {
                    string timeUnitString = asWord(ref readAnim);
                    if (!animUnitNames.setFromName(timeUnitString, ref timeUnit))
                    {
                        string unitName = "";
                        timeUnit = MTime.uiUnit;
                        animUnitNames.setToShortName(timeUnit, ref unitName);
                        // Use format to place variable string into message
                        string msgFmt = MStringResource.getString(RegisterMStringResources.kSettingToUnit);
                        string msg = string.Format(msgFmt, kTimeUnit, unitName);
                        MGlobal.displayWarning(msg);
                    }
                }
                else if (string.Compare(dataType, kLinearUnit) == 0)
                {
                    string linearUnitString = asWord(ref readAnim);
                    if (!animUnitNames.setFromName(linearUnitString, ref linearUnit))
                    {
                        string unitName = "";
                        linearUnit = MDistance.uiUnit;
                        animUnitNames.setToShortName(linearUnit, ref unitName);

                        // Use format to place variable string into message
                        string msgFmt = MStringResource.getString(RegisterMStringResources.kSettingToUnit);
                        string msg = string.Format(msgFmt, kLinearUnit, unitName);
                        MGlobal.displayWarning(msg);
                    }
                }
                else if (string.Compare(dataType, kAngularUnit) == 0)
                {
                    string angularUnitString = asWord( ref readAnim);
                    if (!animUnitNames.setFromName(angularUnitString, ref angularUnit))
                    {
                        string unitName = "";
                        angularUnit = MAngle.uiUnit;
                        animUnitNames.setToShortName(angularUnit, ref unitName);

                        // Use format to place variable string into message
                        string msgFmt = MStringResource.getString(RegisterMStringResources.kSettingToUnit);
                        string msg = string.Format(msgFmt, kAngularUnit, unitName);
                        MGlobal.displayWarning(msg);
                    }
                }
                else if (string.Compare(dataType, kStartTime) == 0)
                    startTime = asDouble(ref readAnim);
                else if (string.Compare(dataType, kEndTime) == 0)
                    endTime = asDouble(ref readAnim);
                else if (string.Compare(dataType, kStartUnitless) == 0)
                    startUnitless = asDouble(ref readAnim);
                else if (string.Compare(dataType, kEndUnitless) == 0)
                    endUnitless = asDouble(ref readAnim);
                else {
                    //	The header should be finished. Begin to parse the body.
                    //
                    break;
                }
            }

            //	The animVersion string is required.
            //
            if (!hasVersionString)
            {
                // Use format to place variable string into message
                string msgFmt = MStringResource.getString(RegisterMStringResources.kMissingKeyword);
                string msg = string.Format(msgFmt, kAnimVersion);
                throw new ArgumentException(msg, "cb");
            }

            //	Set the linear and angular units to be the same as the file
            //	being read. This will allow fixed tangent data to be read
            //	in properly if the scene has different units than the .anim file.
            //
            MDistance.Unit oldDistanceUnit = MDistance.uiUnit;
            MTime.Unit oldTimeUnit = MTime.uiUnit;

            MDistance.uiUnit = linearUnit;
            MTime.uiUnit = timeUnit;

            MAnimCurveClipboardItemArray clipboardArray = new MAnimCurveClipboardItemArray();
            while (!readAnim.EndOfStream)
            {

                if ("" == dataType) {
                    dataType = asWord(ref readAnim);
                }

                if (string.Compare(dataType, kAnim) == 0)
                {
                    string fullAttributeName = "", leafAttributeName="", nodeName = "";

                    //	If this is from an unconnected anim curve, then there
                    //	will not be an attribute name.
                    //
                    if (!isNextNumeric(ref readAnim))
                    {
                        fullAttributeName = asWord(ref readAnim);

                        //	If the node names were specified, then the next two
                        //	words should be the leaf attribute and the node name.
                        //
                        if (!isNextNumeric(ref readAnim))
                        {
                            leafAttributeName = asWord(ref readAnim);
                            nodeName = asWord(ref readAnim);
                        }
                    }

                    uint rowCount, childCount, attrCount;
                    rowCount = (uint)asDouble(ref readAnim);
                    childCount = (uint)asDouble(ref readAnim);
                    attrCount = (uint)asDouble(ref readAnim);

                    //	If the next keyword is not an animData, then this is
                    //	a place holder for the API clipboard.
                    //
                    dataType = asWord(ref readAnim);
                    if (string.Compare(dataType, kAnimData) == 0)
                    {
                        MAnimCurveClipboardItem clipboardItem = new MAnimCurveClipboardItem();
                        if (readAnimCurve(ref readAnim, ref clipboardItem))
                        {
                            clipboardItem.setAddressingInfo(rowCount,
                                                            childCount, attrCount);
                            clipboardItem.setNameInfo(	nodeName,
                                                        fullAttributeName,
                                                        leafAttributeName);
                            clipboardArray.append(clipboardItem);
                        }
                        else
                        {
                            //	Could not read the anim curve.
                            //
                            string msg = MStringResource.getString(RegisterMStringResources.kCouldNotReadAnim);
                            MGlobal.displayError(msg);
                        }
                    }
                    else
                    {
                        //	This must be a place holder object for the clipboard.
                        //
                        MAnimCurveClipboardItem clipboardItem = new MAnimCurveClipboardItem();
                        clipboardItem.setAddressingInfo(rowCount,
                                                        childCount, attrCount);

                        //	Since there is no anim curve specified, what is
                        //	in the fullAttributeName string is really the node
                        //	name.
                        //
                        clipboardItem.setNameInfo(	fullAttributeName,
                                                    nodeName,
                                                    leafAttributeName);
                        clipboardArray.append(clipboardItem);

                        //	dataType already contains the next keyword.
                        //
                        continue;
                    }
                }
                else
                {
                    if (!readAnim.EndOfStream)
                    {
                        string warnStr = dataType;

                        // Use format to place variable string into message
                        string msgFmt = MStringResource.getString(RegisterMStringResources.kUnknownKeyword);
                        string msg = string.Format(msgFmt, warnStr);
                        MGlobal.displayError(msg);

                        //	Skip to the next line, this one is invalid.
                        //
                        readAnim.ReadLine();
                    }
                    else
                    {
                        //	The end of the file was reached.
                        //
                        break;
                    }
                }

                //	Skip any whitespace.
                //
                dataType = "";
            }

            try
            {
                cb.set(	clipboardArray,
                        new MTime(startTime, timeUnit), new MTime(endTime, timeUnit),
                        (float) startUnitless, (float) endUnitless) ;
            }
            catch (System.Exception)
            {
                string msg = MStringResource.getString(RegisterMStringResources.kClipboardFailure);
                MGlobal.displayError(msg);
            }

            //	Restore the old units.
            //
            MDistance.uiUnit = oldDistanceUnit;
            MTime.uiUnit = oldTimeUnit;
        }
Ejemplo n.º 2
0
        //    Description:
        //        Write the contents of the clipboard to the stream.
        //
        public void writeClipboard(	ref StreamWriter animFile,  MAnimCurveClipboard cb, 
            bool nodeNames  = false ,
            bool verboseUnits = false)
        {
            // Check to see if there is anything on the clipboard at all
            //
            if (cb.isEmpty)
            {
                throw new ArgumentException( "clipboard is empty", "cb" );
            }

            resetUnits();

            // Write out the clipboard information
            //
            writeHeader(ref animFile);

            // Now write out each animCurve
            //
            MAnimCurveClipboardItemArray clipboardArray = cb.clipboardItems;
            for (int i = 0; i < clipboardArray.length; i++)
            {
                MAnimCurveClipboardItem clipboardItem = clipboardArray[i];

                MObject animCurveObj = clipboardItem.animCurve;

                //	The clipboard may contain Null anim curves. If a Null anim
                //	curve is returned, it is safe to ignore the error message
                //	and continue to the next anim curve in the list.
                //
                bool placeHolder = false;
                if (animCurveObj.isNull)
                {
                    placeHolder = true;
                }

                // Write out animCurve information
                //
                writeAnim(ref animFile, clipboardItem, placeHolder, nodeNames);

                if (placeHolder)
                {
                    continue;
                }

                //	Write out each curve in its specified format.
                //	For now, only the anim curve format.
                //
                writeAnimCurve(ref animFile, animCurveObj, clipboardItem.animCurveType, verboseUnits);
            }
        }