Example #1
0
        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]);
                    }
                }
            }
        }
Example #2
0
        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();
        }