Проверка наличия параметра в семействе, и добавление параметра семейства

Автор Тема: Проверка наличия параметра в семействе, и добавление параметра семейства  (Прочитано 6365 раз)

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

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Здравствуйте!
Из-за авралов на работе почти год не было времени принимать попытки автоматизации.
Сейчас есть время и вопрос:
В приложении необходимо (для последующей обработки) проверить наличие параметра во всех семействах определённой категории. При отсутствии его в некоторых семействах - добавлять в них.
Вроде самый простой способ - добавить этот параметр для данной категории в параметры проекта, но как я понял в форуме Джереми Таммика, эта возможность не предусмотрена. В связи с почти почти полным отсутствием опыта Revit API, не могу разобраться сам. Примеры из интернета, как я понял предусматривают загрузку параметра в семейство из файла общих настроек, мне же достаточно просто установить новый текстовой параметр "по экземпляру".  Попытки просто считать список семейств по категории (при заранее установленным в Ревите параметром семейства), говорят, что параметр = null.
Код - C# [Выбрать]
  1. ICollection<FamilySymbol> famType =   new FilteredElementCollector(doc)
  2.                                 .OfCategory(BuiltInCategory.OST_ElectricalEquipment)
  3.                                 .OfClass(typeof(FamilySymbol))
  4.                                 .Cast<FamilySymbol>()
  5.                                 .ToList();
  6.  
  7.            
  8.             foreach (FamilySymbol ft in famType)
  9.             {
  10.                 var getPar = ft.LookupParameter(serParam);
  11.                 if (ft.LookupParameter(serParam) == null)
  12.                     serParam = "null";
  13.                 else
  14.                     serParam = "exist";
  15.  
  16.                 str += ft.Name + "   " + ft.Family.Name + "   " + serParam + Environment.NewLine;
  17.             }
  18.             Clipboard.SetText(str);
  19.             TaskDialog.Show("Systems", "Скопируйте текст в блокнот");
Есть ли какое-нибудь решение проблемы?
« Последнее редактирование: 11-11-2020, 17:26:11 от Александр Ривилис »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13923
  • Карма: 1793
  • Рыцарь ObjectARX
  • Skype: rivilis
Из-за авралов на работе почти год не было времени принимать попытки автоматизации.
И конечно за этот год ты забыл как следует форматировать код для форума. ;) Напоминаю!
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Постарался успеть исправиться.

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Что-то тут подумал, что при собирании по FamilySymbol собираются все типы семейств по категории. При добавлении параметра в семейство он добавляется во все его типы. Т.е достаточно собрать коллекцию семейств по категории и проверять наличие параметра (и добавлять новый параметр) не имея список всех типов семейств. С другой стороны

Код - C# [Выбрать]
  1. ICollection<Family> famType = new FilteredElementCollector(doc)
  2.                     .OfCategory(BuiltInCategory.OST_ElectricalEquipment)
  3.                     .OfClass(typeof(Family))
  4.                     .Cast<Family>()
  5.                     .ToList();

не собирает вообще ничего.

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Эм. Параметр проекта создать на заданную категорию?

Пример есть прямо в документации



API позволяет создать параметры проекта на основе общих параметров. Нет возможности напрямую создавать "обычные", т.е. не общие параметры проекта. Но тут, на самом деле тоже есть одна хитрость, их можно скопировать из существующего проекта

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Попробовал, всё получилось, если бы не одно но - у нас файл общих параметров закрыт на запись, так что не думаю, что это вариант.
По поводу копирования из существующего проекта, то, в случае плагина, я так думаю, в плагине надо держать сам файл проекта - а он практически пустой весит нормально. Нашёл более интересный вариант - подменный файл общих параметров, у него с одним нужным параметром вес 1кБ. -
.
Т.е. вторая половина вопроса в общем-то решена, осталось разобраться с первой.

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

  • ADN OPEN
  • Сообщений: 25
  • Карма: 0
Опытным путём установил, что де обязательно проверять наличие параметра в семействе, и при его отсутствии добавлять его. Достаточно просто добавить параметр в семейство - если он уже есть - то он де-факто не добавляется, значения параметра не обнуляется.
Так что вопрос исчерпан.