/// <summary>
        /// Создание нового объекта-контейнера
        /// Без свойств
        /// ВЫЗЫВАЕТСЯ ПРИ СОЗДАНИИ НОВОЙ СТРУКТУРЫ ИЗ СОХРАНЕННЫХ НАБОРОВ ВЫБОРА
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="name"></param>
        public XML.St.Object CreateNewContainerObject(XML.St.Object parent, string name)
        {
            //Создание объекта
            XML.St.Object @object = new XML.St.Object()
            {
                Name                          = name,
                ClassCode                     = DefClassesWithNoProps[0].Code,
                NestedDisplayObjects          = new List <XML.St.Object>(),
                NestedGeometryObjectsCurrDoc  = new List <XML.St.Object>(),
                NestedGeometryObjectsOtherDoc = new List <XML.St.Object>(),
                ResetNestedObjects            = new List <XML.St.Object>()
            };

            if (parent != null)
            {
                //Добавление в соответствующие списки родителя
                parent.NestedObjects.Add(@object);
                parent.NestedDisplayObjects.Add(@object);
                parent.ResetNestedObjects.Add(@object);
            }
            else
            {
                //Объект добавляется в корень структуры
                Structure.NestedObjects.Add(@object);
            }

            return(@object);
        }
Example #2
0
        private void StructureFilling(XML.St.Object parent, SavedItem item, StructureDataStorage dataStorage, Document doc)
        {
            if (item is FolderItem)
            {
                FolderItem    folder    = item as FolderItem;
                XML.St.Object container = dataStorage.CreateNewContainerObject(parent, folder.DisplayName);
                foreach (SavedItem nestedItem in folder.Children)
                {
                    StructureFilling(container, nestedItem, dataStorage, doc);
                }
            }
            else if (item is SelectionSet)
            {
                SelectionSet selectionSet = item as SelectionSet;

                XML.St.Object container = dataStorage.CreateNewContainerObject(parent, selectionSet.DisplayName);

                ModelItemCollection itemsInSelection = selectionSet.GetSelectedItems();

                Search searchForAllIDs = new Search();
                searchForAllIDs.Selection.CopyFrom(itemsInSelection);
                searchForAllIDs.Locations = SearchLocations.DescendantsAndSelf;
                StructureDataStorage.ConfigureSearchForAllGeometryItemsWithIds(searchForAllIDs, false);
                ModelItemCollection selectedGeometry = searchForAllIDs.FindAll(doc, false);
                foreach (ModelItem modelItem in selectedGeometry)
                {
                    dataStorage.CreateNewModelObject(container, modelItem);
                }
            }
        }
        /// <summary>
        /// Обход объектов. Объекты геометрии текущего документа попадают в словарь
        /// УДАЛЕНИЕ ДУБЛИКАТОВ СВОЙСТВ если они есть в существующем XML
        /// </summary>
        /// <param name="object"></param>
        /// <returns></returns>
        private SurveyObjectResult SurveyObject(XML.St.Object @object)
        {
            @object.PropsCorrection();
            SurveyObjectResult result = SurveyObjectResult.RegularObject;

            if (String.IsNullOrEmpty(@object.Name) || String.IsNullOrEmpty(@object.ClassCode))
            {
                result = SurveyObjectResult.InvalidObject;
            }
            else if (@object.NestedObjects.Count == 0 && !String.IsNullOrEmpty(@object.SceneObjectId))
            {
                string[] splitted = @object.SceneObjectId.Split('|');
                if (splitted.Length > 1)
                {
                    string id = splitted[1];

                    if (AddedGeometryItemsLookUp.ContainsKey(id))
                    {
                        //Если есть объекты с дублирующимися id, то их нужно будет удалить
                        result = SurveyObjectResult.InvalidObject;
                    }
                    else
                    {
                        ModelItem item = SearchForIDInCurrDoc(id);
                        if (item != null && item.HasGeometry)
                        {
                            //Это объект геометрии этого документа
                            @object.NavisItem = item;
                            AddedGeometryItemsLookUp.Add(id, @object);
                            result = SurveyObjectResult.GeometryObjectCurrDoc;
                        }
                        else
                        {
                            //Видимо это объект геометрии добавленный в другом документе
                            result = SurveyObjectResult.GeometryObjectOtherDoc;
                        }
                    }
                }
            }

            if (result == SurveyObjectResult.RegularObject)
            {
                List <XML.St.Object> nestedObjectsValid;
                List <XML.St.Object> geometryObjectsCurrDoc;
                List <XML.St.Object> geometryObjectsOtherDoc;
                List <XML.St.Object> displayObjects;
                List <XML.St.Object> resetObjects;
                SurveyNestedObjects(@object.NestedObjects,
                                    out nestedObjectsValid, out geometryObjectsCurrDoc,
                                    out geometryObjectsOtherDoc, out displayObjects, out resetObjects);

                @object.NestedObjects                 = nestedObjectsValid;
                @object.NestedDisplayObjects          = displayObjects;          //больше не поменяются
                @object.NestedGeometryObjectsCurrDoc  = geometryObjectsCurrDoc;
                @object.NestedGeometryObjectsOtherDoc = geometryObjectsOtherDoc; //больше не поменяются
                @object.ResetNestedObjects            = resetObjects;            //может поменяться если удалять все объекты, включая те, что из других документов
            }

            return(result);
        }
        public void RemoveNestedObjectsOtherDocuments(XML.St.Object parent)
        {
            //Очистка списка вложенных из других документов
            parent.NestedGeometryObjectsOtherDoc = new List <XML.St.Object>();
            //Список сброса теперь не содержит объекты из других документов
            parent.ResetNestedObjects = new List <XML.St.Object>(parent.NestedDisplayObjects);
            //Общий список всех вложенных объектов теперь не содержит объекты из других документов
            parent.NestedObjects = parent.ResetNestedObjects.Concat(parent.NestedGeometryObjectsCurrDoc).ToList();

            parent.NotifyPropertyChanged();
        }
        /// <summary>
        /// Заполнение свойств объекта в соответствии с классами. Присвоение ссылки на класс. Создание класса если еще нет
        /// </summary>
        /// <param name="obj"></param>
        /// <param name="categories"></param>
        private void SetObjectProps(XML.St.Object obj, PropertyCategoryCollection categories, int defClassNum, int defClassLevelNum)
        {
            List <XML.Cl.Property> clProps = null;
            List <XML.St.Property> stProps = null;
            string actualKey = AnalizeNavisProps(categories, out clProps, out stProps);

            //Сначала присвоить правильный класс
            Class @class = null;

            //Проверить есть ли у объекта уже ссылка на класс
            if (!String.IsNullOrEmpty(obj.ClassCode))
            {
                //Найти этот класс
                ClassLookUpByCode.TryGetValue(obj.ClassCode, out @class);
                if (@class != null)
                {
                    //Если класс есть, то проверить его свойства
                    string currKey = GetClassKey(@class.Properties);
                    if (currKey == null || !currKey.Equals(actualKey))
                    {
                        //Если этот класс не подходит по свойствам, то он должен быть переназначен
                        @class = null;
                    }
                }
            }

            if (@class == null)
            {
                //Проверить есть ли класс подходящий по свойствам
                if (actualKey == null)
                {
                    //Свойств нет - присвоить дефолный класс без свойств
                    @class = DefClassesWithNoProps[defClassNum];
                }
                else
                {
                    //Поиск существующего класса подходящего по свойствам
                    ClassLookUpByProps.TryGetValue(actualKey, out @class);
                    if (@class == null)
                    {
                        //Подходящий класс не найден. Создать его
                        @class = CreateNewClass(Classifier.ClassName /*NEW_CLASS_NAME*/,
                                                Classifier.ClassName /*NEW_CLASS_NAME_IN_PLURAL*/,
                                                defClassLevelNum, actualKey, clProps);
                    }
                }
            }

            //Присвоить объекту ссылку на актуальный класс
            obj.ClassCode = @class.Code;

            //Задать свойства для объекта
            obj.Properties = stProps;
        }
        /// <summary>
        /// ВЫЗЫВАЕТСЯ НАЖАТИЕМ КНОПКИ В ОКНЕ
        /// Очистить узел от добавленных к нему объектов геометрии Navis
        /// </summary>
        /// <param name="parent"></param>
        public void ResetNestedObjects(XML.St.Object parent)
        {
            foreach (XML.St.Object obj in parent.NestedGeometryObjectsCurrDoc)
            {
                //Каждый объект геометрии удалить из словаря
                string[] splitted = obj.SceneObjectId.Split('|');
                string   id       = splitted[1];
                AddedGeometryItemsLookUp.Remove(id);
            }

            //Сброс списка вложенных
            parent.NestedObjects = new List <XML.St.Object>(parent.ResetNestedObjects);
            //Очистить список объектов геометрии
            parent.NestedGeometryObjectsCurrDoc = new List <XML.St.Object>();

            parent.NotifyPropertyChanged();
        }
        /// <summary>
        /// ВЫЗЫВАЕТСЯ НАЖАТИЕМ КНОПКИ В ОКНЕ
        /// Создает новый объект в дереве структуры и добавляет в словарь
        /// </summary>
        /// <param name="parent"></param>
        /// <param name="item"></param>
        public void CreateNewModelObject(XML.St.Object parent, ModelItem item)
        {
            string replacementName, baseName, exportName, strId;
            bool   contains = ItemAdded(item, out baseName, out exportName, out replacementName, out strId);

            if (strId == null)
            {
                //если id нет, то принять за id обычное имя
                strId           = baseName;
                replacementName = baseName;

                contains = AddedGeometryItemsLookUp.ContainsKey(strId);
                if (contains)
                {
                }
            }

            if (!contains /*&& strId != null*/)//Добавлять только если объект еще не был добавлен и имеет id
            {
                XML.St.Object @object = new XML.St.Object()
                {
                    Name          = !String.IsNullOrWhiteSpace(exportName) ? exportName : baseName,//replacementName - имя вместе с guid //baseName - имя в модели Navis. Оно не подходит так как может быть определено служебное свойство для имени при экспорте
                    SceneObjectId = replacementName,
                    NavisItem     = item,
                };

                //Настрока ссылки на класс и заполнение списка свойств в соответствии со свойствами Navis
                SetObjectProps(@object, item.PropertyCategories, 1, 1);

                //Добавление в соответствующие списки родителя
                if (parent != null)
                {
                    parent.NestedObjects.Add(@object);
                    parent.NestedGeometryObjectsCurrDoc.Add(@object);
                }
                else
                {
                    Structure.NestedObjects.Add(@object);
                }



                //Добавление в словарь поиска по id
                AddedGeometryItemsLookUp.Add(strId, @object);
            }
        }
