Объединение большого количества отрезков
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Объединение большого количества отрезков

Объединение большого количества отрезков

Ответ
Поиск в этой теме
Непрочитано 26.08.2013, 10:01 #1
Объединение большого количества отрезков
Мансур
 
Инженер САПР
 
Тюмень
Регистрация: 12.11.2004
Сообщений: 36

Доброго дня! Есть задачка в AutoCAD объединить огромную кучу отрезков в полилинии в автоматическом режиме (чистка большого файла съемки). Средства типа pedit, pljoin банально вешают AutoCAD из-за слишком большого количества элементов. Гугл облазил вдоль и поперек, но может пропустил что-то готовое? Прежде чем писать велосипед, хотелось бы узнать, нет ли еще чего-то подходящего.

P.S. Написал утилиту на лиспе, качать здесь, здесь, исходники
Команда MTMDJOIN:
1) выбрать объекты (условие - выбираемые объекты должны быть в пределах экрана)
2) указать допустимое отклонение
Функция (mtmdjoin sset tolerance) -> возвращает список (plines_created lines_converted)

В отличие от существующих программ моя утилита объединяет отрезки более интеллектуально (если несколько линий сходятся в одной точке, то объединяются линии, находящиеся под бОльшим углом друг к другу, формируя более длинные полилинии.
Скорость работы достаточная - на Core i5 3.3Ггц, Win7x64, AutoCAD 2012, 20 тысяч отрезков обрабатываются около 15 секунд.

Последний раз редактировалось Мансур, 05.09.2013 в 15:02.
Просмотров: 8387
 
Непрочитано 26.08.2013, 10:25
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


1. Насколько большая куча?
2. Это http://www.debalance.com/optimization/polyline.html пробовали?
Boxa вне форума  
 
Автор темы   Непрочитано 26.08.2013, 12:50
#3
Мансур

Инженер САПР
 
Регистрация: 12.11.2004
Тюмень
Сообщений: 36
<phrase 1=


например, на одном из слоев 21412 отрезка.
superpurge уже попробовал - зависает.
Мансур вне форума  
 
Непрочитано 26.08.2013, 16:08
#4
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


overkill с опцией end_to_end ?
а иначе фильтровать по x, по 100 штук соединять по отдельности и т.д. т.е. разбить задачу - сделать рекурсивный pljoin чтобы в одной итерации было не более 100 шт. например.
Sleekka вне форума  
 
Непрочитано 26.08.2013, 16:24
#5
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Мансур Посмотреть сообщение
например, на одном из слоев 21412 отрезка.
Да не шибко и много - выложи пример такого слоя, попробую что-нибудь сворганить (если только отрезки, то по моему, на первый взгляд, не сложно), на всякий случай - какой автокад (может на .Net подускорить).
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 27.08.2013, 07:58
#6
Мансур

Инженер САПР
 
Регистрация: 12.11.2004
Тюмень
Сообщений: 36
<phrase 1=


Выдрал один слой, если кому интересно попробовать порешать задачку: http://bit.ly/144AEkt
Многие линии между собой не стыкуются. Думаю, что особенно короткие сегменты есть смысл подтягивать к более длинным, а примерно одинаковые - двигать друг к другу.

P.S. Только сейчас дошло, что еще надо учитывать минимальный угол между отрезками - т.к. в силу специфики задачи есть куча линий штриховки откосов, которые надо игнорировать.

Последний раз редактировалось Мансур, 27.08.2013 в 08:56.
Мансур вне форума  
 
Непрочитано 27.08.2013, 09:19
#7
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Цитата:
Сообщение от Мансур Посмотреть сообщение
Выдрал один слой, если кому интересно попробовать порешать задачку
А Ваши наработки можно посмотреть?
Boxa вне форума  
 
Непрочитано 27.08.2013, 10:11
#8
nolte

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 190
Отправить сообщение для nolte с помощью Skype™


хотелось бы увидеть решение, ну, если это вообще осуществимо.
nolte вне форума  
 
Автор темы   Непрочитано 27.08.2013, 12:26
#9
Мансур

Инженер САПР
 
Регистрация: 12.11.2004
Тюмень
Сообщений: 36
<phrase 1=


Цитата:
Сообщение от Boxa Посмотреть сообщение
А Ваши наработки можно посмотреть?
Конкретно за эту задачу я только сейчас взялся - пока прикидываю прототип на лиспе.
Если вообще - то мой сайт mtmlab.ru, там конечно мало, но тем не менее, *welcome*
Мансур вне форума  
 
Непрочитано 27.08.2013, 14:38
#10
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Ихмо на Автолиспе быстро не получиться, и тут даже не в том беда, что сам лисп медленней, а то что он умеет работать только со списками (ни хешей, ни деревьев он не знает), а в данной задаче это критично (не беда в том, что допустим, он читает данные в 10 раз медленне - 1 и 10 секунд разница конечно есть, но не смертельная - а вот перебрать какие примитивы есть в списке - это последовательный перебор "пока не совпало" (а если не совпало - то весь список) и на каждую полилинию весь список отрезков прогонять - долго) - можно ограничиться фильтром поиска из координат примитива - будет быстрее, но все равно эта операция (фильтрация) очень долгая, а ее надо опять-таки прогнать к каждому примитиву. Я вижу только 1 вариант - создавать индексированную или "двоичную" коллекцию (Dictionary<>,Hashtable<>,Map<>,Set<>... - не суть кому что привычней) - типо ключевая_точка*список_точек (причем на каждую точку будет как ключевое поле, так и она 100% будет входить в какой(ие),либо значения), настраиваешь интерфес используемый для быстрого поиска (сортировки или хеширования) на учет допуска (то есть, чтоб при занесении он 0.999:0.999 и 1.0:1.0 за одно и тоже считал), либо предварительно "подгоняешь" близкие точки под существующие, либо - самый простой вариант - просто округляешь их и вот в такой коллекции уже можно поискать контуры за разумное время - а по ним уже соответственно и построить примитивы.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 27.08.2013, 23:44
#11
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Похоже на экспорт из Civil3D. То есть, там взрываем, потом в простом Автокаде снова собираем... Если есть исходный чертеж в Civil 3D (ну и сама программа, разумеется), задачу можно сильно упростить.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Автор темы   Непрочитано 28.08.2013, 16:39
#12
Мансур

Инженер САПР
 
Регистрация: 12.11.2004
Тюмень
Сообщений: 36
<phrase 1=


после двухдневного ковыряния и отлавливания багов в трех соснах вышло следующее:
150 строк лиспа (всё еще сырой прототип), (без никаких ActiveX-ов, если что)
время выполнения (вместе с отрисовкой 1619ти получившихся полилиний) - 35 сек.
Машинка - Core2Duo 2.6Гц, Win7x64, AutoCAD 2012, ядро задействуется только одно, я так понимаю, раз автокад
Наверно можно еще немного побаловаться оптимизацией
Код пока не выкладываю
Мансур вне форума  
 
Непрочитано 28.08.2013, 18:04
#13
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Мансур Посмотреть сообщение
время выполнения (вместе с отрисовкой 1619ти получившихся полилиний) - 35 сек.
Ну уже не "колом встает", подумал тут на досуге - а ведь и в автолиспе ничего не мешает реализовать структуру двоичного дерева поиска - типо список '(ключ-значение все_ключи_меньше все_больше). И при правильной предварительной "рассортировки" время доступа к элементу по ключу будет логарифмическое.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Непрочитано 28.08.2013, 20:06
#14
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Цитата:
Сообщение от Мансур Посмотреть сообщение
Доброго дня! Есть задачка в AutoCAD объединить огромную кучу отрезков в полилинии в автоматическом режиме (чистка большого файла съемки). Средства типа pedit, pljoin банально вешают AutoCAD из-за слишком большого количества элементов. Гугл облазил вдоль и поперек, но может пропустил что-то готовое? Прежде чем писать велосипед, хотелось бы узнать, нет ли еще чего-то подходящего.
В Map 3D (Civil 3D) c 2004 г., минимум, есть Drawing cleanup (Корректировка), а в нем Snap clustered nodes (Сводить узлы в один) - для убирания разрывов или перелетов, если они есть, и Dissolve pseudo nodes (Удалять псевдоузлы) - собственно сшивание.

Есть еще одна частная программка. Она сшивает только соответствующие друг другу свойствами элементы. Синий отрезок из одного слоя с красным из другого не сошьет - как все остальные программы. Если хотите, то давайте файл, я попробую запустить.
У Вас чертежи из какой сферы деятельности?
АлексЮстасу вне форума  
 
Автор темы   Непрочитано 28.08.2013, 20:42
#15
Мансур

Инженер САПР
 
Регистрация: 12.11.2004
Тюмень
Сообщений: 36
<phrase 1=


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Есть еще одна частная программка. Она сшивает только соответствующие друг другу свойствами элементы. Синий отрезок из одного слоя с красным из другого не сошьет - как все остальные программы. Если хотите, то давайте файл, я попробую запустить.
У Вас чертежи из какой сферы деятельности?
Нефтянка. Слой из съемки, это от каких-то левых изыскателей. Ссылка на файл была выше, дублирую: http://bit.ly/144AEkt
Очень сомневаюсь, что экспорт из Civil-a, как предположил Do$, уж очень коряво стыкуются отдельные отрезки.
Мансур вне форума  
 
Непрочитано 28.08.2013, 20:55
#16
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Больше похоже совсем не на Civil, а на отечественного производителя - Геоникс. После него все рассыпается.
И там есть сплайны, штриховки и т.п.
Есть ряд элементов на какой-то высоте.
Я на всякий случай вынес надписи из слоя Съемка в слой Съемка_текст.
Взял на себя смелость поставить рабочие единицы метры вместо миллиметров.
Но пока та частная программа вышибает Автокад ))

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

