Колонны

Автор Тема: Колонны  (Прочитано 3860 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Колонны
« : 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);

Проблемы:
а) Не могу найти как изменить высоту.
б) Колонна на чертеже похоже вообще не появляется.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Колонны
« Ответ #1 : 30-09-2018, 00:56:55 »
б) Колонна на чертеже похоже вообще не появляется.
Может транзакции не хватает?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Re: Колонны
« Ответ #2 : 30-09-2018, 11:38:02 »
Я об этом подумал, когда лег спать. Сейчас проверю. А что с высотой? Как мне её сменить?

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

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Re: Колонны
« Ответ #3 : 30-09-2018, 12:40:16 »
Транзакт не спасает. Колонна все равно не появляется.
Конкретного свойства высоты так и не нашел. Увы.

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

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Re: Колонны
« Ответ #4 : 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.             }

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

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Re: Колонны
« Ответ #5 : 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.             }

Отмечено как Решение Art 14-10-2018, 19:17:50

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Колонны
« Ответ #6 : 02-10-2018, 00:40:09 »
Не надо никаких ID параметров! Они именованы и имена их известны!



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



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

И не стоит забывать, что у колонн в Ревите нет такого понятия, как "Высота"! Есть два зависимых уровня (нижний и верхний) и два смещения (снизу и сверху), а это уже 4 параметра!

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Колонны
« Ответ #7 : 02-10-2018, 00:48:16 »
Не понравилось, что я не могу обратиться к weight
weight - это, кстати, вес  ;D

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

  • ADN OPEN
  • Сообщений: 22
  • Карма: 0
Re: Колонны
« Ответ #8 : 02-10-2018, 02:26:43 »
Я менял ширину по х,y с помощью цикла, т.к не нашёл в типах колонн их текстовые параметры, только числовые. Для высоты, как видишь по коду, было сделано через готовый текстовый параметр.
И да, width*. Ваша правда :)

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Колонны
« Ответ #9 : 02-10-2018, 11:39:04 »
Я менял ширину по х,y с помощью цикла, т.к не нашёл в типах колонн их текстовые параметры, только числовые.
Вы с какой программы в Ревит пришли? А сами в Ревите работали?

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

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