Add support for check zones before plot to plot jobsets

This commit is contained in:
Mark Roszko 2025-07-30 20:47:54 -04:00
parent 5b3d4fc91d
commit 4b70e20250
14 changed files with 143 additions and 11 deletions

View File

@ -49,7 +49,8 @@ JOB_EXPORT_PCB_PLOT::JOB_EXPORT_PCB_PLOT( PLOT_FORMAT aFormat, const std::string
m_plotLayerSequence(), m_plotLayerSequence(),
m_plotOnAllLayersSequence(), m_plotOnAllLayersSequence(),
m_drillShapeOption( DRILL_MARKS::FULL_DRILL_SHAPE ), m_drillShapeOption( DRILL_MARKS::FULL_DRILL_SHAPE ),
m_useDrillOrigin( false ) m_useDrillOrigin( false ),
m_checkZonesBeforePlot( false )
{ {
m_params.emplace_back( new JOB_PARAM_LSEQ( "layers", m_params.emplace_back( new JOB_PARAM_LSEQ( "layers",
&m_plotLayerSequence, m_plotLayerSequence ) ); &m_plotLayerSequence, m_plotLayerSequence ) );
@ -101,4 +102,6 @@ JOB_EXPORT_PCB_PLOT::JOB_EXPORT_PCB_PLOT( PLOT_FORMAT aFormat, const std::string
m_params.emplace_back( new JOB_PARAM<wxString>( "drawing_sheet", m_params.emplace_back( new JOB_PARAM<wxString>( "drawing_sheet",
&m_drawingSheet, m_drawingSheet ) ); &m_drawingSheet, m_drawingSheet ) );
m_params.emplace_back( new JOB_PARAM<bool>( "check_zones", &m_checkZonesBeforePlot, m_checkZonesBeforePlot ) );
} }

View File

@ -79,4 +79,6 @@ public:
///< Used by SVG/DXF/PDF/Gerbers ///< Used by SVG/DXF/PDF/Gerbers
bool m_useDrillOrigin; bool m_useDrillOrigin;
bool m_checkZonesBeforePlot;
}; };

View File

