|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Поиск блоков, совпадающих в плане
Регистрация: 16.04.2016
Сообщений: 107
|
||
Просмотров: 3135
|
|
||||
идущий по граблям Регистрация: 26.05.2005
Сообщений: 5,169
|
Не особо вникал, но многократное обращение к набору в двух циклах не добавляет производительности. Работа с наборами почему-то тормозная. Лучше один раз преобразовать набор в список, и дальше работать с ним.
Файл не смотрел, но если пикетов сотни, то операций сравнения из-за вложенности цикла будут десятки и сотни тысяч, и желательно, чтоб они выполнялись не так затратно, как операции с наборами. Можно, конечно, как-то сократить перебор, например, один раз отсортировать список блоков-пикетов собственно по пикетажу, а затем пройтись по списку, и для каждого блока проверить двух-трех "соседей" справа и слева, а не всех, как у вас. И отметить, если соседство оказалось слишком близкое. Но для этого понадобятся многие vl-функции. Вы ими не пользуетесь по каким-то значимым причинам, например, из-за того что в клонах акада с ними плохо? Или как? Последний раз редактировалось kp+, 24.02.2025 в 11:12. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Я бы получил точки вставки блоков, преобразовал их в двумерные точки и работал уже с этим.
Плюс - отсортировать точки по вертикали и горизонтали. Может, это поможет быстрее обрабатывать. Хотя 15000 точек сравнить... ----- добавлено через ~4 мин. ----- Как вариант: Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. Последний раз редактировалось Кулик Алексей aka kpblc, 24.02.2025 в 11:27. |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Результаты-то совпадают?
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Наберусь наглости и попрошу переделать код под следующую задачу:
Удалить дубликаты блоков с допуском 0.05, т.е отличающиеся по X, Y, Z =< 0.05. ----- добавлено через ~1 мин. ----- Да! |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Ну уж это-то мог бы и сам )
Код:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. Последний раз редактировалось Кулик Алексей aka kpblc, 24.02.2025 в 15:34. |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Э, не, удалять - самостоятельно. Критериев удаления может быть овердофига, так что - ручками )
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Не советую использовать ssget с ключами такого типа - может быть непредсказуемый результат. Да и удалять ты собираешься все блоки, не оставляя ничего. Ты уверен в этом?
----- добавлено через ~2 мин. ----- И сравниваешь ты трехмерные точки если что. ----- добавлено через ~4 мин. ----- Писать код сейчас не буду, голова в другой задаче. А так - я б тогда собирал не только точки, но и указатели на примитивы. По типу (setq source (mapcar '(lambda(x) (cons (mapcar '+ '(0. 0.) (trans (cdr(assoc 10 (entget x)) 1 0)) x) ((lambda (/ tab item) (repeat (setq tab nil item (sslength selset)) (setq tab (cons (ssname selset (setq item (1- item))) tab)) ))) Пишу насухую, так что могут быть ошибки
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Не фига! Удаляются только дубликаты из одной группы. Если есть другие группы дублей, они не обрабатываются.
Цитата:
Код:
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Я имел в виду "все дубликаты".
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Правильно. Это мне и надо - из группы совпадающих по координатам (с четом точности) блоков оставить один, остальные удалить. Какой оставить - роли не играет.
----- добавлено через ~5 мин. ----- Да. Сравнивать надо трехмерные и удалить дубли. А те, которые совпадают в плане, но отличаются по высоте, отлично обрабатывает ваш код из сообщения #3 mark-dublicates-picket |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
М-да. Просто прочитывая тему...
Цитата:
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
маркшейдер Регистрация: 25.09.2021
Москва
Сообщений: 189
|
А cldups.lsp из G-Tools не подходит?
__________________
Keep it simple, stupid. |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Спасибо, посмотрел. Нет, не то.
А в чем разнос? Изначально была задача найти и обозначить дубликаты блоков на плоскости. Ваш код с этим справляется отлично! Захотелось дедушке на основе этого кода добиться удаления трехмерных дубликатов. ![]() Просто вторая задача у меня уже была решена (но работает медленно), был затык с поиском дубликатов без учета координаты Z, чтобы можно было вручную выбрать и удалить блоки с явно неправильными Z. Таких блоков немного - max.1% от общего количества. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Сорян, но примерную логику я расписал, на сегодня я все
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Цитата:
Я в этой логике не то, что запутался, я в ней вообще ничего не понял. ![]() |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Цитата:
Код:
Error: слишком мало аргументов Где ошибка? Сам додуматься не могу! ![]() |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Как минимум - в объявлении функции. "/" должен отделяться пробелами с обеих сторон.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
проектирование а/дорог Регистрация: 03.07.2013
СПб
Сообщений: 388
|
Цитата:
*** если повернуть Ваш файл в 3д , сразу видно какие отметки вылетают из диапазона высот. Их можно удалить рамкой. Заодно будет понятно что блок собран "своеобразно" (отметка текста и отметка точки разнесены по оси Z) *** еще вспомнил про _mapclean Последний раз редактировалось Linkshunter, 05.03.2025 в 16:42. |
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Для автоматического выполнения анонимной функции
----- добавлено через ~2 мин. ----- Тема плавно переходит в разряд дубля "Научите лиспу на примере..."
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Цитата:
Цитата:
Подправил, результат тот же. ![]() Код:
|
|||
![]() |
|
||||
как mapcar может сработать если есть функция, ooooчень сомнительная и НЕТ списка? поэтому и аргументов не хватает. этот кусок лиспа просто шедеврален по своей бессвязности)
ведь очевидно, что должно быть как-то так Код:
__________________
K Lisp |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,402
|
Offtop: Ну блин, я ж сразу сказал, что писал насухую, без проверок. ЕМНИП, вообще чуть ли не с телефона.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Мне часто приходится обрабатывать данные так называемой "Съемки". В свое время такие "съемки" сразу объявлялись браком. Теперь условия изменились, появились "специалисты", с гордостью нажимающие кнопки и объявляющие себя "геодезистами". Так вот, на предоставляемых ими "съемках" попадаются моменты, когда в одной точке наложены 2-5 пикетов. Если высоты этих пикетов отличаются незначительно, построение поверхности из 3д-граней вылетает. Ну, а если (бывает и такое) разброс высот достигает 10 м и более, то совсем швах. Так что цель одна - убрать лишнее.
|
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Строго не судите. Наверно, можно как-то оптимизировать. Может кто подскажет?
Код:
Алексей, самое главное, что вы указали нужное направление. А уж как я это попытался реализовать, тут вы ни причём. Последний раз редактировалось 1958, 06.03.2025 в 12:36. |
|||
![]() |
|
||||
07 (cons (mapcar '+ '(0 0 0) (trans (cdr (assoc 10 (entget ename))) 1 0)) ename)
если нужны 3d координаты, то (mapcar '+ '(0 0 0)... не нужна, она ничего не изменит, в предыдущем варианте координаты с её помощью приводились к 2d то есть должно стать 07 (cons (trans (cdr (assoc 10 (entget ename))) 1 0) ename)
__________________
K Lisp |
||||
![]() |
|
||||
Сергей812,
почему с вашим каждым приходом в тему, имеющую отношение только к лиспу мы всенепременно ежекаждый раз скатываемся в .net? это ведь какбэ совсем другое))) ----- добавлено через ~5 мин. ----- 1958, а как вообще нужно сравнивать блоки. по заголовку вроде как в плане, то есть 2d?
__________________
K Lisp |
||||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Была задача найти дубли блоков и пометить их. Кулик Алексей aka kpblc написал прекрасный код. И подумал, что можно как-то этот код переделать для удаления лишних блоков, а маркировку оставить для блоков, совпадающих в плане, но отличающихся по высоте - тут выбор за пользователем, что оставить, что удалить.
|
|||
![]() |
|
||||
Регистрация: 16.04.2016
Сообщений: 107
|
Спасибо, интересно. Но тут выделяются (маркируются) все дубли.
Я собрал вариант, где сначала удаляются дубли боков в пределах 0.1, а затем маркируются дубли блоков, совпадающих в плане, но с большим отлетом по высоте. Код:
|
|||
![]() |
|
||||
Offtop:
Цитата:
В них есть MAPCLEAN с возможностью находить накладывающиеся объекты - помечать их или удалять повторяющиеся. И не только блоки. Работает очень быстро. И позволяет в разных вариантах-режимах находить-исправлять еще много что, находить-исправлять сразу различные случаи и т.д. Почему Autodesk не включил этот CLEAN в базовый AutoCAD - необъяснимо. В MAPCLEAN нет ничего специального. Кстати, примерно месяц назад в рассылках Autodesk говорилось о добавлении неких проверок в AutoCAD.
__________________
количество моих сообщений не говорит о знании Автокада |
||||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
LISP. Очистка рисунка от "пустых" блоков | Makswell | Готовые программы | 15 | 26.10.2022 15:24 |
Какой язык перспективен для инженера-конструктора с условием | The_Mercy_Seat | Программирование | 705 | 17.03.2021 14:19 |
Поиск блоков пересекающих полилинию | tujn08 | Программирование | 80 | 13.03.2019 00:08 |
Канализационный лоток на плане полов или на плане фундаментов? | Виталька Паустовский | Основания и фундаменты | 3 | 09.12.2009 11:51 |
VBA: утечка памяти при вставке блоков | Mikha | Программирование | 13 | 03.04.2009 09:18 |