(изменено: Debalance, 25 апреля 2014г. 13:03:03)

Тема: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Ссылка на загрузку последней версии утилиты TotalBreaker.

ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Описание.
Мои друзья проектировщики попросили меня разработать приложение расширяющее возможности команды _BREAK. Задача была поставлена следующим образом: необходимо разбить группу выбранных примитивов в местах их взаимного пересечения.

Несмотря на кажущуюся простоту решение этой задачи оказалось не совсем простым. При работе с небольшим количеством примитивов (используя простой способ итерации) всё довольно легко и быстро. Но, когда количество примитивов тысячи или, тем более, десятки тысяч процесс ожидания окончания работы становится практически бесконечным.

Существует ряд уже готовых утилит позволяющих реализовать подобное (например известное приложение Break All or Some). Но все они имеют весьма "чахлую" производительность. Требовалась значительно бОльшая производительность для работы с большим количеством объектов.

Поэтому в программе я использовал переработанный и усовершенствованный движок основанный на алгоритме "поиска ближайшего соседа".
Таким образом мне удалось достичь достаточно высокой производительности. Так, например, 20 000 примитивов (на машине с процессором класса Intel Core 2 Duo) обрабатывается в среднем за 6 секунд.

Предварительно обернув приложение в диалоговый дружественный интерфейс, придав программе некоторого лоска и упаковав в инсталлятор я выкладываю её для всеобщего пользования.

Установка.
Снабжена классическим инсталлятором. Для установки программы нужны права администратора.
После установки используйте команду _TOTALBREAK.

Программа оперирует следующими типами примитивов:
- Линии (LINE)
- Дуги (ARC)
- Окружности (CIRCLE)
- Полилинии (LWPOLYLINE, 2DPOLYLINE).

Реализована поддержка следующих версий AutoCAD:
- AutoCAD 2007 (x86)
- AutoCAD 2008 (x86)(x64)
- AutoCAD 2009 (x86)(x64)
- AutoCAD 2010 (x86)(x64)
- AutoCAD 2011 (x86)(x64)
- AutoCAD 2012 (x86)(x64)
- AutoCAD 2013 (x86)(x64)
- AutoCAD 2014 (x86)(x64)

Замечания по интерфейсу.
Интерфейс англоязычный. Локализации пока нет. Тем не менее интерфейс программы довольно прост - думаю разберётся и школьник...

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Debalance пишет:

Поэтому в программе я использовал переработанный и усовершенствованный движок основанный на алгоритме "поиска ближайшего соседа".

Можно об этом методе поподробнее?
В т.ч., насколько этот метод универсален для других задач обработки геометрии в Автокаде?

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Создавал на dwg.ru тему о задаче оптимизации обработки больших массивов данных.
В той теме тестировали как раз на примере создания пересечений.
Там в сообщениях #48 и #50 были два искусственных файла-примера: nonregular.dwg - 20000 элементов и nonregular2.dwg - меньше 1200 элементов. Примеры не очень реалистичные, т.к. каждый элемент пересекался множеством элементов - 50-ю, не меньше. Но в принципе можно тестировать и на них.
Запустил _TOTALBREAK на достаточно мощном компьютере для большего nonregular.dwg - после 25 минут вынужден был отменить, т.к. пора было уходить с работы.
На компьютере послабее _TOTALBREAK меньший nonregular2.dwg делал примерно 35 секунд.
Для сравнения - Drawing cleanup--Break intersections из Autocad Map 3d создает пересечения в nonregular2.dwg на том же не самом мощном компьютере секунд за 7-8. Но инструмент этот не общедоступен, а больший nonregular.dwg разбить этим инструментом не удалось - не дождался :D 

Кстати, _TOTALBREAK не дает никакого отчета о своих действиях - о числе созданных пересечений, например.

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

На компьютере послабее _TOTALBREAK меньший nonregular2.dwg делал примерно 35 секунд.

Посмотел чертежи. Я не знаю как и на чем Вы тестировали чертёж nonregular2.dwg - у меня на AutoCAD 2007 и Core 2 Duo c 2 ГБ памяти он был разбит менее чем за 3 секунды. Кстати в чертеже есть ошибки - проверьте командой _AUDIT.

