#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
  • No labels