mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-08-01 23:32:10 +00:00
fix: harden CLI export without OpenGL thumbnails (#13532)
## Summary - skip CLI thumbnail generation when an OpenGL/GLFW context cannot be created, allowing export workflows to continue in headless/automation environments - guard filament variant remapping against missing config options and out-of-range variant indexes - log warnings instead of dereferencing invalid config state during CLI/profile-driven export ## Context These guards came out of automating OrcaSlicer CLI exports for printer workflows. In that flow, slicing/export can still be valid even when thumbnail rendering is unavailable, but the current path can proceed into OpenGL thumbnail setup after context creation fails. Separately, malformed or mismatched filament/profile state can index past option vectors during multi-filament value remapping. ## Test plan - `git diff --check` - `cmake --build build/arm64 --config RelWithDebInfo --target OrcaSlicer -- -j4`
This commit is contained in:
committed by
GitHub
parent
c965b2a5b3
commit
bcbc581417
@@ -6435,6 +6435,7 @@ int CLI::run(int argc, char **argv)
|
|||||||
glfwGetVersion(&gl_major, &gl_minor, &gl_verbos);
|
glfwGetVersion(&gl_major, &gl_minor, &gl_verbos);
|
||||||
BOOST_LOG_TRIVIAL(info) << boost::format("opengl version %1%.%2%.%3%")%gl_major %gl_minor %gl_verbos;
|
BOOST_LOG_TRIVIAL(info) << boost::format("opengl version %1%.%2%.%3%")%gl_major %gl_minor %gl_verbos;
|
||||||
|
|
||||||
|
bool thumbnail_opengl_ready = false;
|
||||||
glfwSetErrorCallback(glfw_callback);
|
glfwSetErrorCallback(glfw_callback);
|
||||||
int ret = glfwInit();
|
int ret = glfwInit();
|
||||||
if (ret == GLFW_FALSE) {
|
if (ret == GLFW_FALSE) {
|
||||||
@@ -6463,13 +6464,22 @@ int CLI::run(int argc, char **argv)
|
|||||||
GLFWwindow* window = glfwCreateWindow(640, 480, "base_window", NULL, NULL);
|
GLFWwindow* window = glfwCreateWindow(640, 480, "base_window", NULL, NULL);
|
||||||
if (window == NULL)
|
if (window == NULL)
|
||||||
{
|
{
|
||||||
BOOST_LOG_TRIVIAL(error) << "Failed to create GLFW window" << std::endl;
|
BOOST_LOG_TRIVIAL(error) << "Failed to create GLFW window; skipping thumbnail rendering for CLI export" << std::endl;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
glfwMakeContextCurrent(window);
|
glfwMakeContextCurrent(window);
|
||||||
|
thumbnail_opengl_ready = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//opengl manager related logic
|
//opengl manager related logic
|
||||||
|
if (!thumbnail_opengl_ready) {
|
||||||
|
BOOST_LOG_TRIVIAL(error) << "OpenGL context unavailable; skip thumbnail generating" << std::endl;
|
||||||
|
need_create_thumbnail_group = false;
|
||||||
|
need_create_no_light_group = false;
|
||||||
|
need_create_top_group = false;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
GUI::OpenGLManager opengl_mgr;
|
GUI::OpenGLManager opengl_mgr;
|
||||||
bool opengl_valid = opengl_mgr.init_gl(false);
|
bool opengl_valid = opengl_mgr.init_gl(false);
|
||||||
|
|||||||
@@ -9589,11 +9589,19 @@ void DynamicPrintConfig::update_values_to_printer_extruders_for_multiple_filamen
|
|||||||
case coStrings:
|
case coStrings:
|
||||||
{
|
{
|
||||||
ConfigOptionStrings * opt = this->option<ConfigOptionStrings>(key);
|
ConfigOptionStrings * opt = this->option<ConfigOptionStrings>(key);
|
||||||
|
if (!opt) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", Line %1%: option %2% not found, skipping")%__LINE__%key;
|
||||||
|
break;
|
||||||
|
}
|
||||||
std::vector<std::string> new_values;
|
std::vector<std::string> new_values;
|
||||||
|
|
||||||
new_values.resize(filament_count);
|
new_values.resize(filament_count);
|
||||||
for (int f_index = 0; f_index < filament_count; f_index++)
|
for (int f_index = 0; f_index < filament_count; f_index++)
|
||||||
{
|
{
|
||||||
|
if (variant_index[f_index] < 0 || static_cast<size_t>(variant_index[f_index]) >= opt->size()) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", Line %1%: option %2% variant index %3% out of range, skipping")%__LINE__%key%variant_index[f_index];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
new_values[f_index] = opt->get_at(variant_index[f_index]);
|
new_values[f_index] = opt->get_at(variant_index[f_index]);
|
||||||
}
|
}
|
||||||
opt->values = new_values;
|
opt->values = new_values;
|
||||||
@@ -9602,11 +9610,19 @@ void DynamicPrintConfig::update_values_to_printer_extruders_for_multiple_filamen
|
|||||||
case coInts:
|
case coInts:
|
||||||
{
|
{
|
||||||
ConfigOptionInts * opt = this->option<ConfigOptionInts>(key);
|
ConfigOptionInts * opt = this->option<ConfigOptionInts>(key);
|
||||||
|
if (!opt) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", Line %1%: option %2% not found, skipping")%__LINE__%key;
|
||||||
|
break;
|
||||||
|
}
|
||||||
std::vector<int> new_values;
|
std::vector<int> new_values;
|
||||||
|
|
||||||
new_values.resize(filament_count);
|
new_values.resize(filament_count);
|
||||||
for (int f_index = 0; f_index < filament_count; f_index++)
|
for (int f_index = 0; f_index < filament_count; f_index++)
|
||||||
{
|
{
|
||||||
|
if (variant_index[f_index] < 0 || static_cast<size_t>(variant_index[f_index]) >= opt->size()) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", Line %1%: option %2% variant index %3% out of range, skipping")%__LINE__%key%variant_index[f_index];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
new_values[f_index] = opt->get_at(variant_index[f_index]);
|
new_values[f_index] = opt->get_at(variant_index[f_index]);
|
||||||
}
|
}
|
||||||
opt->values = new_values;
|
opt->values = new_values;
|
||||||
@@ -9615,11 +9631,19 @@ void DynamicPrintConfig::update_values_to_printer_extruders_for_multiple_filamen
|
|||||||
case coFloats:
|
case coFloats:
|
||||||
{
|
{
|
||||||
ConfigOptionFloats * opt = this->option<ConfigOptionFloats>(key);
|
ConfigOptionFloats * opt = this->option<ConfigOptionFloats>(key);
|
||||||
|
if (!opt) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", Line %1%: option %2% not found, skipping")%__LINE__%key;
|
||||||
|
break;
|
||||||
|
}
|
||||||
std::vector<double> new_values;
|
std::vector<double> new_values;
|
||||||
|
|
||||||
new_values.resize(filament_count);
|
new_values.resize(filament_count);
|
||||||
for (int f_index = 0; f_index < filament_count; f_index++)
|
for (int f_index = 0; f_index < filament_count; f_index++)
|
||||||
{
|
{
|
||||||
|
if (variant_index[f_index] < 0 || static_cast<size_t>(variant_index[f_index]) >= opt->size()) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", Line %1%: option %2% variant index %3% out of range, skipping")%__LINE__%key%variant_index[f_index];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
new_values[f_index] = opt->get_at(variant_index[f_index]);
|
new_values[f_index] = opt->get_at(variant_index[f_index]);
|
||||||
}
|
}
|
||||||
opt->values = new_values;
|
opt->values = new_values;
|
||||||
@@ -9628,11 +9652,19 @@ void DynamicPrintConfig::update_values_to_printer_extruders_for_multiple_filamen
|
|||||||
case coPercents:
|
case coPercents:
|
||||||
{
|
{
|
||||||
ConfigOptionPercents * opt = this->option<ConfigOptionPercents>(key);
|
ConfigOptionPercents * opt = this->option<ConfigOptionPercents>(key);
|
||||||
|
if (!opt) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", Line %1%: option %2% not found, skipping")%__LINE__%key;
|
||||||
|
break;
|
||||||
|
}
|
||||||
std::vector<double> new_values;
|
std::vector<double> new_values;
|
||||||
|
|
||||||
new_values.resize(filament_count);
|
new_values.resize(filament_count);
|
||||||
for (int f_index = 0; f_index < filament_count; f_index++)
|
for (int f_index = 0; f_index < filament_count; f_index++)
|
||||||
{
|
{
|
||||||
|
if (variant_index[f_index] < 0 || static_cast<size_t>(variant_index[f_index]) >= opt->size()) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", Line %1%: option %2% variant index %3% out of range, skipping")%__LINE__%key%variant_index[f_index];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
new_values[f_index] = opt->get_at(variant_index[f_index]);
|
new_values[f_index] = opt->get_at(variant_index[f_index]);
|
||||||
}
|
}
|
||||||
opt->values = new_values;
|
opt->values = new_values;
|
||||||
@@ -9641,11 +9673,19 @@ void DynamicPrintConfig::update_values_to_printer_extruders_for_multiple_filamen
|
|||||||
case coFloatsOrPercents:
|
case coFloatsOrPercents:
|
||||||
{
|
{
|
||||||
ConfigOptionFloatsOrPercents * opt = this->option<ConfigOptionFloatsOrPercents>(key);
|
ConfigOptionFloatsOrPercents * opt = this->option<ConfigOptionFloatsOrPercents>(key);
|
||||||
|
if (!opt) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", Line %1%: option %2% not found, skipping")%__LINE__%key;
|
||||||
|
break;
|
||||||
|
}
|
||||||
std::vector<FloatOrPercent> new_values;
|
std::vector<FloatOrPercent> new_values;
|
||||||
|
|
||||||
new_values.resize(filament_count);
|
new_values.resize(filament_count);
|
||||||
for (int f_index = 0; f_index < filament_count; f_index++)
|
for (int f_index = 0; f_index < filament_count; f_index++)
|
||||||
{
|
{
|
||||||
|
if (variant_index[f_index] < 0 || static_cast<size_t>(variant_index[f_index]) >= opt->size()) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", Line %1%: option %2% variant index %3% out of range, skipping")%__LINE__%key%variant_index[f_index];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
new_values[f_index] = opt->get_at(variant_index[f_index]);
|
new_values[f_index] = opt->get_at(variant_index[f_index]);
|
||||||
}
|
}
|
||||||
opt->values = new_values;
|
opt->values = new_values;
|
||||||
@@ -9654,11 +9694,19 @@ void DynamicPrintConfig::update_values_to_printer_extruders_for_multiple_filamen
|
|||||||
case coBools:
|
case coBools:
|
||||||
{
|
{
|
||||||
ConfigOptionBools * opt = this->option<ConfigOptionBools>(key);
|
ConfigOptionBools * opt = this->option<ConfigOptionBools>(key);
|
||||||
|
if (!opt) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", Line %1%: option %2% not found, skipping")%__LINE__%key;
|
||||||
|
break;
|
||||||
|
}
|
||||||
std::vector<unsigned char> new_values;
|
std::vector<unsigned char> new_values;
|
||||||
|
|
||||||
new_values.resize(filament_count);
|
new_values.resize(filament_count);
|
||||||
for (int f_index = 0; f_index < filament_count; f_index++)
|
for (int f_index = 0; f_index < filament_count; f_index++)
|
||||||
{
|
{
|
||||||
|
if (variant_index[f_index] < 0 || static_cast<size_t>(variant_index[f_index]) >= opt->size()) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", Line %1%: option %2% variant index %3% out of range, skipping")%__LINE__%key%variant_index[f_index];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
new_values[f_index] = opt->get_at(variant_index[f_index]);
|
new_values[f_index] = opt->get_at(variant_index[f_index]);
|
||||||
}
|
}
|
||||||
opt->values = new_values;
|
opt->values = new_values;
|
||||||
@@ -9667,11 +9715,19 @@ void DynamicPrintConfig::update_values_to_printer_extruders_for_multiple_filamen
|
|||||||
case coEnums:
|
case coEnums:
|
||||||
{
|
{
|
||||||
ConfigOptionEnumsGeneric * opt = this->option<ConfigOptionEnumsGeneric>(key);
|
ConfigOptionEnumsGeneric * opt = this->option<ConfigOptionEnumsGeneric>(key);
|
||||||
|
if (!opt) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", Line %1%: option %2% not found, skipping")%__LINE__%key;
|
||||||
|
break;
|
||||||
|
}
|
||||||
std::vector<int> new_values;
|
std::vector<int> new_values;
|
||||||
|
|
||||||
new_values.resize(filament_count);
|
new_values.resize(filament_count);
|
||||||
for (int f_index = 0; f_index < filament_count; f_index++)
|
for (int f_index = 0; f_index < filament_count; f_index++)
|
||||||
{
|
{
|
||||||
|
if (variant_index[f_index] < 0 || static_cast<size_t>(variant_index[f_index]) >= opt->size()) {
|
||||||
|
BOOST_LOG_TRIVIAL(warning) << __FUNCTION__ << boost::format(", Line %1%: option %2% variant index %3% out of range, skipping")%__LINE__%key%variant_index[f_index];
|
||||||
|
continue;
|
||||||
|
}
|
||||||
new_values[f_index] = opt->get_at(variant_index[f_index]);
|
new_values[f_index] = opt->get_at(variant_index[f_index]);
|
||||||
}
|
}
|
||||||
opt->values = new_values;
|
opt->values = new_values;
|
||||||
|
|||||||
Reference in New Issue
Block a user