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

13/04/2014

Создание наклонного перекрытия

Вопрос: Возможно ли программно создать наклонное перекрытие?

Ответ: Перед тем как узнать есть ли возможность создавать наклонное перекрытие с помощью Revit API, давайте разберемся как его создавать в интерфейсе.

Наклонное перекрытие можно создать тремя способами:

  1. Редактирование фигуры плиты
  2. Направление уклона
  3. Формирование уклона для границы перекрытия

Вам судя по всему нужно перекрытие с одним уклоном.

Вы можете попробовать задать уклон, путем редактирования границы перекрытия и задать для одной из линий границ «формирование уклона». В результате будет создано перекрытие с единственным уклоном.

Другой способ, который позволяет более гибко контролировать направление уклона – это задать непосредственно этот уклон в режиме редактирования перекрытия.

Еще один способ – «редактирование фигуры» позволяет вам разделить перекрытие на несколько зон и для каждой зоны задать свой уклон

Имейте ввиду, что эти три метода взаимоисключающие.

Ниже представлены скриншоты всех трех способов:

1. Редактирование фигуры

2. Направление уклона


3. Формирование уклона для границы

Из коде, представленном в оригинальном посте, я предположил, что проблема в том, что линии лежат не в горизонтальной плоскости.

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

Функциональность по редактированию фигуры в Revit API доступна в классе SlabShapeEditor. Экземпляр этого класса можно получить с помощью свойства с таким же именем у объекта классов Floor и RoofBase. В примерах к SDK есть пример использования этого класса.

К сожалению, остальные методы по созданию уклона похоже не доступны для программного изменения значения уклона для уже существующего перекрытия, так как параметр CURVE_IS_SLOPE_DEFINING (формирование уклона) доступен только для чтения.

Формирование уклона можно без труда поменять для крыши, с помощью свойства FootPrintRoof.SlopeAngle и мы уже делали это ранее.

А вот с перекрытием беда. Вот код где я пытался использовать параметры CURVE_IS_SLOPE_DEFINING и ROOF_SLOPE. Но, беуспешно:

Код - C#: [Выделить]
  1.             UIApplication uiapp = commandData.Application;
  2.             UIDocument uidoc = uiapp.ActiveUIDocument;
  3.             Document doc = uidoc.Document;
  4.             Selection sel = uidoc.Selection;
  5.  
  6.             Reference ref1 = sel.PickObject(
  7.               ObjectType.Element, "Выберите перекрытие.");
  8.  
  9.             Floor f = doc.GetElement(ref1) as Floor;
  10.  
  11.             if (f == null)
  12.                 return Result.Failed;
  13.  
  14.             // Получаем линии границы перекрытия
  15.  
  16.             ICollection<ElementId> deleted_ids;
  17.  
  18.             using (Transaction tx = new Transaction(doc))
  19.             {
  20.                 tx.Start("Временно удаляем перекрытие");
  21.  
  22.                 deleted_ids = doc.Delete(f.Id);
  23.  
  24.                 tx.RollBack();
  25.             }
  26.  
  27.             // Берем первую попавшуюся линию
  28.  
  29.             ModelLine ml = null;
  30.  
  31.             foreach (ElementId id in deleted_ids)
  32.             {
  33.                 ml = doc.GetElement(id) as ModelLine;
  34.  
  35.                 if (null != ml)
  36.                 {
  37.                     break;
  38.                 }
  39.             }
  40.  
  41.             if (null != ml)
  42.             {
  43.                 using (Transaction tx = new Transaction(doc))
  44.                 {
  45.                     tx.Start("Меняем угол");
  46.  
  47.                     // К сожалению, параметр только для чтения
  48.                     // поэтому изменить значения для существующего
  49.                     // перекрытия не получится:(                   
  50.  
  51.                     ml.get_Parameter(
  52.                       BuiltInParameter.CURVE_IS_SLOPE_DEFINING)
  53.                         .Set(1);
  54.  
  55.                     ml.get_Parameter(
  56.                       BuiltInParameter.ROOF_SLOPE)
  57.                         .Set(1.2);
  58.  
  59.                     tx.Commit();
  60.                 }
  61.             }
  62.             return Result.Succeeded;

Создание нового перекрытия с уклоном

В Revit API есть два метода подходящих для наших целей: NewFloor и NewSlab.

