Возможно ли построить граф средствами C# из блоков и полилиний?

Автор Тема: Возможно ли построить граф средствами C# из блоков и полилиний?  (Прочитано 247 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн LucaАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: -1
Уважаемые форумчане, задался следующим вопросом:
Возможно ли программно обработать чертеж так, чтобы можно было построить граф?
Поясню:
Существуют блоки, которые соединены полилиниями. Возможно ли построить аналогичную структуру в программе, те  блок А1 соединен с блоком А2 полилинией, у полилинии есть характеристики, те я могу тогда програмно данные оформить в виде таблицы, предварительно произведя расчеты?
Получив экземпляр блока я могу определить, что к нему "пристыкована" полилиния или нет?  может быть как-то специально нужно блок создавать тогда?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10386
  • Карма: 1314
  • Рыцарь ObjectARX
  • Skype: rivilis
Существуют блоки, которые соединены полилиниями.
Соединены как? Поясняю мой вопрос. Полилиния может проходить через блок, её вершина или конечная точка может совпадать с точкой вставки блока или еще как-то. Определись что в твоём понимании "соединены".
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LucaАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: -1
Соединены как? Поясняю мой вопрос. Полилиния может проходить через блок, её вершина или конечная точка может совпадать с точкой вставки блока или еще как-то. Определись что в твоём понимании "соединены".
не проходит через блок. соединяет края блоков (середины, концевые точки..)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10386
  • Карма: 1314
  • Рыцарь ObjectARX
  • Skype: rivilis
соединяет края блоков (середины, концевые точки..)
У блоков нет понятия края, середины, концевых точек. Есть только точка вставки блока: BlockReference.Position
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LucaАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: -1
У блоков нет понятия края, середины, концевых точек. Есть только точка вставки блока: BlockReference.Position
нельзя? а как в автокад электрикал тогда делается?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10386
  • Карма: 1314
  • Рыцарь ObjectARX
  • Skype: rivilis
а как в автокад электрикал тогда делается?
Думаю, что там специфический блок. Нужно смотреть. У меня AutoCAD Electrical не установлен. Если у тебя он установлен, то сохрани и выложи сюда файл с таким блоком. Проанализирую.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LucaАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: -1
Думаю, что там специфический блок. Нужно смотреть.
получается, так, в лоб если, то просто разместить их на одном слое, потом с этого слоя собрать все блоки и полилинии, посмотреть рассчитать расстояния от конца линии до середины блока (размеры блока известны) и тогда строить граф... в принципе, ну 100 приборов на чертеже, пусть сложность подобных вычислений высока, но всё равно это будет занимать милисекунды для 100 блоков

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10386
  • Карма: 1314
  • Рыцарь ObjectARX
  • Skype: rivilis
Думаю, что там специфический блок. Нужно смотреть.
получается, так, в лоб если, то просто разместить их на одном слое, потом с этого слоя собрать все блоки и полилинии, посмотреть рассчитать расстояния от конца линии до середины блока (размеры блока известны) и тогда строить граф... в принципе, ну 100 приборов на чертеже, пусть сложность подобных вычислений высока, но всё равно это будет занимать милисекунды для 100 блоков
Если воспользоваться R-tree, то будет еще быстрее.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн LucaАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: -1
Off-Topic: показать

Времени очень мало, тк много работы, поэтому заниматься данным вопросом приходиться на выходных и в свободное время, которого почти нет
+ немного почитал С#

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

надеюсь я правильно представил себе алгоритм...

Оффлайн LucaАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 80
  • Карма: -1

для сохранения промежуточного результата поиска полилиний и блоков выбрал структуры
Код - C# [Выбрать]
  1. List<BlockTableRecord> listOfBlocks = new List<BlockTableRecord>();
  2. List<Polyline> listOfPolylines = new List<Polyline>();
сортируются, итерируются...


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 10386
  • Карма: 1314
  • Рыцарь ObjectARX
  • Skype: rivilis
для сохранения промежуточного результата поиска полилиний и блоков выбрал структуры
Это только если ты в пределах одной транзакции. После её завершения все элементы будут недействительны. Для более длительного хранения лучше использовать их ObjectId.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение