ModPlus Blog

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 остался такой-же, как был у исходного вспомогательного отрезка! И если вы возьмете у этого отрезка параметры в начале и в конце, то получите не самые ожидаемые значения:

Blog 1 

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

© 2018-2024 modplus.org