@ -71,6 +71,9 @@ namespace CLI
#define ARG_BACKGROUND_COLOR "--bg-color" #define ARG_BACKGROUND_COLOR "--bg-color"
#define ARG_BACKGROUND_COLOR_DESC "Background color, can be in hex #rrggbb, #rrggbbaa; or css rgb(r,g,b), rgba(r,g,b,a) format" #define ARG_BACKGROUND_COLOR_DESC "Background color, can be in hex #rrggbb, #rrggbbaa; or css rgb(r,g,b), rgba(r,g,b,a) format"
#define ARG_CHECK_ZONES "--check-zones"
#define ARG_CHECK_ZONES_DESC "Check and refill zones if required"
struct PCB_EXPORT_BASE_COMMAND : public COMMAND struct PCB_EXPORT_BASE_COMMAND : public COMMAND
{ {
PCB_EXPORT_BASE_COMMAND( const std::string& aName, bool aInputCanBeDir = false, PCB_EXPORT_BASE_COMMAND( const std::string& aName, bool aInputCanBeDir = false,

View File

@ -116,6 +116,10 @@ CLI::PCB_EXPORT_DXF_COMMAND::PCB_EXPORT_DXF_COMMAND() :
.scan<'g', double>() .scan<'g', double>()
.default_value( 1.0 ) .default_value( 1.0 )
.metavar( "SCALE" ); .metavar( "SCALE" );
m_argParser.add_argument( ARG_CHECK_ZONES )
.help( UTF8STDSTR( _( ARG_CHECK_ZONES_DESC ) ) )
.flag();
} }
@ -146,6 +150,7 @@ int CLI::PCB_EXPORT_DXF_COMMAND::doPerform( KIWAY& aKiway )
dxfJob->m_plotDrawingSheet = m_argParser.get<bool>( ARG_INCLUDE_BORDER_TITLE ); dxfJob->m_plotDrawingSheet = m_argParser.get<bool>( ARG_INCLUDE_BORDER_TITLE );
dxfJob->m_subtractSolderMaskFromSilk = m_argParser.get<bool>( ARG_SUBTRACT_SOLDERMASK ); dxfJob->m_subtractSolderMaskFromSilk = m_argParser.get<bool>( ARG_SUBTRACT_SOLDERMASK );
dxfJob->m_scale = m_argParser.get<double>( ARG_SCALE ); dxfJob->m_scale = m_argParser.get<double>( ARG_SCALE );
dxfJob->m_checkZonesBeforePlot = m_argParser.get<bool>( ARG_CHECK_ZONES );
if( m_argParser.get<bool>( DEPRECATED_ARG_PLOT_INVISIBLE_TEXT ) ) if( m_argParser.get<bool>( DEPRECATED_ARG_PLOT_INVISIBLE_TEXT ) )
wxFprintf( stdout, DEPRECATED_ARD_PLOT_INVISIBLE_TEXT_WARNING ); wxFprintf( stdout, DEPRECATED_ARD_PLOT_INVISIBLE_TEXT_WARNING );

View File

@ -102,6 +102,10 @@ CLI::PCB_EXPORT_GERBER_COMMAND::PCB_EXPORT_GERBER_COMMAND( const std::string& aN
m_argParser.add_argument( DEPRECATED_ARG_PLOT_INVISIBLE_TEXT ) m_argParser.add_argument( DEPRECATED_ARG_PLOT_INVISIBLE_TEXT )
.help( UTF8STDSTR( _( DEPRECATED_ARG_PLOT_INVISIBLE_TEXT_DESC ) ) ) .help( UTF8STDSTR( _( DEPRECATED_ARG_PLOT_INVISIBLE_TEXT_DESC ) ) )
.flag(); .flag();
m_argParser.add_argument( ARG_CHECK_ZONES )
.help( UTF8STDSTR( _( ARG_CHECK_ZONES_DESC ) ) )
.flag();
} }
@ -132,6 +136,7 @@ int CLI::PCB_EXPORT_GERBER_COMMAND::populateJob( JOB_EXPORT_PCB_GERBER* aJob )
aJob->m_useDrillOrigin = m_argParser.get<bool>( ARG_USE_DRILL_FILE_ORIGIN ); aJob->m_useDrillOrigin = m_argParser.get<bool>( ARG_USE_DRILL_FILE_ORIGIN );
aJob->m_useProtelFileExtension = !m_argParser.get<bool>( ARG_NO_PROTEL_EXTENSION ); aJob->m_useProtelFileExtension = !m_argParser.get<bool>( ARG_NO_PROTEL_EXTENSION );
aJob->m_precision = m_argParser.get<int>( ARG_PRECISION ); aJob->m_precision = m_argParser.get<int>( ARG_PRECISION );
aJob->m_checkZonesBeforePlot = m_argParser.get<bool>( ARG_CHECK_ZONES );
aJob->m_argLayers = From_UTF8( m_argParser.get<std::string>( ARG_LAYERS ).c_str() ); aJob->m_argLayers = From_UTF8( m_argParser.get<std::string>( ARG_LAYERS ).c_str() );
aJob->m_argCommonLayers = From_UTF8( m_argParser.get<std::string>( ARG_COMMON_LAYERS ).c_str() ); aJob->m_argCommonLayers = From_UTF8( m_argParser.get<std::string>( ARG_COMMON_LAYERS ).c_str() );

View File

@ -124,6 +124,10 @@ CLI::PCB_EXPORT_PDF_COMMAND::PCB_EXPORT_PDF_COMMAND() :
.default_value( std::string() ) .default_value( std::string() )
.help( UTF8STDSTR( _( ARG_BACKGROUND_COLOR_DESC ) ) ) .help( UTF8STDSTR( _( ARG_BACKGROUND_COLOR_DESC ) ) )
.metavar( "COLOR" ); .metavar( "COLOR" );
m_argParser.add_argument( ARG_CHECK_ZONES )
.help( UTF8STDSTR( _( ARG_CHECK_ZONES_DESC ) ) )
.flag();
} }
@ -156,6 +160,7 @@ int CLI::PCB_EXPORT_PDF_COMMAND::doPerform( KIWAY& aKiway )
pdfJob->m_colorTheme = From_UTF8( m_argParser.get<std::string>( ARG_THEME ).c_str() ); pdfJob->m_colorTheme = From_UTF8( m_argParser.get<std::string>( ARG_THEME ).c_str() );
pdfJob->m_negative = m_argParser.get<bool>( ARG_NEGATIVE ); pdfJob->m_negative = m_argParser.get<bool>( ARG_NEGATIVE );
pdfJob->m_scale = m_argParser.get<double>( ARG_SCALE ); pdfJob->m_scale = m_argParser.get<double>( ARG_SCALE );
pdfJob->m_checkZonesBeforePlot = m_argParser.get<bool>( ARG_CHECK_ZONES );
pdfJob->m_sketchPadsOnFabLayers = m_argParser.get<bool>( ARG_SKETCH_PADS_ON_FAB_LAYERS ); pdfJob->m_sketchPadsOnFabLayers = m_argParser.get<bool>( ARG_SKETCH_PADS_ON_FAB_LAYERS );
pdfJob->m_hideDNPFPsOnFabLayers = m_argParser.get<bool>( ARG_HIDE_DNP_FPS_ON_FAB_LAYERS ); pdfJob->m_hideDNPFPsOnFabLayers = m_argParser.get<bool>( ARG_HIDE_DNP_FPS_ON_FAB_LAYERS );

