Esempio n. 1
0
        /// <summary>
        /// Dump all properties from the given model item
        /// </summary>
        public static void DumpProperties(ModelItem mi)
        {
            // inspired by sample code from
            // 'Navisworks .NET API Properties' by Xiaodong Liang
            // https://adndevblog.typepad.com/aec/2012/05/navisworks-net-api-properties.html

            PropertyCategoryCollection pcs = mi.PropertyCategories;
            int n = pcs.Count <PropertyCategory>();

            Debug.Print("{0} property categories:", n);
            foreach (PropertyCategory pc in pcs)
            {
                Debug.Print("{0} ({1})", pc.DisplayName, pc.Name);

                foreach (DataProperty dp in pc.Properties)
                {
                    VariantData     v = dp.Value;
                    VariantDataType t = v.DataType;

                    Debug.Print("  {0} ({1}) = {2} ({3})",
                                dp.DisplayName, dp.Name,
                                GetPropertyValue(dp, true), t.ToString());
                }
            }
        }
Esempio n. 2
0
        public static SearchAndItems SAIsearch(SavedItem item)
        {
            ModelItemCollection mod_col      = ((SelectionSet)item).GetSelectedItems();
            SearchAndItems      SAI          = new SearchAndItems();
            List <Guid>         output_guids = new List <Guid>();
            HashSet <string>    unic_cats    = new HashSet <string>();
            string cat = null;

            if (mod_col != null)
            {
                foreach (ModelItem mditem in mod_col)
                {
                    Guid item_guid = FindGuid(mditem);
                    if (item_guid.ToString() != "00000000-0000-0000-0000-000000000000")
                    {
                        PropertyCategoryCollection mitem_property = mditem.GetUserFilteredPropertyCategories();                                   //свойства объекта для получения его категории, и поиска в категории окон и дверей, следующий номер за количеством папок в Q
                        DataProperty mitem_dataprop = mitem_property.FindPropertyByName("LcRevitData_Element", "LcRevitPropertyElementCategory"); //
                        if (mitem_dataprop != null)
                        {
                            unic_cats.Add(mitem_dataprop.Value.ToDisplayString());
                        }
                    }
                    output_guids.Add(item_guid);
                }
                if (unic_cats.Count == 1 && (unic_cats.Contains("Окна") || unic_cats.Contains("Двери")))
                {
                    cat = "ОкнаДвери";
                }
                //#endregion

                SAI.WriteData(item.DisplayName, output_guids, cat);
            }
            return(SAI);
        }
        /// <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="categories"></param>
        /// <param name="clProps"></param>
        /// <param name="stProps"></param>
        /// <returns></returns>
        private string AnalizeNavisProps(PropertyCategoryCollection categories,
                                         out List <XML.Cl.Property> clProps, out List <XML.St.Property> stProps)
        {
            clProps = new List <XML.Cl.Property>();
            stProps = new List <XML.St.Property>();

            foreach (PropertyCategory c in categories)
            {
                if (
                    //(c.Name.Equals("LcOaPropOverrideCat")
                    //&& c.DisplayName != S1NF0_DATA_TAB_DISPLAY_NAME)
                    //|| c.Name.Equals("LcRevitData_Parameter")//так же брать вкладки свойств из Revit и Civil
                    //|| c.Name.Equals("LcRevitData_Type")
                    //|| c.Name.Equals("LcRevitData_Element")
                    //|| c.Name.Equals("LcRevitMaterialProperties")
                    //|| c.Name.Equals("AecDbPropertySet")

                    propCategories.Contains(c.Name) &&
                    !(c.Name.Equals("LcOaPropOverrideCat") && c.DisplayName == S1NF0_DATA_TAB_DISPLAY_NAME)
                    )
                {
                    foreach (DataProperty p in c.Properties)
                    {
                        //Удалять все символы, которые не подходят для XML
                        string name  = Common.Utils.RemoveNonValidXMLCharacters(p.DisplayName);
                        string tag   = Common.Utils.RemoveNonValidXMLCharacters(c.DisplayName);
                        string value = Common.Utils.RemoveNonValidXMLCharacters(Utils.GetDisplayValue(p.Value));

                        clProps.Add(new XML.Cl.Property()
                        {
                            Name = name, Tag = tag
                        });
                        stProps.Add(new XML.St.Property()
                        {
                            Name = name, Value = value
                        });
                    }
                }
            }
            //Исправление свойств в соответстствии с требованиями Мякиша
            clProps = XML.Cl.Class.PropsCorrection(clProps);
            stProps = XML.St.Object.PropsCorrection(stProps);

            clProps.Sort();
            return(GetClassKey(clProps));
        }