Example #8
0
        public static int Execute(/*params string[] parameters*/)
        {
            try
            {
                Document            doc = Application.ActiveDocument;
                ModelItemCollection currSelectionColl = doc.CurrentSelection.SelectedItems;

                if (currSelectionColl.Count > 0)
                {
                    //Найти все объекты геометрии с id в текущем наборе выбора
                    Search searchForAllIDs = new Search();
                    searchForAllIDs.Selection.CopyFrom(currSelectionColl);
                    searchForAllIDs.Locations = SearchLocations.DescendantsAndSelf;
                    StructureDataStorage.ConfigureSearchForAllGeometryItemsWithIds(searchForAllIDs);
                    ModelItemCollection selectedGeometry = searchForAllIDs.FindAll(doc, false);
                    if (selectedGeometry.Count > 0)
                    {
                        //Указать имя файла структуры.
                        string initialPath     = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                        string initialFileName = "Кусок проекта";
                        string docFileName     = doc.FileName;
                        if (!String.IsNullOrEmpty(docFileName))
                        {
                            initialPath     = Path.GetDirectoryName(docFileName);
                            initialFileName = Path.GetFileNameWithoutExtension(docFileName) + "_PART";
                        }

                        WinForms.SaveFileDialog saveFileDialog = new WinForms.SaveFileDialog();
                        saveFileDialog.InitialDirectory = initialPath;
                        saveFileDialog.Filter           = "st.xml files (*.st.xml)|*.st.xml";
                        saveFileDialog.FilterIndex      = 1;
                        saveFileDialog.RestoreDirectory = true;
                        if (!String.IsNullOrWhiteSpace(initialFileName))
                        {
                            saveFileDialog.FileName = initialFileName;
                        }
                        saveFileDialog.Title = "Укажите файл для создания куска структуры";

                        if (saveFileDialog.ShowDialog() == WinForms.DialogResult.OK)
                        {
                            string stFilename = saveFileDialog.FileName;
                            string name       = Path.GetFileName(stFilename);
                            string clFilename = Path.Combine(Path.GetDirectoryName(stFilename),
                                                             name.Substring(0, name.Length - 6) + "cl.xml");

                            //пустой классификатор
                            Classifier classifier = new Classifier()
                            {
                                Name         = "PartialClassifier",
                                IsPrimary    = true,
                                DetailLevels = new List <string>()
                                {
                                    "Folder", "Geometry"
                                }
                            };
                            if (File.Exists(clFilename))
                            {
                                //TODO: Если там уже существует структура и классификатор,
                                //то сохранить классы из этого классификатора
                                //(лучше вывести еще MessageBox Yes/No использовать или нет)
                                Class tryReadClassifier = null;
                                try
                                {
                                    using (StreamReader sr = new StreamReader(clFilename))
                                    {
                                        string serializedData = Common.Utils.RemoveInvalidXmlSubstrs(sr.ReadToEnd());

                                        XmlSerializer xmlDeSerializer = new XmlSerializer(typeof(NavisWorksInfoTools.S1NF0_SOFTWARE.XML.Cl.Class));
                                        StringReader  stringReader    = new StringReader(serializedData);
                                        tryReadClassifier = (Class)xmlDeSerializer.Deserialize(stringReader);
                                    }
                                }
                                catch { }

                                if (tryReadClassifier != null)
                                {
                                    WinForms.DialogResult result = WinForms.MessageBox
                                                                   .Show("Использовать классы из файла <" + clFilename + ">?",
                                                                         "Сохранение предыдущих классов", WinForms.MessageBoxButtons.YesNo);
                                    if (result == WinForms.DialogResult.Yes)
                                    {
                                        classifier.NestedClasses = tryReadClassifier.NestedClasses;
                                    }
                                }
                            }

                            //пустая структура
                            Structure structure = new Structure()
                            {
                                Name       = "PartialStructure",
                                Classifier = classifier.Name,
                                IsPrimary  = true,
                            };



                            //Создать StructureDataStorage
                            //TODO: Нужно добавить выбор категорий!
                            StructureDataStorage dataStorage = new StructureDataStorage(
                                doc, stFilename, clFilename, structure, classifier, true);

                            //Напихать все объекты в StructureDataStorage сплошным списком
                            foreach (ModelItem item in selectedGeometry)
                            {
                                dataStorage.CreateNewModelObject(null, item);
                            }

                            //Создать пустой объект и пустой класс и в них передать соответственно объекты и классы из StructureDataStorage
                            string codeDummy = "_";
                            NavisWorksInfoTools.S1NF0_SOFTWARE.XML.Cl.Class partialClassifier = new Class()
                            {
                                Name = "partialClassifier", NameInPlural = "partialClassifiers", DetailLevel = "Folder", Code = codeDummy
                            };
                            partialClassifier.NestedClasses = dataStorage.Classifier.NestedClasses;
                            NavisWorksInfoTools.S1NF0_SOFTWARE.XML.St.Object partialStructure = new XML.St.Object()
                            {
                                Name      = "partialStructure",
                                ClassCode = codeDummy
                            };
                            partialStructure.NestedObjects = dataStorage.Structure.NestedObjects;

                            //Сериализовать
                            XmlSerializer xmlSerializer = new XmlSerializer(typeof(Class));
                            using (StreamWriter sw = new StreamWriter(clFilename))
                            {
                                xmlSerializer.Serialize(sw, partialClassifier);
                            }

                            xmlSerializer = new XmlSerializer(typeof(XML.St.Object));
                            using (StreamWriter sw = new StreamWriter(stFilename))
                            {
                                xmlSerializer.Serialize(sw, partialStructure);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                CommonException(ex, "Ошибка при создании куска структуры в Navis");
            }

            return(0);
        }
 private void structureTree_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs <object> e)
 {
     selectedItem = e.NewValue as XML.St.Object;
     EnableAddItemsButton();
     EnableRemoveItemsButton();
 }
 public void BeforeShow()
 {
     selectedItem = structureTree.SelectedItem as XML.St.Object;
     EnableAddItemsButton();
     EnableRemoveItemsButton();
 }