Разрезать Region

Автор Тема: Разрезать Region  (Прочитано 45086 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разрезать Region
« Ответ #45 : 03-06-2014, 11:19:51 »
P.S.: Кстати, последите за размером файла UNDO. Его максимально допустимое значение 2Гб. Вполне возможно, что на очень больших объемах добавления примитивов к базе это значение достигается. Можно попробовать это исправить отключив запись UNDO при помощи вызова Database.DisableUndoRecording(true);
« Последнее редактирование: 03-06-2014, 11:35:42 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #46 : 03-06-2014, 11:24:25 »
Нет, это однозначно ошибка в моём коде. Завтра буду искать. Скорее всего где-то сделал Ctrl+C, Ctrl + V и не переименовал переменную (ну, или что-то вроде того).
Нашёл ошибку: при рассечении на "столбцы" габариты расчитывались относительно региона "строки". А поскольку в ряде случаев строка может содержать в составе контура куски сплайнов, то и габариты показываются не те, что видны визуально (по понятным причинам). Внёс исправление - все смещения dx, dy выполняю относительно габаритов базового региона. Заодно и сетка ровная получается. Сейчас добавлю некоторые дополнительные изменения. Посмотрю, что быстрее: клонировать и смещать регион, или же создавать новый на основе вычисленных точек и контура.

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Разрезать Region
« Ответ #47 : 03-06-2014, 12:22:06 »
Можно попробовать это исправить отключив запись UNDO при помощи вызова Database.DisableUndoRecording(true);
Это первое про что я подумал и в dll и в лиспе - но не оно.
Нашел таки:
Подходит стажер ПТУшник к мастеру опустив взгляд, стоит молчит...
Мастер - что запарол?
 - да - все 11 запарол.
 - я ж тебе всго 10 давал.
 - а я и образец запорол.

Вот так и я я "гонял" "образец" по сетке и копировал его, копии тщательно или записывал или "запарывал", а что в конце образец надо "запороть" забыл. На "небольших" количествах прокатывало, а на многотысячных накладывались дескрипторы и привет. В общем исправил в коде - сейчас файл Андрея "пережевывает" на ура. Выкладывать не стал - т.к. 24 метра.
з.ы. да кстати - сейчас под рукой 2010 - там действительно перегрузка метода IntersectWith только с целыми (а в 2014*64 - нативы).
з.з.ы. Сейчас автор в соседней теме найдет как считать наиболее "правильные" границы через brep, и можно будет еще разогнать на "сплайновых" областях - хотя и "пустые" участки алгоритм пробегает достаточно быстро (без булевых операций с регионами), но все равно делать их незачем.
« Последнее редактирование: 03-06-2014, 15:40:51 от Дима_ »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #48 : 03-06-2014, 20:05:58 »
Цитата: Дима_ link=topic=750.msg2969#msg2969
з.з.ы. Сейчас автор в соседней теме найдет как считать наиболее "правильные" границы через brep, и можно будет еще разогнать на "сплайновых" областях - хотя и "пустые" участки алгоритм пробегает достаточно быстро (без булевых операций с регионами), но все равно делать их незачем.
Угу. Найдено и было показано здесь ещё в 14:28. Обновил здесь описание, скрины и код. Осталось решить проблему объединённых регионов. Но это уже не сегодня. Завтра заодно оптимизирую код GetVisualBoundary, чтобы половинить расстояния, те опять половинить и т.д. а не приращать на значения dx и dy (а то текущий вариант похож на пузырьковую сортировку :)).
« Последнее редактирование: 03-06-2014, 20:25:07 от Андрей Бушман »

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Разрезать Region
« Ответ #49 : 03-06-2014, 21:57:05 »
Стал проверять 2014x64 - не работает - все тоже самое, после записи - висим. Поняв что это все-же не та ошибка что нашел на 2010x32 (здесь она не проявляется даже если Dispose() убрать, видимо из-за разрядности дескрипторов - их коллизийность на порядок меньше) - но проделал простой эксперимент - берем чистый акад, создаем регион, делаем 50 тыс. копий вручную (это не долго, делаем 10 копий, потом еще 10 копий копий итд - за несколько движений получаем нужное количество), нажимаем запись сохраняется tmp файл и виснет намертво (ну или я такой не терпеливый)... Видимо эта то самое обновление работы с регионами. Можно передать"привет" автодеску.
p/s/ От массива эффект аналогичный...
p.p.s По поводу нахождения границ методом Ньютона - ту можно попасть в просак т.к. метод подразумевает непрерывную функцию - проще говоря если регион из двух кусков, можно запросто попасть между ними - в общем есть вариант оставить "как есть".
« Последнее редактирование: 03-06-2014, 23:16:12 от Дима_ »

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #50 : 03-06-2014, 23:37:26 »
проще говоря если регион из двух кусков, можно запросто попасть между ними - в общем есть вариант оставить "как есть".
Хм... Как вариант, можно с помощью Brep попробовать проанализировать границы каждого Face и вычислить для них (minX, minY) и (maxX, maxY).