Esempio n. 5
0
        // displays the properties of the model item

        public void displayProperties(PropertyCategoryCollection PCC)
        {
            this.PCC = PCC;
            tabControl.Controls.Clear();

            if (!t)
            {
                t = true;
                this.Controls.RemoveAt(0);
                this.Controls.Add(tabControl);
            }

            int p = 0;

            foreach (PropertyCategory PC in PCC)
            {
                tabControl.Controls.Add(TabPage(PC.DisplayName, p));

                System.Windows.Forms.ListView listView = ListView(p);

                tabControl.Controls[p].Controls.Add(listView); p++;

                if (PC.DisplayName == "Dynamics")
                {
                    for (int i = 0; i < 4; i++)
                    {
                        DataProperty DP = PC.Properties[i];

                        ListViewItem lvi = new ListViewItem(new[] { DP.DisplayName, DP.Value.ToString().Substring(DP.Value.ToString().IndexOf(':') + 1) });

                        listView.Items.Add(lvi);
                    }
                }

                else
                {
                    foreach (DataProperty DP in PC.Properties)
                    {
                        ListViewItem lvi = new ListViewItem(new[] { DP.DisplayName, DP.Value.ToString().Substring(DP.Value.ToString().IndexOf(':') + 1) });

                        listView.Items.Add(lvi);
                    }
                }
            }
        }
        public StructureDataStorage(Document doc, string stPath, string clPath, Structure structure,
                                    Classifier classifier, bool newStructureCreationBySelSets = false, List <string> propCategories = null)
        {
            this.doc        = doc;
            this.stPath     = stPath;
            this.clPath     = clPath;
            this.oState     = ComApiBridge.ComApiBridge.State;
            this.Structure  = structure;
            this.Classifier = classifier;

            if (propCategories != null)
            {
                this.propCategories = propCategories;
            }

            //Все новые классы будут создаваться на 2 DetailLevel. 1 - папки, 2 - конечные элементы
            //(это относится только к вновь создаваемым объектам)
            //Значит должно быть 2 класса без свойств. 1 - для папок, второй для конечных элементов!

            //если уровней меньше, чем должно быть, то нужно добавить недостающие
            for (int i = classifier.DetailLevels.Count; i < DefDetailLevels.Length; i++)
            {
                classifier.DetailLevels.Add(DefDetailLevels[i]);
            }

            DefDetailLevels[0] = classifier.DetailLevels[0];
            DefDetailLevels[1] = classifier.DetailLevels[1];
            foreach (string lvlName in DefDetailLevels)
            {
                if (String.IsNullOrWhiteSpace(lvlName))
                {
                    throw new Exception("DetailLevel должен быть не пустой строкой");
                }
            }

            //Построить словари для быстрого поиска классов
            foreach (Class c in classifier.NestedClasses)
            {
                SurveyClass(c);
            }

            //Всегда должны быть заданы все необходимые DefaultClass (сейчас их 2 - для папок и для конечных элементов)
            for (int i = 0; i < DefClassesWithNoProps.Length; i++)
            {
                if (DefClassesWithNoProps[i] == null)
                {
                    DefClassesWithNoProps[i] = CreateNewClass(Classifier.DefaultClasses[i] /*DEFAULT_CLASS_NAME[i]*/,
                                                              Classifier.DefaultClasses[i] /*DEFAULT_CLASS_NAME_IN_PLURAL[i]*/, i);
                }
            }

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

            /*
             *  //Все объекты модели геометрии с id
             *  Search searchForAllIDs = new Search();
             *  searchForAllIDs.Selection.SelectAll();
             *  //searchForIDs.PruneBelowMatch = false;
             *
             *  ConfigureSearchForAllNotHiddenGeometryItemsWithIds(searchForAllIDs);
             *
             *  //ModelItemCollection allModelItemCollection;
             *  AllNotHiddenGeometryModelItems = searchForAllIDs.FindAll(doc, false);
             *
             *  int n = AllNotHiddenGeometryModelItems.Count;
             *
             *
             *  //Сформировать объект Search для поиска конкретного значения Id. МНОГОКРАТНЫЙ ПОИСК РАБОТАЕТ МЕДЛЕННО
             *  //searchForCertainID = new Search();
             *  //searchForCertainID.Selection.CopyFrom(allModelItemCollection);
             *  //searchForCertainIDCondition = new SearchCondition(tabCN, idCN, SearchConditionOptions.None, SearchConditionComparison.Equal, new VariantData());
             *
             *  //ПОЧЕМУ-ТО ОБХОД ОБЪЕКТОВ ПРОИСХОДИТ ОЧЕНЬ МЕДЛЕННО НА БОЛЬЩИХ МОДЕЛЯХ
             *  //Поэтому у пользователя есть возможность скрыть часть модели, чтобы не загружать ее всю в словарь за один раз
             *  allItemsLookup = new Dictionary<string, ModelItem>();
             *  foreach (ModelItem item in AllNotHiddenGeometryModelItems)
             *  {
             *      DataProperty idProp = item.PropertyCategories
             *                      .FindPropertyByDisplayName(S1NF0_DATA_TAB_DISPLAY_NAME,
             *                      ID_PROP_DISPLAY_NAME);
             *      string key = Utils.GetDisplayValue(idProp.Value);
             *      allItemsLookup[key] = item;
             *  }
             */
            #endregion

            //Обход всей модели через рекурсию НЕ БЫСТРЕЕ. Но можно искать только не скрытые элементы
            if (!newStructureCreationBySelSets)//если структура создается с нуля, то этот шаг не нужен!
            {
                AllItemsLookup = new Dictionary <string, ModelItem>();
                RecurseSearchForAllNotHiddenGeometryItemsWithIds(doc.Models.RootItems, AllItemsLookup);

                //Обход всех объектов
                //Просмотреть все объекты, не имеющие вложенных. Какие из них уже присутствуют в документе?
                //Построить словарь для быстрого поиска объектов, уже добавленных в дерево
                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(structure.NestedObjects,
                                    out nestedObjectsValid, out geometryObjectsCurrDoc,
                                    out geometryObjectsOtherDoc, out displayObjects, out resetObjects);
                structure.NestedObjects = nestedObjectsValid;

                //Если какие-то объекты уже присутствуют в дереве, то уточнить набор свойств и класс для них согласно модели Navis
                foreach (XML.St.Object o in AddedGeometryItemsLookUp.Values)
                {
                    PropertyCategoryCollection categories = o.NavisItem.PropertyCategories;

                    SetObjectProps(o, categories, 1, 1);
                }

                //Создать окно и заполнить TreeView.
                StructureWindow = new StructureWindow(this);
            }
        }