Skip to content

Commit 8fada7f

Browse files
Copilotcochcoder
andcommitted
Add safety checks and error logging to Rust FFI tree support integration
Co-authored-by: cochcoder <103969142+cochcoder@users.noreply.github.com>
1 parent d5326b9 commit 8fada7f

File tree

1 file changed

+19
-3
lines changed

1 file changed

+19
-3
lines changed

src/libslic3r/PrintObject.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3936,13 +3936,18 @@ void PrintObject::_generate_support_material()
39363936
if (is_tree(m_config.support_type.value)) {
39373937
#ifdef HAS_RUST_TREE_SUPPORTS
39383938
// Use Rust tree support generation via FFI
3939+
if (m_model_object->volumes.empty()) {
3940+
BOOST_LOG_TRIVIAL(error) << "Tree support generation: model object has no volumes";
3941+
return;
3942+
}
3943+
39393944
TreeSupportConfig cfg = {};
39403945
cfg.layer_height = scaled<int64_t>(m_slicing_params.layer_height);
39413946
cfg.support_angle = m_config.support_angle.value * M_PI / 180.0;
39423947
cfg.support_tree_angle = m_config.tree_support_branch_angle.value * M_PI / 180.0;
39433948
cfg.support_tree_branch_diameter = scaled<int64_t>(m_config.tree_support_branch_diameter.value);
39443949

3945-
// Get mesh data
3950+
// Convert mesh to flat arrays for FFI
39463951
const indexed_triangle_set &its = m_model_object->volumes.front()->mesh().its;
39473952
std::vector<float> vertices;
39483953
vertices.reserve(its.vertices.size() * 3);
@@ -3969,12 +3974,23 @@ void PrintObject::_generate_support_material()
39693974
if (handle) {
39703975
SupportOutput *output = orca_tree_support_generate(handle);
39713976
if (output && output->success) {
3972-
// Output generated successfully — support layers are in output->layers
3973-
// TODO: Convert output polygons to SupportLayer objects
3977+
// Convert Rust output to SupportLayer objects
3978+
for (uint32_t i = 0; i < output->layer_count; i++) {
3979+
const auto &layer = output->layers[i];
3980+
coordf_t print_z = unscaled<coordf_t>(layer.z);
3981+
coordf_t height = (i > 0) ? print_z - unscaled<coordf_t>(output->layers[i - 1].z) : print_z;
3982+
add_tree_support_layer(static_cast<int>(i), height, print_z, print_z - 0.5 * height);
3983+
}
3984+
} else if (output && !output->success) {
3985+
BOOST_LOG_TRIVIAL(error) << "Rust tree support generation failed";
3986+
} else {
3987+
BOOST_LOG_TRIVIAL(error) << "Rust tree support generation returned null output";
39743988
}
39753989
if (output)
39763990
orca_tree_support_destroy_output(output);
39773991
orca_tree_support_destroy_handle(handle);
3992+
} else {
3993+
BOOST_LOG_TRIVIAL(error) << "Failed to create Rust tree support handle";
39783994
}
39793995
#else
39803996
// Rust tree supports not available — no tree support generation

0 commit comments

Comments
 (0)