void Encode_Draworder(BinaryReaderWriter bw) { // je Draworder eine Liste der Typen; je Typ eine Liste der Subtypes SortedList <uint, SortedList <uint, SortedList <uint, uint> > > draworderlist = new SortedList <uint, SortedList <uint, SortedList <uint, uint> > >(); foreach (Polygone p in polygone.Keys) { if (!draworderlist.TryGetValue(p.Draworder, out SortedList <uint, SortedList <uint, uint> > typelist)) { typelist = new SortedList <uint, SortedList <uint, uint> >(); draworderlist.Add(p.Draworder, typelist); } if (!typelist.TryGetValue(p.Type, out SortedList <uint, uint> subtypelist)) { subtypelist = new SortedList <uint, uint>(); typelist.Add(p.Type, subtypelist); } subtypelist.Add(p.Subtype, 0); } PolygoneDraworderTableBlock.Recordsize = 5; PolygoneDraworderTableBlock.Offset = (uint)bw.Position; uint olddraworder = 0; foreach (uint draworder in draworderlist.Keys) { while (olddraworder > 0 && draworder != olddraworder) // Kennung für Erhöhung der Draworder schreiben { new PolygonDraworderTableItem(0, 0).Write(bw, PolygoneDraworderTableBlock.Recordsize); olddraworder++; } olddraworder = draworder; SortedList <uint, SortedList <uint, uint> > typelist = draworderlist[draworder]; foreach (uint type in typelist.Keys) // für jeden Typ dieser Draworder einen Tabelleneintrag erzeugen { PolygonDraworderTableItem ti = new PolygonDraworderTableItem(type, draworder); // ev. vorhandene Subtypes ergänzen SortedList <uint, uint> subtypelist = typelist[type]; foreach (uint subtype in subtypelist.Keys) { ti.Subtypes.Add(subtype); } ti.Write(bw, PolygoneDraworderTableBlock.Recordsize); } } PolygoneDraworderTableBlock.Length = (uint)bw.Position - PolygoneDraworderTableBlock.Offset; }
/// <summary> /// liest die Daten in <see cref="polygone"/> ein /// </summary> /// <param name="br"></param> /// <param name="bRelaxed"></param> void Decode_PolygoneData(BinaryReaderWriter br, bool bRelaxed) { if (PolygoneTableBlock.Count > 0) { StringBuilder sb = new StringBuilder(); // Tabelle für Typen und Offsets zu den eigentlichen Daten einlesen PolygonTableItems = new List <TableItem>(); br.Seek(PolygoneTableBlock.Offset); for (int i = 0; i < PolygoneTableBlock.Count; i++) { PolygonTableItems.Add(new TableItem(br, PolygoneTableBlock.Recordsize)); } // Draworder-Tabelle einlesen PolygonDraworderTableItems = new List <PolygonDraworderTableItem>(); uint iLevel = 1; br.Seek(PolygoneDraworderTableBlock.Offset); int blocklen = (int)PolygoneDraworderTableBlock.Length; if (blocklen > 0) { while (blocklen >= PolygoneDraworderTableBlock.Recordsize) { PolygonDraworderTableItem dro = new PolygonDraworderTableItem(br, PolygoneDraworderTableBlock.Recordsize, iLevel); blocklen -= PolygoneDraworderTableBlock.Recordsize; PolygonDraworderTableItems.Add(dro); if (dro.Type == 0) // nächster Level { iLevel++; } } } // Tabelle der Polygondaten einlesen polygone.Clear(); for (int i = 0; i < PolygonTableItems.Count; i++) { br.Seek(PolygonTableItems[i].Offset + PolygoneDatablock.Offset); int datalen = i < PolygonTableItems.Count - 1 ? PolygonTableItems[i + 1].Offset - PolygonTableItems[i].Offset : (int)PolygoneTableBlock.Offset - (PolygonTableItems[i].Offset + (int)PolygoneDatablock.Offset); try { long startpos = br.Position; Polygone p = new Polygone(PolygonTableItems[i].Type, PolygonTableItems[i].Subtype); p.Read(br); Debug.WriteLineIf(startpos + datalen != br.Position, string.Format("Diff. {0} der Datenlänge beim Lesen des Objektes 0x{1:x} 0x{2:x} (größer 0 bedeutet: zuviel gelesen)", br.Position - (startpos + datalen), PolygonTableItems[i].Type, PolygonTableItems[i].Subtype)); // zugehörige Draworder suchen for (int j = 0; j < PolygonDraworderTableItems.Count; j++) { if (p.Type == PolygonDraworderTableItems[j].Type) // Haupttyp gefunden { for (int k = 0; k < PolygonDraworderTableItems[j].Subtypes.Count; k++) { if (p.Subtype == PolygonDraworderTableItems[j].Subtypes[k]) // auch Subtyp gefunden { p.Draworder = PolygonDraworderTableItems[j].Level; j = PolygonDraworderTableItems.Count; // 2. Schleifenabbruch break; } } } } polygone.Add(p, 0); } catch (Exception ex) { if (bRelaxed) { sb.AppendFormat("Fehler beim Einlesen von Polygon 0x{0:x2}, 0x{1:x2}: {2}", PolygonTableItems[i].Type, PolygonTableItems[i].Subtype, ex.Message); sb.AppendLine(); } else { throw new Exception(ex.Message); } } } if (bRelaxed) { RelaxedModeErrors += sb.ToString(); } } }