40#include <wx/bmpbuttn.h>
42#include <wx/textdlg.h>
43#include <wx/checkbox.h>
45#include <../3d_rendering/opengl/render_3d_opengl.h>
48#define RR APPEARANCE_CONTROLS_3D::APPEARANCE_SETTING_3D
142 m_focusOwner( aFocusOwner ),
143 m_lastSelectedViewport( nullptr )
147 int screenHeight = wxSystemSettings::GetMetric( wxSYS_SCREEN_Y );
148 m_pointSize = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ).GetPointSize();
168 _(
"Use board stackup colors" ) );
172 [
this]( wxCommandEvent& aEvent )
182 _(
"Use PCB editor copper colors" ) );
185 "layers (realtime renderer only)" ) );
188 [
this]( wxCommandEvent& aEvent )
199 wxEXPAND | wxALL, 5 );
201 m_cbLayerPresets->SetToolTip( wxString::Format(
_(
"Save and restore color and visibility combinations.\n"
202 "Use %s+Tab to activate selector.\n"
203 "Successive Tabs while holding %s down will cycle through "
204 "presets in the popup." ),
208 m_cbViewports->SetToolTip( wxString::Format(
_(
"Save and restore camera position and zoom.\n"
209 "Use %s+Tab to activate selector.\n"
210 "Successive Tabs while holding %s down will cycle through "
211 "viewports in the popup." ),
246 if( wxBitmapButton* btn =
dynamic_cast<wxBitmapButton*
>( aEvent.GetEventObject() ) )
248 wxCommandEvent evt( wxEVT_BUTTON );
249 wxPostEvent( btn, evt );
301 if( child && child->GetWindow() )
327 if(
m_presetMRU.Index( aPresetName ) != wxNOT_FOUND )
338 std::vector<VIEWPORT3D> ret;
341 ret.emplace_back( viewport );
351 for(
const VIEWPORT3D& viewport : aViewportList )
398 bool killFollow =
false;
399 bool doFastRefresh =
false;
424 visibleLayers.set( aLayer, isVisible );
441 visibleLayers.set( aLayer, isVisible );
450 doFastRefresh =
true;
451 visibleLayers.set( aLayer, isVisible );
455 visibleLayers.set( aLayer, isVisible );
493 int layer = aSwatch->GetId();
496 colors[ layer ] = newColor;
535 int swatchWidth =
m_windowLayers->ConvertDialogToPixels( wxSize( 8, 0 ) ).x;
549 [&](
const std::unique_ptr<APPEARANCE_SETTING_3D>& aSetting )
551 wxBoxSizer* sizer =
new wxBoxSizer( wxHORIZONTAL );
552 int layer = aSetting->m_Id;
554 aSetting->m_Visible = visibleLayers.test( layer );
556 if( colors.count( layer ) )
559 COLOR4D::WHITE, defaultColors[ layer ],
561 swatch->SetToolTip(
_(
"Left double click or middle click to change color" ) );
572 "allow color editing." ),
573 10000, wxICON_INFORMATION );
576 sizer->Add( swatch, 0, wxALIGN_CENTER_VERTICAL, 0 );
577 aSetting->m_Ctl_color = swatch;
579 swatch->Bind( COLOR_SWATCH_CHANGED,
580 [
this]( wxCommandEvent& event )
582 auto swatch =
static_cast<COLOR_SWATCH*
>(
event.GetEventObject() );
590 sizer->AddSpacer( swatchWidth );
593 sizer->AddSpacer( 5 );
595 wxString layerName = aSetting->GetLabel();
601 wxStaticText* label =
new wxStaticText(
m_windowLayers, layer, layerName );
603 label->SetToolTip( aSetting->GetTooltip() );
607 sizer->AddSpacer( swatchWidth );
614 aSetting->m_Visible );
616 btn_visible->Bind( TOGGLE_CHANGED,
617 [
this]( wxCommandEvent& aEvent )
619 int id =
static_cast<wxWindow*
>( aEvent.GetEventObject() )->GetId();
620 bool isVisible = aEvent.GetInt();
627 tip.Printf(
_(
"Show or hide %s" ), aSetting->GetLabel().Lower() );
628 btn_visible->SetToolTip( tip );
630 aSetting->m_Ctl_visibility = btn_visible;
631 sizer->Add( btn_visible, 0, wxALIGN_CENTER_VERTICAL, 0 );
634 sizer->AddSpacer( 5 );
635 sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL, 0 );
643 m_layerSettings.emplace_back( std::make_unique<APPEARANCE_SETTING_3D>( s_setting ) );
644 std::unique_ptr<APPEARANCE_SETTING_3D>& setting =
m_layerSettings.back();
646 if( setting->m_Spacer )
653 appendLayer( setting );
657 appendLayer( setting );
673 for( std::unique_ptr<APPEARANCE_SETTING_3D>& setting :
m_layerSettings )
675 if( setting->m_Spacer )
678 if( setting->m_Ctl_visibility )
679 setting->m_Ctl_visibility->SetValue( visibleLayers.test( setting->m_Id ) );
681 if( setting->m_Ctl_color )
683 setting->m_Ctl_color->SetSwatchColor( colors[ setting->m_Id ],
false );
731 auto it = std::find_if(
732 presets.begin(), presets.end(),
735 if( aPreset.name.Lower() == _(
"legacy colors" ) && m_cbUseBoardStackupColors->GetValue() )
738 for( int layer = LAYER_3D_BOARD; layer < LAYER_3D_END; ++layer )
740 if( aPreset.layers.test( layer ) != visibleLayers.test( layer ) )
744 for(
int layer : { LAYER_FP_REFERENCES, LAYER_FP_VALUES, LAYER_FP_TEXT } )
746 if( aPreset.layers.test( layer ) != visibleLayers.test( layer ) )
752 auto it1 = aPreset.colors.find( layer );
753 auto it2 = colors.find( layer );
755 if( it1 != aPreset.colors.end() && it2 != colors.end() && *it1 != *it2 )
762 if( it != presets.end() )
764 m_frame->GetAdapter().m_Cfg->m_CurrentPreset = it->name;
765 m_cbLayerPresets->SetStringSelection( it->name );
769 m_cbLayerPresets->SetSelection( m_cbLayerPresets->GetCount() - 3 );
792 auto resetSelection =
802 else if( index == 1 )
806 else if( index == count - 3 )
812 else if( index == count - 2 )
814 wxTextEntryDialog dlg( wxGetTopLevelParent(
this ),
_(
"Layer preset name:" ),
815 _(
"Save Layer Preset" ) );
817 if( dlg.ShowModal() != wxID_OK )
826 name = dlg.GetValue();
830 if( !
IsOK( wxGetTopLevelParent(
this ),
_(
"Overwrite existing preset?" ) ) )
836 preset->layers = visibleLayers;
837 preset->colors = colors;
851 else if( index == count - 1 )
853 wxArrayString headers;
854 std::vector<wxArrayString> items;
856 headers.Add(
_(
"Presets" ) );
861 item.Add( preset.
name );
862 items.emplace_back( item );
878 return preset.name == name;
921 if( preset->name.Lower() ==
_(
"legacy colors" ) )
941 for( std::pair<const wxString, VIEWPORT3D>& pair :
m_viewports )
942 m_cbViewports->Append( pair.first,
static_cast<void*
>( &pair.second ) );
958 if( index >= 0 && index < count - 3 )
962 wxCHECK( viewport, );
966 if( !viewport->
name.IsEmpty() )
972 else if( index == count - 2 )
977 wxTextEntryDialog dlg( wxGetTopLevelParent(
this ),
_(
"Viewport name:" ),
978 _(
"Save Viewport" ),
name );
980 if( dlg.ShowModal() != wxID_OK )
990 name = dlg.GetValue();
1011 else if( index == count - 1 )
1014 wxArrayString headers;
1015 std::vector<wxArrayString> items;
1017 headers.Add(
_(
"Viewports" ) );
1019 for( std::pair<const wxString, VIEWPORT3D>& pair :
m_viewports )
1022 item.Add( pair.first );
1023 items.emplace_back( item );
1034 if( idx != wxNOT_FOUND )
1059 if( index >= 0 && index < count - 3 )
1063 wxCHECK( viewport, );
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.)
Class APPEARANCE_CONTROLS_3D_BASE.
wxScrolledCanvas * m_windowLayers
wxBoxSizer * m_panelLayersSizer
wxChoice * m_cbLayerPresets
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()
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::map< int, COLOR4D > GetLayerColors() const
Build a color list which is used to store colors layers.
std::bitset< LAYER_3D_END > GetVisibleLayers() const
void SetLayerColors(const std::map< int, COLOR4D > &aColors)
EDA_3D_VIEWER_SETTINGS * m_Cfg
std::map< int, COLOR4D > GetDefaultColors() const
const wxString GetLayerName(PCB_LAYER_ID aLayer) const
Return the name of a aLayer.
const LSET & GetEnabledLayers() const
A proxy function that calls the corresponding function in m_BoardSettings.
const glm::mat4 & GetViewMatrix() const
void SetViewMatrix(glm::mat4 aViewMatrix)
Set the affine matrix to be applied to a transformation camera.
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
RENDER_3D_BASE * GetCurrentRender() const
void RenderRaytracingRequest()
Request to render the current view in Raytracing mode.
void Request_refresh(bool aRedrawImmediately=true)
Schedule a refresh update of the canvas.
Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard.
void NewDisplay(bool aForceImmediateRedraw=false)
Reload and refresh (rebuild) the 3D scene.
EDA_3D_CANVAS * GetCanvas()
CAMERA & GetCurrentCamera()
BOARD_ADAPTER & GetAdapter()
LAYER_PRESET_3D * FindPreset(const wxString &aName)
std::vector< LAYER_PRESET_3D > m_LayerPresets
WX_INFOBAR * GetInfoBar()
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_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
void delete_if(_Container &__c, _Function &&__f)
Deletes all values from __c for which __f returns true.
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.