Когда вы оптимизируете сетки с секущими плоскостями, оптимизация кажется зависает после инициализации. Ошибка не возникает, но она застревает.
Тестировать:
shapeworks optimize --name correspondence_1024.xml
Обратите внимание, что если секущая плоскость удаляется из xml, оптимизация выполняется должным образом.
Отличный отчет об ошибке @ jadie1 , небольшой набор данных и инструкции по воспроизведению.
@HeavenlyBerserker , для справки, он застрял здесь:
Call graph:
5 Thread_5215217 DispatchQueue_1: com.apple.main-thread (serial)
+ 5 start (in libdyld.dylib) + 1 [0x7fff69ef2cc9]
+ 5 main (in shapeworks) + 2606 [0x102bfb9fe] shapeworks.cpp:88
+ 5 shapeworks::Executable::run(int, char const* const*) (in shapeworks) + 188 [0x102c0ad7c] Executable.cpp:128
+ 5 shapeworks::Executable::run(std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >, shapeworks::SharedCommandData&) (in shapeworks) + 308 [0x102c0a6f4] Executable.cpp:94
+ 5 shapeworks::Command::run(shapeworks::SharedCommandData&) (in shapeworks) + 20 [0x102c14e64] Command.cpp:27
+ 5 shapeworks::OptimizeCommand::execute(optparse::Values const&, shapeworks::SharedCommandData&) (in shapeworks) + 921 [0x102c16889] Commands.cpp:92
+ 5 shapeworks::Optimize::Run() (in shapeworks) + 1938 [0x102ea5d52] Optimize.cpp:120
+ 5 shapeworks::Optimize::Initialize() (in shapeworks) + 1770 [0x102ea7d3a] Optimize.cpp:733
+ 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double) (in shapeworks) + 2133 [0x102eb46f5] itkParticleSystem.txx:330
+ 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double) (in shapeworks) + 2542 [0x102eb488e] itkParticleSystem.txx:344
+ ! 1 itk::Constraints::IsAnyViolated(itk::Point<double, 3u> const&) (in shapeworks) + 71 [0x102ecce67] Constraints.h:61
+ 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double) (in shapeworks) + 2530 [0x102eb4882] itkParticleSystem.txx:344
+ 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double) (in shapeworks) + 3010 [0x102eb4a62] itkParticleSystem.txx:349
+ 1 itk::ParticleSystem<3u>::AdvancedAllParticleSplitting(double) (in shapeworks) + 1655 [0x102eb4517] vector:0
Я поддерживаю качество этого отчета об ошибке. Я посмотрел на проблему. Спасибо, что проверил это, Алан.
Функция AdvancedAllParticleSplitting зависнет, если ни одна из частиц, движущихся в любом направлении на определенный радиус (расстояние от разделенной частицы до исходной частицы), не удовлетворяет ограничениям. Я думал об ограничении количества попыток направления, но отказался от этого, потому что в зависимости от режущих плоскостей попадание может быть очень редким, поэтому любое постоянное число может быть неподходящим. Я открыт для предложений, как справиться с этим, хотя, если текущая работа, которую я выполняю, сработает, AdvancedAllParticleSplitting не будет строго необходим, поэтому мы можем обсудить совершенно разные стратегии разделения частиц.
Что касается самого теста, это происходит из-за расположения сеток. Плоскости среза срезаются при z = от -40,5 до -42,5, но сетки располагаются на z = от -737,593 до -609,55, от -1217,76 до -1114,47 и от 1079,93 до 1206,3 (показано ниже). Это вызывает две проблемы. Во-первых, независимо от того, в какую сторону направлена нормаль (вверх / вниз), будет хотя бы одна бедренная кость, которая полностью нарушает ограничения. Во-вторых, радиус разделения частиц определяется величиной эпсилон, зависящей от расстояния между входными данными; в этом случае интервал составляет 1000 с, поэтому любое разделение может нарушить ограничения.
Обратите внимание: бедренные кости, которые вы используете, уже были обрезаны методом клипсирования. Я не думаю, что это было бы сделано в реальном сценарии. Вспомните, как я удалил ClipBinaryVolumes и применилCropping для femur_cut.py.
Пожалуйста, поручите мне решать любые будущие вопросы, касающиеся резки плоскостей (в C ++). Я не тестировал код режущей плоскости с сетками. Нет никаких причин, по которым он не должен работать, но было бы хорошо проверить его на наличие ошибок. Спасибо всем!
@HeavenlyBerserker, ладно, теоретически, если бы сетки и плоскости резки имели смысл, тогда бы ошибки не существовало? Джо нужно оптимизировать с помощью режущих плоскостей на несжатых сетках бедренной кости, я пытался предоставить ему пример xml. Итак, я просто сделал плоскости для резки и использовал сетку бедренной кости, но если я буду более осторожен, тогда это должно сработать?
Да, я пробовал вырезать плоскости, которые не нарушаются, но столкнулся с проблемой интервала, но это работает. Если вы можете поместить все бедра в одну и ту же общую область и отрегулировать плоскости сечения, чтобы они были разумными, я не вижу причин, по которым это не должно работать, особенно учитывая, что вы используете только одну плоскость среза.
Хорошо, да, подтвердил отсутствие ошибок, когда я использовал эти данные: test.zip
Спасибо, что помогли мне понять @HeavenlyBerserker
Закрытие сейчас
Я не тестировал код режущей плоскости с сетками. Нет никаких причин, по которым он не должен работать, но было бы хорошо проверить его на наличие ошибок.
Мы успешно нарезали несколько сеток, и для этого есть модульные тесты (MeshTests, PythonTests и shapeworksTests).
Пожалуйста, поручайте мне решать любые будущие проблемы в C ++.
Абсолютно! Спасибо!!
@HeavenlyBerserker , есть ли способ обнаружить это состояние и вызвать исключение или сообщение об ошибке? Я бы предпочел это зависанию или сбою. Кроме того, есть ли способ проверить перед запуском? См. №910.
Хм, должна быть возможность проверить, удовлетворяет ли хотя бы одна из точек сетки / изображения любого входа ограничению. Не надежно, но должно работать 99,9% времени.