Доступ к определениям общих параметров проекта

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Сергей Одегов

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Здравствуйте Виктор!
К вопросу об определении общих параметров через файл определения (файл общих параметров).
К примеру, имеется файл общих параметров (см. вложение)
В 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.  
« Последнее редактирование: 15-06-2015, 17:30:45 от Сергей Одегов »

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Сергей, код верный.
Я так и не понял, вам нужно показывать как читать параметры или нет:) Ведь если вы этот код смогли проверить, значит и сумели из файла прочитать параметры.

Если параметр так и не появился у стен, то я бы первым делом проверил значение переменной instanceBindOK после вызова метода bindingMap.Insert

Оффлайн Сергей Одегов

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Я пытаюсь сделать как написано в 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  ?
« Последнее редактирование: 16-06-2015, 09:46:52 от Сергей Одегов »

Оффлайн Сергей Одегов

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Кстати для групп я кажется догадался как сделать.
 Правильно?

Код - 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
« Последнее редактирование: 16-06-2015, 10:03:33 от Виктор Чекалин »

Оффлайн Сергей Одегов

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Так, покрутил - вытащил и имя и название групп. Как Тип вытащить подскажите ))))

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
постоянно вылетает сообщение об исключении.
Какое и на какой строчке?

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

Значит по порядку:)
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(...);

Оффлайн Сергей Одегов

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Ошибка вот на этой строке
Код - C# [Выбрать]
  1. Definition ProductDate = myGroup.Definitions.Create("Параметр", ParameterType.Text);
  2.  

Оффлайн Сергей Одегов

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Спасибо. Я просто запутался... то читать то создавать. Вообще, откровенно говоря, путаница с этим ФОП только.

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Ошибка вот на этой строке
Судя по ошибке, myGroup равно null.
Не нашлась такая группа в файле общих параметров