Параметры в спецификации

Автор Тема: Параметры в спецификации  (Прочитано 20348 раз)

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

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Параметры в спецификации
« : 18-11-2013, 09:36:25 »
Доброго времени суток!

Возможно ли при создании спецификации самому задать параметры в столбцах?
Например, чтобы уровень был в отдельном столбце. 

Спасибо!

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Параметры в спецификации
« Ответ #1 : 18-11-2013, 09:55:17 »
Александр, добрый день.

С помощью API вы сможете сделать не более чем пользователь может делать в интерфейсе.

Для ответа на ваш вопрос, нужно уточнить пару моментов:
1) Вы создаете спецификацию с помощью API с нуля или редактируете существующую?
2) Я правильно понимаю, что вы хотите добавить новое поле спецификации из произвольного параметра, при этом параметр вы хотите создать так же программно?


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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Параметры в спецификации
« Ответ #2 : 18-11-2013, 10:39:54 »
Виктор,
я создаю спецификацию с нуля.
Да, параметр я хочу создать программно.

Насколько я понимаю, семейство вместо параметра вставить не получится. Например, какую-нибудь дверь засунуть не в саму таблицу, а в её шапку.
« Последнее редактирование: 18-11-2013, 11:16:32 от Alexander »

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Параметры в спецификации
« Ответ #3 : 18-11-2013, 13:14:08 »
Александр,

Программно добавить новое поле в спецификацию можно с помощью метода ScheduleDefinition.AddField().

Чтобы добавить параметр, нужно воспользоваться одним из перегруженных методов и передать еще и идентификатор параметра, который вы хотите вывести.

Например, следующий код добавит в спецификацию поле Семейство и типоразмер в спецификацию.
definition.AddField(ScheduleFieldType.Instance, new ElementId(BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM));
Если же вы хотите добавить в спецификацию значение собственного параметра, то вам нужно найти идентификатор вашего параметра. Чуть позже найду способ как его найти.

А создавать программно сам параметр вы уже научились?
Кстати не совсем ясно зачем вам создавать параметр при создании спецификцаии. Значение этого параметра ведь будет пустым.

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Параметры в спецификации
« Ответ #4 : 18-11-2013, 15:50:22 »
Виктор,

У меня есть несколько уровней, на каждом уровне объекты. Если я строю таблицу и использую AddField(schedulableField.instance), то он выдаёт определённый набор параметров. Я хочу чтобы каждый уровень был в шапке(например 1, 2, 3 и т.д. этаж).
Поэтому думал создать параметр в качестве уровня.

А параметр , насколько понимаю, создаётся с помощью sharedparameter.

Для наглядности таблица их excel(4, 0 это уровни):


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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Параметры в спецификации
« Ответ #5 : 18-11-2013, 16:22:24 »
Чтож, с шаблоном стало более понятно.
Если 0.0 и 4.0 - это шапка, соответствующая уровню, то что означают цифры 26,4 и 70,8?

В теории такую спецификацию создать можно. Но для этого нужно будет создать столько дополнительных параметров, сколько у вас есть уровней. Эти параметры будут видны у каждого объекта. Судя по всему значение большей части этих параметров будет пустым.

Хотелось бы получить более детальное описание желаемой спецификации. Какое будет значение у общих параметров?

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Параметры в спецификации
« Ответ #6 : 18-11-2013, 16:42:26 »
Эти цифры - это площадь стен. Каждая строка в таблице это какая-то стена.

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Параметры в спецификации
« Ответ #7 : 18-11-2013, 17:13:24 »
То есть вам нужно создать спецификацию площади каждой стены на каждом из уровней.

Подобную спецификацию создать программно можно.
Алгоритм следующий:
  • Для каждого уровня в проекте программно создаете новый общий параметр и привязываете его к категории Стена
  • Выбираете все стены в проекте
  • Для каждой стены производите расчет площади поверхности на каждом уровне
  • Записываете значение площади поверхности стены на определенном уровне в соответсвующий параметр
  • Создаете новую спецификацию
  • Добавляете туда поля с созданными общими параметрами

