/
levovix
/
kittycad
Обзор
Документация
Войти
/
levovix
/
kittycad
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/data/solids/boolean.cpp
78 строк
2 KB
levovix
fix: boolean segfault
27 апр 2026, 20:54
27 апр 2026, 20:54
7a3e056
Код
Авторство
О чём код?
#include "./boolean.h" #include <solid.h> #include <mesh.h> #include <model.h> #include <cur_polyline.h> #include <cur_polyline3d.h> #include <action_curve.h> #include <action_solid.h> #include <cr_boolean_solid.h> #include <vsn_scenesegment.h> #include <vsn_scenecontent.h> #include <vsn_geometryfactory.h> #include "graphics/drawable.h" using namespace VSN; using namespace c3d; void data::Boolean::buildSolid() { assert(m_propertyChanged || m_dependencyChanged); if (m_dependencyChanged) { solid = nullptr; } drawables = {}; m_propertyChanged = false; m_dependencyChanged = false; markVisualChanged(); auto names = MbSNameMaker(ct_ElementarySolid, MbSNameMaker::i_SideNone, 0); auto cNames = PArray<MbSNameMaker>(0, 1, false); SPtr<MbSolid> currentSolid{}; for (int i = 0; i < std::min(solids.size(), opkinds.size()); ++i) { if (solids[i] == nullptr || solids[i]->solid == nullptr) { continue; } if (currentSolid == nullptr) { currentSolid = solids[i]->solid; continue; } // todo: учитывать ситуацию когда первое тело вычитания, а затем объединения (первное нужно будет вычесть из второго) OperationType optype = bo_Unknown; switch (opkinds[i]) { case Kind::Union: { optype = bo_Union; } break; case Kind::Difference: { optype = bo_Difference; } break; case Kind::Intersection: { optype = bo_Intersect; } break; default: { assert(false); } break; } MbBooleanOperationParams params{optype, true, names}; SPtr<MbSolid> newSolid; if (auto code = ::BooleanResult( currentSolid, cm_Copy, // todo: разобраться почему cm_Same не работает solids[i]->solid, cm_Copy, // todo: тут тоже params, newSolid ); code != rt_Success) { return; } currentSolid = newSolid; } solid = currentSolid; for (int i = 0; i < std::min(solids.size(), opkinds.size()); ++i) { if (solids[i]) { drawables.append_range(solids[i]->drawables); } } } std::string_view data::Boolean::iconName() const { return "tool_boolean"; }