Привязка общих параметров и установка их значений

Автор Тема: Привязка общих параметров и установка их значений  (Прочитано 3434 раз)

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

Оффлайн Илья ДрягинАвтор темы

  • ADN OPEN
  • Сообщений: 25
  • Карма: 2
  • Стройтэкпроект
Добрый день!
Пишу макрос, в котором к элементам категории механизмы добавляются общие параметры, а затем присваиваются значения.
Возникло 2 вопроса:
1. при использовании NewTypeBinding новые параметры нигде не отображаются (ни в экземплярах, ни в типах) и возможно вообще не привязываются, а вот при использовании NewInstanceBinding новые параметры, как и должны, отображаются в свойствах экземпляра. Что не так с TypeBinding?
2. При использовании обоих вариантов привязки из п.1 при попытке установить значение ранее привязанных параметров, возникает ошибка The parameter is read only. В файле общих параметров видимость и USERMODIFIABLE стоит true. Через UI созданные параметры экземпляра свободно редактируются.

Код - C# [Выбрать]
  1.                      // Выбираем елементы категории оборудование
  2.                     ElementCategoryFilter filter = new ElementCategoryFilter(BuiltInCategory.OST_MechanicalEquipment);
  3.                     FilteredElementCollector collector = new FilteredElementCollector(doc);
  4.                     collector.WherePasses(filter);
  5.                     ICollection<Element> found = collector.ToElements();
  6.                     //Привязываем текстовые параметры к элементам категории Оборудование
  7.                     CategorySet myCategories = Application.Create.NewCategorySet(); //создание набора категорий
  8.                     Category myCategory = doc.Settings.Categories.get_Item(BuiltInCategory.OST_MechanicalEquipment); //выбор в набор категорий категории Оборудование
  9.                         myCategories.Insert(myCategory);
  10.                         Binding typeBinding = Application.Create.NewTypeBinding(myCategories); //Создание объекта InstanceBinding с выбранной категорией
  11.                         BindingMap bindingMap = doc.ParameterBindings; //Получение карты привязки текущего документа
  12.                         foreach (Definition def in myDefinitions)
  13.                         {
  14.                                 doc.ParameterBindings.Insert(def, typeBinding, BuiltInParameterGroup.PG_TEXT);
  15.                         }
  16.                         //Установка значений текстовых параметров
  17.                         foreach (Element elem in found)
  18.                         {
  19.                                 for ( i = 0; i<textparam.Count; i++)
  20.                                 {
  21.                                         if (elem.get_Parameter(trueparam[i]) == null)
  22.                                         {
  23.                                                 elem.get_Parameter(textparam[i]).Set("-");
  24.                                         }
  25.                                 }
  26.                         }
textparam - список GUID привязаных выше параметров
« Последнее редактирование: 08-09-2016, 11:14:11 от Виктор Чекалин »

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Добрый день.

По первому пункту. Могу предположить, что параметр уже был добавлен в проект и привязан к какой-то еще категории. В этом случае нужно воспользоваться методом BindingMap.ReInsert.
Но для начала можно посмотреть что возвращает метод Insert в 14 строчке. Т.е. написать что-то типа
Код - C# [Выбрать]
  1. var res = doc.ParameterBindings.Insert(def, typeBinding, BuiltInParameterGroup.PG_TEXT);
и в режиме отладки посмотреть чему равна переменная res. Если false, то действительно привязки не произошло, поэтому логично что этого параметра нигде не увидите.
В любом случае, проверить еще макрос на чистом новом проекте и посмотреть там результат. Если в новом проекте все работает, то проблема однозначно в уже существующем параметре.

По второму пункту. Сходу сказать нельзя. Я бы получил сначала параметр и посмотрел в режиме отладке что там. Действительно ли это тот параметр и свойство ReadOnly.
Код - C# [Выбрать]
  1. var param = elem.get_Parameter(trueparam[i])
. Смотреть чему равна переменная param.
И аналогично попробовать на чистом проекте.

Оффлайн Илья ДрягинАвтор темы

  • ADN OPEN
  • Сообщений: 25
  • Карма: 2
  • Стройтэкпроект