Первый чертёж очень неспецифичный - это по сути "Квадрат Малевича" закрашенный линиями. Вряд ли вы найдёте достойное решение для такой задачи.

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Debalance пишет:

nonregular2.dwg - у меня на AutoCAD 2007 и Core 2 Duo c 2 ГБ памяти он был разбит менее чем за 3 секунды

Сейчас на машине помощнее первой nonregular2.dwg сделался за секунд 18-ть. AutoCAD 2012 и Intel Core i7-2600 CPU & 3.40GHz 16 ГБ, 64-разрядная.

(изменено: Debalance, 23 апреля 2014г. 08:43:25)

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Eщё раз проверил - 3 секунды! Мы с Вами об одном чертеже говорим? Проверьте, я его залил сюда. Правда тестировал на операционке X86.

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Debalance пишет:

Eщё раз проверил - 3 секунды! Мы с Вами об одном чертеже говорим? Проверьте, я его залил сюда. Правда тестировал на операционке X86.

Проверил на Вами выложенном файле - у меня 17-18 секунд. Отсчитываю с момента нажимания на Break it all до момента, когда шестерни прекращают вращаться.
Может быть у Вас какой-то Автокад оптимизированный или компьютер.
С одной стороны, различие, все-таки в несколько раз.
Но в принципе, когда длительность обработки тяжелых файлов секунды, то не принципиально.

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Отсчитываю с момента нажимания на Break it all до момента, когда шестерни прекращают вращаться.

Да всё верно.

Может быть у Вас какой-то Автокад оптимизированный или компьютер.

Протестировал на нескольких машинах с различными OC и разрядностью (в том числе и на ноутбуке с Win 8.1 x64) - везде работает одинаково - 3 секунды.

Будем ждать, может ещё кто-нибудь сподобится потестировать...

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Debalance пишет:

Протестировал на нескольких машинах с различными OC и разрядностью (в том числе и на ноутбуке с Win 8.1 x64) - везде работает одинаково - 3 секунды.

Будем ждать, может ещё кто-нибудь сподобится потестировать...

Да, загадка...
А про алгоритм? Эффективнее различного типа "деревьев"?

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

В любом случае скорость работы очень даже неплохая.

Есть связанная, родственная задача с этой задачей разбивания на пересечениях.
Если задачу разбивания на пересечениях решали не раз и самодельными программами, и сам Автодеск в вертикальных приложениях, то решения этой родственной задачи, например, на наших форумах и в вертикальных приложениях я не нашел вообще(в вертикальных не нашел прямого решения). И знаю только единственное решение, хотя и оч. неплохое, но индийской фирмы со всеми вытекающими...
Это задача создания всех возможных минимальных замкнутых контуров из множества указанных линейных элементов. Для ее корректного решения как раз нужно сначала разбить линейные элементы на всех пересечениях, а потом из разбитых фрагментов собрать минимальные замкнутые контуры. (Фирменную автокадовскую BOUNDARY лучше не вспоминать. Она с этой задачей корректно не справляется - может сделать не точные контуры, неправильные контуры, может вообще не сделать).

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

...Это задача создания всех возможных минимальных замкнутых контуров из множества указанных линейных элементов...

Ха! Вы угадали ход моих мыслей. Я прекрасно понимаю что программа TotalBreaker мало кому нужна (в связи со спецификой). Основная же цель её написания отработка программного движка на базе которого можно создать массу различных полезных программ.
В частности у меня как раз две задумки:
1. То - о чём говорите вы (поиск всех контуров среди выбранных объектов).
2. Поиск максимального контура.
Именно второй задачей я и занимаюсь (приоткрою Вам секрет). Думаю летом её выложу для обсуждения.

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

И знаю только единственное решение, хотя и оч. неплохое, но индийской фирмы со всеми вытекающими...

Дайте ссылочку. Хочу посмотреть  :)

(изменено: Александр, 7 мая 2014г. 20:02:09)

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

http://www.delicad.com/fr/flashpolygons.php