View File

@ -140,6 +140,10 @@ CLI::PCB_EXPORT_PS_COMMAND::PCB_EXPORT_PS_COMMAND() :
.scan<'g', double>() .scan<'g', double>()
.default_value( 1.0 ) .default_value( 1.0 )
.metavar( "SCALE" ); .metavar( "SCALE" );
m_argParser.add_argument( ARG_CHECK_ZONES )
.help( UTF8STDSTR( _( ARG_CHECK_ZONES_DESC ) ) )
.flag();
} }
@ -168,6 +172,7 @@ int CLI::PCB_EXPORT_PS_COMMAND::doPerform( KIWAY& aKiway )
psJob->m_colorTheme = From_UTF8( m_argParser.get<std::string>( ARG_THEME ).c_str() ); psJob->m_colorTheme = From_UTF8( m_argParser.get<std::string>( ARG_THEME ).c_str() );
psJob->m_negative = m_argParser.get<bool>( ARG_NEGATIVE ); psJob->m_negative = m_argParser.get<bool>( ARG_NEGATIVE );
psJob->m_scale = m_argParser.get<double>( ARG_SCALE ); psJob->m_scale = m_argParser.get<double>( ARG_SCALE );
psJob->m_checkZonesBeforePlot = m_argParser.get<bool>( ARG_CHECK_ZONES );
psJob->m_sketchPadsOnFabLayers = m_argParser.get<bool>( ARG_SKETCH_PADS_ON_FAB_LAYERS ); psJob->m_sketchPadsOnFabLayers = m_argParser.get<bool>( ARG_SKETCH_PADS_ON_FAB_LAYERS );
psJob->m_hideDNPFPsOnFabLayers = m_argParser.get<bool>( ARG_HIDE_DNP_FPS_ON_FAB_LAYERS ); psJob->m_hideDNPFPsOnFabLayers = m_argParser.get<bool>( ARG_HIDE_DNP_FPS_ON_FAB_LAYERS );

