Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Port latest support code from BBS #8212

Draft
wants to merge 71 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
58d524d
Remove unused Organic tree code
Noisyfox Jan 26, 2025
824f9ef
Remove duplicated support code
Noisyfox Jan 26, 2025
4034ffe
Replace `TreeSupport::SupportParams` with `SupportParameters`
Noisyfox Jan 26, 2025
51290a8
Clean up tree support code
Noisyfox Jan 26, 2025
1d1df4b
ENH: improve tree support
Noisyfox Jan 26, 2025
2205ad0
FIX: improve tree support generation speed
Noisyfox Jan 26, 2025
70c4961
FIX: tree support generates floating hybrid supports
Noisyfox Jan 26, 2025
5fb0e01
ENH: improve auto-arranging objects with tree support
Noisyfox Jan 27, 2025
8a7cc79
ENH: improve first layer tree support
ArthurBambulab Oct 31, 2023
14ecfac
ENH: open support wall count for normal support
ArthurBambulab Nov 16, 2023
5f45092
FIX: compiling error on linux
ArthurBambulab Nov 17, 2023
e8d4291
FIX: adaptive layer height may mess up support layers
ArthurBambulab Sep 13, 2023
c443951
FIX: organic support not work with raft only
ArthurBambulab Nov 28, 2023
8c51f3e
FIX: crash when support type and style are inconsistent
ArthurBambulab Dec 1, 2023
1c49866
FIX: several support bugs
ArthurBambulab Dec 20, 2023
cc9f29c
Rename `smsOrganic` to `smsTreeOrganic`
Noisyfox Jan 27, 2025
b3be5bb
ENH: tree support uses accurate lslices
ArthurBambulab Sep 14, 2023
de24d0a
FIX: tree support bottom interface layers were not correct
ArthurBambulab Aug 4, 2023
d0868d6
ENH: accurate top z distance for tree support
ArthurBambulab Jan 6, 2024
c7febad
FIX: raft_first_layer_expansion not working with tree support
ArthurBambulab Jan 26, 2024
a2e5332
FIX: z_distance_top==0 not working
ArthurBambulab Jan 31, 2024
31a5f0d
FIX: Checking support necessity not working
ArthurBambulab Feb 1, 2024
562dc76
FIX: raft of tree support was incorrect
ArthurBambulab Mar 6, 2024
715e8e1
FIX: improve cantilever detection of tree support
ArthurBambulab Mar 7, 2024
c199730
FIX: tree support detect overhang inaccurate
ArthurBambulab Sep 14, 2023
107551f
ENH: improve the support of blade-shape overhangs
ArthurBambulab Mar 7, 2024
242a36a
FIX: several issue of organic support
ArthurBambulab Mar 8, 2024
4ee6d63
FIX: blockers are not working correctly with organic supports.
ArthurBambulab Mar 8, 2024
fd3ed41
NEW: add support_object_first_layer_gap option
ArthurBambulab Mar 6, 2024
da7eea4
FIX: reduce unnecessary small parts of tree supports
ArthurBambulab Mar 14, 2024
19107b5
FIX: compiling error due to template function deduction
ArthurBambulab Mar 15, 2024
0b671e8
ENH: speedup tree support generation
ArthurBambulab Mar 15, 2024
2577b9b
ENH: improve supporting sharp tails of tree support
ArthurBambulab Mar 26, 2024
5a8612e
FIX: tree supports may generate flying nodes
ArthurBambulab Mar 29, 2024
6e05d9e
FIX: overhang interface may overlap with object
ArthurBambulab Apr 1, 2024
36f2df3
FIX: blockers not working for sharp tails of tree support
ArthurBambulab Apr 12, 2024
3d70bdc
FIX: top z distance incorrect with adaptive layer height
ArthurBambulab May 23, 2024
2332caa
FIX: empty first layer of tree support
ArthurBambulab May 28, 2024
fa11957
FIX: do not break bridges in tree support
ArthurBambulab Jun 25, 2024
0cfa5f4
FIX: missing support layers at raft gap
ArthurBambulab May 24, 2024
9ee61bb
FIX: top z distance inaccurate if it's too large
ArthurBambulab Jul 2, 2024
f00bdfe
FIX: enforcers may not work with contour expansion
ArthurBambulab Jul 3, 2024
532dcae
ENH: add rectilinear interface pattern for organic support
ArthurBambulab May 28, 2024
5054ee8
ENH: improve hybrid tree support
ArthurBambulab Jul 22, 2024
ae6fadd
ENH: add vertical support enforcer
ArthurBambulab Mar 21, 2024
f76683e
FIX: support wall count doesn't work
ArthurBambulab Aug 30, 2024
59b756a
FIX: chain_and_reorder_extrusion_entities crashes
ArthurBambulab Sep 3, 2024
e78d50f
ENH: improve hybrid tree support
ArthurBambulab Sep 11, 2024
3e7e4df
ENH: precise tree support wall count
ArthurBambulab Sep 12, 2024
724d8a1
FIX: fix hybrid tree support may go outside plate
ArthurBambulab Sep 19, 2024
e6880a4
FIX: tree support crashes when it's too short
ArthurBambulab Sep 26, 2024
36970dd
FIX: hybrid tree support crash in some case
ArthurBambulab Sep 29, 2024
7a26dde
ENH: improve shar tail detection of tree support
ArthurBambulab Oct 10, 2024
07c7e2f
FIX: solve tree support crash
ArthurBambulab Oct 21, 2024
1c686b3
ENH: improve tree supports
ArthurBambulab Oct 15, 2024
c1df01f
FIX: hybrid tree support may crash due to empty extrusion entities
ArthurBambulab Oct 27, 2024
d54d81e
FIX: 0 top z distance of hybrid tree support not working
ArthurBambulab Oct 29, 2024
9f4d9fb
FIX: normal support missing base interface layers
ArthurBambulab Nov 6, 2024
9e1b856
FIX: protect when support_style doesnt match type
Nov 18, 2024
35157c9
FIX: apply xy_expansion after support blocker
ArthurBambulab Dec 2, 2024
d7cf4b2
FIX: inconsistent infill in hybrid tree support
ArthurBambulab Dec 3, 2024
ee1bd70
FIX: merge support interfaces into a continuous large one
ArthurBambulab Dec 4, 2024
ed9ba7d
FIX: sharp tail miss detection
ArthurBambulab Dec 6, 2024
d41c0a8
FIX: top z distance disappears in some cases
ArthurBambulab Dec 11, 2024
393e2f4
FIX: fix the bug of missing layers in SlimTree and HybridTree
Dec 18, 2024
dc3938e
ENH: reduce organic tree support log level
ArthurBambulab Dec 20, 2024
9813529
Fix compile error
Noisyfox Jan 27, 2025
a3ac1fc
Fix error "Coordinate outside allowed range"
Noisyfox Jan 27, 2025
279b3de
libslic3r: Fix BOOST_LOG_TRIVIAL declaration
hadess Oct 28, 2024
0187e1b
libslic3r: Fix missing BOOST_LOG_TRIVIAL declaration
hadess Mar 27, 2024
32547c8
Update header file to match the impl
Noisyfox Feb 9, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions localization/i18n/zh_CN/OrcaSlicer_zh_CN.po
Original file line number Diff line number Diff line change
Expand Up @@ -7315,11 +7315,11 @@ msgstr ""
msgid ""
"When using support material for the support interface, We recommend the "
"following settings:\n"
"0 top z distance, 0 interface spacing, concentric pattern and disable "
"0 top z distance, 0 interface spacing, interlaced rectilinear pattern and disable "
"independent support layer height"
msgstr ""
"当使用支持界面的支持材料时,我们推荐以下设置:\n"
"0顶层z距离,0接触层间距,同心图案,并且禁用独立支撑层高"
"0顶层z距离,0接触层间距,交叠直线图案,并且禁用独立支撑层高"