Последний раз редактировалось АлексЮстасу, 28.08.2013 в 21:21.
АлексЮстасу вне форума  
 
Непрочитано 28.08.2013, 22:20
#17
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Offtop: В чертеже только от Civil "следы", вот поэтому и предположил. В чертежах после Геоникса, которые ко мне попадали, сложно было не заметить его "следов".
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 28.08.2013, 23:34
#18
АлексЮстасу

топограф, технолог
 
Блог
 
Регистрация: 24.05.2009
Москва
Сообщений: 3,072


Offtop: Почему-то никто не вспомнил про PlTools с его PL-JOIN.

Как мог посшивал с разными допусками.
Красные круги - места противоречивые, где не сшивалось. Но эти маркеры остались только от последнего запуска, и их много больше.
И там видно, что многое сшилось неправильно по сути. Но слой-цвет и пр. один, и автомату не объяснишь.

Offtop: Если не оч. большой секрет, то шепните, кто такие шедевры топографического черчения выдает? Я сам топограф.
Вложения
Тип файла: dwg
DWG 2004
Слой-съемка2.dwg (1.25 Мб, 2448 просмотров)

Последний раз редактировалось АлексЮстасу, 29.08.2013 в 03:34.
АлексЮстасу вне форума  
 
Непрочитано 31.08.2013, 17:04
#19
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,701
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от АлексЮстасу Посмотреть сообщение
Offtop: Почему-то никто не вспомнил про PlTools с его PL-JOIN.
Offtop: Есть в первом сообщении.
__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Do$ вне форума  
 
