44#include <wx/bmpbuttn.h>
46#include <wx/textdlg.h>
47#include <wx/checkbox.h>
52#define RR APPEARANCE_CONTROLS_3D::APPEARANCE_SETTING_3D
152 int screenHeight = wxSystemSettings::GetMetric( wxSYS_SCREEN_Y );
153 m_pointSize = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ).GetPointSize();
173 _(
"Use board stackup colors" ) );
177 [
this]( wxCommandEvent& aEvent )
187 _(
"Use PCB editor copper colors" ) );
190 "layers (realtime renderer only)" ) );
193 [
this]( wxCommandEvent& aEvent )
204 wxEXPAND | wxALL, 5 );
206 m_cbLayerPresets->SetToolTip( wxString::Format(
_(
"Save and restore color and visibility combinations.\n"
207 "Use %s+Tab to activate selector.\n"
208 "Successive Tabs while holding %s down will cycle through "
209 "presets in the popup." ),
213 m_cbViewports->SetToolTip( wxString::Format(
_(
"Save and restore camera position and zoom.\n"
214 "Use %s+Tab to activate selector.\n"
215 "Successive Tabs while holding %s down will cycle through "
216 "viewports in the popup." ),
251 if( wxBitmapButton* btn =
dynamic_cast<wxBitmapButton*
>( aEvent.GetEventObject() ) )
253 wxCommandEvent evt( wxEVT_BUTTON );
254 wxPostEvent( btn, evt );
306 if( child && child->GetWindow() )
318 const wxString& currentPreset =
m_frame->GetAdapter().m_Cfg->m_CurrentPreset;
332 if(
m_presetMRU.Index( aPresetName ) != wxNOT_FOUND )
343 std::vector<VIEWPORT3D> ret;
346 ret.emplace_back( viewport );
356 for(
const VIEWPORT3D& viewport : aViewportList )
401 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
402 const std::map<int, COLOR4D>& colors =
m_frame->GetAdapter().GetLayerColors();
403 bool killFollow =
false;
404 bool doFastRefresh =
false;
429 visibleLayers.set( aLayer, isVisible );
447 visibleLayers.set( aLayer, isVisible );
456 doFastRefresh =
true;
457 visibleLayers.set( aLayer, isVisible );
461 visibleLayers.set( aLayer, isVisible );
469 m_frame->GetAdapter().SetVisibleLayers( visibleLayers );
470 m_frame->GetAdapter().SetLayerColors( colors );
472 const wxString& currentPreset =
m_frame->GetAdapter().m_Cfg->m_CurrentPreset;
483 m_frame->GetCanvas()->Request_refresh();
494 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
495 std::map<int, COLOR4D> colors =
m_frame->GetAdapter().GetLayerColors();
497 m_frame->GetAdapter().SetVisibleLayers( visibleLayers );
499 int layer = aSwatch->GetId();
502 colors[ layer ] = newColor;
508 const std::vector<int> copperIndices{
515 if( std::find( copperIndices.begin(), copperIndices.end(), layer ) != copperIndices.end() )
517 for(
int index : copperIndices )
521 colors[
index] = newColor;
534 m_frame->GetAdapter().SetLayerColors( colors );
536 const wxString& currentPreset =
m_frame->GetAdapter().m_Cfg->m_CurrentPreset;
549 int swatchWidth =
m_windowLayers->ConvertDialogToPixels( wxSize( 8, 0 ) ).x;
551 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
552 std::map<int, COLOR4D> colors =
m_frame->GetAdapter().GetLayerColors();
553 std::map<int, COLOR4D> defaultColors =
m_frame->GetAdapter().GetDefaultColors();
554 LSET enabled =
m_frame->GetBoard()->GetEnabledLayers();
563 [&](
const std::unique_ptr<APPEARANCE_SETTING_3D>& aSetting )
565 wxBoxSizer* sizer =
new wxBoxSizer( wxHORIZONTAL );
566 int layer = aSetting->m_Id;
568 aSetting->m_Visible = visibleLayers.test( layer );
570 if( colors.count( layer ) )
575 swatch->SetToolTip(
_(
"Left double click or middle click to change color" ) );
586 "allow color editing." ),
587 10000, wxICON_INFORMATION );
590 sizer->Add( swatch, 0, wxALIGN_CENTER_VERTICAL, 0 );
591 aSetting->m_Ctl_color = swatch;
593 swatch->Bind( COLOR_SWATCH_CHANGED,
594 [
this]( wxCommandEvent& event )
596 auto swatch =
static_cast<COLOR_SWATCH*
>(
event.GetEventObject() );
604 sizer->AddSpacer( swatchWidth );
607 sizer->AddSpacer( 5 );
609 wxString layerName = aSetting->GetLabel();
613 layerName =
m_frame->GetBoard()->GetLayerName( boardLayer );
615 wxStaticText* label =
new wxStaticText(
m_windowLayers, layer, layerName );
617 label->SetToolTip( aSetting->GetTooltip() );
621 sizer->AddSpacer( swatchWidth );
628 aSetting->m_Visible );
630 btn_visible->Bind( TOGGLE_CHANGED,
631 [
this]( wxCommandEvent& aEvent )
633 int id =
static_cast<wxWindow*
>( aEvent.GetEventObject() )->GetId();
634 bool isVisible = aEvent.GetInt();
641 tip.Printf(
_(
"Show or hide %s" ), aSetting->GetLabel().Lower() );
642 btn_visible->SetToolTip( tip );
644 aSetting->m_Ctl_visibility = btn_visible;
645 sizer->Add( btn_visible, 0, wxALIGN_CENTER_VERTICAL, 0 );
648 sizer->AddSpacer( 5 );
649 sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL, 0 );
657 m_layerSettings.emplace_back( std::make_unique<APPEARANCE_SETTING_3D>( s_setting ) );
658 std::unique_ptr<APPEARANCE_SETTING_3D>& setting =
m_layerSettings.back();
660 if( setting->m_Spacer )
667 appendLayer( setting );
671 appendLayer( setting );
684 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
685 std::map<int, COLOR4D> colors =
m_frame->GetAdapter().GetLayerColors();
687 for( std::unique_ptr<APPEARANCE_SETTING_3D>& setting :
m_layerSettings )
689 if( setting->m_Spacer )
692 if( setting->m_Ctl_visibility )
693 setting->m_Ctl_visibility->SetValue( visibleLayers.test( setting->m_Id ) );
695 if( setting->m_Ctl_color )
697 setting->m_Ctl_color->SetSwatchColor( colors[ setting->m_Id ],
false );
726 if( !
m_frame->GetAdapter().m_Cfg->m_LayerPresets.empty() )
743 m_frame->GetAdapter().m_Cfg->m_CurrentPreset = wxEmptyString;
745 std::vector<LAYER_PRESET_3D>& presets =
m_frame->GetAdapter().m_Cfg->m_LayerPresets;
746 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
747 std::map<int, COLOR4D> colors =
m_frame->GetAdapter().GetLayerColors();
749 auto it = std::find_if(
750 presets.begin(), presets.end(),
753 if( aPreset.name.Lower() == _(
"legacy colors" ) && m_cbUseBoardStackupColors->GetValue() )
756 for( int layer = LAYER_3D_BOARD; layer < LAYER_3D_END; ++layer )
758 if( aPreset.layers.test( layer ) != visibleLayers.test( layer ) )
762 for(
int layer : { LAYER_FP_REFERENCES, LAYER_FP_VALUES, LAYER_FP_TEXT } )
764 if( aPreset.layers.test( layer ) != visibleLayers.test( layer ) )
770 auto it1 = aPreset.colors.find( layer );
771 auto it2 = colors.find( layer );
773 if( it1 != aPreset.colors.end() && it2 != colors.end() && *it1 != *it2 )
780 if( it != presets.end() )
782 m_frame->GetAdapter().m_Cfg->m_CurrentPreset = it->name;
783 m_cbLayerPresets->SetStringSelection( it->name );
787 m_cbLayerPresets->SetSelection( m_cbLayerPresets->GetCount() - 3 );
810 auto resetSelection =
820 else if(
index == 1 )
824 else if(
index == count - 2 )
826 wxTextEntryDialog dlg( wxGetTopLevelParent(
this ),
_(
"Layer preset name:" ),
827 _(
"Save Layer Preset" ) );
829 if( dlg.ShowModal() != wxID_OK )
835 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
836 std::map<int, COLOR4D> colors =
m_frame->GetAdapter().GetLayerColors();
838 name = dlg.GetValue();
842 if( !
IsOK( wxGetTopLevelParent(
this ),
_(
"Overwrite existing preset?" ) ) )
848 preset->layers = visibleLayers;
849 preset->colors = colors;
864 else if(
index == count - 1 )
866 wxArrayString headers;
867 std::vector<wxArrayString> items;
869 headers.Add(
_(
"Presets" ) );
874 item.Add( preset.
name );
875 items.emplace_back( item );
891 return preset.name == name;
940 if( preset->name.Lower() ==
_(
"legacy colors" ) )
960 for( std::pair<const wxString, VIEWPORT3D>& pair :
m_viewports )
961 m_cbViewports->Append( pair.first,
static_cast<void*
>( &pair.second ) );
981 wxCHECK( viewport, );
985 if( !viewport->
name.IsEmpty() )
993 else if(
index == count - 2 )
998 wxTextEntryDialog dlg( wxGetTopLevelParent(
this ),
_(
"Viewport name:" ),
999 _(
"Save Viewport" ),
name );
1001 if( dlg.ShowModal() != wxID_OK )
1011 name = dlg.GetValue();
1034 else if(
index == count - 1 )
1037 wxArrayString headers;
1038 std::vector<wxArrayString> items;
1040 headers.Add(
_(
"Viewports" ) );
1042 for( std::pair<const wxString, VIEWPORT3D>& pair :
m_viewports )
1045 item.Add( pair.first );
1046 items.emplace_back( item );
1057 if( idx != wxNOT_FOUND )
1088 wxCHECK( viewport, );
1090 if(
m_frame->GetCurrentCamera().GetViewMatrix() != viewport->
matrix )
1098 m_frame->GetCurrentCamera().SetViewMatrix( aViewport.
matrix );
1101 m_frame->GetCanvas()->Request_refresh();
1103 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.