Reference Intersector doesn’t work in big files
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
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);
}
}