ADN Club > Revit API
Выбор грани в документе ссылке RevitLink
(1/1)
Ksarrik:
Добрый день. Есть задача получения граней элементов (например стен) для последующей обработки, например расстановки креплений. Я хотел использовать следующий код (пример макроса):
--- Код - C# [Выбрать] ---public void Start() { //Получение активного документа UIApplication App=this.ActiveUIDocument.Application; Autodesk.Revit.DB.Document doc = App.ActiveUIDocument.Document; //Получаем активный документ Autodesk.Revit.UI.UIDocument uidoc = App.ActiveUIDocument; //Получаем активный uiдокумент Selection choices = uidoc.Selection; Reference faceRef=choices.PickObject(ObjectType.Face); if(faceRef!=null) { Element elem = doc.GetElement(faceRef); if(elem!=null) { var face = elem.GetGeometryObjectFromReference(faceRef); if(face!=null) { TaskDialog.Show("Info",face.GetType().Name); } } } } В активном документе все прекрасно работает. Проблема в том что проектировщики архитектуру хранят в отдельном файле и подгружают их как ссылку. Метод PickObject не срабатывает на элементах внутри документов ссылок. Существует ли способ выбора и получения граней ссылочных документов наподобие метода PickObject чтобы проектировщик сам выбирал грань с которой работать?
Пока что единственный вариант какой приходит в голову это использовать ObjectType.LinkedElement, затем как-то обрабатывая геометрию, находить ближайшую грань к элементу для которого нужно расставлять крепление.
Александр Игнатович:
Совсем красиво не получится, придется спросить пользователя, что он хочет выбрать - грани элементов текущего файла или ссылки (ну, или 2 отдельные команды как вариант)
Дальше, понадобится реализовать ISelectionFilter и использовать вот этот overload:
--- Код - C# [Выбрать] ---public Reference PickObject( ObjectType objectType, ISelectionFilter selectionFilter)
Ksarrik:
Допустим я использую ObjectType.LinkedElement для документов ссылок. Далее переопределяю интерфейс ISelectionFilter, он содержит два метода AllowElement и AllowReference. Переопределяя эти методы я могу добавлять фильтрацию для класса Element но класс Face не является наследником Element, поэтому грани переопределяя этот метод отфильтровать я не смогу. Получается нужно перебирая грани выбранного элемента находить нужную грань и с ней работать? или есть возможность сразу отфильтровать грани?
Александр Игнатович:
AllowReference is the key
Ksarrik:
Спасибо. Вот такое решение получилось, как мне кажется более менее универсальное может кому пригодится, пример макроса:
--- Код - C# [Выбрать] --- public partial class ThisApplication { public void GetFaceUniversal() { //Получение активного документа UIApplication App=this.ActiveUIDocument.Application; Autodesk.Revit.DB.Document doc = App.ActiveUIDocument.Document; //Получаем активный документ Autodesk.Revit.UI.UIDocument uidoc = App.ActiveUIDocument; //Получаем активный uiдокумент Selection choices = uidoc.Selection; FaceFilter filter=new FaceFilter(doc); Reference faceRef=choices.PickObject(ObjectType.PointOnElement,filter); if(faceRef!=null) { Element elem = doc.GetElement(faceRef); if(elem!=null) { if(elem is RevitLinkInstance) { RevitLinkInstance ri = elem as RevitLinkInstance; Document docLinked = ri.GetLinkDocument(); Reference linkedref=faceRef.CreateReferenceInLink(); if(linkedref!=null) { Element linkedelement = docLinked.GetElement(linkedref); var faceLink = linkedelement.GetGeometryObjectFromReference(linkedref); if(faceLink!=null) { TaskDialog.Show("Info",faceLink.GetType().Name+" Имя документа: "+linkedelement.Document.PathName); } } } else { var face = elem.GetGeometryObjectFromReference(faceRef); if(face!=null) { TaskDialog.Show("Info",face.GetType().Name+" Имя документа: "+elem.Document.PathName); } } } } } } public class FaceFilter : ISelectionFilter { public bool AllowElement(Element element) { return true; } public bool AllowReference(Reference refer, XYZ point) { if(refer.ElementReferenceType== ElementReferenceType.REFERENCE_TYPE_SURFACE) { return true; } return false; } } :
Навигация
Перейти к полной версии