Замена общих параметров семейств на другие из файла общих параметров???

Автор Тема: Замена общих параметров семейств на другие из файла общих параметров???  (Прочитано 2182 раз)

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

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Коллеги, добрый день.

Ищу направление в решении одной не простой задачи:
1. Выполнить замену общих параметров семейств на другие общие параметры из файла общих параметров.
2. Выполнить это для семейств с любой степенью вложенности (если здесь есть тонкости, то лучше о них упомянуть).

Если есть решение, то лучше на C# или VB.NET.

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Доброго времени суток.

На самом деле задача решается достаточно просто, причем даже без рекурсии.

Предполагаю, что doc - документ семейства (открытый через EditFamily или текущий документ семейства)

Замену параметров нужно делать в текущем doc.OwnerFamily + получить все общие семейства, заменить в них параметры и загрузить обратно в документ, этого достаточно.

Общие семейства получаем вот так:

Код - C# [Выбрать]
  1. var collector = new FilteredElementCollector(doc);
  2.  
  3. return collector
  4.         .OfClass(typeof(Family))
  5.         .OfType<Family>()
  6.         .Where(x => !x.IsOwnerFamily && x.IsShared());

Сама замена параметра осуществляется в 2 этапа:

1) замена общего параметра на параметр семейства с помощью метода
Код - C# [Выбрать]
  1. public FamilyParameter ReplaceParameter(
  2.         FamilyParameter currentParameter,
  3.         string parameterName,
  4.         BuiltInParameterGroup parameterGroup,
  5.         bool isInstance
  6. )
  7. //Replace a shared family parameter with a new non-shared family parameter
  8.  

Тонкость: parameterName не может совпадать с именем общего параметра

2) замена параметра семейства на новый общий параметр
Код - C# [Выбрать]
  1. public FamilyParameter ReplaceParameter(
  2.         FamilyParameter currentParameter,
  3.         ExternalDefinition familyDefinition,
  4.         BuiltInParameterGroup parameterGroup,
  5.         bool isInstance
  6. )
  7. // Replace a family parameter with a shared parameter.
  8.  

Есть еще только один подводный камень, связанный с заменой параметров во вложенных семействах. В ревите уже может быть открыто семейство с таким именем, причем, оно может не совпадать со вложеным от слова "совсем", в общем, рекомендую проверять application.Documents перед тем, как пытаться заменять параметры во вложенных семействах