View File

@ -125,6 +125,10 @@ CLI::PCB_EXPORT_SVG_COMMAND::PCB_EXPORT_SVG_COMMAND() :
.scan<'g', double>() .scan<'g', double>()
.default_value( 1.0 ) .default_value( 1.0 )
.metavar( "SCALE" ); .metavar( "SCALE" );
m_argParser.add_argument( ARG_CHECK_ZONES )
.help( UTF8STDSTR( _( ARG_CHECK_ZONES_DESC ) ) )
.flag();
} }
@ -144,6 +148,7 @@ int CLI::PCB_EXPORT_SVG_COMMAND::doPerform( KIWAY& aKiway )
svgJob->m_drawingSheet = m_argDrawingSheet; svgJob->m_drawingSheet = m_argDrawingSheet;
svgJob->m_subtractSolderMaskFromSilk = m_argParser.get<bool>( ARG_SUBTRACT_SOLDERMASK ); svgJob->m_subtractSolderMaskFromSilk = m_argParser.get<bool>( ARG_SUBTRACT_SOLDERMASK );
svgJob->m_scale = m_argParser.get<double>( ARG_SCALE ); svgJob->m_scale = m_argParser.get<double>( ARG_SCALE );
svgJob->m_checkZonesBeforePlot = m_argParser.get<bool>( ARG_CHECK_ZONES );
if( m_argParser.get<bool>( DEPRECATED_ARG_PLOT_INVISIBLE_TEXT ) ) if( m_argParser.get<bool>( DEPRECATED_ARG_PLOT_INVISIBLE_TEXT ) )
wxFprintf( stdout, DEPRECATED_ARD_PLOT_INVISIBLE_TEXT_WARNING ); wxFprintf( stdout, DEPRECATED_ARD_PLOT_INVISIBLE_TEXT_WARNING );

View File

@ -306,7 +306,14 @@ void DIALOG_PLOT::init_Dialog()
m_PSWidthAdjust = KiROUND( cfg->m_Plot.ps_fine_width_adjust * pcbIUScale.IU_PER_MM ); m_PSWidthAdjust = KiROUND( cfg->m_Plot.ps_fine_width_adjust * pcbIUScale.IU_PER_MM );
} }
m_zoneFillCheck->SetValue( cfg->m_Plot.check_zones_before_plotting ); if( m_job )
{
m_zoneFillCheck->SetValue( m_job->m_checkZonesBeforePlot );
}
else
{
m_zoneFillCheck->SetValue( cfg->m_Plot.check_zones_before_plotting );
}
m_browseButton->SetBitmap( KiBitmapBundle( BITMAPS::small_folder ) ); m_browseButton->SetBitmap( KiBitmapBundle( BITMAPS::small_folder ) );
m_openDirButton->SetBitmap( KiBitmapBundle( BITMAPS::small_new_window ) ); m_openDirButton->SetBitmap( KiBitmapBundle( BITMAPS::small_new_window ) );
@ -547,6 +554,9 @@ void DIALOG_PLOT::transferPlotParamsToJob()
} }
m_job->SetConfiguredOutputPath( m_plotOpts.GetOutputDirectory() ); m_job->SetConfiguredOutputPath( m_plotOpts.GetOutputDirectory() );
// this exists outside plot opts because its usually globally saved
m_job->m_checkZonesBeforePlot = m_zoneFillCheck->GetValue();
} }

View File

