Сообщество программистов Autodesk в СНГ

Статьи => Опубликованные статьи => Тема начата: Александр Ривилис от 25-12-2013, 01:30:03

Название: Работа с семействами. Загрузка семейства и вставка экземпляра семейства
Отправлено: Александр Ривилис от 25-12-2013, 01:30:03
Работа с семействами. Загрузка семейства и вставка экземпляра семейства (http://adn-cis.org/rabota-s-semejstvami.-zagruzka-semejstva-i-vstavka-ekzemplyara-semejstva.html)
Название: Re: Работа с семействами. Загрузка семейства и вставка экземпляра семейства
Отправлено: Андрей Фазлеев от 24-02-2015, 13:17:05
По коду поиска элемента по его типу и наименованию происходит поиск лишь по имени типоразмера.
Если в проекте присутствует только одно семейство с заданным типоразмером, тогда код отрабатывает как положено.
Но если присутствует ещё одно семейство с таким же именем типоразмера, то выбирается первое попавшееся семейство.
Скажите, пожалуйста, каким образом сделать выборку по имени семейства и по имени типоразмера?

Код - C# [Выбрать]
  1.  
  2.    /// <summary>
  3.   /// Поиск элемента
  4.   /// по его типу и наименованию
  5.   /// </summary>
  6.   public static Element FindElementByName(
  7.     Document doc,
  8.     Type targetType,
  9.     string targetName )
  10.   {
  11.     return new FilteredElementCollector( doc )
  12.       .OfClass( targetType )
  13.       .FirstOrDefault<Element>(
  14.         e => e.Name.Equals( targetName ) );
  15.   }
Название: Re: Работа с семействами. Загрузка семейства и вставка экземпляра семейства
Отправлено: Виктор Чекалин от 24-02-2015, 13:49:03
kha,
Лучше в этом случае испльзовать другой метод, который вернет конкретно типоразмер или семейство (в зависимости от того, что вам в итоге нужно). Метод, приведенный в статье - общий для элементов и не всегда годится к использованию в реальных проектах.

Для поиска типоразмера по имени семейства нужно создать фильтр по параметру Family Name.

Метод выглядит примерно так:
Код - C# [Выбрать]
  1.         public static ElementType GetFamilySymbolByFamilyAndSymbolName(Document doc, string familyName,
  2.             string symbolName)
  3.         {
  4.             var collector = new FilteredElementCollector(doc);
  5.  
  6.  
  7.             FilterRule rule = new FilterStringRule(new ParameterValueProvider(new ElementId(BuiltInParameter.ALL_MODEL_FAMILY_NAME)),
  8.                 new FilterStringEquals(), familyName, false);
  9.  
  10.             ElementParameterFilter elementParameterFilter = new ElementParameterFilter(rule);
  11.  
  12.             var elementType =
  13.                 collector
  14.                     .OfClass(typeof (ElementType))
  15.                     .WherePasses(elementParameterFilter)
  16.                     .OfType<ElementType>()
  17.                     .FirstOrDefault(x => x.Name.Equals(symbolName));
  18.  
  19.             return elementType;
  20.         }
Название: Re: Работа с семействами. Загрузка семейства и вставка экземпляра семейства
Отправлено: Андрей Фазлеев от 24-02-2015, 16:28:26
Спасибо! Работает как надо!

Хороший пример для разбора фильтров :)