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

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

Название: Доступ к определениям общих параметров проекта
Отправлено: Александр Ривилис от 31-12-2013, 22:30:03
Доступ к определениям общих параметров проекта
Название: Re: Доступ к определениям общих параметров проекта
Отправлено: Сергей Одегов от 15-06-2015, 16:58:06
Здравствуйте Виктор!
К вопросу об определении общих параметров через файл определения (файл общих параметров).
К примеру, имеется файл общих параметров (см. вложение)
В API Developers Guidlines на 321 странице есть пример добавления параметра в файл.
Скажите как добавить параметры из файла в параметры проекта к определенной категории элементов, ну скажем к стенам.
Вот здесь все вроде правильно, но к стенам параметр не добавляется почему то. 
Код - C# [Выбрать]
  1.  
  2. CategorySet myCategories = app.Application.Create.NewCategorySet();
  3.  
  4. Category myCategory = app.ActiveUIDocument.Document.Settings.Categories.get_Item(BuiltInCategory.OST_Walls);
  5.  
  6. myCategories.Insert(myCategory);
  7.  
  8. InstanceBinding instanceBinding = app.Application.Create.NewInstanceBinding(myCategories);
  9.  
  10. BindingMap bindingMap = app.ActiveUIDocument.Document.ParameterBindings;
  11.  
  12. bool instanceBindOK = bindingMap.Insert(myDefinition_ProductDate, instanceBinding, BuiltInParameterGroup.PG_TEXT);
  13.  
Название: Re: Доступ к определениям общих параметров проекта
Отправлено: Виктор Чекалин от 15-06-2015, 18:01:59
Сергей, код верный.
Я так и не понял, вам нужно показывать как читать параметры или нет:) Ведь если вы этот код смогли проверить, значит и сумели из файла прочитать параметры.

Если параметр так и не появился у стен, то я бы первым делом проверил значение переменной instanceBindOK после вызова метода bindingMap.Insert
Название: Re: Доступ к определениям общих параметров проекта
Отправлено: Сергей Одегов от 16-06-2015, 09:09:16
Я пытаюсь сделать как написано в API Guidlines - ну просто учусь как файл создавать и т.п. )))
Вот что я делаю по пунктам:
1. Заранее создаю файл общих параметров и засовываю его в ресурсы сборки
2. Добавляю путь к ресурсам и потом говорю что этот путь - путь к файлу параметров.
3. Далее открываю этот файл чтобы получить к нему доступ.
4. Уже далее, как я понимаю, все действия производятся для того, чтобы создать определения параметра для некоторого объекта - контейнера который потом будет вставляться в "Параметры проекта"
Вот код который я пытаюсь реализовать:

Код - C# [Выбрать]
  1. //путь к файлу в сборке
  2. string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "SharedFile.txt");
  3.  
  4. //определение пути для ФОП(файла общих параметров)
  5. app.SharedParametersFilename = path;
  6.  
  7. //Открытие ФОП
  8. var defifnitionFile = app.OpenSharedParameterFile();
  9.  
  10. //Новая группа для объекта контейнера
  11. DefinitionGroups myGroups = defifnitionFile.Groups;
  12. DefinitionGroup myGroup =  defifnitionFile.Groups.get_Item("Общая группа");
  13.  
  14. Definition myDefinition_Parameter1 = myGroup.Definitions.Create("Параметр1", ParameterType.Text);
  15.                
  16. //Новая набор категорий для объекта контейнера                
  17. CategorySet myCategories = uiapp.Application.Create.NewCategorySet();
  18.  
  19. // use BuiltInCategory to get category of Wall
  20. Category myCategory = uiapp.ActiveUIDocument.Document.Settings.Categories.get_Item(BuiltInCategory.OST_Walls);
  21.  
  22. //Вставка в созданный набор категорий категорию стены
  23. myCategories.Insert(myCategory);
  24.  
  25.             InstanceBinding instanceBinding = uiapp.Application.Create.NewInstanceBinding(myCategories);
  26.  
  27.             BindingMap bindingMap = uiapp.ActiveUIDocument.Document.ParameterBindings;
  28.            
  29.             bool instanceBindOK = bindingMap.Insert(myDefinition_Parameter1,instanceBinding, BuiltInParameterGroup.PG_TEXT);
  30.  

В этой связи не понятно, во первых постоянно вылетает сообщение об исключении.
Кстати, этот код я делаю в транзакции - ее просто не указал.
 
Вот эта строка присваивает имя параметру.
Код - C# [Выбрать]
  1. Definition myDefinition_Parameter1 = myGroup.Definitions.Create("Параметр1", ParameterType.Text);
  2.  
Так а зачем мне присваивать имя, если я его уже создал в файле. Как вот из файла все достать что уже создано заранее и имя и идентификатор и группу?
Как проверить instanceBindOK  ?
Название: Re: Доступ к определениям общих параметров проекта
Отправлено: Сергей Одегов от 16-06-2015, 09:44:04
Кстати для групп я кажется догадался как сделать.
 Правильно?

Код - C# [Выбрать]
  1. StringBuilder groupInfo = new StringBuilder();
  2.  
  3.             foreach (DefinitionGroup myGroup in myGroups)
  4.             {
  5.                 groupInfo.AppendLine(myGroup.Name);
  6.              }
  7.             TaskDialog.Show("123", groupInfo.ToString());
  8.  

Как вытащить Имя параметра и его Тип  - это наверное  ParameterType.Text
Название: Re: Доступ к определениям общих параметров проекта
Отправлено: Сергей Одегов от 16-06-2015, 09:59:52
Так, покрутил - вытащил и имя и название групп. Как Тип вытащить подскажите ))))
Название: Re: Доступ к определениям общих параметров проекта
Отправлено: Виктор Чекалин от 16-06-2015, 10:17:55
постоянно вылетает сообщение об исключении.
Какое и на какой строчке?

Правильно?
Угу.

Значит по порядку:)
Revit API поддерживает работу с  общими параметрами только через файл общих параметров. Хотя лично мне не понятно, почему нельзя создать определение без файла.
Таким образом, возможны два варианта:
1) Создаете файл с общим параметром заранее. Затем в коде читаете из него описание и ищете нужный параметр. Пример кода:
Код - C# [Выбрать]
  1. var group = myGroups.get_Item("Имя группы");
  2. ExternalDefinition parameterDefinition = group.Definitions.get_Item("Параметр 1");
  3.  
Тип параметра можно достать из ExternalDefinition. Правда я не очень понимаю зачем он вам.

2) Создавать группы и параметры на лету. Но все равно нужен файл. он может быть пустым, но он нужен;
Код - C# [Выбрать]
  1. var newGroup = file.Groups.Create("Новая группа");
  2. var new definition = newGroup.Definitions.Create(...);
Название: Re: Доступ к определениям общих параметров проекта
Отправлено: Сергей Одегов от 16-06-2015, 11:05:35
Ошибка вот на этой строке
Код - C# [Выбрать]
  1. Definition ProductDate = myGroup.Definitions.Create("Параметр", ParameterType.Text);
  2.  
Название: Re: Доступ к определениям общих параметров проекта
Отправлено: Сергей Одегов от 16-06-2015, 11:47:24
Спасибо. Я просто запутался... то читать то создавать. Вообще, откровенно говоря, путаница с этим ФОП только.
Название: Re: Доступ к определениям общих параметров проекта
Отправлено: Виктор Чекалин от 16-06-2015, 13:05:06
Ошибка вот на этой строке
Судя по ошибке, myGroup равно null.
Не нашлась такая группа в файле общих параметров