@ -109,7 +109,8 @@
PCBNEW_JOBS_HANDLER::PCBNEW_JOBS_HANDLER( KIWAY* aKiway ) : PCBNEW_JOBS_HANDLER::PCBNEW_JOBS_HANDLER( KIWAY* aKiway ) :
JOB_DISPATCHER( aKiway ), JOB_DISPATCHER( aKiway ),
m_cliBoard( nullptr ) m_cliBoard( nullptr ),
m_toolManager( nullptr )
{ {
Register( "3d", std::bind( &PCBNEW_JOBS_HANDLER::JobExportStep, this, std::placeholders::_1 ), Register( "3d", std::bind( &PCBNEW_JOBS_HANDLER::JobExportStep, this, std::placeholders::_1 ),
[aKiway]( JOB* job, wxWindow* aParent ) -> bool [aKiway]( JOB* job, wxWindow* aParent ) -> bool
@ -333,6 +334,37 @@ PCBNEW_JOBS_HANDLER::PCBNEW_JOBS_HANDLER( KIWAY* aKiway ) :
} }
PCBNEW_JOBS_HANDLER::~PCBNEW_JOBS_HANDLER()
{
}
TOOL_MANAGER* PCBNEW_JOBS_HANDLER::getToolManager( BOARD* aBrd )
{
TOOL_MANAGER* toolManager = nullptr;
if( Pgm().IsGUI() )
{
// we assume the PCB we are working on here is the one in the frame
// so use the frame's tool manager
PCB_EDIT_FRAME* editFrame = (PCB_EDIT_FRAME*) m_kiway->Player( FRAME_PCB_EDITOR, false );
if( editFrame )
toolManager = editFrame->GetToolManager();
}
else
{
if( m_toolManager == nullptr )
{
m_toolManager = std::make_unique<TOOL_MANAGER>();
}
toolManager = m_toolManager.get();
toolManager->SetEnvironment( aBrd, nullptr, nullptr, Kiface().KifaceSettings(), nullptr );
}
return toolManager;
}
BOARD* PCBNEW_JOBS_HANDLER::getBoard( const wxString& aPath ) BOARD* PCBNEW_JOBS_HANDLER::getBoard( const wxString& aPath )
{ {
BOARD* brd = nullptr; BOARD* brd = nullptr;
@ -826,7 +858,8 @@ int PCBNEW_JOBS_HANDLER::JobExportSvg( JOB* aJob )
if( aSvgJob == nullptr ) if( aSvgJob == nullptr )
return CLI::EXIT_CODES::ERR_UNKNOWN; return CLI::EXIT_CODES::ERR_UNKNOWN;
BOARD* brd = getBoard( aSvgJob->m_filename ); BOARD* brd = getBoard( aSvgJob->m_filename );
TOOL_MANAGER* toolManager = getToolManager( brd );
if( !brd ) if( !brd )
return CLI::EXIT_CODES::ERR_INVALID_INPUT_FILE; return CLI::EXIT_CODES::ERR_INVALID_INPUT_FILE;
@ -857,6 +890,14 @@ int PCBNEW_JOBS_HANDLER::JobExportSvg( JOB* aJob )
brd->GetProject()->ApplyTextVars( aJob->GetVarOverrides() ); brd->GetProject()->ApplyTextVars( aJob->GetVarOverrides() );
brd->SynchronizeProperties(); brd->SynchronizeProperties();
if( aSvgJob->m_checkZonesBeforePlot )
{
if( !toolManager->FindTool( ZONE_FILLER_TOOL_NAME ) )
toolManager->RegisterTool( new ZONE_FILLER_TOOL );
toolManager->GetTool<ZONE_FILLER_TOOL>()->CheckAllZones( nullptr );
}
if( aSvgJob->m_argLayers ) if( aSvgJob->m_argLayers )
aSvgJob->m_plotLayerSequence = convertLayerArg( aSvgJob->m_argLayers.value(), brd ); aSvgJob->m_plotLayerSequence = convertLayerArg( aSvgJob->m_argLayers.value(), brd );
@ -913,11 +954,21 @@ int PCBNEW_JOBS_HANDLER::JobExportDxf( JOB* aJob )
if( !brd ) if( !brd )
return CLI::EXIT_CODES::ERR_INVALID_INPUT_FILE; return CLI::EXIT_CODES::ERR_INVALID_INPUT_FILE;
TOOL_MANAGER* toolManager = getToolManager( brd );
aJob->SetTitleBlock( brd->GetTitleBlock() ); aJob->SetTitleBlock( brd->GetTitleBlock() );
loadOverrideDrawingSheet( brd, aDxfJob->m_drawingSheet ); loadOverrideDrawingSheet( brd, aDxfJob->m_drawingSheet );
brd->GetProject()->ApplyTextVars( aJob->GetVarOverrides() ); brd->GetProject()->ApplyTextVars( aJob->GetVarOverrides() );
brd->SynchronizeProperties(); brd->SynchronizeProperties();
if( aDxfJob->m_checkZonesBeforePlot )
{
if( !toolManager->FindTool( ZONE_FILLER_TOOL_NAME ) )
toolManager->RegisterTool( new ZONE_FILLER_TOOL );
toolManager->GetTool<ZONE_FILLER_TOOL>()->CheckAllZones( nullptr );
}
if( aDxfJob->m_argLayers ) if( aDxfJob->m_argLayers )
aDxfJob->m_plotLayerSequence = convertLayerArg( aDxfJob->m_argLayers.value(), brd ); aDxfJob->m_plotLayerSequence = convertLayerArg( aDxfJob->m_argLayers.value(), brd );
@ -995,11 +1046,21 @@ int PCBNEW_JOBS_HANDLER::JobExportPdf( JOB* aJob )
if( !brd ) if( !brd )
return CLI::EXIT_CODES::ERR_INVALID_INPUT_FILE; return CLI::EXIT_CODES::ERR_INVALID_INPUT_FILE;
TOOL_MANAGER* toolManager = getToolManager( brd );
pdfJob->SetTitleBlock( brd->GetTitleBlock() ); pdfJob->SetTitleBlock( brd->GetTitleBlock() );
loadOverrideDrawingSheet( brd, pdfJob->m_drawingSheet ); loadOverrideDrawingSheet( brd, pdfJob->m_drawingSheet );
brd->GetProject()->ApplyTextVars( pdfJob->GetVarOverrides() ); brd->GetProject()->ApplyTextVars( pdfJob->GetVarOverrides() );
brd->SynchronizeProperties(); brd->SynchronizeProperties();
if( pdfJob->m_checkZonesBeforePlot )
{
if( !toolManager->FindTool( ZONE_FILLER_TOOL_NAME ) )
toolManager->RegisterTool( new ZONE_FILLER_TOOL );
toolManager->GetTool<ZONE_FILLER_TOOL>()->CheckAllZones( nullptr );
}
if( pdfJob->m_argLayers ) if( pdfJob->m_argLayers )
pdfJob->m_plotLayerSequence = convertLayerArg( pdfJob->m_argLayers.value(), brd ); pdfJob->m_plotLayerSequence = convertLayerArg( pdfJob->m_argLayers.value(), brd );
@ -1083,6 +1144,8 @@ int PCBNEW_JOBS_HANDLER::JobExportPs( JOB* aJob )
if( !brd ) if( !brd )
return CLI::EXIT_CODES::ERR_INVALID_INPUT_FILE; return CLI::EXIT_CODES::ERR_INVALID_INPUT_FILE;
TOOL_MANAGER* toolManager = getToolManager( brd );
psJob->SetTitleBlock( brd->GetTitleBlock() ); psJob->SetTitleBlock( brd->GetTitleBlock() );
loadOverrideDrawingSheet( brd, psJob->m_drawingSheet ); loadOverrideDrawingSheet( brd, psJob->m_drawingSheet );
brd->GetProject()->ApplyTextVars( psJob->GetVarOverrides() ); brd->GetProject()->ApplyTextVars( psJob->GetVarOverrides() );
@ -1168,6 +1231,8 @@ int PCBNEW_JOBS_HANDLER::JobExportGerbers( JOB* aJob )
if( !brd ) if( !brd )
return CLI::EXIT_CODES::ERR_INVALID_INPUT_FILE; return CLI::EXIT_CODES::ERR_INVALID_INPUT_FILE;
TOOL_MANAGER* toolManager = getToolManager( brd );
wxString outPath = aGerberJob->GetFullOutputPath( brd->GetProject() ); wxString outPath = aGerberJob->GetFullOutputPath( brd->GetProject() );
if( !PATHS::EnsurePathExists( outPath, false ) ) if( !PATHS::EnsurePathExists( outPath, false ) )
@ -1181,6 +1246,14 @@ int PCBNEW_JOBS_HANDLER::JobExportGerbers( JOB* aJob )
brd->GetProject()->ApplyTextVars( aJob->GetVarOverrides() ); brd->GetProject()->ApplyTextVars( aJob->GetVarOverrides() );
brd->SynchronizeProperties(); brd->SynchronizeProperties();
if( aGerberJob->m_checkZonesBeforePlot )
{
if( !toolManager->FindTool( ZONE_FILLER_TOOL_NAME ) )
toolManager->RegisterTool( new ZONE_FILLER_TOOL );
toolManager->GetTool<ZONE_FILLER_TOOL>()->CheckAllZones( nullptr );
}
bool hasLayerListSpecified = false; // will be true if the user layer list is not empty bool hasLayerListSpecified = false; // will be true if the user layer list is not empty
if( aGerberJob->m_argLayers ) if( aGerberJob->m_argLayers )
@ -1388,10 +1461,20 @@ int PCBNEW_JOBS_HANDLER::JobExportGerber( JOB* aJob )
if( !brd ) if( !brd )
return CLI::EXIT_CODES::ERR_INVALID_INPUT_FILE; return CLI::EXIT_CODES::ERR_INVALID_INPUT_FILE;
TOOL_MANAGER* toolManager = getToolManager( brd );
aJob->SetTitleBlock( brd->GetTitleBlock() ); aJob->SetTitleBlock( brd->GetTitleBlock() );
brd->GetProject()->ApplyTextVars( aJob->GetVarOverrides() ); brd->GetProject()->ApplyTextVars( aJob->GetVarOverrides() );
brd->SynchronizeProperties(); brd->SynchronizeProperties();
if( aGerberJob->m_checkZonesBeforePlot )
{
if( !toolManager->FindTool( ZONE_FILLER_TOOL_NAME ) )
toolManager->RegisterTool( new ZONE_FILLER_TOOL );
toolManager->GetTool<ZONE_FILLER_TOOL>()->CheckAllZones( nullptr );
}
if( aGerberJob->m_argLayers ) if( aGerberJob->m_argLayers )
aGerberJob->m_plotLayerSequence = convertLayerArg( aGerberJob->m_argLayers.value(), brd ); aGerberJob->m_plotLayerSequence = convertLayerArg( aGerberJob->m_argLayers.value(), brd );
@ -2064,8 +2147,7 @@ int PCBNEW_JOBS_HANDLER::JobExportDrc( JOB* aJob )
drcEngine->SetDrawingSheet( getDrawingSheetProxyView( brd ) ); drcEngine->SetDrawingSheet( getDrawingSheetProxyView( brd ) );
// BOARD_COMMIT uses TOOL_MANAGER to grab the board internally so we must give it one // BOARD_COMMIT uses TOOL_MANAGER to grab the board internally so we must give it one
TOOL_MANAGER* toolManager = new TOOL_MANAGER; TOOL_MANAGER* toolManager = getToolManager( brd );
toolManager->SetEnvironment( brd, nullptr, nullptr, Kiface().KifaceSettings(), nullptr );
BOARD_COMMIT commit( toolManager ); BOARD_COMMIT commit( toolManager );
bool checkParity = drcJob->m_parity; bool checkParity = drcJob->m_parity;
@ -2137,10 +2219,10 @@ int PCBNEW_JOBS_HANDLER::JobExportDrc( JOB* aJob )
if( drcJob->m_refillZones ) if( drcJob->m_refillZones )
{ {
toolManager->RegisterTool( new ZONE_FILLER_TOOL ); if( !toolManager->FindTool( ZONE_FILLER_TOOL_NAME ) )
ZONE_FILLER_TOOL* zoneFiller = toolManager->GetTool<ZONE_FILLER_TOOL>(); toolManager->RegisterTool( new ZONE_FILLER_TOOL );
zoneFiller->FillAllZones( nullptr, m_progressReporter, true ); toolManager->GetTool<ZONE_FILLER_TOOL>()->FillAllZones( nullptr, m_progressReporter, true );
} }
drcEngine->SetProgressReporter( m_progressReporter ); drcEngine->SetProgressReporter( m_progressReporter );

View File

@ -31,11 +31,14 @@ class FOOTPRINT;
class JOB_EXPORT_PCB_GERBER; class JOB_EXPORT_PCB_GERBER;
class JOB_EXPORT_PCB_GERBERS; class JOB_EXPORT_PCB_GERBERS;
class JOB_FP_EXPORT_SVG; class JOB_FP_EXPORT_SVG;
class TOOL_MANAGER;
class PCBNEW_JOBS_HANDLER : public JOB_DISPATCHER class PCBNEW_JOBS_HANDLER : public JOB_DISPATCHER
{ {
public: public:
PCBNEW_JOBS_HANDLER( KIWAY* aKiway ); PCBNEW_JOBS_HANDLER( KIWAY* aKiway );
virtual ~PCBNEW_JOBS_HANDLER();
int JobExportStep( JOB* aJob ); int JobExportStep( JOB* aJob );
int JobExportRender( JOB* aJob ); int JobExportRender( JOB* aJob );
int JobExportSvg( JOB* aJob ); int JobExportSvg( JOB* aJob );
@ -67,7 +70,10 @@ private:
DS_PROXY_VIEW_ITEM* getDrawingSheetProxyView( BOARD* aBrd ); DS_PROXY_VIEW_ITEM* getDrawingSheetProxyView( BOARD* aBrd );
TOOL_MANAGER* getToolManager( BOARD* aBrd );
BOARD* m_cliBoard; BOARD* m_cliBoard;
std::unique_ptr<TOOL_MANAGER> m_toolManager;
}; };
#endif #endif

View File

@ -47,7 +47,7 @@
#include <core/profile.h> #include <core/profile.h>
ZONE_FILLER_TOOL::ZONE_FILLER_TOOL() : ZONE_FILLER_TOOL::ZONE_FILLER_TOOL() :
PCB_TOOL_BASE( "pcbnew.ZoneFiller" ), PCB_TOOL_BASE( ZONE_FILLER_TOOL_NAME ),
m_fillInProgress( false ) m_fillInProgress( false )
{ {
} }

View File

@ -36,6 +36,7 @@ class PROGRESS_REPORTER;
class WX_PROGRESS_REPORTER; class WX_PROGRESS_REPORTER;
class ZONE_FILLER; class ZONE_FILLER;
#define ZONE_FILLER_TOOL_NAME "pcbnew.ZoneFiller"
/** /**
* Handle actions specific to filling copper zones. * Handle actions specific to filling copper zones.

View File

@ -462,7 +462,7 @@ ZONE_FILLER::~ZONE_FILLER()
ZONE_FILLER_TOOL::ZONE_FILLER_TOOL() : ZONE_FILLER_TOOL::ZONE_FILLER_TOOL() :
PCB_TOOL_BASE( "pcbnew.ZoneFiller" ), PCB_TOOL_BASE( ZONE_FILLER_TOOL_NAME ),
m_fillInProgress( false ) m_fillInProgress( false )
{ {
} }