Beispiel #1
0
        /// <summary>
        /// Добавить компоненты в словари
        /// </summary>
        private bool AddComponents(ISchemeComp schemeComp, AttrTranslator attrTranslator)
        {
            CompLibSpec compLibSpec = schemeComp.CompLibSpec;
            string      errMsg;

            if (compLibSpec != null)
            {
                if (compLibSpec.Validate(out errMsg) && compLibSpec.CompFactory != null)
                {
                    allSpecs.Add(compLibSpec);
                    factsByPrefix[compLibSpec.XmlPrefix] = compLibSpec.CompFactory;

                    foreach (CompItem compItem in compLibSpec.CompItems)
                    {
                        if (compItem != null && compItem.CompType != null)
                        {
                            specsByType[compItem.CompType.FullName] = compLibSpec;
                            if (attrTranslator != null)
                            {
                                attrTranslator.TranslateAttrs(compItem.CompType);
                            }
                        }
                    }

                    return(true);
                }
                else if (!string.IsNullOrEmpty(errMsg))
                {
                    LoadErrors.Add(errMsg);
                }
            }

            return(false);
        }
Beispiel #2
0
        /// <summary>
        /// Получить спецификации библиотек, отсортированные по заголовкам групп
        /// </summary>
        public CompLibSpec[] GetSortedSpecs()
        {
            int specCnt = allSpecs.Count;

            string[]      headers = new string[specCnt];
            CompLibSpec[] specs   = new CompLibSpec[specCnt];

            for (int i = 0; i < specCnt; i++)
            {
                CompLibSpec spec = allSpecs[i];
                headers[i] = spec.GroupHeader;
                specs[i]   = spec;
            }

            Array.Sort(headers, specs);
            return(specs);
        }
Beispiel #3
0
        /// <summary>
        /// Сохранить схему в файле
        /// </summary>
        public bool SaveToFile(string fileName, out string errMsg)
        {
            try
            {
                XmlDocument    xmlDoc  = new XmlDocument();
                XmlDeclaration xmlDecl = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null);
                xmlDoc.AppendChild(xmlDecl);

                // запись заголовка представления
                XmlElement rootElem = xmlDoc.CreateElement("SchemeView");
                rootElem.SetAttribute("title", SchemeDoc.Title);
                xmlDoc.AppendChild(rootElem);

                // пока используется старый формат файла
                // запись документа схемы
                XmlElement documentElem = xmlDoc.CreateElement("Scheme");
                rootElem.AppendChild(documentElem);
                SchemeDoc.SaveToXml(documentElem);

                // запись компонентов схемы
                CompManager      compManager    = CompManager.GetInstance();
                HashSet <string> prefixes       = new HashSet <string>();
                XmlElement       componentsElem = xmlDoc.CreateElement("Components");
                rootElem.AppendChild(componentsElem);

                foreach (BaseComponent component in Components.Values)
                {
                    if (component is UnknownComponent)
                    {
                        componentsElem.AppendChild(((UnknownComponent)component).XmlNode);
                    }
                    else
                    {
                        Type        compType    = component.GetType();
                        CompLibSpec compLibSpec = compManager.GetSpecByType(compType);

                        // добавление пространства имён
                        if (compLibSpec != null && !prefixes.Contains(compLibSpec.XmlPrefix))
                        {
                            rootElem.SetAttribute("xmlns:" + compLibSpec.XmlPrefix, compLibSpec.XmlNs);
                            prefixes.Add(compLibSpec.XmlPrefix);
                        }

                        // создание XML-элемента компонента
                        XmlElement componentElem = compLibSpec == null?
                                                   xmlDoc.CreateElement(compType.Name) /*стандартный компонент*/ :
                                                       xmlDoc.CreateElement(compLibSpec.XmlPrefix, compType.Name, compLibSpec.XmlNs);

                        componentsElem.AppendChild(componentElem);
                        component.SaveToXml(componentElem);
                    }
                }

                // запись изображений схемы
                XmlElement imagesElem = xmlDoc.CreateElement("Images");
                rootElem.AppendChild(imagesElem);

                foreach (Image image in SchemeDoc.Images.Values)
                {
                    XmlElement imageElem = xmlDoc.CreateElement("Image");
                    imagesElem.AppendChild(imageElem);
                    image.SaveToXml(imageElem);
                }

                // запись фильтра по входным каналам
                XmlElement cnlsFilterElem = xmlDoc.CreateElement("CnlsFilter");
                cnlsFilterElem.InnerText = SchemeDoc.CnlFilter.CnlFilterToString();
                rootElem.AppendChild(cnlsFilterElem);

                xmlDoc.Save(fileName);
                errMsg = "";
                return(true);
            }
            catch (Exception ex)
            {
                errMsg = SchemePhrases.SaveSchemeViewError + ": " + ex.Message;
                return(false);
            }
        }