Использование ReferenceIntersector со связанными файлами
Вопрос: Согласно документации к API, а также предварительного тестирования, ReferenceIntersector не находит пересечения с элементами в связанных файлах в Revit 2015.
Например, мы не сможем найти, что кабельный канал пересекает стену.
Но, в таком случае, для чего у класса ReferenceIntersector есть свойство FindReferencesInRevitLinks? Установив это свойство в значение true ничего не дает.
- ReferenceIntersector refIntersector
- = new ReferenceIntersector( intersectFilter,
- FindReferenceTarget.Face, view3D );
- refIntersector.FindReferencesInRevitLinks = true;
- IList<ReferenceWithContext> referencesWithContext
- = refIntersector.Find( startPoint, rayDirection );
Есть кто-нибудь, у кого получилось получить пересечения с элементами в связанных файлах?
Комментарий: Могу подтвердить, что ни один из приведенных ниже фильтров не работает в Revit 2015 в случае, когда элементы находятся в связанных файлах:
- ElementClassFilter
- ElementMulticlassFilter
- ElementCategoryFilter
- ElementMulticategoryFilter
Я имею ввиду, применяя эти фильтра для поиска стен в связанном файле, не возвращает никаких результатов.
Единственное что работает, это поиск экземпляров класса RevitLinkInstance.
Таким образом, необходимо использовать фильтр по RevitLinkInstance, а затем уже отсеивать результаты самостоятельно.
По моему мнению, это неправильная работа фильтра для поиска элементов в связанном файле. Передавая ElementClassFilter для поиска стен в ReferenceIntersector и задав значение свойство FindReferencesInRevitLinks равным true, должен искать их как в текущей модели, так и в связанной. Документация по этой проблеме крайне несодержательна.
Продолжение вопроса: Мне же пришлось воспользоваться ElementSolidIntersectFilter.
Таким образом, если я хочу найти пересечение кабель-канала со стеной, находящейся в связанном файле, мне сначала нужно воспользоваться ElementSolidIntersectFilter в связанном файле.
ElementSolidIntersectFilter возвращает коллекцию идентификаторов элементов, пересекающихся со стеной в связанном файле, которую я затем передаю в ReferenceIntersector.
Потом использую середину кабель-канала в качестве луча.
Преимущество такого подхода в том, что даже если кабель-канал пересекает стену лишь частично, и центр кабель-канала не пересекает стену, то в этом случае я все равно могу найти такие элементы.
Ответ: Хорошие новости!
Вот этот пример использования ReferenceIntersector, который не работал в Revit 2015 прекрасно работает в Revit 2016:
- public Dictionary<Reference, XYZ> GetIntersectPoints(
- Document doc,
- Element intersect )
- {
- // Ищем 3D вид, чтобы потом передаеть его в
- // конструктор ReferenceIntersector.
- FilteredElementCollector collector
- = new FilteredElementCollector( doc );
- Func<View3D, bool> isNotTemplate = v3
- => !( v3.IsTemplate );
- View3D view3D = collector
- .OfClass( typeof( View3D ) )
- .Cast<View3D>()
- .First<View3D>( isNotTemplate );
- // используем точку, как стартовую точку луча..
- LocationCurve lp = intersect.Location as LocationCurve;
- XYZ startPoint = lp.Curve.GetEndPoint( 0 ) as XYZ;
- XYZ endPoint = lp.Curve.GetEndPoint( 1 ) as XYZ;
- // строим луч вдоль элемента.
- XYZ rayDirection = endPoint.Subtract(
- startPoint ).Normalize();
- List<BuiltInCategory> builtInCats
- = new List<BuiltInCategory>();
- builtInCats.Add( BuiltInCategory.OST_Roofs );
- builtInCats.Add( BuiltInCategory.OST_Ceilings );
- builtInCats.Add( BuiltInCategory.OST_Floors );
- builtInCats.Add( BuiltInCategory.OST_Walls );
- ElementMulticategoryFilter intersectFilter
- = new ElementMulticategoryFilter( builtInCats );
- ReferenceIntersector refIntersector
- = new ReferenceIntersector( intersectFilter,
- FindReferenceTarget.Element, view3D );
- refIntersector.FindReferencesInRevitLinks = true;
- IList<ReferenceWithContext> referencesWithContext
- = refIntersector.Find( startPoint,
- rayDirection );
- IList<XYZ> intersectPoints = new List<XYZ>();
- IList<Reference> intersectRefs
- = new List<Reference>();
- Dictionary<Reference, XYZ> dictProvisionForVoidRefs
- = new Dictionary<Reference, XYZ>();
- foreach( ReferenceWithContext r in
- referencesWithContext )
- {
- dictProvisionForVoidRefs.Add( r.GetReference(),
- r.GetReference().GlobalPoint );
- }
- return dictProvisionForVoidRefs;
- }
Источник: http://thebuildingcoder.typepad.com/blog/2015/07/using-referenceintersector-in-linked-files.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=2952
Опубликовано 28.08.2015