msgid ""
"Enabling this option will modify the model's shape. If your print requires "
Expand Down
8 changes: 4 additions & 4 deletions src/libslic3r/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -309,16 +309,16 @@ set(lisbslic3r_sources
Support/SupportLayer.hpp
Support/SupportMaterial.cpp
Support/SupportMaterial.hpp
Support/SupportParameters.hpp
Support/SupportSpotsGenerator.cpp
Support/SupportSpotsGenerator.hpp
Support/TreeSupport.hpp
Support/TreeSupport.cpp
Support/TreeSupport3D.cpp
Support/TreeSupport3D.hpp
Support/TreeSupportCommon.hpp
Support/TreeModelVolumes.cpp
Support/TreeSupport3D.cpp
Support/TreeModelVolumes.hpp
Support/TreeModelVolumes.cpp
Support/TreeSupportCommon.hpp
Support/SupportParameters.hpp
PrincipalComponents2D.cpp
PrincipalComponents2D.hpp
MinimumSpanningTree.hpp
Expand Down
6 changes: 6 additions & 0 deletions src/libslic3r/ClipperUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -664,6 +664,12 @@ Slic3r::Polygons diff(const Slic3r::Polygons &subject, const Slic3r::Polygons &c
{ return _clipper(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::PolygonsProvider(clip), do_safety_offset); }
Slic3r::Polygons diff_clipped(const Slic3r::Polygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset)
{ return diff(subject, ClipperUtils::clip_clipper_polygons_with_subject_bbox(clip, get_extents(subject).inflated(SCALED_EPSILON)), do_safety_offset); }
Slic3r::ExPolygons diff_clipped(const Slic3r::ExPolygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset)
{ return diff_ex(subject, ClipperUtils::clip_clipper_polygons_with_subject_bbox(clip, get_extents(subject).inflated(SCALED_EPSILON)), do_safety_offset); }
Slic3r::ExPolygons diff_clipped(const Slic3r::ExPolygons & subject, const Slic3r::ExPolygons & clip, ApplySafetyOffset do_safety_offset)
{
return diff_ex(subject, ClipperUtils::clip_clipper_polygons_with_subject_bbox(clip, get_extents(subject).inflated(SCALED_EPSILON)), do_safety_offset);
}
Slic3r::Polygons diff(const Slic3r::Polygons &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset)
{ return _clipper(ClipperLib::ctDifference, ClipperUtils::PolygonsProvider(subject), ClipperUtils::ExPolygonsProvider(clip), do_safety_offset); }
Slic3r::Polygons diff(const Slic3r::ExPolygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset)
Expand Down
2 changes: 2 additions & 0 deletions src/libslic3r/ClipperUtils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -433,6 +433,8 @@ Slic3r::Polygons diff(const Slic3r::Polygons &subject, const Slic3r::ExPolygon
// Optimized version clipping the "clipping" polygon using clip_clipper_polygon_with_subject_bbox().
// To be used with complex clipping polygons, where majority of the clipping polygons are outside of the source polygon.
Slic3r::Polygons diff_clipped(const Slic3r::Polygons &src, const Slic3r::Polygons &clipping, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No);
Slic3r::ExPolygons diff_clipped(const Slic3r::ExPolygons &src, const Slic3r::Polygons &clipping, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No);
Slic3r::ExPolygons diff_clipped(const Slic3r::ExPolygons &src, const Slic3r::ExPolygons &clipping, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No);
Slic3r::Polygons diff(const Slic3r::ExPolygons &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No);
Slic3r::Polygons diff(const Slic3r::ExPolygons &subject, const Slic3r::ExPolygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No);
Slic3r::Polygons diff(const Slic3r::Surfaces &subject, const Slic3r::Polygons &clip, ApplySafetyOffset do_safety_offset = ApplySafetyOffset::No);
Expand Down
2 changes: 1 addition & 1 deletion src/libslic3r/Fill/FillBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ Fill* Fill::new_from_type(const InfillPattern type)
case ipOctagramSpiral: return new FillOctagramSpiral();
case ipAdaptiveCubic: return new FillAdaptive::Filler();
case ipSupportCubic: return new FillAdaptive::Filler();
case ipSupportBase: return new FillSupportBase();
case ipSupportBase: return new FillSupportBase(); // simply line fill
case ipLightning: return new FillLightning::Filler();
// BBS: for internal solid infill only
case ipConcentricInternal: return new FillConcentricInternal();
Expand Down
17 changes: 13 additions & 4 deletions src/libslic3r/GCode.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1202,14 +1202,23 @@ std::vector<GCode::LayerToPrint> GCode::collect_layers_to_print(const PrintObjec
// Allow empty support layers, as the support generator may produce no extrusions for non-empty support regions.
|| (layer_to_print.support_layer /* && layer_to_print.support_layer->has_extrusions() */)) {
double top_cd = object.config().support_top_z_distance;
double bottom_cd = object.config().support_bottom_z_distance;

double bottom_cd = object.config().support_bottom_z_distance == 0. ? top_cd : object.config().support_bottom_z_distance;
//if (!object.print()->config().independent_support_layer_height)
{ // the actual support gap may be larger than the configured one due to rounding to layer height for organic support, regardless of independent support layer height
top_cd = std::ceil(top_cd / object.config().layer_height) * object.config().layer_height;
bottom_cd = std::ceil(bottom_cd / object.config().layer_height) * object.config().layer_height;
}
double extra_gap = (layer_to_print.support_layer ? bottom_cd : top_cd);

// raft contact distance should not trigger any warning
if(last_extrusion_layer && last_extrusion_layer->support_layer)
if (last_extrusion_layer && last_extrusion_layer->support_layer) {
double raft_gap = object.config().raft_contact_distance.value;
//if (!object.print()->config().independent_support_layer_height)
{
raft_gap = std::ceil(raft_gap / object.config().layer_height) * object.config().layer_height;
}
extra_gap = std::max(extra_gap, object.config().raft_contact_distance.value);

}
double maximal_print_z = (last_extrusion_layer ? last_extrusion_layer->print_z() : 0.)
+ layer_to_print.layer()->height
+ std::max(0., extra_gap);
Expand Down
9 changes: 4 additions & 5 deletions src/libslic3r/Layer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ class Layer
// BBS
mutable ExPolygons sharp_tails;
mutable ExPolygons cantilevers;
mutable std::map<const ExPolygon*, float> sharp_tails_height;
mutable std::vector<float> sharp_tails_height;

// Collection of expolygons generated by slicing the possibly multiple meshes of the source geometry
// (with possibly differing extruder ID and slicing parameters) and merged.
Expand All @@ -150,6 +150,7 @@ class Layer
// These lslices are also used to detect overhangs and overlaps between successive layers, therefore it is important
// that the 1st lslice is not compensated by the Elephant foot compensation algorithm.
ExPolygons lslices;
ExPolygons lslices_extrudable; // BBS: the extrudable part of lslices used for tree support
std::vector<BoundingBox> lslices_bboxes;

// BBS
Expand Down Expand Up @@ -274,11 +275,10 @@ class SupportLayer : public Layer
ExPolygons support_islands;
// Extrusion paths for the support base and for the support interface and contacts.
ExtrusionEntityCollection support_fills;
SupportInnerType support_type = stInnerNormal;
SupportInnerType support_type = stInnerNormal;

// for tree supports
ExPolygons base_areas;
ExPolygons overhang_areas;


// Is there any valid extrusion assigned to this LayerRegion?
Expand Down Expand Up @@ -311,14 +311,13 @@ class SupportLayer : public Layer
{
ExPolygon *area;
int type;
int interface_id = 0;
coordf_t dist_to_top; // mm dist to top
bool need_infill = false;
bool need_extra_wall = false;
AreaGroup(ExPolygon *a, int t, coordf_t d) : area(a), type(t), dist_to_top(d) {}
};
enum OverhangType { Detected = 0, Enforced };
std::vector<AreaGroup> area_groups;
std::map<const ExPolygon *, OverhangType> overhang_types;
};

template<typename LayerContainer>
Expand Down
4 changes: 2 additions & 2 deletions src/libslic3r/MultiMaterialSegmentation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1363,7 +1363,7 @@ static inline std::vector<std::vector<ExPolygons>> mmu_segmentation_top_and_bott
if (!zs.empty() && is_volume_sinking(painted, volume_trafo)) {
std::vector<float> zs_sinking = {0.f};
Slic3r::append(zs_sinking, zs);
slice_mesh_slabs(painted, zs_sinking, volume_trafo, max_top_layers > 0 ? &top : nullptr, max_bottom_layers > 0 ? &bottom : nullptr, throw_on_cancel_callback);
slice_mesh_slabs(painted, zs_sinking, volume_trafo, max_top_layers > 0 ? &top : nullptr, max_bottom_layers > 0 ? &bottom : nullptr, nullptr, throw_on_cancel_callback);

MeshSlicingParams slicing_params;
slicing_params.trafo = volume_trafo;
Expand All @@ -1374,7 +1374,7 @@ static inline std::vector<std::vector<ExPolygons>> mmu_segmentation_top_and_bott

bottom[0] = union_(bottom[0], bottom_slice);
} else
slice_mesh_slabs(painted, zs, volume_trafo, max_top_layers > 0 ? &top : nullptr, max_bottom_layers > 0 ? &bottom : nullptr, throw_on_cancel_callback);
slice_mesh_slabs(painted, zs, volume_trafo, max_top_layers > 0 ? &top : nullptr, max_bottom_layers > 0 ? &bottom : nullptr, nullptr, throw_on_cancel_callback);
auto merge = [](std::vector<Polygons> &&src, std::vector<Polygons> &dst) {
auto it_src = find_if(src.begin(), src.end(), [](const Polygons &p){ return ! p.empty(); });
if (it_src != src.end()) {
Expand Down
4 changes: 2 additions & 2 deletions src/libslic3r/Preset.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -792,7 +792,7 @@ static std::vector<std::string> s_Preset_print_options {
"fuzzy_skin", "fuzzy_skin_thickness", "fuzzy_skin_point_distance", "fuzzy_skin_first_layer", "fuzzy_skin_noise_type", "fuzzy_skin_scale", "fuzzy_skin_octaves", "fuzzy_skin_persistence",
"max_volumetric_extrusion_rate_slope", "max_volumetric_extrusion_rate_slope_segment_length","extrusion_rate_smoothing_external_perimeter_only",
"inner_wall_speed", "outer_wall_speed", "sparse_infill_speed", "internal_solid_infill_speed",
"top_surface_speed", "support_speed", "support_object_xy_distance", "support_interface_speed",
"top_surface_speed", "support_speed", "support_object_xy_distance", "support_object_first_layer_gap", "support_interface_speed",
"bridge_speed", "internal_bridge_speed", "gap_infill_speed", "travel_speed", "travel_speed_z", "initial_layer_speed",
"outer_wall_acceleration", "initial_layer_acceleration", "top_surface_acceleration", "default_acceleration", "skirt_type", "skirt_loops", "skirt_speed","min_skirt_length", "skirt_distance", "skirt_start_angle", "skirt_height", "draft_shield",
"brim_width", "brim_object_gap", "brim_type", "brim_ears_max_angle", "brim_ears_detection_length", "enable_support", "support_type", "support_threshold_angle", "support_threshold_overlap","enforce_support_layers",
Expand All @@ -812,7 +812,7 @@ static std::vector<std::string> s_Preset_print_options {
"wipe_tower_no_sparse_layers", "compatible_printers", "compatible_printers_condition", "inherits",
"flush_into_infill", "flush_into_objects", "flush_into_support",
"tree_support_branch_angle", "tree_support_angle_slow", "tree_support_wall_count", "tree_support_top_rate", "tree_support_branch_distance", "tree_support_tip_diameter",
"tree_support_branch_diameter", "tree_support_branch_diameter_angle", "tree_support_branch_diameter_double_wall",
"tree_support_branch_diameter", "tree_support_branch_diameter_angle",
"detect_narrow_internal_solid_infill",
"gcode_add_line_number", "enable_arc_fitting", "precise_z_height", "infill_combination","infill_combination_max_layer_height", /*"adaptive_layer_height",*/
"support_bottom_interface_spacing", "enable_overhang_speed", "slowdown_for_curled_perimeters", "overhang_1_4_speed", "overhang_2_4_speed", "overhang_3_4_speed", "overhang_4_4_speed",
Expand Down
4 changes: 2 additions & 2 deletions src/libslic3r/Print.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1166,7 +1166,7 @@ StringObjectException Print::validate(StringObjectException *warning, Polygons*
// Custom layering is not allowed for tree supports as of now.
for (size_t print_object_idx = 0; print_object_idx < m_objects.size(); ++ print_object_idx)
if (const PrintObject &print_object = *m_objects[print_object_idx];
print_object.has_support_material() && is_tree(print_object.config().support_type.value) && (print_object.config().support_style.value == smsOrganic ||
print_object.has_support_material() && is_tree(print_object.config().support_type.value) && (print_object.config().support_style.value == smsTreeOrganic ||
// Orca: use organic as default
print_object.config().support_style.value == smsDefault) &&
print_object.model_object()->has_custom_layering()) {
Expand Down Expand Up @@ -1339,7 +1339,7 @@ StringObjectException Print::validate(StringObjectException *warning, Polygons*

// Prusa: Fixing crashes with invalid tip diameter or branch diameter
// https://github.com/prusa3d/PrusaSlicer/commit/96b3ae85013ac363cd1c3e98ec6b7938aeacf46d
if (is_tree(object->config().support_type.value) && (object->config().support_style == smsOrganic ||
if (is_tree(object->config().support_type.value) && (object->config().support_style == smsTreeOrganic ||
// Orca: use organic as default
object->config().support_style == smsDefault)) {
float extrusion_width = std::min(
Expand Down
4 changes: 2 additions & 2 deletions src/libslic3r/Print.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -385,7 +385,7 @@ class PrintObject : public PrintObjectBaseWithState<Print, PrintObjectStep, posC

size_t support_layer_count() const { return m_support_layers.size(); }
void clear_support_layers();
SupportLayer* get_support_layer(int idx) { return m_support_layers[idx]; }
SupportLayer* get_support_layer(int idx) { return idx<m_support_layers.size()? m_support_layers[idx]:nullptr; }
const SupportLayer* get_support_layer_at_printz(coordf_t print_z, coordf_t epsilon) const;
SupportLayer* get_support_layer_at_printz(coordf_t print_z, coordf_t epsilon);
SupportLayer* add_support_layer(int id, int interface_id, coordf_t height, coordf_t print_z);
Expand Down Expand Up @@ -427,7 +427,7 @@ class PrintObject : public PrintObjectBaseWithState<Print, PrintObjectStep, posC
std::vector<Polygons> slice_support_enforcers() const { return this->slice_support_volumes(ModelVolumeType::SUPPORT_ENFORCER); }

// Helpers to project custom facets on slices
void project_and_append_custom_facets(bool seam, EnforcerBlockerType type, std::vector<Polygons>& expolys) const;
void project_and_append_custom_facets(bool seam, EnforcerBlockerType type, std::vector<Polygons>& expolys, std::vector<std::pair<Vec3f,Vec3f>>* vertical_points=nullptr) const;

//BBS
BoundingBox get_first_layer_bbox(float& area, float& layer_height, std::string& name);
Expand Down
Loading