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

ADN Club => Revit API => Тема начата: Art от 30-09-2018, 00:35:47

Название: Колонны
Отправлено: Art от 30-09-2018, 00:35:47
Понимаю, что тема скорее всего уже заезженна. Нужно создать колонну и изменить её высоту после создания.
Нашел код в api revit:

Код - C# [Выбрать]
  1. FamilyInstance CreateColumn(Document document, Level level)
  2.         {
  3.             // Get a Column type from Revit
  4.             FilteredElementCollector collector = new FilteredElementCollector(document);
  5.             collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralColumns);
  6.             FamilySymbol columnType = collector.FirstElement() as FamilySymbol;
  7.             FamilyInstance instance = null;
  8.             if (null != columnType)
  9.             {
  10.                 XYZ origin = new XYZ(0, 0, 0);
  11.                 instance = document.Create.NewFamilyInstance(origin, columnType, level, Autodesk.Revit.DB.Structure.StructuralType.Column);          
  12.             }
  13.             return instance;
  14.         }

Вызываю ее с помощью
Код - C# [Выбрать]
  1. FamilyInstance column = CreateColumn(activeDoc, level);

Проблемы:
а) Не могу найти как изменить высоту.
б) Колонна на чертеже похоже вообще не появляется.
Название: Re: Колонны
Отправлено: Александр Ривилис от 30-09-2018, 00:56:55
б) Колонна на чертеже похоже вообще не появляется.
Может транзакции не хватает?
Название: Re: Колонны
Отправлено: Art от 30-09-2018, 11:38:02
Я об этом подумал, когда лег спать. Сейчас проверю. А что с высотой? Как мне её сменить?
Название: Re: Колонны
Отправлено: Art от 30-09-2018, 12:40:16
Транзакт не спасает. Колонна все равно не появляется.
Конкретного свойства высоты так и не нашел. Увы.
Название: Re: Колонны
Отправлено: Art от 30-09-2018, 18:05:56
Немного помучившись, довел код до "ума". Теперь архитектурная колонна адекватно создается.
Параметр увеличения нашел, он под номером -1001358 (с помощью ревитлукапа).
Вопрос остается в том, как имея FamilyInstance изменить у него высоту (а желательно ещё ширину по х,у, т.е. выйти как-то в типы). Никаких set_parameter(id,double) и даже обычных set_parametr я не нашел  :-\

Код - C# [Выбрать]
  1. public void ColumnCreate(Document activedoc)
  2.             {
  3.                 FilteredElementCollector collector = new FilteredElementCollector(activedoc);
  4.                 collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_Columns);
  5.                 FamilySymbol columnType = collector.FirstElement() as FamilySymbol;
  6.                 FamilyInstance instance = null;
  7.                 if (null != columnType)
  8.                 {
  9.                     XYZ origin = new XYZ(x, y, 0);
  10.                     origin = origin / 304.797;
  11.                     Transaction t = new Transaction(activedoc, "Create Column");
  12.                     t.Start();
  13.                     columnType.Activate();
  14.                     instance = activedoc.Create.NewFamilyInstance(origin, columnType, level.level_Revit, Autodesk.Revit.DB.Structure.StructuralType.Column);
  15.                     t.Commit();
  16.                 }
  17.             }
Название: Re: Колонны
Отправлено: Art от 30-09-2018, 21:07:20
Возможно, новичкам будет полезно. Код Вышел примерно таким. Все ID посмотрел через ревит лукап. Не понравилось, что я не могу обратиться к weight напрямую через id или parameter_name. Либо я не умею? Тогда подскажите как. Суть в том, что BuiltInParameter у weight не определен, а остальные перегрузки абсолютно бесполезны. Я бы очень хотел избавиться от этого убогого цикла, за который в местах более приличных, меня бы посадили на бутылку.

