Работа с семействами. Загрузка семейства и вставка экземпляра семейства

Автор Тема: Работа с семействами. Загрузка семейства и вставка экземпляра семейства  (Прочитано 2119 раз)

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

Оффлайн Александр РивилисАвтор темы

  • Administrator
  • *****
  • Сообщений: 9918
  • Карма: 1272
  • Рыцарь ObjectARX
  • Skype: rivilis
« Последнее редактирование: 27-12-2013, 10:53:05 от Виктор Чекалин »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Фазлеев

  • ADN Club
  • Сообщений: 24
  • Карма: 8
    • Andrey Stroitel
По коду поиска элемента по его типу и наименованию происходит поиск лишь по имени типоразмера.
Если в проекте присутствует только одно семейство с заданным типоразмером, тогда код отрабатывает как положено.
Но если присутствует ещё одно семейство с таким же именем типоразмера, то выбирается первое попавшееся семейство.
Скажите, пожалуйста, каким образом сделать выборку по имени семейства и по имени типоразмера?

Код - 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.   }
« Последнее редактирование: 24-02-2015, 16:44:43 от kha »

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

  • Administrator
  • *****
  • Сообщений: 692
  • Карма: 106
  • Skype: chekalin-v
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.         }

Оффлайн Андрей Фазлеев

  • ADN Club
  • Сообщений: 24
  • Карма: 8
    • Andrey Stroitel
Спасибо! Работает как надо!

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