88 : DPIDialog(parent ? parent : static_cast<wxWindow *>(wxGetApp().mainframe),
89 wxID_ANY,
90 _(
L(
"Step file import parameters")),
91 wxDefaultPosition,
92 wxDefaultSize,
93 wxDEFAULT_DIALOG_STYLE ),
m_file(file)
94{
97
99
100 SetBackgroundColour(*wxWHITE);
101
102 wxBoxSizer* bSizer = new wxBoxSizer(wxVERTICAL);
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
133
134 wxBoxSizer* tips_sizer = new wxBoxSizer(wxHORIZONTAL);
135 wxStaticText* info =
new wxStaticText(tip_frame, wxID_ANY,
_L(
"Smaller linear and angular deflections result in higher-quality transformations but increase the processing time."));
139 info->Wrap(FromDIP(450));
140
141 tips_sizer->Add(info, 0, wxEXPAND |wxALL , FromDIP(10));
142
143 tip_frame->SetSizer(tips_sizer);
144 tip_frame->Layout();
145 bSizer->Add(tip_frame, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP,
LEFT_RIGHT_PADING);
146
147 wxBoxSizer* linear_sizer = new wxBoxSizer(wxHORIZONTAL);
148
150 wxID_ANY,
_L(
"Linear Deflection") +
": ");
153 linear_sizer->Add(linear_title, 0, wxALIGN_LEFT);
154 linear_sizer->AddStretchSpacer(1);
155 wxSlider* linear_slider = new wxSlider(this, wxID_ANY,
157 1, 100, wxDefaultPosition,
159 wxSL_HORIZONTAL);
160 linear_sizer->Add(linear_slider, 0, wxALIGN_RIGHT | wxLEFT, FromDIP(5));
161
162 auto linear_input = new ::TextInput(
this,
m_linear_last, wxEmptyString, wxEmptyString, wxDefaultPosition, wxSize(
TEXT_CTRL_WIDTH, -1), wxTE_CENTER);
164 linear_input->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
165 linear_sizer->Add(linear_input, 0, wxALIGN_RIGHT | wxLEFT, FromDIP(5));
166 linear_input->Bind(wxEVT_KILL_FOCUS, ([this, linear_input](wxFocusEvent& e) {
167 wxString value = linear_input->GetTextCtrl()->GetValue();
171 } else {
172 MessageDialog msg_dlg(
nullptr,
_L(
"Please input a valid value (0.001 < linear deflection < 0.1)"), wxEmptyString, wxICON_WARNING | wxOK);
173 msg_dlg.ShowModal();
175 }
176 e.Skip();
177 }));
178
179 linear_input->Bind(wxEVT_TEXT, ([linear_slider, linear_input](wxCommandEvent& e) {
180 double slider_value_long;
181 int slider_value;
182 wxString value = linear_input->GetTextCtrl()->GetValue();
183 if (value.ToDouble(&slider_value_long)) {
185 if (slider_value >= linear_slider->GetMin() && slider_value <= linear_slider->GetMax()) {
186 linear_slider->SetValue(slider_value);
187 }
188 }
189 }));
190 linear_slider->Bind(wxEVT_SLIDER, ([this, linear_slider, linear_input](wxCommandEvent& e) {
192 linear_input->GetTextCtrl()->SetValue(wxString::Format("%.3f", slider_value));
194 }));
195 linear_slider->Bind(wxEVT_LEFT_UP, ([
this](
wxMouseEvent& e) {
197 e.Skip();
198 }));
199
200 bSizer->Add(linear_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP,
LEFT_RIGHT_PADING);
201 bSizer->AddSpacer(FromDIP(5));
202
203 wxBoxSizer* angle_sizer = new wxBoxSizer(wxHORIZONTAL);
205 wxID_ANY,
_L(
"Angle Deflection") +
": ");
208 angle_sizer->Add(angle_title, 0, wxALIGN_LEFT);
209 angle_sizer->AddStretchSpacer(1);
210 wxSlider* angle_slider = new wxSlider(this, wxID_ANY,
212 1, 100, wxDefaultPosition,
214 wxSL_HORIZONTAL);
215 angle_sizer->Add(angle_slider, 0, wxALIGN_RIGHT | wxLEFT, FromDIP(5));
216
217 auto angle_input = new ::TextInput(
this,
m_angle_last, wxEmptyString, wxEmptyString, wxDefaultPosition, wxSize(
TEXT_CTRL_WIDTH, -1), wxTE_CENTER);
219 angle_input->GetTextCtrl()->SetValidator(wxTextValidator(wxFILTER_NUMERIC));
220 angle_sizer->Add(angle_input, 0, wxALIGN_RIGHT | wxLEFT, FromDIP(5));
221 angle_input->Bind(wxEVT_KILL_FOCUS, ([this, angle_input](wxFocusEvent& e) {
222 wxString value = angle_input->GetTextCtrl()->GetValue();
226 } else {
227 MessageDialog msg_dlg(
nullptr,
_L(
"Please input a valid value (0.01 < angle deflection < 1.0)"), wxEmptyString, wxICON_WARNING | wxOK);
228 msg_dlg.ShowModal();
230 }
231 e.Skip();
232 }));
233
234 angle_input->Bind(wxEVT_TEXT, ([angle_slider, angle_input](wxCommandEvent& e) {
235 double slider_value_long;
236 int slider_value;
237 wxString value = angle_input->GetTextCtrl()->GetValue();
238 if (value.ToDouble(&slider_value_long)) {
240 if (slider_value >= angle_slider->GetMin() && slider_value <= angle_slider->GetMax()) {
241 angle_slider->SetValue(slider_value);
242 }
243 }
244 }));
245
246 angle_slider->Bind(wxEVT_SLIDER, ([this, angle_slider, angle_input](wxCommandEvent& e) {
248 angle_input->GetTextCtrl()->SetValue(wxString::Format("%.2f", slider_value));
250 }));
251 angle_slider->Bind(wxEVT_LEFT_UP, ([
this](
wxMouseEvent& e) {
253 e.Skip();
254 }));
255
257
258 wxBoxSizer* check_sizer = new wxBoxSizer(wxHORIZONTAL);
259 m_split_compound_checkbox =
new wxCheckBox(
this, wxID_ANY,
_L(
"Split compound and compsolid into multiple objects"), wxDefaultPosition, wxDefaultSize, 0);
264 bSizer->Add(check_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP,
LEFT_RIGHT_PADING);
265
266 wxBoxSizer* mesh_face_number_sizer = new wxBoxSizer(wxHORIZONTAL);
273 mesh_face_number_sizer->Add(mesh_face_number_title, 0, wxALIGN_LEFT);
276
277 bSizer->AddSpacer(FromDIP(10));
278
279 wxBoxSizer* save_default_sizer = new wxBoxSizer(wxHORIZONTAL);
280 m_save_default_checkbox =
new wxCheckBox(
this, wxID_ANY,
_L(
"Save these settings as default"), wxDefaultPosition, wxDefaultSize, 0);
283 m_save_default_checkbox->SetToolTip(
_L(
"If enabled, the values above are stored as the defaults used for future STEP imports (and shown in Preferences)."));
285 bSizer->Add(save_default_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT,
LEFT_RIGHT_PADING);
286
287 bSizer->AddSpacer(FromDIP(10));
288
289 m_checkbox =
new wxCheckBox(
this, wxID_ANY,
_L(
"Don't show again"), wxDefaultPosition, wxDefaultSize, 0);
293
294 wxBoxSizer* bSizer_button = new wxBoxSizer(wxHORIZONTAL);
295
296
297 auto wiki_btn = new Button(this, "", "toolbar_wiki", 0, 15);
298 auto wiki_url = "https://www.orcaslicer.com/wiki/import_export#step";
299 wiki_btn->SetToolTip(
_L(
"Wiki Guide") +
"\n" + wiki_url);
301 wiki_btn->SetCanFocus(false);
302 wiki_btn->Bind(wxEVT_LEFT_DOWN, ([wiki_url](auto& e) {wxLaunchDefaultBrowser(wiki_url);}));
303 bSizer_button->Add(wiki_btn, 0, wxALIGN_LEFT | wxLEFT | wxALIGN_CENTER_VERTICAL,
LEFT_RIGHT_PADING);
304
305 bSizer_button->AddStretchSpacer(1);
306
307 auto dlg_btns = new DialogButtons(this, {"OK", "Cancel"});
308
309 bSizer_button->Add(dlg_btns, 0, wxEXPAND);
310
311 dlg_btns->GetOK()->Bind(wxEVT_BUTTON, [this, angle_input, linear_input](wxCommandEvent& e) {
316 wxGetApp().app_config->set_bool("enable_step_mesh_setting", false);
317 }
322 }
323
325 }
326 SetFocusIgnoringChildren();
327 });
328
329 dlg_btns->GetCANCEL()->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) {
332 });
333
334 bSizer->Add(bSizer_button, 1, wxEXPAND);
335
336 this->SetSizerAndFit(bSizer);
338 this->Layout();
339
340 this->Bind(wxEVT_LEFT_DOWN, [this](auto& e) {
341 SetFocusIgnoringChildren();
342 });
344 SetFocusIgnoringChildren();
345 });
346
347 this->Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& e) {
350 });
351
352 wxGetApp().UpdateDlgDarkUI(this);
353}
#define _(s)
Definition 3mf.cpp:306
#define L(s)
Definition ExtrusionEntity.cpp:25
#define _L(s)
Definition OBJ.cpp:34
class WXDLLIMPEXP_FWD_CORE wxStaticText
Definition ProgressDialog.hpp:30
#define TEXT_CTRL_WIDTH
Definition StepMeshDialog.cpp:39
#define LEFT_RIGHT_PADING
Definition StepMeshDialog.cpp:46
#define SLIDER_SCALE_10(val)
Definition StepMeshDialog.cpp:44
#define SLIDER_UNSCALE(val)
Definition StepMeshDialog.cpp:43
#define SLIDER_WIDTH
Definition StepMeshDialog.cpp:37
#define SLIDER_SCALE(val)
Definition StepMeshDialog.cpp:42
#define SLIDER_UNSCALE_10(val)
Definition StepMeshDialog.cpp:45
#define SLIDER_HEIGHT
Definition StepMeshDialog.cpp:38
#define FONT_COLOR
Definition StepMeshDialog.cpp:47
static wxFont Body_14
Definition Label.hpp:53
void EndModal(int retCode) override
Definition GUI_Utils.hpp:305
static wxColour darkModeColorFor(wxColour const &color)
Definition StateColor.cpp:219
wxStaticText * mesh_face_number_text
Definition StepMeshDialog.hpp:44
wxString m_angle_last
Definition StepMeshDialog.hpp:43
void stop_task()
Definition StepMeshDialog.cpp:373
void on_task_done(wxCommandEvent &event)
Definition StepMeshDialog.cpp:360
bool validate_number_range(const wxString &value, double min, double max)
Definition StepMeshDialog.cpp:71
wxCheckBox * m_split_compound_checkbox
Definition StepMeshDialog.hpp:40
double get_linear_deflection()
Definition StepMeshDialog.hpp:18
wxCheckBox * m_checkbox
Definition StepMeshDialog.hpp:39
wxCheckBox * m_save_default_checkbox
Definition StepMeshDialog.hpp:41
double get_angle_deflection()
Definition StepMeshDialog.hpp:26
void update_mesh_number_text()
Definition StepMeshDialog.cpp:387
Slic3r::Step & m_file
Definition StepMeshDialog.hpp:38
wxString m_linear_last
Definition StepMeshDialog.hpp:42
wxMouseEvent
Definition CameraPopup.cpp:47
std::string float_to_string_decimal_point(double value, int precision)
Definition LocalesUtils.cpp:108