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()
80}
81
82
84 std::vector<LAYER_PRESET_3D>* aPresetList ) :
85 PARAM_LAMBDA<nlohmann::json>( aPath,
87 std::bind( &PARAM_LAYER_PRESET_3D::jsonToPresets, this, _1 ),
88 {} ),
89 m_presets( aPresetList )
90{
91 wxASSERT( aPresetList );
92
93#define LAYER( n, l ) m_layerToLayerNameMap[l] = n; m_layerNameToLayerMap[n] = l;
94
95 LAYER( "fp_values", LAYER_FP_VALUES );
96 LAYER( "fp_references", LAYER_FP_REFERENCES );
97 LAYER( "fp_text", LAYER_FP_TEXT );
98 LAYER( "background_bottom", LAYER_3D_BACKGROUND_BOTTOM );
99 LAYER( "background_top", LAYER_3D_BACKGROUND_TOP );
100 LAYER( "board", LAYER_3D_BOARD );
101 LAYER( "plated_barrels", LAYER_3D_PLATED_BARRELS );
102 LAYER( "copper", LAYER_3D_COPPER_TOP );
103 LAYER( "copper_bottom", LAYER_3D_COPPER_BOTTOM );
104 LAYER( "silkscreen_bottom", LAYER_3D_SILKSCREEN_BOTTOM );
105 LAYER( "silkscreen_top", LAYER_3D_SILKSCREEN_TOP );
106 LAYER( "soldermask_bottom", LAYER_3D_SOLDERMASK_BOTTOM );
107 LAYER( "soldermask_top", LAYER_3D_SOLDERMASK_TOP );
108 LAYER( "solderpaste", LAYER_3D_SOLDERPASTE );
109 LAYER( "adhesive", LAYER_3D_ADHESIVE );
110 LAYER( "user_comments", LAYER_3D_USER_COMMENTS );
111 LAYER( "user_drawings", LAYER_3D_USER_DRAWINGS );
112 LAYER( "user_eco1", LAYER_3D_USER_ECO1 );
113 LAYER( "user_eco2", LAYER_3D_USER_ECO2 );
114 LAYER( "f_fab", LAYER_3D_F_FAB );
115 LAYER( "b_fab", LAYER_3D_B_FAB );
116 LAYER( "f_courtyard", LAYER_3D_F_COURTYARD );
117 LAYER( "b_courtyard", LAYER_3D_B_COURTYARD );
118 LAYER( "3d_navigator", LAYER_3D_NAVIGATOR );
119 LAYER( "th_models", LAYER_3D_TH_MODELS );
120 LAYER( "smd_models", LAYER_3D_SMD_MODELS );
121 LAYER( "virtual_models", LAYER_3D_VIRTUAL_MODELS );
122 LAYER( "non_pos_file_models", LAYER_3D_MODELS_NOT_IN_POS );
123 LAYER( "dnp_models", LAYER_3D_MODELS_MARKED_DNP );
124 LAYER( "bounding_boxes", LAYER_3D_BOUNDING_BOXES );
125 LAYER( "off_board_silk", LAYER_3D_OFF_BOARD_SILK );
126 LAYER( "3d_axes", LAYER_GRID_AXES );
127
128 for( int layer = LAYER_3D_USER_1; layer <= LAYER_3D_USER_45; ++layer )
129 {
130 wxString name = wxString::Format( wxS( "user_%d" ), layer - LAYER_3D_USER_1 + 1 );
131 m_layerToLayerNameMap[layer] = name;
132 m_layerNameToLayerMap[name] = layer;
133 }
134}
135
136
138{
139 nlohmann::json ret = nlohmann::json::array();
140
141 for( const LAYER_PRESET_3D& preset : *m_presets )
142 {
143 nlohmann::json js = {
144 { "name", preset.name }
145 };
146
147 nlohmann::json layers = nlohmann::json::array();
148
149 for( int layer = 0; layer < LAYER_3D_END; ++layer )
150 {
151 if( !preset.layers.test( layer ) )
152 continue;
153
154 if( auto it = m_layerToLayerNameMap.find( layer ); it != m_layerToLayerNameMap.end() )
155 layers.push_back( it->second );
156 }
157
158 js["layers"] = layers;
159
160 nlohmann::json colors = nlohmann::json::array();
161
162 for( const auto& [ layer, color ] : preset.colors )
163 {
164 auto it = m_layerToLayerNameMap.find( layer );
165
166 if( it == m_layerToLayerNameMap.end() )
167 continue;
168
169 nlohmann::json layerColor = { { "layer", it->second }, { "color", color.ToCSSString() } };
170
171 colors.push_back( layerColor );
172 }
173
174 js["colors"] = colors;
175
176 ret.push_back( js );
177 }
178
179 return ret;
180}
181
182
183void PARAM_LAYER_PRESET_3D::jsonToPresets( const nlohmann::json& aJson )
184{
185 if( aJson.empty() || !aJson.is_array() )
186 return;
187
188 m_presets->clear();
189
190 for( const nlohmann::json& preset : aJson )
191 {
192 if( preset.contains( "name" ) )
193 {
194 LAYER_PRESET_3D p( preset.at( "name" ).get<wxString>() );
195
196 if( preset.contains( "layers" ) && preset.at( "layers" ).is_array() )
197 {
198 p.layers.reset();
199
200 for( const nlohmann::json& layer : preset.at( "layers" ) )
201 {
202 if( !layer.is_string() )
203 continue;
204
205 auto it = m_layerNameToLayerMap.find( layer.get<wxString>() );
206
207 if( it != m_layerNameToLayerMap.end() )
208 p.layers.set( it->second );
209 }
210 }
211
212 if( preset.contains( "colors" ) && preset.at( "colors" ).is_array() )
213 {
214 for( const nlohmann::json& entry : preset.at( "colors" ) )
215 {
216 if( entry.contains( "layer" ) && entry.contains( "color" )
217 && entry.at( "layer" ).is_string() )
218 {
219 auto it = m_layerNameToLayerMap.find( entry.at( "layer" ).get<wxString>() );
220
221 if( it != m_layerNameToLayerMap.end() )
222 p.colors[it->second] = entry.at( "color" ).get<COLOR4D>();
223 }
224 }
225 }
226
227 m_presets->emplace_back( p );
228 }
229 }
230}
231
232
235
236
239 m_Render(),
240 m_Camera()
241{
242 m_params.emplace_back( new PARAM<bool>( "aui.show_layer_manager",
243 &m_AuiPanels.show_layer_manager, true ) );
244
245 m_params.emplace_back( new PARAM<int>( "aui.right_panel_width",
246 &m_AuiPanels.right_panel_width, -1 ) );
247
248 m_params.emplace_back( new PARAM_ENUM<RENDER_ENGINE>( "render.engine", &m_Render.engine,
252
253 m_params.emplace_back( new PARAM_ENUM<GRID3D_TYPE>( "render.grid_type", &m_Render.grid_type,
257
258 m_params.emplace_back( new PARAM_ENUM<MATERIAL_MODE>( "render.material_mode",
259 &m_Render.material_mode,
263
264 m_params.emplace_back( new PARAM_ENUM<ANTIALIASING_MODE>( "render.opengl_AA_mode",
265 &m_Render.opengl_AA_mode,
269
270 m_params.emplace_back( new PARAM<COLOR4D>( "render.opengl_selection_color",
271 &m_Render.opengl_selection_color,
272 COLOR4D( 0.0, 1.0, 0.0, 1.0 ) ) );
273
274 // OpenGL options
275 m_params.emplace_back( new PARAM<bool>( "render.opengl_copper_thickness",
276 &m_Render.opengl_copper_thickness, false ) );
277 m_params.emplace_back( new PARAM<bool>( "render.opengl_show_model_bbox",
278 &m_Render.show_model_bbox, false ) );
279 m_params.emplace_back( new PARAM<bool>( "render.opengl_show_off_board_silk",
280 &m_Render.show_off_board_silk, false ) );
281 m_params.emplace_back( new PARAM<bool>( "render.opengl_highlight_on_rollover",
282 &m_Render.highlight_on_rollover, true ) );
283 m_params.emplace_back( new PARAM<bool>( "render.opengl_AA_disableOnMove",
284 &m_Render.opengl_AA_disableOnMove, false ) );
285 m_params.emplace_back( new PARAM<bool>( "render.opengl_thickness_disableOnMove",
286 &m_Render.opengl_thickness_disableOnMove, false ) );
287 m_params.emplace_back( new PARAM<bool>( "render.opengl_vias_disableOnMove",
288 &m_Render.opengl_microvias_disableOnMove, false ) );
289 m_params.emplace_back( new PARAM<bool>( "render.opengl_holes_disableOnMove",
290 &m_Render.opengl_holes_disableOnMove, false ) );
291 m_params.emplace_back( new PARAM<bool>( "render.opengl_render_bbox_only_OnMove",
292 &m_Render.opengl_render_bbox_only_OnMove, false ) );
293
294 // Raytracing options
295 m_params.emplace_back( new PARAM<bool>( "render.raytrace_anti_aliasing",
296 &m_Render.raytrace_anti_aliasing, true ) );
297 m_params.emplace_back( new PARAM<bool>( "render.raytrace_backfloor",
298 &m_Render.raytrace_backfloor, false ) );
299 m_params.emplace_back( new PARAM<bool>( "render.raytrace_post_processing",
300 &m_Render.raytrace_post_processing, true ) );
301 m_params.emplace_back( new PARAM<bool>( "render.raytrace_procedural_textures",
302 &m_Render.raytrace_procedural_textures, true ) );
303 m_params.emplace_back( new PARAM<bool>( "render.raytrace_reflections",
304 &m_Render.raytrace_reflections, true ) );
305 m_params.emplace_back( new PARAM<bool>( "render.raytrace_refractions",
306 &m_Render.raytrace_refractions, true ) );
307 m_params.emplace_back( new PARAM<bool>( "render.raytrace_shadows",
308 &m_Render.raytrace_shadows, true ) );
309
310 m_params.emplace_back( new PARAM<int>( "render.raytrace_nrsamples_shadows",
311 &m_Render.raytrace_nrsamples_shadows, 3 ) );
312 m_params.emplace_back( new PARAM<int>( "render.raytrace_nrsamples_reflections",
313 &m_Render.raytrace_nrsamples_reflections, 3 ) );
314 m_params.emplace_back( new PARAM<int>( "render.raytrace_nrsamples_refractions",
315 &m_Render.raytrace_nrsamples_refractions, 4 ) );
316
317 m_params.emplace_back( new PARAM<int>( "render.raytrace_recursivelevel_reflections",
318 &m_Render.raytrace_recursivelevel_reflections, 3 ) );
319 m_params.emplace_back( new PARAM<int>( "render.raytrace_recursivelevel_refractions",
320 &m_Render.raytrace_recursivelevel_refractions, 2 ) );
321
322 m_params.emplace_back( new PARAM<float>( "render.raytrace_spread_shadows",
323 &m_Render.raytrace_spread_shadows, 0.05f ) );
324 m_params.emplace_back( new PARAM<float>( "render.raytrace_spread_reflections",
325 &m_Render.raytrace_spread_reflections, 0.025f ) );
326 m_params.emplace_back( new PARAM<float>( "render.raytrace_spread_refractions",
327 &m_Render.raytrace_spread_refractions, 0.025f ) );
328
329 m_params.emplace_back( new PARAM<COLOR4D>( "render.raytrace_lightColorCamera",
330 &m_Render.raytrace_lightColorCamera,
331 COLOR4D( 0.2, 0.2, 0.2, 1.0 ) ) );
332
333 m_params.emplace_back( new PARAM<COLOR4D>( "render.raytrace_lightColorTop",
334 &m_Render.raytrace_lightColorTop,
335 COLOR4D( 0.247, 0.247, 0.247, 1.0 ) ) );
336
337 m_params.emplace_back( new PARAM<COLOR4D>( "render.raytrace_lightColorBottom",
338 &m_Render.raytrace_lightColorBottom,
339 COLOR4D( 0.247, 0.247, 0.247, 1.0 ) ) );
340
341 std::vector<COLOR4D> default_colors =
342 {
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 COLOR4D( 0.168, 0.168, 0.168, 1.0 )
351 };
352
353 m_params.emplace_back( new PARAM_LIST<COLOR4D>( "render.raytrace_lightColor",
354 &m_Render.raytrace_lightColor,
355 std::move( default_colors ) ) );
356
357 const std::vector<int> default_elevation =
358 {
359 67, 67, 67, 67, -67, -67, -67, -67,
360 };
361
362 m_params.emplace_back( new PARAM_LIST<int>( "render.raytrace_lightElevation",
363 &m_Render.raytrace_lightElevation,
364 std::move( default_elevation ) ) );
365
366 const std::vector<int> default_azimuth =
367 {
368 45, 135, 225, 315, 45, 135, 225, 315,
369 };
370
371 m_params.emplace_back( new PARAM_LIST<int>( "render.raytrace_lightAzimuth",
372 &m_Render.raytrace_lightAzimuth,
373 std::move( default_azimuth ) ) );
374
375 m_params.emplace_back( new PARAM<bool>( "render.show_adhesive",
376 &m_Render.show_adhesive, true ) );
377 m_params.emplace_back( new PARAM<bool>( "render.show_navigator",
378 &m_Render.show_navigator, true ) );
379 m_params.emplace_back( new PARAM<bool>( "render.show_board_body",
380 &m_Render.show_board_body, true ) );
381 m_params.emplace_back( new PARAM<bool>( "render.show_plated_barrels",
382 &m_Render.show_plated_barrels, true ) );
383 m_params.emplace_back( new PARAM<bool>( "render.show_comments",
384 &m_Render.show_comments, true ) );
385 m_params.emplace_back( new PARAM<bool>( "render.show_drawings",
386 &m_Render.show_drawings, true ) );
387 m_params.emplace_back( new PARAM<bool>( "render.show_eco1",
388 &m_Render.show_eco1, true ) );
389 m_params.emplace_back( new PARAM<bool>( "render.show_eco2",
390 &m_Render.show_eco2, true ) );
391 m_params.emplace_back( new PARAM<bool>( "render.show_f_fab",
392 &m_Render.show_f_fab, false ) );
393 m_params.emplace_back( new PARAM<bool>( "render.show_b_fab",
394 &m_Render.show_b_fab, false ) );
395 m_params.emplace_back( new PARAM<bool>( "render.show_f_courtyard",
396 &m_Render.show_f_courtyard, false ) );
397 m_params.emplace_back( new PARAM<bool>( "render.show_b_courtyard",
398 &m_Render.show_b_courtyard, false ) );
399
400 for( int layer = 0; layer < 45; ++layer )
401 {
402 m_params.emplace_back( new PARAM<bool>( fmt::format( "render.show_user{}", layer + 1 ),
403 &m_Render.show_user[layer], false ) );
404 }
405
406 m_params.emplace_back( new PARAM<bool>( "render.show_footprints_insert",
407 &m_Render.show_footprints_insert, true ) );
408 m_params.emplace_back( new PARAM<bool>( "render.show_footprints_normal",
409 &m_Render.show_footprints_normal, true ) );
410 m_params.emplace_back( new PARAM<bool>( "render.show_footprints_virtual",
411 &m_Render.show_footprints_virtual, true ) );
412 m_params.emplace_back( new PARAM<bool>( "render.show_footprints_not_in_posfile",
413 &m_Render.show_footprints_not_in_posfile, true ) );
414 m_params.emplace_back( new PARAM<bool>( "render.show_footprints_dnp",
415 &m_Render.show_footprints_dnp, false ) );
416 m_params.emplace_back( new PARAM<bool>( "render.show_silkscreen_top",
417 &m_Render.show_silkscreen_top, true ) );
418 m_params.emplace_back( new PARAM<bool>( "render.show_silkscreen_bottom",
419 &m_Render.show_silkscreen_bottom, true ) );
420 m_params.emplace_back( new PARAM<bool>( "render.show_soldermask_top",
421 &m_Render.show_soldermask_top, true ) );
422 m_params.emplace_back( new PARAM<bool>( "render.show_soldermask_bottom",
423 &m_Render.show_soldermask_bottom, true ) );
424 m_params.emplace_back( new PARAM<bool>( "render.show_solderpaste",
425 &m_Render.show_solderpaste, true ) );
426 m_params.emplace_back( new PARAM<bool>( "render.show_copper_top",
427 &m_Render.show_copper_bottom, true ) );
428 m_params.emplace_back( new PARAM<bool>( "render.show_copper_bottom",
429 &m_Render.show_copper_top, true ) );
430 m_params.emplace_back( new PARAM<bool>( "render.show_zones",
431 &m_Render.show_zones, true ) );
432 m_params.emplace_back( new PARAM<bool>( "render.show_fp_references",
433 &m_Render.show_fp_references, true ) );
434 m_params.emplace_back( new PARAM<bool>( "render.show_fp_values",
435 &m_Render.show_fp_values, true ) );
436 m_params.emplace_back( new PARAM<bool>( "render.show_fp_text",
437 &m_Render.show_fp_text, true ) );
438 m_params.emplace_back( new PARAM<bool>( "render.subtract_mask_from_silk",
439 &m_Render.subtract_mask_from_silk, false ) );
440 m_params.emplace_back( new PARAM<bool>( "render.clip_silk_on_via_annulus",
441 &m_Render.clip_silk_on_via_annuli, false ) );
442 m_params.emplace_back( new PARAM<bool>( "render.plated_and_bare_copper",
443 &m_Render.differentiate_plated_copper, false ) );
444 m_params.emplace_back( new PARAM<bool>( "render.use_board_editor_copper_colors",
445 &m_Render.use_board_editor_copper_colors, false ) );
446 m_params.emplace_back( new PARAM<bool>( "render.preview_show_board_body",
447 &m_Render.preview_show_board_body, true ) );
448 m_params.emplace_back( new PARAM<bool>( "render.show_missing_models", &m_Render.show_missing_models, false ) );
449 m_params.emplace_back( new PARAM<bool>( "camera.animation_enabled",
450 &m_Camera.animation_enabled, true ) );
451 m_params.emplace_back( new PARAM<int>( "camera.moving_speed_multiplier",
452 &m_Camera.moving_speed_multiplier, 3 ) );
453 m_params.emplace_back( new PARAM<double>( "camera.rotation_increment",
454 &m_Camera.rotation_increment, 10.0 ) );
455 m_params.emplace_back( new PARAM<int>( "camera.projection_mode",
456 &m_Camera.projection_mode, 1 ) );
457
458 m_params.emplace_back( new PARAM<int>( "export_image.width", &m_ExportImage.width, 0 ) );
459 m_params.emplace_back( new PARAM<int>( "export_image.height", &m_ExportImage.height, 0 ) );
460 m_params.emplace_back( new PARAM<double>( "export_image.x_resolution", &m_ExportImage.x_resolution, 300.0 ) );
461 m_params.emplace_back( new PARAM<double>( "export_image.y_resolution", &m_ExportImage.y_resolution, 300.0 ) );
462 m_params.emplace_back( new PARAM<int>( "export_image.size_units", &m_ExportImage.size_units, 0 ) );
463 m_params.emplace_back( new PARAM<int>( "export_image.resolution_units", &m_ExportImage.resolution_units, 0 ) );
464 m_params.emplace_back(
465 new PARAM<bool>( "export_image.lock_aspect_ratio", &m_ExportImage.lock_aspect_ratio, true ) );
466
467 m_params.emplace_back( new PARAM<bool>( "use_stackup_colors",
468 &m_UseStackupColors, true ) );
469 m_params.emplace_back( new PARAM_LAYER_PRESET_3D( "layer_presets",
470 &m_LayerPresets ) );
471 m_params.emplace_back( new PARAM<wxString>( "current_layer_preset",
473
475
476 registerMigration( 1, 2,
477 [&]() -> bool
478 {
479 Set( "render.opengl_copper_thickness", false );
480 return true;
481 } );
482
483 registerMigration( 2, 3,
484 [&]() -> bool
485 {
486 if( std::optional<bool> optval = Get<bool>( "render.show_copper" ) )
487 {
488 Set( "render.show_copper_top", *optval );
489 Set( "render.show_copper_bottom", *optval );
490 }
491
492 if( std::optional<bool> optval = Get<bool>( "render.show_silkscreen" ) )
493 {
494 Set( "render.show_silkscreen_top", *optval );
495 Set( "render.show_silkscreen_bottom", *optval );
496 }
497
498 if( std::optional<bool> optval = Get<bool>( "render.show_soldermask" ) )
499 {
500 Set( "render.show_soldermask_top", *optval );
501 Set( "render.show_soldermask_bottom", *optval );
502 }
503
504 if( std::optional<bool> optval = Get<bool>( "render.show_comments" ) )
505 Set( "render.show_drawings", *optval );
506
507 if( std::optional<bool> optval = Get<bool>( "render.show_eco" ) )
508 {
509 Set( "render.show_eco1", *optval );
510 Set( "render.show_eco2", *optval );
511 }
512
513 return true;
514 } );
515
516 registerMigration( 3, 4,
517 [&]() -> bool
518 {
519 std::map<int, wxString> legacyColorMap;
520
521 legacyColorMap[142] = "fp_values";
522 legacyColorMap[143] = "fp_references";
523 legacyColorMap[130] = "fp_text";
524 legacyColorMap[466] = "background_bottom";
525 legacyColorMap[467] = "background_top";
526 legacyColorMap[468] = "board";
527 legacyColorMap[469] = "copper";
528 legacyColorMap[470] = "copper_bottom";
529 legacyColorMap[471] = "silkscreen_bottom";
530 legacyColorMap[472] = "silkscreen_top";
531 legacyColorMap[473] = "soldermask_bottom";
532 legacyColorMap[474] = "soldermask_top";
533 legacyColorMap[475] = "solderpaste";
534 legacyColorMap[476] = "adhesive";
535 legacyColorMap[477] = "user_comments";
536 legacyColorMap[478] = "user_drawings";
537 legacyColorMap[479] = "user_eco1";
538 legacyColorMap[480] = "user_eco2";
539 legacyColorMap[481] = "th_models";
540 legacyColorMap[482] = "smd_models";
541 legacyColorMap[483] = "virtual_models";
542 legacyColorMap[484] = "non_pos_file_models";
543 legacyColorMap[485] = "dnp_models";
544 legacyColorMap[486] = "3d_navigator";
545 legacyColorMap[487] = "bounding_boxes";
546 legacyColorMap[488] = "off_board_silk";
547
548 if( !Contains( "layer_presets" ) || !At( "layer_presets" ).is_array() )
549 return true;
550
551 for( nlohmann::json& preset : At( "layer_presets" ) )
552 {
553 if( preset.contains( "colors" ) && preset.at( "colors" ).is_array() )
554 {
555 for( nlohmann::json& color : preset.at( "colors" ) )
556 {
557 if( color.contains( "layer" ) && color.at( "layer" ).is_number_integer() )
558 color["layer"] = legacyColorMap[color["layer"].get<int>()];
559 }
560 }
561
562 if( preset.contains( "layers" ) && preset.at( "layers" ).is_array() )
563 {
564 nlohmann::json mappedLayers = nlohmann::json::array();
565
566 for( const nlohmann::json& layer : preset.at( "layers" ) )
567 {
568 if( layer.is_number_integer() )
569 mappedLayers.push_back( legacyColorMap[layer.get<int>()] );
570 }
571
572 preset["layers"] = mappedLayers;
573 }
574 }
575
576 return true;
577 } );
578}
579
580
582{
583 for( LAYER_PRESET_3D& preset : m_LayerPresets )
584 {
585 if( preset.name == aName )
586 return &preset;
587 }
588
589 return nullptr;
590}
591
592
594{
600 try
601 {
602 if( m_internals->contains( "colors" ) )
603 m_internals->erase( "colors" );
604 }
605 catch( ... )
606 {
607 }
608
609 return true;
610}
611
612
614{
615 bool ret = APP_SETTINGS_BASE::MigrateFromLegacy( aCfg );
616
617 ret &= fromLegacy<int>( aCfg, "RenderEngine", "render.engine" );
618 ret &= fromLegacy<int>( aCfg, "ShowGrid3D", "render.grid_type" );
619 ret &= fromLegacy<int>( aCfg, "Render_Material", "render.material_mode" );
620 ret &= fromLegacy<bool>( aCfg, "Render_OGL_ShowCopperThickness",
621 "render.opengl_copper_thickness" );
622 ret &= fromLegacy<bool>( aCfg, "Render_OGL_ShowModelBoudingBoxes",
623 "render.opengl_show_model_bbox" );
624 ret &= fromLegacy<bool>( aCfg, "Render_RAY_AntiAliasing", "render.raytrace_anti_aliasing" );
625 ret &= fromLegacy<bool>( aCfg, "Render_RAY_Backfloor", "render.raytrace_backfloor" );
626 ret &= fromLegacy<bool>( aCfg, "Render_RAY_PostProcess", "render.raytrace_post_processing" );
627 ret &= fromLegacy<bool>( aCfg, "Render_RAY_ProceduralTextures",
628 "render.raytrace_procedural_textures" );
629 ret &= fromLegacy<bool>( aCfg, "Render_RAY_Reflections", "render.raytrace_reflections" );
630 ret &= fromLegacy<bool>( aCfg, "Render_RAY_Refractions", "render.raytrace_refractions" );
631 ret &= fromLegacy<bool>( aCfg, "Render_RAY_Shadows", "render.raytrace_shadows" );
632 ret &= fromLegacy<bool>( aCfg, "ShowRealisticMode", "render.realistic" );
633 ret &= fromLegacy<bool>( aCfg, "ShowAdhesiveLayers", "render.show_adhesive" );
634 ret &= fromLegacy<bool>( aCfg, "ShowNavigator", "render.show_navigator" );
635 ret &= fromLegacy<bool>( aCfg, "ShowBoardBody", "render.show_board_body" );
636 ret &= fromLegacy<bool>( aCfg, "ShowCommentsLayers", "render.show_comments" );
637 ret &= fromLegacy<bool>( aCfg, "ShowEcoLayers", "render.show_eco" );
638 ret &= fromLegacy<bool>( aCfg, "ShowFootprints_Insert", "render.show_footprints_insert" );
639 ret &= fromLegacy<bool>( aCfg, "ShowFootprints_Normal", "render.show_footprints_normal" );
640 ret &= fromLegacy<bool>( aCfg, "ShowFootprints_Virtual", "render.show_footprints_virtual" );
641 ret &= fromLegacy<bool>( aCfg, "ShowSilkScreenLayers", "render.show_silkscreen" );
642 ret &= fromLegacy<bool>( aCfg, "ShowSolderMasLayers", "render.show_soldermask" );
643 ret &= fromLegacy<bool>( aCfg, "ShowSolderPasteLayers", "render.show_solderpaste" );
644 ret &= fromLegacy<bool>( aCfg, "ShowZones", "render.show_zones" );
645 ret &= fromLegacy<bool>( aCfg, "SubtractMaskFromSilk", "render.subtract_mask_from_silk" );
646
647 auto do_color =
648 [&] ( const std::string& key_r, const std::string& key_g, const std::string& key_b,
649 std::string key_dest, double alpha = 1.0 )
650 {
651 COLOR4D color( 1, 1, 1, alpha );
652
653 if( aCfg->Read( key_r, &color.r )
654 && aCfg->Read( key_g, &color.g )
655 && aCfg->Read( key_b, &color.b ) )
656 {
657 Set( key_dest, color );
658 }
659 };
660
661 do_color( "BgColor_Red", "BgColor_Green", "BgColor_Blue", "colors.background_bottom" );
662 do_color( "BgColor_Red_Top", "BgColor_Green_Top", "BgColor_Blue_Top", "colors.background_top" );
663 do_color( "BoardBodyColor_Red", "BoardBodyColor_Green", "BoardBodyColor_Blue", "colors.board" );
664 do_color( "CopperColor_Red", "CopperColor_Green", "CopperColor_Blue", "colors.copper" );
665 do_color( "SilkColor_Red", "SilkColor_Green", "SilkColor_Blue", "colors.silkscreen_bottom" );
666 do_color( "SilkColor_Red", "SilkColor_Green", "SilkColor_Blue", "colors.silkscreen_top" );
667 do_color( "SMaskColor_Red", "SMaskColor_Green", "SMaskColor_Blue", "colors.soldermask", 0.83 );
668 do_color( "SPasteColor_Red", "SPasteColor_Green", "SPasteColor_Blue", "colors.solderpaste" );
669
670 return ret;
671}
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_DefaultAdhesive
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:391
double g
Green component.
Definition color4d.h:392
double b
Blue component.
Definition color4d.h:393
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