Метод NewFloor имеет 3 перегруженных реализации со следующими параметрами:

  • CurveArray, Boolean. Создает перекрытие в проекте с заданными границами, лежащими в горизонтальной плоскости используя тип перекрытия по умолчанию
  • CurveArray, FloorType, Level, Boolean. Создает перекрытие в проекте с заданными границами, лежащими в горизонтальной плоскости с заданным типом перекрытия на указанном уровне.
  • CurveArray, FloorType, Level, Boolean, XYZ. Создает перекрытие в проекте с заданными границами, лежащими в горизонтальной плоскости с заданным типом перекрытия на указанном уровне и с заданным вектором нормали.

Последняя реализация метода содержит вектор нормали. Это радует. Возможно это как раз то что нам нужно, и мы сможем создать перекрытие с уклоном с помощью этого метода. Но, не тут то было. В нашем случае этот метод не поможет. Эта нормаль не используется для указания уклона, а всего лишь позволяет указать, какую сторону перекрытия следует рассматривать верней и нижней. Фактически значения может быть всего лишь два: (0,0,1) или (0,0,-1).

А вот метод NewSlab имеет всего лишь одну реализацию и принимает такие параметры:

  • CurveArray – массив кривых, задающих границу
  • Level - уровень
  • Line slopedArrow – линия – направление уклона
  • double slope - уклон
  • bool isStructural – несущее или нет

Перекрытие с единственным уклоном можно создать программно передав нужное значение параметра в метод NewSlab.

Вот пример команды по создания перекрытия с уклоном:

Код - C#: [Выделить]
  1.             UIApplication uiapp = commandData.Application;
  2.             UIDocument uidoc = uiapp.ActiveUIDocument;
  3.             Document doc = uidoc.Document;
  4.  
  5.             using (Transaction tx = new Transaction(doc))
  6.             {
  7.                 tx.Start("Create Sloped Slab");
  8.  
  9.                 double width = 19.685039400;
  10.                 double length = 59.055118200;
  11.                 double height = 9.84251968503937;
  12.  
  13.                 XYZ[] pts = new XYZ[] {
  14.                   new XYZ( 0.0, 0.0, height ),
  15.                   new XYZ( width, 0.0, height ),
  16.                   new XYZ( width, length, height ),
  17.                   new XYZ( 0, length, height )
  18.                 };
  19.  
  20.                 CurveArray profile
  21.                   = uiapp.Application.Create.NewCurveArray();
  22.  
  23.                 Line line = null;
  24.  
  25.                 int n = pts.GetLength(0);
  26.  
  27.                 XYZ q = pts[n - 1];
  28.  
  29.                 foreach (XYZ p in pts)
  30.                 {
  31.                     line = Line.CreateBound(q, p);
  32.                     profile.Append(line);
  33.                     q = p;
  34.                 }
  35.  
  36.                 Level level
  37.                   = new FilteredElementCollector(doc)
  38.                     .OfClass(typeof(Level))
  39.                     .Where<Element>(
  40.                       e => e.Name.Equals("Уровень с наклонным перекрытием"))
  41.                       .FirstOrDefault<Element>() as Level;
  42.  
  43.                 if (null == level)
  44.                 {
  45.                     level = doc.Create.NewLevel(height);
  46.                     level.Name = "Уровень с наклонным перекрытием";
  47.                 }
  48.  
  49.                 Floor floor = doc.Create.NewSlab(
  50.                   profile, level, line, 0.5, true);
  51.  
  52.                 tx.Commit();
  53.             }
  54.             return Result.Succeeded;

Команда создает перекрытие с уклоном 0.5. Помните, что это в данном контексте это означает уклон, а не угол.

Перекрытие создается на отдельном уровне.

Из-за расположения уровней, созданное перекрытие не видно на Уровне 1 и частично видно на уровне 2:

 

На виде Фасад – Северный видны уровне и созданное перекрытие:

 

Скачать готовый проект вы можете на GitHub. Обсуждаемая команда - CmdCreateSlopedSlab.

Версия примеров, обсуждаемая в статье - 2014.0.108.0

Источник: http://thebuildingcoder.typepad.com/blog/2014/03/creating-a-sloped-floor.html

Обсуждение: http://adn-cis.org/forum/index.php?topic=675

Опубликовано 13.04.2014