Fix parsing of subsystem data
This commit is contained in:
parent
5e70d7fdfd
commit
262c3a8314
@ -107,8 +107,8 @@ namespace MatFileHandler
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var objectPosition = IndexToObjectId[index];
|
var objectId = IndexToObjectId[index];
|
||||||
var objectInfo = subsystemData.ObjectInformation.First(pair => pair.Value.Position == objectPosition).Value;
|
var objectInfo = subsystemData.ObjectInformation[objectId];
|
||||||
var fieldId = objectInfo.FieldLinks[fieldIndex];
|
var fieldId = objectInfo.FieldLinks[fieldIndex];
|
||||||
output = subsystemData.Data[fieldId];
|
output = subsystemData.Data[fieldId];
|
||||||
return true;
|
return true;
|
||||||
|
@ -51,7 +51,7 @@ namespace MatFileHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
var numberOfObjects = ((offsets[5] - offsets[4]) / 24) - 1;
|
var numberOfObjects = ((offsets[5] - offsets[4]) / 24) - 1;
|
||||||
Dictionary<int, (int, int)> objectClasses = null;
|
Dictionary<int, (int objectPosition, int loadingOrder, int classId)> objectClasses = null;
|
||||||
using (var stream = new MemoryStream(info, offsets[4], offsets[5] - offsets[4]))
|
using (var stream = new MemoryStream(info, offsets[4], offsets[5] - offsets[4]))
|
||||||
{
|
{
|
||||||
using (var reader = new BinaryReader(stream))
|
using (var reader = new BinaryReader(stream))
|
||||||
@ -60,12 +60,14 @@ namespace MatFileHandler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Dictionary<int, Dictionary<int, int>> objectToFields = null;
|
var numberOfObjectPositions = objectClasses.Values.Count(x => x.objectPosition != 0);
|
||||||
|
|
||||||
|
Dictionary<int, Dictionary<int, int>> objectPositionsToValues = null;
|
||||||
using (var stream = new MemoryStream(info, offsets[5], offsets[6] - offsets[5]))
|
using (var stream = new MemoryStream(info, offsets[5], offsets[6] - offsets[5]))
|
||||||
{
|
{
|
||||||
using (var reader = new BinaryReader(stream))
|
using (var reader = new BinaryReader(stream))
|
||||||
{
|
{
|
||||||
objectToFields = ReadObjectToFieldsMapping(reader, numberOfObjects);
|
objectPositionsToValues = ReadObjectPositionsToValuesMapping(reader, numberOfObjectPositions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,7 +76,7 @@ namespace MatFileHandler
|
|||||||
classIdToName,
|
classIdToName,
|
||||||
fieldNames,
|
fieldNames,
|
||||||
objectClasses,
|
objectClasses,
|
||||||
objectToFields);
|
objectPositionsToValues);
|
||||||
|
|
||||||
var allFields = objectInformation.Values.SelectMany(obj => obj.FieldLinks.Values);
|
var allFields = objectInformation.Values.SelectMany(obj => obj.FieldLinks.Values);
|
||||||
var data = new Dictionary<int, IArray>();
|
var data = new Dictionary<int, IArray>();
|
||||||
@ -107,17 +109,17 @@ namespace MatFileHandler
|
|||||||
return array;
|
return array;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Dictionary<int, (int, int)> ReadObjectClasses(BinaryReader reader, int numberOfObjects)
|
private static Dictionary<int, (int objectPosition, int loadingOrder, int classId)> ReadObjectClasses(BinaryReader reader, int numberOfObjects)
|
||||||
{
|
{
|
||||||
var result = new Dictionary<int, (int, int)>();
|
var result = new Dictionary<int, (int, int, int)>();
|
||||||
reader.ReadBytes(24);
|
reader.ReadBytes(24);
|
||||||
for (var i = 0; i < numberOfObjects; i++)
|
for (var i = 0; i < numberOfObjects; i++)
|
||||||
{
|
{
|
||||||
var classId = reader.ReadInt32();
|
var classId = reader.ReadInt32();
|
||||||
reader.ReadBytes(12);
|
reader.ReadBytes(12);
|
||||||
var objectPosition = reader.ReadInt32();
|
var objectPosition = reader.ReadInt32();
|
||||||
var objectId = reader.ReadInt32();
|
var loadingOrder = reader.ReadInt32();
|
||||||
result[objectPosition] = (objectId, classId);
|
result[i + 1] = (objectPosition, loadingOrder, classId);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -126,23 +128,23 @@ namespace MatFileHandler
|
|||||||
private static (Dictionary<int, SubsystemData.ClassInfo>, Dictionary<int, SubsystemData.ObjectInfo>) GatherClassAndObjectInformation(
|
private static (Dictionary<int, SubsystemData.ClassInfo>, Dictionary<int, SubsystemData.ObjectInfo>) GatherClassAndObjectInformation(
|
||||||
Dictionary<int, string> classIdToName,
|
Dictionary<int, string> classIdToName,
|
||||||
string[] fieldNames,
|
string[] fieldNames,
|
||||||
Dictionary<int, (int, int)> objectClasses,
|
Dictionary<int, (int objectPosition, int loadingOrder, int classId)> objectClasses,
|
||||||
Dictionary<int, Dictionary<int, int>> objectToFields)
|
Dictionary<int, Dictionary<int, int>> objectPositionsToValues)
|
||||||
{
|
{
|
||||||
var classInfos = new Dictionary<int, SubsystemData.ClassInfo>();
|
var classInfos = new Dictionary<int, SubsystemData.ClassInfo>();
|
||||||
foreach (var classId in classIdToName.Keys)
|
foreach (var classId in classIdToName.Keys)
|
||||||
{
|
{
|
||||||
var className = classIdToName[classId];
|
var className = classIdToName[classId];
|
||||||
var fieldIds = new SortedSet<int>();
|
var fieldIds = new SortedSet<int>();
|
||||||
foreach (var objectPosition in objectToFields.Keys)
|
foreach (var objectPosition in objectPositionsToValues.Keys)
|
||||||
{
|
{
|
||||||
var (_, thisObjectClassId) = objectClasses[objectPosition];
|
var keyValuePair = objectClasses.First(pair => pair.Value.objectPosition == objectPosition);
|
||||||
if (thisObjectClassId != classId)
|
if (keyValuePair.Value.classId != classId)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var fieldId in objectToFields[objectPosition].Keys)
|
foreach (var fieldId in objectPositionsToValues[objectPosition].Keys)
|
||||||
{
|
{
|
||||||
fieldIds.Add(fieldId);
|
fieldIds.Add(fieldId);
|
||||||
}
|
}
|
||||||
@ -156,10 +158,10 @@ namespace MatFileHandler
|
|||||||
}
|
}
|
||||||
|
|
||||||
var objectInfos = new Dictionary<int, SubsystemData.ObjectInfo>();
|
var objectInfos = new Dictionary<int, SubsystemData.ObjectInfo>();
|
||||||
foreach (var objectPosition in objectToFields.Keys)
|
foreach (var objectPosition in objectPositionsToValues.Keys)
|
||||||
{
|
{
|
||||||
var (objectId, _) = objectClasses[objectPosition];
|
var keyValuePair = objectClasses.First(pair => pair.Value.objectPosition == objectPosition);
|
||||||
objectInfos[objectId] = new SubsystemData.ObjectInfo(objectPosition, objectToFields[objectPosition]);
|
objectInfos[keyValuePair.Key] = new SubsystemData.ObjectInfo(objectPosition, objectPositionsToValues[objectPosition]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (classInfos, objectInfos);
|
return (classInfos, objectInfos);
|
||||||
@ -180,11 +182,11 @@ namespace MatFileHandler
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Dictionary<int, Dictionary<int, int>> ReadObjectToFieldsMapping(BinaryReader reader, int numberOfObjects)
|
private static Dictionary<int, Dictionary<int, int>> ReadObjectPositionsToValuesMapping(BinaryReader reader, int numberOfValues)
|
||||||
{
|
{
|
||||||
var result = new Dictionary<int, Dictionary<int, int>>();
|
var result = new Dictionary<int, Dictionary<int, int>>();
|
||||||
reader.ReadBytes(8);
|
reader.ReadBytes(8);
|
||||||
for (var objectPosition = 1; objectPosition <= numberOfObjects; objectPosition++)
|
for (var objectPosition = 1; objectPosition <= numberOfValues; objectPosition++)
|
||||||
{
|
{
|
||||||
result[objectPosition] = ReadFieldToFieldDataMapping(reader);
|
result[objectPosition] = ReadFieldToFieldDataMapping(reader);
|
||||||
var position = reader.BaseStream.Position;
|
var position = reader.BaseStream.Position;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user