- Admin
- Revit API
- Просмотров: 97
Revit. Особенность метода Solid.IntersectWithCurve: Origin отрезка результат
Ранее у нас была заметка про Origin у PlanarFace, где мы писали, что Origin может не находиться в границах контура плоскости PlanarFace. А недавно мы столкнулись с еще одной недокументированной особенностью Revit API, которая в некоторых случаях может привести к неправильной работе задуманного алгоритма. И эта особенность – свойство Origin у отрезка, полученного методом Solid.IntersectWithCurve.
Опишем сразу на примере: создадим в пустом проекте элемент с твердым телом и возьмём его твердое тело:
var uiDoc = commandData.Application.ActiveUIDocument;
var doc = uiDoc.Document;
var element = doc.GetElement(uiDoc.Selection.PickObject(ObjectType.Element));
var solid = (Solid)element
.get_Geometry(new Options { DetailLevel = ViewDetailLevel.Fine })
.GetTransformed(Transform.Identity)
.First(e => e is Solid { Volume: > 0 });
Так как для примера мы использовали колонну, то мы точно знаем, что у неё есть точка вставки. Возьмем эту точку и с ее помощью создадим длинный вспомогательный отрезок:
var pt = ((LocationPoint)element.Location).Point;
var helpLine = Line.CreateBound(
pt - (XYZ.BasisZ * 1000),
pt + (XYZ.BasisZ * 1000));
Ну а далее используем метод Solid.IntersectWithCurve и получим отрезок, расположенный внутри твердого тела нашего элемента:
var result = solid.IntersectWithCurve(
helpLine,
new SolidCurveIntersectionOptions { ResultType = SolidCurveIntersectionMode.CurveSegmentsInside });
var insideLine = (Line)result.GetCurveSegment(0);
Так вот, если теперь мы посмотрим на свойства этого отрезка, то увидим, что его Origin остался такой-же, как был у исходного вспомогательного отрезка! И если вы возьмете у этого отрезка параметры в начале и в конце, то получите не самые ожидаемые значения:
И хотя случаев, где это может негативно сказаться на работе алгоритма, не много, они все же есть. Поэтому лучше знать про эту особенность заранее