Найти область вокруг указанного объекта

Автор Тема: Найти область вокруг указанного объекта  (Прочитано 15739 раз)

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

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Столкнулся вот с какой задачкой. Есть профиль. В профиле "подвал" с отметками и расстояниями между ними. Написал код, с помощью которого можно выбрать отдельно отметки и отдельно расстояния, а потом выгрузить их в текстовый файл. Все ничего, но когда профиль длинный предлинный, выбирать становится очень неудобно. Решил улучшить алгоритм и дать пользователю возможность выбрать весь профиль с подвалом вместе, а места в подвале с отметками и расстояниями искать кодом. Если не нашел - сообщить, чтобы руками выбирал, если нашел - выбрать нужное.
Получаю от пользователя SelectionSet с кучей выбранных объектов. Определяю наперед границы всех выбранных объектов. Нахожу среди них два текстовых объекта по текстовому шаблону - с этим проблем нет (на скриншоте - голубой текст). Но дальше застрял. Как найти контур из объектов, обрамляющих текст, чтобы найти соотв. контуры с данными (на скриншоте рыжий и красный прямоугольники соответственно)?
Получив контур вокруг текста в виде, например, Extents3d, можно было бы вычислить и экстенты для исходных данных.


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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Мне кажется, это слишком сложная задача для такого результата. Если пытаться через математику и геометрию, то будет уйма проблем - например как и куда повернута ПСК, в какой плоскости что лежит и т.д. и т.п.
На форуме были вопросы по поиску замкнутого контура вокруг указанной точки - это может быть вам полезным для старта. Поищите
Но на мой взгляд - проще как-то заранее "обыграть" этот момент. Ну например делать нужные контуры на специальном слое. Или с наличием расширенных данных. Или специальным блоком. Или или или...

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

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

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Таблица чем нарисована? Отрезками и текстом или это нормальная Table (AcDbTable) ?
Думаю, была бы это нормальная таблица, то таких вопросов вообще не задавали-бы  ;D

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если это отрезки и тексты, то:
1) находишь текст по шаблону
2) Находишь все тексты, которые попадают в полосу по Y с заданной шириной относительно текста-шаблона
3) Отбираешь среди них те, которые входят в заданную полосу по X (таблица не может быть бесконечной ширины)
4) Сортируешь тексты по X
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Как найти контур из объектов, обрамляющих текст, чтобы найти соотв. контуры с данными (на скриншоте рыжий и красный прямоугольники соответственно)?
Получив контур вокруг текста в виде, например, Extents3d, можно было бы вычислить и экстенты для исходных данных.
Можешь создать штриховку указав точку вставки одного из текстов и получить ее контур. Если текст мешает построению штриховке, скрой его на время. ...точнее скрой все, что мешает построению штриховки, например линии пикетажа.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Можешь создать штриховку указав точку вставки одного из текстов и получить ее контур. Если текст мешает построению штриховке, скрой его на время. ...точнее скрой все, что мешает построению штриховки, например линии пикетажа.
В последних версиях (начиная с 2011) вместо создания штриховки можно воспользоваться методом Editor.TraceBoundary
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Как было верно подмечено, подвал не таблица AcDbTable, а набор линий, полилиний, текстов и мтекстов.
Александр Ривилис, я с п. 2 не понял. Как мне найти ширину полосы по Y? Или Вы имели ввиду как раз TraceBoundary?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Александр Ривилис, я с п. 2 не понял. Как мне найти ширину полосы по Y?
Ты не знаешь высоту строки в таблице? Ну сделай например 10 высот текста-шаблона.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Подвал может быть начерчен в любом масштабе. Изыскатели порой так изощряются...

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Еще раз перечитал вопрос... А зачем вообще нужно находить эти самые рамки? Суть в чем?

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

  • ADN Club
  • **
  • Сообщений: 78
  • Карма: 2
Чтобы выбрать одной секущей рамкой отметки, а другой секущей рамкой расстояния между ними. Что смутило?

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

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Чтобы выбрать одной секущей рамкой отметки, а другой секущей рамкой расстояния между ними. Что смутило?
Смущают лишние действия и усложнение вашей собственной работы. Если вы не сделаете какую-то "обязаловку" (например определенный слой для текста отметок и для текста расстояний), то ваша программа никогда не будет работать правильно, ибо пользователи такого могут наворотить, что волосы на спине дыбом встанут: и масштабы разные, и ПСК повернуть и текст разный (МТекст например), и текст может случайно вылезти за границу (а иногда и не случайно), и "подвал" начертить не пойми чем и еще можно много чего придумать. А в итоге будет все просто - "ваша программа - хрень бесполезная!")))))
А вообще советую - переходите на Civil! Зачем изобретать велосипед там, где его уже изобрели?!

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
1. найти текст по шаблону
2. четерз Editor.TraceBoundary  найти рамку вокруг этого текста
3. взять координаты точки лежащей справа от границ полученного в п.2
4. по точки из п.3 получить Editor.TraceBoundary
5. Выбрать текстовые объекты попадающие в границы из п.4

profit

PS.
Использовать SelectionSet для выбора в п.5, я бы не стал, по понятным ограничениям, хотя выбор секущей имеет смысл реализовать, т.е. смотреть не на точки вставки текстов, а на Extents3d... но выбор за автором.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 475
  • Карма: 63