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