Расчётные значения

Автор Тема: Расчётные значения  (Прочитано 9500 раз)

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

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Расчётные значения
« : 28-11-2013, 10:08:22 »
Доброго времени суток,

Есть ли возможность программно добавлять расчётные значения?
Возможно нужно использовать новое свойство IsCalculatedField?

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Расчётные значения
« Ответ #1 : 28-11-2013, 18:46:39 »
Добрый день, Александр.

К сожалению, пока создать новое расчетное значение в спецификацию с помощью API нельзя.

Свойство IsCalculatedField только для чтения. Т.е. вы можете узнать, является ли существующее поле расчетным или нет.

Расчетное значение имеет тип ScheduleField.FieldType либо FieldType.Formula, либо FieldType.Percentage. Изменить тип у существующего поля естественно нельзя. Есдинственный способ указать тип - указать его при создании поля с помщью метода ScheduleDefinition.AddField(ScheduleType scheduleType).

Однако, при попытке создать новое поле с типом FieldType.Formula или FieldType.Percentage получим ошибку: fieldType is not a schedulable field type. Описание ошибки намекает на то, что можно добавить только поля, которые вы видите в списке Доступные поля (в интерфейсе).

Вот код, который я использовал для тестирования:
Код - C# [Выбрать]
  1.         public Result Execute(
  2.           ExternalCommandData commandData,
  3.           ref string message,
  4.           ElementSet elements)
  5.         {
  6.             UIApplication uiapp = commandData.Application;
  7.             UIDocument uidoc = uiapp.ActiveUIDocument;
  8.  
  9.             ViewSchedule viewSchedule = uidoc.ActiveView as ViewSchedule;
  10.  
  11.             if (viewSchedule == null)
  12.             {
  13.                 return Result.Failed;
  14.             }
  15.  
  16.             var scheduleDefinition = viewSchedule.Definition;
  17.  
  18.             var fieldCount = scheduleDefinition.GetFieldCount();
  19.  
  20.             for (int i = 0; i < fieldCount; i++)
  21.             {
  22.                 var field = scheduleDefinition.GetField(i);
  23.  
  24.                 var name = field.GetName();
  25.  
  26.                 var isCalculated = field.IsCalculatedField;
  27.                
  28.                 Debug.Print("{0} - {1}", name, isCalculated);
  29.                
  30.             }
  31.  
  32.             var newFiled = scheduleDefinition.AddField(ScheduleFieldType.Percentage);
  33.  
  34.             return Result.Succeeded;
  35.         }

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Расчётные значения
« Ответ #2 : 02-12-2013, 09:12:41 »
Хорошо, большое спасибо за помощь.

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

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Re: Расчётные значения
« Ответ #3 : 30-04-2015, 16:11:49 »
Добрый день, Александр.
К сожалению, пока создать новое расчетное значение в спецификацию с помощью API нельзя.
Здравствуйте, а можно ли создать текстовое?

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Расчётные значения
« Ответ #4 : 30-04-2015, 16:19:41 »
multys, что имеется ввиду под текстовым полем? В спецификации Revit поле иожет быть либо значение параметра, либо вычисляемое поле. Произвольное текстовое поле создать нельзя.

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

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Re: Расчётные значения
« Ответ #5 : 30-04-2015, 16:46:27 »
Ну как я понял из всего что на форуме вы рассматривали про спецификации, то оперировать можно с уже созданными спецухами либо создать спецуху, но тогда поля создаются по параметру...
Имелось ввиду что поле типа ТЕКСТ
Но вопрос то вот какой собственно:
1. Если в проекте не одна спецификация, а несколько, как обратиться к конкретной спецификации?
2. Как создать столбец в уже существующей спецификации и в зависимости от параметров других столбцов вписывать в созданный столбец значения, ну скажем "0" и "1" Эти значения могут быть как строковые так и числовые - не важно
На иллюстрации спецификация воздуховодов.
Я создал дополнительный параметр "Параметр проекта" для этой специфкации Тип Общий ТЕКСТ Текст
Хочу автоматически (при нажатии на кнопку)заполнять к примеру поле "а" в спецификации : значение "0" - если диаметр>100 и значение "1" - если ширина > 100


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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Расчётные значения
« Ответ #6 : 30-04-2015, 17:01:15 »
В интерфейсе пользователя создать в спцификации произвольное текстовое поле нельзя. А значит нельзя и с помощью API. Только из параметров.

Решение вашей задачи - это создание параметра, значение которго рассчитывается по формуле и использовать этот параметр в спцификации.

По первому пункту - поиск нужной спецификации осуществляется также как и поиск любых других объектов - с помощью FilteredElementCollector

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

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Re: Расчётные значения
« Ответ #7 : 30-04-2015, 17:08:12 »
В интерфейсе пользователя создать в спцификации произвольное текстовое поле нельзя. А значит нельзя и с помощью API. Только из параметров.

В интерфейсе я могу создать параметр категории "Общий" типа "Текст". Далее вручную я могу внести любую запись в ячейку столбца данного параметра. Как показано у меня на иллюстрации.
Можно ли программно ввести значение в ячейку столбца?
Для элементов понятно, но как фильтровать для спецификаций  с помощью FilteredElementCollector. Пожалуйста приведите пример небольшой?

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Расчётные значения
« Ответ #8 : 30-04-2015, 17:18:16 »
В интерфейсе я могу создать параметр категории "Общий" типа "Текст". Далее вручную я могу внести любую запись в ячейку столбца данного параметра. Как показано у меня на иллюстрации.
Можно ли программно ввести значение в ячейку столбца?
Так ведь параметр то вы создаете не в спецификации, а в проекте и присваиваете его либо типу либо экземпляру определенной категории. В спецификации вы этот параметр выводите. Когда вы в спецификации пишете туда значения, это есть ни что иное, как заполнение значение параметра.
То есть по факту вам надо не в спецификацию значение столбца вводить, а заполнять параметр объекта. Это конечно же можно.

Спецификации имеют тип ViewSchedule, который унаследован от класса Element. Соответственно, чтобы получить все спецификации нужно написать так:
Код - C# [Выбрать]
  1. var collector = new FilteredElementCollector(doc);
  2. var viewSchedules = collector.OfClass(typeof(ViewSchedule)).ToList();
  3.  
Ну а дальше нужный уже выбираете по названию или другим признакам.

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

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Re: Расчётные значения
« Ответ #9 : 30-04-2015, 17:21:03 »
Спасибо. А как например для спецификации Воздуховодов сделать. Ну уточнить ваш код для конкретной спецификации?

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Расчётные значения
« Ответ #10 : 30-04-2015, 17:30:26 »
Например, вот так:
Код - C# [Выбрать]
  1. var collector = new FilteredElementCollector(doc);
  2. var viewSchedules = collector
  3.  .OfClass(typeof(ViewSchedule))
  4.  .OfType<ViewSchedule>()
  5.  .Where(v=>v.CategoryId == new ElementId(BuiltInCategory.OST_DuctCurves))
  6.  .ToList();
  7.  

Это выберутся все спецификации, у которых категория - Воздуховоды. Если она одна, то берите первую. Если их несолкько, то фильтруйте еще и по имени.

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

  • ADN OPEN
  • Сообщений: 48
  • Карма: 0
  • Skype: sergey_mmt
Re: Расчётные значения
« Ответ #11 : 05-05-2015, 09:37:47 »
Спасибо. Больше всего мне понравилось лямбда выражение )))) :)