ADDED: appearance preset selection to Render Jobs.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/20682
This commit is contained in:
Jeff Young 2025-04-17 13:01:04 +01:00
parent df8250fd70
commit 70cbdbff89
8 changed files with 191 additions and 18 deletions

View File

@ -84,6 +84,7 @@ JOB_PCB_RENDER::JOB_PCB_RENDER() :
JOB( "render", false ), m_filename() JOB( "render", false ), m_filename()
{ {
m_params.emplace_back( new JOB_PARAM<FORMAT>( "format", &m_format, m_format ) ); m_params.emplace_back( new JOB_PARAM<FORMAT>( "format", &m_format, m_format ) );
m_params.emplace_back( new JOB_PARAM<std::string>( "preset", &m_appearancePreset, m_appearancePreset ) );
m_params.emplace_back( new JOB_PARAM<QUALITY>( "quality", &m_quality, m_quality ) ); m_params.emplace_back( new JOB_PARAM<QUALITY>( "quality", &m_quality, m_quality ) );
m_params.emplace_back( new JOB_PARAM<BG_STYLE>( "bg_style", &m_bgStyle, m_bgStyle ) ); m_params.emplace_back( new JOB_PARAM<BG_STYLE>( "bg_style", &m_bgStyle, m_bgStyle ) );
m_params.emplace_back( new JOB_PARAM<SIDE>( "side", &m_side, m_side ) ); m_params.emplace_back( new JOB_PARAM<SIDE>( "side", &m_side, m_side ) );

View File

@ -86,7 +86,7 @@ public:
BG_STYLE m_bgStyle = BG_STYLE::DEFAULT; BG_STYLE m_bgStyle = BG_STYLE::DEFAULT;
int m_width = 0; int m_width = 0;
int m_height = 0; int m_height = 0;
std::string m_colorPreset; std::string m_appearancePreset;
SIDE m_side = SIDE::TOP; SIDE m_side = SIDE::TOP;
double m_zoom = 1.0; double m_zoom = 1.0;
bool m_perspective = false; bool m_perspective = false;

View File

@ -254,9 +254,10 @@ CLI::PCB_RENDER_COMMAND::PCB_RENDER_COMMAND() : COMMAND( "render" )
m_argParser.add_argument( ARG_PRESET ) m_argParser.add_argument( ARG_PRESET )
.default_value( std::string( wxString( FOLLOW_PLOT_SETTINGS ) ) ) .default_value( std::string( wxString( FOLLOW_PLOT_SETTINGS ) ) )
.metavar( "PRESET" ) .metavar( "PRESET" )
.help( UTF8STDSTR( wxString::Format( _( "Color preset. Options: %s, %s, %s, ..." ), .help( UTF8STDSTR( wxString::Format( _( "Appearance preset. Options: %s, %s, or user-defined "
FOLLOW_PCB, FOLLOW_PLOT_SETTINGS, "preset name" ),
LEGACY_PRESET_FLAG ) ) ); FOLLOW_PCB,
FOLLOW_PLOT_SETTINGS ) ) );
m_argParser.add_argument( ARG_FLOOR ) m_argParser.add_argument( ARG_FLOOR )
.flag() .flag()
@ -326,7 +327,14 @@ int CLI::PCB_RENDER_COMMAND::doPerform( KIWAY& aKiway )
renderJob->m_filename = m_argInput; renderJob->m_filename = m_argInput;
renderJob->SetVarOverrides( m_argDefineVars ); renderJob->SetVarOverrides( m_argDefineVars );
renderJob->m_colorPreset = m_argParser.get<std::string>( ARG_PRESET ); renderJob->m_appearancePreset = m_argParser.get<std::string>( ARG_PRESET );
if( renderJob->m_appearancePreset == LEGACY_PRESET_FLAG )
{
wxFprintf( stderr, _( "Invalid preset\n" ) );
return EXIT_CODES::ERR_ARGS;
}
renderJob->m_width = m_argParser.get<int>( ARG_WIDTH ); renderJob->m_width = m_argParser.get<int>( ARG_WIDTH );
renderJob->m_height = m_argParser.get<int>( ARG_HEIGHT ); renderJob->m_height = m_argParser.get<int>( ARG_HEIGHT );
renderJob->m_zoom = m_argParser.get<double>( ARG_ZOOM ); renderJob->m_zoom = m_argParser.get<double>( ARG_ZOOM );

View File

@ -22,6 +22,10 @@
#include <jobs/job_pcb_render.h> #include <jobs/job_pcb_render.h>
#include <i18n_utility.h> #include <i18n_utility.h>
#include <wx/display.h> #include <wx/display.h>
#include <pgm_base.h>
#include <settings/settings_manager.h>
#include <3d_viewer/eda_3d_viewer_settings.h>
static std::map<JOB_PCB_RENDER::BG_STYLE, wxString> bgStyleMap = { static std::map<JOB_PCB_RENDER::BG_STYLE, wxString> bgStyleMap = {
{ JOB_PCB_RENDER::BG_STYLE::DEFAULT, _HKI( "Default" ) }, { JOB_PCB_RENDER::BG_STYLE::DEFAULT, _HKI( "Default" ) },
@ -39,7 +43,8 @@ static std::map<JOB_PCB_RENDER::SIDE, wxString> sideMap = {
}; };
DIALOG_RENDER_JOB::DIALOG_RENDER_JOB( wxWindow* aParent, JOB_PCB_RENDER* aJob ) : DIALOG_RENDER_JOB::DIALOG_RENDER_JOB( wxWindow* aParent, JOB_PCB_RENDER* aJob ) :
DIALOG_RENDER_JOB_BASE( aParent ), m_job( aJob ) DIALOG_RENDER_JOB_BASE( aParent ),
m_job( aJob )
{ {
SetTitle( aJob->GetSettingsDialogTitle() ); SetTitle( aJob->GetSettingsDialogTitle() );
@ -52,6 +57,14 @@ DIALOG_RENDER_JOB::DIALOG_RENDER_JOB( wxWindow* aParent, JOB_PCB_RENDER* aJob )
for( const auto& [k, name] : sideMap ) for( const auto& [k, name] : sideMap )
m_choiceSide->Append( wxGetTranslation( name ) ); m_choiceSide->Append( wxGetTranslation( name ) );
SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
if( EDA_3D_VIEWER_SETTINGS* cfg = mgr.GetAppSettings<EDA_3D_VIEWER_SETTINGS>( "3d_viewer" ) )
{
for( const LAYER_PRESET_3D& preset : cfg->m_LayerPresets )
m_presetCtrl->Append( preset.name );
}
SetupStandardButtons(); SetupStandardButtons();
} }
@ -125,6 +138,12 @@ bool DIALOG_RENDER_JOB::TransferDataFromWindow()
m_job->m_format = getSelectedFormat(); m_job->m_format = getSelectedFormat();
m_job->m_quality = JOB_PCB_RENDER::QUALITY::JOB_SETTINGS; m_job->m_quality = JOB_PCB_RENDER::QUALITY::JOB_SETTINGS;
if( m_presetCtrl->GetSelection() == 0 )
m_job->m_appearancePreset = "";
else
m_job->m_appearancePreset = m_presetCtrl->GetStringSelection();
m_job->m_bgStyle = getSelectedBgStyle(); m_job->m_bgStyle = getSelectedBgStyle();
m_job->m_side = getSelectedSide(); m_job->m_side = getSelectedSide();
m_job->m_zoom = m_spinCtrlZoom->GetValue(); m_job->m_zoom = m_spinCtrlZoom->GetValue();
@ -167,6 +186,10 @@ bool DIALOG_RENDER_JOB::TransferDataToWindow()
m_textCtrlOutputFile->SetValue( m_job->GetConfiguredOutputPath() ); m_textCtrlOutputFile->SetValue( m_job->GetConfiguredOutputPath() );
setSelectedFormat( m_job->m_format ); setSelectedFormat( m_job->m_format );
if( !m_presetCtrl->SetStringSelection( m_job->m_appearancePreset ) )
m_presetCtrl->SetSelection( 0 );
setSelectedBgStyle( m_job->m_bgStyle ); setSelectedBgStyle( m_job->m_bgStyle );
setSelectedSide( m_job->m_side ); setSelectedSide( m_job->m_side );
m_spinCtrlZoom->SetValue( m_job->m_zoom ); m_spinCtrlZoom->SetValue( m_job->m_zoom );

View File

@ -44,29 +44,39 @@ DIALOG_RENDER_JOB_BASE::DIALOG_RENDER_JOB_BASE( wxWindow* parent, wxWindowID id,
m_dimensionsLabel->Wrap( -1 ); m_dimensionsLabel->Wrap( -1 );
fgSizerTop->Add( m_dimensionsLabel, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); fgSizerTop->Add( m_dimensionsLabel, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 );
wxBoxSizer* bSizer3; wxBoxSizer* bSizerDimensions;
bSizer3 = new wxBoxSizer( wxHORIZONTAL ); bSizerDimensions = new wxBoxSizer( wxHORIZONTAL );
m_spinCtrlWidth = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 128, 32767, 0 ); m_spinCtrlWidth = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 128, 32767, 0 );
bSizer3->Add( m_spinCtrlWidth, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 ); bSizerDimensions->Add( m_spinCtrlWidth, 0, wxRIGHT|wxALIGN_CENTER_VERTICAL, 5 );
m_staticText17 = new wxStaticText( this, wxID_ANY, _("px"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText17 = new wxStaticText( this, wxID_ANY, _("px"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText17->Wrap( -1 ); m_staticText17->Wrap( -1 );
bSizer3->Add( m_staticText17, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); bSizerDimensions->Add( m_staticText17, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
m_staticText19 = new wxStaticText( this, wxID_ANY, _("x"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText19 = new wxStaticText( this, wxID_ANY, _("x"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText19->Wrap( -1 ); m_staticText19->Wrap( -1 );
bSizer3->Add( m_staticText19, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 10 ); bSizerDimensions->Add( m_staticText19, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 10 );
m_spinCtrlHeight = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 128, 32767, 0 ); m_spinCtrlHeight = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 128, 32767, 0 );
bSizer3->Add( m_spinCtrlHeight, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); bSizerDimensions->Add( m_spinCtrlHeight, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 );
m_staticText182 = new wxStaticText( this, wxID_ANY, _("px"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticText182 = new wxStaticText( this, wxID_ANY, _("px"), wxDefaultPosition, wxDefaultSize, 0 );
m_staticText182->Wrap( -1 ); m_staticText182->Wrap( -1 );
bSizer3->Add( m_staticText182, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); bSizerDimensions->Add( m_staticText182, 0, wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 );
fgSizerTop->Add( bSizer3, 1, wxEXPAND, 5 ); fgSizerTop->Add( bSizerDimensions, 1, wxEXPAND, 5 );
m_presetLabel = new wxStaticText( this, wxID_ANY, _("Appearance preset:"), wxDefaultPosition, wxDefaultSize, 0 );
m_presetLabel->Wrap( -1 );
fgSizerTop->Add( m_presetLabel, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
wxString m_presetCtrlChoices[] = { _("Default") };
int m_presetCtrlNChoices = sizeof( m_presetCtrlChoices ) / sizeof( wxString );
m_presetCtrl = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_presetCtrlNChoices, m_presetCtrlChoices, 0 );
m_presetCtrl->SetSelection( 0 );
fgSizerTop->Add( m_presetCtrl, 0, wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM, 5 );
m_backgroundStyleLabel = new wxStaticText( this, wxID_ANY, _("Background style:"), wxDefaultPosition, wxDefaultSize, 0 ); m_backgroundStyleLabel = new wxStaticText( this, wxID_ANY, _("Background style:"), wxDefaultPosition, wxDefaultSize, 0 );
m_backgroundStyleLabel->Wrap( -1 ); m_backgroundStyleLabel->Wrap( -1 );

View File

@ -397,13 +397,13 @@
<property name="wrap">-1</property> <property name="wrap">-1</property>
</object> </object>
</object> </object>
<object class="sizeritem" expanded="false"> <object class="sizeritem" expanded="true">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxEXPAND</property> <property name="flag">wxEXPAND</property>
<property name="proportion">1</property> <property name="proportion">1</property>
<object class="wxBoxSizer" expanded="false"> <object class="wxBoxSizer" expanded="false">
<property name="minimum_size"></property> <property name="minimum_size"></property>
<property name="name">bSizer3</property> <property name="name">bSizerDimensions</property>
<property name="orient">wxHORIZONTAL</property> <property name="orient">wxHORIZONTAL</property>
<property name="permission">none</property> <property name="permission">none</property>
<object class="sizeritem" expanded="false"> <object class="sizeritem" expanded="false">
@ -720,6 +720,133 @@
</object> </object>
</object> </object>
</object> </object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
<property name="proportion">0</property>
<object class="wxStaticText" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Appearance preset:</property>
<property name="markup">0</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_presetLabel</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<property name="wrap">-1</property>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP|wxBOTTOM</property>
<property name="proportion">0</property>
<object class="wxChoice" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="choices">&quot;Default&quot;</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_presetCtrl</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="selection">0</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
</object>
</object>
<object class="sizeritem" expanded="false"> <object class="sizeritem" expanded="false">
<property name="border">5</property> <property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property> <property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property>

View File

@ -48,6 +48,8 @@ class DIALOG_RENDER_JOB_BASE : public DIALOG_SHIM
wxStaticText* m_staticText19; wxStaticText* m_staticText19;
wxSpinCtrl* m_spinCtrlHeight; wxSpinCtrl* m_spinCtrlHeight;
wxStaticText* m_staticText182; wxStaticText* m_staticText182;
wxStaticText* m_presetLabel;
wxChoice* m_presetCtrl;
wxStaticText* m_backgroundStyleLabel; wxStaticText* m_backgroundStyleLabel;
wxChoice* m_choiceBgStyle; wxChoice* m_choiceBgStyle;
wxCheckBox* m_cbRaytracing_proceduralTextures; wxCheckBox* m_cbRaytracing_proceduralTextures;

View File

@ -579,6 +579,8 @@ int PCBNEW_JOBS_HANDLER::JobExportRender( JOB* aJob )
boardAdapter.SetBoard( brd ); boardAdapter.SetBoard( brd );
boardAdapter.m_IsBoardView = false; boardAdapter.m_IsBoardView = false;
if( aRenderJob->m_appearancePreset.empty() )
boardAdapter.m_IsPreviewer = true; // Force display 3D models, regardless of 3D viewer options boardAdapter.m_IsPreviewer = true; // Force display 3D models, regardless of 3D viewer options
SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager(); SETTINGS_MANAGER& mgr = Pgm().GetSettingsManager();
@ -660,7 +662,7 @@ int PCBNEW_JOBS_HANDLER::JobExportRender( JOB* aJob )
45, 135, 225, 315, 45, 135, 225, 315, 45, 135, 225, 315, 45, 135, 225, 315,
}; };
cfg.m_CurrentPreset = aRenderJob->m_colorPreset; cfg.m_CurrentPreset = aRenderJob->m_appearancePreset;
boardAdapter.m_Cfg = &cfg; boardAdapter.m_Cfg = &cfg;
if( aRenderJob->m_bgStyle == JOB_PCB_RENDER::BG_STYLE::TRANSPARENT if( aRenderJob->m_bgStyle == JOB_PCB_RENDER::BG_STYLE::TRANSPARENT