Как получить размеры динамического блока с помощью чистого NET? (без COM)

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

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

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
можно ли этот контейнер ориентировать под тем же углом, под которым повернута BReference
Нет, но можно, например, повернуть копии блоков вокруг "первой" точки и посмотреть.

Оффлайн Пашин Евгений

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
можно ли этот контейнер ориентировать под тем же углом, под которым повернута BReference?

Можно, если предварительно его создать, а затем повернуть :)

А если создавать непосредственно для повернутого объекта, то только вычисляя диагональ области, НО, как мы видим на рисунке, размер диагонали будет отличаться от длины самого объекта.

Либо такой вариант, НО предупреждаю, что это ИМХО :)
1. Выбрать объект
2. Поворачивать его на 360 градусов с шагом, ну скажем 0,1 градуса, И, для каждого положения объекта вычислять размеры ЗАНИМАЕМОЙ ОБЛАСТИ (габаритный контейнер), в Вашем случае надо лишь узнать длину.
3. Тот из контейнеров, чья длина будет максимальной ВСТАВИТЬ по центру повернутого объекта и повернуть его на тот же угол, что и сам объект.

Решить можно и по-другому, НО буду рад, если у Вас найдётся решение лучше предложенного )))

Оффлайн JohnLennin

  • .Net Teapot
  • ADN OPEN
  • Сообщений: 49
  • Карма: 1
Нет, но можно, например, повернуть копии блоков вокруг "первой" точки и посмотреть.
Но прежде чем повернуть надо понять стоят ли они в один ряд или нет? и вокруг какой точки поворачивать.
Задача примерно такая, есть файл  с кучей BReferences, которые в него вставлены, надо найти те, которые стоят в ряд соприкасаясь. с ортогональными проблем нет, с повернутыми под углом - я могу их сгруппировать по одинаковому rotation, а дальше что с ними делать? вокруг которой точки поворачивать?
Я не совсем до конца понимаю код приведенный здесь, может имеет смысл что-то с преобразованием матрицы в МСК из ПСК блока сделать?

В идеале хотелось бы получить что-то типа вот этого:

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
я могу их сгруппировать по одинаковому rotation, а дальше что с ними делать? вокруг которой точки поворачивать?
Любой точки - (0,0,0) например - а потом смотреть какие "легли в ряды". 

Оффлайн JohnLennin

  • .Net Teapot
  • ADN OPEN
  • Сообщений: 49
  • Карма: 1
Любой точки - (0,0,0) например - а потом смотреть какие "легли в ряды". 
А, понял, тупанул что-то. Т.е. предлагаете выбрать BRef с одинаковым rotation, который не равен 0,90,180,270 и повернуть их все вокруг любой точки на -rotation, затем посмотреть в ряду они или нет, затем снова повернуть обратно на rotation?
Блин... а если в файле сотни объектов? Это ведь очень долго будет. Нет ли поизящнее решения?

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Блин... а если в файле сотни объектов? Это ведь очень долго будет. Нет ли поизящнее решения?
Не думаю, что есть более быстрое решение. И в любом случае у него будут ограничения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Сейчас времени нет проверять, но в качестве идеи:
1. Определять общий Extents3d объектов внутри блока в координатах блока, не транслируя объекты в модель.
2. Вычислить помимо полученных в Extents3d MinPoint и MaxPoint еще 2 точки рамки в координатах блока.
3. Транслировать эти 4 точки в координаты модели и получить нужную рамку.
Может быть, так получится?

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
1. Определять общий Extents3d объектов внутри блока в координатах блока, не транслируя объекты в модель.
С динамическими блоками будет не так просто.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Если с динамическими не будет получаться, то, как вариант, можно попробовать их в статические конвертировать временно.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Блин... а если в файле сотни объектов?
Ну дамаю где-то пол секунды.
з.ы. не надо крутить туда-обратно - выбрал вхождения, сгруппировал их по углу поворота, сделал копии каждой группы сохраняя ссылку на id исходного объекта, повернул и поделил на "однорядцев".

Оффлайн JohnLennin

  • .Net Teapot
  • ADN OPEN
  • Сообщений: 49
  • Карма: 1
Спасибо! Вроде все получилось и ряды правильно определяются, единственное что иногда при определении границы у некоторых динамических блоков выходят за их пределы из-за отображения текста видимых атрибутов. Нельзя ли как-нибудь исключить видимые атрибуты из определения границ блока?

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Вы же копию проверяете - ну так удалить все атрибуты перед обмеркой.

Оффлайн JohnLennin

  • .Net Teapot
  • ADN OPEN
  • Сообщений: 49
  • Карма: 1
Вы же копию проверяете - ну так удалить все атрибуты перед обмеркой.
А атрибуты у блока не удалятся? Я ведь копию BlockReference делаю.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Нельзя ли как-нибудь исключить видимые атрибуты из определения границ блока?
Если используется код отсюда: http://adn-cis.org/forum/index.php?topic=2933.msg12071#msg12071, то нужно закомментировать строки 87-95

Оффлайн JohnLennin

  • .Net Teapot
  • ADN OPEN
  • Сообщений: 49
  • Карма: 1
Спасибо! Теперь границы выехавшего текста не попадают в границы блока.