/// <summary> /// Загрузить представление из потока. /// </summary> public override void LoadFromStream(Stream stream) { // clear the view Clear(); // load component bindings if (string.IsNullOrEmpty(templateArgs.BindingFileName)) { templateBindings = null; } else { templateBindings = new TemplateBindings(); templateBindings.Load(System.IO.Path.Combine( SchemeContext.GetInstance().AppDirs.ConfigDir, templateArgs.BindingFileName)); } // load XML document XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(stream); // check data format XmlElement rootElem = xmlDoc.DocumentElement; if (!rootElem.Name.Equals("SchemeView", StringComparison.OrdinalIgnoreCase)) { throw new ScadaException(SchemePhrases.IncorrectFileFormat); } // get channel offsets in template mode int inCnlOffset = templateArgs.InCnlOffset; int ctrlCnlOffset = templateArgs.CtrlCnlOffset; // load scheme document if (rootElem.SelectSingleNode("Scheme") is XmlNode schemeNode) { SchemeDoc.LoadFromXml(schemeNode); // установка заголовка представления Title = SchemeDoc.Title; // добавление входных каналов представления foreach (int cnlNum in SchemeDoc.CnlFilter) { if (cnlNum > 0) { AddCnlNum(cnlNum + inCnlOffset); } } } // load scheme components if (rootElem.SelectSingleNode("Components") is XmlNode componentsNode) { HashSet <string> errNodeNames = new HashSet <string>(); // имена узлов незагруженных компонентов CompManager compManager = CompManager.GetInstance(); LoadErrors.AddRange(compManager.LoadErrors); SortedDictionary <int, ComponentBinding> componentBindings = templateBindings?.ComponentBindings; foreach (XmlNode compNode in componentsNode.ChildNodes) { // создание компонента BaseComponent component = compManager.CreateComponent(compNode, out string errMsg); if (component == null) { component = new UnknownComponent { XmlNode = compNode }; if (errNodeNames.Add(compNode.Name)) { LoadErrors.Add(errMsg); } } // загрузка компонента и добавление его в представление component.SchemeView = this; component.LoadFromXml(compNode); Components[component.ID] = component; // добавление входных каналов представления if (component is IDynamicComponent dynamicComponent) { if (componentBindings != null && componentBindings.TryGetValue(component.ID, out ComponentBinding binding)) { dynamicComponent.InCnlNum = binding.InCnlNum; dynamicComponent.CtrlCnlNum = binding.CtrlCnlNum; } else { if (inCnlOffset > 0 && dynamicComponent.InCnlNum > 0) { dynamicComponent.InCnlNum += inCnlOffset; } if (ctrlCnlOffset > 0 && dynamicComponent.CtrlCnlNum > 0) { dynamicComponent.CtrlCnlNum += ctrlCnlOffset; } } AddCnlNum(dynamicComponent.InCnlNum); AddCtrlCnlNum(dynamicComponent.CtrlCnlNum); } // определение макс. идентификатора компонентов if (component.ID > maxComponentID) { maxComponentID = component.ID; } } } // load scheme images if (rootElem.SelectSingleNode("Images") is XmlNode imagesNode) { Dictionary <string, Image> images = SchemeDoc.Images; XmlNodeList imageNodes = imagesNode.SelectNodes("Image"); foreach (XmlNode imageNode in imageNodes) { Image image = new Image(); image.LoadFromXml(imageNode); if (!string.IsNullOrEmpty(image.Name)) { images[image.Name] = image; } } } }
/// <summary> /// Initializes the static data of the class. /// </summary> static SchemeContext() { instance = new SchemeContext(); }