Как создать спецификацию для набора категорий

Автор Тема: Как создать спецификацию для набора категорий  (Прочитано 6337 раз)

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

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

  • ADN OPEN
  • Сообщений: 1
  • Карма: 0
Добрый день. Я совсем новичок и в C# и в API Revt, поэтому прошу прощения за возможные глупости.
У меня возник вопрос о спецификациях. В SDK для класса ViewSchedule я нашел метод:
CreateSchedule(Document, ElementId, ElementId)
На help.autodesk.com для этого метода написано следующее:
The second parameters the ID of the category whose elements will be included in the schedule, or InvalidElementId for a multi-category schedule.
Можно ли используя данный метод создать спецификацию для определенного набора категорий? К примеру, мне нужно добавить все элементы относящиеся к системе воздуховодов.

Я совсем совсем зелененький, пока это все, что накопипастил:
Код - C# [Выбрать]
  1. public class SchelVent : IExternalCommand
  2. {
  3.     public Result Execute(
  4.     ExternalCommandData commandData,
  5.     ref string message,
  6.     ElementSet elements)
  7.     {
  8.         try
  9.         {
  10.             UIDocument uiDocument = commandData.Application.ActiveUIDocument;
  11.  
  12.             ScheduleCreationUtility utility = new ScheduleCreationUtility();
  13.             utility.CreateAndAddSchedule(uiDocument);
  14.  
  15.             return Result.Succeeded;
  16.         }
  17.         catch (Exception ex)
  18.         {
  19.             message = ex.Message;
  20.             return Result.Failed;
  21.         }
  22.     }
  23. }
  24.  
  25. class ScheduleCreationUtility
  26. {
  27.  
  28.     private static BuiltInParameter[] addedParameters = new BuiltInParameter[7]; //{ BuiltInParameter.ALL_MODEL_MARK };
  29.  
  30.     public void CreateAndAddSchedule(UIDocument uiDocument)
  31.     {
  32.         TransactionGroup tGroup = new TransactionGroup(uiDocument.Document, "Create schedule");
  33.         tGroup.Start();
  34.  
  35.         ViewSchedule schedules = CreateSchedule(uiDocument);
  36.         tGroup.Assimilate();
  37.     }
  38.  
  39.     private ViewSchedule CreateSchedule(UIDocument uiDocument)
  40.     {
  41.         Document document = uiDocument.Document;
  42.  
  43.         Transaction t = new Transaction(document, "Create Schedules");
  44.         t.Start();
  45.  
  46.         //IList<ElementId> categories = new List<ElementId>;
  47.         //categories.Add(new ElementId(BuiltInCategory.OST_DuctCurves));
  48.         //categories.Add(new ElementId(BuiltInCategory.OST_DuctFitting));
  49.         //categories.Add(new ElementId(BuiltInCategory.OST_DuctAccessory));
  50.         //categories.Add(new ElementId(BuiltInCategory.OST_DuctTerminal));
  51.         //categories.Add(new ElementId(BuiltInCategory.OST_MechanicalEquipment));
  52.         //categories.Add(new ElementId(BuiltInCategory.OST_FlexDuctCurves));
  53.  
  54.         ViewSchedule schedule = ViewSchedule.CreateSchedule(document,
  55.             new ElementId(BuiltInCategory.OST_DuctCurves),
  56.             ElementId.InvalidElementId);
  57.  
  58.         foreach (SchedulableField schedulableField in schedule.Definition.GetSchedulableFields())
  59.         {
  60.             ScheduleField field = schedule.Definition.AddField(schedulableField);
  61.         }
  62.  
  63.         t.Commit();
  64.  
  65.         uiDocument.ActiveView = schedule;
  66.  
  67.         return schedule;
  68.     }
  69.  
  70.     private bool ShouldBeAdded(ElementId parameterId)
  71.     {
  72.         foreach (BuiltInParameter bip in addedParameters)
  73.         {
  74.             if (new ElementId(bip) == parameterId)
  75.                 return true;
  76.         }
  77.         return false;
  78.     }
  79. }
  80.  
« Последнее редактирование: 31-08-2018, 00:32:45 от Александр Ривилис »

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
В Revit API только ~5% того, что нельзя сделать руками, практически для всего работает правило "можно сделать руками -> можно сделать через API", ну и наоборот. Руками создать спецификацию для определенного ограниченного набора категорий нельзя, соответственно, нельзя и программно. Соответственно, делаем сначала руками, определяемся с тем, какие фильтры использовать, потом создаем уже фильтры программно, либо вообще берем и копируем в проект существующую руками созданную спеку из другого проекта.

Оффлайн enot

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
В ревит можно вручную для спецификации воздухораспределителей, например, добавить параметр "Номер пространства"

Получаем спецификацию:
 
Код - Python [Выбрать]
  1. Terminal_id= ElementId(BuiltInCategory.OST_DuctTerminal)
  2. newSchedule = ViewSchedule.CreateSchedule(doc, Terminal_id)
  3. definition = newSchedule.Definition

Но сделать это через апи не выходит:

Код - Python [Выбрать]
  1. Room_number = ElementId(BuiltInParameter.ROOM_NUMBER)
  2. definition.AddField(ScheduleFieldType.Instance , Room_number )

В чем может быть ошибка?

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
В чем может быть ошибка?
Ошибка может быть в том, что в API реализованы не все возможности Ревита ¯\_(ツ)_/¯

Оффлайн enot

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
Ошибка может быть в том, что в API реализованы не все возможности Ревита ¯\_(ツ)_/¯
Случай попадания в те самые
~5%
?

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Случай попадания в те самые
Не могу сказать, к сожалению - не работал со спеками. Подождите ответа Александра - у него опыта побольше

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
definition.AddField(ScheduleFieldType.Space, ... и будет Вам счастье

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Случай попадания в те самые


Нет. 5% это, например, DataStorage/ExtensibleStorage, возможность редактирования общих параметров, у которых в файле указано UserModifiable = 0, Direct3d контекст, CustomExporter, возможность добавления собственных способов расчетов для систем MEP, может еще что, на вскидку не помню

Оффлайн enot

  • ADN OPEN
  • *****
  • Сообщений: 525
  • Карма: 2
definition.AddField(ScheduleFieldType.Space, ... и будет Вам счастье
Счастие пришло)
Спасибо , все работает!
меняем значение в зависимости от потребностей
http://www.revitapidocs.com/2018.1/9888db7d-00d0-4fd7-a1a9-cdd1fb5fce16.htm