Reference Intersector doesn’t work in big files

Reference Intersector doesn’t work in big files

kseniiagrafova
Participant Participant
116 Views
0 Replies
Message 1 of 1

Reference Intersector doesn’t work in big files

kseniiagrafova
Participant
Participant

Hi, I have an algorithm that determines the intersection point of two axes of the Grid category and builds a ray in a certain direction using ReferenceIntersector. Up to a certain point (there are not many axes in the project yet) everything works fine, but after some axis (the exact number is unknown) ReferenceIntersector stops working - it simply does not find the required element, although everything is fine with the starting point and direction.

codecode of services that call reference intersetor

 

public class NearestPillarFinder : NearestElementFinder
{
private readonly IRevitDataProvider _revitDataProvider;

public NearestPillarFinder(
IRevitDataProvider revitDataProvider,
IRevitThreadProvider revitThreadProvider) : base(revitDataProvider, revitThreadProvider)
{
_revitDataProvider = revitDataProvider;
}

protected override BuiltInCategory[] TargetCategories =>
new BuiltInCategory[] { BuiltInCategory.OST_Columns };

public override (Element element, double distance) FindNearestElement(
XYZ direction,
XYZ startPoint)
{
return base.FindNearestElement(
direction,
startPoint);
}
}



public abstract class NearestElementFinder : INearestElementFinder
{
private readonly View3D _view3D;
private readonly IRevitDataProvider _revitDataProvider;
private readonly IRevitThreadProvider _revitThreadProvider;

protected abstract BuiltInCategory[] TargetCategories { get; }

public NearestElementFinder(
IRevitDataProvider revitDataProvider,
IRevitThreadProvider revitThreadProvider)
{
_revitDataProvider = revitDataProvider;
_view3D = _revitDataProvider.ActiveDocument.GetDefaultView3D();
_revitThreadProvider = revitThreadProvider;
}

public virtual (Element element, double distance) FindNearestElement(XYZ direction, XYZ startPoint)
{
List<ElementFilter> filters = new List<ElementFilter>();

if (TargetCategories.Length == 0)
{
filters.Add(new ElementIsElementTypeFilter(false));
}

foreach (BuiltInCategory category in TargetCategories)
{
filters.Add(new ElementCategoryFilter(category));
}

LogicalOrFilter combinedFilter = new LogicalOrFilter(filters);

ReferenceIntersector refIntersector = new ReferenceIntersector(
combinedFilter,
FindReferenceTarget.All,
_view3D);

ReferenceWithContext intersectionResult = _revitThreadProvider.Dispatcher.Invoke(() =>
{
var result = refIntersector.FindNearest(startPoint, direction);
return result;
});

Reference reference = intersectionResult?.GetReference();
RevitLinkInstance linkInstance = null;
double distanceToElement = intersectionResult == null ? 0.0 : intersectionResult.Proximity;

return (reference?.ElementId?.GetElement(_revitDataProvider.ActiveDocument),
distanceToElement);
}
}

0 Likes
117 Views
0 Replies
Replies (0)