Compare commits

..
Author SHA1 Message Date
SoftFever b67269ccc4 Fix z-fighting between feature previews and the bodies in the Design tab
The bodies now always draw over the preview on every face a feature leaves unchanged, for
all features. Since a hole's cut sits inside the body, the Hole preview now hides the
bodies and shows the result alone, as Fillet/Chamfer and Draft do.
2026-10-05 19:38:46 +08:00
11 changed files with 1359 additions and 1185 deletions
+9
View File
@@ -189,6 +189,15 @@ degenerate edges are left out (`GeometryEngine::display_edges`), and the polylin
once per shape, keyed by its `TShape`, because a recompute that leaves a body unchanged is the
common case.
While a feature card is open, its preview ghost is the whole model the candidate would produce,
drawn translucent over the bodies, so every face the feature leaves alone is in both at the same
depth. The ghost is drawn with a depth bias that pushes it back (`GLVolume::depth_bias`), so on a shared face
the body always wins instead of the two copies z-fighting, and the ghost shows only where the
result reaches past the bodies. Material a feature removes lies inside the old solid and would not
show at all, so the tools whose result mostly coincides with the body — Fillet/Chamfer, Draft,
Hole and the Mate hover — hide the bodies once the preview is valid and draw the result alone,
opaque.
## Showing what is selected
A selection is drawn on the faces it names, never as a tint over the body: a translucent
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+24 -24
View File
@@ -6025,7 +6025,7 @@ msgstr "ขนาด:"
#, boost-format
msgid "Conflicts of G-code paths have been found at layer %d, Z = %.2lfmm. Please separate the conflicted objects farther (%s <-> %s)."
msgstr "พบความขัดแย้งของเส้นทาง G-code ที่เลเยอร์ %d, Z = %.2lfmm โปรดแยกวัตถุที่ขัดแย้งกันให้ไกลออกไป (%s <-> %s)"
msgstr "พบความขัดแย้งของเส้นทางรหัส G ที่เลเยอร์ %d, Z = %.2lfmm โปรดแยกวัตถุที่ขัดแย้งกันให้ไกลออกไป (%s <-> %s)"
msgid "An object is laid over the plate boundaries."
msgstr "มีวัตถุวางอยู่เหนือขอบเขตของแผ่น"
@@ -6344,7 +6344,7 @@ msgstr "เผยแพร่ 3MF"
# AI Translated
msgid "Export a 3MF file with the selected settings embedded"
msgstr "ส่งออกไฟล์ 3MF โดยฝังการตั้งค่าที่เลือกไว้"
msgstr "ส่งออกไฟล์ 3MF ที่ฝังการตั้งค่าที่เลือกไว้"
msgid "Import 3MF/STL/STEP/SVG/OBJ/AMF"
msgstr "นำเข้า 3MF/STL/STEP/SVG/OBJ/AMF"
@@ -7832,11 +7832,11 @@ msgstr "ล่าง"
# AI Translated
msgid "This setting does not specify a plugin capability type."
msgstr "การตั้งค่านี้ไม่ได้ระบุประเภทความสามารถของปลั๊กอิน"
msgstr "การตั้งค่านี้ไม่ได้ระบุชนิดความสามารถของปลั๊กอิน"
# AI Translated
msgid "This setting specifies an unrecognized plugin capability type: "
msgstr "การตั้งค่านี้ระบุประเภทความสามารถของปลั๊กอินที่ไม่รู้จัก: "
msgstr "การตั้งค่านี้ระบุชนิดความสามารถของปลั๊กอินที่ไม่รู้จัก: "
# AI Translated
msgid "Plugin Selection"
@@ -8397,11 +8397,11 @@ msgstr "ค่าที่ตั้งไว้ล่วงหน้าที่
# AI Translated
msgid "Some published settings could not be applied:"
msgstr "การตั้งค่าที่เผยแพร่บางส่วนไม่สามารถนำไปใช้ได้:"
msgstr "ไม่สามารถใช้การตั้งค่าที่เผยแพร่บางรายการได้:"
# AI Translated
msgid "Some filament slots were changed:"
msgstr "ช่องเส้นพลาสติกบางช่องมีการเปลี่ยนแปลง:"
msgstr "ช่องเส้นพลาสติกบางช่องถูกเปลี่ยนแปลง:"
msgid "Component name(s) inside step file not in UTF-8 format!"
msgstr "ชื่อของส่วนประกอบภายในไฟล์ STEP ไม่ใช่รูปแบบ UTF-8!"
@@ -8811,8 +8811,8 @@ msgid ""
"Failed to export the published 3MF file.\n"
"Please check whether the folder exists online or if other programs have the file open."
msgstr ""
"ไม่สามารถส่งออกไฟล์ 3MF ที่เผยแพร่ได้\n"
"โปรดตรวจสอบว่ามีโฟลเดอร์นี้ออนไลน์อยู่หรือไม่ หรือมีโปรแกรมอื่นเปิดไฟล์นี้อยู่หรือไม่"
"ส่งออกไฟล์ 3MF ที่เผยแพร่ล้มเหลว\n"
"โปรดตรวจสอบว่าโฟลเดอร์นั้นมีอยู่บนออนไลน์หรือมีโปรแกรมอื่นเปิดไฟล์นี้ค้างไว้หรือไม่"
msgid "Publish"
msgstr "เผยแพร่"
@@ -10051,7 +10051,7 @@ msgstr "เส้นพลาสติกผสม"
# AI Translated
msgid "Some mixed filaments rely on filaments that will not be published:"
msgstr "เส้นพลาสติกผสมบางส่วนขึ้นอยู่กับเส้นพลาสติกที่จะไม่ได้รับการเผยแพร่:"
msgstr "เส้นพลาสติกผสมบางรายการต้องอาศัยเส้นพลาสติกที่จะไม่ถูกเผยแพร่:"
# AI Translated
#, c-format, boost-format
@@ -10070,7 +10070,7 @@ msgstr "%1% ต้องใช้ %2% แต่วัสดุของมัน
# AI Translated
msgid "To publish a mixed filament, enable every filament it uses and choose Full Publish or check its Type requirement."
msgstr "หากต้องการเผยแพร่เส้นพลาสติกผสม ให้เลือก \"เปิดใช้\" สำหรับเส้นพลาสติกทุกเส้นที่เป็นส่วนประกอบ แล้วเลือก \"เผยแพร่ทั้งหมด (Full Publish)\" หรือทำเครื่องหมายที่ข้อกำหนด \"ชนิด\" ของแต่ละเส้น"
msgstr "หากต้องการเผยแพร่เส้นพลาสติกผสม ให้เปิดใช้เส้นพลาสติกทุกเส้นที่ใช้ แล้วเลือกการเผยแพร่แบบเต็ม หรือทำตามข้อกำหนดชนิดของมัน"
# AI Translated
msgid "Publish anyway"
@@ -10082,18 +10082,18 @@ msgstr "เผยแพร่ 3MF..."
# AI Translated
msgid "Select which settings to be published in the 3MF file"
msgstr "เลือกการตั้งค่าที่จะเผยแพร่ในไฟล์ 3MF"
msgstr "เลือกว่าจะเผยแพร่การตั้งค่าใดในไฟล์ 3MF"
msgid "Video Guide"
msgstr ""
# AI Translated
msgid "Mixed filament - published as a whole when \"Enable\" above is selected"
msgstr "เส้นพลาสติกผสม - จะได้รับการเผยแพร่ทั้งชุดเมื่อเลือก \"เปิดใช้\" ด้านบน"
msgstr "เส้นพลาสติกผสม - เผยแพร่ทั้งชุดเมื่อเลือก \"เปิดใช้\" ด้านบน"
# AI Translated
msgid "Publish this mixed filament and enable + Full Publish its component filaments"
msgstr "เผยแพร่เส้นพลาสติกผสมนี้ พร้อมเลือก \"เปิดใช้\" และ \"เผยแพร่ทั้งหมด (Full Publish)\" ให้เส้นพลาสติกที่เป็นส่วนประกอบ"
msgstr "เผยแพร่เส้นพลาสติกผสมนี้ และเปิดใช้ + เผยแพร่แบบเต็มสำหรับเส้นพลาสติกที่เป็นส่วนประกอบ"
# AI Translated
msgid "Publish this filament slot in the 3MF file"
@@ -10101,11 +10101,11 @@ msgstr "เผยแพร่ช่องเส้นพลาสติกนี
# AI Translated
msgid "Full Publish"
msgstr "เผยแพร่ทั้งหมด (Full Publish)"
msgstr "การเผยแพร่แบบเต็ม"
# AI Translated
msgid "Embed the entire filament of this slot in the 3MF file"
msgstr "ฝังการตั้งค่าเส้นพลาสติกทั้งหมดของช่องนี้ลงในไฟล์ 3MF"
msgstr "ฝังเส้นพลาสติกทั้งหมดของช่องนี้ลงในไฟล์ 3MF"
# AI Translated
msgid "Filter non-selected"
@@ -14059,7 +14059,7 @@ msgstr "ศูนย์กลาง"
# AI Translated
msgid "Spiral Inset"
msgstr "เกลียวร่นเข้า (Spiral Inset)"
msgstr "เกลียวเข้าใน"
msgid "Hilbert Curve"
msgstr "ฮิลเบิร์ต เคิร์ฟ"
@@ -14156,9 +14156,9 @@ msgid ""
"Outward starts at the center of the surface, so any excess material is pushed towards the edge where it is least visible. Inward starts at the edge and ends with the tight curves at the center.\n"
"Default uses shortest-path ordering, which may run in either direction."
msgstr ""
"ทิศทางที่พื้นผิวด้านบนถูกเติมเมื่อใช้รูปแบบที่อิงจุดศูนย์กลาง (ศูนย์กลาง, เกลียวร่นเข้า (Spiral Inset), คอร์ดอาร์คิมีดีน, เกลียวแปดเหลี่ยม)\n"
"ออกด้านนอกเริ่มที่กึ่งกลางของพื้นผิว ดังนั้นวัสดุส่วนเกินจะถูกดันไปทางขอบซึ่งมองเห็นได้น้อยที่สุด เข้าด้านในเริ่มที่ขอบและจบด้วยเส้นโค้งแคบที่กึ่งกลาง\n"
"ค่าเริ่มต้นใช้การเรียงลำดับเส้นทางสั้นที่สุด ซึ่งอาจทำงานในทิศทางใดก็ได้"
"ทิศทางการเติมผิวด้านบนเมื่อใช้รูปแบบที่เริ่มจากศูนย์กลาง (ศูนย์กลาง, เกลียวเข้าใน, คอร์ดอาร์คิมีดีน, เกลียวแปดเหลี่ยม)\n"
"ออกด้านนอกจะเริ่มที่กึ่งกลางของผิว วัสดุส่วนเกินจึงถูกดันไปทางขอบซึ่งมองเห็นได้น้อยที่สุด เข้าด้านในจะเริ่มที่ขอบและจบด้วยเส้นโค้งแคบตรงกึ่งกลาง\n"
"ค่าเริ่มต้นใช้การเรียงตามเส้นทางที่สั้นที่สุด ซึ่งอาจเดินไปทางใดก็ได้"
# AI Translated
msgid "Bottom surface fill order"
@@ -14170,9 +14170,9 @@ msgid ""
"Inward starts each surface with the wider outer curves, which improves first layer adhesion on build plates where the tight curves at the center may not stick. Outward starts at the center, pushing any excess material towards the edge.\n"
"Default uses shortest-path ordering, which may run in either direction."
msgstr ""
"ทิศทางที่พื้นผิวด้านล่างถูกเติมเมื่อใช้รูปแบบที่อิงจุดศูนย์กลาง (ศูนย์กลาง, เกลียวร่นเข้า (Spiral Inset), คอร์ดอาร์คิมีดีน, เกลียวแปดเหลี่ยม)\n"
"เข้าด้านในเริ่มแต่ละพื้นผิวด้วยเส้นโค้งด้านนอกที่กว้างกว่า ซึ่งช่วยเพิ่มการยึดเกาะเลเยอร์แรกบนฐานพิมพ์ที่เส้นโค้งแคบตรงกลางอาจไม่ติด ออกด้านนอกเริ่มที่กึ่งกลาง โดยดันวัสดุส่วนเกินไปทางขอบ\n"
"ค่าเริ่มต้นใช้การเรียงลำดับเส้นทางสั้นที่สุด ซึ่งอาจทำงานในทิศทางใดก็ได้"
"ทิศทางการเติมผิวด้านล่างเมื่อใช้รูปแบบที่เริ่มจากศูนย์กลาง (ศูนย์กลาง, เกลียวเข้าใน, คอร์ดอาร์คิมีดีน, เกลียวแปดเหลี่ยม)\n"
"เข้าด้านในจะเริ่มแต่ละผิวด้วยเส้นโค้งด้านนอกที่กว้างกว่า ซึ่งช่วยให้ชั้นแรกยึดเกาะดีขึ้นบนฐานพิมพ์ที่เส้นโค้งแคบตรงกึ่งกลางอาจไม่ติด ออกด้านนอกจะเริ่มที่กึ่งกลางและดันวัสดุส่วนเกินไปทางขอบ\n"
"ค่าเริ่มต้นใช้การเรียงตามเส้นทางที่สั้นที่สุด ซึ่งอาจเดินไปทางใดก็ได้"
msgid "Internal solid infill pattern"
msgstr "รูปแบบไส้ในของแข็งภายใน"
@@ -21499,7 +21499,7 @@ msgstr "ข้ามวัตถุ"
# AI Translated
msgid "Material Ratio"
msgstr "อัตราส่วนวัสดุ"
msgstr "สัดส่วนวัสดุ"
# AI Translated
msgid "Model Height"
@@ -21507,7 +21507,7 @@ msgstr "ความสูงโมเดล"
# AI Translated
msgid "Ratio"
msgstr "อัตราส่วน"
msgstr "สัดส่วน"
msgid "Select Filament"
msgstr "เลือกเส้นพลาสติก"
+6 -6
View File
@@ -5301,7 +5301,7 @@ void PrintConfigDef::init_fff_params()
def->set_default_value(new ConfigOptionEnum<InputShaperType>(InputShaperType::Default));
def = this->add("input_shaping_freq_x", coFloat);
def->label = L_CONTEXT("X", "Axis");
def->label = L("X");
def->tooltip = L("Resonant frequency for the X axis input shaper.\nZero will use the firmware frequency.\nTo disable input shaping, use the Disable type.\nRRF: X and Y values are equal.");
def->sidetext = L("Hz"); // Hertz, CIS languages need translation
def->min = 0;
@@ -5310,7 +5310,7 @@ void PrintConfigDef::init_fff_params()
def->set_default_value(new ConfigOptionFloat(0));
def = this->add("input_shaping_freq_y", coFloat);
def->label = L_CONTEXT("Y", "Axis");
def->label = L("Y");
def->tooltip = L("Resonant frequency for the Y axis input shaper.\nZero will use the firmware frequency.\nTo disable input shaping, use the Disable type.");
def->sidetext = L("Hz"); // Hertz, CIS languages need translation
def->min = 0;
@@ -5319,7 +5319,7 @@ void PrintConfigDef::init_fff_params()
def->set_default_value(new ConfigOptionFloat(0));
def = this->add("input_shaping_damp_x", coFloat);
def->label = L_CONTEXT("X", "Axis");
def->label = L("X");
def->tooltip = L("Damping ratio for the X axis input shaper.\nZero will use the firmware damping ratio.\nTo disable input shaping, use the Disable type.\nRRF: X and Y values are equal.");
def->min = 0;
def->max = 1;
@@ -5327,7 +5327,7 @@ void PrintConfigDef::init_fff_params()
def->set_default_value(new ConfigOptionFloat(0.1));
def = this->add("input_shaping_damp_y", coFloat);
def->label = L_CONTEXT("Y", "Axis");
def->label = L("Y");
def->tooltip = L("Damping ratio for the Y axis input shaper.\nZero will use the firmware damping ratio.\nTo disable input shaping, use the Disable type.");
def->min = 0;
def->max = 1;
@@ -8530,14 +8530,14 @@ void PrintConfigDef::init_sla_params()
def = this->add("display_pixels_x", coInt);
//def->full_label = L("");
def->label = L_CONTEXT("X", "Axis");
def->label = ("X");
//def->tooltip = L("");
def->min = 100;
def->set_default_value(new ConfigOptionInt(2560));
def = this->add("display_pixels_y", coInt);
//def->full_label = L("");
def->label = L_CONTEXT("Y", "Axis");
def->label = ("Y");
//def->tooltip = L("");
def->min = 100;
def->set_default_value(new ConfigOptionInt(1440));
+7
View File
@@ -310,6 +310,7 @@ GLVolume::GLVolume(float r, float g, float b, float a)
, force_native_color(false)
, force_neutral_color(false)
, force_sinking_contours(false)
, depth_bias(false)
, picking(false)
, tverts_range(0, size_t(-1))
{
@@ -1332,11 +1333,17 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type,
shader->set_uniform("projection_matrix", projection_matrix);
const Matrix3d view_normal_matrix = view_matrix.matrix().block(0, 0, 3, 3) * model_matrix.matrix().block(0, 0, 3, 3).inverse().transpose();
shader->set_uniform("view_normal_matrix", view_normal_matrix);
if (volume.first->depth_bias) {
glsafe(::glEnable(GL_POLYGON_OFFSET_FILL));
glsafe(::glPolygonOffset(1.0f, 1.0f));
}
//BBS: add outline related logic
if (volume.first->selected && shader_can_outline && GUI::wxGetApp().show_outline())
volume.first->render_with_outline(cnv_size);
else
volume.first->render();
if (volume.first->depth_bias)
glsafe(::glDisable(GL_POLYGON_OFFSET_FILL));
#if ENABLE_ENVIRONMENT_MAP
if (use_environment_texture)
+4
View File
@@ -232,6 +232,10 @@ public:
bool force_neutral_color : 1;
// Whether or not to force rendering of sinking contours
bool force_sinking_contours : 1;
// Orca: draw this volume with a positive depth bias (glPolygonOffset, pushed away from the
// camera), so on a surface it shares with another volume the other volume wins the depth
// test instead of z-fighting it
bool depth_bias : 1;
// Is render for picking
bool picking : 1;
// slice error
+7 -3
View File
@@ -378,10 +378,14 @@ void DesignCanvas::reload(bool keep_view)
v->set_color(c);
}
} else if (obj_idx == 1) {
// The ghost is normally a faint blue overlay on the visible body. In preview-only
// mode it IS the result (base bodies hidden), so render it opaque so it reads as a
// finished solid rather than a see-through hint.
// The ghost is the whole resulting model, normally drawn as a faint blue overlay on
// the visible bodies. Every face the feature leaves alone is in both, at the same
// depth, so the ghost is drawn with a depth bias: the bodies win on those faces instead
// of the two copies z-fighting, and the ghost shows only where the result reaches past
// the bodies. In preview-only mode it IS the result (base bodies hidden), so render it
// opaque so it reads as a finished solid rather than a see-through hint.
v->set_color(m_body_hidden ? ColorRGBA(0.40f, 0.82f, 1.0f, 1.0f) : ghost);
v->depth_bias = true;
}
}
+21 -19
View File
@@ -1860,9 +1860,9 @@ DesignPanel::DesignPanel(wxWindow* parent)
mform->Add(spin_frame(m_move_dz), 0, wxEXPAND);
m_move_axis = make_combo(m_cards);
m_move_axis->Append(_L_CONTEXT("X", "Axis"));
m_move_axis->Append(_L_CONTEXT("Y", "Axis"));
m_move_axis->Append(_L_CONTEXT("Z", "Axis"));
m_move_axis->Append(_L("X"));
m_move_axis->Append(_L("Y"));
m_move_axis->Append(_L("Z"));
m_move_axis->SetSelection(2);
mform->Add(new wxStaticText(m_cards, wxID_ANY, _L("Rotation axis")), 0, wxALIGN_CENTER_VERTICAL);
mform->Add(m_move_axis, 0, wxEXPAND);
@@ -1988,9 +1988,9 @@ DesignPanel::DesignPanel(wxWindow* parent)
auto* hform = two_col_form();
m_hole_plane = make_combo(m_cards);
m_hole_plane->Append(_L_CONTEXT("XY", "Axis"));
m_hole_plane->Append(_L_CONTEXT("XZ", "Axis"));
m_hole_plane->Append(_L_CONTEXT("YZ", "Axis"));
m_hole_plane->Append(_L("XY"));
m_hole_plane->Append(_L("XZ"));
m_hole_plane->Append(_L("YZ"));
m_hole_plane->SetSelection(0);
// Picking a plane here is an explicit choice: drop any on-face hijack (a stale face pick
// could keep m_hole_on_face true, so the dropdown was ignored and the hole drilled on the
@@ -2041,9 +2041,9 @@ DesignPanel::DesignPanel(wxWindow* parent)
auto* tform = two_col_form();
m_thread_plane = make_combo(m_cards);
m_thread_plane->Append(_L_CONTEXT("XY", "Axis"));
m_thread_plane->Append(_L_CONTEXT("XZ", "Axis"));
m_thread_plane->Append(_L_CONTEXT("YZ", "Axis"));
m_thread_plane->Append(_L("XY"));
m_thread_plane->Append(_L("XZ"));
m_thread_plane->Append(_L("YZ"));
m_thread_plane->SetSelection(0);
tform->Add(new wxStaticText(m_cards, wxID_ANY, _L("Thread plane")), 0, wxALIGN_CENTER_VERTICAL);
tform->Add(m_thread_plane, 0, wxEXPAND);
@@ -2564,9 +2564,9 @@ DesignPanel::DesignPanel(wxWindow* parent)
xform->Add(new wxStaticText(m_cards, wxID_ANY, _L("Translate Z")), 0, wxALIGN_CENTER_VERTICAL);
xform->Add(spin_frame(m_xf_dz), 0, wxEXPAND);
m_xf_axis = make_combo(m_cards);
m_xf_axis->Append(_L_CONTEXT("X", "Axis"));
m_xf_axis->Append(_L_CONTEXT("Y", "Axis"));
m_xf_axis->Append(_L_CONTEXT("Z", "Axis"));
m_xf_axis->Append(_L("X"));
m_xf_axis->Append(_L("Y"));
m_xf_axis->Append(_L("Z"));
m_xf_axis->SetSelection(2); // default Z
m_xf_axis->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent&) { refresh_preview(); });
xform->Add(new wxStaticText(m_cards, wxID_ANY, _L("Rotate axis")), 0, wxALIGN_CENTER_VERTICAL);
@@ -2904,11 +2904,11 @@ DesignPanel::DesignPanel(wxWindow* parent)
m_cs_x = make_spin(m_cards, 0.0, -100000.0, 100000.0);
m_cs_y = make_spin(m_cards, 0.0, -100000.0, 100000.0);
m_cs_z = make_spin(m_cards, 0.0, -100000.0, 100000.0);
csform->Add(new wxStaticText(m_cards, wxID_ANY, _L_CONTEXT("X", "Axis")), 0, wxALIGN_CENTER_VERTICAL);
csform->Add(new wxStaticText(m_cards, wxID_ANY, _L("X")), 0, wxALIGN_CENTER_VERTICAL);
csform->Add(spin_frame(m_cs_x), 0, wxEXPAND);
csform->Add(new wxStaticText(m_cards, wxID_ANY, _L_CONTEXT("Y", "Axis")), 0, wxALIGN_CENTER_VERTICAL);
csform->Add(new wxStaticText(m_cards, wxID_ANY, _L("Y")), 0, wxALIGN_CENTER_VERTICAL);
csform->Add(spin_frame(m_cs_y), 0, wxEXPAND);
csform->Add(new wxStaticText(m_cards, wxID_ANY, _L_CONTEXT("Z", "Axis")), 0, wxALIGN_CENTER_VERTICAL);
csform->Add(new wxStaticText(m_cards, wxID_ANY, _L("Z")), 0, wxALIGN_CENTER_VERTICAL);
csform->Add(spin_frame(m_cs_z), 0, wxEXPAND);
auto cs_pick = [&](const wxString& label, ::Button*& btn, wxStaticText*& lbl, CoordSysPick target) {
@@ -6082,7 +6082,7 @@ void DesignPanel::populate_plane_choices(ComboBox* c) const
if (!c) return;
const int keep = c->GetSelection();
c->Clear();
c->Append(_L_CONTEXT("XY", "Axis")); c->Append(_L_CONTEXT("XZ", "Axis")); c->Append(_L_CONTEXT("YZ", "Axis"));
c->Append(_L("XY")); c->Append(_L("XZ")); c->Append(_L("YZ"));
for (const auto& dp : m_doc.resolve_datum_planes())
c->Append(wxString::FromUTF8(dp.first));
c->SetSelection((keep >= 0 && keep < int(c->GetCount())) ? keep : 0);
@@ -11185,10 +11185,12 @@ void DesignPanel::refresh_preview()
// Confirm so the user sees the gate before clicking; the red status says why.
m_candidate_ok = ok;
update_confirm_button();
// Fillet/Chamfer/Draft: once the target edge/face yields a valid result, show ONLY the
// Fillet/Chamfer/Draft/Hole: once the target edge/face yields a valid result, show ONLY the
// preview (hide the base bodies) so the user sees the finished shape, not the old solid
// doubled with the ghost. Before a valid pick the body stays visible so it can be picked.
m_viewport->set_body_hidden((m_active == Tool::Dressup || m_active == Tool::Draft) && ok);
// doubled with the ghost. A hole's cut lies inside the old solid, so without this the body
// would hide it entirely. Before a valid pick the body stays visible so it can be picked.
m_viewport->set_body_hidden((m_active == Tool::Dressup || m_active == Tool::Draft ||
m_active == Tool::Hole) && ok);
m_status->Refresh();
// Refresh the in-canvas Extrude depth arrow (self-gates: only while the Extrude card is open).
+3 -3
View File
@@ -6322,9 +6322,9 @@ void GLCanvas3D::_render_3d_navigator()
style.Colors[ImGuizmo::COLOR::DIRECTION_Z] = ImGuiWrapper::to_ImVec4(ColorRGBA::X());
style.Colors[ImGuizmo::COLOR::TEXT] = m_is_dark ? ImVec4(224 / 255.f, 224 / 255.f, 224 / 255.f, 1.f) : ImVec4(.2f, .2f, .2f, 1.0f);
style.Colors[ImGuizmo::COLOR::FACE] = m_is_dark ? ImVec4(0.23f, 0.23f, 0.23f, 1.f) : ImVec4(0.77f, 0.77f, 0.77f, 1);
strcpy(style.AxisLabels[ImGuizmo::Axis::Axis_X], _u8L_CONTEXT("Y", "Axis").c_str()); // ORCA use uppercase to match text on tranform widgets
strcpy(style.AxisLabels[ImGuizmo::Axis::Axis_Y], _u8L_CONTEXT("Z", "Axis").c_str()); // ORCA use uppercase to match text on tranform widgets
strcpy(style.AxisLabels[ImGuizmo::Axis::Axis_Z], _u8L_CONTEXT("X", "Axis").c_str()); // ORCA use uppercase to match text on tranform widgets
strcpy(style.AxisLabels[ImGuizmo::Axis::Axis_X], "Y"); // ORCA use uppercase to match text on tranform widgets
strcpy(style.AxisLabels[ImGuizmo::Axis::Axis_Y], "Z"); // ORCA use uppercase to match text on tranform widgets
strcpy(style.AxisLabels[ImGuizmo::Axis::Axis_Z], "X"); // ORCA use uppercase to match text on tranform widgets
strcpy(style.FaceLabels[ImGuizmo::FACES::FACE_FRONT], _u8L_CONTEXT("Front", "Camera View").c_str());
strcpy(style.FaceLabels[ImGuizmo::FACES::FACE_BACK], _u8L_CONTEXT("Back", "Camera View").c_str());
strcpy(style.FaceLabels[ImGuizmo::FACES::FACE_TOP], _u8L_CONTEXT("Top", "Camera View").c_str());
+1 -1
View File
@@ -3387,7 +3387,7 @@ void StatusPanel::update_misc_ctrl(MachineObject *obj)
if (obj->is_core_xy()) {
m_staticText_z_tip->SetLabel(_L("Bed"));
} else {
m_staticText_z_tip->SetLabel(_L_CONTEXT("Z", "Axis"));
m_staticText_z_tip->SetLabel("Z");
}
// update extruder icon