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

ADN Club => Revit API => Тема начата: Alexander от 28-11-2013, 10:08:22

Название: Расчётные значения
Отправлено: Alexander от 28-11-2013, 10:08:22
Доброго времени суток,

Есть ли возможность программно добавлять расчётные значения?
Возможно нужно использовать новое свойство IsCalculatedField?
Название: Re: Расчётные значения
Отправлено: Виктор Чекалин от 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.         }
Название: Re: Расчётные значения
Отправлено: Alexander от 02-12-2013, 09:12:41
Хорошо, большое спасибо за помощь.
Название: Re: Расчётные значения
Отправлено: Сергей Одегов от 30-04-2015, 16:11:49
Добрый день, Александр.
К сожалению, пока создать новое расчетное значение в спецификацию с помощью API нельзя.
Здравствуйте, а можно ли создать текстовое?
Название: Re: Расчётные значения
Отправлено: Виктор Чекалин от 30-04-2015, 16:19:41
multys, что имеется ввиду под текстовым полем? В спецификации Revit поле иожет быть либо значение параметра, либо вычисляемое поле. Произвольное текстовое поле создать нельзя.
Название: Re: Расчётные значения
Отправлено: Сергей Одегов от 30-04-2015, 16:46:27
Ну как я понял из всего что на форуме вы рассматривали про спецификации, то оперировать можно с уже созданными спецухами либо создать спецуху, но тогда поля создаются по параметру...
Имелось ввиду что поле типа ТЕКСТ
Но вопрос то вот какой собственно:
1. Если в проекте не одна спецификация, а несколько, как обратиться к конкретной спецификации?
2. Как создать столбец в уже существующей спецификации и в зависимости от параметров других столбцов вписывать в созданный столбец значения, ну скажем "0" и "1" Эти значения могут быть как строковые так и числовые - не важно
На иллюстрации спецификация воздуховодов.
Я создал дополнительный параметр "Параметр проекта" для этой специфкации Тип Общий ТЕКСТ Текст
Хочу автоматически (при нажатии на кнопку)заполнять к примеру поле "а" в спецификации : значение "0" - если диаметр>100 и значение "1" - если ширина > 100

Название: Re: Расчётные значения
Отправлено: Виктор Чекалин от 30-04-2015, 17:01:15
В интерфейсе пользователя создать в спцификации произвольное текстовое поле нельзя. А значит нельзя и с помощью API. Только из параметров.

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

По первому пункту - поиск нужной спецификации осуществляется также как и поиск любых других объектов - с помощью FilteredElementCollector
Название: Re: Расчётные значения
Отправлено: Сергей Одегов от 30-04-2015, 17:08:12
В интерфейсе пользователя создать в спцификации произвольное текстовое поле нельзя. А значит нельзя и с помощью API. Только из параметров.

В интерфейсе я могу создать параметр категории "Общий" типа "Текст". Далее вручную я могу внести любую запись в ячейку столбца данного параметра. Как показано у меня на иллюстрации.
Можно ли программно ввести значение в ячейку столбца?
Для элементов понятно, но как фильтровать для спецификаций  с помощью FilteredElementCollector. Пожалуйста приведите пример небольшой?
Название: Re: Расчётные значения
Отправлено: Виктор Чекалин от 30-04-2015, 17:18:16
В интерфейсе я могу создать параметр категории "Общий" типа "Текст". Далее вручную я могу внести любую запись в ячейку столбца данного параметра. Как показано у меня на иллюстрации.
Можно ли программно ввести значение в ячейку столбца?
Так ведь параметр то вы создаете не в спецификации, а в проекте и присваиваете его либо типу либо экземпляру определенной категории. В спецификации вы этот параметр выводите. Когда вы в спецификации пишете туда значения, это есть ни что иное, как заполнение значение параметра.
То есть по факту вам надо не в спецификацию значение столбца вводить, а заполнять параметр объекта. Это конечно же можно.

Спецификации имеют тип ViewSchedule, который унаследован от класса Element. Соответственно, чтобы получить все спецификации нужно написать так:
Код - C# [Выбрать]
  1. var collector = new FilteredElementCollector(doc);
  2. var viewSchedules = collector.OfClass(typeof(ViewSchedule)).ToList();
  3.  
Ну а дальше нужный уже выбираете по названию или другим признакам.
Название: Re: Расчётные значения
Отправлено: Сергей Одегов от 30-04-2015, 17:21:03
Спасибо. А как например для спецификации Воздуховодов сделать. Ну уточнить ваш код для конкретной спецификации?
Название: Re: Расчётные значения
Отправлено: Виктор Чекалин от 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.  

Это выберутся все спецификации, у которых категория - Воздуховоды. Если она одна, то берите первую. Если их несолкько, то фильтруйте еще и по имени.
Название: Re: Расчётные значения
Отправлено: Сергей Одегов от 05-05-2015, 09:37:47
Спасибо. Больше всего мне понравилось лямбда выражение )))) :)