Создание наклонного перекрытия
Вопрос: Возможно ли программно создать наклонное перекрытие?
Ответ: Перед тем как узнать есть ли возможность создавать наклонное перекрытие с помощью Revit API, давайте разберемся как его создавать в интерфейсе.
Наклонное перекрытие можно создать тремя способами:
- Редактирование фигуры плиты
- Направление уклона
- Формирование уклона для границы перекрытия
Вам судя по всему нужно перекрытие с одним уклоном.
Вы можете попробовать задать уклон, путем редактирования границы перекрытия и задать для одной из линий границ «формирование уклона». В результате будет создано перекрытие с единственным уклоном.
Другой способ, который позволяет более гибко контролировать направление уклона – это задать непосредственно этот уклон в режиме редактирования перекрытия.
Еще один способ – «редактирование фигуры» позволяет вам разделить перекрытие на несколько зон и для каждой зоны задать свой уклон
Имейте ввиду, что эти три метода взаимоисключающие.
Ниже представлены скриншоты всех трех способов:
1. Редактирование фигуры2. Направление уклона
3. Формирование уклона для границы
Из коде, представленном в оригинальном посте, я предположил, что проблема в том, что линии лежат не в горизонтальной плоскости.
Не важно, как вы будете создавать уклон, создание перекрытие всегда основывается на уровне, а, следовательно, на горизонтальной поверхности.
Функциональность по редактированию фигуры в Revit API доступна в классе SlabShapeEditor. Экземпляр этого класса можно получить с помощью свойства с таким же именем у объекта классов Floor и RoofBase. В примерах к SDK есть пример использования этого класса.
К сожалению, остальные методы по созданию уклона похоже не доступны для программного изменения значения уклона для уже существующего перекрытия, так как параметр CURVE_IS_SLOPE_DEFINING (формирование уклона) доступен только для чтения.
Формирование уклона можно без труда поменять для крыши, с помощью свойства FootPrintRoof.SlopeAngle и мы уже делали это ранее.
А вот с перекрытием беда. Вот код где я пытался использовать параметры CURVE_IS_SLOPE_DEFINING и ROOF_SLOPE. Но, беуспешно:
- UIApplication uiapp = commandData.Application;
- UIDocument uidoc = uiapp.ActiveUIDocument;
- Document doc = uidoc.Document;
- Selection sel = uidoc.Selection;
- Reference ref1 = sel.PickObject(
- ObjectType.Element, "Выберите перекрытие.");
- Floor f = doc.GetElement(ref1) as Floor;
- if (f == null)
- return Result.Failed;
- // Получаем линии границы перекрытия
- ICollection<ElementId> deleted_ids;
- using (Transaction tx = new Transaction(doc))
- {
- tx.Start("Временно удаляем перекрытие");
- deleted_ids = doc.Delete(f.Id);
- tx.RollBack();
- }
- // Берем первую попавшуюся линию
- ModelLine ml = null;
- foreach (ElementId id in deleted_ids)
- {
- ml = doc.GetElement(id) as ModelLine;
- if (null != ml)
- {
- break;
- }
- }
- if (null != ml)
- {
- using (Transaction tx = new Transaction(doc))
- {
- tx.Start("Меняем угол");
- // К сожалению, параметр только для чтения
- // поэтому изменить значения для существующего
- // перекрытия не получится:(
- ml.get_Parameter(
- BuiltInParameter.CURVE_IS_SLOPE_DEFINING)
- .Set(1);
- ml.get_Parameter(
- BuiltInParameter.ROOF_SLOPE)
- .Set(1.2);
- tx.Commit();
- }
- }
- 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.
Вот пример команды по создания перекрытия с уклоном:
- UIApplication uiapp = commandData.Application;
- UIDocument uidoc = uiapp.ActiveUIDocument;
- Document doc = uidoc.Document;
- using (Transaction tx = new Transaction(doc))
- {
- tx.Start("Create Sloped Slab");
- double width = 19.685039400;
- double length = 59.055118200;
- double height = 9.84251968503937;
- XYZ[] pts = new XYZ[] {
- new XYZ( 0.0, 0.0, height ),
- new XYZ( width, 0.0, height ),
- new XYZ( width, length, height ),
- new XYZ( 0, length, height )
- };
- CurveArray profile
- = uiapp.Application.Create.NewCurveArray();
- Line line = null;
- int n = pts.GetLength(0);
- XYZ q = pts[n - 1];
- foreach (XYZ p in pts)
- {
- line = Line.CreateBound(q, p);
- profile.Append(line);
- q = p;
- }
- Level level
- = new FilteredElementCollector(doc)
- .OfClass(typeof(Level))
- .Where<Element>(
- e => e.Name.Equals("Уровень с наклонным перекрытием"))
- .FirstOrDefault<Element>() as Level;
- if (null == level)
- {
- level = doc.Create.NewLevel(height);
- level.Name = "Уровень с наклонным перекрытием";
- }
- Floor floor = doc.Create.NewSlab(
- profile, level, line, 0.5, true);
- tx.Commit();
- }
- 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