Type Parameter

Автор Тема: Type Parameter  (Прочитано 10322 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Type Parameter
« : 10-10-2014, 06:12:15 »
Добрый день!
Моя история (начатая здесь http://adn-cis.org/forum/index.php?topic=1004.0) с параметрами продолжается. Пользователям понравились расширенные списки параметров, которые появлялись в Revit 2015.
В Revit 2015 в Parameters есть замечательный параметр Type (TypeId), который показывает все типы элемента (или все типы семейства) в модели.
В Revit 2014 такого параметра нет.
Пришлось пойти следующим путем:
Код - C# [Выбрать]
  1. Element et = elt.Document.GetElement(elt.GetTypeId()); //берем тип элемента
  2. FilteredElementCollector coll = new FilteredElementCollector(_doc).OfClass(typeof(ElementType)); //выполняем поиск типов в модели
  3. List<string> lst = new List<string>();
  4. foreach(Element eet in coll){
  5. if ((ElementType)eуt == (ElementType)et) {
  6. lst.Add(eet.Name);//собираем список наименований типов
  7. }
  8.  
Но такой путь очень долгий так как типов объектов в модели очень много и проверка занимает время, плюс, необходимо делать дополнительные проверки для семейств.
Подскажите есть ли другой путь для получения списка типов?

Спасибо
« Последнее редактирование: 10-10-2014, 08:42:27 от Александр Ривилис »

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Type Parameter
« Ответ #1 : 10-10-2014, 07:11:01 »
Добрый)

Что-то не совсем понятное, при чем тут TypeId и параметры. Если нужен список типоразмеров семейства, то можно написать что-то вроде, что в 2014, что в 2015:

Код - C# [Выбрать]
  1. var elementType = doc.GetElement(element.GetTypeId());
  2.  
  3. var familySymbol = elementType as FamilySymbol;
  4. if (familySymbol != null) // типоразмер пользовательского семейства семейс
  5. {
  6.         var family = familySymbol.Family;
  7.         TaskDialog.Show("Family types",
  8.                                         family
  9.                                                 .Symbols
  10.                                                 .Cast<FamilySymbol>()
  11.                                                 .Select(x => x.Name)
  12.                                                 .Aggregate((s, s1) => s + "\n" + s1));
  13.         // В Revit 2015 Symbols - Obsolete, лучше так:
  14.         TaskDialog.Show("Family types",
  15.                                         family
  16.                                                 .GetFamilySymbolIds()
  17.                                                 .Select(doc.GetElement)
  18.                                                 .Select(x => x.Name)
  19.                                                 .Aggregate((s, s1) => s + "\n" + s1));
  20.         return Result.Succeeded;
  21. }
  22. // иначе - типоразмер системного семейства (стены, трубы и т.д.)
  23. var collector = new FilteredElementCollector(doc);
  24. var types = collector.OfClass(elementType.GetType()).ToElements();
  25. TaskDialog.Show("Family types",
  26.                                 types
  27.                                         .Select(x => x.Name)
  28.                                         .Aggregate((s, s1) => s + "\n" + s1));
« Последнее редактирование: 10-10-2014, 08:42:06 от Александр Ривилис »

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Type Parameter
« Ответ #2 : 10-10-2014, 08:08:08 »
Извиняюсь за некорректную формулировку. Не совсем то, что мне нужно.
Попробую тогда так: Можно ли получить список типов из выбранной категории?
Например, пользователь выбирает категорию "Walls" и у него появляется список типов этой категории (типа Generic - 6", Generic - 8" и т.д.)

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Type Parameter
« Ответ #3 : 10-10-2014, 08:37:19 »
Добрый день. Да, можно.

Код - C# [Выбрать]
  1. FilteredElementCollector collector = new FilteredElementCollector(doc);
  2.  
  3. var wallTypes =
  4. collector.OfCategory(BuiltInCategory.OST_WALLS).WhereElementIsElementType();

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Type Parameter
« Ответ #4 : 10-10-2014, 08:54:10 »
Спасибо, а как сделать без использования BuiltInCategory? Если у меня есть только имя или Category (надеюсь обойтись без использования switch)?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Type Parameter
« Ответ #5 : 10-10-2014, 09:38:29 »
Код - C# [Выбрать]
  1. collector.OfCategory((BuiltInCategory)selectedCategory.Id).WhereElementIsElementType();
« Последнее редактирование: 10-10-2014, 09:39:47 от Александр Ривилис »

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Type Parameter
« Ответ #6 : 10-10-2014, 10:36:17 »
Возникает ошибка:
Cannot convert type 'Autodesk.Revit.DB.ElementId' to 'Autodesk.Revit.DB.BuiltInCategory'   

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Type Parameter
« Ответ #7 : 10-10-2014, 11:00:39 »
Пардон, selectedCategory.Id.IntegerValue

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Type Parameter
« Ответ #8 : 10-10-2014, 11:17:11 »
Так намного лучше, спасибо за подсказки!
Приходится, конечно, с бубном танцевать в Revit 2014..

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Type Parameter
« Ответ #9 : 10-10-2014, 11:28:03 »
Приходится, конечно, с бубном танцевать в Revit 2014..
По моему Вы неправильно понимаете значения выражения "Танцы с бубном":)

Код - C# [Выбрать]
  1. FilteredElementCollector collector = new FilteredElementCollector(doc);
  2. var wallTypes = collector.OfCategory((BuiltInCategory)selectedCategory.Id.IntegerValue).WhereElementIsElementType();
Вроде все вполне логично, все понятно и все просто:) Какие ж тут бубны?

И кстати, а что Вы имели ввиду под
в Parameters есть замечательный параметр Type (TypeId),
? Что то я не вижу такого.

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Type Parameter
« Ответ #10 : 10-10-2014, 11:39:26 »
Поддерживаю, API Revit-а - конфетка, ясное и логичное

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Type Parameter
« Ответ #11 : 10-10-2014, 11:44:42 »
Цитировать
? Что то я не вижу такого.

Цитировать
Вроде все вполне логично, все понятно и все просто:) Какие ж тут бубны?
В том, что описано выше да, но это все же отличается от данных Revit 2015, так как еще придется типы отфильтровать.

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Type Parameter
« Ответ #12 : 10-10-2014, 11:45:49 »
Поддерживаю, API Revit-а - конфетка, ясное и логичное
не могу не согласиться

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Type Parameter
« Ответ #13 : 10-10-2014, 12:09:29 »
shss,
Так и в 2014 эти параметры были, возможно и раньше:
http://screencast.com/t/sgPZdNrZ1Hs
Просто они не выводились в вобщем списке. но получить их всегда можно было с помощью element.get_Parameter(BuiltInParameter.ELEM_TYPE_PARAM) и element.get_Parameter(BuiltInParameter.SYMBOL_ID_PARAM)

Оффлайн shssАвтор темы

  • ADN Club
  • ***
  • Сообщений: 214
  • Карма: 5
  • Sergey
  • Skype: sergey.s.shevtsov
Re: Type Parameter
« Ответ #14 : 10-10-2014, 12:15:06 »
Замечательно!
Но вот решение описанное выше мне нравится больше, потому как нет необходимости в делении BuiltInParameter - а, на ELEM_TYPE_PARAM и SYMBOL_ID_PARAM