/// <summary> /// Needs to be majorly updated and refactored for v2 /// </summary> /// <param name="basin"></param> /// <returns></returns> public bool Export(Project Project) { // Change to FolderBrowserDialog (v616) try { System.Windows.Forms.FolderBrowserDialog FFD = new System.Windows.Forms.FolderBrowserDialog(); FFD.Description = $"Save to {GetName()} - enter folder name"; FFD.ShowDialog(); string CurPath = FFD.SelectedPath; if (CurPath == "") { return(true); } //utilfunc v2 if (Directory.Exists(CurPath)) { string[] FilesInDir = Directory.GetFiles(CurPath); if (FilesInDir.Length != 0) { ATCFHelperMethods.Export_DeleteAllFilesInSpecifiedDirectory(CurPath); } Directory.Delete(CurPath); Directory.CreateDirectory(CurPath); } // Run the export and if we failed clean up if (!ExportCore(Project, CurPath)) { string _ = CurPath.Replace(".", ""); ATCFHelperMethods.Export_DeleteAllFilesInSpecifiedDirectory(CurPath); Directory.Delete(_); } } catch (PathTooLongException) { Error.Throw($"Error", "Error: The path to the file is too long - please use a shorter path.", ErrorSeverity.Error, 129); return(false); } catch (IOException err) { #if DEBUG Error.Throw("Error", $"An error occurred during export to ATCF BestTrack format.\n\n{err}", ErrorSeverity.Error, 130); #else Error.Throw("Error", "An error occurred during export to ATCF BestTrack format.", ErrorSeverity.Error, 130); #endif return(false); } return(true); }
public static StormType2 Export_GetStormType(string NodeType) { RealStormType RST = ATCFHelperMethods.Export_IdentifyRealType(NodeType); #if PRISCILLA MainWindow MnWindow = (MainWindow)Application.Current.MainWindow; StormTypeManager STM = MnWindow.ST2Manager; #else StormTypeManager STM = MnWindow.GetST2Manager(); #endif StormType2 ST2 = STM.GetStormTypeWithRealStormTypeName(RST); return(ST2); }
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); }
public ImportResult Import() { try { ImportResult IR = new ImportResult(); System.Windows.Forms.FolderBrowserDialog OFD = new System.Windows.Forms.FolderBrowserDialog() { Description = $"Open {GetName()} format folder", }; #if DANO StormTypeManager ST2Manager = GlobalState.GetST2Manager(); #else MainWindow MnWindow = (MainWindow)Application.Current.MainWindow; StormTypeManager ST2Manager = MnWindow.ST2Manager; #endif if (OFD.ShowDialog() == System.Windows.Forms.DialogResult.OK) { if (OFD.SelectedPath == "") { return(null); } // check the directory if (!ATCFHelperMethods.Export_CheckDirectoryValidForImport(OFD.SelectedPath)) { IR.Status = ExportResults.Error; return(IR); } Project Proj = ImportCore(ST2Manager, OFD.SelectedPath); if (Proj == null) { IR.Status = ExportResults.Error; return(IR); } else { IR.Project = Proj; IR.Status = ExportResults.OK; return(IR); } } else { //temp IR.Status = ExportResults.Cancelled; return(IR); } } catch (DirectoryNotFoundException) { Error.Throw("Fatal Error", "Attempted to import a nonexistent ATCF DatFolder", ErrorSeverity.Error, 241); return(null); } catch (PathTooLongException) { Error.Throw("Error", "The path to the file is longer than 260 characters. Please shorten it.", ErrorSeverity.Error, 150); return(null); } catch (FormatException) { Error.Throw("Error", "Attempted to import a node with invalid pressure or intensity!", ErrorSeverity.Error, 401); return(null); } catch (OverflowException) { Error.Throw("Error", "Attempted to import a node with invalid pressure or intensity!", ErrorSeverity.Error, 402); return(null); } }
// 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); }