/// <summary>Generate multi-species quality report.</summary> /// <param name="msxBin">Name of the MSX simulation output file.</param> /// <param name="net">Hydraulic network.</param> /// <param name="netMsx">MSX network.</param> /// <param name="tk2">Hydraulic network - MSX bridge.</param> /// <param name="values">Species report flag.</param> public void CreateMsxReport(string msxBin, EpanetNetwork net, EpanetMSX netMsx, EnToolkit2 tk2, bool[] values) { Rtime = 0; var nodes = netMsx.Network.Node; var links = netMsx.Network.Link; string[] nSpecies = netMsx.GetSpeciesNames(); int reportCount = (int)((net.Duration - net.RStart) / net.RStep) + 1; var reader = new MsxReader( nodes.Length - 1, links.Length - 1, nSpecies.Length, netMsx.ResultsOffset); int totalSpecies = values == null ? nSpecies.Length : values.Count(b => b); reader.Open(msxBin); var nodesHead = new object[nSpecies.Length + 1]; nodesHead[0] = _sheet.TransposedMode ? "Node/Time" : "Time/Node"; var linksHead = new object[nSpecies.Length + 1]; linksHead[0] = _sheet.TransposedMode ? "Link/Time" : "Time/Link"; int count = 1; for (int i = 0; i < nSpecies.Length; i++) { if (values == null || values[i]) { nodesHead[count] = nSpecies[i]; linksHead[count++] = nSpecies[i]; } } var nodeRow = new object[totalSpecies + 1]; for (int i = 1; i < nodes.Length; i++) { if (!nodes[i].Rpt) { continue; } var spr = _sheet.NewSpreadsheet("Node<<" + tk2.ENgetnodeid(i) + ">>"); spr.AddHeader(nodesHead); for (long time = net.RStart, period = 0; time <= net.Duration; time += net.RStep, period++) { nodeRow[0] = time.GetClockTime(); for (int j = 0, ji = 0; j < nSpecies.Length; j++) { if (values == null || values[j]) { nodeRow[ji++ + 1] = reader.GetNodeQual((int)period, i, j + 1); } } spr.AddData(nodeRow); } } var linkRow = new object[totalSpecies + 1]; for (int i = 1; i < links.Length; i++) { if (!links[i].Rpt) { continue; } var spr = _sheet.NewSpreadsheet("Link<<" + tk2.ENgetlinkid(i) + ">>"); spr.AddHeader(linksHead); for (long time = net.RStart, period = 0; time <= net.Duration; time += net.RStep, period++) { linkRow[0] = time.GetClockTime(); for (int j = 0, ji = 0; j < nSpecies.Length; j++) { if (values == null || values[j]) { linkRow[ji++ + 1] = reader.GetLinkQual((int)period, i, j + 1); } } spr.AddData(linkRow); } } reader.Close(); }
/// <summary>Report options dialog constructor.</summary> public ReportOptions(string inpFile, string msxFile) : this() { if (inpFile == null) { return; } _fileInp = inpFile; _net = new EpanetNetwork(); try { InputParser inpParser; string extension = Path.GetExtension(inpFile); switch (extension.ToLowerInvariant()) { case ".inp": inpParser = new InpParser(); break; case ".net": inpParser = new NetParser(); break; case ".xml": inpParser = new XmlParser(false); break; case ".gz": inpParser = new XmlParser(true); break; default: inpParser = new InpParser(); break; } _net = inpParser.Parse(new EpanetNetwork(), inpFile); } catch (ENException ex) { MessageBox.Show( ex.Message + "\nCheck epanet.log for detailed error description", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (msxFile == null) { return; } _fileMsx = msxFile; _epanetTk = new EnToolkit2(_net); _netMsx = new EpanetMSX(_epanetTk); try { ErrorCodeType ret = _netMsx.Load(_fileMsx); if (ret != 0) { MessageBox.Show("MSX parsing error " + ret, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); _fileMsx = null; _netMsx = null; _epanetTk = null; } } catch (IOException) { MessageBox.Show( "IO error while reading the MSX file", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); _fileMsx = null; _netMsx = null; _epanetTk = null; } }