Выбор грани в документе ссылке RevitLink

Автор Тема: Выбор грани в документе ссылке RevitLink  (Прочитано 8110 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн KsarrikАвтор темы

  • ADN OPEN
  • Сообщений: 35
  • Карма: 2
Добрый день. Есть задача получения граней элементов (например стен) для последующей обработки, например расстановки креплений. Я хотел использовать следующий код (пример макроса):
Код - C# [Выбрать]
  1. public void Start()
  2.                 {
  3.                         //Получение активного документа
  4.                         UIApplication App=this.ActiveUIDocument.Application;
  5.                         Autodesk.Revit.DB.Document doc = App.ActiveUIDocument.Document; //Получаем активный документ                   
  6.                         Autodesk.Revit.UI.UIDocument uidoc = App.ActiveUIDocument; //Получаем активный uiдокумент              
  7.                         Selection choices = uidoc.Selection;
  8.                         Reference faceRef=choices.PickObject(ObjectType.Face);
  9.                         if(faceRef!=null)
  10.                         {
  11.                                 Element elem = doc.GetElement(faceRef);
  12.                                 if(elem!=null)
  13.                                 {
  14.                                         var face = elem.GetGeometryObjectFromReference(faceRef);
  15.                                         if(face!=null)
  16.                                         {
  17.                                                 TaskDialog.Show("Info",face.GetType().Name);
  18.                                         }
  19.                                 }    
  20.                         }
  21.                 }
  22.  
В активном документе все прекрасно работает. Проблема в том что проектировщики архитектуру хранят в отдельном файле и подгружают их как ссылку. Метод PickObject не срабатывает на элементах внутри документов ссылок. Существует ли способ выбора и получения граней ссылочных документов наподобие метода PickObject чтобы проектировщик сам выбирал грань с которой работать?
Пока что единственный вариант какой приходит в голову это использовать ObjectType.LinkedElement, затем как-то обрабатывая геометрию, находить ближайшую грань к элементу для которого нужно расставлять крепление.


Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Совсем красиво не получится, придется спросить пользователя, что он хочет выбрать - грани элементов текущего файла или ссылки (ну, или 2 отдельные команды как вариант)

Дальше, понадобится реализовать ISelectionFilter и использовать вот этот overload:
Код - C# [Выбрать]
  1. public Reference PickObject(
  2.         ObjectType objectType,
  3.         ISelectionFilter selectionFilter
  4. )

Оффлайн KsarrikАвтор темы

  • ADN OPEN
  • Сообщений: 35
  • Карма: 2
Допустим я использую ObjectType.LinkedElement для документов ссылок. Далее переопределяю интерфейс ISelectionFilter, он содержит два метода AllowElement и AllowReference. Переопределяя эти методы я могу добавлять фильтрацию для класса Element но класс Face не является наследником Element, поэтому грани переопределяя этот метод отфильтровать я не смогу. Получается нужно перебирая грани выбранного элемента находить нужную грань и с ней работать? или есть возможность сразу отфильтровать грани?

Оффлайн Александр Игнатович

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
AllowReference is the key

Отмечено как Решение Ksarrik 31-08-2023, 12:08:42

Оффлайн KsarrikАвтор темы

  • ADN OPEN
  • Сообщений: 35
  • Карма: 2
Спасибо. Вот такое решение получилось, как мне кажется более менее универсальное может кому пригодится, пример макроса:
Код - C# [Выбрать]
  1.  
  2.         public partial class ThisApplication
  3.         {
  4.                
  5.                
  6.                 public void GetFaceUniversal()
  7.                 {
  8.                         //Получение активного документа
  9.                         UIApplication App=this.ActiveUIDocument.Application;
  10.                         Autodesk.Revit.DB.Document doc = App.ActiveUIDocument.Document; //Получаем активный документ                   
  11.                         Autodesk.Revit.UI.UIDocument uidoc = App.ActiveUIDocument; //Получаем активный uiдокумент
  12.                        
  13.                         Selection choices = uidoc.Selection;
  14.                         FaceFilter filter=new FaceFilter(doc);
  15.                         Reference faceRef=choices.PickObject(ObjectType.PointOnElement,filter);
  16.                         if(faceRef!=null)
  17.                         {
  18.                                
  19.                                 Element elem = doc.GetElement(faceRef);
  20.                                 if(elem!=null)
  21.                                 {
  22.                                         if(elem is RevitLinkInstance)
  23.                                         {
  24.                                                 RevitLinkInstance ri = elem as RevitLinkInstance;
  25.                                                 Document docLinked = ri.GetLinkDocument();
  26.                                                 Reference linkedref=faceRef.CreateReferenceInLink();
  27.                                                 if(linkedref!=null)
  28.                                                 {
  29.                                                         Element linkedelement = docLinked.GetElement(linkedref);
  30.                                                         var faceLink = linkedelement.GetGeometryObjectFromReference(linkedref);                                                
  31.                                                         if(faceLink!=null)
  32.                                                         {
  33.                                                                 TaskDialog.Show("Info",faceLink.GetType().Name+" Имя документа: "+linkedelement.Document.PathName);
  34.                                                         }
  35.                                                 }
  36.                                                
  37.                                         }
  38.                                         else
  39.                                         {
  40.                                                 var face = elem.GetGeometryObjectFromReference(faceRef);
  41.                                                 if(face!=null)
  42.                                                 {
  43.                                                         TaskDialog.Show("Info",face.GetType().Name+" Имя документа: "+elem.Document.PathName);
  44.                                                 }
  45.                                         }
  46.                                 }
  47.                                
  48.                         }
  49.                 }
  50.        
  51.         }
  52.        
  53.         public class FaceFilter : ISelectionFilter
  54.         {
  55.                
  56.                 public bool AllowElement(Element element)
  57.                 {
  58.                         return true;
  59.                 }
  60.                
  61.                 public bool AllowReference(Reference refer, XYZ point)
  62.                 {
  63.                         if(refer.ElementReferenceType== ElementReferenceType.REFERENCE_TYPE_SURFACE)
  64.                         {
  65.                                 return true;
  66.                         }
  67.                         return false;
  68.                 }
  69.         }
  70.  
: