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;                }        } :

Навигация

[0] Главная страница сообщений

Перейти к полной версии