/// <summary> /// Generate our one-line /// </summary> /// <param name="Substation"></param> /// <param name="TargetDirectory"></param> /// <returns></returns> public void GenerateOneLine(Sim_Substation Substation, String TargetDirectory) { //First, build our list of buses and connected equipment Dictionary <Sim_Bus, List <Sim_Element> > Elements = new Dictionary <Sim_Bus, List <Sim_Element> >(); Dictionary <Sim_Bus, int> ElementRight = new Dictionary <Sim_Bus, int>(); foreach (Sim_Bus Bus in Substation.Elements.OfType <Sim_Bus>()) { Elements.Add(Bus, new List <Sim_Element>()); } foreach (Sim_Element Elem in Substation.Elements) { if (Elem is Sim_Transformer) { Sim_TransformerWinding Winding1 = ((Sim_Transformer)Elem).Winding1; Sim_TransformerWinding Winding2 = ((Sim_Transformer)Elem).Winding2; if (Elements.ContainsKey(Winding1.Bus) && !Elements[Winding1.Bus].Contains(Winding1)) { Elements[Winding1.Bus].Add(Winding1); } if (Elements.ContainsKey(Winding2.Bus) && !Elements[Winding2.Bus].Contains(Winding2)) { Elements[Winding2.Bus].Add(Winding2); } } else if (Elem is Sim_Bus == false) { Sim_Bus Bus = Elem.GetBuses()[0]; if (Elements.ContainsKey(Bus) && !Elements[Bus].Contains(Elem)) { Elements[Bus].Add(Elem); } } } using (StreamWriter sW = new StreamWriter(Path.Combine(Config.OneLineFolder, Substation.Name + ".MM_OneLine"), false, new UTF8Encoding(false))) { sW.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>"); sW.WriteLine($"<One_Line BaseElement.ElemType=\"Substation\" BaseElement.TEID=\"{Substation.TEID}\" BaseElement.ConnectedLines=\"\" BaseElement.County=\"{Substation.Parent.Name}\" BaseElement.DisplayName=\"{Substation.Name}\" BaseElement.{Substation.ElemTypes} BaseElement.{Substation.KVLevels} BaseElement.Latitude=\"{Substation.Latitude}\" BaseElement.LatLong=\"{Substation.Latitude},{Substation.Longitude}\" BaseElement.Longitude=\"{Substation.Longitude}\" BaseElement.Operator=\"{Substation.Operator.TEID}\" BaseElement.Owner=\"{Substation.Owner.TEID}\" BaseElement.Permitted=\"true\" Font=\"Microsoft Sans Serif, 8.25pt\" BaseElement.Name=\"{Substation.Name}\" BaseElement.LongName=\"{Substation.Name}\">"); //Now, determine the Y coordinate of the bus int YVal = 50; foreach (Sim_Bus Bus in Elements.Keys) { Bus.Y = YVal; YVal += 50; } sW.WriteLine("<Elements>"); foreach (KeyValuePair <Sim_Bus, List <Sim_Element> > kvp in Elements) { int XVal = 50; foreach (Sim_Element Elem in kvp.Value) { if (Elem is Sim_TransformerWinding) { sW.WriteLine(((Sim_TransformerWinding)Elem).Transformer.GetOneLineXml(ref XVal, kvp.Key.Y)); } else { sW.WriteLine(Elem.GetOneLineXml(ref XVal, kvp.Key.Y)); } } ElementRight.Add(kvp.Key, XVal); } sW.WriteLine("</Elements>"); sW.WriteLine("<Nodes>"); foreach (Sim_Bus Bus in Elements.Keys) { int XVal = 25; Bus.XWidth = ElementRight[Bus]; sW.WriteLine(Bus.GetOneLineXml(ref XVal, Bus.Y)); } sW.WriteLine("</Nodes>"); sW.WriteLine("</One_Line>"); } }