Сообщество программистов Autodesk в СНГ

ADN Club => Revit API => Тема начата: Антон Останин от 25-05-2015, 11:30:30

Название: Расположение SectionBox
Отправлено: Антон Останин от 25-05-2015, 11:30:30
Добрый день!
Я продолжаю поиски по изолированию элементов прикрепленного документа.
Пробую сделать ограничение видимости при помощи  SectionBox.
Когда это делаю в активном документе:
Код - C# [Выбрать]
  1.  UIApplication uiapp = commandData.Application;
  2.             UIDocument uidoc = uiapp.ActiveUIDocument;
  3.             Application app = uiapp.Application;
  4.             Document doc = uidoc.Document;
  5.             ViewFamilyType viewFamilyType = (from v in new FilteredElementCollector(doc).
  6.                 OfClass(typeof(ViewFamilyType)).
  7.                 Cast<ViewFamilyType>()
  8.                                              where v.ViewFamily == ViewFamily.ThreeDimensional
  9.                                              select v).First();
  10.  Element element= uidoc.Selection.Elements[0];
  11.  BoundingBoxXYZ boundingBox = element.get_BoundingBox(null);
  12.   using (Transaction t = new Transaction(doc, "Create view"))
  13.             {
  14.                 t.Start();
  15.                 View3D view = View3D.CreateIsometric(doc, viewFamilyType.Id);
  16.                 view.Name = " Section Box";
  17.                 t.SetName("Create view " + view.Name);
  18.                 try
  19.                 {
  20.                     view.SetSectionBox(boundingBox);
  21.                 }
  22.                 catch (Exception)
  23.                 {
  24.  
  25.                     throw;
  26.                 }
  27.                 t.Commit();
  28.                 uidoc.ActiveView = view;
  29.             }
  30.  
Всё отлично скрывает.

Но когда я получаю BoundingBoxXYZ элемента из прикрепленного документа, он возвращает точно такие же значения boundingBox, но строит SectionBox в другом месте.
Код - C# [Выбрать]
  1.  
  2.  UIApplication uiapp = commandData.Application;
  3.             UIDocument uidoc = uiapp.ActiveUIDocument;
  4.             Application app = uiapp.Application;
  5.             Document doc = uidoc.Document;
  6.             ViewFamilyType viewFamilyType = (from v in new FilteredElementCollector(doc).
  7.                 OfClass(typeof(ViewFamilyType)).
  8.                 Cast<ViewFamilyType>()
  9.                                              where v.ViewFamily == ViewFamily.ThreeDimensional
  10.                                              select v).First();
  11.  Element element= null;
  12. Reference refElemLinked = uidoc.Selection.PickObject(ObjectType.LinkedElement, "Выделите элемент из прикрепленного документа!");
  13.  foreach (Document linkedDoc in uiapp.Application.Documents)
  14.                {
  15.                    element = linkedDoc.GetElement(refElemLinked.LinkedElementId);    
  16.                }
  17.  BoundingBoxXYZ boundingBox = element.get_BoundingBox(null);
  18.   using (Transaction t = new Transaction(doc, "Create view"))
  19.             {
  20.                 t.Start();
  21.                 View3D view = View3D.CreateIsometric(doc, viewFamilyType.Id);
  22.                 view.Name = " Section Box";
  23.                 t.SetName("Create view " + view.Name);
  24.                 try
  25.                 {
  26.                     view.SetSectionBox(boundingBox);
  27.                 }
  28.                 catch (Exception)
  29.                 {
  30.  
  31.                     throw;
  32.                 }
  33.                 t.Commit();
  34.                 uidoc.ActiveView = view;
  35.             }
  36.  
Необходимы свежие мысли.
Кто-нибудь знает в чем может быть проблема?
Спасибо.
Название: Re: Размер SectionBox
Отправлено: Александр Игнатович от 25-05-2015, 11:33:04
del
Название: Re: Расположение SectionBox
Отправлено: Антон Останин от 25-05-2015, 11:35:03
И в нем выполнить:   view.SetSectionBox(boundingBox2)?
Название: Re: Расположение SectionBox
Отправлено: Александр Игнатович от 25-05-2015, 11:38:46
Нет, сорри, я поторопился просто, сначала была мысль о том, что не совпадает SectionBox из-за настроек вида.


А не получается у Вас потому что element.get_BoundingBox(null) получает модельные координаты элемента, которые уже нужно преобразовывать...
Название: Re: Расположение SectionBox
Отправлено: Антон Останин от 25-05-2015, 11:45:06
Каким образом преобразовать?
Я проверял так: в активном проекте изолировал элемент, записал его координаты boundingBox.
Потом в пустой проект прикрепил этот документ, получил boundingBox этого же элемента, только уже как прикрепленного. Координаты boundingBox оказались идентичными.
Но вот при построении SectionBox он оказывается не в переданных координатах.
То есть при передаче одного и того же значения boundingBox  строит разные SectionBox .
Название: Re: Расположение SectionBox
Отправлено: Антон Останин от 25-05-2015, 12:11:05
Может быть такой вариант, что возвращаются координаты из прикрепленного документа, а в основном он расположен со смещением?
И выходит так что он строит SectionBox по координатам активного файла.
Название: Re: Расположение SectionBox
Отправлено: Александр Игнатович от 25-05-2015, 12:14:12
да, я об этом и писал. Вы получаете bounding box элемента в модельных координатах связанного файла а sectionbox строите в модельных координатах активного файла.

Получить координаты RevitLinkInstance-а можно instance.GetTransform().Origin

А Вами подумать над вопросом, если связанный файл имеет несколько инстансов, как тогда должен работать Ваш алгоритм?
Название: Re: Расположение SectionBox
Отправлено: Александр Игнатович от 25-05-2015, 12:29:39
Да, все проверил, для инстанса связанного файла  instance.GetTransform().Origin - это точка с координатами (0, 0, 0) связанного файла, дальше, я думаю, справитесь)
Название: Re: Расположение SectionBox
Отправлено: Виктор Чекалин от 25-05-2015, 13:38:11
Кто-нибудь знает в чем может быть проблема?
Александр верно заметил. Текущий и связанный документы имеют свою собственную систему координат.
Вот у Джереми есть статейка (http://thebuildingcoder.typepad.com/blog/2013/11/determining-host-document-location-of-a-linked-element.html) как преобразовать координаты, а также примеры кода.
Единственное замечание - нужно использовать не instance.GetTransform(), а instance.GetTotalTransform.
Код - C# [Выбрать]
  1. //Получаем траннсформацию связанного файла относительно текущего
  2. Transform t = rvtlink.GetTotalTransform();
  3. var point = ... / координаты точки в связанном документе
  4. var hostPoint = t.OfPoint(point); // координаты этой же точки в текущем документе
  5.  
Название: Re: Расположение SectionBox
Отправлено: Антон Останин от 25-05-2015, 14:36:21
Спасибо, Александр и Виктор!