FIX: fitst layer bbox was wrong for multiple plates
brim bounding box is now shifted w.r.t. plate origin, need to modify the no-brim shift the same way. Change-Id: Iefa7287e2848aadbfc4a468bca394ecec48a1e7c
This commit is contained in:
parent
4640cf9a1a
commit
0cad88309c
|
@ -2790,8 +2790,6 @@ int CLI::run(int argc, char **argv)
|
|||
BBoxData data;
|
||||
auto bb_scaled = obj->get_first_layer_bbox(data.area, data.layer_height, data.name);
|
||||
auto bb = unscaled(bb_scaled);
|
||||
bb.min -= orig2d;
|
||||
bb.max -= orig2d;
|
||||
bbox_all.merge(bb);
|
||||
data.area *= (SCALING_FACTOR * SCALING_FACTOR); // unscale area
|
||||
data.id = obj->id().id;
|
||||
|
|
|
@ -23,19 +23,11 @@
|
|||
|
||||
namespace Slic3r {
|
||||
|
||||
//BBS: instance_shift is too large because of multi-plate, apply without plate offset.
|
||||
static Point instance_shift_without_plate_offset(const PrintInstance& instance)
|
||||
{
|
||||
const Print* print = instance.print_object->print();
|
||||
const Vec3d plate_offset = print->get_plate_origin();
|
||||
return instance.shift - Point(scaled(plate_offset.x()), scaled(plate_offset.y()));
|
||||
}
|
||||
|
||||
static void append_and_translate(ExPolygons &dst, const ExPolygons &src, const PrintInstance &instance) {
|
||||
size_t dst_idx = dst.size();
|
||||
expolygons_append(dst, src);
|
||||
|
||||
Point instance_shift = instance_shift_without_plate_offset(instance);
|
||||
Point instance_shift = instance.shift_without_plate_offset();
|
||||
for (; dst_idx < dst.size(); ++dst_idx)
|
||||
dst[dst_idx].translate(instance_shift);
|
||||
}
|
||||
|
@ -43,7 +35,7 @@ static void append_and_translate(ExPolygons &dst, const ExPolygons &src, const P
|
|||
static void append_and_translate(ExPolygons& dst, const ExPolygons& src,
|
||||
const PrintInstance& instance, const Print& print, std::map<ObjectID, ExPolygons>& brimAreaMap) {
|
||||
ExPolygons srcShifted = src;
|
||||
Point instance_shift = instance_shift_without_plate_offset(instance);
|
||||
Point instance_shift = instance.shift_without_plate_offset();
|
||||
for (size_t src_idx = 0; src_idx < srcShifted.size(); ++src_idx)
|
||||
srcShifted[src_idx].translate(instance_shift);
|
||||
srcShifted = diff_ex(srcShifted, dst);
|
||||
|
@ -54,7 +46,7 @@ static void append_and_translate(ExPolygons& dst, const ExPolygons& src,
|
|||
static void append_and_translate(Polygons &dst, const Polygons &src, const PrintInstance &instance) {
|
||||
size_t dst_idx = dst.size();
|
||||
polygons_append(dst, src);
|
||||
Point instance_shift = instance_shift_without_plate_offset(instance);
|
||||
Point instance_shift = instance.shift_without_plate_offset();
|
||||
for (; dst_idx < dst.size(); ++dst_idx)
|
||||
dst[dst_idx].translate(instance_shift);
|
||||
}
|
||||
|
@ -102,7 +94,7 @@ static ConstPrintObjectPtrs get_top_level_objects_with_brim(const Print &print,
|
|||
|
||||
islands.reserve(islands.size() + object->instances().size() * islands_object.size());
|
||||
for (const PrintInstance& instance : object->instances()) {
|
||||
Point instance_shift = instance_shift_without_plate_offset(instance);
|
||||
Point instance_shift = instance.shift_without_plate_offset();
|
||||
for (Polygon& poly : islands_object) {
|
||||
islands.emplace_back(poly);
|
||||
islands.back().translate(instance_shift);
|
||||
|
@ -1236,7 +1228,7 @@ static void make_inner_island_brim(const Print& print, const ConstPrintObjectPtr
|
|||
for (const PrintInstance& instance : object->instances()) {
|
||||
size_t dst_idx = final_loops.size();
|
||||
final_loops.insert(final_loops.end(), all_loops_object.begin(), all_loops_object.end());
|
||||
Point instance_shift = instance_shift_without_plate_offset(instance);
|
||||
Point instance_shift = instance.shift_without_plate_offset();
|
||||
for (; dst_idx < final_loops.size(); ++dst_idx)
|
||||
final_loops[dst_idx].translate(instance_shift);
|
||||
|
||||
|
@ -1608,14 +1600,14 @@ void make_brim(const Print& print, PrintTryCancel try_cancel, Polygons& islands_
|
|||
for (const ExPolygon& ex_poly : object->layers().front()->lslices)
|
||||
for (const PrintInstance& instance : object->instances()) {
|
||||
auto ex_poly_translated = ex_poly;
|
||||
ex_poly_translated.translate(instance_shift_without_plate_offset(instance));
|
||||
ex_poly_translated.translate(instance.shift_without_plate_offset());
|
||||
bbx.merge(get_extents(ex_poly_translated.contour));
|
||||
}
|
||||
if (!object->support_layers().empty())
|
||||
for (const Polygon& support_contour : object->support_layers().front()->support_fills.polygons_covered_by_spacing())
|
||||
for (const PrintInstance& instance : object->instances()) {
|
||||
auto ex_poly_translated = support_contour;
|
||||
ex_poly_translated.translate(instance_shift_without_plate_offset(instance));
|
||||
ex_poly_translated.translate(instance.shift_without_plate_offset());
|
||||
bbx.merge(get_extents(ex_poly_translated));
|
||||
}
|
||||
if (supportBrimAreaMap.find(printObjID) != supportBrimAreaMap.end()) {
|
||||
|
|
|
@ -1392,7 +1392,7 @@ BoundingBox PrintObject::get_first_layer_bbox(float& a, float& layer_height, std
|
|||
auto layer = get_layer(0);
|
||||
layer_height = layer->height;
|
||||
// only work for object with single instance
|
||||
auto shift = instances()[0].shift;
|
||||
auto shift = instances()[0].shift_without_plate_offset();
|
||||
for (auto bb : layer->lslices_bboxes)
|
||||
{
|
||||
bb.translate(shift.x(), shift.y());
|
||||
|
@ -3520,4 +3520,12 @@ Polygon PrintInstance::get_convex_hull_2d() {
|
|||
return poly;
|
||||
}
|
||||
|
||||
//BBS: instance_shift is too large because of multi-plate, apply without plate offset.
|
||||
Point PrintInstance::shift_without_plate_offset() const
|
||||
{
|
||||
const Print* print = print_object->print();
|
||||
const Vec3d plate_offset = print->get_plate_origin();
|
||||
return shift - Point(scaled(plate_offset.x()), scaled(plate_offset.y()));
|
||||
}
|
||||
|
||||
} // namespace Slic3r
|
||||
|
|
|
@ -201,6 +201,9 @@ struct PrintInstance
|
|||
//
|
||||
// instance id
|
||||
size_t id;
|
||||
|
||||
//BBS: instance_shift is too large because of multi-plate, apply without plate offset.
|
||||
Point shift_without_plate_offset() const;
|
||||
};
|
||||
|
||||
typedef std::vector<PrintInstance> PrintInstances;
|
||||
|
|
|
@ -6658,8 +6658,6 @@ PlateBBoxData Plater::priv::generate_first_layer_bbox()
|
|||
{
|
||||
auto bb_scaled = obj->get_first_layer_bbox(data.area, data.layer_height, data.name);
|
||||
auto bb = unscaled(bb_scaled);
|
||||
bb.min -= orig2d;
|
||||
bb.max -= orig2d;
|
||||
bbox_all.merge(bb);
|
||||
data.area *= (SCALING_FACTOR * SCALING_FACTOR); // unscale area
|
||||
data.id = obj->id().id;
|
||||
|
|
Loading…
Reference in New Issue