diff --git a/src/libslic3r/BuildVolume.cpp b/src/libslic3r/BuildVolume.cpp index 894b892..0915de1 100644 --- a/src/libslic3r/BuildVolume.cpp +++ b/src/libslic3r/BuildVolume.cpp @@ -389,24 +389,29 @@ BuildVolume::ObjectState BuildVolume::volume_state_bbox(const BoundingBoxf3 volu BuildVolume::ObjectState BuildVolume::check_outside(Polygon hull) const { //y21 - const Vec3d bed_offset = s_multiple_beds.get_bed_translation(s_multiple_beds.get_active_bed()); - if (m_exclude_bed_shape.size() > 0) { - for (int i = 1; i < m_exclude_bed_shape.size(); i += 7) { - std::vector tem_exclude_bed_shap; - for (int j = 1; j < 6; j++) - tem_exclude_bed_shap.push_back(Vec2d{ m_exclude_bed_shape[i + j].x()+ bed_offset.x(), m_exclude_bed_shape[i + j].y()+ bed_offset.y()}); - BoundingBoxf tem_bboxf = get_extents(tem_exclude_bed_shap); - auto tem_exclude_bboxf = BoundingBoxf3{to_3d(tem_bboxf.min, 0.), to_3d(tem_bboxf.max, m_max_print_height)}; - Slic3r::Polygon p = tem_exclude_bboxf.polygon(true); // instance convex hull is scaled, so we need to scale here - if (intersection({p}, {hull}).empty() == false) { - return ObjectState::Colliding; - break; - } + int beds_num = s_multiple_beds.get_number_of_beds(); + for (int i = 0; i < beds_num; i++) + { + const Vec3d bed_offset = s_multiple_beds.get_bed_translation(i); + if (m_exclude_bed_shape.size() > 0) { + for (int i = 1; i < m_exclude_bed_shape.size(); i += 7) { + std::vector tem_exclude_bed_shap; + for (int j = 1; j < 6; j++) + tem_exclude_bed_shap.push_back(Vec2d{ m_exclude_bed_shape[i + j].x() + bed_offset.x(), m_exclude_bed_shape[i + j].y() + bed_offset.y() }); + BoundingBoxf tem_bboxf = get_extents(tem_exclude_bed_shap); + auto tem_exclude_bboxf = BoundingBoxf3{ to_3d(tem_bboxf.min, 0.), to_3d(tem_bboxf.max, m_max_print_height) }; + Slic3r::Polygon p = tem_exclude_bboxf.polygon(true); // instance convex hull is scaled, so we need to scale here + if (intersection({ p }, { hull }).empty() == false) { + return ObjectState::Colliding; + break; + } } - return ObjectState::Inside; - } else { - return ObjectState::Inside; + } + else { + return ObjectState::Inside; + } } + return ObjectState::Inside; } //B52 diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp index 4a116f3..46ad4ef 100644 --- a/src/libslic3r/Model.hpp +++ b/src/libslic3r/Model.hpp @@ -384,6 +384,9 @@ public: // Whether or not this object is printable bool printable { true }; + //y21 + bool in_exclude{ false }; + // This vector holds position of selected support points for SLA. The data are // saved in mesh coordinates to allow using them for several instances. // The format is (x, y, z, point_size, supports_island) diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp index 3acec38..0b46850 100644 --- a/src/slic3r/GUI/GLCanvas3D.cpp +++ b/src/slic3r/GUI/GLCanvas3D.cpp @@ -1544,21 +1544,22 @@ bool GLCanvas3D::check_volumes_outside_state(GLVolumeCollection& volumes, ModelI state = BuildVolume::ObjectState::Below; else { switch (build_volume.type()) { - // B66 case BuildVolume::Type::Rectangle: //FIXME this test does not evaluate collision of a build volume bounding box with non-convex objects. state = build_volume.volume_state_bbox(volume_bbox(*volume), true, &bed_idx); + // B66 //y21 if (state == BuildVolume::ObjectState::Inside) { - for (size_t i = 0; i < m_model->objects.size(); ++i) { - ModelObject * object = m_model->objects[i]; - ModelInstance *instance = object->instances[0]; - Polygon hull = instance->convex_hull_2d(); - - state = build_volume.check_outside(hull); - if (state != BuildVolume::ObjectState::Inside) { - break; - } + int obj_idx = volume->object_idx(); + ModelObjectPtrs model_parts = wxGetApp().model().objects; + ModelObject* model_obj = model_parts[obj_idx]; + ModelInstance* instance = model_obj->instances[0]; + Polygon hull = instance->convex_hull_2d(); + state = build_volume.check_outside(hull); + if (state != BuildVolume::ObjectState::Inside) { + model_obj->in_exclude = true; } + else + model_obj->in_exclude = false; } break; case BuildVolume::Type::Circle: diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index d3556d6..e1cbe04 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -1895,11 +1895,12 @@ void Plater::priv::object_list_changed() for (const ModelObject *object : wxGetApp().model().objects) { for (const ModelInstance *instance : object->instances) { const auto it{s_multiple_beds.get_inst_map().find(instance->id())}; + //y21 if ( - it != s_multiple_beds.get_inst_map().end() + (it != s_multiple_beds.get_inst_map().end() && it->second == bed_index && instance->printable - && instance->print_volume_state == ModelInstancePVS_Partly_Outside + && instance->print_volume_state == ModelInstancePVS_Partly_Outside) || (object->in_exclude) ) { s_print_statuses[bed_index] = PrintStatus::outside; break;