Как определить геометрические размеры объектов внутри листа?

Автор Тема: Как определить геометрические размеры объектов внутри листа?  (Прочитано 9001 раз)

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

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

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Всем добрый день!

Подскажите как можно просто сделать выбор всех объектов на листе с определенным именем и определить размеры области, которую занимают все объекты на листе.
Хотя бы направление, в котором копать дальше )

Есть один момент: объекты могут быть как загружены извне (в виде dxf или любых других), так и оформлены в самом проекте.

Заранее благодарю.

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Евгений, Вот тут я приводил ссылки на статьи, которые должны помочь.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Спасибо, Виктор! Попробую и отпишусь.

Отмечено как Решение Пашин Евгений 20-02-2016, 13:11:02

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Цель достигнута :)

Можно определить область, которую занимают объекты листа не через определение их геометрических размеров, а через свойство самого листа.

Код - vb.net [Выбрать]
  1.     Public Sub Get_Layout_List()
  2.         Dim App As Autodesk.Revit.UI.UIApplication = Me.ExComData.Application
  3.         Dim Doc As Document = App.ActiveUIDocument.Document
  4.  
  5.         Const Koef As Double = 304.8 ' Коэффициент для перевода футов в миллиметры
  6.  
  7.         Dim coll As FilteredElementCollector = New FilteredElementCollector(Doc).OfClass(GetType(ViewSheet))
  8.         ' Перебираем все листы в проекте на предмет определения размеров области печати
  9.         For Each rvtViewSheet As Autodesk.Revit.DB.ViewSheet In coll
  10.             Dim myUVMin As UV = rvtViewSheet.Outline.Min
  11.             Dim myUVMax As UV = rvtViewSheet.Outline.Max
  12.             Dim layWidth As Double = Format(myUVMax.U * Koef - myUVMin.U * Koef, "#0.000")
  13.             Dim layHeight As Double = Format(myUVMax.V * Koef - myUVMin.V * Koef, "#0.000")
  14.             Dim layName As String = rvtViewSheet.SheetNumber & " - " & rvtViewSheet.ViewName
  15.  
  16.             MsgBox("Размеры области печати: " & layWidth & "x" & layHeight & " для листа [" & layName & "]")
  17.  
  18.             ' •••••••••••••••••••••••••••••••••••••••
  19.             ' Здесь происходит запись данных в класс
  20.             ' •••••••••••••••••••••••••••••••••••••••
  21.         Next
  22.  
  23.     End Sub
  24.  

Этот вопрос закрыт :)

Виктор, спасибо!
« Последнее редактирование: 24-02-2016, 07:08:29 от Пашин Евгений »

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
ИМХО - странный коэффициент. Как будто футы переводятся в миллиметры.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
ИМХО - странный коэффициент. Как будто футы переводятся в миллиметры.
А что тебя удивляет? Внутренние единицы измерения в Revit - футы (если мне память не изменяет).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Внутренние единицы измерения в Revit - футы (если мне память не изменяет).

Александр Наумович, у Вас отличная память.

ИМХО - странный коэффициент.

Мне тоже странным кажется использовать в качестве меры фут, и главное, даже не дюйм ) Поправил коэффициент, чтобы никого не смущать )
Уточнил, этой мерой часто пользуются англичане.
« Последнее редактирование: 24-02-2016, 07:07:13 от Пашин Евгений »

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Вообще лучшим решением было бы использовать не коэффициенты, а класс UnitUtils. А точнее, метод ConvertFromInternalUnits.
Например, вот так:
Код - C# [Выбрать]
  1. var myUVMin = UnitUtils.ConvertFromInternalUnits(rvtViewSheet.Outline.Mi, DisplayUnitType.DUT_MILLIMETERS);

Так код выглядит красивее, да и не нужно задумываться о том, в чем хранится значения внутри Revit.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Так код выглядит красивее, да и не нужно задумываться о том, в чем хранится значения внутри Revit.

Согласен. Вдруг завтра там будут хранить значения в дюймах ) Подправлю код.

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
Ну а если уж говорить о совсем идеальном варианте, то надо переводить не в миллиметры, а в ту единицу измерения длины, которая установлена в настройках проекта. :)

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Вообще лучшим решением было бы использовать не коэффициенты, а класс UnitUtils. А точнее, метод ConvertFromInternalUnits.
Например, вот так:
Код - C# [Выбрать]
var myUVMin = UnitUtils.ConvertFromInternalUnits(rvtViewSheet.Outline.Mi, DisplayUnitType.DUT_MILLIMETERS);

Так код выглядит красивее, да и не нужно задумываться о том, в чем хранится значения внутри Revit.


Код - vb.net [Выбрать]
  1.     Public Sub Get_Layout_List()
  2.         Dim App As Autodesk.Revit.UI.UIApplication = Me.ExComData.Application
  3.         Dim UIDoc As UIDocument = App.ActiveUIDocument
  4.         Dim Doc As Document = App.ActiveUIDocument.Document
  5.  
  6.         Dim coll As FilteredElementCollector = New FilteredElementCollector(Doc).OfClass(GetType(ViewSheet))
  7.         ' Перебираем все листы в проекте на предмет определения размеров области печати
  8.         For Each rvtViewSheet As Autodesk.Revit.DB.ViewSheet In coll
  9.             Dim myUVMin As UV = rvtViewSheet.Outline.Min
  10.             Dim myUVMax As UV = rvtViewSheet.Outline.Max
  11.             Dim layWidth As Double = UnitUtils.ConvertFromInternalUnits(rvtViewSheet.Outline.Max.U - rvtViewSheet.Outline.Min.U, DisplayUnitType.DUT_MILLIMETERS)
  12.             Dim layHeight As Double = UnitUtils.ConvertFromInternalUnits(rvtViewSheet.Outline.Max.V - rvtViewSheet.Outline.Min.V, DisplayUnitType.DUT_MILLIMETERS)
  13.             Dim layName As String = rvtViewSheet.SheetNumber & " - " & rvtViewSheet.ViewName
  14.  
  15.             MsgBox("Размеры области печати: " & layWidth & "x" & layHeight & " для листа " & layName)
  16.  
  17.         Next
  18.  
  19.     End Sub
  20.  

Поправил немного :)

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Ну а если уж говорить о совсем идеальном варианте, то надо переводить не в миллиметры, а в ту единицу измерения длины, которая установлена в настройках проекта.

А куда посмотреть, чтобы это увидеть?

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

  • Administrator
  • *****
  • Сообщений: 694
  • Карма: 111
  • Skype: chekalin-v
А куда посмотреть, чтобы это увидеть?
Управление -> Единицы Проекта -> Длина

Программно добраться вроде бы вот так (пишу на память, так что могу где то ошибиться):
Код - C# [Выбрать]
  1. var dut = document.GetUnits().GetFormatOptions(UT_Length).DisplayUnits

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Виктор Чекалин, спасибо!

Честно говоря, даже никогда не пользовался этой функцией )