Расположение SectionBox

Автор Тема: Расположение SectionBox  (Прочитано 8397 раз)

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Расположение 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.  
Необходимы свежие мысли.
Кто-нибудь знает в чем может быть проблема?
Спасибо.
« Последнее редактирование: 25-05-2015, 13:27:38 от Виктор Чекалин »

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Размер SectionBox
« Ответ #1 : 25-05-2015, 11:33:04 »
del

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Расположение SectionBox
« Ответ #2 : 25-05-2015, 11:35:03 »
И в нем выполнить:   view.SetSectionBox(boundingBox2)?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Расположение SectionBox
« Ответ #3 : 25-05-2015, 11:38:46 »
Нет, сорри, я поторопился просто, сначала была мысль о том, что не совпадает SectionBox из-за настроек вида.


А не получается у Вас потому что element.get_BoundingBox(null) получает модельные координаты элемента, которые уже нужно преобразовывать...

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Расположение SectionBox
« Ответ #4 : 25-05-2015, 11:45:06 »
Каким образом преобразовать?
Я проверял так: в активном проекте изолировал элемент, записал его координаты boundingBox.
Потом в пустой проект прикрепил этот документ, получил boundingBox этого же элемента, только уже как прикрепленного. Координаты boundingBox оказались идентичными.
Но вот при построении SectionBox он оказывается не в переданных координатах.
То есть при передаче одного и того же значения boundingBox  строит разные SectionBox .

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Расположение SectionBox
« Ответ #5 : 25-05-2015, 12:11:05 »
Может быть такой вариант, что возвращаются координаты из прикрепленного документа, а в основном он расположен со смещением?
И выходит так что он строит SectionBox по координатам активного файла.

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Расположение SectionBox
« Ответ #6 : 25-05-2015, 12:14:12 »
да, я об этом и писал. Вы получаете bounding box элемента в модельных координатах связанного файла а sectionbox строите в модельных координатах активного файла.

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

А Вами подумать над вопросом, если связанный файл имеет несколько инстансов, как тогда должен работать Ваш алгоритм?

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Re: Расположение SectionBox
« Ответ #7 : 25-05-2015, 12:29:39 »
Да, все проверил, для инстанса связанного файла  instance.GetTransform().Origin - это точка с координатами (0, 0, 0) связанного файла, дальше, я думаю, справитесь)

Отмечено как Решение Антон Останин 25-05-2015, 14:36:27

Оффлайн Виктор Чекалин

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Re: Расположение SectionBox
« Ответ #8 : 25-05-2015, 13:38:11 »
Кто-нибудь знает в чем может быть проблема?
Александр верно заметил. Текущий и связанный документы имеют свою собственную систему координат.
Вот у Джереми есть статейка как преобразовать координаты, а также примеры кода.
Единственное замечание - нужно использовать не instance.GetTransform(), а instance.GetTotalTransform.
Код - C# [Выбрать]
  1. //Получаем траннсформацию связанного файла относительно текущего
  2. Transform t = rvtlink.GetTotalTransform();
  3. var point = ... / координаты точки в связанном документе
  4. var hostPoint = t.OfPoint(point); // координаты этой же точки в текущем документе
  5.  

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

  • ADN OPEN
  • ***
  • Сообщений: 107
  • Карма: 6
Re: Расположение SectionBox
« Ответ #9 : 25-05-2015, 14:36:21 »
Спасибо, Александр и Виктор!