KiCad PCB EDA Suite
Loading...
Searching...
No Matches
appearance_controls_3D.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) 2023 CERN
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
22
23#include <bitmaps.h>
25#include <confirm.h>
26#include <pgm_base.h>
27#include <dpi_scaling_common.h>
28#include <eda_list_dialog.h>
29#include <pcb_display_options.h>
30#include <eda_3d_viewer_frame.h>
31#include <pcbnew_settings.h>
32#include <project.h>
33#include <board.h>
34#include <tool/tool_manager.h>
35#include <tools/pcb_actions.h>
39#include <widgets/wx_infobar.h>
42#include <wx/bmpbuttn.h>
43#include <wx/sizer.h>
44#include <wx/textdlg.h>
45#include <wx/checkbox.h>
46
48#include <algorithm>
49
51#define RR APPEARANCE_CONTROLS_3D::APPEARANCE_SETTING_3D
52
55
56 // text id tooltip
57 RR( _HKI( "Board Body" ), LAYER_3D_BOARD, _HKI( "Show board body" ) ),
58 RR( _HKI( "Plated Barrels" ),LAYER_3D_PLATED_BARRELS, _HKI( "Show barrels of plated through-holes and vias" ) ),
59 RR( wxS( "F.Cu" ), LAYER_3D_COPPER_TOP, _HKI( "Show front copper / surface finish color" ) ),
60 RR( wxS( "B.Cu" ), LAYER_3D_COPPER_BOTTOM, _HKI( "Show back copper / surface finish color" ) ),
61 RR( _HKI( "Adhesive" ), LAYER_3D_ADHESIVE, _HKI( "Show adhesive" ) ),
62 RR( _HKI( "Solder Paste" ), LAYER_3D_SOLDERPASTE, _HKI( "Show solder paste" ) ),
63 RR( wxS( "F.Silkscreen" ), LAYER_3D_SILKSCREEN_TOP, _HKI( "Show front silkscreen" ) ),
64 RR( wxS( "B.Silkscreen" ), LAYER_3D_SILKSCREEN_BOTTOM, _HKI( "Show back silkscreen" ) ),
65 RR( wxS( "F.Mask" ), LAYER_3D_SOLDERMASK_TOP, _HKI( "Show front solder mask" ) ),
66 RR( wxS( "B.Mask" ), LAYER_3D_SOLDERMASK_BOTTOM, _HKI( "Show back solder mask" ) ),
67 RR( wxS( "User.Drawings" ), LAYER_3D_USER_DRAWINGS, _HKI( "Show user drawings layer" ) ),
68 RR( wxS( "User.Comments" ), LAYER_3D_USER_COMMENTS, _HKI( "Show user comments layer" ) ),
69 RR( wxS( "User.Eco1" ), LAYER_3D_USER_ECO1, _HKI( "Show user ECO1 layer" ) ),
70 RR( wxS( "User.Eco2" ), LAYER_3D_USER_ECO2, _HKI( "Show user ECO2 layer" ) ),
71 RR( wxS( "User.1" ), LAYER_3D_USER_1, _HKI( "Show user defined layer 1" ) ),
72 RR( wxS( "User.2" ), LAYER_3D_USER_2, _HKI( "Show user defined layer 2" ) ),
73 RR( wxS( "User.3" ), LAYER_3D_USER_3, _HKI( "Show user defined layer 3" ) ),
74 RR( wxS( "User.4" ), LAYER_3D_USER_4, _HKI( "Show user defined layer 4" ) ),
75 RR( wxS( "User.5" ), LAYER_3D_USER_5, _HKI( "Show user defined layer 5" ) ),
76 RR( wxS( "User.6" ), LAYER_3D_USER_6, _HKI( "Show user defined layer 6" ) ),
77 RR( wxS( "User.7" ), LAYER_3D_USER_7, _HKI( "Show user defined layer 7" ) ),
78 RR( wxS( "User.8" ), LAYER_3D_USER_8, _HKI( "Show user defined layer 8" ) ),
79 RR( wxS( "User.9" ), LAYER_3D_USER_9, _HKI( "Show user defined layer 9" ) ),
80 RR( wxS( "User.10" ), LAYER_3D_USER_10, _HKI( "Show user defined layer 10" ) ),
81 RR( wxS( "User.11" ), LAYER_3D_USER_11, _HKI( "Show user defined layer 11" ) ),
82 RR( wxS( "User.12" ), LAYER_3D_USER_12, _HKI( "Show user defined layer 12" ) ),
83 RR( wxS( "User.13" ), LAYER_3D_USER_13, _HKI( "Show user defined layer 13" ) ),
84 RR( wxS( "User.14" ), LAYER_3D_USER_14, _HKI( "Show user defined layer 14" ) ),
85 RR( wxS( "User.15" ), LAYER_3D_USER_15, _HKI( "Show user defined layer 15" ) ),
86 RR( wxS( "User.16" ), LAYER_3D_USER_16, _HKI( "Show user defined layer 16" ) ),
87 RR( wxS( "User.17" ), LAYER_3D_USER_17, _HKI( "Show user defined layer 17" ) ),
88 RR( wxS( "User.18" ), LAYER_3D_USER_18, _HKI( "Show user defined layer 18" ) ),
89 RR( wxS( "User.19" ), LAYER_3D_USER_19, _HKI( "Show user defined layer 19" ) ),
90 RR( wxS( "User.20" ), LAYER_3D_USER_20, _HKI( "Show user defined layer 20" ) ),
91 RR( wxS( "User.21" ), LAYER_3D_USER_21, _HKI( "Show user defined layer 21" ) ),
92 RR( wxS( "User.22" ), LAYER_3D_USER_22, _HKI( "Show user defined layer 22" ) ),
93 RR( wxS( "User.23" ), LAYER_3D_USER_23, _HKI( "Show user defined layer 23" ) ),
94 RR( wxS( "User.24" ), LAYER_3D_USER_24, _HKI( "Show user defined layer 24" ) ),
95 RR( wxS( "User.25" ), LAYER_3D_USER_25, _HKI( "Show user defined layer 25" ) ),
96 RR( wxS( "User.26" ), LAYER_3D_USER_26, _HKI( "Show user defined layer 26" ) ),
97 RR( wxS( "User.27" ), LAYER_3D_USER_27, _HKI( "Show user defined layer 27" ) ),
98 RR( wxS( "User.28" ), LAYER_3D_USER_28, _HKI( "Show user defined layer 28" ) ),
99 RR( wxS( "User.29" ), LAYER_3D_USER_29, _HKI( "Show user defined layer 29" ) ),
100 RR( wxS( "User.30" ), LAYER_3D_USER_30, _HKI( "Show user defined layer 30" ) ),
101 RR( wxS( "User.31" ), LAYER_3D_USER_31, _HKI( "Show user defined layer 31" ) ),
102 RR( wxS( "User.32" ), LAYER_3D_USER_32, _HKI( "Show user defined layer 32" ) ),
103 RR( wxS( "User.33" ), LAYER_3D_USER_33, _HKI( "Show user defined layer 33" ) ),
104 RR( wxS( "User.34" ), LAYER_3D_USER_34, _HKI( "Show user defined layer 34" ) ),
105 RR( wxS( "User.35" ), LAYER_3D_USER_35, _HKI( "Show user defined layer 35" ) ),
106 RR( wxS( "User.36" ), LAYER_3D_USER_36, _HKI( "Show user defined layer 36" ) ),
107 RR( wxS( "User.37" ), LAYER_3D_USER_37, _HKI( "Show user defined layer 37" ) ),
108 RR( wxS( "User.38" ), LAYER_3D_USER_38, _HKI( "Show user defined layer 38" ) ),
109 RR( wxS( "User.39" ), LAYER_3D_USER_39, _HKI( "Show user defined layer 39" ) ),
110 RR( wxS( "User.40" ), LAYER_3D_USER_40, _HKI( "Show user defined layer 40" ) ),
111 RR( wxS( "User.41" ), LAYER_3D_USER_41, _HKI( "Show user defined layer 41" ) ),
112 RR( wxS( "User.42" ), LAYER_3D_USER_42, _HKI( "Show user defined layer 42" ) ),
113 RR( wxS( "User.43" ), LAYER_3D_USER_43, _HKI( "Show user defined layer 43" ) ),
114 RR( wxS( "User.44" ), LAYER_3D_USER_44, _HKI( "Show user defined layer 44" ) ),
115 RR( wxS( "User.45" ), LAYER_3D_USER_45, _HKI( "Show user defined layer 45" ) ),
116 RR(),
117 RR( _HKI( "Through-hole Models" ), LAYER_3D_TH_MODELS, EDA_3D_ACTIONS::showTHT ),
121 RR( _HKI( "Models marked DNP" ), LAYER_3D_MODELS_MARKED_DNP, EDA_3D_ACTIONS::showDNP ),
122 RR( _HKI( "Model Bounding Boxes" ), LAYER_3D_BOUNDING_BOXES, EDA_3D_ACTIONS::showBBoxes ),
123 RR(),
124 RR( _HKI( "Values" ), LAYER_FP_VALUES, _HKI( "Show footprint values" ) ),
125 RR( _HKI( "References" ), LAYER_FP_REFERENCES, _HKI( "Show footprint references" ) ),
126 RR( _HKI( "Footprint Text" ), LAYER_FP_TEXT, _HKI( "Show all footprint text" ) ),
127 RR( _HKI( "Off-board Silkscreen" ), LAYER_3D_OFF_BOARD_SILK, _HKI( "Do not clip silk layers to board outline" ) ),
128 RR(),
130 RR( _HKI( "Background Start" ), LAYER_3D_BACKGROUND_TOP, _HKI( "Background gradient start color" ) ),
131 RR( _HKI( "Background End" ), LAYER_3D_BACKGROUND_BOTTOM, _HKI( "Background gradient end color" ) ),
132};
133
134// The list of IDs that can have colors coming from the board stackup, and cannot be
135// modified if use colors from stackup is activated
142
145 m_frame( aParent ),
146 m_focusOwner( aFocusOwner ),
147 m_lastSelectedViewport( nullptr )
148{
149 DPI_SCALING_COMMON dpi( nullptr, m_frame );
150
151 int screenHeight = wxSystemSettings::GetMetric( wxSYS_SCREEN_Y );
152 m_pointSize = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ).GetPointSize();
153
154 m_layerPanelColour = m_panelLayers->GetBackgroundColour().ChangeLightness( 110 );
155 SetBorders( true, false, false, false );
156
157 m_layersOuterSizer = new wxBoxSizer( wxVERTICAL );
159 m_windowLayers->SetScrollRate( 0, 5 );
160 m_windowLayers->Bind( wxEVT_SET_FOCUS, &APPEARANCE_CONTROLS_3D::OnSetFocus, this );
161
162 m_envOuterSizer = new wxBoxSizer( wxVERTICAL );
163
164 wxFont infoFont = KIUI::GetInfoFont( this );
165 m_panelLayers->SetFont( infoFont );
166 m_windowLayers->SetFont( infoFont );
167 m_presetsLabel->SetFont( infoFont );
168 m_viewportsLabel->SetFont( infoFont );
169
170 // Create display options
171 m_cbUseBoardStackupColors = new wxCheckBox( m_panelLayers, wxID_ANY,
172 _( "Use board stackup colors" ) );
173 m_cbUseBoardStackupColors->SetFont( infoFont );
174
175 m_cbUseBoardStackupColors->Bind( wxEVT_CHECKBOX,
176 [this]( wxCommandEvent& aEvent )
177 {
178 EDA_3D_VIEWER_SETTINGS* cfg = m_frame->GetAdapter().m_Cfg;
179 cfg->m_UseStackupColors = aEvent.IsChecked();
180
182 m_frame->NewDisplay( true );
183 } );
184
185 m_cbUseBoardEditorCopperColors = new wxCheckBox( m_panelLayers, wxID_ANY,
186 _( "Use PCB editor copper colors" ) );
187 m_cbUseBoardEditorCopperColors->SetFont( infoFont );
188 m_cbUseBoardEditorCopperColors->SetToolTip( _( "Use the board editor layer colors for copper "
189 "layers (realtime renderer only)" ) );
190
191 m_cbUseBoardEditorCopperColors->Bind( wxEVT_CHECKBOX,
192 [this]( wxCommandEvent& aEvent )
193 {
194 EDA_3D_VIEWER_SETTINGS* cfg = m_frame->GetAdapter().m_Cfg;
195 cfg->m_Render.use_board_editor_copper_colors = aEvent.IsChecked();
196
198 m_frame->NewDisplay( true );
199 } );
200
201 m_panelLayersSizer->Add( m_cbUseBoardStackupColors, 0, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 5 );
203 wxEXPAND | wxALL, 5 );
204
205 m_cbLayerPresets->SetToolTip( wxString::Format( _( "Save and restore color and visibility combinations.\n"
206 "Use %s+Tab to activate selector.\n"
207 "Successive Tabs while holding %s down will cycle through "
208 "presets in the popup." ),
211
212 m_cbViewports->SetToolTip( wxString::Format( _( "Save and restore camera position and zoom.\n"
213 "Use %s+Tab to activate selector.\n"
214 "Successive Tabs while holding %s down will cycle through "
215 "viewports in the popup." ),
218
219 if( screenHeight <= 900 && m_pointSize >= FromDIP( KIUI::c_IndicatorSizeDIP ) )
220 m_pointSize = m_pointSize * 8 / 10;
221
223
226
227 m_frame->Bind( EDA_LANG_CHANGED, &APPEARANCE_CONTROLS_3D::OnLanguageChanged, this );
228}
229
230
235
236
238{
239 DPI_SCALING_COMMON dpi( nullptr, m_frame );
240 wxSize size( 220 * dpi.GetScaleFactor(), 480 * dpi.GetScaleFactor() );
241 return size;
242}
243
244
245void APPEARANCE_CONTROLS_3D::OnSetFocus( wxFocusEvent& aEvent )
246{
247#ifdef __WXMSW__
248 // In wxMSW, buttons won't process events unless they have focus, so we'll let it take the
249 // focus and give it back to the parent in the button event handler.
250 if( wxBitmapButton* btn = dynamic_cast<wxBitmapButton*>( aEvent.GetEventObject() ) )
251 {
252 wxCommandEvent evt( wxEVT_BUTTON );
253 wxPostEvent( btn, evt );
254 }
255#endif
256
257 passOnFocus();
258 aEvent.Skip();
259}
260
261
262void APPEARANCE_CONTROLS_3D::OnSize( wxSizeEvent& aEvent )
263{
264 aEvent.Skip();
265}
266
267
269{
270 Freeze();
271
273 m_cbUseBoardStackupColors->SetLabel( _( "Use board stackup colors" ) );
276
277 Thaw();
278 Refresh();
279}
280
281
282void APPEARANCE_CONTROLS_3D::OnLanguageChanged( wxCommandEvent& aEvent )
283{
285
286 aEvent.Skip();
287}
288
289
291{
292 // This is essentially a list of hacks because DarkMode isn't yet implemented inside
293 // wxWidgets.
294 //
295 // The individual wxPanels, COLOR_SWATCHes and GRID_CELL_COLOR_RENDERERs should really be
296 // overriding some virtual method or responding to some wxWidgets event so that the parent
297 // doesn't have to know what it contains. But, that's not where we are, so... :shrug:
298
299 m_layerPanelColour = m_panelLayers->GetBackgroundColour().ChangeLightness( 110 );
300
301 m_windowLayers->SetBackgroundColour( m_layerPanelColour );
302
303 for( wxSizerItem* child : m_layersOuterSizer->GetChildren() )
304 {
305 if( child && child->GetWindow() )
306 child->GetWindow()->SetBackgroundColour( m_layerPanelColour );
307 }
308}
309
310
312{
314
316
317 const wxString& currentPreset = m_frame->GetAdapter().m_Cfg->m_CurrentPreset;
318
319 if( currentPreset == FOLLOW_PCB || currentPreset == FOLLOW_PLOT_SETTINGS )
320 updateLayerPresetWidget( currentPreset );
321 else
323}
324
325
326void APPEARANCE_CONTROLS_3D::ApplyLayerPreset( const wxString& aPresetName )
327{
328 doApplyLayerPreset( aPresetName );
329
330 // Move to front of MRU list
331 if( m_presetMRU.Index( aPresetName ) != wxNOT_FOUND )
332 m_presetMRU.Remove( aPresetName );
333
334 m_presetMRU.Insert( aPresetName, 0 );
335
336 updateLayerPresetWidget( aPresetName );
337}
338
339
340std::vector<VIEWPORT3D> APPEARANCE_CONTROLS_3D::GetUserViewports() const
341{
342 std::vector<VIEWPORT3D> ret;
343
344 for( const auto& [name, viewport] : m_viewports )
345 ret.emplace_back( viewport );
346
347 return ret;
348}
349
350
351void APPEARANCE_CONTROLS_3D::SetUserViewports( std::vector<VIEWPORT3D>& aViewportList )
352{
353 m_viewports.clear();
354
355 for( const VIEWPORT3D& viewport : aViewportList )
356 {
357 if( m_viewports.count( viewport.name ) )
358 continue;
359
360 m_viewports[viewport.name] = viewport;
361
362 m_viewportMRU.Add( viewport.name );
363 }
364
366
367 // Now is as good a time as any to initialize the layer presets as well.
369
370 m_presetMRU.Add( FOLLOW_PCB );
372
373 for( const LAYER_PRESET_3D& preset : m_frame->GetAdapter().m_Cfg->m_LayerPresets )
374 m_presetMRU.Add( preset.name );
375}
376
377
378void APPEARANCE_CONTROLS_3D::ApplyViewport( const wxString& aViewportName )
379{
380 int idx = m_cbViewports->FindString( aViewportName );
381
382 if( idx >= 0 && idx < (int)m_cbViewports->GetCount() - 3 /* separator */ )
383 {
384 m_cbViewports->SetSelection( idx );
385 m_lastSelectedViewport = static_cast<VIEWPORT3D*>( m_cbViewports->GetClientData( idx ) );
386 }
387 else
388 {
389 m_cbViewports->SetSelection( m_cbViewports->GetCount() - 3 ); // separator
390 m_lastSelectedViewport = nullptr;
391 }
392
395}
396
397
398void APPEARANCE_CONTROLS_3D::OnLayerVisibilityChanged( int aLayer, bool isVisible )
399{
400 std::bitset<LAYER_3D_END> visibleLayers = m_frame->GetAdapter().GetVisibleLayers();
401 const std::map<int, COLOR4D>& colors = m_frame->GetAdapter().GetLayerColors();
402 bool killFollow = false;
403 bool doFastRefresh = false; // true to just refresh the display
404
405 // Special-case controls
406 switch( aLayer )
407 {
408 case LAYER_FP_TEXT:
409 // Because Footprint Text is a meta-control that also can disable values/references,
410 // drag them along here so that the user is less likely to be confused.
411 if( !isVisible )
412 {
413 visibleLayers.set( LAYER_FP_REFERENCES, false );
414 visibleLayers.set( LAYER_FP_VALUES, false );
415 }
416
417 visibleLayers.set( LAYER_FP_TEXT, isVisible );
418 killFollow = true;
419 break;
420
422 case LAYER_FP_VALUES:
423 // In case that user changes Footprint Value/References when the Footprint Text
424 // meta-control is disabled, we should put it back on.
425 if( isVisible )
426 visibleLayers.set( LAYER_FP_TEXT, true );
427
428 visibleLayers.set( aLayer, isVisible );
429 killFollow = true;
430 break;
431
432 case LAYER_3D_BOARD:
446 visibleLayers.set( aLayer, isVisible );
447 killFollow = true;
448 break;
449
455 doFastRefresh = true;
456 visibleLayers.set( aLayer, isVisible );
457 break;
458
459 default:
460 visibleLayers.set( aLayer, isVisible );
461
462 if( aLayer >= LAYER_3D_USER_1 && aLayer <= LAYER_3D_USER_45 )
463 killFollow = true;
464
465 break;
466 }
467
468 m_frame->GetAdapter().SetVisibleLayers( visibleLayers );
469 m_frame->GetAdapter().SetLayerColors( colors );
470
471 const wxString& currentPreset = m_frame->GetAdapter().m_Cfg->m_CurrentPreset;
472
473 if( ( currentPreset != FOLLOW_PCB && currentPreset != FOLLOW_PLOT_SETTINGS ) || killFollow )
475
477
478 if( doFastRefresh && m_frame->GetAdapter().m_Cfg->m_Render.engine == RENDER_ENGINE::OPENGL )
479 {
480 RENDER_3D_OPENGL* renderer = static_cast<RENDER_3D_OPENGL*>( m_frame->GetCanvas()->GetCurrentRender() );
481 renderer->Load3dModelsIfNeeded();
482 m_frame->GetCanvas()->Request_refresh();
483 }
484 else
485 {
486 m_frame->NewDisplay( true );
487 }
488}
489
490
492{
493 std::bitset<LAYER_3D_END> visibleLayers = m_frame->GetAdapter().GetVisibleLayers();
494 std::map<int, COLOR4D> colors = m_frame->GetAdapter().GetLayerColors();
495
496 m_frame->GetAdapter().SetVisibleLayers( visibleLayers );
497
498 int layer = aSwatch->GetId();
499 COLOR4D newColor = aSwatch->GetSwatchColor();
500
501 colors[ layer ] = newColor;
502
503 // The internals of the 3D viewer only supports a single color for copper, which must
504 // be applied to all copper layers.
505 COLOR_SWATCH* otherSwatch = nullptr;
506
507 const std::vector<int> copperIndices{
511 };
512
513 // If the changed swatch is one of the copper layers, we need to update the other copper layers
514 if( std::find( copperIndices.begin(), copperIndices.end(), layer ) != copperIndices.end() )
515 {
516 for( int index : copperIndices )
517 {
518 if( layer != index && colors.count( index ) )
519 {
520 colors[index] = newColor;
521 otherSwatch = m_layerSettingsMap[index]->m_Ctl_color;
522 }
523 }
524 }
525
526 if( otherSwatch )
527 {
528 // Don't send an event, because that will cause an event loop
529 otherSwatch->SetSwatchColor( newColor, false );
530 }
531
532
533 m_frame->GetAdapter().SetLayerColors( colors );
534
535 const wxString& currentPreset = m_frame->GetAdapter().m_Cfg->m_CurrentPreset;
536
537 if( currentPreset == FOLLOW_PCB || currentPreset == FOLLOW_PLOT_SETTINGS )
538 updateLayerPresetWidget( currentPreset );
539 else
541
542 m_frame->NewDisplay( true );
543}
544
545
547{
548 int swatchWidth = m_windowLayers->ConvertDialogToPixels( wxSize( 8, 0 ) ).x;
549
550 std::bitset<LAYER_3D_END> visibleLayers = m_frame->GetAdapter().GetVisibleLayers();
551 std::map<int, COLOR4D> colors = m_frame->GetAdapter().GetLayerColors();
552 std::map<int, COLOR4D> defaultColors = m_frame->GetAdapter().GetDefaultColors();
553 LSET enabled = m_frame->GetBoard()->GetEnabledLayers();
554
555 m_layerSettings.clear();
556 m_layersOuterSizer->Clear( true );
557 m_layersOuterSizer->AddSpacer( 5 );
558
559 m_envOuterSizer->Clear( true );
560
561 auto appendLayer =
562 [&]( const std::unique_ptr<APPEARANCE_SETTING_3D>& aSetting )
563 {
564 wxBoxSizer* sizer = new wxBoxSizer( wxHORIZONTAL );
565 int layer = aSetting->m_Id;
566
567 aSetting->m_Visible = visibleLayers.test( layer );
568
569 if( colors.count( layer ) )
570 {
571 COLOR_SWATCH* swatch = new COLOR_SWATCH( m_windowLayers, colors[ layer ], layer,
572 COLOR4D::WHITE, defaultColors[ layer ],
573 SWATCH_SMALL );
574 swatch->SetToolTip( _( "Left double click or middle click to change color" ) );
575
576 swatch->SetReadOnlyCallback(
577 [this]()
578 {
579 WX_INFOBAR* infobar = m_frame->GetInfoBar();
580
581 infobar->RemoveAllButtons();
582 infobar->AddCloseButton();
583
584 infobar->ShowMessageFor( _( "Uncheck 'Use board stackup colors' to "
585 "allow color editing." ),
586 10000, wxICON_INFORMATION );
587 } );
588
589 sizer->Add( swatch, 0, wxALIGN_CENTER_VERTICAL, 0 );
590 aSetting->m_Ctl_color = swatch;
591
592 swatch->Bind( COLOR_SWATCH_CHANGED,
593 [this]( wxCommandEvent& event )
594 {
595 auto swatch = static_cast<COLOR_SWATCH*>( event.GetEventObject() );
596 onColorSwatchChanged( swatch );
597
598 passOnFocus();
599 } );
600 }
601 else
602 {
603 sizer->AddSpacer( swatchWidth );
604 }
605
606 sizer->AddSpacer( 5 );
607
608 wxString layerName = aSetting->GetLabel();
609 PCB_LAYER_ID boardLayer = Map3DLayerToPCBLayer( layer );
610
611 if( boardLayer != UNDEFINED_LAYER )
612 layerName = m_frame->GetBoard()->GetLayerName( boardLayer );
613
614 wxStaticText* label = new wxStaticText( m_windowLayers, layer, layerName );
615 label->Wrap( -1 );
616 label->SetToolTip( aSetting->GetTooltip() );
617
618 if( layer == LAYER_3D_BACKGROUND_TOP || layer == LAYER_3D_BACKGROUND_BOTTOM )
619 {
620 sizer->AddSpacer( swatchWidth );
621 }
622 else
623 {
624 BITMAP_TOGGLE* btn_visible = new BITMAP_TOGGLE( m_windowLayers, layer,
627 aSetting->m_Visible );
628
629 btn_visible->Bind( TOGGLE_CHANGED,
630 [this]( wxCommandEvent& aEvent )
631 {
632 int id = static_cast<wxWindow*>( aEvent.GetEventObject() )->GetId();
633 bool isVisible = aEvent.GetInt();
634 OnLayerVisibilityChanged( id, isVisible );
635
636 passOnFocus();
637 } );
638
639 wxString tip;
640 tip.Printf( _( "Show or hide %s" ), aSetting->GetLabel().Lower() );
641 btn_visible->SetToolTip( tip );
642
643 aSetting->m_Ctl_visibility = btn_visible;
644 sizer->Add( btn_visible, 0, wxALIGN_CENTER_VERTICAL, 0 );
645 }
646
647 sizer->AddSpacer( 5 );
648 sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL, 0 );
649
650 m_layersOuterSizer->Add( sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, 5 );
651 m_layersOuterSizer->AddSpacer( 2 );
652 };
653
654 for( const APPEARANCE_SETTING_3D& s_setting : s_layerSettings )
655 {
656 m_layerSettings.emplace_back( std::make_unique<APPEARANCE_SETTING_3D>( s_setting ) );
657 std::unique_ptr<APPEARANCE_SETTING_3D>& setting = m_layerSettings.back();
658
659 if( setting->m_Spacer )
660 {
661 m_layersOuterSizer->AddSpacer( m_pointSize );
662 }
663 else if( setting->m_Id >= LAYER_3D_USER_1 && setting->m_Id <= LAYER_3D_USER_45 )
664 {
665 if( enabled.test( Map3DLayerToPCBLayer( setting->m_Id ) ) )
666 appendLayer( setting );
667 }
668 else
669 {
670 appendLayer( setting );
671 }
672
673 m_layerSettingsMap[setting->m_Id] = setting.get();
674 }
675
676 m_sizerOuter->Layout();
677}
678
679
681{
682 EDA_3D_VIEWER_SETTINGS* cfg = m_frame->GetAdapter().m_Cfg;
683 std::bitset<LAYER_3D_END> visibleLayers = m_frame->GetAdapter().GetVisibleLayers();
684 std::map<int, COLOR4D> colors = m_frame->GetAdapter().GetLayerColors();
685
686 for( std::unique_ptr<APPEARANCE_SETTING_3D>& setting : m_layerSettings )
687 {
688 if( setting->m_Spacer )
689 continue;
690
691 if( setting->m_Ctl_visibility )
692 setting->m_Ctl_visibility->SetValue( visibleLayers.test( setting->m_Id ) );
693
694 if( setting->m_Ctl_color )
695 {
696 setting->m_Ctl_color->SetSwatchColor( colors[ setting->m_Id ], false );
697
698 // if cfg->m_UseStackupColors is set, board colors cannot be modified locally, but
699 // other colors can be
700 if( alg::contains( inStackupColors, setting->m_Id ) && cfg )
701 setting->m_Ctl_color->SetReadOnly( cfg->m_UseStackupColors );
702 }
703 }
704
705 if( cfg )
706 {
709 }
710}
711
712
714{
715 m_presetsLabel->SetLabel( wxString::Format( _( "Presets (%s+Tab):" ),
717
718 m_cbLayerPresets->Clear();
719
720 // Build the layers preset list.
721
722 m_cbLayerPresets->Append( _( "Follow PCB Editor" ) );
723 m_cbLayerPresets->Append( _( "Follow PCB Plot Settings" ) );
724
725 if( !m_frame->GetAdapter().m_Cfg->m_LayerPresets.empty() )
726 m_cbLayerPresets->Append( wxT( "---" ) );
727
728 for( const LAYER_PRESET_3D& preset : m_frame->GetAdapter().m_Cfg->m_LayerPresets )
729 m_cbLayerPresets->Append( preset.name );
730
731 m_cbLayerPresets->Append( wxT( "---" ) );
732 m_cbLayerPresets->Append( _( "Save preset..." ) );
733 m_cbLayerPresets->Append( _( "Delete preset..." ) );
734
735 if( aReset )
736 updateLayerPresetWidget( m_frame->GetAdapter().m_Cfg->m_CurrentPreset );
737}
738
739
741{
742 m_frame->GetAdapter().m_Cfg->m_CurrentPreset = wxEmptyString;
743
744 std::vector<LAYER_PRESET_3D>& presets = m_frame->GetAdapter().m_Cfg->m_LayerPresets;
745 std::bitset<LAYER_3D_END> visibleLayers = m_frame->GetAdapter().GetVisibleLayers();
746 std::map<int, COLOR4D> colors = m_frame->GetAdapter().GetLayerColors();
747
748 auto it = std::find_if(
749 presets.begin(), presets.end(),
750 [&]( const LAYER_PRESET_3D& aPreset )
751 {
752 if( aPreset.name.Lower() == _( "legacy colors" ) && m_cbUseBoardStackupColors->GetValue() )
753 return false;
754
755 for( int layer = LAYER_3D_BOARD; layer < LAYER_3D_END; ++layer )
756 {
757 if( aPreset.layers.test( layer ) != visibleLayers.test( layer ) )
758 return false;
759 }
760
761 for( int layer : { LAYER_FP_REFERENCES, LAYER_FP_VALUES, LAYER_FP_TEXT } )
762 {
763 if( aPreset.layers.test( layer ) != visibleLayers.test( layer ) )
764 return false;
765 }
766
767 for( int layer = LAYER_3D_START + 1; layer < LAYER_3D_END; ++layer )
768 {
769 auto it1 = aPreset.colors.find( layer );
770 auto it2 = colors.find( layer );
771
772 if( it1 != aPreset.colors.end() && it2 != colors.end() && *it1 != *it2 )
773 return false;
774 }
775
776 return true;
777 } );
778
779 if( it != presets.end() )
780 {
781 m_frame->GetAdapter().m_Cfg->m_CurrentPreset = it->name;
782 m_cbLayerPresets->SetStringSelection( it->name );
783 }
784 else
785 {
786 m_cbLayerPresets->SetSelection( m_cbLayerPresets->GetCount() - 3 ); // separator
787 }
788}
789
790
792{
793 if( aName == FOLLOW_PCB )
794 m_cbLayerPresets->SetSelection( 0 );
795 else if( aName == FOLLOW_PLOT_SETTINGS )
796 m_cbLayerPresets->SetSelection( 1 );
797 else if( !m_cbLayerPresets->SetStringSelection( aName ) )
798 m_cbLayerPresets->SetSelection( m_cbLayerPresets->GetCount() - 3 ); // separator
799}
800
801
803{
804 EDA_3D_VIEWER_SETTINGS* cfg = m_frame->GetAdapter().m_Cfg;
805 int count = m_cbLayerPresets->GetCount();
806 int index = m_cbLayerPresets->GetSelection();
807 wxString name;
808
809 auto resetSelection =
810 [&]()
811 {
813 };
814
815 if( index == 0 )
816 {
818 }
819 else if( index == 1 )
820 {
822 }
823 else if( index == count - 2 )
824 {
825 wxTextEntryDialog dlg( wxGetTopLevelParent( this ), _( "Layer preset name:" ),
826 _( "Save Layer Preset" ) );
827
828 if( dlg.ShowModal() != wxID_OK )
829 {
830 resetSelection();
831 return;
832 }
833
834 std::bitset<LAYER_3D_END> visibleLayers = m_frame->GetAdapter().GetVisibleLayers();
835 std::map<int, COLOR4D> colors = m_frame->GetAdapter().GetLayerColors();
836
837 name = dlg.GetValue();
838
839 if( LAYER_PRESET_3D* preset = cfg->FindPreset( name ) )
840 {
841 if( !IsOK( wxGetTopLevelParent( this ), _( "Overwrite existing preset?" ) ) )
842 {
843 resetSelection();
844 return;
845 }
846
847 preset->layers = visibleLayers;
848 preset->colors = colors;
849 m_cbLayerPresets->SetSelection( m_cbLayerPresets->FindString( name ) );
850 }
851 else
852 {
853 cfg->m_LayerPresets.emplace_back( name, visibleLayers, colors );
855 m_cbLayerPresets->SetStringSelection( name );
856 }
857
858 cfg->m_CurrentPreset = name;
859 m_presetMRU.Insert( name, 0 );
860
861 return;
862 }
863 else if( index == count - 1 )
864 {
865 wxArrayString headers;
866 std::vector<wxArrayString> items;
867
868 headers.Add( _( "Presets" ) );
869
870 for( LAYER_PRESET_3D& preset : cfg->m_LayerPresets )
871 {
872 wxArrayString item;
873 item.Add( preset.name );
874 items.emplace_back( item );
875 }
876
877 EDA_LIST_DIALOG dlg( m_frame, _( "Delete Preset" ), headers, items );
878 dlg.SetListLabel( _( "Select preset:" ) );
879
880 if( dlg.ShowModal() == wxID_OK )
881 {
882 name = dlg.GetTextSelection();
883
884 if( m_cbLayerPresets->FindString( name ) != wxNOT_FOUND )
885 m_cbLayerPresets->Delete( m_cbLayerPresets->FindString( name ) );
886
887 std::erase_if( cfg->m_LayerPresets,
888 [name]( const LAYER_PRESET_3D& preset )
889 {
890 return preset.name == name;
891 } );
892
893 if( cfg->m_CurrentPreset == name )
894 cfg->m_CurrentPreset = wxEmptyString;
895
896 if( m_presetMRU.Index( name ) >= 0 )
897 m_presetMRU.Remove( name );
898 }
899
900 resetSelection();
901 return;
902 }
903 else if( m_cbLayerPresets->GetString( index ) == wxT( "---" ) )
904 {
905 // Separator: reject the selection
906 resetSelection();
907 return;
908 }
909 else
910 {
911 doApplyLayerPreset( m_cbLayerPresets->GetStringSelection() );
912 }
913
914 // Move to front of MRU list
915 if( m_presetMRU.Index( name ) != wxNOT_FOUND )
916 m_presetMRU.Remove( name );
917
918 m_presetMRU.Insert( name, 0 );
919
920 passOnFocus();
921}
922
923
924void APPEARANCE_CONTROLS_3D::doApplyLayerPreset( const wxString& aPresetName )
925{
926 BOARD_ADAPTER& adapter = m_frame->GetAdapter();
927
928 if( aPresetName == FOLLOW_PCB || aPresetName == FOLLOW_PLOT_SETTINGS )
929 {
930 adapter.m_Cfg->m_CurrentPreset = aPresetName;
931 adapter.SetVisibleLayers( adapter.GetVisibleLayers() );
932 }
933 else if( LAYER_PRESET_3D* preset = adapter.m_Cfg->FindPreset( aPresetName ) )
934 {
935 adapter.m_Cfg->m_CurrentPreset = aPresetName;
936 adapter.SetVisibleLayers( preset->layers );
937 adapter.SetLayerColors( preset->colors );
938
939 if( preset->name.Lower() == _( "legacy colors" ) )
940 adapter.m_Cfg->m_UseStackupColors = false;
941 }
942 else
943 {
944 return;
945 }
946
948 m_frame->NewDisplay( true );
949}
950
951
953{
954 m_viewportsLabel->SetLabel( wxString::Format( _( "Viewports (%s+Tab):" ),
956
957 m_cbViewports->Clear();
958
959 for( std::pair<const wxString, VIEWPORT3D>& pair : m_viewports )
960 m_cbViewports->Append( pair.first, static_cast<void*>( &pair.second ) );
961
962 m_cbViewports->Append( wxT( "---" ) );
963 m_cbViewports->Append( _( "Save viewport..." ) );
964 m_cbViewports->Append( _( "Delete viewport..." ) );
965
966 m_cbViewports->SetSelection( m_cbViewports->GetCount() - 3 );
967 m_lastSelectedViewport = nullptr;
968}
969
970
971void APPEARANCE_CONTROLS_3D::onViewportChanged( wxCommandEvent& aEvent )
972{
973 int count = m_cbViewports->GetCount();
974 int index = m_cbViewports->GetSelection();
975
976 if( index >= 0 && index < count - 3 )
977 {
978 VIEWPORT3D* viewport = static_cast<VIEWPORT3D*>( m_cbViewports->GetClientData( index ) );
979
980 wxCHECK( viewport, /* void */ );
981
982 doApplyViewport( *viewport );
983
984 if( !viewport->name.IsEmpty() )
985 {
986 if( m_viewportMRU.Index( viewport->name ) != wxNOT_FOUND )
987 m_viewportMRU.Remove( viewport->name );
988
989 m_viewportMRU.Insert( viewport->name, 0 );
990 }
991 }
992 else if( index == count - 2 )
993 {
994 // Save current state to new preset
995 wxString name;
996
997 wxTextEntryDialog dlg( wxGetTopLevelParent( this ), _( "Viewport name:" ),
998 _( "Save Viewport" ), name );
999
1000 if( dlg.ShowModal() != wxID_OK )
1001 {
1003 m_cbViewports->SetStringSelection( m_lastSelectedViewport->name );
1004 else
1005 m_cbViewports->SetSelection( m_cbViewports->GetCount() - 3 );
1006
1007 return;
1008 }
1009
1010 name = dlg.GetValue();
1011 bool exists = m_viewports.count( name );
1012
1013 if( !exists )
1014 {
1015 m_viewports[name] = VIEWPORT3D( name, m_frame->GetCurrentCamera().GetViewMatrix() );
1016
1017 index = m_cbViewports->Insert( name, index-1, static_cast<void*>( &m_viewports[name] ) );
1018 }
1019 else
1020 {
1021 m_viewports[name].matrix = m_frame->GetCurrentCamera().GetViewMatrix();
1022 index = m_cbViewports->FindString( name );
1023
1024 if( m_viewportMRU.Index( name ) != wxNOT_FOUND )
1025 m_viewportMRU.Remove( name );
1026 }
1027
1028 m_cbViewports->SetSelection( index );
1029 m_viewportMRU.Insert( name, 0 );
1030
1031 return;
1032 }
1033 else if( index == count - 1 )
1034 {
1035 // Delete an existing viewport
1036 wxArrayString headers;
1037 std::vector<wxArrayString> items;
1038
1039 headers.Add( _( "Viewports" ) );
1040
1041 for( std::pair<const wxString, VIEWPORT3D>& pair : m_viewports )
1042 {
1043 wxArrayString item;
1044 item.Add( pair.first );
1045 items.emplace_back( item );
1046 }
1047
1048 EDA_LIST_DIALOG dlg( m_frame, _( "Delete Viewport" ), headers, items );
1049 dlg.SetListLabel( _( "Select viewport:" ) );
1050
1051 if( dlg.ShowModal() == wxID_OK )
1052 {
1053 wxString viewportName = dlg.GetTextSelection();
1054 int idx = m_cbViewports->FindString( viewportName );
1055
1056 if( idx != wxNOT_FOUND )
1057 {
1058 m_viewports.erase( viewportName );
1059 m_cbViewports->Delete( idx );
1060 }
1061
1062 if( m_viewportMRU.Index( viewportName ) != wxNOT_FOUND )
1063 m_viewportMRU.Remove( viewportName );
1064 }
1065
1067 m_cbViewports->SetStringSelection( m_lastSelectedViewport->name );
1068 else
1069 m_cbViewports->SetSelection( m_cbViewports->GetCount() - 3 );
1070
1071 return;
1072 }
1073
1074 passOnFocus();
1075}
1076
1077
1078void APPEARANCE_CONTROLS_3D::onUpdateViewportsCb( wxUpdateUIEvent& aEvent )
1079{
1080 int count = m_cbViewports->GetCount();
1081 int index = m_cbViewports->GetSelection();
1082
1083 if( index >= 0 && index < count - 3 )
1084 {
1085 VIEWPORT3D* viewport = static_cast<VIEWPORT3D*>( m_cbViewports->GetClientData( index ) );
1086
1087 wxCHECK( viewport, /* void */ );
1088
1089 if( m_frame->GetCurrentCamera().GetViewMatrix() != viewport->matrix )
1090 m_cbViewports->SetSelection( -1 );
1091 }
1092}
1093
1094
1096{
1097 m_frame->GetCurrentCamera().SetViewMatrix( aViewport.matrix );
1098
1099 if( m_frame->GetAdapter().m_Cfg->m_Render.engine == RENDER_ENGINE::OPENGL )
1100 m_frame->GetCanvas()->Request_refresh();
1101 else
1102 m_frame->GetCanvas()->RenderRaytracingRequest();
1103}
1104
1105
1107{
1108 m_focusOwner->SetFocus();
1109}
int index
const char * name
static std::vector< int > inStackupColors
#define RR
Render Row abbreviation to reduce source width.
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Definition bitmap.cpp:110
Container for an appearance setting (can control a layer class, object type, etc.)
APPEARANCE_CONTROLS_3D_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxTAB_TRAVERSAL, const wxString &name=wxEmptyString)
void OnLanguageChanged(wxCommandEvent &aEvent)
GRID_BITMAP_TOGGLE_RENDERER * m_toggleGridRenderer
void onLayerPresetChanged(wxCommandEvent &aEvent) override
void updateLayerPresetWidget(const wxString &aName)
std::vector< VIEWPORT3D > GetUserViewports() const
Return a list of viewports created by the user.
void ApplyViewport(const wxString &aPresetName)
void rebuildLayerPresetsWidget(bool aReset)
void onColorSwatchChanged(COLOR_SWATCH *aSwatch)
APPEARANCE_CONTROLS_3D(EDA_3D_VIEWER_FRAME *aParent, wxWindow *aFocusOwner)
std::vector< std::unique_ptr< APPEARANCE_SETTING_3D > > m_layerSettings
std::map< int, APPEARANCE_SETTING_3D * > m_layerSettingsMap
static const APPEARANCE_SETTING_3D s_layerSettings[]
Template for object appearance settings.
void doApplyLayerPreset(const wxString &aPresetName)
EDA_3D_VIEWER_FRAME * m_frame
void onUpdateViewportsCb(wxUpdateUIEvent &aEvent) override
void OnSetFocus(wxFocusEvent &aEvent) override
void OnLayerVisibilityChanged(int aLayer, bool isVisible)
void OnSize(wxSizeEvent &aEvent) override
void doApplyViewport(const VIEWPORT3D &aViewport)
std::map< wxString, VIEWPORT3D > m_viewports
void ApplyLayerPreset(const wxString &aPresetName)
void onViewportChanged(wxCommandEvent &aEvent) override
void SetUserViewports(std::vector< VIEWPORT3D > &aPresetList)
Update the current viewports from those saved in the project file.
A checkbox control except with custom bitmaps for the checked and unchecked states.
Helper class to handle information needed to display 3D board.
void SetVisibleLayers(const std::bitset< LAYER_3D_END > &aLayers)
std::bitset< LAYER_3D_END > GetVisibleLayers() const
void SetLayerColors(const std::map< int, COLOR4D > &aColors)
EDA_3D_VIEWER_SETTINGS * m_Cfg
static const COLOR4D WHITE
Definition color4d.h:405
A simple color swatch of the kind used to set layer colors.
void SetSwatchColor(const KIGFX::COLOR4D &aColor, bool aSendEvent)
Set the current swatch color directly.
KIGFX::COLOR4D GetSwatchColor() const
void SetReadOnlyCallback(std::function< void()> aCallback)
Register a handler for when the user tries to interact with a read-only swatch.
int ShowModal() override
Class to handle configuration and automatic determination of the DPI scale to use for canvases.
double GetScaleFactor() const override
Get the DPI scale from all known sources in order:
static TOOL_ACTION showNavigator
static TOOL_ACTION showNotInPosFile
static TOOL_ACTION showTHT
static TOOL_ACTION showDNP
static TOOL_ACTION showSMD
static TOOL_ACTION showVirtual
static TOOL_ACTION showBBoxes
Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard.
LAYER_PRESET_3D * FindPreset(const wxString &aName)
std::vector< LAYER_PRESET_3D > m_LayerPresets
A dialog which shows:
wxString GetTextSelection(int aColumn=0)
Return the selected text from aColumn in the wxListCtrl in the dialog.
void SetListLabel(const wxString &aLabel)
A toggle button renderer for a wxGrid, similar to BITMAP_TOGGLE.
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
LSET is a set of PCB_LAYER_IDs.
Definition lset.h:37
Object to render the board using openGL.
void Load3dModelsIfNeeded()
Load footprint models if they are not already loaded, i.e.
A modified version of the wxInfoBar class that allows us to:
Definition wx_infobar.h:77
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
void ShowMessageFor(const wxString &aMessage, int aTime, int aFlags=wxICON_INFORMATION, MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the infobar with the provided message and icon for a specific period of time.
void AddCloseButton(const wxString &aTooltip=_("Hide this message."))
Add the default close button to the infobar on the right side.
void SetBorders(bool aLeft, bool aRight, bool aTop, bool aBottom)
Definition wx_panel.h:39
@ SWATCH_SMALL
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
Definition confirm.cpp:259
This file is part of the common library.
#define _(s)
Declaration of the eda_3d_viewer class.
#define FOLLOW_PLOT_SETTINGS
#define FOLLOW_PCB
#define VIEWPORT_SWITCH_KEY
#define PRESET_SWITCH_KEY
wxString KeyNameFromKeyCode(int aKeycode, bool *aIsFound)
Return the key name from the key code.
PCB_LAYER_ID Map3DLayerToPCBLayer(int aLayer)
Definition layer_id.cpp:268
@ LAYER_3D_USER_1
Definition layer_ids.h:567
@ LAYER_3D_SOLDERMASK_TOP
Definition layer_ids.h:560
@ LAYER_3D_USER_8
Definition layer_ids.h:574
@ LAYER_3D_USER_22
Definition layer_ids.h:588
@ LAYER_3D_USER_44
Definition layer_ids.h:610
@ LAYER_3D_USER_23
Definition layer_ids.h:589
@ LAYER_3D_NAVIGATOR
Definition layer_ids.h:617
@ LAYER_3D_USER_28
Definition layer_ids.h:594
@ LAYER_3D_BOUNDING_BOXES
Definition layer_ids.h:618
@ LAYER_3D_START
Definition layer_ids.h:550
@ LAYER_3D_USER_32
Definition layer_ids.h:598
@ LAYER_3D_USER_19
Definition layer_ids.h:585
@ LAYER_3D_USER_25
Definition layer_ids.h:591
@ LAYER_3D_ADHESIVE
Definition layer_ids.h:562
@ LAYER_3D_USER_3
Definition layer_ids.h:569
@ LAYER_3D_USER_21
Definition layer_ids.h:587
@ LAYER_3D_USER_26
Definition layer_ids.h:592
@ LAYER_3D_SMD_MODELS
Definition layer_ids.h:613
@ LAYER_3D_USER_24
Definition layer_ids.h:590
@ LAYER_3D_USER_43
Definition layer_ids.h:609
@ LAYER_3D_BACKGROUND_TOP
Definition layer_ids.h:553
@ LAYER_3D_USER_COMMENTS
Definition layer_ids.h:563
@ LAYER_3D_SOLDERMASK_BOTTOM
Definition layer_ids.h:559
@ LAYER_3D_USER_11
Definition layer_ids.h:577
@ LAYER_3D_USER_41
Definition layer_ids.h:607
@ LAYER_3D_USER_17
Definition layer_ids.h:583
@ LAYER_3D_BOARD
Definition layer_ids.h:554
@ LAYER_3D_PLATED_BARRELS
Definition layer_ids.h:620
@ LAYER_3D_USER_ECO1
Definition layer_ids.h:565
@ LAYER_3D_USER_20
Definition layer_ids.h:586
@ LAYER_3D_USER_31
Definition layer_ids.h:597
@ LAYER_3D_USER_ECO2
Definition layer_ids.h:566
@ LAYER_3D_TH_MODELS
Definition layer_ids.h:612
@ LAYER_3D_USER_15
Definition layer_ids.h:581
@ LAYER_3D_USER_38
Definition layer_ids.h:604
@ LAYER_3D_USER_13
Definition layer_ids.h:579
@ LAYER_3D_USER_33
Definition layer_ids.h:599
@ LAYER_3D_USER_35
Definition layer_ids.h:601
@ LAYER_3D_USER_29
Definition layer_ids.h:595
@ LAYER_3D_USER_40
Definition layer_ids.h:606
@ LAYER_3D_SILKSCREEN_TOP
Definition layer_ids.h:558
@ LAYER_3D_VIRTUAL_MODELS
Definition layer_ids.h:614
@ LAYER_3D_MODELS_MARKED_DNP
Definition layer_ids.h:616
@ LAYER_3D_USER_7
Definition layer_ids.h:573
@ LAYER_3D_COPPER_TOP
Definition layer_ids.h:555
@ LAYER_3D_USER_12
Definition layer_ids.h:578
@ LAYER_3D_SOLDERPASTE
Definition layer_ids.h:561
@ LAYER_3D_USER_30
Definition layer_ids.h:596
@ LAYER_3D_USER_36
Definition layer_ids.h:602
@ LAYER_3D_USER_2
Definition layer_ids.h:568
@ LAYER_3D_USER_18
Definition layer_ids.h:584
@ LAYER_3D_OFF_BOARD_SILK
Definition layer_ids.h:619
@ LAYER_3D_USER_14
Definition layer_ids.h:580
@ LAYER_3D_USER_5
Definition layer_ids.h:571
@ LAYER_3D_USER_37
Definition layer_ids.h:603
@ LAYER_3D_USER_10
Definition layer_ids.h:576
@ LAYER_3D_MODELS_NOT_IN_POS
Definition layer_ids.h:615
@ LAYER_3D_USER_42
Definition layer_ids.h:608
@ LAYER_3D_USER_45
Definition layer_ids.h:611
@ LAYER_3D_USER_6
Definition layer_ids.h:572
@ LAYER_3D_USER_4
Definition layer_ids.h:570
@ LAYER_3D_USER_27
Definition layer_ids.h:593
@ LAYER_3D_USER_DRAWINGS
Definition layer_ids.h:564
@ LAYER_3D_COPPER_BOTTOM
Definition layer_ids.h:556
@ LAYER_3D_USER_39
Definition layer_ids.h:605
@ LAYER_3D_USER_9
Definition layer_ids.h:575
@ LAYER_3D_BACKGROUND_BOTTOM
Definition layer_ids.h:552
@ LAYER_3D_USER_16
Definition layer_ids.h:582
@ LAYER_3D_SILKSCREEN_BOTTOM
Definition layer_ids.h:557
@ LAYER_3D_USER_34
Definition layer_ids.h:600
@ LAYER_3D_END
Definition layer_ids.h:622
@ 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
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:60
@ UNDEFINED_LAYER
Definition layer_ids.h:61
KICOMMON_API wxFont GetInfoFont(wxWindow *aWindow)
const int c_IndicatorSizeDIP
Definition ui_common.h:52
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Definition kicad_algo.h:100
#define _HKI(x)
Definition page_info.cpp:44
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
see class PGM_BASE
wxString name
A name for this layer set.