|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Поиск блоков, совпадающих в плане
Регистрация: 16.04.2016
Сообщений: 107
|
||
Просмотров: 3165
|
|
||||
идущий по граблям Регистрация: 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: слишком мало аргументов Где ошибка? Сам додуматься не могу! ![]() |
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
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 |