Код - C# [Выбрать]
  1. public void ColumnCreate(Document activedoc)
  2.             {
  3.                 FilteredElementCollector collector = new FilteredElementCollector(activedoc);
  4.                 collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_Columns);
  5.                 FamilySymbol columnType = collector.FirstElement() as FamilySymbol;
  6.                 FamilyInstance instance = null;
  7.                 if (null != columnType)
  8.                 {
  9.                     XYZ origin = new XYZ(x, y, 0);
  10.                     origin = origin / 304.797;
  11.                     Transaction t = new Transaction(activedoc, "Create Column");
  12.                     t.Start();
  13.                     columnType.Activate();
  14.                     instance = activedoc.Create.NewFamilyInstance(origin, columnType, level.level_Revit, Autodesk.Revit.DB.Structure.StructuralType.Column);
  15.                     instance.Name = "Generated Plagin for Coloumn " + instance.Id;
  16.                     instance.get_Parameter(BuiltInParameter.FAMILY_TOP_LEVEL_OFFSET_PARAM).Set(height / 304.797);
  17.                     FamilySymbol sym = null;
  18.                     sym = instance.Symbol.Duplicate("Generated plagin for coloumn " + instance.Id.ToString()) as FamilySymbol;
  19.  
  20.                     foreach (Parameter p in sym.Parameters)
  21.                     {
  22.                         if (p.Id.IntegerValue == 33121)
  23.                         {
  24.                             p.Set(500);
  25.                         }
  26.                         if (p.Id.IntegerValue == 33120)
  27.                         {
  28.                             p.Set(500);
  29.                         }
  30.                     }
  31.                     instance.Symbol = sym;
  32.                     t.Commit();
  33.                 }
  34.             }
Название: Re: Колонны
Отправлено: Александр Пекшев aka Modis от 02-10-2018, 00:40:09
Не надо никаких ID параметров! Они именованы и имена их известны!

(https://i.postimg.cc/6781BShx/Screenshot_4.png) (https://postimg.cc/6781BShx)

А у класса Element, который является базовым для FamilyInstance, есть метод get_Parameter(), с помощью которого и нужно получать нужный параметр.

(https://i.postimg.cc/G4HZpHcf/Screenshot_5.png) (https://postimg.cc/G4HZpHcf)

Или можно пробежаться по всем параметрам элемента и найти нужный по тому-же свойству (или любому другому)

И не стоит забывать, что у колонн в Ревите нет такого понятия, как "Высота"! Есть два зависимых уровня (нижний и верхний) и два смещения (снизу и сверху), а это уже 4 параметра!
Название: Re: Колонны
Отправлено: Александр Пекшев aka Modis от 02-10-2018, 00:48:16
Не понравилось, что я не могу обратиться к weight
weight - это, кстати, вес  ;D
Название: Re: Колонны
Отправлено: Art от 02-10-2018, 02:26:43
Я менял ширину по х,y с помощью цикла, т.к не нашёл в типах колонн их текстовые параметры, только числовые. Для высоты, как видишь по коду, было сделано через готовый текстовый параметр.
И да, width*. Ваша правда :)
Название: Re: Колонны
Отправлено: Александр Пекшев aka Modis от 02-10-2018, 11:39:04
Я менял ширину по х,y с помощью цикла, т.к не нашёл в типах колонн их текстовые параметры, только числовые.
Вы с какой программы в Ревит пришли? А сами в Ревите работали?

Колонна - это семейство. Если создавать простую колонну по стандартному шаблону семейства колонны, то там по умолчанию уже есть два параметра - длина и ширина - которые меняю опорные плоскости(!). Сама геометрия колонны уже привязана к опорным плоскостям. Это если правильная колонна. В этом случае будут иметься параметры "Длина" и "Ширина", которые можно взять и поменять. И то - только при условии, что вы точно знаете их имена. Например, в английском Ревите ваш код уже не сработает
Далее - колонну можно создать и неправильно. Без этих параметров. Или назвав их по-другому. Можно создать вообще без параметров. А есть еще колонны, например, из швеллера, где не должна меняться ни ширина, ни длина, так как это данные сортаментов. А еще я могу создать колонну буквой "Ю" или вообще любой другой и непонятной формы. И что вы будете тогда делать? Что искать и что менять?

Это я все к тому, чтобы вы понимали, прежде чем начинаете какую-то задачу решать, что решения может просто не существовать. И в случае с колоннами - его и не существует. Вы можете только создать плагин ПОД КОНКРЕТНО ИЗВЕСТНОЕ СЕМЕЙСТВО колонн. Если поюзаете чужие плагины, которые генерируют балки, колонны и т.п., то обратите внимание, что эти плагины "таскают" семейства с собой и не работают с вашими, ибо, повторюсь - это НЕВОЗМОЖНО!