mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-23 06:33:57 -06:00
FIX: auto-arrange may crash due to clipper
1. Use nlopt and clipper offset togather seems not stable, very easy to crash. We do the offset outside nlopt now. 2. Fix a bug with finalAlign where objects may be translated to overlap with excluded region. 3. change the words of support_expansion Change-Id: I22e37b20e4ae16f47bde206de90845616e4cefad (cherry picked from commit 1c26e5d2862fd3f3292971b5c749420bfb2cdf0e)
This commit is contained in:
parent
95ed039879
commit
4eba8a2a2d
6 changed files with 47 additions and 55 deletions
|
@ -1034,51 +1034,50 @@ private:
|
|||
if (!item.is_virt_object)
|
||||
bb = sl::boundingBox(item.boundingBox(), bb);
|
||||
|
||||
// BBS TODO assume the nonprefered regions are at the bottom left corner
|
||||
Box bin_reduced = bbin;
|
||||
for (const auto& region : config_.m_nonprefered_regions)
|
||||
{
|
||||
Box bb1 = region.boundingBox();
|
||||
if (bb1.maxCorner().y()<bbin.height()/5 &&
|
||||
bbin.height() - bb1.maxCorner().y() > bb.height() && bb.height()>bbin.height()-2*bb1.maxCorner().y()) {
|
||||
// could use a tighter bound by moving bed center higher
|
||||
bin_reduced.minCorner().y() = bb1.maxCorner().y();
|
||||
continue;
|
||||
}
|
||||
if (bb1.maxCorner().x()<bbin.width()/5 &&
|
||||
bbin.width() - bb1.maxCorner().x() > bb.width() && bb.width()>bbin.width()-2*bb1.maxCorner().x()) {
|
||||
// could use a tighter bound
|
||||
bin_reduced.minCorner().x() = bb1.maxCorner().x();
|
||||
continue;
|
||||
// if move to center is infeasible, move to topright corner instead
|
||||
auto alignment = config_.alignment;
|
||||
if (!config_.m_excluded_regions.empty() && alignment== Config::Alignment::CENTER) {
|
||||
Box bb2 = bb;
|
||||
auto d = bbin.center() - bb2.center();
|
||||
d.x() = std::max(d.x(), 0);
|
||||
d.y() = std::max(d.y(), 0);
|
||||
bb2.minCorner() += d;
|
||||
bb2.maxCorner() += d;
|
||||
for (auto& region : config_.m_excluded_regions) {
|
||||
auto region_bb = region.boundingBox();
|
||||
if (bb2.intersection(region_bb).area()>0) {
|
||||
alignment = Config::Alignment::TOP_RIGHT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Vertex ci, cb;
|
||||
|
||||
switch(config_.alignment) {
|
||||
switch(alignment) {
|
||||
case Config::Alignment::CENTER: {
|
||||
ci = bb.center();
|
||||
cb = bin_reduced.center();
|
||||
cb = bbin.center();
|
||||
break;
|
||||
}
|
||||
case Config::Alignment::BOTTOM_LEFT: {
|
||||
ci = bb.minCorner();
|
||||
cb = bin_reduced.minCorner();
|
||||
cb = bbin.minCorner();
|
||||
break;
|
||||
}
|
||||
case Config::Alignment::BOTTOM_RIGHT: {
|
||||
ci = {getX(bb.maxCorner()), getY(bb.minCorner())};
|
||||
cb = {getX(bin_reduced.maxCorner()), getY(bin_reduced.minCorner())};
|
||||
cb = {getX(bbin.maxCorner()), getY(bbin.minCorner())};
|
||||
break;
|
||||
}
|
||||
case Config::Alignment::TOP_LEFT: {
|
||||
ci = {getX(bb.minCorner()), getY(bb.maxCorner())};
|
||||
cb = {getX(bin_reduced.minCorner()), getY(bin_reduced.maxCorner())};
|
||||
cb = {getX(bbin.minCorner()), getY(bbin.maxCorner())};
|
||||
break;
|
||||
}
|
||||
case Config::Alignment::TOP_RIGHT: {
|
||||
ci = bb.maxCorner();
|
||||
cb = bin_reduced.maxCorner();
|
||||
cb = bbin.maxCorner();
|
||||
break;
|
||||
}
|
||||
default: ; // DONT_ALIGN
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue