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); } } }
public StructureWindow(StructureDataStorage dataStorage) { finalClose = false; this.dataStorage = dataStorage; InitializeComponent(); }
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); }
public override int Execute(params string[] parameters) { try { Document doc = Application.ActiveDocument; DocumentSelectionSets selectionSets = doc.SelectionSets; FolderItem rootFolderItem = selectionSets.RootItem; List <FolderItem> folders = new List <FolderItem>(); foreach (SavedItem item in rootFolderItem.Children) { if (item is FolderItem) { folders.Add(item as FolderItem); } } if (folders.Count == 0) { WinForms.MessageBox.Show("Для работы этой команды необходимо наличие папок с сохраненными наборами выбора", "Отменено", WinForms.MessageBoxButtons.OK); return(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); } //Вывести окно для выбора корневой папки для формирования структуры SelectRootFolderWindow selectRootFolderWindow = new SelectRootFolderWindow(folders, true, initialPath); bool?result = selectRootFolderWindow.ShowDialog(); if (result != null && result.Value) { FolderItem rootFolder = selectRootFolderWindow.RootFolder; //Запросить имя и путь создаваемого файла структуры 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 = null; if (selectRootFolderWindow.ViewModel.ClassifierSamplePathVM.FileNameIsValid) { //Если был указан образец структуры, то десериализовать его //и использовать как основу для для создаваемого классификатора using (StreamReader sr = new StreamReader( selectRootFolderWindow.ViewModel.ClassifierSamplePathVM.FileName)) { 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"; } } else { //пустой классификатор classifier = new Classifier() { Name = rootFolder.DisplayName, ClassName = rootFolder.DisplayName, IsPrimary = true, DetailLevels = new List <string>() { "Folder", "Geometry" } }; classifier.DefaultClasses[0] = rootFolder.DisplayName + "_DefaultFolder"; classifier.DefaultClasses[1] = rootFolder.DisplayName + "_DefaultGeometry"; } //Создать пустую структуру Structure structure = new Structure() { Name = rootFolder.DisplayName, Classifier = classifier.Name, IsPrimary = true, }; //Создать StructureDataStorage StructureDataStorage dataStorage = new StructureDataStorage( doc, stFilename, clFilename, structure, classifier, true, selectRootFolderWindow.SelectedCategories); //Сформировать XML по структуре папок //Каждая папка - объект без свойств StructureFilling(null, rootFolder, dataStorage, doc); dataStorage.SerializeStruture(); WinForms.MessageBox.Show("Данные сохранены", "Готово", WinForms.MessageBoxButtons.OK); } } } catch (Exception ex) { CommonException(ex, "Ошибка при создании файлов структуры из наборов выбора"); } return(0); }