Проверка общих координат связанных по отношению к их положению

Автор Тема: Проверка общих координат связанных по отношению к их положению  (Прочитано 2508 раз)

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

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Всем привет. Работа с общими координатами в Ревите сделана так, что без бутылки не разберешься ))
Стоит задача - нужно проверить, что физическое положение экземпляра связи соответствует общим координатам, установленным для двух (ну или более) проектов (хоста и связей).
Дело в том, что в Ревите есть косяк - можно сдвинуть экземпляр связи, у которого задана площадка, согласится с этим и при сохранении файла-хоста не сохранять инфу в связи. В этом случае у связи не убирается площадка, но связь находится в неверном положении.
Судя по справке нужно использовать ProjectLocation:
Цитировать
By default, each Revit project contains at least one named location, called Internal. Existing ProjectLocation objects can be found by using the ProjectLocations property on the Document object. New project locations can be created by duplicating an existing project location using the Duplicate method, and modifying the location's project position.

Но я не могу в своей голове усвоить информацию - что и с чем нужно сверять. Нужны идеи

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

  • Administrator
  • *****
  • Сообщений: 1152
  • Карма: 338
  • Skype: alexandr.ignatovich.itc
Привет!

Не слишком много доводилось с общими координатами работать, попробовал в Revit Python shell следующее:

Код - Python [Выбрать]
  1. lookup(doc.ActiveProjectLocation.GetProjectPosition(XYZ.Zero))
  2.  
  3. lookup(selection[0].GetLinkDocument().ActiveProjectLocation.GetProjectPosition(XYZ.Zero))

Если не двигать связь, то значения EastWest/Elevation/NorthSouth совпадают, если подвигать и не публиковать координаты в связанную модель, то значения различаются.

То, что нужно?

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Если не двигать связь, то значения EastWest/Elevation/NorthSouth совпадают
Я правильно понимаю, что это ты вставил связь, НЕ двигал ее и сразу передал координаты?
А надо не так - нужно вставить связь, подвинуть её как требуется и потом передать координаты (т.е. установить площадку и положение связи на площадке). И вот потом еще раз её двинуть

Оффлайн Александр Пекшев aka ModisАвтор темы

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
В общем - со слезами и нервами - вроде как нашел решение. А заодно и пару багов Ревита (опять).
Принцип проверки примерно такой:
1. Проверяем, что связь не выгружена
2. Проверяем, что связь не помечена как "Положения не сохранены" (если помечена, то по умолчанию не проходит проверку)
3. Проверяем, что экземпляр связи имеет площадку (через костыль - спасибо кривому АПИ) (если не имеет, то по умолчанию не проходит проверку)
4. Берем какой-то объект, который мы точно знаем, что существует в связанном документе. Я взял для работы точку съемки (можно было и базовую точку проекта взять)
5. Через метод get_BoundingBox(null) получаем внутренние координаты точки съемки. Это будут координаты во внутренней системе координат связанного документа
6. Получаем Transform экземпляра связи (через GetTotalTransform)
7. Получаем точку съемки связанного документа во внутренней системе координат текущего документа, используя Transform.OfPoint()
8. Получаем ProjectLocation (в русской локализации это "площадка") текущего документа через свойство Document.ActiveProjectLocation (благо, что площадка в текущем документе есть всегда). Используем метод ProjectLocation.get_ProjectPosition(XYZ) (этот метод равносилен команде Ревита "Выдать общие координаты"), которому передаем точку из п.7. Запоминаем
9. Получаем ProjectLocation экземпляра связи (через костыль - спасибо кривому АПИ). Используем метод ProjectLocation.get_ProjectPosition(XYZ), которому передаем точку из п.5. Запоминаем

В п.8 и п.9 получаем экземпляры класса ProjectPosition, которые имеют свойства NorthSouth, EastWest, Elevation (еще есть Angle и еще что-то, но они вроде как не нужны). Вот если значения этих свойств у обоих экземпляров совпадают, значит общие координаты совпадают с физическим положением связи