Непрочитано 31.08.2013, 17:20
#20
Кочетков Андрей

Java/Kotlin/Go
 
Регистрация: 03.02.2006
Сообщений: 5,786


Цитата:
Сообщение от Мансур Посмотреть сообщение
Прежде чем писать велосипед, хотелось бы узнать, нет ли еще чего-то подходящего
PJS by Toolpac ?
Кочетков Андрей вне форума  
 
Автор темы   Непрочитано 03.09.2013, 15:24
#21
Мансур

Инженер САПР
 
Регистрация: 12.11.2004
Тюмень
Сообщений: 36
<phrase 1=


Вот что в итоге получилось, тестируем, отписываемся, кому интересно.
http://mtmlab.ru/files/arx/mtmdjoin.zip

Команда MTMDJOIN
Из-за особенностей функции ssget необходимо чтобы область с объектами была видима,
т.е. если увеличить какой-то участок и затем выбрать все объекты опцией _all, будут обработаны только участки, видимые на экране.
Пока что никаких опций, максимальное расстояние между соседними сегментами 0.03 и максимальный угол "расхождения" сегментов 1 радиан
Мансур вне форума  
 
Непрочитано 03.09.2013, 15:42
#22
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,839


Цитата:
Сообщение от Мансур Посмотреть сообщение
Вот что в итоге получилось, тестируем, отписываемся, кому интересно.
Я б может и посмотрел - но смотреть не на что.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 05.09.2013, 14:19
#23
Мансур