Макрос я тестирую на чистом проекте с парой загруженных семейств оборудования.
Код - C# [Выбрать]
  1. var res = doc.ParameterBindings.Insert(def, typeBinding, BuiltInParameterGroup.PG_TEXT);
  2. TaskDialog.Show("Revit", res.ToString());
Код ыдает TRUE, но найти параметров ни в типах ни в инстансах я не могу.
(пользуюсь TaskDialog потому как не разобрался пока как использовать режим отладки в SharpDevelop и как смотреть промежуточные значения переменных при запуске макроса в самом Ревите)

По второму пункту  я сразу сделал проверку
Код - C# [Выбрать]
  1. if (elem.get_Parameter(textparam[i]).IsReadOnly) TaskDialog.Show("Revit", "Параметр " + elem.get_Parameter(textparam[i]).Definition.Name + " только для чтения");
и она сразу выдала, что параметр только для чтения, хотя не понятно где и как это свойство накладывается и как его установить в False

Оффлайн Илья ДрягинАвтор темы

  • ADN OPEN
  • Сообщений: 25
  • Карма: 2
  • Стройтэкпроект
Вот перестал работать и InstanceBinding  >:(
BindingMap.Size корректно показывает увеличение после insert, но привязанные параметры нигде не отображаются и при попытке записать значение все так же readonly. Уже не знаю куда дальше копать. OST_MechanicalEquipment - это же категория "Оборудование", может тут ошибка?

Оффлайн Павел Тер-Микаэлян

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Возникла аналогичная ситуация (новый общий параметр только для чтения!) после добавления общего параметра в семейство:
Код - C# [Выбрать]
  1. App.SharedParametersFilename = "...путь к моему файлу общ парам.txt";
  2.             DefinitionFile DF = App.OpenSharedParameterFile();
  3.             DefinitionGroups myGroups = DF.Groups;
  4.             DefinitionGroup myGroup = myGroups
  5.                                       .get_Item
  6.                                       ("18 Глобальные параметры и общая информация");
  7. Guid myExtDef_copmany_GUID =
  8.              new Guid("1EDA3C74-81DF-DA7A-7B9D-26FB032B04E3");
  9. myExtDef_copmany =
  10.                         (ExternalDefinition)myGroup
  11.                                            .Definitions
  12.                                            .FirstOrDefault(q =>
  13.                                                                   ((ExternalDefinition)
  14.                                                                   q)
  15.                                                                  .GUID ==
  16.                                                                  myExtDef_copmany_GUID );
  17. //Document familyDoc - получен ранее
  18. FamilyManager FM = familyDoc.FamilyManager;
  19. FM.AddParameter(myExtDef_copmany, BuiltInParameterGroup.PG_IDENTITY_DATA, false);
  20.  
В дальнейшем, у этого параметра IsReadOnly = true, при чем UserModifiable = True.
Код - C# [Выбрать]
  1. //doc - документ проекта, в котором есть мое семейство, в котором есть общий параметр
  2. FilteredElementCollector fss =
  3.                        new FilteredElementCollector(doc)
  4.                        .OfClass(typeof(FamilySymbol))
  5.             foreach (FamilySymbol FS in fss)
  6.             {
  7.                     Parameter p =
  8.                     FS.get_Parameter(myExtDef_copmany);
  9.                // p.IsReadOnly = true  !!!!
  10.             }
  11.  
То есть я не могу изменить значение общего параметра типа пользовательского семейства из проекта. Так получается?
Хотя, если редактировать параметр из FamilyManager документа, то у него IsReadOnly = false
Код - C# [Выбрать]
  1. //familyDoc - документ семейства проекта
  2. FamilyManager FM = familyDoc.FamilyManager;
  3. foreach (FamilyParameter FamilyP in FM.Parameters)
  4. {
  5.    if(FamilyP.Definition.Name == "Компания разработчик")
  6.        //FamilyP.IsReadOnly = false; !!!
  7. }
  8.  
« Последнее редактирование: 01-06-2018, 18:26:58 от Pabloa »

Оффлайн Павел Тер-Микаэлян

  • ADN OPEN
  • ***
  • Сообщений: 124
  • Карма: 5
Я понял, дело в FS.get_Parameter(myExtDef_copmany). Если получать общий параметр семейства из FamilySymbol через get_Parameter(Definition) или get_Parameter(GUID), то свойство IsReadOnly всегда равно true.