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