Самое трудное в этом алгоритме - это рассчитать площадь стен на каждом из уровней.
Второй момент - определение идентификатора параметра, который нужен при создании поля спецификации.
Его можно получить так. Выбираем первую попавшуюся стену в проекте. Находим параметр, содержащий значение площади поверхности стены на определенном уровне. Берем свойство Id этого параметра.
Код - C# [Выбрать]
  1.             FilteredElementCollector filteredElementCollector =
  2.                 new FilteredElementCollector(doc);
  3.  
  4.             var firstWall = filteredElementCollector.OfClass(typeof (Wall)).FirstElement() as Wall;
  5.  
  6.             if (firstWall == null)
  7.             {
  8.                 message = "В проекте нет стен";
  9.                 return Result.Failed;              
  10.             }
  11.  
  12.             var level0Param = firstWall.get_Parameter("Уровень 0.0");
  13.  
  14.             var level0ParamId = level0Param.Id;

Но для начала я бы рекомендовал создать сначала параметры и рассчитать площдь стен. Имея эти данные спецификацию можно попробовать и вручную создать.
« Последнее редактирование: 27-11-2013, 21:42:54 от Виктор Чекалин »

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Параметры в спецификации
« Ответ #8 : 18-11-2013, 17:25:14 »
Спасибо за ответ.

Мне нужно в разных столбцах выполнять подсчёт площадей стен расположенных на разных этажах, но имеющих один типоразмер. Первый столбец для 1 этажа, 2 для 2 и т.д. , а последний столбец - итого по всем этажам.
В Ревите можно сформировать подсчёт площадей по строкам, но не по столбцам.

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Параметры в спецификации
« Ответ #9 : 18-11-2013, 17:37:38 »
То есть в вашем случае стена будет находиться только на одном уровне? Если так, то площадь посчитать проще. В любом случае если вы хотите по столбцам, то нужно создавать доп. параметры и сделать по приведенному алгоритму.

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Параметры в спецификации
« Ответ #10 : 19-11-2013, 09:13:07 »
Нет, несколько стен на разных уровнях.
Спасибо за предоставленное решение.

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Параметры в спецификации
« Ответ #11 : 19-11-2013, 09:42:37 »
В дополнение хочу добавить. Так как для каждой стены будет множество параметров с площадью стен на каждом уровне, которые по сути нужны только для спецификации и пользователю не обязательно их видеть в свойствах стены, то программно можно создать скрытые параметры. Пользователь их не будет видеть окне свойств объекта, но для спецификации эти параметры можно будет использовать.

Ну и если уж совсем идти до конца и решить задачу полностью, то нужно еще отслеживать изменение размера стены и при изменении перезаписывать значение параметров, содержащих площадь поверхности стены.

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Параметры в спецификации
« Ответ #12 : 09-12-2013, 15:13:37 »
Добрый день.

Виктор, в продолжении темы хотел поинтересоваться расчётом площади.
Пытаюсь сделать подобным образом:
Код - C# [Выбрать]
  1. FilteredElementCollector filteredElementCollectorWall = new FilteredElementCollector(document);
  2. var wall = filteredElementCollectorWall.OfClass(typeof(Wall)).FirstElement() as Wall;
  3. Parameter widthParam = wall.get_Parameter("Ширина1");
  4. double widthValue = widthParam.AsDouble();
  5. Parameter heightParam = wall.get_Parameter("Длина1");
  6. double heightValue = heightParam.AsDouble();
  7. double areaValue = widthValue * heightValue;
  8. wall.get_Parameter("Площадь_стены").Set(areaValue);
                   

Площадь не считает, может где-то ошибка?

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Параметры в спецификации
« Ответ #13 : 09-12-2013, 15:36:47 »
Александр,
для начала нужно посмотреть значения переменных widthValue и heightValue после того как вы получили их значения из параметров. Поставьте  точку остановки на 7 линии (7 по коду в вашем посте) и в дебагере посмотрите чему равны значения.

Параметры Ширина1 и Длина1 точно имеют тип Double? Проверьте чему равно свойство widthParam.StorageType и heightParam.StorageType

И естественно нужно убедиться что стена, возвращаемая с помощью метода
Код - C# [Выбрать]
  1. var wall = filteredElementCollectorWall.OfClass(typeof(Wall)).FirstElement() as Wall;
содержит не нулевые значение параметров Ширина1 и Длина1

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

  • ADN OPEN
  • Сообщений: 27
  • Карма: 0
Re: Параметры в спецификации
« Ответ #14 : 09-12-2013, 16:12:55 »
Виктор,
спасибо за быстрый ответ.

Проверил все действия, также пробовал менять double на int (и в коде и параметры проекта).
Всё равно не считает.