AutoLISP: выберите текст внутри замкнутых полилиний и определите атрибуты блока с этим текстом.

У меня есть план этажа с несколькими комнатами, определенными замкнутыми ломаными линиями. Внутри каждой полилинии есть несколько текстовых аннотаций (номер комнаты, название комнаты и т. д.). Как я могу создать подпрограмму, которая сканирует рисунок, создает набор выбора, который находит каждую полилинию (находится на определенном слое) и вставляет блок (room_stamp) с атрибутами, соответствующими этим аннотациям. Так, например, для каждой комнаты он вставит блок room_stamp внутрь полилинии, возьмет текст внутри полилинии, который принадлежит слою room_name, и изменит атрибут room_name внутри блока, чтобы он соответствовал ему.

Любая помощь будет очень признательна, так как я только начинаю работать с LIPS.


person user14693180    schedule 23.11.2020    source источник


Ответы (1)


Первым шагом будет получение набора выбора всех замкнутых полилиний, находящихся на целевом слое — для этого вы должны использовать функцию ssget со строковым аргументом режима X (для сканирования всей базы данных чертежей без ввода данных пользователем) и фильтр Фильтр списка аргументов по типу объекта (группа DXF 0) и слою (группа DXF 8) и, необязательно, по битовому кодированию группы DXF 70, чтобы ограничить выбор только замкнутыми ломаными линиями — вы можете обратиться к моему Справочник по функциям ssget, чтобы помочь в построении этого выражения.

Получив выбранный набор полилиний на целевом слое, вы затем перебираете этот набор (существует множество методов для этого), и для каждой полилинии у вас есть один из двух вариантов:

  1. Получите набор выбора многоугольника окна/пересекающегося многоугольника всего текста (возможно, ограниченного целевым слоем), предоставив функции ssget строку режима WP или CP, набор координат вершин полилинии и соответствующий список фильтров.

  2. Получите набор выбора из всех текстовых объектов-кандидатов в активном макете/окне просмотра и используйте алгоритм преобразования лучей или аналогичный, чтобы проверить, находится ли точка вставки каждого текстового объекта в пределах полилинии.

Метод (1) является самым простым, но он также может быть и наименее надежным, так как методы графического выбора функции ssget будут рассматривать только объекты, видимые в области рисования во время вычисления функции, поэтому для большей точности вы должны сначала необходимо масштабировать каждую полилинию перед получением выбора объектов, которые она заключает, а затем восстанавливать предыдущий вид.

Метод (2) более надежен, поскольку он не зависит от состояния графического отображения в AutoCAD, но будет медленнее, так как требует большего количества вычислений и итераций по всему набору текстовых объектов-кандидатов (если только вы не реализуете метод «разделяй и властвуй»). благодаря умному использованию предварительной сортировки множества).

После получения набора текстовых объектов, находящихся внутри полилинии, вам понадобится какой-то способ различать каждый текстовый объект в наборе, чтобы вы заполнили каждый атрибут соответствующим значением. Это будет полностью зависеть от ваших данных - например. находится ли каждый элемент данных на своем собственном слое (например, все ли номера комнат находятся на своем собственном слое, а все названия комнат — на другом?), или вы можете использовать сопоставление с образцом в текстовом содержимом для идентификации номера комнаты. из названия комнаты и другой информации?

После определения соответствующих значений относительно просто вставить новую ссылку на блок с атрибутами (возможно, в центроид полилинии или в точку вставки одного из существующих текстовых объектов) и заполнить атрибуты блока значениями, полученными из text - есть много существующих примеров этого.

person Lee Mac    schedule 23.11.2020
comment
Большое спасибо, Ли Мак! Следовал вашим советам, чтобы прийти к решению. - person user14693180; 08.02.2021
comment
Добро пожаловать @user14693180 ! Пожалуйста, отметьте мой ответ как решение, если он в достаточной степени ответил на ваш вопрос, чтобы вопрос отображался как решенный для других, просматривающих сайт. - person Lee Mac; 08.02.2021