Добрый день!
Столкнулся с задачей создания размера для арматурного стержня. По поводу размеров для стен было написано неоднократно, я думал, что для стержня (для простоты взят стержень стандартной формы без отгибов) это будет так же. Однако столкнулся с проблемой: для создания размера нам нужны как минимум 2 Reference, соответственно нам нужны ссылки на концы стержня.
Методом
var rebcc = (vertreb as Rebar).GetCenterlineCurves(false, false, false, MultiplanarOption.IncludeOnlyPlanarCurves).First();
мы получаем центральную линию стержня, но у этой линии нет возможности получить Reference концов.
Reference rebendref = ((vertreb as Rebar).GetCenterlineCurves(false, false, false, MultiplanarOption.IncludeOnlyPlanarCurves).First() as Line).GetEndPointReference(0);
выдает null. Это так же можно посмотреть через Revit LookUp, где в свойстве Rebar GetCenterlineCurves видно, что у Line нет EndReference (точнее они null)
В комментарии к свойству Reference класса Line я вычитал
This value is set for curve geometry obtained from Revit elements. a null reference ( Nothing in Visual Basic) if the curve was created via parameters, copying, transform, or other operations.
то есть построить параллельные линии по координатам конечных точек стержня и привязать к ним размер не получится. Поэтому я решил получить Line через геометрию стержня:
Options ropt = new Options();
ropt.ComputeReferences = true;
ropt.IncludeNonVisibleObjects = false;
ropt.DetailLevel = ViewDetailLevel.Medium;
var rebg = vertreb.get_Geometry(ropt);
в результате снятия геометрии при настройке детализации "Средняя" или "Низкая" мы получаем единственный объект типа Line, у которого уже можем получить конечные точки, а так же, что нам и надо, ссылки на эти точки.
но при добавлении полученных Reference в referenceArray для создания размера происходит непонятная штука - размер создается, но нулевой и не понятно куда привязанный.
![](https://s14.postimg.org/3m2tpdd31/image.png)
Через Revit lookup я сравнил References созданного размера и References размера, поставленного вручную (правильного), отличий нет и в самих Reference нет указания на точку привязки, только на родительский элемент.
Может кто-то сталкивался с такой проблемой? как образмерить линейный элемент?
код создания размера:
FilteredElementCollector rcollector = new FilteredElementCollector(doc,doc.ActiveView.Id).WhereElementIsNotElementType();
IList<Element> rebsonview =rcollector.OfCategory(BuiltInCategory.OST_Rebar).ToElements();
var vertRebar = rebsonview.FirstOrDefault(x => ((x as Rebar).GetCenterlineCurves(false, false, false, MultiplanarOption.IncludeOnlyPlanarCurves).First() as Line).Direction.IsAlmostEqualTo(doc.ActiveView.UpDirection.Normalize()) ||
((x as Rebar).GetCenterlineCurves(false, false, false, MultiplanarOption.IncludeOnlyPlanarCurves).First() as Line).Direction.IsAlmostEqualTo(doc.ActiveView.UpDirection.Negate().Normalize()));
ReferenceArray secrefarr = new ReferenceArray();
Options ropt = new Options();
ropt.ComputeReferences = true;
ropt.View = doc.ActiveView;
ropt.IncludeNonVisibleObjects = false;
GeometryElement rebg = vertRebar.get_Geometry(ropt);
secRefarr.Append((rebg.First() as Line).GetEndPointReference(0));
secRefarr.Append((rebg.First() as Line).GetEndPointReference(1));
Line dmmline1 = Line.CreateUnbound(dimmPoint1,doc.ActiveView.UpDirection);
doc.Create.NewDimension(doc.ActiveView,dmmline2,secRefarr);