KiCad PCB EDA Suite
Loading...
Searching...
No Matches
eda_3d_viewer_settings.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2020 Jon Evans <[email protected]>
5 * Copyright (C) 2023 CERN
6 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
7 *
8 * This program is free software: you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation, either version 3 of the License, or (at your
11 * option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
22#include <fmt/format.h>
23#include <3d_enums.h>
25#include <settings/parameters.h>
28#include <wx/config.h>
29
31
32using KIGFX::COLOR4D;
33
34using namespace std::placeholders;
35
36
37LAYER_PRESET_3D::LAYER_PRESET_3D( const wxString& aName ) :
38 name( aName )
39{
50
53
55 layers.set( LAYER_FP_TEXT );
56
58
59 // Preload colors vector so we don't have to worry about exceptions using colors.at()
79}
80
81
83 std::vector<LAYER_PRESET_3D>* aPresetList ) :
84 PARAM_LAMBDA<nlohmann::json>( aPath,
86 std::bind( &PARAM_LAYER_PRESET_3D::jsonToPresets, this, _1 ),
87 {} ),
88 m_presets( aPresetList )
89{
90 wxASSERT( aPresetList );
91
92#define LAYER( n, l ) m_layerToLayerNameMap[l] = n; m_layerNameToLayerMap[n] = l;
93
94 LAYER( "fp_values", LAYER_FP_VALUES );
95 LAYER( "fp_references", LAYER_FP_REFERENCES );
96 LAYER( "fp_text", LAYER_FP_TEXT );
97 LAYER( "background_bottom", LAYER_3D_BACKGROUND_BOTTOM );
98 LAYER( "background_top", LAYER_3D_BACKGROUND_TOP );
99 LAYER( "board", LAYER_3D_BOARD );
100 LAYER( "plated_barrels", LAYER_3D_PLATED_BARRELS );
101 LAYER( "copper", LAYER_3D_COPPER_TOP );
102 LAYER( "copper_bottom", LAYER_3D_COPPER_BOTTOM );
103 LAYER( "silkscreen_bottom", LAYER_3D_SILKSCREEN_BOTTOM );
104 LAYER( "silkscreen_top", LAYER_3D_SILKSCREEN_TOP );
105 LAYER( "soldermask_bottom", LAYER_3D_SOLDERMASK_BOTTOM );
106 LAYER( "soldermask_top", LAYER_3D_SOLDERMASK_TOP );
107 LAYER( "solderpaste", LAYER_3D_SOLDERPASTE );
108 LAYER( "adhesive", LAYER_3D_ADHESIVE );
109 LAYER( "user_comments", LAYER_3D_USER_COMMENTS );
110 LAYER( "user_drawings", LAYER_3D_USER_DRAWINGS );
111 LAYER( "user_eco1", LAYER_3D_USER_ECO1 );
112 LAYER( "user_eco2", LAYER_3D_USER_ECO2 );
113 LAYER( "f_fab", LAYER_3D_F_FAB );
114 LAYER( "b_fab", LAYER_3D_B_FAB );
115 LAYER( "f_courtyard", LAYER_3D_F_COURTYARD );
116 LAYER( "b_courtyard", LAYER_3D_B_COURTYARD );
117 LAYER( "3d_navigator", LAYER_3D_NAVIGATOR );
118 LAYER( "th_models", LAYER_3D_TH_MODELS );
119 LAYER( "smd_models", LAYER_3D_SMD_MODELS );
120 LAYER( "virtual_models", LAYER_3D_VIRTUAL_MODELS );
121 LAYER( "non_pos_file_models", LAYER_3D_MODELS_NOT_IN_POS );
122 LAYER( "dnp_models", LAYER_3D_MODELS_MARKED_DNP );
123 LAYER( "bounding_boxes", LAYER_3D_BOUNDING_BOXES );
124 LAYER( "off_board_silk", LAYER_3D_OFF_BOARD_SILK );
125 LAYER( "3d_axes", LAYER_GRID_AXES );
126
127 for( int layer = LAYER_3D_USER_1; layer <= LAYER_3D_USER_45; ++layer )
128 {
129 wxString name = wxString::Format( wxS( "user_%d" ), layer - LAYER_3D_USER_1 + 1 );
130 m_layerToLayerNameMap[layer] = name;
131 m_layerNameToLayerMap[name] = layer;
132 }
133}
134
135
137{
138 nlohmann::json ret = nlohmann::json::array();
139
140 for( const LAYER_PRESET_3D& preset : *m_presets )
141 {
142 nlohmann::json js = {
143 { "name", preset.name }
144 };
145
146 nlohmann::json layers = nlohmann::json::array();
147
148 for( int layer = 0; layer < LAYER_3D_END; ++layer )
149 {
150 if( !preset.layers.test( layer ) )
151 continue;
152
153 if( auto it = m_layerToLayerNameMap.find( layer ); it != m_layerToLayerNameMap.end() )
154 layers.push_back( it->second );
155 }
156
157 js["layers"] = layers;
158
159 nlohmann::json colors = nlohmann::json::array();
160
161 for( const auto& [ layer, color ] : preset.colors )
162 {
163 auto it = m_layerToLayerNameMap.find( layer );
164
165 if( it == m_layerToLayerNameMap.end() )
166 continue;
167
168 nlohmann::json layerColor = { { "layer", it->second }, { "color", color.ToCSSString() } };
169
170 colors.push_back( layerColor );
171 }
172
173 js["colors"] = colors;
174
175 ret.push_back( js );
176 }
177
178 return ret;
179}
180
181
182void PARAM_LAYER_PRESET_3D::jsonToPresets( const nlohmann::json& aJson )
183{
184 if( aJson.empty() || !aJson.is_array() )
185 return;
186
187 m_presets->clear();
188
189 for( const nlohmann::json& preset : aJson )
190 {
191 if( preset.contains( "name" ) )
192 {
193 LAYER_PRESET_3D p( preset.at( "name" ).get<wxString>() );
194
195 if( preset.contains( "layers" ) && preset.at( "layers" ).is_array() )
196 {
197 p.layers.reset();
198
199 for( const nlohmann::json& layer : preset.at( "layers" ) )
200 {
201 if( !layer.is_string() )
202 continue;
203
204 auto it = m_layerNameToLayerMap.find( layer.get<wxString>() );
205
206 if( it != m_layerNameToLayerMap.end() )
207 p.layers.set( it->second );
208 }
209 }
210
211 if( preset.contains( "colors" ) && preset.at( "colors" ).is_array() )
212 {
213 for( const nlohmann::json& entry : preset.at( "colors" ) )
214 {
215 if( entry.contains( "layer" ) && entry.contains( "color" )
216 && entry.at( "layer" ).is_string() )
217 {
218 auto it = m_layerNameToLayerMap.find( entry.at( "layer" ).get<wxString>() );
219
220 if( it != m_layerNameToLayerMap.end() )
221 p.colors[it->second] = entry.at( "color" ).get<COLOR4D>();
222 }
223 }
224 }
225
226 m_presets->emplace_back( p );
227 }
228 }
229}
230
231
234
235
238 m_Render(),
239 m_Camera()
240{
241 m_params.emplace_back( new PARAM<bool>( "aui.show_layer_manager",
242 &m_AuiPanels.show_layer_manager, true ) );
243
244 m_params.emplace_back( new PARAM<int>( "aui.right_panel_width",
245 &m_AuiPanels.right_panel_width, -1 ) );
246
247 m_params.emplace_back( new PARAM_ENUM<RENDER_ENGINE>( "render.engine", &m_Render.engine,
251
252 m_params.emplace_back( new PARAM_ENUM<GRID3D_TYPE>( "render.grid_type", &m_Render.grid_type,
256
257 m_params.emplace_back( new PARAM_ENUM<MATERIAL_MODE>( "render.material_mode",
258 &m_Render.material_mode,
262
263 m_params.emplace_back( new PARAM_ENUM<ANTIALIASING_MODE>( "render.opengl_AA_mode",
264 &m_Render.opengl_AA_mode,
268
269 m_params.emplace_back( new PARAM<COLOR4D>( "render.opengl_selection_color",
270 &m_Render.opengl_selection_color,
271 COLOR4D( 0.0, 1.0, 0.0, 1.0 ) ) );
272
273 // OpenGL options
274 m_params.emplace_back( new PARAM<bool>( "render.opengl_copper_thickness",
275 &m_Render.opengl_copper_thickness, false ) );
276 m_params.emplace_back( new PARAM<bool>( "render.opengl_show_model_bbox",
277 &m_Render.show_model_bbox, false ) );
278 m_params.emplace_back( new PARAM<bool>( "render.opengl_show_off_board_silk",
279 &m_Render.show_off_board_silk, false ) );
280 m_params.emplace_back( new PARAM<bool>( "render.opengl_highlight_on_rollover",
281 &m_Render.highlight_on_rollover, true ) );
282 m_params.emplace_back( new PARAM<bool>( "render.opengl_AA_disableOnMove",
283 &m_Render.opengl_AA_disableOnMove, false ) );
284 m_params.emplace_back( new PARAM<bool>( "render.opengl_thickness_disableOnMove",
285 &m_Render.opengl_thickness_disableOnMove, false ) );
286 m_params.emplace_back( new PARAM<bool>( "render.opengl_vias_disableOnMove",
287 &m_Render.opengl_microvias_disableOnMove, false ) );
288 m_params.emplace_back( new PARAM<bool>( "render.opengl_holes_disableOnMove",
289 &m_Render.opengl_holes_disableOnMove, false ) );
290 m_params.emplace_back( new PARAM<bool>( "render.opengl_render_bbox_only_OnMove",
291 &m_Render.opengl_render_bbox_only_OnMove, false ) );
292
293 // Raytracing options
294 m_params.emplace_back( new PARAM<bool>( "render.raytrace_anti_aliasing",
295 &m_Render.raytrace_anti_aliasing, true ) );
296 m_params.emplace_back( new PARAM<bool>( "render.raytrace_backfloor",
297 &m_Render.raytrace_backfloor, false ) );
298 m_params.emplace_back( new PARAM<bool>( "render.raytrace_post_processing",
299 &m_Render.raytrace_post_processing, true ) );
300 m_params.emplace_back( new PARAM<bool>( "render.raytrace_procedural_textures",
301 &m_Render.raytrace_procedural_textures, true ) );
302 m_params.emplace_back( new PARAM<bool>( "render.raytrace_reflections",
303 &m_Render.raytrace_reflections, true ) );
304 m_params.emplace_back( new PARAM<bool>( "render.raytrace_refractions",
305 &m_Render.raytrace_refractions, true ) );
306 m_params.emplace_back( new PARAM<bool>( "render.raytrace_shadows",
307 &m_Render.raytrace_shadows, true ) );
308
309 m_params.emplace_back( new PARAM<int>( "render.raytrace_nrsamples_shadows",
310 &m_Render.raytrace_nrsamples_shadows, 3 ) );
311 m_params.emplace_back( new PARAM<int>( "render.raytrace_nrsamples_reflections",
312 &m_Render.raytrace_nrsamples_reflections, 3 ) );
313 m_params.emplace_back( new PARAM<int>( "render.raytrace_nrsamples_refractions",
314 &m_Render.raytrace_nrsamples_refractions, 4 ) );
315
316 m_params.emplace_back( new PARAM<int>( "render.raytrace_recursivelevel_reflections",
317 &m_Render.raytrace_recursivelevel_reflections, 3 ) );
318 m_params.emplace_back( new PARAM<int>( "render.raytrace_recursivelevel_refractions",
319 &m_Render.raytrace_recursivelevel_refractions, 2 ) );
320
321 m_params.emplace_back( new PARAM<float>( "render.raytrace_spread_shadows",
322 &m_Render.raytrace_spread_shadows, 0.05f ) );
323 m_params.emplace_back( new PARAM<float>( "render.raytrace_spread_reflections",
324 &m_Render.raytrace_spread_reflections, 0.025f ) );
325 m_params.emplace_back( new PARAM<float>( "render.raytrace_spread_refractions",
326 &m_Render.raytrace_spread_refractions, 0.025f ) );
327
328 m_params.emplace_back( new PARAM<COLOR4D>( "render.raytrace_lightColorCamera",
329 &m_Render.raytrace_lightColorCamera,
330 COLOR4D( 0.2, 0.2, 0.2, 1.0 ) ) );
331
332 m_params.emplace_back( new PARAM<COLOR4D>( "render.raytrace_lightColorTop",
333 &m_Render.raytrace_lightColorTop,
334 COLOR4D( 0.247, 0.247, 0.247, 1.0 ) ) );
335
336 m_params.emplace_back( new PARAM<COLOR4D>( "render.raytrace_lightColorBottom",
337 &m_Render.raytrace_lightColorBottom,
338 COLOR4D( 0.247, 0.247, 0.247, 1.0 ) ) );
339
340 std::vector<COLOR4D> default_colors =
341 {
342 COLOR4D( 0.168, 0.168, 0.168, 1.0 ),
343 COLOR4D( 0.168, 0.168, 0.168, 1.0 ),
344 COLOR4D( 0.168, 0.168, 0.168, 1.0 ),
345 COLOR4D( 0.168, 0.168, 0.168, 1.0 ),
346 COLOR4D( 0.168, 0.168, 0.168, 1.0 ),
347 COLOR4D( 0.168, 0.168, 0.168, 1.0 ),
348 COLOR4D( 0.168, 0.168, 0.168, 1.0 ),
349 COLOR4D( 0.168, 0.168, 0.168, 1.0 )
350 };
351
352 m_params.emplace_back( new PARAM_LIST<COLOR4D>( "render.raytrace_lightColor",
353 &m_Render.raytrace_lightColor,
354 std::move( default_colors ) ) );
355
356 const std::vector<int> default_elevation =
357 {
358 67, 67, 67, 67, -67, -67, -67, -67,
359 };
360
361 m_params.emplace_back( new PARAM_LIST<int>( "render.raytrace_lightElevation",
362 &m_Render.raytrace_lightElevation,
363 std::move( default_elevation ) ) );
364
365 const std::vector<int> default_azimuth =
366 {
367 45, 135, 225, 315, 45, 135, 225, 315,
368 };
369
370 m_params.emplace_back( new PARAM_LIST<int>( "render.raytrace_lightAzimuth",
371 &m_Render.raytrace_lightAzimuth,
372 std::move( default_azimuth ) ) );
373
374 m_params.emplace_back( new PARAM<bool>( "render.show_adhesive",
375 &m_Render.show_adhesive, true ) );
376 m_params.emplace_back( new PARAM<bool>( "render.show_navigator",
377 &m_Render.show_navigator, true ) );
378 m_params.emplace_back( new PARAM<bool>( "render.show_board_body",
379 &m_Render.show_board_body, true ) );
380 m_params.emplace_back( new PARAM<bool>( "render.show_plated_barrels",
381 &m_Render.show_plated_barrels, true ) );
382 m_params.emplace_back( new PARAM<bool>( "render.show_comments",
383 &m_Render.show_comments, true ) );
384 m_params.emplace_back( new PARAM<bool>( "render.show_drawings",
385 &m_Render.show_drawings, true ) );
386 m_params.emplace_back( new PARAM<bool>( "render.show_eco1",
387 &m_Render.show_eco1, true ) );
388 m_params.emplace_back( new PARAM<bool>( "render.show_eco2",
389 &m_Render.show_eco2, true ) );
390 m_params.emplace_back( new PARAM<bool>( "render.show_f_fab",
391 &m_Render.show_f_fab, false ) );
392 m_params.emplace_back( new PARAM<bool>( "render.show_b_fab",
393 &m_Render.show_b_fab, false ) );
394 m_params.emplace_back( new PARAM<bool>( "render.show_f_courtyard",
395 &m_Render.show_f_courtyard, false ) );
396 m_params.emplace_back( new PARAM<bool>( "render.show_b_courtyard",
397 &m_Render.show_b_courtyard, false ) );
398
399 for( int layer = 0; layer < 45; ++layer )
400 {
401 m_params.emplace_back( new PARAM<bool>( fmt::format( "render.show_user{}", layer + 1 ),
402 &m_Render.show_user[layer], false ) );
403 }
404
405 m_params.emplace_back( new PARAM<bool>( "render.show_footprints_insert",
406 &m_Render.show_footprints_insert, true ) );
407 m_params.emplace_back( new PARAM<bool>( "render.show_footprints_normal",
408 &m_Render.show_footprints_normal, true ) );
409 m_params.emplace_back( new PARAM<bool>( "render.show_footprints_virtual",
410 &m_Render.show_footprints_virtual, true ) );
411 m_params.emplace_back( new PARAM<bool>( "render.show_footprints_not_in_posfile",
412 &m_Render.show_footprints_not_in_posfile, true ) );
413 m_params.emplace_back( new PARAM<bool>( "render.show_footprints_dnp",
414 &m_Render.show_footprints_dnp, false ) );
415 m_params.emplace_back( new PARAM<bool>( "render.show_silkscreen_top",
416 &m_Render.show_silkscreen_top, true ) );
417 m_params.emplace_back( new PARAM<bool>( "render.show_silkscreen_bottom",
418 &m_Render.show_silkscreen_bottom, true ) );
419 m_params.emplace_back( new PARAM<bool>( "render.show_soldermask_top",
420 &m_Render.show_soldermask_top, true ) );
421 m_params.emplace_back( new PARAM<bool>( "render.show_soldermask_bottom",
422 &m_Render.show_soldermask_bottom, true ) );
423 m_params.emplace_back( new PARAM<bool>( "render.show_solderpaste",
424 &m_Render.show_solderpaste, true ) );
425 m_params.emplace_back( new PARAM<bool>( "render.show_copper_top",
426 &m_Render.show_copper_bottom, true ) );
427 m_params.emplace_back( new PARAM<bool>( "render.show_copper_bottom",
428 &m_Render.show_copper_top, true ) );
429 m_params.emplace_back( new PARAM<bool>( "render.show_zones",
430 &m_Render.show_zones, true ) );
431 m_params.emplace_back( new PARAM<bool>( "render.show_fp_references",
432 &m_Render.show_fp_references, true ) );
433 m_params.emplace_back( new PARAM<bool>( "render.show_fp_values",
434 &m_Render.show_fp_values, true ) );
435 m_params.emplace_back( new PARAM<bool>( "render.show_fp_text",
436 &m_Render.show_fp_text, true ) );
437 m_params.emplace_back( new PARAM<bool>( "render.subtract_mask_from_silk",
438 &m_Render.subtract_mask_from_silk, false ) );
439 m_params.emplace_back( new PARAM<bool>( "render.clip_silk_on_via_annulus",
440 &m_Render.clip_silk_on_via_annuli, false ) );
441 m_params.emplace_back( new PARAM<bool>( "render.plated_and_bare_copper",
442 &m_Render.differentiate_plated_copper, false ) );
443 m_params.emplace_back( new PARAM<bool>( "render.use_board_editor_copper_colors",
444 &m_Render.use_board_editor_copper_colors, false ) );
445 m_params.emplace_back( new PARAM<bool>( "render.preview_show_board_body",
446 &m_Render.preview_show_board_body, true ) );
447 m_params.emplace_back( new PARAM<bool>( "render.show_missing_models", &m_Render.show_missing_models, false ) );
448 m_params.emplace_back( new PARAM<bool>( "camera.animation_enabled",
449 &m_Camera.animation_enabled, true ) );
450 m_params.emplace_back( new PARAM<int>( "camera.moving_speed_multiplier",
451 &m_Camera.moving_speed_multiplier, 3 ) );
452 m_params.emplace_back( new PARAM<double>( "camera.rotation_increment",
453 &m_Camera.rotation_increment, 10.0 ) );
454 m_params.emplace_back( new PARAM<int>( "camera.projection_mode",
455 &m_Camera.projection_mode, 1 ) );
456
457 m_params.emplace_back( new PARAM<int>( "export_image.width", &m_ExportImage.width, 0 ) );
458 m_params.emplace_back( new PARAM<int>( "export_image.height", &m_ExportImage.height, 0 ) );
459 m_params.emplace_back( new PARAM<double>( "export_image.x_resolution", &m_ExportImage.x_resolution, 300.0 ) );
460 m_params.emplace_back( new PARAM<double>( "export_image.y_resolution", &m_ExportImage.y_resolution, 300.0 ) );
461 m_params.emplace_back( new PARAM<int>( "export_image.size_units", &m_ExportImage.size_units, 0 ) );
462 m_params.emplace_back( new PARAM<int>( "export_image.resolution_units", &m_ExportImage.resolution_units, 0 ) );
463 m_params.emplace_back(
464 new PARAM<bool>( "export_image.lock_aspect_ratio", &m_ExportImage.lock_aspect_ratio, true ) );
465
466 m_params.emplace_back( new PARAM<bool>( "use_stackup_colors",
467 &m_UseStackupColors, true ) );
468 m_params.emplace_back( new PARAM_LAYER_PRESET_3D( "layer_presets",
469 &m_LayerPresets ) );
470 m_params.emplace_back( new PARAM<wxString>( "current_layer_preset",
472
474
475 registerMigration( 1, 2,
476 [&]() -> bool
477 {
478 Set( "render.opengl_copper_thickness", false );
479 return true;
480 } );
481
482 registerMigration( 2, 3,
483 [&]() -> bool
484 {
485 if( std::optional<bool> optval = Get<bool>( "render.show_copper" ) )
486 {
487 Set( "render.show_copper_top", *optval );
488 Set( "render.show_copper_bottom", *optval );
489 }
490
491 if( std::optional<bool> optval = Get<bool>( "render.show_silkscreen" ) )
492 {
493 Set( "render.show_silkscreen_top", *optval );
494 Set( "render.show_silkscreen_bottom", *optval );
495 }
496
497 if( std::optional<bool> optval = Get<bool>( "render.show_soldermask" ) )
498 {
499 Set( "render.show_soldermask_top", *optval );
500 Set( "render.show_soldermask_bottom", *optval );
501 }
502
503 if( std::optional<bool> optval = Get<bool>( "render.show_comments" ) )
504 Set( "render.show_drawings", *optval );
505
506 if( std::optional<bool> optval = Get<bool>( "render.show_eco" ) )
507 {
508 Set( "render.show_eco1", *optval );
509 Set( "render.show_eco2", *optval );
510 }
511
512 return true;
513 } );
514
515 registerMigration( 3, 4,
516 [&]() -> bool
517 {
518 std::map<int, wxString> legacyColorMap;
519
520 legacyColorMap[142] = "fp_values";
521 legacyColorMap[143] = "fp_references";
522 legacyColorMap[130] = "fp_text";
523 legacyColorMap[466] = "background_bottom";
524 legacyColorMap[467] = "background_top";
525 legacyColorMap[468] = "board";
526 legacyColorMap[469] = "copper";
527 legacyColorMap[470] = "copper_bottom";
528 legacyColorMap[471] = "silkscreen_bottom";
529 legacyColorMap[472] = "silkscreen_top";
530 legacyColorMap[473] = "soldermask_bottom";
531 legacyColorMap[474] = "soldermask_top";
532 legacyColorMap[475] = "solderpaste";
533 legacyColorMap[476] = "adhesive";
534 legacyColorMap[477] = "user_comments";
535 legacyColorMap[478] = "user_drawings";
536 legacyColorMap[479] = "user_eco1";
537 legacyColorMap[480] = "user_eco2";
538 legacyColorMap[481] = "th_models";
539 legacyColorMap[482] = "smd_models";
540 legacyColorMap[483] = "virtual_models";
541 legacyColorMap[484] = "non_pos_file_models";
542 legacyColorMap[485] = "dnp_models";
543 legacyColorMap[486] = "3d_navigator";
544 legacyColorMap[487] = "bounding_boxes";
545 legacyColorMap[488] = "off_board_silk";
546
547 if( !Contains( "layer_presets" ) || !At( "layer_presets" ).is_array() )
548 return true;
549
550 for( nlohmann::json& preset : At( "layer_presets" ) )
551 {
552 if( preset.contains( "colors" ) && preset.at( "colors" ).is_array() )
553 {
554 for( nlohmann::json& color : preset.at( "colors" ) )
555 {
556 if( color.contains( "layer" ) && color.at( "layer" ).is_number_integer() )
557 color["layer"] = legacyColorMap[color["layer"].get<int>()];
558 }
559 }
560
561 if( preset.contains( "layers" ) && preset.at( "layers" ).is_array() )
562 {
563 nlohmann::json mappedLayers = nlohmann::json::array();
564
565 for( const nlohmann::json& layer : preset.at( "layers" ) )
566 {
567 if( layer.is_number_integer() )
568 mappedLayers.push_back( legacyColorMap[layer.get<int>()] );
569 }
570
571 preset["layers"] = mappedLayers;
572 }
573 }
574
575 return true;
576 } );
577}
578
579
581{
582 for( LAYER_PRESET_3D& preset : m_LayerPresets )
583 {
584 if( preset.name == aName )
585 return &preset;
586 }
587
588 return nullptr;
589}
590
591
593{
599 try
600 {
601 if( m_internals->contains( "colors" ) )
602 m_internals->erase( "colors" );
603 }
604 catch( ... )
605 {
606 }
607
608 return true;
609}
610
611
613{
614 bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg );
615
616 ret &= fromLegacy<int>( aCfg, "RenderEngine", "render.engine" );
617 ret &= fromLegacy<int>( aCfg, "ShowGrid3D", "render.grid_type" );
618 ret &= fromLegacy<int>( aCfg, "Render_Material", "render.material_mode" );
619 ret &= fromLegacy<bool>( aCfg, "Render_OGL_ShowCopperThickness",
620 "render.opengl_copper_thickness" );
621 ret &= fromLegacy<bool>( aCfg, "Render_OGL_ShowModelBoudingBoxes",
622 "render.opengl_show_model_bbox" );
623 ret &= fromLegacy<bool>( aCfg, "Render_RAY_AntiAliasing", "render.raytrace_anti_aliasing" );
624 ret &= fromLegacy<bool>( aCfg, "Render_RAY_Backfloor", "render.raytrace_backfloor" );
625 ret &= fromLegacy<bool>( aCfg, "Render_RAY_PostProcess", "render.raytrace_post_processing" );
626 ret &= fromLegacy<bool>( aCfg, "Render_RAY_ProceduralTextures",
627 "render.raytrace_procedural_textures" );
628 ret &= fromLegacy<bool>( aCfg, "Render_RAY_Reflections", "render.raytrace_reflections" );
629 ret &= fromLegacy<bool>( aCfg, "Render_RAY_Refractions", "render.raytrace_refractions" );
630 ret &= fromLegacy<bool>( aCfg, "Render_RAY_Shadows", "render.raytrace_shadows" );
631 ret &= fromLegacy<bool>( aCfg, "ShowRealisticMode", "render.realistic" );
632 ret &= fromLegacy<bool>( aCfg, "ShowAdhesiveLayers", "render.show_adhesive" );
633 ret &= fromLegacy<bool>( aCfg, "ShowNavigator", "render.show_navigator" );
634 ret &= fromLegacy<bool>( aCfg, "ShowBoardBody", "render.show_board_body" );
635 ret &= fromLegacy<bool>( aCfg, "ShowCommentsLayers", "render.show_comments" );
636 ret &= fromLegacy<bool>( aCfg, "ShowEcoLayers", "render.show_eco" );
637 ret &= fromLegacy<bool>( aCfg, "ShowFootprints_Insert", "render.show_footprints_insert" );
638 ret &= fromLegacy<bool>( aCfg, "ShowFootprints_Normal", "render.show_footprints_normal" );
639 ret &= fromLegacy<bool>( aCfg, "ShowFootprints_Virtual", "render.show_footprints_virtual" );
640 ret &= fromLegacy<bool>( aCfg, "ShowSilkScreenLayers", "render.show_silkscreen" );
641 ret &= fromLegacy<bool>( aCfg, "ShowSolderMasLayers", "render.show_soldermask" );
642 ret &= fromLegacy<bool>( aCfg, "ShowSolderPasteLayers", "render.show_solderpaste" );
643 ret &= fromLegacy<bool>( aCfg, "ShowZones", "render.show_zones" );
644 ret &= fromLegacy<bool>( aCfg, "SubtractMaskFromSilk", "render.subtract_mask_from_silk" );
645
646 auto do_color =
647 [&] ( const std::string& key_r, const std::string& key_g, const std::string& key_b,
648 std::string key_dest, double alpha = 1.0 )
649 {
650 COLOR4D color( 1, 1, 1, alpha );
651
652 if( aCfg->Read( key_r, &color.r )
653 && aCfg->Read( key_g, &color.g )
654 && aCfg->Read( key_b, &color.b ) )
655 {
656 Set( key_dest, color );
657 }
658 };
659
660 do_color( "BgColor_Red", "BgColor_Green", "BgColor_Blue", "colors.background_bottom" );
661 do_color( "BgColor_Red_Top", "BgColor_Green_Top", "BgColor_Blue_Top", "colors.background_top" );
662 do_color( "BoardBodyColor_Red", "BoardBodyColor_Green", "BoardBodyColor_Blue", "colors.board" );
663 do_color( "CopperColor_Red", "CopperColor_Green", "CopperColor_Blue", "colors.copper" );
664 do_color( "SilkColor_Red", "SilkColor_Green", "SilkColor_Blue", "colors.silkscreen_bottom" );
665 do_color( "SilkColor_Red", "SilkColor_Green", "SilkColor_Blue", "colors.silkscreen_top" );
666 do_color( "SMaskColor_Red", "SMaskColor_Green", "SMaskColor_Blue", "colors.soldermask", 0.83 );
667 do_color( "SPasteColor_Red", "SPasteColor_Green", "SPasteColor_Blue", "colors.solderpaste" );
668
669 return ret;
670}
declared enumerations and flags
@ NORMAL
Use all material properties from model file.
Definition 3d_enums.h:68
@ CAD_MODE
Use a gray shading based on diffuse material.
Definition 3d_enums.h:70
const char * name
APP_SETTINGS_BASE(const std::string &aFilename, int aSchemaVersion)
virtual bool MigrateFromLegacy(wxConfigBase *aCfg) override
Migrates from wxConfig to JSON-based configuration.
static KIGFX::COLOR4D g_DefaultComments
static KIGFX::COLOR4D g_DefaultBoardBody
static KIGFX::COLOR4D g_DefaultFabColor
static KIGFX::COLOR4D g_DefaultSolderMask
static KIGFX::COLOR4D g_DefaultECOs
static KIGFX::COLOR4D g_DefaultBackgroundTop
static KIGFX::COLOR4D g_DefaultSurfaceFinish
static KIGFX::COLOR4D g_DefaultSolderPaste
static KIGFX::COLOR4D g_DefaultCourtyardColor
static KIGFX::COLOR4D g_DefaultSilkscreen
static KIGFX::COLOR4D g_DefaultBackgroundBot
virtual bool MigrateFromLegacy(wxConfigBase *aLegacyConfig) override
Migrates from wxConfig to JSON-based configuration.
EXPORT_IMAGE_SETTINGS m_ExportImage
LAYER_PRESET_3D * FindPreset(const wxString &aName)
std::vector< LAYER_PRESET_3D > m_LayerPresets
bool fromLegacy(wxConfigBase *aConfig, const std::string &aKey, const std::string &aDest)
Translates a legacy wxConfig value to a given JSON pointer value.
void Set(const std::string &aPath, ValueType aVal)
Stores a value into the JSON document Will throw an exception if ValueType isn't something that the l...
bool Contains(const std::string &aPath) const
std::optional< ValueType > Get(const std::string &aPath) const
Fetches a value from within the JSON document.
std::vector< PARAM_BASE * > m_params
The list of parameters (owned by this object)
void registerMigration(int aOldSchemaVersion, int aNewSchemaVersion, std::function< bool(void)> aMigrator)
Registers a migration from one schema version to another.
nlohmann::json & At(const std::string &aPath)
Wrappers for the underlying JSON API so that most consumers don't need json.hpp All of these function...
std::unique_ptr< JSON_SETTINGS_INTERNALS > m_internals
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
double r
Red component.
Definition color4d.h:390
double g
Green component.
Definition color4d.h:391
double b
Blue component.
Definition color4d.h:392
Stores an enum as an integer.
Definition parameters.h:232
PARAM_LAMBDA(const std::string &aJsonPath, std::function< nlohmann::json()> aGetter, std::function< void(nlohmann::json)> aSetter, nlohmann::json aDefault, bool aReadOnly=false)
Definition parameters.h:301
std::vector< LAYER_PRESET_3D > * m_presets
void jsonToPresets(const nlohmann::json &aJson)
PARAM_LAYER_PRESET_3D(const std::string &aPath, std::vector< LAYER_PRESET_3D > *aPresetList)
std::map< int, wxString > m_layerToLayerNameMap
std::map< wxString, int > m_layerNameToLayerMap
const int viewer3dSchemaVersion
! Update the schema version whenever a migration is required
#define LAYER(n, l)
#define LEGACY_PRESET_FLAG
nlohmann::json json
Definition gerbview.cpp:50
@ LAYER_3D_USER_1
Definition layer_ids.h:593
@ LAYER_3D_SOLDERMASK_TOP
Definition layer_ids.h:582
@ LAYER_3D_NAVIGATOR
Definition layer_ids.h:643
@ LAYER_3D_BOUNDING_BOXES
Definition layer_ids.h:644
@ LAYER_3D_ADHESIVE
Definition layer_ids.h:584
@ LAYER_3D_SMD_MODELS
Definition layer_ids.h:639
@ LAYER_3D_BACKGROUND_TOP
Definition layer_ids.h:575
@ LAYER_3D_USER_COMMENTS
Definition layer_ids.h:585
@ LAYER_3D_SOLDERMASK_BOTTOM
Definition layer_ids.h:581
@ LAYER_3D_BOARD
Definition layer_ids.h:576
@ LAYER_3D_PLATED_BARRELS
Definition layer_ids.h:646
@ LAYER_3D_USER_ECO1
Definition layer_ids.h:587
@ LAYER_3D_USER_ECO2
Definition layer_ids.h:588
@ LAYER_3D_TH_MODELS
Definition layer_ids.h:638
@ LAYER_3D_B_FAB
Definition layer_ids.h:590
@ LAYER_3D_SILKSCREEN_TOP
Definition layer_ids.h:580
@ LAYER_3D_B_COURTYARD
Definition layer_ids.h:592
@ LAYER_3D_VIRTUAL_MODELS
Definition layer_ids.h:640
@ LAYER_3D_MODELS_MARKED_DNP
Definition layer_ids.h:642
@ LAYER_3D_COPPER_TOP
Definition layer_ids.h:577
@ LAYER_3D_SOLDERPASTE
Definition layer_ids.h:583
@ LAYER_3D_OFF_BOARD_SILK
Definition layer_ids.h:645
@ LAYER_3D_MODELS_NOT_IN_POS
Definition layer_ids.h:641
@ LAYER_3D_USER_45
Definition layer_ids.h:637
@ LAYER_3D_USER_DRAWINGS
Definition layer_ids.h:586
@ LAYER_3D_COPPER_BOTTOM
Definition layer_ids.h:578
@ LAYER_3D_BACKGROUND_BOTTOM
Definition layer_ids.h:574
@ LAYER_3D_SILKSCREEN_BOTTOM
Definition layer_ids.h:579
@ LAYER_3D_F_COURTYARD
Definition layer_ids.h:591
@ LAYER_3D_END
Definition layer_ids.h:648
@ LAYER_3D_F_FAB
Definition layer_ids.h:589
@ LAYER_GRID_AXES
Definition layer_ids.h:251
@ LAYER_FP_REFERENCES
Show footprints references (when texts are visible).
Definition layer_ids.h:262
@ LAYER_FP_TEXT
Definition layer_ids.h:236
@ LAYER_FP_VALUES
Show footprints values (when texts are visible).
Definition layer_ids.h:259
STL namespace.
Declaration of the cogl_att_list class.
wxString name
A name for this layer set.
LAYER_PRESET_3D(const wxString &aName=wxEmptyString)
std::bitset< LAYER_3D_END > layers
std::map< int, KIGFX::COLOR4D > colors