示例#1
0
        public ImportResult ImportCore(string SelectedPath)
        {
            ImportResult IR = new ImportResult();

            Project Proj = new Project();

            Proj.FileName = $@"{SelectedPath}\*.*";

            if (!ATCFHelperMethods.Export_CheckDirectoryValidForImport(SelectedPath, CoordinateFormat.HURDAT2))
            {
                IR.Status = ExportResults.Error;
                return(IR);
            }
            else
            {
                List <string> FileList = Directory.EnumerateFiles(SelectedPath).ToList();

                Basin Bas = new Basin();

                for (int i = 0; i < FileList.Count; i++)
                {
                    string FileName = FileList[i];

                    List <string> Hurdat2Strings = File.ReadAllLines(FileName).ToList();

                    Storm Sto = new Storm();

                    for (int j = 0; j < Hurdat2Strings.Count(); j++)
                    {
                        string HD2String = Hurdat2Strings[j];

                        Node CN = new Node();

                        // non-header
                        if (j != 0)
                        {
                            List <string> Components = HD2String.Split(',').ToList();

                            // HURDAT2 Format components
                            // 20151020, 0600,  , TD, 13.4N,  94.0W,  25, 1007,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
                            // 0 = date (YYYYMMDD)
                            // 1 = time (YYYYMMDD) ignore this until iris when we will explictly store node dates
                            // 2 = reserved, unused
                            // 3 = category
                            // 4 = latitude
                            // 5 = longitude
                            // 6 = wind speed
                            // 7 = pressure
                            // rest are wind radii 34/50/64kt
                            // Currently we only care about 0, 1, 3, 4, 5, and 6

                            string _Date      = Components[0];
                            string _Time      = Components[1];
                            string _Category  = Components[4];
                            string _Latitude  = Components[5];
                            string _Longitude = Components[6];
                            string _WindSpeed = Components[7];
                            string _Pressure  = Components[8];

                            // Trim everything.
                            _Date      = _Date.Trim();
                            _Time      = _Time.Trim();
                            _Category  = _Category.Trim();
                            _Latitude  = _Latitude.Trim();
                            _Longitude = _Longitude.Trim();
                            _WindSpeed = _WindSpeed.Trim();
                            _Pressure  = _Pressure.Trim();

                            // first real information
                            if (j == 1)
                            {
                                string DateString = $"{_Date}, {_Time}";
                                Sto.FormationDate = ParsingUtil.ParseATCFDateTime(DateString, CoordinateFormat.HURDAT2);
                            }

                            CN.Id = j;
                            RealStormType RST = ATCFHelperMethods.Export_IdentifyRealType(_Category);

                            CN.Intensity = Convert.ToInt32(_WindSpeed);
                            CN.NodeType  = ATCFHelperMethods.Export_GetStormType(_Category);

                            if (CN.NodeType == null)
                            {
                                Error.Throw("Error!", "Invalid or unknown stormtype detected!", ErrorSeverity.Error, 322);
                                IR.Status = ExportResults.Error;
                                return(IR);
                            }

                            Coordinate Coordinate = Coordinate.FromSplitCoordinate(_Longitude, _Latitude, CoordinateFormat.HURDAT2);

                            // TEMP: MOVE WINDOW SIZE TO TRACKMAKER.CORE VOLATILESETTINGS CLASS

                            MainWindow MnWindow = (MainWindow)Application.Current.MainWindow;

                            CN.Position = Bas.FromCoordinateToRelativeNodePosition(Coordinate, new Point(MnWindow.Width, MnWindow.Height));

                            CN.Pressure = Convert.ToInt32(_Pressure);
                            Sto.AddNode(CN);
                        }
                        // this can and will be refactored
                        else
                        {
                            // HURDAT2 Format Header
                            string HD2Header = HD2String;

                            List <string> HD2HeaderComponents = HD2Header.Split(',').ToList();

                            string HD2ID            = HD2HeaderComponents[0];
                            string HD2Name          = HD2HeaderComponents[1];
                            string HD2AdvisoryCount = HD2HeaderComponents[2]; // we don't use this

                            if (HD2ID.Length != 8)
                            {
                                Error.Throw("Error!", "Invalid ID field in HURDAT2 storm header.", ErrorSeverity.Error, 323);
                                IR.Status = ExportResults.Error;
                                return(IR);
                            }

                            string BasinAbbreviation = HD2ID.Substring(0, 2);

                            // set up the basin if this is the first node of the first file

                            if (i == 0)
                            {
                                Bas = Proj.GetBasinWithAbbreviation(BasinAbbreviation);

                                if (Bas.CoordsLower == null || Bas.CoordsHigher == null)
                                {
                                    Error.Throw("Error!", "This basin is not supported by the HURDAT2 format as it does not have defined boundaries in Basins.xml.", ErrorSeverity.Error, 326);
                                    IR.Status = ExportResults.Error;
                                    return(IR);
                                }

                                // sets up a background layer for us so we do not need to create one manually
                                Proj.InitBasin(Bas);
                            }

                            Sto.Name = HD2Name;
                            continue;
                        }

                        Sto.AddNode(CN);

                        // set up the storm if this is the first node of any file (TERRIBLE SHIT NO GOOD)
                    }

                    Bas.AddStorm(Sto);
                }

                Proj.AddBasin(Bas);
            }

            IR.Project = Proj;
            IR.Status  = ExportResults.OK;
            return(IR);
        }
