Example #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);
                }
            }
        }
 private void addItemsButton_Click(object sender, RoutedEventArgs e)
 {
     if (selectedItem != null && selectedNotAddedGeometryModelItems != null && selectedNotAddedGeometryModelItems.Count() > 0)
     {
         foreach (ModelItem item in selectedNotAddedGeometryModelItems)
         {
             dataStorage.CreateNewModelObject(selectedItem, item);
         }
         selectedItem.NotifyPropertyChanged();//Оповестить только один раз в конце!
         SetSelectedNotAddedGeometryModelItems();
     }
     EnableAddItemsButton();
 }
Example #3
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);
        }