public override void Read(BinaryReaderWriter br, bool raw = false, uint headeroffset = 0, uint gapoffset = 0) { base.Read(br, raw, headeroffset, gapoffset); if (Locked != 0) { throw new Exception("Eine gesperrte GMP-Datei kann nicht gelesen werden."); } SortedSet <int> sortedSubHeaderOffsets = new SortedSet <int>(); foreach (int offs in SubHeaderOffsets) { if (offs > 0) { sortedSubHeaderOffsets.Add(offs); } } if (sortedSubHeaderOffsets.Count > 0) // sonst hat die GMP-Datei keinen sinnvollen Inhalt { int minoffs = sortedSubHeaderOffsets.Min; if (HeaderOffset + Headerlength < minoffs) // freier Bereich zum 1. Subheader -> Copyright-Abschnitt // Copyright dekodieren { Decode_Copyright(br, new DataBlock(HeaderOffset + Headerlength, (ushort)minoffs - (HeaderOffset + Headerlength))); } for (int i = 0; i < SubHeaderOffsets.Length; i++) { if (SubHeaderOffsets[i] > 0) // sonst ex. der Header nicht { switch (i) { case 0: stdfiles[i] = new StdFile_TRE(); break; case 1: stdfiles[i] = new StdFile_RGN(stdfiles[0] as StdFile_TRE); break; case 2: stdfiles[i] = new StdFile_LBL(); break; case 3: stdfiles[i] = new StdFile_NET(); break; case 4: stdfiles[i] = new StdFile_NOD(); break; case 5: stdfiles[i] = new StdFile_DEM(); break; case 6: stdfiles[i] = new StdFile_MAR(); break; } if (SubHeaderDistance[i] < uint.MaxValue) { SubGapOffset[i] = SubHeaderOffsets[i] + SubHeaderDistance[i]; } stdfiles[i].Read(br, raw, SubHeaderOffsets[i], SubGapOffset[i]); } } } }
void AnalyzeFile(BinaryReaderWriter brrgn, BinaryReaderWriter brtre, BinaryReaderWriter brlbl, bool show = false) { Clear(); StdFile_TRE tre = new StdFile_TRE(); if (brtre != null) { tre.Read(brtre); } StdFile_RGN rgn = new StdFile_RGN(tre); if (brrgn != null) { rgn.Read(brrgn); } StdFile_LBL lbl = new StdFile_LBL(); if (brlbl != null) { lbl.Read(brlbl); } int typ; for (int i = 0; i < rgn.SubdivList.Count && i < tre.SubdivInfoList.Count; i++) { StdFile_RGN.SubdivData sd = rgn.SubdivList[i]; foreach (var item in sd.AreaList) { typ = item.Type << 8 | item.Subtype; string txt = null; if (item.LabelOffsetInLBL != 0 && lbl.TextList.Count > 0) { if (!item.LabelInNET) // das dürfte immer so sein { txt = lbl.GetText(item.LabelOffsetInLBL, false); } } RegisterArea(typ, txt); } foreach (var item in sd.ExtAreaList) { typ = ((0x100 | item.Type) << 8) | item.Subtype; string txt = null; if (item.HasLabel && lbl.TextList.Count > 0) { txt = lbl.GetText(item.LabelOffsetInLBL, false); } RegisterArea(typ, txt); } foreach (var item in sd.LineList) { typ = item.Type << 8 | item.Subtype; string txt = null; if (item.LabelOffsetInLBL != 0 && lbl.TextList.Count > 0) { if (!item.LabelInNET) { txt = lbl.GetText(item.LabelOffsetInLBL, false); } } // else // p.NetData = new DetailMap.RoadDataExt(net.Roaddata[net.Idx4Offset[item.LabelOffset]], lbl); RegisterLine(typ, txt); } foreach (var item in sd.ExtLineList) { typ = ((0x100 | item.Type) << 8) | item.Subtype; string txt = null; if (item.HasLabel && lbl.TextList.Count > 0) { txt = lbl.GetText(item.LabelOffsetInLBL, false); } RegisterLine(typ, txt); } foreach (var item in sd.PointList2) // vor den "normalen" Punkten einlesen, damit der ev. Index-Verweise stimmen (z.B. für Exits) { typ = item.Type << 8 | item.Subtype; string txt = null; if (item.LabelOffsetInLBL != 0 && lbl.TextList.Count > 0) { if (!item.IsPoiOffset) { txt = lbl.GetText(item.LabelOffsetInLBL, false); } } // else { // int idx = lbl.POIPropertiesListOffsets[item.LabelOffset]; // DetailMap.PoiDataExt pd = new DetailMap.PoiDataExt(lbl.POIPropertiesList[idx], lbl); // p.LblData = pd; // p.Label = p.LblData.Text; // } RegisterPoint(typ, txt); } foreach (var item in sd.PointList1) { typ = item.Type << 8 | item.Subtype; string txt = null; if (item.LabelOffsetInLBL != 0 && lbl.TextList.Count > 0) { if (!item.IsPoiOffset) { txt = lbl.GetText(item.LabelOffsetInLBL, false); } } // else { // int idx = lbl.POIPropertiesListOffsets[item.LabelOffset]; // DetailMap.PoiDataExt pd = new DetailMap.PoiDataExt(lbl.POIPropertiesList[idx], lbl); // p.LblData = pd; // p.Label = p.LblData.Text; // } RegisterPoint(typ, txt); } foreach (var item in sd.ExtPointList) { typ = ((0x100 | item.Type) << 8) | item.Subtype; string txt = null; if (item.HasLabel && lbl.TextList.Count > 0) { txt = lbl.GetText(item.LabelOffsetInLBL, false); } RegisterPoint(typ, txt); } } if (show) { Console.WriteLine("Punkttypen"); foreach (var item in PointType) { Console.WriteLine(string.Format(" {0,5:X} {1}x", item.Key, item.Value)); } Console.WriteLine("Linientypen"); foreach (var item in LineType) { Console.WriteLine(string.Format(" {0,5:X} {1}x", item.Key, item.Value)); } Console.WriteLine("Flächentypen"); foreach (var item in AreaType) { Console.WriteLine(string.Format(" {0,5:X} {1}x", item.Key, item.Value)); } } BuildSum(); }