示例#2
0
        // pre-globalstate...refactor this in Dano to not have that passed to it
        // this code is terrible
        public Project ImportCore(StormTypeManager ST2M, string FolderName)
        {
            // this is one of the worst f*****g file formats I have ever laid my f*****g eyes on, NOAA are a bunch of f*****g wanker twats, nobody should use this pile of crap

            string[] Storms = Directory.GetFiles(FolderName);

            // this is terrible design
            Project Proj = new Project();

            Proj.FileName = $"{FolderName}/*.*";
            Basin Bas = new Basin();

            // this is still a mess for now
            // not foreach as we can use it for setting up the basin
            for (int i = 0; i < Storms.Count(); i++)
            {
                string StormFileName = Storms[i];

                string[] ATCFLines = File.ReadAllLines(StormFileName);

                // holy f*****g shit i hate the ATCF format so f*****g muc
                Layer Lyr = new Layer();

                Storm Sto = new Storm();

                StormType2 StormType        = new StormType2();
                DateTime   StormFormationDT = new DateTime(1959, 3, 10);

                // XML OR JSON OR F*****G ANYTHING PLS
                // not foreach because it makes it slightly easier to set the date
                for (int j = 0; j < ATCFLines.Length; j++)
                {
                    string ATCFLine = ATCFLines[j];

                    string[] Components = ATCFLine.Split(',');

                    string _StrAbbreviation = Components[0];
                    // get the stuff we actually need
                    string _StrId   = Components[1];
                    string _StrTime = Components[2];
                    string _StrTimeSinceFormation = Components[3];
                    string _StrCoordX             = Components[6];
                    string _StrCoordY             = Components[7];
                    string _StrIntensity          = Components[8];
                    string _StrPressure           = Components[9];
                    string _StrCategory           = Components[10];
                    string _StrName = Components[28]; // bleh

                    // trim it
                    _StrAbbreviation       = _StrAbbreviation.Trim();
                    _StrId                 = _StrId.Trim();
                    _StrTime               = _StrTime.Trim();
                    _StrTimeSinceFormation = _StrTimeSinceFormation.Trim();
                    _StrPressure           = _StrPressure.Trim();
                    _StrCoordX             = _StrCoordX.Trim();
                    _StrCoordY             = _StrCoordY.Trim();
                    _StrIntensity          = _StrIntensity.Trim();
                    _StrCategory           = _StrCategory.Trim();
                    _StrName               = _StrName.Trim();

                    // initialise the basin with the abbreviation loaded from XML
                    // we just use the name if there is no abbreviation specified in XML
                    int Intensity = 0;
                    // first iteration...
                    if (j == 0)
                    {
                        if (i == 0)
                        {
                            Bas = Proj.GetBasinWithAbbreviation(_StrAbbreviation);

                            if (Bas.CoordsHigher == null || Bas.CoordsLower == null)
                            {
                                Error.Throw("Error!", "This basin is not supported by the ATCF format as it does not have defined borders in Basins.xml.", ErrorSeverity.Error, 249);
                                return(null);
                            }
                        }

                        Lyr.Name = _StrName;
                    }

                    Intensity = Convert.ToInt32(_StrIntensity);

                    Sto.FormationDate = ParsingUtil.ParseATCFDateTime(_StrTime, CoordinateFormat.ATCF);

                    if (_StrName == null)
                    {
                        Error.Throw("Error!", "Attempted to load storm with an invalid name!", ErrorSeverity.Error, 245);
                        return(null);
                    }
                    else
                    {
                        Sto.Name = _StrName;
                    }

                    int        Id    = Convert.ToInt32(_StrId);
                    Coordinate Coord = Coordinate.FromSplitCoordinate(_StrCoordX, _StrCoordY);

                    // create a node and add it

                    Node Nod = new Node();
                    Nod.Id        = Id;
                    Nod.Intensity = Intensity;

                    Nod.Position = Bas.FromCoordinateToRelativeNodePosition(Coord, new Point(MnWindow.Width, MnWindow.Height));
                    Nod.NodeType = ATCFHelperMethods.Export_GetStormType(_StrCategory);
                    Nod.Pressure = Convert.ToInt32(_StrPressure);

                    Sto.AddNode(Nod);
                }

                Lyr.AddStorm(Sto);
                Bas.AddLayer(Lyr);
            }

            Proj.AddBasin(Bas);

            return(Proj);
        }