mirror of
https://github.com/SoftFever/OrcaSlicer.git
synced 2025-07-07 23:17:35 -06:00
NEW: add align_to_y_axis option for auto-arrange
1. Add align_to_y_axis option for auto-arrange. This is useful for auto-arranging of i3 type printers. 2. Change default value of align_to_origin to true when switching from non-i3 printers to i3 printers. JIRA: STUDIO-2583 Change-Id: I7dabab846022a0da030a9fec060a60a4207537a0
This commit is contained in:
parent
e789489ed9
commit
7beed5d6dd
8 changed files with 142 additions and 6 deletions
|
@ -134,6 +134,97 @@ void update_unselected_items_inflation(ArrangePolygons& unselected, const Dynami
|
|||
: (ap.is_extrusion_cali_object ? 0 : scaled_exclusion_gap); });
|
||||
}
|
||||
|
||||
void update_selected_items_axis_align(ArrangePolygons& selected, const DynamicPrintConfig* print_cfg, const ArrangeParams& params)
|
||||
{
|
||||
// now only need to consider "Align to x axis"
|
||||
if (!params.align_to_y_axis)
|
||||
return;
|
||||
|
||||
for (ArrangePolygon& ap : selected) {
|
||||
bool validResult = false;
|
||||
double angle = 0.0;
|
||||
{
|
||||
const auto& pts = ap.transformed_poly().contour;
|
||||
int lpt = pts.size();
|
||||
double a00 = 0, a10 = 0, a01 = 0, a20 = 0, a11 = 0, a02 = 0, a30 = 0, a21 = 0, a12 = 0, a03 = 0;
|
||||
double xi, yi, xi2, yi2, xi_1, yi_1, xi_12, yi_12, dxy, xii_1, yii_1;
|
||||
xi_1 = pts.back().x();
|
||||
yi_1 = pts.back().y();
|
||||
|
||||
xi_12 = xi_1 * xi_1;
|
||||
yi_12 = yi_1 * yi_1;
|
||||
|
||||
for (int i = 0; i < lpt; i++) {
|
||||
xi = pts[i].x();
|
||||
yi = pts[i].y();
|
||||
|
||||
xi2 = xi * xi;
|
||||
yi2 = yi * yi;
|
||||
dxy = xi_1 * yi - xi * yi_1;
|
||||
xii_1 = xi_1 + xi;
|
||||
yii_1 = yi_1 + yi;
|
||||
|
||||
a00 += dxy;
|
||||
a10 += dxy * xii_1;
|
||||
a01 += dxy * yii_1;
|
||||
a20 += dxy * (xi_1 * xii_1 + xi2);
|
||||
a11 += dxy * (xi_1 * (yii_1 + yi_1) + xi * (yii_1 + yi));
|
||||
a02 += dxy * (yi_1 * yii_1 + yi2);
|
||||
a30 += dxy * xii_1 * (xi_12 + xi2);
|
||||
a03 += dxy * yii_1 * (yi_12 + yi2);
|
||||
a21 += dxy * (xi_12 * (3 * yi_1 + yi) + 2 * xi * xi_1 * yii_1 + xi2 * (yi_1 + 3 * yi));
|
||||
a12 += dxy * (yi_12 * (3 * xi_1 + xi) + 2 * yi * yi_1 * xii_1 + yi2 * (xi_1 + 3 * xi));
|
||||
xi_1 = xi;
|
||||
yi_1 = yi;
|
||||
xi_12 = xi2;
|
||||
yi_12 = yi2;
|
||||
}
|
||||
|
||||
if (std::abs(a00) > EPSILON) {
|
||||
double db1_2, db1_6, db1_12, db1_24, db1_20, db1_60;
|
||||
double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03;
|
||||
if (a00 > 0) {
|
||||
db1_2 = 0.5;
|
||||
db1_6 = 0.16666666666666666666666666666667;
|
||||
db1_12 = 0.083333333333333333333333333333333;
|
||||
db1_24 = 0.041666666666666666666666666666667;
|
||||
db1_20 = 0.05;
|
||||
db1_60 = 0.016666666666666666666666666666667;
|
||||
}
|
||||
else {
|
||||
db1_2 = -0.5;
|
||||
db1_6 = -0.16666666666666666666666666666667;
|
||||
db1_12 = -0.083333333333333333333333333333333;
|
||||
db1_24 = -0.041666666666666666666666666666667;
|
||||
db1_20 = -0.05;
|
||||
db1_60 = -0.016666666666666666666666666666667;
|
||||
}
|
||||
m00 = a00 * db1_2;
|
||||
m10 = a10 * db1_6;
|
||||
m01 = a01 * db1_6;
|
||||
m20 = a20 * db1_12;
|
||||
m11 = a11 * db1_24;
|
||||
m02 = a02 * db1_12;
|
||||
m30 = a30 * db1_20;
|
||||
m21 = a21 * db1_60;
|
||||
m12 = a12 * db1_60;
|
||||
m03 = a03 * db1_20;
|
||||
|
||||
double cx = m10 / m00;
|
||||
double cy = m01 / m00;
|
||||
|
||||
double a = m20 / m00 - cx * cx;
|
||||
double b = m11 / m00 - cx * cy;
|
||||
double c = m02 / m00 - cy * cy;
|
||||
|
||||
angle = std::atan2(2 * b, (a - c)) / 2;
|
||||
validResult = true;
|
||||
}
|
||||
}
|
||||
if (validResult) { ap.rotation += (PI / 2 - angle); }
|
||||
}
|
||||
}
|
||||
|
||||
//it will bed accurate after call update_params
|
||||
Points get_shrink_bedpts(const DynamicPrintConfig* print_cfg, const ArrangeParams& params)
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue