/
Team8
/
kittycad
Обзор
Документация
Войти
/
Team8
/
kittycad
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/data/solids/boolean.cpp
84 строки
2 KB
levovix
fix: simplified thread displaying for dependant objects
09 янв 2026, 23:44
09 янв 2026, 23:44
0008553
Код
Авторство
О чём код?
#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(); if (solid) { std::vector<SPtr<MbCreator>> creators; solid->GetCreators(creators); auto creator = dynamic_cast<MbBooleanSolid*>(creators.back().get()); solid->RebuildItem(cm_Same, nullptr, nullptr); } else { 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) { drawables.append_range(solids[i]->drawables); } } std::string_view data::Boolean::iconName() const { return "tool_boolean"; }