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 );
                                    } );
         }