Первым шагом будет получение набора выбора всех замкнутых полилиний, находящихся на целевом слое — для этого вы должны использовать функцию ssget
со строковым аргументом режима X
(для сканирования всей базы данных чертежей без ввода данных пользователем) и фильтр Фильтр списка аргументов по типу объекта (группа DXF 0) и слою (группа DXF 8) и, необязательно, по битовому кодированию группы DXF 70, чтобы ограничить выбор только замкнутыми ломаными линиями — вы можете обратиться к моему Справочник по функциям ssget, чтобы помочь в построении этого выражения.
Получив выбранный набор полилиний на целевом слое, вы затем перебираете этот набор (существует множество методов для этого), и для каждой полилинии у вас есть один из двух вариантов:
Получите набор выбора многоугольника окна/пересекающегося многоугольника всего текста (возможно, ограниченного целевым слоем), предоставив функции ssget
строку режима WP
или CP
, набор координат вершин полилинии и соответствующий список фильтров.
Получите набор выбора из всех текстовых объектов-кандидатов в активном макете/окне просмотра и используйте алгоритм преобразования лучей или аналогичный, чтобы проверить, находится ли точка вставки каждого текстового объекта в пределах полилинии.
Метод (1) является самым простым, но он также может быть и наименее надежным, так как методы графического выбора функции ssget
будут рассматривать только объекты, видимые в области рисования во время вычисления функции, поэтому для большей точности вы должны сначала необходимо масштабировать каждую полилинию перед получением выбора объектов, которые она заключает, а затем восстанавливать предыдущий вид.
Метод (2) более надежен, поскольку он не зависит от состояния графического отображения в AutoCAD, но будет медленнее, так как требует большего количества вычислений и итераций по всему набору текстовых объектов-кандидатов (если только вы не реализуете метод «разделяй и властвуй»). благодаря умному использованию предварительной сортировки множества).
После получения набора текстовых объектов, находящихся внутри полилинии, вам понадобится какой-то способ различать каждый текстовый объект в наборе, чтобы вы заполнили каждый атрибут соответствующим значением. Это будет полностью зависеть от ваших данных - например. находится ли каждый элемент данных на своем собственном слое (например, все ли номера комнат находятся на своем собственном слое, а все названия комнат — на другом?), или вы можете использовать сопоставление с образцом в текстовом содержимом для идентификации номера комнаты. из названия комнаты и другой информации?
После определения соответствующих значений относительно просто вставить новую ссылку на блок с атрибутами (возможно, в центроид полилинии или в точку вставки одного из существующих текстовых объектов) и заполнить атрибуты блока значениями, полученными из text - есть много существующих примеров этого.
person
Lee Mac
schedule
23.11.2020