42#include <wx/bmpbuttn.h>
44#include <wx/textdlg.h>
45#include <wx/checkbox.h>
51#define RR APPEARANCE_CONTROLS_3D::APPEARANCE_SETTING_3D
151 int screenHeight = wxSystemSettings::GetMetric( wxSYS_SCREEN_Y );
152 m_pointSize = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ).GetPointSize();
172 _(
"Use board stackup colors" ) );
176 [
this]( wxCommandEvent& aEvent )
186 _(
"Use PCB editor copper colors" ) );
189 "layers (realtime renderer only)" ) );
192 [
this]( wxCommandEvent& aEvent )
203 wxEXPAND | wxALL, 5 );
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." ),
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." ),
250 if( wxBitmapButton* btn =
dynamic_cast<wxBitmapButton*
>( aEvent.GetEventObject() ) )
252 wxCommandEvent evt( wxEVT_BUTTON );
253 wxPostEvent( btn, evt );
305 if( child && child->GetWindow() )
317 const wxString& currentPreset =
m_frame->GetAdapter().m_Cfg->m_CurrentPreset;
331 if(
m_presetMRU.Index( aPresetName ) != wxNOT_FOUND )
342 std::vector<VIEWPORT3D> ret;
345 ret.emplace_back( viewport );
355 for(
const VIEWPORT3D& viewport : aViewportList )
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;
428 visibleLayers.set( aLayer, isVisible );
446 visibleLayers.set( aLayer, isVisible );
455 doFastRefresh =
true;
456 visibleLayers.set( aLayer, isVisible );
460 visibleLayers.set( aLayer, isVisible );
468 m_frame->GetAdapter().SetVisibleLayers( visibleLayers );
469 m_frame->GetAdapter().SetLayerColors( colors );
471 const wxString& currentPreset =
m_frame->GetAdapter().m_Cfg->m_CurrentPreset;
482 m_frame->GetCanvas()->Request_refresh();
493 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
494 std::map<int, COLOR4D> colors =
m_frame->GetAdapter().GetLayerColors();
496 m_frame->GetAdapter().SetVisibleLayers( visibleLayers );
498 int layer = aSwatch->GetId();
501 colors[ layer ] = newColor;
507 const std::vector<int> copperIndices{
514 if( std::find( copperIndices.begin(), copperIndices.end(), layer ) != copperIndices.end() )
516 for(
int index : copperIndices )
520 colors[
index] = newColor;
533 m_frame->GetAdapter().SetLayerColors( colors );
535 const wxString& currentPreset =
m_frame->GetAdapter().m_Cfg->m_CurrentPreset;
548 int swatchWidth =
m_windowLayers->ConvertDialogToPixels( wxSize( 8, 0 ) ).x;
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();
562 [&](
const std::unique_ptr<APPEARANCE_SETTING_3D>& aSetting )
564 wxBoxSizer* sizer =
new wxBoxSizer( wxHORIZONTAL );
565 int layer = aSetting->m_Id;
567 aSetting->m_Visible = visibleLayers.test( layer );
569 if( colors.count( layer ) )
574 swatch->SetToolTip(
_(
"Left double click or middle click to change color" ) );
585 "allow color editing." ),
586 10000, wxICON_INFORMATION );
589 sizer->Add( swatch, 0, wxALIGN_CENTER_VERTICAL, 0 );
590 aSetting->m_Ctl_color = swatch;
592 swatch->Bind( COLOR_SWATCH_CHANGED,
593 [
this]( wxCommandEvent& event )
595 auto swatch =
static_cast<COLOR_SWATCH*
>(
event.GetEventObject() );
603 sizer->AddSpacer( swatchWidth );
606 sizer->AddSpacer( 5 );
608 wxString layerName = aSetting->GetLabel();
612 layerName =
m_frame->GetBoard()->GetLayerName( boardLayer );
614 wxStaticText* label =
new wxStaticText(
m_windowLayers, layer, layerName );
616 label->SetToolTip( aSetting->GetTooltip() );
620 sizer->AddSpacer( swatchWidth );
627 aSetting->m_Visible );
629 btn_visible->Bind( TOGGLE_CHANGED,
630 [
this]( wxCommandEvent& aEvent )
632 int id =
static_cast<wxWindow*
>( aEvent.GetEventObject() )->GetId();
633 bool isVisible = aEvent.GetInt();
640 tip.Printf(
_(
"Show or hide %s" ), aSetting->GetLabel().Lower() );
641 btn_visible->SetToolTip( tip );
643 aSetting->m_Ctl_visibility = btn_visible;
644 sizer->Add( btn_visible, 0, wxALIGN_CENTER_VERTICAL, 0 );
647 sizer->AddSpacer( 5 );
648 sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL, 0 );
656 m_layerSettings.emplace_back( std::make_unique<APPEARANCE_SETTING_3D>( s_setting ) );
657 std::unique_ptr<APPEARANCE_SETTING_3D>& setting =
m_layerSettings.back();
659 if( setting->m_Spacer )
666 appendLayer( setting );
670 appendLayer( setting );
683 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
684 std::map<int, COLOR4D> colors =
m_frame->GetAdapter().GetLayerColors();
686 for( std::unique_ptr<APPEARANCE_SETTING_3D>& setting :
m_layerSettings )
688 if( setting->m_Spacer )
691 if( setting->m_Ctl_visibility )
692 setting->m_Ctl_visibility->SetValue( visibleLayers.test( setting->m_Id ) );
694 if( setting->m_Ctl_color )
696 setting->m_Ctl_color->SetSwatchColor( colors[ setting->m_Id ],
false );
725 if( !
m_frame->GetAdapter().m_Cfg->m_LayerPresets.empty() )
742 m_frame->GetAdapter().m_Cfg->m_CurrentPreset = wxEmptyString;
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();
748 auto it = std::find_if(
749 presets.begin(), presets.end(),
752 if( aPreset.name.Lower() == _(
"legacy colors" ) && m_cbUseBoardStackupColors->GetValue() )
755 for( int layer = LAYER_3D_BOARD; layer < LAYER_3D_END; ++layer )
757 if( aPreset.layers.test( layer ) != visibleLayers.test( layer ) )
761 for(
int layer : { LAYER_FP_REFERENCES, LAYER_FP_VALUES, LAYER_FP_TEXT } )
763 if( aPreset.layers.test( layer ) != visibleLayers.test( layer ) )
769 auto it1 = aPreset.colors.find( layer );
770 auto it2 = colors.find( layer );
772 if( it1 != aPreset.colors.end() && it2 != colors.end() && *it1 != *it2 )
779 if( it != presets.end() )
781 m_frame->GetAdapter().m_Cfg->m_CurrentPreset = it->name;
782 m_cbLayerPresets->SetStringSelection( it->name );
786 m_cbLayerPresets->SetSelection( m_cbLayerPresets->GetCount() - 3 );
809 auto resetSelection =
819 else if(
index == 1 )
823 else if(
index == count - 2 )
825 wxTextEntryDialog dlg( wxGetTopLevelParent(
this ),
_(
"Layer preset name:" ),
826 _(
"Save Layer Preset" ) );
828 if( dlg.ShowModal() != wxID_OK )
834 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
835 std::map<int, COLOR4D> colors =
m_frame->GetAdapter().GetLayerColors();
837 name = dlg.GetValue();
841 if( !
IsOK( wxGetTopLevelParent(
this ),
_(
"Overwrite existing preset?" ) ) )
847 preset->layers = visibleLayers;
848 preset->colors = colors;
863 else if(
index == count - 1 )
865 wxArrayString headers;
866 std::vector<wxArrayString> items;
868 headers.Add(
_(
"Presets" ) );
873 item.Add( preset.
name );
874 items.emplace_back( item );
890 return preset.name == name;
939 if( preset->name.Lower() ==
_(
"legacy colors" ) )
959 for( std::pair<const wxString, VIEWPORT3D>& pair :
m_viewports )
960 m_cbViewports->Append( pair.first,
static_cast<void*
>( &pair.second ) );
980 wxCHECK( viewport, );
984 if( !viewport->
name.IsEmpty() )
992 else if(
index == count - 2 )
997 wxTextEntryDialog dlg( wxGetTopLevelParent(
this ),
_(
"Viewport name:" ),
998 _(
"Save Viewport" ),
name );
1000 if( dlg.ShowModal() != wxID_OK )
1010 name = dlg.GetValue();
1033 else if(
index == count - 1 )
1036 wxArrayString headers;
1037 std::vector<wxArrayString> items;
1039 headers.Add(
_(
"Viewports" ) );
1041 for( std::pair<const wxString, VIEWPORT3D>& pair :
m_viewports )
1044 item.Add( pair.first );
1045 items.emplace_back( item );
1056 if( idx != wxNOT_FOUND )
1087 wxCHECK( viewport, );
1089 if(
m_frame->GetCurrentCamera().GetViewMatrix() != viewport->
matrix )
1097 m_frame->GetCurrentCamera().SetViewMatrix( aViewport.
matrix );
1100 m_frame->GetCanvas()->Request_refresh();
1102 m_frame->GetCanvas()->RenderRaytracingRequest();
static std::vector< int > inStackupColors
#define RR
Render Row abbreviation to reduce source width.
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Container for an appearance setting (can control a layer class, object type, etc.)
wxScrolledCanvas * m_windowLayers
wxBoxSizer * m_panelLayersSizer
wxChoice * m_cbLayerPresets
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)
wxBoxSizer * m_sizerOuter
wxStaticText * m_presetsLabel
wxStaticText * m_viewportsLabel
void OnLanguageChanged(wxCommandEvent &aEvent)
void CommonSettingsChanged()
VIEWPORT3D * m_lastSelectedViewport
wxArrayString m_viewportMRU
~APPEARANCE_CONTROLS_3D()
GRID_BITMAP_TOGGLE_RENDERER * m_toggleGridRenderer
wxCheckBox * m_cbUseBoardStackupColors
void onLayerPresetChanged(wxCommandEvent &aEvent) override
wxArrayString m_presetMRU
void updateLayerPresetWidget(const wxString &aName)
wxSize GetBestSize() const
std::vector< VIEWPORT3D > GetUserViewports() const
Return a list of viewports created by the user.
wxColour m_layerPanelColour
void ApplyViewport(const wxString &aPresetName)
void syncLayerPresetSelection()
void rebuildLayerPresetsWidget(bool aReset)
void onColorSwatchChanged(COLOR_SWATCH *aSwatch)
wxBoxSizer * m_envOuterSizer
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
wxCheckBox * m_cbUseBoardEditorCopperColors
wxBoxSizer * m_layersOuterSizer
void ApplyLayerPreset(const wxString &aPresetName)
void rebuildViewportsWidget()
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
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.
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
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.
LSET is a set of PCB_LAYER_IDs.
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:
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)
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
This file is part of the common library.
Declaration of the eda_3d_viewer class.
#define FOLLOW_PLOT_SETTINGS
#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)
@ LAYER_3D_SOLDERMASK_TOP
@ LAYER_3D_BOUNDING_BOXES
@ LAYER_3D_BACKGROUND_TOP
@ LAYER_3D_SOLDERMASK_BOTTOM
@ LAYER_3D_PLATED_BARRELS
@ LAYER_3D_SILKSCREEN_TOP
@ LAYER_3D_VIRTUAL_MODELS
@ LAYER_3D_MODELS_MARKED_DNP
@ LAYER_3D_OFF_BOARD_SILK
@ LAYER_3D_MODELS_NOT_IN_POS
@ LAYER_3D_BACKGROUND_BOTTOM
@ LAYER_3D_SILKSCREEN_BOTTOM
@ LAYER_FP_REFERENCES
Show footprints references (when texts are visible).
@ LAYER_FP_VALUES
Show footprints values (when texts are visible).
PCB_LAYER_ID
A quick note on layer IDs:
KICOMMON_API wxFont GetInfoFont(wxWindow *aWindow)
const int c_IndicatorSizeDIP
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
bool use_board_editor_copper_colors
wxString name
A name for this layer set.