From 01332a2cb51f8cba64181f0b21acf712fd4ab151 Mon Sep 17 00:00:00 2001 From: Jeff Young <jeff@rokeby.ie> Date: Sun, 18 Aug 2024 09:57:55 -0600 Subject: [PATCH] ADDED: plotting options for DNP footprints Also removes the plot-fp-refs, plot-fp-values and plot fp-text overrides from the GUI, but leaves them as job arguments. (Note that the job arguments also separate out sketching DNP graphics and plotting the 'X', which the GUI does not.) Fixes https://gitlab.com/kicad/code/kicad/-/issues/18056 --- common/jobs/job_export_pcb_pdf.cpp | 3 + common/jobs/job_export_pcb_pdf.h | 3 + common/jobs/job_export_pcb_svg.cpp | 3 + common/jobs/job_export_pcb_svg.h | 3 + common/jobs/job_fp_export_svg.cpp | 5 +- common/jobs/job_fp_export_svg.h | 4 + common/pcb_plot_params.keywords | 3 + kicad/cli/command_fp_export_svg.cpp | 15 ++ kicad/cli/command_pcb_export_base.h | 7 + kicad/cli/command_pcb_export_pdf.cpp | 15 ++ kicad/cli/command_pcb_export_svg.cpp | 15 ++ pcbnew/dialogs/dialog_export_svg.cpp | 3 + pcbnew/dialogs/dialog_plot.cpp | 51 ++-- pcbnew/dialogs/dialog_plot.h | 4 +- pcbnew/dialogs/dialog_plot_base.cpp | 36 ++- pcbnew/dialogs/dialog_plot_base.fbp | 334 +++++++++++++-------------- pcbnew/dialogs/dialog_plot_base.h | 23 +- pcbnew/exporters/export_svg.cpp | 4 + pcbnew/exporters/export_svg.h | 3 + pcbnew/pcb_plot_params.cpp | 50 ++-- pcbnew/pcb_plot_params.h | 11 + pcbnew/pcbnew_jobs_handler.cpp | 10 + pcbnew/pcbplot.h | 12 +- pcbnew/plot_board_layers.cpp | 14 ++ pcbnew/plot_brditems_plotter.cpp | 128 +++++++--- 25 files changed, 468 insertions(+), 291 deletions(-) diff --git a/common/jobs/job_export_pcb_pdf.cpp b/common/jobs/job_export_pcb_pdf.cpp index 7f2a5f39fb..d1b4e4c186 100644 --- a/common/jobs/job_export_pcb_pdf.cpp +++ b/common/jobs/job_export_pcb_pdf.cpp @@ -35,6 +35,9 @@ JOB_EXPORT_PCB_PDF::JOB_EXPORT_PCB_PDF( bool aIsCli ) : m_plotBorderTitleBlocks( false ), m_printMaskLayer(), m_sketchPadsOnFabLayers( false ), + m_hideDNPFPsOnFabLayers( false ), + m_sketchDNPFPsOnFabLayers( true ), + m_crossoutDNPFPsOnFabLayers( true ), m_drillShapeOption( 2 ) { } \ No newline at end of file diff --git a/common/jobs/job_export_pcb_pdf.h b/common/jobs/job_export_pcb_pdf.h index 92a96d3c37..2ded1bf74b 100644 --- a/common/jobs/job_export_pcb_pdf.h +++ b/common/jobs/job_export_pcb_pdf.h @@ -48,6 +48,9 @@ public: LSEQ m_printMaskLayer; bool m_sketchPadsOnFabLayers; + bool m_hideDNPFPsOnFabLayers; + bool m_sketchDNPFPsOnFabLayers; + bool m_crossoutDNPFPsOnFabLayers; // How holes in pads/vias are plotted: // 0 = no hole, 1 = small shape, 2 = actual shape diff --git a/common/jobs/job_export_pcb_svg.cpp b/common/jobs/job_export_pcb_svg.cpp index 63efcb8881..843b32e1dd 100644 --- a/common/jobs/job_export_pcb_svg.cpp +++ b/common/jobs/job_export_pcb_svg.cpp @@ -34,6 +34,9 @@ JOB_EXPORT_PCB_SVG::JOB_EXPORT_PCB_SVG( bool aIsCli ) : m_pageSizeMode( 0 ), m_printMaskLayer(), m_sketchPadsOnFabLayers( false ), + m_hideDNPFPsOnFabLayers( false ), + m_sketchDNPFPsOnFabLayers( true ), + m_crossoutDNPFPsOnFabLayers( true ), m_drillShapeOption( 2 ) { } \ No newline at end of file diff --git a/common/jobs/job_export_pcb_svg.h b/common/jobs/job_export_pcb_svg.h index 3f4dcf0384..c39c6db540 100644 --- a/common/jobs/job_export_pcb_svg.h +++ b/common/jobs/job_export_pcb_svg.h @@ -46,6 +46,9 @@ public: LSEQ m_printMaskLayer; bool m_sketchPadsOnFabLayers; + bool m_hideDNPFPsOnFabLayers; + bool m_sketchDNPFPsOnFabLayers; + bool m_crossoutDNPFPsOnFabLayers; // How holes in pads/vias are plotted: // 0 = no hole, 1 = small shape, 2 = actual shape diff --git a/common/jobs/job_fp_export_svg.cpp b/common/jobs/job_fp_export_svg.cpp index 2bb0d00b43..ed15af6347 100644 --- a/common/jobs/job_fp_export_svg.cpp +++ b/common/jobs/job_fp_export_svg.cpp @@ -27,6 +27,9 @@ JOB_FP_EXPORT_SVG::JOB_FP_EXPORT_SVG( bool aIsCli ) : m_footprint(), m_outputDirectory(), m_blackAndWhite( false ), - m_sketchPadsOnFabLayers( false ) + m_sketchPadsOnFabLayers( false ), + m_hideDNPFPsOnFabLayers( false ), + m_sketchDNPFPsOnFabLayers( true ), + m_crossoutDNPFPsOnFabLayers( true ) { } \ No newline at end of file diff --git a/common/jobs/job_fp_export_svg.h b/common/jobs/job_fp_export_svg.h index 6694342210..da3fdb4bfe 100644 --- a/common/jobs/job_fp_export_svg.h +++ b/common/jobs/job_fp_export_svg.h @@ -41,6 +41,10 @@ public: bool m_blackAndWhite; bool m_sketchPadsOnFabLayers; + bool m_hideDNPFPsOnFabLayers; + bool m_sketchDNPFPsOnFabLayers; + bool m_crossoutDNPFPsOnFabLayers; + LSEQ m_printMaskLayer; }; diff --git a/common/pcb_plot_params.keywords b/common/pcb_plot_params.keywords index bb20738e21..6e1b40ab20 100644 --- a/common/pcb_plot_params.keywords +++ b/common/pcb_plot_params.keywords @@ -1,4 +1,5 @@ creategerberjobfile +crossoutdnponfab dashed_line_dash_ratio dashed_line_gap_ratio disableapertmacros @@ -9,6 +10,7 @@ dxfusepcbnewfont excludeedgelayer false gerberprecision +hidednponfab hpglpendiameter hpglpennumber hpglpenoverlay @@ -36,6 +38,7 @@ pscolor psnegative scaleselection sketchpadsonfab +sketchdnponfab subtractmaskfromsilk svgprecision svguseinch diff --git a/kicad/cli/command_fp_export_svg.cpp b/kicad/cli/command_fp_export_svg.cpp index c8f45100c1..e8304cc7ea 100644 --- a/kicad/cli/command_fp_export_svg.cpp +++ b/kicad/cli/command_fp_export_svg.cpp @@ -54,6 +54,18 @@ CLI::FP_EXPORT_SVG_COMMAND::FP_EXPORT_SVG_COMMAND() : PCB_EXPORT_BASE_COMMAND( " .help( UTF8STDSTR( _( ARG_SKETCH_PADS_ON_FAB_LAYERS_DESC ) ) ) .flag(); + m_argParser.add_argument( "--hdnp", ARG_HIDE_DNP_FPS_ON_FAB_LAYERS ) + .help( UTF8STDSTR( _( ARG_HIDE_DNP_FPS_ON_FAB_LAYERS_DESC ) ) ) + .flag(); + + m_argParser.add_argument( "--sdnp", ARG_SKETCH_DNP_FPS_ON_FAB_LAYERS ) + .help( UTF8STDSTR( _( ARG_SKETCH_DNP_FPS_ON_FAB_LAYERS_DESC ) ) ) + .flag(); + + m_argParser.add_argument( "--cdnp", ARG_CROSSOUT_DNP_FPS_ON_FAB_LAYERS ) + .help( UTF8STDSTR( _( ARG_CROSSOUT_DNP_FPS_ON_FAB_LAYERS_DESC ) ) ) + .flag(); + m_argParser.add_argument( ARG_BLACKANDWHITE ) .help( UTF8STDSTR( _( ARG_BLACKANDWHITE_DESC ) ) ) .flag(); @@ -72,6 +84,9 @@ int CLI::FP_EXPORT_SVG_COMMAND::doPerform( KIWAY& aKiway ) svgJob->m_outputDirectory = m_argOutput; svgJob->m_blackAndWhite = m_argParser.get<bool>( ARG_BLACKANDWHITE ); svgJob->m_sketchPadsOnFabLayers = m_argParser.get<bool>( ARG_SKETCH_PADS_ON_FAB_LAYERS ); + svgJob->m_hideDNPFPsOnFabLayers = m_argParser.get<bool>( ARG_HIDE_DNP_FPS_ON_FAB_LAYERS ); + svgJob->m_sketchDNPFPsOnFabLayers = m_argParser.get<bool>( ARG_SKETCH_DNP_FPS_ON_FAB_LAYERS ); + svgJob->m_crossoutDNPFPsOnFabLayers = m_argParser.get<bool>( ARG_CROSSOUT_DNP_FPS_ON_FAB_LAYERS ); svgJob->m_footprint = From_UTF8( m_argParser.get<std::string>( ARG_FOOTPRINT ).c_str() ); svgJob->SetVarOverrides( m_argDefineVars ); diff --git a/kicad/cli/command_pcb_export_base.h b/kicad/cli/command_pcb_export_base.h index 4726548429..4fb3b5c67c 100644 --- a/kicad/cli/command_pcb_export_base.h +++ b/kicad/cli/command_pcb_export_base.h @@ -34,6 +34,13 @@ namespace CLI #define ARG_SKETCH_PADS_ON_FAB_LAYERS "--sketch-pads-on-fab-layers" #define ARG_SKETCH_PADS_ON_FAB_LAYERS_DESC "Draw pad outlines and their numbers on front and back fab layers" +#define ARG_HIDE_DNP_FPS_ON_FAB_LAYERS "--hide-DNP-footprints-on-fab-layers" +#define ARG_HIDE_DNP_FPS_ON_FAB_LAYERS_DESC "Don't plot text & graphics of DNP footprints on fab layers" +#define ARG_SKETCH_DNP_FPS_ON_FAB_LAYERS "--sketch-DNP-footprints-on-fab-layers" +#define ARG_SKETCH_DNP_FPS_ON_FAB_LAYERS_DESC "Plot graphics of DNP footprints in sketch mode on fab layers" +#define ARG_CROSSOUT_DNP_FPS_ON_FAB_LAYERS "--crossout-DNP-footprints-on-fab-layers" +#define ARG_CROSSOUT_DNP_FPS_ON_FAB_LAYERS_DESC "Plot an 'X' over the courtyard of DNP footprints on fab layers, and strikeout their reference designators" + #define ARG_DRILL_SHAPE_OPTION "--drill-shape-opt" #define ARG_DRILL_SHAPE_OPTION_DESC "Set pad/via drill shape option (0 = no shape, 1 = small shape, 2 = actual shape)" diff --git a/kicad/cli/command_pcb_export_pdf.cpp b/kicad/cli/command_pcb_export_pdf.cpp index b105703c65..6e23644136 100644 --- a/kicad/cli/command_pcb_export_pdf.cpp +++ b/kicad/cli/command_pcb_export_pdf.cpp @@ -57,6 +57,18 @@ CLI::PCB_EXPORT_PDF_COMMAND::PCB_EXPORT_PDF_COMMAND() : PCB_EXPORT_BASE_COMMAND( .help( UTF8STDSTR( _( ARG_SKETCH_PADS_ON_FAB_LAYERS_DESC ) ) ) .flag(); + m_argParser.add_argument( "--hdnp", ARG_HIDE_DNP_FPS_ON_FAB_LAYERS ) + .help( UTF8STDSTR( _( ARG_HIDE_DNP_FPS_ON_FAB_LAYERS_DESC ) ) ) + .flag(); + + m_argParser.add_argument( "--sdnp", ARG_SKETCH_DNP_FPS_ON_FAB_LAYERS ) + .help( UTF8STDSTR( _( ARG_SKETCH_DNP_FPS_ON_FAB_LAYERS_DESC ) ) ) + .flag(); + + m_argParser.add_argument( "--cdnp", ARG_CROSSOUT_DNP_FPS_ON_FAB_LAYERS ) + .help( UTF8STDSTR( _( ARG_CROSSOUT_DNP_FPS_ON_FAB_LAYERS_DESC ) ) ) + .flag(); + m_argParser.add_argument( ARG_NEGATIVE_SHORT, ARG_NEGATIVE ) .help( UTF8STDSTR( _( ARG_NEGATIVE_DESC ) ) ) .flag(); @@ -108,6 +120,9 @@ int CLI::PCB_EXPORT_PDF_COMMAND::doPerform( KIWAY& aKiway ) pdfJob->m_negative = m_argParser.get<bool>( ARG_NEGATIVE ); 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_sketchDNPFPsOnFabLayers = m_argParser.get<bool>( ARG_SKETCH_DNP_FPS_ON_FAB_LAYERS ); + pdfJob->m_crossoutDNPFPsOnFabLayers = m_argParser.get<bool>( ARG_CROSSOUT_DNP_FPS_ON_FAB_LAYERS ); pdfJob->m_drillShapeOption = m_argParser.get<int>( ARG_DRILL_SHAPE_OPTION ); pdfJob->m_printMaskLayer = m_selectedLayers; diff --git a/kicad/cli/command_pcb_export_svg.cpp b/kicad/cli/command_pcb_export_svg.cpp index ddc52278d6..ae2f652180 100644 --- a/kicad/cli/command_pcb_export_svg.cpp +++ b/kicad/cli/command_pcb_export_svg.cpp @@ -63,6 +63,18 @@ CLI::PCB_EXPORT_SVG_COMMAND::PCB_EXPORT_SVG_COMMAND() : PCB_EXPORT_BASE_COMMAND( .help( UTF8STDSTR( _( ARG_SKETCH_PADS_ON_FAB_LAYERS_DESC ) ) ) .flag(); + m_argParser.add_argument( "--hdnp", ARG_HIDE_DNP_FPS_ON_FAB_LAYERS ) + .help( UTF8STDSTR( _( ARG_HIDE_DNP_FPS_ON_FAB_LAYERS_DESC ) ) ) + .flag(); + + m_argParser.add_argument( "--sdnp", ARG_SKETCH_DNP_FPS_ON_FAB_LAYERS ) + .help( UTF8STDSTR( _( ARG_SKETCH_DNP_FPS_ON_FAB_LAYERS_DESC ) ) ) + .flag(); + + m_argParser.add_argument( "--cdnp", ARG_CROSSOUT_DNP_FPS_ON_FAB_LAYERS ) + .help( UTF8STDSTR( _( ARG_CROSSOUT_DNP_FPS_ON_FAB_LAYERS_DESC ) ) ) + .flag(); + m_argParser.add_argument( ARG_PAGE_SIZE ) .help( UTF8STDSTR( _( "Set page sizing mode (0 = page with frame and title block, 1 = " "current page size, 2 = board area only)" ) ) ) @@ -95,6 +107,9 @@ int CLI::PCB_EXPORT_SVG_COMMAND::doPerform( KIWAY& aKiway ) svgJob->m_pageSizeMode = m_argParser.get<int>( ARG_PAGE_SIZE ); svgJob->m_negative = m_argParser.get<bool>( ARG_NEGATIVE ); svgJob->m_sketchPadsOnFabLayers = m_argParser.get<bool>( ARG_SKETCH_PADS_ON_FAB_LAYERS ); + svgJob->m_hideDNPFPsOnFabLayers = m_argParser.get<bool>( ARG_HIDE_DNP_FPS_ON_FAB_LAYERS ); + svgJob->m_sketchDNPFPsOnFabLayers = m_argParser.get<bool>( ARG_SKETCH_DNP_FPS_ON_FAB_LAYERS ); + svgJob->m_crossoutDNPFPsOnFabLayers = m_argParser.get<bool>( ARG_CROSSOUT_DNP_FPS_ON_FAB_LAYERS ); svgJob->m_drillShapeOption = m_argParser.get<int>( ARG_DRILL_SHAPE_OPTION ); svgJob->m_drawingSheet = m_argDrawingSheet; diff --git a/pcbnew/dialogs/dialog_export_svg.cpp b/pcbnew/dialogs/dialog_export_svg.cpp index cf2ff2fad1..320ca05327 100644 --- a/pcbnew/dialogs/dialog_export_svg.cpp +++ b/pcbnew/dialogs/dialog_export_svg.cpp @@ -321,6 +321,9 @@ void DIALOG_EXPORT_SVG::ExportSVGFile( bool aOnlyOneFile ) svgPlotOptions.m_blackAndWhite = m_printBW; svgPlotOptions.m_printMaskLayer = m_printMaskLayer; svgPlotOptions.m_sketchPadsOnFabLayers = false; + svgPlotOptions.m_hideDNPFPsOnFabLayers = false; + svgPlotOptions.m_sketchDNPFPsOnFabLayers = true; + svgPlotOptions.m_crossoutDNPFPsOnFabLayers = true; svgPlotOptions.m_pageSizeMode = m_rbSvgPageSizeOpt->GetSelection(); PCBNEW_SETTINGS* cfg = m_parent->GetPcbNewSettings(); diff --git a/pcbnew/dialogs/dialog_plot.cpp b/pcbnew/dialogs/dialog_plot.cpp index a3a0c6a99b..3bb77f79e8 100644 --- a/pcbnew/dialogs/dialog_plot.cpp +++ b/pcbnew/dialogs/dialog_plot.cpp @@ -323,6 +323,21 @@ void DIALOG_PLOT::init_Dialog() m_plotPadNumbers->SetValue( m_plotOpts.GetPlotPadNumbers() ); m_plotPadNumbers->Enable( m_plotOpts.GetSketchPadsOnFabLayers() ); + m_plotDNP->SetValue( m_plotOpts.GetHideDNPFPsOnFabLayers() + || m_plotOpts.GetSketchDNPFPsOnFabLayers() + || m_plotOpts.GetCrossoutDNPFPsOnFabLayers() ); + + if( m_plotDNP->GetValue() ) + { + if( m_plotOpts.GetHideDNPFPsOnFabLayers() ) + m_hideDNP->SetValue( true ); + else + m_crossoutDNP->SetValue( true ); + } + + m_hideDNP->Enable( m_plotDNP->GetValue() ); + m_crossoutDNP->Enable( m_plotDNP->GetValue() ); + // Option to tent vias m_subtractMaskFromSilk->SetValue( m_plotOpts.GetSubtractMaskFromSilk() ); @@ -332,10 +347,7 @@ void DIALOG_PLOT::init_Dialog() // Option to plot page references: m_plotSheetRef->SetValue( m_plotOpts.GetPlotFrameRef() ); - // Options to plot texts on footprints - m_plotFootprintValues->SetValue( m_plotOpts.GetPlotValue() ); - m_plotFootprintRefs->SetValue( m_plotOpts.GetPlotReference() ); - m_plotFootprintText->SetValue( m_plotOpts.GetPlotFPText() ); + // Option to force ploting of hidden text in footprints m_plotInvisibleText->SetValue( m_plotOpts.GetPlotInvisibleText() ); // Options to plot pads and vias holes @@ -895,10 +907,13 @@ void DIALOG_PLOT::applyPlotSettings() tempOptions.SetPlotFrameRef( m_plotSheetRef->GetValue() ); tempOptions.SetSketchPadsOnFabLayers( m_sketchPadsOnFabLayers->GetValue() ); tempOptions.SetPlotPadNumbers( m_plotPadNumbers->GetValue() ); + tempOptions.SetHideDNPFPsOnFabLayers( m_plotDNP->GetValue() + && m_hideDNP->GetValue() ); + tempOptions.SetSketchDNPFPsOnFabLayers( m_plotDNP->GetValue() + && m_crossoutDNP->GetValue() ); + tempOptions.SetCrossoutDNPFPsOnFabLayers( m_plotDNP->GetValue() + && m_crossoutDNP->GetValue() ); tempOptions.SetUseAuxOrigin( m_useAuxOriginCheckBox->GetValue() ); - tempOptions.SetPlotValue( m_plotFootprintValues->GetValue() ); - tempOptions.SetPlotReference( m_plotFootprintRefs->GetValue() ); - tempOptions.SetPlotFPText( m_plotFootprintText->GetValue() ); tempOptions.SetPlotInvisibleText( m_plotInvisibleText->GetValue() ); tempOptions.SetScaleSelection( m_scaleOpt->GetSelection() ); @@ -1332,29 +1347,13 @@ void DIALOG_PLOT::onPlotAllListMoveDown( wxCommandEvent& aEvent ) } -void DIALOG_PLOT::onPlotFPRefs( wxCommandEvent& aEvent ) +void DIALOG_PLOT::onDNPCheckbox( wxCommandEvent& aEvent ) { - if( aEvent.IsChecked() ) - m_plotFootprintText->SetValue( true ); + m_hideDNP->Enable( aEvent.IsChecked() ); + m_crossoutDNP->Enable( aEvent.IsChecked() ); } -void DIALOG_PLOT::onPlotFPValues( wxCommandEvent& aEvent ) -{ - if( aEvent.IsChecked() ) - m_plotFootprintText->SetValue( true ); -} - - -void DIALOG_PLOT::onPlotFPText( wxCommandEvent& aEvent ) -{ - if( !aEvent.IsChecked() ) - { - m_plotFootprintRefs->SetValue( false ); - m_plotFootprintValues->SetValue( false ); - } -} - void DIALOG_PLOT::onSketchPads( wxCommandEvent& aEvent ) { m_plotPadNumbers->Enable( aEvent.IsChecked() ); diff --git a/pcbnew/dialogs/dialog_plot.h b/pcbnew/dialogs/dialog_plot.h index 86d7bb009b..d527bb776d 100644 --- a/pcbnew/dialogs/dialog_plot.h +++ b/pcbnew/dialogs/dialog_plot.h @@ -60,9 +60,7 @@ private: void onPlotAllListMoveUp( wxCommandEvent& aEvent ); void onPlotAllListMoveDown( wxCommandEvent& aEvent ); - void onPlotFPValues( wxCommandEvent& aEvent ) override; - void onPlotFPRefs( wxCommandEvent& aEvent ) override; - void onPlotFPText( wxCommandEvent& aEvent ) override; + void onDNPCheckbox( wxCommandEvent& event ) override; void onSketchPads( wxCommandEvent& event ) override; // other functions diff --git a/pcbnew/dialogs/dialog_plot_base.cpp b/pcbnew/dialogs/dialog_plot_base.cpp index eb093c7274..c2a275f40b 100644 --- a/pcbnew/dialogs/dialog_plot_base.cpp +++ b/pcbnew/dialogs/dialog_plot_base.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6) +// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -77,22 +77,23 @@ DIALOG_PLOT_BASE::DIALOG_PLOT_BASE( wxWindow* parent, wxWindowID id, const wxStr gbSizer1->Add( m_plotSheetRef, wxGBPosition( 0, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); - m_plotFootprintValues = new wxCheckBox( sbOptionsSizer->GetStaticBox(), wxID_ANY, _("Plot footprint values"), wxDefaultPosition, wxDefaultSize, 0 ); - m_plotFootprintValues->SetValue(true); - gbSizer1->Add( m_plotFootprintValues, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + m_plotDNP = new wxCheckBox( sbOptionsSizer->GetStaticBox(), wxID_ANY, _("Indicate DNP on fabrication layers"), wxDefaultPosition, wxDefaultSize, 0 ); + m_plotDNP->SetToolTip( _("Hide or cross-out DNP footprints on fabrication layers") ); - m_plotFootprintRefs = new wxCheckBox( sbOptionsSizer->GetStaticBox(), ID_PRINT_REF, _("Plot reference designators"), wxDefaultPosition, wxDefaultSize, 0 ); - m_plotFootprintRefs->SetValue(true); - gbSizer1->Add( m_plotFootprintRefs, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + gbSizer1->Add( m_plotDNP, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); - m_plotFootprintText = new wxCheckBox( sbOptionsSizer->GetStaticBox(), wxID_ANY, _("Plot footprint text"), wxDefaultPosition, wxDefaultSize, 0 ); - m_plotFootprintText->SetValue(true); - gbSizer1->Add( m_plotFootprintText, wxGBPosition( 3, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + m_hideDNP = new wxRadioButton( sbOptionsSizer->GetStaticBox(), wxID_ANY, _("Hide"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP ); + m_hideDNP->SetToolTip( _("Hide the footprint text and graphics") ); + + gbSizer1->Add( m_hideDNP, wxGBPosition( 3, 0 ), wxGBSpan( 1, 1 ), wxLEFT, 25 ); + + m_crossoutDNP = new wxRadioButton( sbOptionsSizer->GetStaticBox(), wxID_ANY, _("Cross-out"), wxDefaultPosition, wxDefaultSize, 0 ); + gbSizer1->Add( m_crossoutDNP, wxGBPosition( 4, 0 ), wxGBSpan( 1, 1 ), wxLEFT, 25 ); m_plotInvisibleText = new wxCheckBox( sbOptionsSizer->GetStaticBox(), wxID_ANY, _("Force plotting of invisible values / refs"), wxDefaultPosition, wxDefaultSize, 0 ); m_plotInvisibleText->SetToolTip( _("Force plot invisible footprint values and reference designators") ); - gbSizer1->Add( m_plotInvisibleText, wxGBPosition( 4, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + gbSizer1->Add( m_plotInvisibleText, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); m_sketchPadsOnFabLayers = new wxCheckBox( sbOptionsSizer->GetStaticBox(), ID_ALLOW_PRINT_PAD_ON_SILKSCREEN, _("Sketch pads on fabrication layers"), wxDefaultPosition, wxDefaultSize, 0 ); m_sketchPadsOnFabLayers->SetToolTip( _("Include pad outlines on F.Fab and B.Fab layers when plotting") ); @@ -100,11 +101,10 @@ DIALOG_PLOT_BASE::DIALOG_PLOT_BASE( wxWindow* parent, wxWindowID id, const wxStr gbSizer1->Add( m_sketchPadsOnFabLayers, wxGBPosition( 5, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); m_plotPadNumbers = new wxCheckBox( sbOptionsSizer->GetStaticBox(), wxID_ANY, _("Include pad numbers"), wxDefaultPosition, wxDefaultSize, 0 ); - m_plotPadNumbers->SetValue(true); gbSizer1->Add( m_plotPadNumbers, wxGBPosition( 6, 0 ), wxGBSpan( 1, 1 ), wxLEFT, 25 ); m_zoneFillCheck = new wxCheckBox( sbOptionsSizer->GetStaticBox(), wxID_ANY, _("Check zone fills before plotting"), wxDefaultPosition, wxDefaultSize, 0 ); - gbSizer1->Add( m_zoneFillCheck, wxGBPosition( 7, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + gbSizer1->Add( m_zoneFillCheck, wxGBPosition( 6, 1 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 30 ); drillMarksLabel = new wxStaticText( sbOptionsSizer->GetStaticBox(), wxID_ANY, _("Drill marks:"), wxDefaultPosition, wxDefaultSize, 0 ); drillMarksLabel->Wrap( -1 ); @@ -155,7 +155,7 @@ DIALOG_PLOT_BASE::DIALOG_PLOT_BASE( wxWindow* parent, wxWindowID id, const wxStr m_SizerSolderMaskAlert = new wxBoxSizer( wxHORIZONTAL ); - m_bitmapAlert = new wxStaticBitmap( this, wxID_ANY, wxArtProvider::GetBitmap( wxASCII_STR(wxART_WARNING), wxASCII_STR(wxART_CMN_DIALOG) ), wxDefaultPosition, wxDefaultSize, 0 ); + m_bitmapAlert = new wxStaticBitmap( this, wxID_ANY, wxArtProvider::GetBitmap( wxART_WARNING, wxART_CMN_DIALOG ), wxDefaultPosition, wxDefaultSize, 0 ); m_SizerSolderMaskAlert->Add( m_bitmapAlert, 0, wxEXPAND|wxTOP|wxBOTTOM|wxRIGHT, 5 ); wxBoxSizer* bSizerWarningText; @@ -474,9 +474,7 @@ DIALOG_PLOT_BASE::DIALOG_PLOT_BASE( wxWindow* parent, wxWindowID id, const wxStr this->Connect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( DIALOG_PLOT_BASE::OnInitDialog ) ); m_plotFormatOpt->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PLOT_BASE::SetPlotFormat ), NULL, this ); m_browseButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::OnOutputDirectoryBrowseClicked ), NULL, this ); - m_plotFootprintValues->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::onPlotFPValues ), NULL, this ); - m_plotFootprintRefs->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::onPlotFPRefs ), NULL, this ); - m_plotFootprintText->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::onPlotFPText ), NULL, this ); + m_plotDNP->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::onDNPCheckbox ), NULL, this ); m_sketchPadsOnFabLayers->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::onSketchPads ), NULL, this ); m_scaleOpt->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PLOT_BASE::OnSetScaleOpt ), NULL, this ); m_boardSetup->Connect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( DIALOG_PLOT_BASE::onBoardSetup ), NULL, this ); @@ -493,9 +491,7 @@ DIALOG_PLOT_BASE::~DIALOG_PLOT_BASE() this->Disconnect( wxEVT_INIT_DIALOG, wxInitDialogEventHandler( DIALOG_PLOT_BASE::OnInitDialog ) ); m_plotFormatOpt->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PLOT_BASE::SetPlotFormat ), NULL, this ); m_browseButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::OnOutputDirectoryBrowseClicked ), NULL, this ); - m_plotFootprintValues->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::onPlotFPValues ), NULL, this ); - m_plotFootprintRefs->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::onPlotFPRefs ), NULL, this ); - m_plotFootprintText->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::onPlotFPText ), NULL, this ); + m_plotDNP->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::onDNPCheckbox ), NULL, this ); m_sketchPadsOnFabLayers->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_PLOT_BASE::onSketchPads ), NULL, this ); m_scaleOpt->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_PLOT_BASE::OnSetScaleOpt ), NULL, this ); m_boardSetup->Disconnect( wxEVT_COMMAND_HYPERLINK, wxHyperlinkEventHandler( DIALOG_PLOT_BASE::onBoardSetup ), NULL, this ); diff --git a/pcbnew/dialogs/dialog_plot_base.fbp b/pcbnew/dialogs/dialog_plot_base.fbp index e1025cd495..e24c94e0fd 100644 --- a/pcbnew/dialogs/dialog_plot_base.fbp +++ b/pcbnew/dialogs/dialog_plot_base.fbp @@ -1,36 +1,34 @@ <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <wxFormBuilder_Project> - <FileVersion major="1" minor="18"/> + <FileVersion major="1" minor="17"/> <object class="Project" expanded="true"> + <property name="class_decoration">; </property> <property name="code_generation">C++</property> - <property name="cpp_class_decoration"></property> - <property name="cpp_disconnect_events">1</property> - <property name="cpp_event_generation">connect</property> - <property name="cpp_help_provider">none</property> - <property name="cpp_namespace"></property> - <property name="cpp_precompiled_header"></property> - <property name="cpp_use_array_enum">0</property> - <property name="cpp_use_enum">1</property> + <property name="disconnect_events">1</property> + <property name="disconnect_mode">source_name</property> + <property name="disconnect_php_events">0</property> + <property name="disconnect_python_events">0</property> <property name="embedded_files_path">res</property> <property name="encoding">UTF-8</property> + <property name="event_generation">connect</property> <property name="file">dialog_plot_base</property> <property name="first_id">1000</property> + <property name="help_provider">none</property> + <property name="image_path_wrapper_function_name"></property> + <property name="indent_with_spaces"></property> <property name="internationalize">1</property> - <property name="lua_skip_events">1</property> - <property name="lua_ui_table">UI</property> <property name="name">Dialog_Plot_base</property> + <property name="namespace"></property> <property name="path">.</property> - <property name="php_disconnect_events">0</property> - <property name="php_disconnect_mode">source_name</property> - <property name="php_skip_events">1</property> - <property name="python_disconnect_events">0</property> - <property name="python_disconnect_mode">source_name</property> - <property name="python_image_path_wrapper_function_name"></property> - <property name="python_indent_with_spaces"></property> - <property name="python_skip_events">1</property> + <property name="precompiled_header"></property> <property name="relative_path">1</property> + <property name="skip_lua_events">1</property> + <property name="skip_php_events">1</property> + <property name="skip_python_events">1</property> + <property name="ui_table">UI</property> + <property name="use_array_enum">0</property> + <property name="use_enum">0</property> <property name="use_microsoft_bom">0</property> - <property name="use_native_eol">0</property> <object class="Dialog" expanded="true"> <property name="aui_managed">0</property> <property name="aui_manager_style">wxAUI_MGR_DEFAULT</property> @@ -607,75 +605,6 @@ <property name="window_style"></property> </object> </object> - <object class="gbsizeritem" expanded="false"> - <property name="border">5</property> - <property name="colspan">1</property> - <property name="column">0</property> - <property name="flag">wxALIGN_CENTER_VERTICAL</property> - <property name="row">1</property> - <property name="rowspan">1</property> - <object class="wxCheckBox" expanded="false"> - <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="checked">1</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">Plot footprint values</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_plotFootprintValues</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"></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> - <event name="OnCheckBox">onPlotFPValues</event> - </object> - </object> <object class="gbsizeritem" expanded="false"> <property name="border">5</property> <property name="colspan">1</property> @@ -697,76 +626,7 @@ <property name="caption"></property> <property name="caption_visible">1</property> <property name="center_pane">0</property> - <property name="checked">1</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">ID_PRINT_REF</property> - <property name="label">Plot reference designators</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_plotFootprintRefs</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"></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> - <event name="OnCheckBox">onPlotFPRefs</event> - </object> - </object> - <object class="gbsizeritem" expanded="true"> - <property name="border">5</property> - <property name="colspan">1</property> - <property name="column">0</property> - <property name="flag">wxALIGN_CENTER_VERTICAL</property> - <property name="row">3</property> - <property name="rowspan">1</property> - <object class="wxCheckBox" 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="checked">1</property> + <property name="checked">0</property> <property name="close_button">1</property> <property name="context_help"></property> <property name="context_menu">1</property> @@ -782,7 +642,7 @@ <property name="gripper">0</property> <property name="hidden">0</property> <property name="id">wxID_ANY</property> - <property name="label">Plot footprint text</property> + <property name="label">Indicate DNP on fabrication layers</property> <property name="max_size"></property> <property name="maximize_button">0</property> <property name="maximum_size"></property> @@ -790,7 +650,143 @@ <property name="minimize_button">0</property> <property name="minimum_size"></property> <property name="moveable">1</property> - <property name="name">m_plotFootprintText</property> + <property name="name">m_plotDNP</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"></property> + <property name="toolbar_pane">0</property> + <property name="tooltip">Hide or cross-out DNP footprints on fabrication layers</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> + <event name="OnCheckBox">onDNPCheckbox</event> + </object> + </object> + <object class="gbsizeritem" expanded="true"> + <property name="border">25</property> + <property name="colspan">1</property> + <property name="column">0</property> + <property name="flag">wxLEFT</property> + <property name="row">3</property> + <property name="rowspan">1</property> + <object class="wxRadioButton" 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"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></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">Hide</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_hideDNP</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">wxRB_GROUP</property> + <property name="subclass">; ; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip">Hide the footprint text and graphics</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="value">0</property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + <object class="gbsizeritem" expanded="true"> + <property name="border">25</property> + <property name="colspan">1</property> + <property name="column">0</property> + <property name="flag">wxLEFT</property> + <property name="row">4</property> + <property name="rowspan">1</property> + <object class="wxRadioButton" 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"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></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">Cross-out</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_crossoutDNP</property> <property name="pane_border">1</property> <property name="pane_position"></property> <property name="pane_size"></property> @@ -808,10 +804,10 @@ <property name="validator_style">wxFILTER_NONE</property> <property name="validator_type">wxDefaultValidator</property> <property name="validator_variable"></property> + <property name="value">0</property> <property name="window_extra_style"></property> <property name="window_name"></property> <property name="window_style"></property> - <event name="OnCheckBox">onPlotFPText</event> </object> </object> <object class="gbsizeritem" expanded="false"> @@ -819,7 +815,7 @@ <property name="colspan">1</property> <property name="column">0</property> <property name="flag">wxALIGN_CENTER_VERTICAL</property> - <property name="row">4</property> + <property name="row">1</property> <property name="rowspan">1</property> <object class="wxCheckBox" expanded="false"> <property name="BottomDockable">1</property> @@ -972,7 +968,7 @@ <property name="caption"></property> <property name="caption_visible">1</property> <property name="center_pane">0</property> - <property name="checked">1</property> + <property name="checked">0</property> <property name="close_button">1</property> <property name="context_help"></property> <property name="context_menu">1</property> @@ -1020,11 +1016,11 @@ </object> </object> <object class="gbsizeritem" expanded="false"> - <property name="border">5</property> - <property name="colspan">1</property> - <property name="column">0</property> - <property name="flag">wxALIGN_CENTER_VERTICAL|wxRIGHT</property> - <property name="row">7</property> + <property name="border">30</property> + <property name="colspan">2</property> + <property name="column">1</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT</property> + <property name="row">6</property> <property name="rowspan">1</property> <object class="wxCheckBox" expanded="false"> <property name="BottomDockable">1</property> diff --git a/pcbnew/dialogs/dialog_plot_base.h b/pcbnew/dialogs/dialog_plot_base.h index d621729104..60c6873f96 100644 --- a/pcbnew/dialogs/dialog_plot_base.h +++ b/pcbnew/dialogs/dialog_plot_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6) +// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf) // http://www.wxformbuilder.org/ // // PLEASE DO *NOT* EDIT THIS FILE! @@ -31,6 +31,7 @@ class WX_HTML_REPORT_PANEL; #include <wx/checklst.h> #include <wx/statbox.h> #include <wx/checkbox.h> +#include <wx/radiobut.h> #include <wx/gbsizer.h> #include <wx/statbmp.h> #include <wx/hyperlink.h> @@ -40,6 +41,9 @@ class WX_HTML_REPORT_PANEL; /////////////////////////////////////////////////////////////////////////// +#define ID_ALLOW_PRINT_PAD_ON_SILKSCREEN 1000 +#define ID_MIROR_OPT 1001 + /////////////////////////////////////////////////////////////////////////////// /// Class DIALOG_PLOT_BASE /////////////////////////////////////////////////////////////////////////////// @@ -48,13 +52,6 @@ class DIALOG_PLOT_BASE : public DIALOG_SHIM private: protected: - enum - { - ID_PRINT_REF = 1000, - ID_ALLOW_PRINT_PAD_ON_SILKSCREEN, - ID_MIROR_OPT, - }; - wxBoxSizer* m_MainSizer; wxStaticText* m_staticTextPlotFmt; wxChoice* m_plotFormatOpt; @@ -66,9 +63,9 @@ class DIALOG_PLOT_BASE : public DIALOG_SHIM wxCheckListBox* m_layerCheckListBox; wxBoxSizer* m_PlotOptionsSizer; wxCheckBox* m_plotSheetRef; - wxCheckBox* m_plotFootprintValues; - wxCheckBox* m_plotFootprintRefs; - wxCheckBox* m_plotFootprintText; + wxCheckBox* m_plotDNP; + wxRadioButton* m_hideDNP; + wxRadioButton* m_crossoutDNP; wxCheckBox* m_plotInvisibleText; wxCheckBox* m_sketchPadsOnFabLayers; wxCheckBox* m_plotPadNumbers; @@ -138,9 +135,7 @@ class DIALOG_PLOT_BASE : public DIALOG_SHIM virtual void OnInitDialog( wxInitDialogEvent& event ) { event.Skip(); } virtual void SetPlotFormat( wxCommandEvent& event ) { event.Skip(); } virtual void OnOutputDirectoryBrowseClicked( wxCommandEvent& event ) { event.Skip(); } - virtual void onPlotFPValues( wxCommandEvent& event ) { event.Skip(); } - virtual void onPlotFPRefs( wxCommandEvent& event ) { event.Skip(); } - virtual void onPlotFPText( wxCommandEvent& event ) { event.Skip(); } + virtual void onDNPCheckbox( wxCommandEvent& event ) { event.Skip(); } virtual void onSketchPads( wxCommandEvent& event ) { event.Skip(); } virtual void OnSetScaleOpt( wxCommandEvent& event ) { event.Skip(); } virtual void onBoardSetup( wxHyperlinkEvent& event ) { event.Skip(); } diff --git a/pcbnew/exporters/export_svg.cpp b/pcbnew/exporters/export_svg.cpp index 630f759bbb..d9a842289f 100644 --- a/pcbnew/exporters/export_svg.cpp +++ b/pcbnew/exporters/export_svg.cpp @@ -39,6 +39,10 @@ bool EXPORT_SVG::Plot( BOARD* aBoard, const PCB_PLOT_SVG_OPTIONS& aSvgPlotOption plot_opts.SetPlotPadNumbers( true ); } + plot_opts.SetHideDNPFPsOnFabLayers( aSvgPlotOptions.m_hideDNPFPsOnFabLayers ); + plot_opts.SetSketchDNPFPsOnFabLayers( aSvgPlotOptions.m_sketchDNPFPsOnFabLayers ); + plot_opts.SetCrossoutDNPFPsOnFabLayers( aSvgPlotOptions.m_crossoutDNPFPsOnFabLayers ); + // Adding drill marks, for copper layers if( ( LSET( aSvgPlotOptions.m_printMaskLayer ) & LSET::AllCuMask() ).any() ) { diff --git a/pcbnew/exporters/export_svg.h b/pcbnew/exporters/export_svg.h index 21dcb005ab..e16015b507 100644 --- a/pcbnew/exporters/export_svg.h +++ b/pcbnew/exporters/export_svg.h @@ -35,6 +35,9 @@ struct PCB_PLOT_SVG_OPTIONS LSEQ m_printMaskLayer; bool m_sketchPadsOnFabLayers; + bool m_hideDNPFPsOnFabLayers; + bool m_sketchDNPFPsOnFabLayers; + bool m_crossoutDNPFPsOnFabLayers; // How holes in pads/vias are plotted: // 0 = no hole, 1 = small shape, 2 = actual shape diff --git a/pcbnew/pcb_plot_params.cpp b/pcbnew/pcb_plot_params.cpp index dca742e5cf..677e2d9b64 100644 --- a/pcbnew/pcb_plot_params.cpp +++ b/pcbnew/pcb_plot_params.cpp @@ -117,6 +117,9 @@ PCB_PLOT_PARAMS::PCB_PLOT_PARAMS() m_plotFPText = true; m_plotInvisibleText = false; m_sketchPadsOnFabLayers = false; + m_hideDNPFPsOnFabLayers = false; + m_sketchDNPFPsOnFabLayers = true; + m_crossoutDNPFPsOnFabLayers = true; m_plotPadNumbers = false; m_subtractMaskFromSilk = false; m_format = PLOT_FORMAT::GERBER; @@ -140,15 +143,15 @@ PCB_PLOT_PARAMS::PCB_PLOT_PARAMS() // This parameter controls if the NPTH pads will be plotted or not // it is a "local" parameter - m_skipNPTH_Pads = false; + m_skipNPTH_Pads = false; // line width to plot items in outline mode. m_sketchPadLineWidth = pcbIUScale.mmToIU( 0.1 ); - m_default_colors = std::make_shared<COLOR_SETTINGS>(); - m_colors = m_default_colors.get(); + m_default_colors = std::make_shared<COLOR_SETTINGS>(); + m_colors = m_default_colors.get(); - m_blackAndWhite = true; + m_blackAndWhite = true; } @@ -240,12 +243,12 @@ void PCB_PLOT_PARAMS::Format( OUTPUTFORMATTER* aFormatter, KICAD_FORMAT::FormatBool( aFormatter, aNestLevel + 1, getTokenName( T_psa4output ), m_A4Output ); - KICAD_FORMAT::FormatBool( aFormatter, aNestLevel + 1, "plotreference", m_plotReference ); - KICAD_FORMAT::FormatBool( aFormatter, aNestLevel + 1, "plotvalue", m_plotValue ); - KICAD_FORMAT::FormatBool( aFormatter, aNestLevel + 1, "plotfptext", m_plotFPText ); KICAD_FORMAT::FormatBool( aFormatter, aNestLevel + 1, "plotinvisibletext", m_plotInvisibleText ); KICAD_FORMAT::FormatBool( aFormatter, aNestLevel + 1, "sketchpadsonfab", m_sketchPadsOnFabLayers ); KICAD_FORMAT::FormatBool( aFormatter, aNestLevel + 1, "plotpadnumbers", m_plotPadNumbers ); + KICAD_FORMAT::FormatBool( aFormatter, aNestLevel + 1, "hidednponfab", m_hideDNPFPsOnFabLayers ); + KICAD_FORMAT::FormatBool( aFormatter, aNestLevel + 1, "sketchdnponfab", m_sketchDNPFPsOnFabLayers ); + KICAD_FORMAT::FormatBool( aFormatter, aNestLevel + 1, "crossoutdnponfab", m_crossoutDNPFPsOnFabLayers ); KICAD_FORMAT::FormatBool( aFormatter, aNestLevel + 1, "subtractmaskfromsilk", m_subtractMaskFromSilk ); aFormatter->Print( aNestLevel+1, "(outputformat %d)\n", static_cast<int>( m_format ) ); KICAD_FORMAT::FormatBool( aFormatter, aNestLevel + 1, "mirror", m_mirror ); @@ -356,6 +359,15 @@ bool PCB_PLOT_PARAMS::IsSameAs( const PCB_PLOT_PARAMS &aPcbPlotParams ) const if( m_plotPadNumbers != aPcbPlotParams.m_plotPadNumbers ) return false; + if( m_hideDNPFPsOnFabLayers != aPcbPlotParams.m_hideDNPFPsOnFabLayers ) + return false; + + if( m_sketchDNPFPsOnFabLayers != aPcbPlotParams.m_sketchDNPFPsOnFabLayers ) + return false; + + if( m_crossoutDNPFPsOnFabLayers != aPcbPlotParams.m_crossoutDNPFPsOnFabLayers ) + return false; + if( m_subtractMaskFromSilk != aPcbPlotParams.m_subtractMaskFromSilk ) return false; @@ -607,18 +619,6 @@ void PCB_PLOT_PARAMS_PARSER::Parse( PCB_PLOT_PARAMS* aPcbPlotParams ) aPcbPlotParams->m_negative = parseBool(); break; - case T_plotreference: - aPcbPlotParams->m_plotReference = parseBool(); - break; - - case T_plotfptext: - aPcbPlotParams->m_plotFPText = parseBool(); - break; - - case T_plotvalue: - aPcbPlotParams->m_plotValue = parseBool(); - break; - case T_plotinvisibletext: aPcbPlotParams->m_plotInvisibleText = parseBool(); break; @@ -631,6 +631,18 @@ void PCB_PLOT_PARAMS_PARSER::Parse( PCB_PLOT_PARAMS* aPcbPlotParams ) aPcbPlotParams->m_plotPadNumbers = parseBool(); break; + case T_hidednponfab: + aPcbPlotParams->m_hideDNPFPsOnFabLayers = parseBool(); + break; + + case T_sketchdnponfab: + aPcbPlotParams->m_sketchDNPFPsOnFabLayers = parseBool(); + break; + + case T_crossoutdnponfab: + aPcbPlotParams->m_crossoutDNPFPsOnFabLayers = parseBool(); + break; + case T_subtractmaskfromsilk: aPcbPlotParams->m_subtractMaskFromSilk = parseBool(); break; diff --git a/pcbnew/pcb_plot_params.h b/pcbnew/pcb_plot_params.h index f519fa7747..1414deef33 100644 --- a/pcbnew/pcb_plot_params.h +++ b/pcbnew/pcb_plot_params.h @@ -104,6 +104,13 @@ public: void SetSketchPadLineWidth( int aWidth ) { m_sketchPadLineWidth = aWidth; } int GetSketchPadLineWidth() const { return m_sketchPadLineWidth; } + void SetHideDNPFPsOnFabLayers( bool aFlag ) { m_hideDNPFPsOnFabLayers = aFlag; } + bool GetHideDNPFPsOnFabLayers() const { return m_hideDNPFPsOnFabLayers; } + void SetSketchDNPFPsOnFabLayers( bool aFlag ) { m_sketchDNPFPsOnFabLayers = aFlag; } + bool GetSketchDNPFPsOnFabLayers() const { return m_sketchDNPFPsOnFabLayers; } + void SetCrossoutDNPFPsOnFabLayers( bool aFlag ) { m_crossoutDNPFPsOnFabLayers = aFlag; } + bool GetCrossoutDNPFPsOnFabLayers() const { return m_crossoutDNPFPsOnFabLayers; } + void SetPlotInvisibleText( bool aFlag ) { m_plotInvisibleText = aFlag; } bool GetPlotInvisibleText() const { return m_plotInvisibleText; } void SetPlotValue( bool aFlag ) { m_plotValue = aFlag; } @@ -271,6 +278,10 @@ private: bool m_sketchPadsOnFabLayers; ///< Plots pads outlines on fab layers int m_sketchPadLineWidth; + bool m_hideDNPFPsOnFabLayers; + bool m_sketchDNPFPsOnFabLayers; + bool m_crossoutDNPFPsOnFabLayers; + double m_fineScaleAdjustX; ///< Compensation for printer scale errors (and therefore double m_fineScaleAdjustY; ///< expected to be very near 1.0). Only X and Y ///< dimensions are adjusted: circles are plotted as diff --git a/pcbnew/pcbnew_jobs_handler.cpp b/pcbnew/pcbnew_jobs_handler.cpp index 11b6e630fa..10b4842b08 100644 --- a/pcbnew/pcbnew_jobs_handler.cpp +++ b/pcbnew/pcbnew_jobs_handler.cpp @@ -423,6 +423,9 @@ int PCBNEW_JOBS_HANDLER::JobExportSvg( JOB* aJob ) svgPlotOptions.m_printMaskLayer = aSvgJob->m_printMaskLayer; svgPlotOptions.m_plotFrame = aSvgJob->m_plotDrawingSheet; svgPlotOptions.m_sketchPadsOnFabLayers = aSvgJob->m_sketchPadsOnFabLayers; + svgPlotOptions.m_hideDNPFPsOnFabLayers = aSvgJob->m_hideDNPFPsOnFabLayers; + svgPlotOptions.m_sketchDNPFPsOnFabLayers = aSvgJob->m_sketchDNPFPsOnFabLayers; + svgPlotOptions.m_crossoutDNPFPsOnFabLayers = aSvgJob->m_crossoutDNPFPsOnFabLayers; svgPlotOptions.m_drillShapeOption = aSvgJob->m_drillShapeOption; if( aJob->IsCli() ) @@ -566,6 +569,10 @@ int PCBNEW_JOBS_HANDLER::JobExportPdf( JOB* aJob ) plotOpts.SetPlotPadNumbers( true ); } + plotOpts.SetHideDNPFPsOnFabLayers( aPdfJob->m_hideDNPFPsOnFabLayers ); + plotOpts.SetSketchDNPFPsOnFabLayers( aPdfJob->m_sketchDNPFPsOnFabLayers ); + plotOpts.SetCrossoutDNPFPsOnFabLayers( aPdfJob->m_crossoutDNPFPsOnFabLayers ); + switch( aPdfJob->m_drillShapeOption ) { default: @@ -1245,6 +1252,9 @@ int PCBNEW_JOBS_HANDLER::doFpExportSvg( JOB_FP_EXPORT_SVG* aSvgJob, const FOOTPR svgPlotOptions.m_pageSizeMode = 2; // board bounding box svgPlotOptions.m_printMaskLayer = aSvgJob->m_printMaskLayer; svgPlotOptions.m_sketchPadsOnFabLayers = aSvgJob->m_sketchPadsOnFabLayers; + svgPlotOptions.m_hideDNPFPsOnFabLayers = aSvgJob->m_hideDNPFPsOnFabLayers; + svgPlotOptions.m_sketchDNPFPsOnFabLayers = aSvgJob->m_sketchDNPFPsOnFabLayers; + svgPlotOptions.m_crossoutDNPFPsOnFabLayers = aSvgJob->m_crossoutDNPFPsOnFabLayers; svgPlotOptions.m_plotFrame = false; if( !EXPORT_SVG::Plot( brd.get(), svgPlotOptions ) ) diff --git a/pcbnew/pcbplot.h b/pcbnew/pcbplot.h index 9ba0c72fa0..a5ac1c3203 100644 --- a/pcbnew/pcbplot.h +++ b/pcbnew/pcbplot.h @@ -91,7 +91,7 @@ public: void PlotPcbTarget( const PCB_TARGET* aMire ); void PlotZone( const ZONE* aZone, PCB_LAYER_ID aLayer, const SHAPE_POLY_SET& aPolysList ); void PlotText( const EDA_TEXT* aText, PCB_LAYER_ID aLayer, bool aIsKnockout, - const KIFONT::METRICS& aFontMetrics ); + const KIFONT::METRICS& aFontMetrics, bool aStrikeout = false ); void PlotShape( const PCB_SHAPE* aShape ); void PlotTableBorders( const PCB_TABLE* aTable ); @@ -129,6 +129,16 @@ public: COLOR4D getColor( int aLayer ) const; private: + bool hideDNPItems( PCB_LAYER_ID aLayer ) + { + return GetHideDNPFPsOnFabLayers() && ( aLayer == F_Fab || aLayer == B_Fab ); + } + + bool crossoutDNPItems( PCB_LAYER_ID aLayer ) + { + return GetCrossoutDNPFPsOnFabLayers() && ( aLayer == F_Fab || aLayer == B_Fab ); + } + /** * Helper function to plot a single drill mark. * diff --git a/pcbnew/plot_board_layers.cpp b/pcbnew/plot_board_layers.cpp index 0c5e5ec438..3c9571f544 100644 --- a/pcbnew/plot_board_layers.cpp +++ b/pcbnew/plot_board_layers.cpp @@ -571,6 +571,20 @@ void PlotStandardLayer( BOARD* aBoard, PLOTTER* aPlotter, LSET aLayerMask, pad->SetRoundRectRadiusRatio( padCornerRadiusRatio ); } + if( footprint->IsDNP() + && !itemplotter.GetHideDNPFPsOnFabLayers() + && itemplotter.GetCrossoutDNPFPsOnFabLayers() + && ( onFrontFab || onBackFab ) ) + { + BOX2I rect = footprint->GetBoundingHull().BBox(); + int width = aBoard->GetDesignSettings().m_LineThickness[ LAYER_CLASS_FAB ]; + + aPlotter->ThickSegment( rect.GetOrigin(), rect.GetEnd(), width, FILLED, nullptr ); + aPlotter->ThickSegment( VECTOR2I( rect.GetLeft(), rect.GetBottom() ), + VECTOR2I( rect.GetRight(), rect.GetTop() ), + width, FILLED, nullptr ); + } + aPlotter->EndBlock( nullptr ); } diff --git a/pcbnew/plot_brditems_plotter.cpp b/pcbnew/plot_brditems_plotter.cpp index 8dd3eeb534..b187bf0fd0 100644 --- a/pcbnew/plot_brditems_plotter.cpp +++ b/pcbnew/plot_brditems_plotter.cpp @@ -354,18 +354,22 @@ void BRDITEMS_PLOTTER::PlotFootprintTextItems( const FOOTPRINT* aFootprint ) // Reference and value have special controls for forcing their plotting if( GetPlotReference() && m_layerMask[textLayer] - && ( textItem->IsVisible() || GetPlotInvisibleText() ) ) + && ( textItem->IsVisible() || GetPlotInvisibleText() ) + && !( aFootprint->IsDNP() && hideDNPItems( textLayer ) ) ) { - PlotText( textItem, textLayer, textItem->IsKnockout(), textItem->GetFontMetrics() ); + PlotText( textItem, textLayer, textItem->IsKnockout(), textItem->GetFontMetrics(), + aFootprint->IsDNP() && crossoutDNPItems( textLayer ) ); } textItem = &aFootprint->Value(); textLayer = textItem->GetLayer(); if( GetPlotValue() && m_layerMask[textLayer] - && ( textItem->IsVisible() || GetPlotInvisibleText() ) ) + && ( textItem->IsVisible() || GetPlotInvisibleText() ) + && !( aFootprint->IsDNP() && hideDNPItems( textLayer ) ) ) { - PlotText( textItem, textLayer, textItem->IsKnockout(), textItem->GetFontMetrics() ); + PlotText( textItem, textLayer, textItem->IsKnockout(), textItem->GetFontMetrics(), + false ); } std::vector<PCB_TEXT*> texts; @@ -393,20 +397,32 @@ void BRDITEMS_PLOTTER::PlotFootprintTextItems( const FOOTPRINT* aFootprint ) continue; textLayer = text->GetLayer(); + bool strikeout = false; if( textLayer == Edge_Cuts || textLayer >= PCB_LAYER_ID_COUNT ) continue; + if( aFootprint->IsDNP() && hideDNPItems( textLayer ) ) + continue; + if( !m_layerMask[textLayer] || aFootprint->GetPrivateLayers().test( textLayer ) ) continue; - if( text->GetText() == wxT( "${REFERENCE}" ) && !GetPlotReference() ) - continue; + if( text->GetText() == wxT( "${REFERENCE}" ) ) + { + if( !GetPlotReference() ) + continue; - if( text->GetText() == wxT( "${VALUE}" ) && !GetPlotValue() ) - continue; + strikeout = aFootprint->IsDNP() && crossoutDNPItems( textLayer ); + } - PlotText( text, textLayer, text->IsKnockout(), text->GetFontMetrics() ); + if( text->GetText() == wxT( "${VALUE}" ) ) + { + if( !GetPlotValue() ) + continue; + } + + PlotText( text, textLayer, text->IsKnockout(), text->GetFontMetrics(), strikeout ); } } @@ -590,10 +606,15 @@ void BRDITEMS_PLOTTER::PlotFootprintGraphicItems( const FOOTPRINT* aFootprint ) { for( const BOARD_ITEM* item : aFootprint->GraphicalItems() ) { - if( aFootprint->GetPrivateLayers().test( item->GetLayer() ) ) + PCB_LAYER_ID itemLayer = item->GetLayer(); + + if( aFootprint->GetPrivateLayers().test( itemLayer ) ) continue; - if( !m_layerMask[ item->GetLayer() ] ) + if( aFootprint->IsDNP() && hideDNPItems( itemLayer ) ) + continue; + + if( !m_layerMask[ itemLayer ] ) continue; switch( item->Type() ) @@ -639,7 +660,7 @@ void BRDITEMS_PLOTTER::PlotFootprintGraphicItems( const FOOTPRINT* aFootprint ) #include <font/stroke_font.h> void BRDITEMS_PLOTTER::PlotText( const EDA_TEXT* aText, PCB_LAYER_ID aLayer, bool aIsKnockout, - const KIFONT::METRICS& aFontMetrics ) + const KIFONT::METRICS& aFontMetrics, bool aStrikeout ) { KIFONT::FONT* font = aText->GetFont(); @@ -678,6 +699,26 @@ void BRDITEMS_PLOTTER::PlotText( const EDA_TEXT* aText, PCB_LAYER_ID aLayer, boo m_plotter->SetCurrentLineWidth( attrs.m_StrokeWidth ); + auto strikeoutText = + [&]( const PCB_TEXT* text ) + { + SHAPE_POLY_SET textPoly; + + text->TransformTextToPolySet( textPoly, 0, ARC_LOW_DEF, ERROR_INSIDE ); + textPoly.Rotate( -text->GetDrawRotation(), text->GetDrawPos() ); + + BOX2I rect = textPoly.BBox(); + VECTOR2I start( rect.GetLeft() - attrs.m_StrokeWidth, + ( rect.GetTop() + rect.GetBottom() ) / 2 ); + VECTOR2I end( rect.GetRight() + attrs.m_StrokeWidth, + ( rect.GetTop() + rect.GetBottom() ) / 2 ); + + RotatePoint( start, text->GetDrawPos(), text->GetDrawRotation() ); + RotatePoint( end, text->GetDrawPos(), text->GetDrawRotation() ); + + m_plotter->ThickSegment( start, end, attrs.m_StrokeWidth, FILLED, nullptr ); + }; + if( aIsKnockout ) { const PCB_TEXT* text = static_cast<const PCB_TEXT*>( aText ); @@ -697,17 +738,24 @@ void BRDITEMS_PLOTTER::PlotText( const EDA_TEXT* aText, PCB_LAYER_ID aLayer, boo wxStringSplit( shownText, strings_list, '\n' ); positions.reserve( strings_list.Count() ); - aText->GetLinePositions( positions, strings_list.Count() ); + aText->GetLinePositions( positions, (int) strings_list.Count() ); for( unsigned ii = 0; ii < strings_list.Count(); ii++ ) { wxString& txt = strings_list.Item( ii ); - m_plotter->PlotText( positions[ii], color, txt, attrs, font, aFontMetrics, &gbr_metadata ); + m_plotter->PlotText( positions[ii], color, txt, attrs, font, aFontMetrics, + &gbr_metadata ); } + + if( aStrikeout && strings_list.Count() == 1 ) + strikeoutText( static_cast<const PCB_TEXT*>( aText ) ); } else { m_plotter->PlotText( pos, color, shownText, attrs, font, aFontMetrics, &gbr_metadata ); + + if( aStrikeout ) + strikeoutText( static_cast<const PCB_TEXT*>( aText ) ); } } @@ -779,9 +827,9 @@ void BRDITEMS_PLOTTER::PlotShape( const PCB_SHAPE* aShape ) if( !m_layerMask[aShape->GetLayer()] ) return; - bool sketch = GetPlotMode() == SKETCH; - int thickness = aShape->GetWidth(); - LINE_STYLE lineStyle = aShape->GetStroke().GetLineStyle(); + OUTLINE_MODE plotMode = GetPlotMode(); + int thickness = aShape->GetWidth(); + LINE_STYLE lineStyle = aShape->GetStroke().GetLineStyle(); m_plotter->SetColor( getColor( aShape->GetLayer() ) ); @@ -794,6 +842,12 @@ void BRDITEMS_PLOTTER::PlotShape( const PCB_SHAPE* aShape ) gbr_metadata.SetNetAttribType( GBR_NETLIST_METADATA::GBR_NETINFO_CMP ); } + if( parentFP && parentFP->IsDNP() && GetSketchDNPFPsOnFabLayers() ) + { + if( aShape->GetLayer() == F_Fab || aShape->GetLayer() == B_Fab ) + plotMode = SKETCH; + } + if( aShape->GetLayer() == Edge_Cuts ) { gbr_metadata.SetApertureAttrib( GBR_APERTURE_METADATA::GBR_APERTURE_ATTRIB_EDGECUT ); @@ -826,7 +880,7 @@ void BRDITEMS_PLOTTER::PlotShape( const PCB_SHAPE* aShape ) switch( aShape->GetShape() ) { case SHAPE_T::SEGMENT: - m_plotter->ThickSegment( aShape->GetStart(), aShape->GetEnd(), thickness, GetPlotMode(), + m_plotter->ThickSegment( aShape->GetStart(), aShape->GetEnd(), thickness, plotMode, &gbr_metadata ); break; @@ -834,12 +888,12 @@ void BRDITEMS_PLOTTER::PlotShape( const PCB_SHAPE* aShape ) if( aShape->IsFilled() ) { m_plotter->FilledCircle( aShape->GetStart(), aShape->GetRadius() * 2 + thickness, - GetPlotMode(), &gbr_metadata ); + plotMode, &gbr_metadata ); } else { m_plotter->ThickCircle( aShape->GetStart(), aShape->GetRadius() * 2, thickness, - GetPlotMode(), &gbr_metadata ); + plotMode, &gbr_metadata ); } break; @@ -851,11 +905,11 @@ void BRDITEMS_PLOTTER::PlotShape( const PCB_SHAPE* aShape ) if( std::abs( aShape->GetArcAngle().AsDegrees() ) == 360.0 ) { m_plotter->ThickCircle( aShape->GetCenter(), aShape->GetRadius() * 2, thickness, - GetPlotMode(), &gbr_metadata ); + plotMode, &gbr_metadata ); } else { - m_plotter->ThickArc( *aShape, GetPlotMode(), &gbr_metadata ); + m_plotter->ThickArc( *aShape, plotMode, &gbr_metadata ); } break; @@ -869,13 +923,12 @@ void BRDITEMS_PLOTTER::PlotShape( const PCB_SHAPE* aShape ) case SHAPE_T::POLY: if( aShape->IsPolyShapeValid() ) { - if( sketch ) + if( plotMode == SKETCH ) { for( auto it = aShape->GetPolyShape().CIterateSegments( 0 ); it; it++ ) { - auto seg = it.Get(); - m_plotter->ThickSegment( seg.A, seg.B, thickness, GetPlotMode(), - &gbr_metadata ); + const SEG& seg = it.Get(); + m_plotter->ThickSegment( seg.A, seg.B, thickness, SKETCH, &gbr_metadata ); } } else @@ -902,8 +955,8 @@ void BRDITEMS_PLOTTER::PlotShape( const PCB_SHAPE* aShape ) // (as region for Gerber plotter to manage attributes) if( m_plotter->GetPlotterType() == PLOT_FORMAT::GERBER ) { - static_cast<GERBER_PLOTTER*>( m_plotter )-> - PlotPolyAsRegion( poly, fill, thickness, &gbr_metadata ); + GERBER_PLOTTER* gbr_plotter = static_cast<GERBER_PLOTTER*>( m_plotter ); + gbr_plotter->PlotPolyAsRegion( poly, fill, thickness, &gbr_metadata ); } else { @@ -919,15 +972,14 @@ void BRDITEMS_PLOTTER::PlotShape( const PCB_SHAPE* aShape ) { std::vector<VECTOR2I> pts = aShape->GetRectCorners(); - if( sketch ) + if( plotMode == SKETCH ) { - m_plotter->ThickSegment( pts[0], pts[1], thickness, GetPlotMode(), &gbr_metadata ); - m_plotter->ThickSegment( pts[1], pts[2], thickness, GetPlotMode(), &gbr_metadata ); - m_plotter->ThickSegment( pts[2], pts[3], thickness, GetPlotMode(), &gbr_metadata ); - m_plotter->ThickSegment( pts[3], pts[0], thickness, GetPlotMode(), &gbr_metadata ); + m_plotter->ThickSegment( pts[0], pts[1], thickness, SKETCH, &gbr_metadata ); + m_plotter->ThickSegment( pts[1], pts[2], thickness, SKETCH, &gbr_metadata ); + m_plotter->ThickSegment( pts[2], pts[3], thickness, SKETCH, &gbr_metadata ); + m_plotter->ThickSegment( pts[3], pts[0], thickness, SKETCH, &gbr_metadata ); } - - if( !sketch ) + else { SHAPE_LINE_CHAIN poly; @@ -940,8 +992,8 @@ void BRDITEMS_PLOTTER::PlotShape( const PCB_SHAPE* aShape ) if( m_plotter->GetPlotterType() == PLOT_FORMAT::GERBER ) { - static_cast<GERBER_PLOTTER*>( m_plotter )-> - PlotPolyAsRegion( poly, fill_mode, thickness, &gbr_metadata ); + GERBER_PLOTTER* gbr_plotter = static_cast<GERBER_PLOTTER*>( m_plotter ); + gbr_plotter->PlotPolyAsRegion( poly, fill_mode, thickness, &gbr_metadata ); } else { @@ -965,7 +1017,7 @@ void BRDITEMS_PLOTTER::PlotShape( const PCB_SHAPE* aShape ) STROKE_PARAMS::Stroke( shape, lineStyle, thickness, m_plotter->RenderSettings(), [&]( const VECTOR2I& a, const VECTOR2I& b ) { - m_plotter->ThickSegment( a, b, thickness, GetPlotMode(), + m_plotter->ThickSegment( a, b, thickness, plotMode, &gbr_metadata ); } ); }