41#include <wx/bmpbuttn.h>
43#include <wx/textdlg.h>
44#include <wx/checkbox.h>
46#include <../3d_rendering/opengl/render_3d_opengl.h>
49#define RR APPEARANCE_CONTROLS_3D::APPEARANCE_SETTING_3D
81 _HKI(
"Do not clip silk layers to board outline" ) ),
85 _HKI(
"Background gradient start color" ) ),
87 _HKI(
"Background gradient end color" ) ),
99 wxWindow* aFocusOwner ) :
102 m_focusOwner( aFocusOwner ),
103 m_lastSelectedViewport( nullptr )
107 int screenHeight = wxSystemSettings::GetMetric( wxSYS_SCREEN_Y );
108 m_pointSize = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ).GetPointSize();
128 _(
"Use board stackup colors" ) );
132 [
this]( wxCommandEvent& aEvent )
143 _(
"Use board editor copper colors" ) );
146 _(
"Use the board editor copper colors (openGL only)" ) );
149 [
this]( wxCommandEvent& aEvent )
162 wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 7 );
164 m_cbLayerPresets->SetToolTip( wxString::Format(
_(
"Save and restore color and visibility "
166 "Use %s+Tab to activate selector.\n"
167 "Successive Tabs while holding %s down will "
168 "cycle through presets in the popup." ),
172 m_cbViewports->SetToolTip( wxString::Format(
_(
"Save and restore camera position and zoom.\n"
173 "Use %s+Tab to activate selector.\n"
174 "Successive Tabs while holding %s down will "
175 "cycle through viewports in the popup." ),
210 if( wxBitmapButton* btn =
dynamic_cast<wxBitmapButton*
>( aEvent.GetEventObject() ) )
212 wxCommandEvent evt( wxEVT_BUTTON );
213 wxPostEvent( btn, evt );
265 if( child && child->GetWindow() )
294 if(
m_presetMRU.Index( aPresetName ) != wxNOT_FOUND )
305 std::vector<VIEWPORT3D> ret;
308 ret.emplace_back( viewport );
318 for(
const VIEWPORT3D& viewport : aViewportList )
365 bool killFollow =
false;
366 bool doFastRefresh =
false;
391 visibleLayers.set( aLayer, isVisible );
408 visibleLayers.set( aLayer, isVisible );
417 doFastRefresh =
true;
418 visibleLayers.set( aLayer, isVisible );
422 visibleLayers.set( aLayer, isVisible );
458 int layer = aSwatch->GetId();
461 colors[ layer ] = newColor;
478 int swatchWidth =
m_windowLayers->ConvertDialogToPixels( wxSize( 8, 0 ) ).x;
491 [&](
const std::unique_ptr<APPEARANCE_SETTING_3D>& aSetting )
493 wxBoxSizer* sizer =
new wxBoxSizer( wxHORIZONTAL );
494 int layer = aSetting->m_Id;
496 aSetting->m_Visible = visibleLayers.test( layer );
498 if( colors.count( layer ) )
501 COLOR4D::WHITE, defaultColors[ layer ],
503 swatch->SetToolTip(
_(
"Left double click or middle click to change color" ) );
514 "allow color editing." ),
515 10000, wxICON_INFORMATION );
518 sizer->Add( swatch, 0, wxALIGN_CENTER_VERTICAL, 0 );
519 aSetting->m_Ctl_color = swatch;
521 swatch->Bind( COLOR_SWATCH_CHANGED,
522 [
this]( wxCommandEvent& event )
524 auto swatch =
static_cast<COLOR_SWATCH*
>(
event.GetEventObject() );
532 sizer->AddSpacer( swatchWidth );
535 sizer->AddSpacer( 5 );
538 aSetting->GetLabel() );
540 label->SetToolTip( aSetting->GetTooltip() );
544 sizer->AddSpacer( swatchWidth );
552 btn_visible->Bind( TOGGLE_CHANGED,
553 [
this]( wxCommandEvent& aEvent )
555 int id =
static_cast<wxWindow*
>( aEvent.GetEventObject() )->GetId();
556 bool isVisible = aEvent.GetInt();
563 tip.Printf(
_(
"Show or hide %s" ), aSetting->GetLabel().Lower() );
564 btn_visible->SetToolTip( tip );
566 aSetting->m_Ctl_visibility = btn_visible;
567 sizer->Add( btn_visible, 0, wxALIGN_CENTER_VERTICAL, 0 );
570 sizer->AddSpacer( 5 );
571 sizer->Add( label, 0, wxALIGN_CENTER_VERTICAL, 0 );
579 m_layerSettings.emplace_back( std::make_unique<APPEARANCE_SETTING_3D>( s_setting ) );
580 std::unique_ptr<APPEARANCE_SETTING_3D>& setting =
m_layerSettings.back();
582 if( setting->m_Spacer )
585 appendLayer( setting );
600 for( std::unique_ptr<APPEARANCE_SETTING_3D>& setting :
m_layerSettings )
602 if( setting->m_Spacer )
605 if( setting->m_Ctl_visibility )
606 setting->m_Ctl_visibility->SetValue( visibleLayers.test( setting->m_Id ) );
608 if( setting->m_Ctl_color )
610 setting->m_Ctl_color->SetSwatchColor( colors[ setting->m_Id ],
false );
662 auto it = std::find_if(
663 presets.begin(), presets.end(),
666 if( aPreset.name.Lower() == _(
"legacy colors" )
667 && m_cbUseBoardStackupColors->GetValue() )
674 if( aPreset.layers.test( layer ) != visibleLayers.test( layer ) )
678 for(
int layer : { LAYER_FP_REFERENCES, LAYER_FP_VALUES, LAYER_FP_TEXT } )
680 if( aPreset.layers.test( layer ) != visibleLayers.test( layer ) )
686 auto it1 = aPreset.colors.find( layer );
687 auto it2 = colors.find( layer );
689 if( it1 != aPreset.colors.end() && it2 != colors.end() && *it1 != *it2 )
696 if( it != presets.end() )
698 m_frame->GetAdapter().m_Cfg->m_CurrentPreset = it->name;
699 m_cbLayerPresets->SetStringSelection( it->name );
703 m_cbLayerPresets->SetSelection( m_cbLayerPresets->GetCount() - 3 );
726 auto resetSelection =
739 else if( index == 1 )
746 else if( index == count - 3 )
752 else if( index == count - 2 )
754 wxTextEntryDialog dlg( wxGetTopLevelParent(
this ),
_(
"Layer preset name:" ),
755 _(
"Save Layer Preset" ) );
757 if( dlg.ShowModal() != wxID_OK )
766 name = dlg.GetValue();
770 if( !
IsOK( wxGetTopLevelParent(
this ),
_(
"Overwrite existing preset?" ) ) )
776 preset->layers = visibleLayers;
777 preset->colors = colors;
791 else if( index == count - 1 )
793 wxArrayString headers;
794 std::vector<wxArrayString> items;
796 headers.Add(
_(
"Presets" ) );
801 item.Add( preset.
name );
802 items.emplace_back( item );
818 return preset.name == name;
854 if( aPreset.
name.Lower() ==
_(
"legacy colors" ) )
869 for( std::pair<const wxString, VIEWPORT3D>& pair :
m_viewports )
870 m_cbViewports->Append( pair.first,
static_cast<void*
>( &pair.second ) );
886 if( index >= 0 && index < count - 3 )
890 wxCHECK( viewport, );
894 if( !viewport->
name.IsEmpty() )
900 else if( index == count - 2 )
905 wxTextEntryDialog dlg( wxGetTopLevelParent(
this ),
_(
"Viewport name:" ),
906 _(
"Save Viewport" ),
name );
908 if( dlg.ShowModal() != wxID_OK )
918 name = dlg.GetValue();
940 else if( index == count - 1 )
943 wxArrayString headers;
944 std::vector<wxArrayString> items;
946 headers.Add(
_(
"Viewports" ) );
948 for( std::pair<const wxString, VIEWPORT3D>& pair :
m_viewports )
951 item.Add( pair.first );
952 items.emplace_back( item );
963 if( idx != wxNOT_FOUND )
988 if( index >= 0 && index < count - 3 )
992 wxCHECK( viewport, );
static std::vector< int > inStackupColors
#define RR
Render Row abbreviation to reduce source width.
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
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 LAYER_PRESET_3D &aPreset)
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 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.
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 showNotInPosFile
static TOOL_ACTION showTHT
static TOOL_ACTION showDNP
static TOOL_ACTION showSMD
static TOOL_ACTION showVirtual
static TOOL_ACTION showBBoxes
static TOOL_ACTION showAxis
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.
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.
@ 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).
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.
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.
std::bitset< LAYER_3D_END > layers
std::map< int, KIGFX::COLOR4D > colors