Инженер САПР
 
Регистрация: 12.11.2004
Тюмень
Сообщений: 36
<phrase 1=


Обновил программу, добавил запрос допустимого расстояния и функцию для неинтерактивного вызова:
(mtmdjoin sset tolerance) -> возвращает список (plines_created lines_converted)
Мансур вне форума  
 
Автор темы   Непрочитано 10.09.2013, 16:05
#24
Мансур

Инженер САПР
 
Регистрация: 12.11.2004
Тюмень
Сообщений: 36
<phrase 1=


Кто там говорил, что отдельные штрихи не сшить?
Прототип, сшивающий штрихи в полилинии, уже работает, осталось причесать...
Во вложении получившийся файл, слой "Съемка_dash" - получившиеся линии, "Съемка_dashold" - исходные штрихи
Ну и до кучи - результат сшивания непрерывных линий. Никакой ручной доводки, кроме разве что выбора типа линии и масштаба LTSCALE
Вложения
Тип файла: dwg
DWG 2010
test-dashed-dwgru.dwg (890.7 Кб, 1045 просмотров)
Мансур вне форума  
 
Непрочитано 07.07.2014, 14:47
#25
Meat_12237

Строительство
 
Регистрация: 24.07.2007
Калужская область
Сообщений: 106


Здравствуйте.

Работаю в Bricscad-е. Файлы *.vlx моя версия не читает.
Пробовал загрузить исходник. Пишет следующее:

Загрузка /u/emdunilina_inet/download/mtmdjoin.lsp
: (LOAD "/u/emdunilina_inet/download/mtmdjoin.lsp")
; ----- Error around expression -----
(LOAD "/u/emdunilina_inet/download/mtmdjoin.lsp")
;
; error : syntax-error <".loader_config={xpid:"> at [READ]

Подскажите, пожалуйста, что делаю не так ?
Meat_12237 вне форума  
 
Непрочитано 07.07.2014, 18:35
#26
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Не вижу никаких проблем с загрузкой исходника, скорей всего у вашего админа паранойя..
gomer вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Объединение большого количества отрезков



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объединение отрезков, дуг, линий в полилинию. Как объединить? noorgoosh AutoCAD 92 22.11.2017 08:35
Печать большого количества чертежей Александр79 AutoCAD 26 20.04.2013 10:59
Как приручить радиочастоты, или проблемы связанные с обменом большого количества данных по сети WI-FI??? Pavel Samofalov Разное 20 15.08.2011 15:16
Нужна программа для автоматического получения и "склеивания" большого количества последовательных скриншотов kp+ Прочее. Программное обеспечение 6 18.03.2011 11:18
Экспорт параметров большого количества окружностей в файл .txt Манасыпов Р.Ф. Программирование 24 25.06.2010 16:52