#region import libraries from System import DateTime, Double from System.Globalization import DateTimeFormatInfo from System.Collections.Generic import List, Dictionary from SharpMap import Map from SharpMap.Extensions.Layers import BingLayer from DelftTools.Utils.Csv.Importer import CsvSettings, CsvRequiredField, CsvColumnInfo, CsvMappingData from DelftTools.Functions import TimeSeries, ITimeSeries from DelftTools.Functions.Generic import Variable from DeltaShell.Plugins.CommonTools.Functions import TimeSeriesCsvFileImporter from DeltaShell.Plugins.ImportExport.Sobek import SobekHydroModelImporter #endregion #region generic functions def GetItemByName(list, name): for item in list: if item.Name == name: return item def substractLists(listA, listB, startIndex=0): if len(listA)!=len(listB): print "Error! Lists have different length and cannot be substracted" return if startIndex>len(listA): print "Error! startIndex is larger than length of lists" return i=startIndex diffList = [] for i in range(startIndex,len(listA)): diff = listA[i]-listB[i] diffList.append(diff) i+=1 return diffList #endregion #region import functions def GetHisFileTimeSeriesForLocation(filePath, locationName) : # create his file importer from DeltaShell.Sobek.Readers.Readers import * importer = HisFileReader(filePath) # show number of locations,components and TimeSteps header = importer.GetHisFileHeader print "Number of locations : " + str(header.Locations.Count) print "Number of components : " + str(header.Components.Count) print "Number of timesteps : " + str(header.TimeSteps.Count) # choose a component component = header.Components[0] print "Location : " + locationName + " -> component : " + component # read the data from the his file hisRowList = importer.ReadLocation(locationName, component) # create a new timeseries with double data series2 = TimeSeries() outputVariable = Variable[float](component) outputVariable.Name = "His file time series" series2.Components.Add(outputVariable) # add all data to the series for row in hisRowList : series2[row.TimeStep] = row.Value # release the his file importer.Close() return series2 def ImportCsvTimeSeries(path, timeColumnName, valueColumnName, dateTimePattern): csvSettings = CsvSettings() csvSettings.Delimiter = "," csvSettings.FirstRowIsHeader = True csvSettings.SkipEmptyLines = True datetimeFormat = DateTimeFormatInfo() datetimeFormat.DateSeparator = "-" datetimeFormat.TimeSeparator = ":" datetimeFormat.FullDateTimePattern = dateTimePattern mapping = Dictionary[CsvRequiredField, CsvColumnInfo]() mapping.Add(CsvRequiredField(timeColumnName, DateTime().GetType()), CsvColumnInfo(0, datetimeFormat)) mapping.Add(CsvRequiredField(valueColumnName, Double().GetType()), CsvColumnInfo(1, None)) mappingData = CsvMappingData() mappingData.Settings = csvSettings mappingData.FieldToColumnMapping = mapping importer = TimeSeriesCsvFileImporter() importer.ImportIntoSingleFunction = True importer.CsvMappingData = mappingData return List[ITimeSeries](importer.ImportTimeSeries(path))[0] def ImportSobek2Model(Path,useRR=True, useFLOW=True, useRTC=True, useWAQ=True): # function to import Sobek 2.x model for path, selecting different modules importer = SobekHydroModelImporter() importer.PathSobek = Path # override standard settings for importing models (import all) importer.useRR = useRR importer.useFlow = useFLOW importer.useRTC = useRTC importer.useWaq = useWAQ # show the models that will be imported print "Import waterflow model : " + str(importer.useFlow) print "Import rainfall runoff model : " + str(importer.useRR) print "Import RTC model : " + str(importer.useRTC) print "Import waterquality model : " + str(importer.useWaq) importer.Import() return importer.TargetObject #endregion #region view functions def OpenModelMapViewWithBackground(model): Gui.DocumentViewsResolver.OpenViewForData(model) view = Gui.DocumentViews[Gui.DocumentViews.Count-1] map = view.MapView.Map map.CoordinateSystem = Map.CoordinateSystemFactory.CreateFromEPSG(3857) # webmercator # Add background (Satellite image) map layer = BingLayer() layer.Name = "Satellite Hybrid (Bing Maps)" map.Layers.Add(layer) map.ZoomToExtents() #endregion