Esempio n. 1
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);
                }
            }
        }
Esempio n. 2
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);
        }
        public override int Execute(params string[] parameters)
        {
            try
            {
                Document doc = Application.ActiveDocument;

                if (DataStorage == null)
                {
                    string initialPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
                    string docFileName = doc.FileName;
                    if (!String.IsNullOrEmpty(docFileName))
                    {
                        initialPath = Path.GetDirectoryName(docFileName);
                    }


                    //выбрать два файла st.xml и cl.xml
                    WinForms.OpenFileDialog ofd1 = new WinForms.OpenFileDialog();
                    ofd1.InitialDirectory = initialPath;
                    ofd1.Filter           = ".st.xml files (*.st.xml)|*.st.xml";
                    ofd1.FilterIndex      = 1;
                    ofd1.RestoreDirectory = true;
                    ofd1.Title            = "Выберите файл структуры модели " + S1NF0_APP_NAME;

                    if (ofd1.ShowDialog() == WinForms.DialogResult.OK)
                    {
                        string stFilename = ofd1.FileName;
                        initialPath = Path.GetDirectoryName(stFilename);

                        WinForms.OpenFileDialog ofd2 = new WinForms.OpenFileDialog();
                        ofd2.InitialDirectory = initialPath;
                        ofd2.Filter           = ".cl.xml files (*.cl.xml)|*.cl.xml";
                        ofd2.FilterIndex      = 1;
                        ofd2.RestoreDirectory = true;
                        ofd2.Title            = "Выберите файл классификатора модели " + S1NF0_APP_NAME;

                        if (ofd2.ShowDialog() == WinForms.DialogResult.OK)
                        {
                            string clFilename = ofd2.FileName;

                            //Десериализовать
                            Structure structure = null;
                            using (StreamReader sr = new StreamReader(stFilename))
                            {
                                string serializedData = Common.Utils.RemoveInvalidXmlSubstrs(sr.ReadToEnd());

                                XmlSerializer xmlSerializer = new XmlSerializer(typeof(Structure));
                                StringReader  stringReader  = new StringReader(serializedData);
                                structure = (Structure)xmlSerializer.Deserialize(stringReader);
                            }

                            Classifier classifier = null;
                            using (StreamReader sr = new StreamReader(clFilename))
                            {
                                string serializedData = Common.Utils.RemoveInvalidXmlSubstrs(sr.ReadToEnd());

                                XmlSerializer xmlSerializer = new XmlSerializer(typeof(Classifier));
                                StringReader  stringReader  = new StringReader(serializedData);
                                classifier                   = (Classifier)xmlSerializer.Deserialize(stringReader);
                                classifier.ClassName         = classifier.Name;
                                classifier.DefaultClasses[0] = classifier.Name + "_DefaultFolder";
                                classifier.DefaultClasses[1] = classifier.Name + "_DefaultGeometry";
                            }

                            DataStorage = new StructureDataStorage(doc, stFilename, clFilename, structure, classifier);

                            startEditXML = true;
                        }
                    }
                }

                if (DataStorage != null)
                {
                    //StructureWindow structureWindow = new StructureWindow(DataStorage);
                    StructureWindow structureWindow = DataStorage.StructureWindow;
                    //Изучается набор выбора на наличие объектов геометрии
                    //Объекты геометрии передаются в свойство StructureWindow.SelectedGeometryModelItems
                    IEnumerable <ModelItem> geometryItems = null;
                    if (startEditXML)
                    {
                        //Для того, чтобы не увеличивать время ожидания при начале редактирования XML
                        //Принудительно настроить выбор объектов на те объекты, которые были не скрыты в начале редактирования
                        //doc.CurrentSelection.CopyFrom(DataStorage.AllItemsLookup.Values);//выглядит не очень красиво
                        doc.CurrentSelection.Clear();//Просто сбросить текущий выбор
                        geometryItems = DataStorage.AllItemsLookup.Values;
                        startEditXML  = false;
                    }
                    else
                    {
                        ModelItemCollection currSelectionColl = doc.CurrentSelection.SelectedItems;
                        int n = 50000;
                        //Проверит, что выбрано не более n конечных геометрических элементов
                        Search searchForAllIDs = new Search();
                        searchForAllIDs.Selection.CopyFrom(currSelectionColl);
                        searchForAllIDs.Locations = SearchLocations.DescendantsAndSelf;

                        StructureDataStorage.ConfigureSearchForAllGeometryItemsWithIds(searchForAllIDs);
                        ModelItemCollection selectedGeometry = searchForAllIDs.FindAll(doc, false);
                        int nSel = selectedGeometry.Count;
                        if (nSel > n)
                        {
                            doc.CurrentSelection.CopyFrom(selectedGeometry);
                            WinForms.DialogResult dialogResult = WinForms.MessageBox.Show("Вы выбрали очень большое количество конечных геометрических элементов - " + nSel
                                                                                          + ". Это приведет к большой задержке в работе программы. Продолжить?", "Предупреждение",
                                                                                          WinForms.MessageBoxButtons.YesNo, WinForms.MessageBoxIcon.Warning);
                            if (dialogResult == WinForms.DialogResult.No)
                            {
                                return(0);
                            }
                        }

                        #region Найти все конечные геометрические элементы с id с помощью Search API. Нельзя настроить на поиск только не скрытых элементов

                        /*
                         * Search searchForAllIDs = new Search();
                         * searchForAllIDs.Selection.CopyFrom(currSelectionColl);
                         * searchForAllIDs.Locations = SearchLocations.DescendantsAndSelf;
                         *
                         * DataStorage.ConfigureSearchForAllNotHiddenGeometryItemsWithIds(searchForAllIDs);
                         * ModelItemCollection selectedGeometry = searchForAllIDs.FindAll(doc, false);
                         *
                         *
                         * if (!DataStorage.AllNotHiddenGeometryModelItems.IsSelected(selectedGeometry))
                         * {
                         *  WinForms.MessageBox.Show("Выбраны объекты, которые были скрыты при начале редактирования XML");
                         *  return 0;
                         * }
                         *
                         *
                         * List<ModelItem> geometryItems = new List<ModelItem>();
                         * selectedGeometry.CopyTo(geometryItems);//ЗДЕСЬ БУДЕТ ЗАДЕРЖКА
                         * //foreach (ModelItem item in selectedGeometry)
                         * //{
                         * //    geometryItems.Add(item);
                         * //}
                         */
                        #endregion


                        //Начать поиск элементов с id
                        currSelectionColl = new ModelItemCollection(currSelectionColl);
                        currSelectionColl.MakeDisjoint();//Убрать все вложенные объекты
                        geometryItems = new List <ModelItem>();
                        RecurseSearchForAllNotHiddenGeometryItemsWithIdsContainedInBaseLookup
                            (currSelectionColl, (List <ModelItem>)geometryItems, DataStorage.AllItemsLookup);
                    }



                    structureWindow.SelectedGeometryModelItems = geometryItems;
                    //Открывается окно StructureWindow
                    structureWindow.BeforeShow();
                    structureWindow.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                CommonException(ex, "Ошибка при задании файла структуры " + S1NF0_APP_NAME);
            }

            return(0);
        }