|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
11.12.2015, 12:04 | #1 | |
Lisp. Получение имени замкнутой полилинии кликом внутри контура.
Регистрация: 09.10.2014
Сообщений: 7
|
||
Просмотров: 3802
|
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,992
|
Смотри команды _BOUNDARY и _BPOLY (для лиспа есть функция bpoly)
Код:
LISP. Отрисовка внешнего контура выбранных объектов to find each closed boundary of selected object Outline Objects
__________________
Как использовать код на Лиспе читаем здесь |
|||
|
||||
Регистрация: 09.10.2014
Сообщений: 7
|
Спасибо за наметку, однако я плохо описал требуемый результат и про области вообще не к селу написал.
Имеется массив примыкающих друг к другу сторонами многоугольников(пусть квадраты). Задача такая: кликом в центре многоугольника (полилинии) извлекать его имя, в месте клика добавить текст, затем следует проход по всем сторонам многоугольника, если у стороны нет расширенных данных (РД), тогда если к стороне ничего не примыкает записать 0 в РД, если к стороне примыкает сторона другого многоугольника записать 1 по текущей стороне в РД первой поли и 2 в РД по смежной стороне во второй поли. Программа проходит по всем сторонам с этим условием. После цикла прописываем в РД флаг редактирования + имя (ранее вставленный текст). Далее кликаем следующий многоугольник (не обязательно смежный) проверяем флаг редактирования, если ранее редактированное алерт, если нет вставляем текст с префиксом указанным в начале программы и с прогрессией и проходим по сторонам... Завершение программы при запросе n-ой точки. Так вот как найти имя многоугольника внутри которого жмакнули. Думаю нужно найти первое пересечение от точки в любую сторону, но это же пересечение возьмёт в набор и смежный многоугольник, поэтому стреляем в другую сторону сравниваемых наборы, находим имя которое дважды в наборах... Может как то ещё? |
|||
|
||||
Регистрация: 20.03.2008
Сообщений: 2,653
|
В свое время передо мной встала аналогичная задача. Первая мысль была именно такая:
и из тех же соображений отмелась. Лениво мне как-то стало такие обработки производить, и нашел я, кажется, тут на форуме функцию, не помню, к моему сожалению, кто автор, и при беглом поиске найти повторно ее не смог, т.к. похоже я ее переименовал в понятное мне имя и, возможно слегка переделал под свои нужды. Нет! Таки нашел!! Автор, как я и думал, разумеется VVA, и лежит она тут. (Заколебался я ее переделывать - добавил два аргумента и две точки с запятой ) Вот эта функция (вместе с вспомогательными): Код:
Код:
Последний раз редактировалось skkkk, 13.12.2015 в 03:04. |
|||
|
||||
Я пользуюсь следующим способом:
Кликаю внутри полигона, замкнутой полилинии, затем из точки клика вычерчиваю луч или если мах размер известен, то отрезок. Для всех искомых полигонов, полигоны на соответствующих слоях или еще какой нибудь признак, нахожу точки пересечения. Тот полигон у которого нечетное количество точек пересечения есть полигон внутри которого я кликнул. Удаляю примитив луч.
__________________
Знание лисп: со справочником Н. Полещука |
||||
|
||||
Регистрация: 09.10.2014
Сообщений: 7
|
Цитата:
Что-то у меня некорректно определяется полилиния - при клике внутри одного контура (треугольник) возращает разные имена. Отдельно проверил функцию определения направления обхода, не всегда возвращает корректное направление. Вот что у меня получилось с пересечением лучом (сразу извиняюсь за паршивый штиль, танцую как могу): Код:
|
|||
|
||||
Инженер LISP Регистрация: 11.05.2005
Минск
Сообщений: 6,992
|
Еще один вариант алгоритма по ссыле skkkk
__________________
Как использовать код на Лиспе читаем здесь |
|||
|
||||
Регистрация: 20.03.2008
Сообщений: 2,653
|
Цитата:
----- добавлено через ~57 мин. ----- Думается мне, что это чуть ли не самый надежный способ, но имеет несколько нюансов. Лиспер упоминал о двух из них в теме по этой ссылке чуть ниже указанного VVA поста: 1. Полилиния не должна иметь самопересечений. Насколько я понял, это исключено по условию задачи. 2. Она не должна иметь дуговых сегментов. Если они есть - нужно аппроксимировать полилинию прямыми сегментами с нужной точностью. Для этого есть команда в комплекте Pl-tools. 3. При выборе ssget с опцией _CP все точки контура должны быть в видимой части экрана. Иначе - ошибка будет. Можно перед выполнением зумировать по объекту, а затем вернуть вид обратно. |
|||
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
LISP. Простановка площадей внутри полилинии. | Klo | LISP | 26 | 14.12.2018 17:43 |
Выбор всех объектов внутри замкнутой полилинии | fellow123 | AutoCAD | 22 | 08.03.2017 05:30 |
LISP Изменение Thickness замкнутой полилинии в блоке | sdv79 | LISP | 19 | 09.02.2015 23:35 |
Выделение и удаление обьектов внутри замкнутой полилинии. Как? | DTwice | AutoCAD | 5 | 18.05.2009 14:31 |
Пересечения внутри замкнутой полилинии | mark | AutoCAD | 4 | 21.11.2008 20:39 |