Тема: Нумерация позиций и поиск свободного места на чертеже

Привет всем!!! 100 лет не появлялся, но сейча возникла задача которая самому не по зубам :).
Есть спецификация в Excel с номерами позиций оборудования расставленного в плане. Необходимо: найти свободное место рядом с оборудованием (оборудование вставленно как блок), поставить туда номер согласно спецификации и поставить выноску на оборудование. Проблема в том как найти свободное место? Если кто сталкивался с данной задачей - подкиньте мыслишку. Планы добольно большие - до нескольких тысяч квадратов, единиц оборудования - до нескольких сотен, алгоритм соответственно должен быть без тормозов.
Спасибо.

Re: Нумерация позиций и поиск свободного места на чертеже

Вот если бы расставляли оборудование нашей прогой, то и номера с выносками уже стояли там где надо...:)
http://www.cadforyou.spb.ru/prog_more2.shtml
По алгоритму: полная автоматизация данной задачи, как мне кажется, невозможна.
Если название оборудования в чертеже совпадает с названием в спецификации, то можно сделать так:
1. Вытаскиваем построчно позиции из спецификации.
2. Находим блок с таким именем или атрибутом(не знаю как у вас реализовано)
3. Центрируем масштабируя блок на экране.
4. Предлагаем юзеру указать точку для вставки номера, рисуем номер
5. Предлагаем юзеру указать начальную и конечную точку выноски, рисуем выноску
Неявная автоматизация? Но уверяю, производительность в разы возрастёт.
У нас была подобная задача, нужно было в плане расставить 2000 свай, у каждой поставить номер и отметку. При помощи аналогичной программы(разница только в считывании информации из Excel и ещё паре мелочей) человек за день справился с работой. Вручную ушла бы неделя точно.

Re: Нумерация позиций и поиск свободного места на чертеже

Единица оборудования = блок.
Позиция = атрибут блока + выноска (в самом блоке).
Кажись так проще.

Re: Нумерация позиций и поиск свободного места на чертеже

> VK
Это конечно!
Но как организованы блоки у автора топика? Скорее всего они без атрибутов?
Да и выноску потом может придётся потоскать. Поэтому я бы выноску с блоком в котором атрибут номер позиции объединил в группу.

Re: Нумерация позиций и поиск свободного места на чертеже

Блоки отрисованны без атрибутов, база оборудования - несколько тысяч, поэтому перерисовывать блоки и добавлять атрибуты никто не будет, да и не ясно куда ставить атрибут - не всегда номер можно разместить внутри оборудования - при размещении снаружи, опять же огромная вероятность что этот номер попадет на рядом стоящее оборудование -  в 80% блоки ставятся впритык. Запрашиватьу юзера при вставке блока куда поставить номер тоже не пойдет - нумерация задается в спецификации на последнем этапе, да и он заранее не может определить останется ли данный участок свобедным или позднее на это место встанет новый блок.
Поэтому мы нумеруем по окончании проектирования, и на этом этапе надо искать свободные места рядом с оборудованием и ставить туда номер. Пробовал по спирали плясать от центра блока прямоугольником размером с цифру и смотреть свободен он или нет (ssget "C" p1 p2) - работает очень долго, на больших проектах - до часа. Сейчас задаю смещение цифры от центра блока и привязываю сноску к центру (пара секунд чтоб проставить все номера) - далее юзер сам двигает номера куда надо. Но хотелось бы автоматизировать и этот процесс. Может есть какой либо подход с использованием матриц? Разбить чертеж на сетку - ячейки размер описанного прямоугольника вокруг номера, проверить какие из них свободны, далее беру координаты центра блока и ищу наиболее близкую свободную ячейку. Только пока не придумал как это реализовать.

Re: Нумерация позиций и поиск свободного места на чертеже

Вопрос Стасу:
В вашей программе есть привязка к текущему прайс листу фирмы? При расстановке оборудования при клиенте его сразу интересует цена на проект.

Re: Нумерация позиций и поиск свободного места на чертеже

> Pavelii
Конечно, для этого наша программа и создавалась.
Накидали примерный вариант оборудования, нажали кнопочку, вот вам спецификация с ценником. Клиенту не нравится цена? Удалили с чертежа пару элементов, снова нажали кнопочку - новая спецификация....:)
По поводу номеров: в нашей программе идёт (по умолчанию) сквозная нумерация, но после вставки блоков их можно перенумеровать как угодно, для этого есть специальные функции. Можно вставить оборудование с такого то номера по такой то...сделать разрыв в номерах и продолжить довставлять с пропущенных.

Re: Нумерация позиций и поиск свободного места на чертеже

Кстати говоря у нас была и есть задумка реализации вставки в чертёж набора оборудования по готовой спецификации.

Re: Нумерация позиций и поиск свободного места на чертеже

Была такая проблема.
Я, к счастью, работал в двумерке в довольно пустом чертеже, так что при количестве оборудования до 100-200 прога работает до минуты (2.4ГГц,256Мб).
Прикол в том, что когда чертеж в некотором месте очень плотный, пользоваетлю таки приходится ставить номерок-выноску ручками.
Как я понимаю, надо чтобы расстояние от устройства до выноски было меньше, чем до другого устройства, так?
Есть  вариант в стадии разработки.
На плоском чертеже сначала создаётся номерок-выноска, определяется размер и создаётся область, в которой ещё можно поставить номер. Эту область каждый добавляемый элемент кромсает. Когда процесс останавливается, номер можно лепить, куда хошь - там в любом случае будет свободное место.
(с) gbl-gbl
Если что, пишите.

Re: Нумерация позиций и поиск свободного места на чертеже

> Pavelii
Попробуй не через "ssget" а через "vla-IntersectWith" т.е. рисуй, например полилинию с диагональю и ищи точки пересечения со всеми блоками в цикле (блок будет обрабатываться как габаритный бокс) если найденны точки пересечения двигай полилинию, например по спирали .
Подобный алгоритм опробован, и дает на порядок прибавку скорости...

Re: Нумерация позиций и поиск свободного места на чертеже

Забыл добавить при работе с блоками "vla-IntersectWith" работает также как и с обычными примитивами (линии полилинии итд..)
проблемы возникают при наборе в блок разных примитивов (например линии и арки не объединенные в одну полилинию) vla-IntersectWith может проверить только линии и пропустить арки... Короче пробуй.

Re: Нумерация позиций и поиск свободного места на чертеже

> Евгений
Но это всё равно перебор, только встроенный в АКАД и с хорошей константой впереди.