44#include <wx/bmpbuttn.h>
46#include <wx/textdlg.h>
47#include <wx/checkbox.h>
52#define RR APPEARANCE_CONTROLS_3D::APPEARANCE_SETTING_3D
156 int screenHeight = wxSystemSettings::GetMetric( wxSYS_SCREEN_Y );
157 m_pointSize = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ).GetPointSize();
177 _(
"Use board stackup colors" ) );
181 [
this]( wxCommandEvent& aEvent )
191 _(
"Use PCB editor copper colors" ) );
194 "layers (realtime renderer only)" ) );
197 [
this]( wxCommandEvent& aEvent )
208 wxEXPAND | wxALL, 5 );
210 m_cbLayerPresets->SetToolTip( wxString::Format(
_(
"Save and restore color and visibility combinations.\n"
211 "Use %s+Tab to activate selector.\n"
212 "Successive Tabs while holding %s down will cycle through "
213 "presets in the popup." ),
217 m_cbViewports->SetToolTip( wxString::Format(
_(
"Save and restore camera position and zoom.\n"
218 "Use %s+Tab to activate selector.\n"
219 "Successive Tabs while holding %s down will cycle through "
220 "viewports in the popup." ),
255 if( wxBitmapButton* btn =
dynamic_cast<wxBitmapButton*
>( aEvent.GetEventObject() ) )
257 wxCommandEvent evt( wxEVT_BUTTON );
258 wxPostEvent( btn, evt );
310 if( child && child->GetWindow() )
322 const wxString& currentPreset =
m_frame->GetAdapter().m_Cfg->m_CurrentPreset;
336 if(
m_presetMRU.Index( aPresetName ) != wxNOT_FOUND )
347 std::vector<VIEWPORT3D> ret;
350 ret.emplace_back( viewport );
360 for(
const VIEWPORT3D& viewport : aViewportList )
405 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
406 const std::map<int, COLOR4D>& colors =
m_frame->GetAdapter().GetLayerColors();
407 bool killFollow =
false;
408 bool doFastRefresh =
false;
433 visibleLayers.set( aLayer, isVisible );
455 visibleLayers.set( aLayer, isVisible );
464 doFastRefresh =
true;
465 visibleLayers.set( aLayer, isVisible );
469 visibleLayers.set( aLayer, isVisible );
477 m_frame->GetAdapter().SetVisibleLayers( visibleLayers );
478 m_frame->GetAdapter().SetLayerColors( colors );
480 const wxString& currentPreset =
m_frame->GetAdapter().m_Cfg->m_CurrentPreset;
492 m_frame->GetCanvas()->Request_refresh();
503 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
504 std::map<int, COLOR4D> colors =
m_frame->GetAdapter().GetLayerColors();
506 m_frame->GetAdapter().SetVisibleLayers( visibleLayers );
508 int layer = aSwatch->GetId();
511 colors[ layer ] = newColor;
517 const std::vector<int> copperIndices{
524 if( std::find( copperIndices.begin(), copperIndices.end(), layer ) != copperIndices.end() )
526 for(
int index : copperIndices )
530 colors[
index] = newColor;
543 m_frame->GetAdapter().SetLayerColors( colors );
545 const wxString& currentPreset =
m_frame->GetAdapter().m_Cfg->m_CurrentPreset;
558 int swatchWidth =
m_windowLayers->ConvertDialogToPixels( wxSize( 8, 0 ) ).x;
560 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
561 std::map<int, COLOR4D> colors =
m_frame->GetAdapter().GetLayerColors();
562 std::map<int, COLOR4D> defaultColors =
m_frame->GetAdapter().GetDefaultColors();
563 LSET enabled =
m_frame->GetBoard()->GetEnabledLayers();
572 [&](
const std::unique_ptr<APPEARANCE_SETTING_3D>& aSetting )
574 wxBoxSizer* sizer =
new wxBoxSizer( wxHORIZONTAL );
575 int layer = aSetting->m_Id;
577 aSetting->m_Visible = visibleLayers.test( layer );
579 if( colors.count( layer ) )
584 swatch->SetToolTip(
_(
"Left double click or middle click to change color" ) );
595 "allow color editing." ),
596 10000, wxICON_INFORMATION );
599 sizer->Add( swatch, 0, wxALIGN_CENTER_VERTICAL, 0 );
600 aSetting->m_Ctl_color = swatch;
602 swatch->Bind( COLOR_SWATCH_CHANGED,
603 [
this]( wxCommandEvent& event )
605 auto swatch =
static_cast<COLOR_SWATCH*
>(
event.GetEventObject() );
613 sizer->AddSpacer( swatchWidth );
616 sizer->AddSpacer( 5 );
618 wxString layerName = aSetting->GetLabel();
622 layerName =
m_frame->GetBoard()->GetLayerName( boardLayer );
624 wxStaticText* label =
new wxStaticText(
m_windowLayers, layer, layerName );
626 label->SetToolTip( aSetting->GetTooltip() );
630 sizer->AddSpacer( swatchWidth );
637 aSetting->m_Visible );
639 btn_visible->Bind( TOGGLE_CHANGED,
640 [
this]( wxCommandEvent& aEvent )
642 int id =
static_cast<wxWindow*
>( aEvent.GetEventObject() )->GetId();
643 bool isVisible = aEvent.GetInt();
650 tip.Printf(
_(
"Show or hide %s" ), aSetting->GetLabel().Lower() );
651 btn_visible->SetToolTip( tip );
653 aSetting->m_Ctl_visibility = btn_visible;
654 sizer->Add( btn_visible, 0, wxALIGN_CENTER_VERTICAL, 0 );
657 sizer->AddSpacer( 5 );
658 sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL, 0 );
666 m_layerSettings.emplace_back( std::make_unique<APPEARANCE_SETTING_3D>( s_setting ) );
667 std::unique_ptr<APPEARANCE_SETTING_3D>& setting =
m_layerSettings.back();
669 if( setting->m_Spacer )
676 appendLayer( setting );
680 appendLayer( setting );
693 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
694 std::map<int, COLOR4D> colors =
m_frame->GetAdapter().GetLayerColors();
696 for( std::unique_ptr<APPEARANCE_SETTING_3D>& setting :
m_layerSettings )
698 if( setting->m_Spacer )
701 if( setting->m_Ctl_visibility )
702 setting->m_Ctl_visibility->SetValue( visibleLayers.test( setting->m_Id ) );
704 if( setting->m_Ctl_color )
706 setting->m_Ctl_color->SetSwatchColor( colors[ setting->m_Id ],
false );
735 if( !
m_frame->GetAdapter().m_Cfg->m_LayerPresets.empty() )
752 m_frame->GetAdapter().m_Cfg->m_CurrentPreset = wxEmptyString;
754 std::vector<LAYER_PRESET_3D>& presets =
m_frame->GetAdapter().m_Cfg->m_LayerPresets;
755 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
756 std::map<int, COLOR4D> colors =
m_frame->GetAdapter().GetLayerColors();
758 auto it = std::find_if(
759 presets.begin(), presets.end(),
762 if( aPreset.name.Lower() == _(
"legacy colors" ) && m_cbUseBoardStackupColors->GetValue() )
765 for( int layer = LAYER_3D_BOARD; layer < LAYER_3D_END; ++layer )
767 if( aPreset.layers.test( layer ) != visibleLayers.test( layer ) )
771 for(
int layer : { LAYER_FP_REFERENCES, LAYER_FP_VALUES, LAYER_FP_TEXT } )
773 if( aPreset.layers.test( layer ) != visibleLayers.test( layer ) )
779 auto it1 = aPreset.colors.find( layer );
780 auto it2 = colors.find( layer );
782 if( it1 != aPreset.colors.end() && it2 != colors.end() && *it1 != *it2 )
789 if( it != presets.end() )
791 m_frame->GetAdapter().m_Cfg->m_CurrentPreset = it->name;
792 m_cbLayerPresets->SetStringSelection( it->name );
796 m_cbLayerPresets->SetSelection( m_cbLayerPresets->GetCount() - 3 );
819 auto resetSelection =
829 else if(
index == 1 )
833 else if(
index == count - 2 )
835 wxTextEntryDialog dlg( wxGetTopLevelParent(
this ),
_(
"Layer preset name:" ),
836 _(
"Save Layer Preset" ) );
838 if( dlg.ShowModal() != wxID_OK )
844 std::bitset<LAYER_3D_END> visibleLayers =
m_frame->GetAdapter().GetVisibleLayers();
845 std::map<int, COLOR4D> colors =
m_frame->GetAdapter().GetLayerColors();
847 name = dlg.GetValue();
851 if( !
IsOK( wxGetTopLevelParent(
this ),
_(
"Overwrite existing preset?" ) ) )
857 preset->layers = visibleLayers;
858 preset->colors = colors;
873 else if(
index == count - 1 )
875 wxArrayString headers;
876 std::vector<wxArrayString> items;
878 headers.Add(
_(
"Presets" ) );
883 item.Add( preset.
name );
884 items.emplace_back( item );
900 return preset.name == name;
949 if( preset->name.Lower() ==
_(
"legacy colors" ) )
969 for( std::pair<const wxString, VIEWPORT3D>& pair :
m_viewports )
970 m_cbViewports->Append( pair.first,
static_cast<void*
>( &pair.second ) );
990 wxCHECK( viewport, );
994 if( !viewport->
name.IsEmpty() )
1002 else if(
index == count - 2 )
1007 wxTextEntryDialog dlg( wxGetTopLevelParent(
this ),
_(
"Viewport name:" ),
1008 _(
"Save Viewport" ),
name );
1010 if( dlg.ShowModal() != wxID_OK )
1020 name = dlg.GetValue();
1043 else if(
index == count - 1 )
1046 wxArrayString headers;
1047 std::vector<wxArrayString> items;
1049 headers.Add(
_(
"Viewports" ) );
1051 for( std::pair<const wxString, VIEWPORT3D>& pair :
m_viewports )
1054 item.Add( pair.first );
1055 items.emplace_back( item );
1066 if( idx != wxNOT_FOUND )
1097 wxCHECK( viewport, );
1099 if(
m_frame->GetCurrentCamera().GetViewMatrix() != viewport->
matrix )
1107 m_frame->GetCurrentCamera().SetViewMatrix( aViewport.
matrix );
1110 m_frame->GetCanvas()->Request_refresh();
1112 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 RebuildHitTestAsync()
Rebuild the raytracing hit-test scene in the background after a visibility change.
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.
bool use_board_editor_copper_colors
wxString name
A name for this layer set.