/// <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); }
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); } }
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(); }