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

Вернуться   Форум 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.
Просмотров: 8129
 
Непрочитано 26.08.2013, 10:25
#2
Boxa

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


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,840


Цитата:
Сообщение от Мансур Посмотреть сообщение
например, на одном из слоев 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,588


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

спринклеры, сантехника
 
Регистрация: 26.01.2010
Сообщений: 188
Отправить сообщение для 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,840


Ихмо на Автолиспе быстро не получиться, и тут даже не в том беда, что сам лисп медленней, а то что он умеет работать только со списками (ни хешей, ни деревьев он не знает), а в данной задаче это критично (не беда в том, что допустим, он читает данные в 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,702
Отправить сообщение для 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,840


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

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


Цитата:
Сообщение от Мансур Посмотреть сообщение
Доброго дня! Есть задачка в 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,030


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

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

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

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


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

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


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,702
Отправить сообщение для Do$ с помощью Skype™


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

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


Цитата:
Сообщение от Мансур Посмотреть сообщение
Прежде чем писать велосипед, хотелось бы узнать, нет ли еще чего-то подходящего
PJS by Toolpac ?
Кочетков Андрей вне форума  
Ответ
Вернуться   Форум 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