// 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; }
// 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); } }