/// <summary> /// This is the method that actually does the work. /// </summary> /// <param name="DA">The DA object is used to retrieve from inputs and store in outputs.</param> protected override void SolveInstance(IGH_DataAccess DA) { int sleeptime = 1500; if (!DA.GetData(3, ref sleeptime)) { sleeptime = 1500; } int folderint = 0; if (!DA.GetData(4, ref folderint)) { folderint = 0; } string path_in = @"c:\eplus\EPOpti17\Input" + folderint + @"\"; string path_out = @"c:\eplus\EPOpti17\Output" + folderint + @"\"; string eplusexe = @"c:\eplus\EPOpti17\Input" + folderint + @"\ep\energyplus.exe"; //get idf and weather files string idffile = @"blabla"; if (!DA.GetData(0, ref idffile)) { return; } string weatherfile = @"blabla"; if (!DA.GetData(1, ref weatherfile)) { return; } //RUN SIMU bool runit = false; if (!DA.GetData(2, ref runit)) { return; } //get input parameters int dvar = 13; double[] x = new double[dvar]; for (int i = 0; i < x.Length; i++) { if (!DA.GetData(i + 6, ref x[i])) { return; } } ; if (runit == true) { //*********************************************************************************** //*********************************************************************************** //*********************************************************************************** //modify idf file with parameters and save as new idf file string idfmodified = idffile + "_modi"; //load idf into a huge string string[] lines; var list = new List <string>(); var fileStream = new FileStream(path_in + idffile + ".idf", FileMode.Open, FileAccess.Read); using (var streamReader = new StreamReader(fileStream)) { string line; while ((line = streamReader.ReadLine()) != null) { list.Add(line); } } lines = list.ToArray(); fileStream.Close(); //to be replaced string[] replacethis = new string[dvar + 1]; for (int i = 0; i < replacethis.Length; i++) { replacethis[i] = @"%" + i.ToString() + @"%"; } //replacers string[] replacers = new string[replacethis.Length]; for (int i = 0; i < dvar; i++) { replacers[i] = x[i].ToString(); } replacers[13] = (x[8] * 0.0006875 - 0.00025).ToString(); //constraints bool[] gx = new bool[4]; //true means constraint violation if (x[0] - x[1] + 0.5488 >= 0) { gx[0] = true; } if (x[2] - x[3] + 0.5488 >= 0) { gx[1] = true; } if (x[4] - x[5] + 0.5488 >= 0) { gx[2] = true; } if (x[6] - x[7] + 0.5488 >= 0) { gx[3] = true; } //scan string for keywords and replace them with parameters for (int i = 0; i < lines.Length; i++) { for (int u = 0; u < replacethis.Length; u++) { lines[i] = lines[i].Replace(replacethis[u], replacers[u]); } } //write a new idf file File.WriteAllLines(path_in + idfmodified + ".idf", lines); string idffilenew = path_in + idfmodified + ".idf"; string weatherfilein = path_in + @"ep\WeatherData\" + weatherfile + ".epw"; //*********************************************************************************** //*********************************************************************************** //*********************************************************************************** //run eplus string command = @" -w " + weatherfilein + @" -d " + path_out + @" " + idffilenew; Misc.RunEplus(eplusexe, command); //*********************************************************************************** //*********************************************************************************** //*********************************************************************************** //process Outputs string outputfile = "eplustbl.csv"; while (!File.Exists(path_out + outputfile)) { Console.WriteLine("waiting"); } //output result double result = double.NaN; //identify correct result file. load it. get the right numbers from it lines = new string[] { }; list = new List <string>(); fileStream = new FileStream(path_out + outputfile, FileMode.Open, FileAccess.Read); using (var streamReader = new StreamReader(fileStream)) { string line; while ((line = streamReader.ReadLine()) != null) { list.Add(line); } } lines = list.ToArray(); fileStream.Close(); double Fx; string[] split; char delimiter = ','; split = lines[16].Split(delimiter); string MJm2 = split[4]; Fx = (Convert.ToDouble(gx[0]) * 0.5 + Convert.ToDouble(gx[1]) * 0.5 + Convert.ToDouble(gx[2]) * 0.5 + Convert.ToDouble(gx[3]) * 0.5 + 1) * Convert.ToDouble(MJm2); result = Fx; System.Threading.Thread.Sleep(sleeptime); System.IO.File.Delete(path_in + idfmodified + ".idf"); System.IO.DirectoryInfo di = new DirectoryInfo(path_out); foreach (FileInfo file in di.GetFiles()) { file.Delete(); } foreach (DirectoryInfo dir in di.GetDirectories()) { dir.Delete(true); } DA.SetData(0, result); } }