Отлично, что интересно!
Что имеется в виду под "Поиск максимального контура"? Просто наибольшей площади из всех, какие построятся?

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

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Посмотрел программу FlashPolygons (спасибо за ссылку). Это как раз то чем я занимаюсь. Но она работает некорректно на большом количестве примитивов. Кстати моя задача "поиск максимального контура" там именуется "create external polyline". Написана программа на лиспе - а это не очень интересно для высокопроизводительных приложений.

А цепочка разбить--собрать из частей контуры имеет еще продолжение, вытекающую третью задачу.

О какой задаче вы говорите?

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

В чем заключается у FlashPolygons некорректность работы? Я ничего не замечал, но она может в пожарном случае понадобиться.
В FlashPolygons "create external polyline" создает внешний контур всех элементов, если я правильно помню.

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

Есть коварный план, что, допустим, Вы задачу решите, опубликуете, это станет известно фирме, и она захочет внедрить его сама вместо косячной BOUNDARY. :D

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

... возможность найти и построить (выдать пользователю) минимальный замкнутый контур из имеющихся линейных элементов вокруг любой указанной точки...

А разве BOUNDARY не так работает? Не понимаю...

(изменено: Александр, 8 мая 2014г. 16:56:36)

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Debalance пишет:

А разве BOUNDARY не так работает? Не понимаю...

Теоретически - так, практически - некорректно, неправильно или не работает вообще.
1. Как правило не строит контур, если не все исходные граничащие элементы видны на экране.
2. Строит упрощенные контуры, срезая "мелкие" детали.
3. Может построить явно неправильный контур, если исходные граничащие элементы образуют "узкий" перешеек.
4. Может задуматься навеки.
5. Может не построить просто по неизвестным причинам.
Судя по всему, BOUNDARY использует не координаты вершин элементов, а экранные координаты, которые в каждый конкретный момент зависят от степени увеличения элементов на экране. Вероятно, использует какой-нибудь растровый что ли алгоритм вроде Flood.

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Это всё рудиментарные явления берущие своё начало с далёких времён, когда AutoCAD существовал только на DOS. С тех пор BOUNDARY нисколько не изменилась... Похоже разработчики программы увлечены другими вещами. А что, на Ваш взгляд, появление стабильно работающей BOUNDARY сильно облегчит труд проектировщика-конструктора? Может быть это всё наши измышления?

(изменено: Александр, 12 мая 2014г. 14:50:38)

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Да как с любой автокадовской задачей - мир и не рухнет, и не воспрянет :D
Я топограф, и за проектировщиков-конструкторов не скажу. Вижу по форумам, что они нуждаются в определении контуров для подсчета площадей, заливок цветом или штриховками.
В топографии кроме этих задач есть еще задача формирования площадных объектов, которые по жизни очень сложной формы и непредсказуемых размеров.
Кто-то с использованием уже сформированных площадей (контуров, полигонов или т.п.)еще и решает задачи  - ГИС-овцы, кадастровики, раскройщики или т.п.
Это как с удачными утилитами вроде PlTools, SelSim или Вашими - щасте вмиг не наступает, но дышать становится легче и приятнее :D
Ну и то, что никто ж за двадцать или больше лет не сделал, даже не брался вообще.

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

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Уважаемый Debalansce!Вы мне очень помогли!Спасибо Вам,здоровья и удачи!В силу того,что я начинающий то к сожалению не могу поддержать Вашу философскую беседу!Еще раз спасибо!Калининград

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Александр Смирнов пишет:

Спасибо Вам...

Ну, конечно же, пожалуйста!

Александр Смирнов пишет:

Вы мне очень помогли!

Вы удачно воспользовались разрушающей программой TotalBreaker? Для начинающего это сильный ход!  :D

(изменено: Mikha Prostoi, 19 февраля 2016г. 09:33:10)

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

ПРограмка супер, Спасибо автору! :D
Утилитка под 2015(64) будет реализована? :D

Re: ObjectARX. Утилита TotalBreaker - разбиение примитивов в точках взаимного пересечения.

Mikha Prostoi пишет:

Утилитка под 2015(64) будет реализована?

В настоящий момент работы над программой свёрнуты. Проект TotalBreaker заморожен.