Пользователи ставят перед фактом, что объединённых регионов обязательно не должно быть. Т.о. на эту тему ещё придётся думать... Вот если бы можно было на основе Face создать Region, то тогда проблема бы отвалилась. Пока что юзеры предлагают, мол: "если всё так сложно, то просто скачай с Инета прогу, которая будет по точкам делать триангуляцию на основе объектов Region или Solid3d (делов-то). Таких программ в Инете полным полно."...

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

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
Re: Разрезать Region
« Ответ #51 : 03-06-2014, 23:56:00 »
пока вижу только вариант брать заведомо меньший размер клетки

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #52 : 04-06-2014, 00:02:29 »
пока вижу только вариант брать заведомо меньший размер клетки
Тут видишь ли в чём дело... Проектировщикам нужно сечение конструкции в разных местах кромсать по разному. Т.е. они сначала могут дать команду разрезать регион на три строки (не рассекая их на столбцы), а затем к каждой строке применить свою собственную команду нарезки со своим размером ячейки. Как правило, крайние строки им нужно резать на как можно меньшие ячейки, в то время как строки ближе к центру можно резать на бОльшие куски.

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

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #53 : 04-06-2014, 00:06:22 »
Предлагаю завести отдельную ветку форума, аля "Клуб любителей резьбы по дереву по регионам\солидам... ;D

Шутки юмора шучу...

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разрезать Region
« Ответ #54 : 04-06-2014, 00:42:26 »
Хм... Как вариант, можно с помощью Brep попробовать проанализировать границы каждого Face и вычислить для них (minX, minY) и (maxX, maxY).
"Я эту идею породил - я её и убью". Она будет несправедлива в случае если внутренние контура могут быть не выпуклыми.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #55 : 04-06-2014, 00:45:13 »
Она будет несправедлива в случае если внутренние контура не выпуклые.
Поясните. Какая разница "выпуклые" или "впуклые"? Границы-то один хрен: двумя точками кажет (левый нижний и правый верхний).

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разрезать Region
« Ответ #56 : 04-06-2014, 01:45:01 »
Поясните. Какая разница "выпуклые" или "впуклые"? Границы-то один хрен: двумя точками кажет (левый нижний и правый верхний).
Подумай как будут выглядеть окаймляющие прямоугольники у этих двух фигур и как они будут располагаться один относительно другого:

« Последнее редактирование: 04-06-2014, 02:31:18 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13877
  • Карма: 1785
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Разрезать Region
« Ответ #57 : 04-06-2014, 02:18:39 »
Вот если бы можно было на основе Face создать Region, то тогда проблема бы отвалилась.
Ну в принципе можно. Только не на основе Face, а на основе Loop ты должен создавать Region. Фактически в указанном тобой "неправильном" Region вместо одного несколько Loop. Каждый Loop состоит из одной или нескольких Edge, которую можно превратить в  Curve3d. Из Curve3d можно получить (с заданной точностью) набор точек, которые её представляют. Как это сделать я показал тут: http://adn-cis.org/forum/index.php?topic=495.msg2990#msg2990
Ну и из набора точек несложно создать Polyline из которой создать Region. Как-то так пока.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей БушманАвтор темы

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Re: Разрезать Region
« Ответ #58 : 04-06-2014, 11:11:08 »
Всё оказалось гораздо проще... :)
 
1. Если мы взрываем одиночные регионы (с отверстиями или без - это не важно), то на выходе получаем примитивы, которыми вычерчен их контур, т.е. линии, дуги, сплайны, окружности.

2. Если мы взрываем объединённые регионы, то при первом взрыве мы получаем набор отдельных регионов, с сохранением отверстий (если таковые имеются). Повторный взрыв делает то же самое, что и в п.1.

Т.о. если я вижу, что Face Complexes более 1, то взрываю регион и полученные новые регионы добавляю в набор. Проверил, работает. Подправил код в блоге.
« Последнее редактирование: 04-06-2014, 11:21:53 от Андрей Бушман »

Оффлайн bargool

  • ADN Club
  • ***
  • Сообщений: 111
  • Карма: 6
Re: Разрезать Region
« Ответ #59 : 04-06-2014, 11:43:52 »
Те, что видели на тему триангуляции, строят треугольные объекты Face (это годится) по точкам, и не учитывают отверстия (а это уже не то...)
Вот эта библиотека делает триангуляцию по точкам, при этом есть возможность указать отверстия и контуры.. недавно с ней пришлось основательно поиграться..
Алексей