diff --git a/MatFileHandler/OpaqueLink.cs b/MatFileHandler/OpaqueLink.cs index fcb0cfe..ed71d2f 100644 --- a/MatFileHandler/OpaqueLink.cs +++ b/MatFileHandler/OpaqueLink.cs @@ -107,8 +107,8 @@ namespace MatFileHandler return false; } - var objectPosition = IndexToObjectId[index]; - var objectInfo = subsystemData.ObjectInformation.First(pair => pair.Value.Position == objectPosition).Value; + var objectId = IndexToObjectId[index]; + var objectInfo = subsystemData.ObjectInformation[objectId]; var fieldId = objectInfo.FieldLinks[fieldIndex]; output = subsystemData.Data[fieldId]; return true; diff --git a/MatFileHandler/SubsystemDataReader.cs b/MatFileHandler/SubsystemDataReader.cs index ce7f18b..593cf6e 100644 --- a/MatFileHandler/SubsystemDataReader.cs +++ b/MatFileHandler/SubsystemDataReader.cs @@ -51,7 +51,7 @@ namespace MatFileHandler } var numberOfObjects = ((offsets[5] - offsets[4]) / 24) - 1; - Dictionary objectClasses = null; + Dictionary objectClasses = null; using (var stream = new MemoryStream(info, offsets[4], offsets[5] - offsets[4])) { using (var reader = new BinaryReader(stream)) @@ -60,12 +60,14 @@ namespace MatFileHandler } } - Dictionary> objectToFields = null; + var numberOfObjectPositions = objectClasses.Values.Count(x => x.objectPosition != 0); + + Dictionary> objectPositionsToValues = null; using (var stream = new MemoryStream(info, offsets[5], offsets[6] - offsets[5])) { using (var reader = new BinaryReader(stream)) { - objectToFields = ReadObjectToFieldsMapping(reader, numberOfObjects); + objectPositionsToValues = ReadObjectPositionsToValuesMapping(reader, numberOfObjectPositions); } } @@ -74,7 +76,7 @@ namespace MatFileHandler classIdToName, fieldNames, objectClasses, - objectToFields); + objectPositionsToValues); var allFields = objectInformation.Values.SelectMany(obj => obj.FieldLinks.Values); var data = new Dictionary(); @@ -107,17 +109,17 @@ namespace MatFileHandler return array; } - private static Dictionary ReadObjectClasses(BinaryReader reader, int numberOfObjects) + private static Dictionary ReadObjectClasses(BinaryReader reader, int numberOfObjects) { - var result = new Dictionary(); + var result = new Dictionary(); reader.ReadBytes(24); for (var i = 0; i < numberOfObjects; i++) { var classId = reader.ReadInt32(); reader.ReadBytes(12); var objectPosition = reader.ReadInt32(); - var objectId = reader.ReadInt32(); - result[objectPosition] = (objectId, classId); + var loadingOrder = reader.ReadInt32(); + result[i + 1] = (objectPosition, loadingOrder, classId); } return result; @@ -126,23 +128,23 @@ namespace MatFileHandler private static (Dictionary, Dictionary) GatherClassAndObjectInformation( Dictionary classIdToName, string[] fieldNames, - Dictionary objectClasses, - Dictionary> objectToFields) + Dictionary objectClasses, + Dictionary> objectPositionsToValues) { var classInfos = new Dictionary(); foreach (var classId in classIdToName.Keys) { var className = classIdToName[classId]; var fieldIds = new SortedSet(); - foreach (var objectPosition in objectToFields.Keys) + foreach (var objectPosition in objectPositionsToValues.Keys) { - var (_, thisObjectClassId) = objectClasses[objectPosition]; - if (thisObjectClassId != classId) + var keyValuePair = objectClasses.First(pair => pair.Value.objectPosition == objectPosition); + if (keyValuePair.Value.classId != classId) { continue; } - foreach (var fieldId in objectToFields[objectPosition].Keys) + foreach (var fieldId in objectPositionsToValues[objectPosition].Keys) { fieldIds.Add(fieldId); } @@ -156,10 +158,10 @@ namespace MatFileHandler } var objectInfos = new Dictionary(); - foreach (var objectPosition in objectToFields.Keys) + foreach (var objectPosition in objectPositionsToValues.Keys) { - var (objectId, _) = objectClasses[objectPosition]; - objectInfos[objectId] = new SubsystemData.ObjectInfo(objectPosition, objectToFields[objectPosition]); + var keyValuePair = objectClasses.First(pair => pair.Value.objectPosition == objectPosition); + objectInfos[keyValuePair.Key] = new SubsystemData.ObjectInfo(objectPosition, objectPositionsToValues[objectPosition]); } return (classInfos, objectInfos); @@ -180,11 +182,11 @@ namespace MatFileHandler return result; } - private static Dictionary> ReadObjectToFieldsMapping(BinaryReader reader, int numberOfObjects) + private static Dictionary> ReadObjectPositionsToValuesMapping(BinaryReader reader, int numberOfValues) { var result = new Dictionary>(); reader.ReadBytes(8); - for (var objectPosition = 1; objectPosition <= numberOfObjects; objectPosition++) + for (var objectPosition = 1; objectPosition <= numberOfValues; objectPosition++) { result[objectPosition] = ReadFieldToFieldDataMapping(reader); var position = reader.BaseStream.Position;