Пример #1
0
        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;
        }
Пример #2
0
        /// <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();
                }
            }
        }