mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 18:23:15 +02:00
Plot drill marks on mask layers if the pad exists there.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/20859 (cherry picked from commit 5e6ef67fce30849ca746a331cf846d9826a83387)
This commit is contained in:
parent
3900d8e231
commit
9e17baecbc
@ -57,8 +57,6 @@
|
|||||||
#include <wx/msgdlg.h>
|
#include <wx/msgdlg.h>
|
||||||
|
|
||||||
|
|
||||||
LSET DIALOG_PLOT::s_lastLayerSet;
|
|
||||||
LSET DIALOG_PLOT::s_lastAllLayersSet;
|
|
||||||
LSEQ DIALOG_PLOT::s_lastAllLayersOrder;
|
LSEQ DIALOG_PLOT::s_lastAllLayersOrder;
|
||||||
|
|
||||||
|
|
||||||
|
@ -111,10 +111,6 @@ private:
|
|||||||
|
|
||||||
JOB_EXPORT_PCB_PLOT* m_job;
|
JOB_EXPORT_PCB_PLOT* m_job;
|
||||||
|
|
||||||
/// The plot layer set that last time the dialog was opened.
|
|
||||||
static LSET s_lastLayerSet;
|
|
||||||
static LSET s_lastAllLayersSet;
|
|
||||||
|
|
||||||
/// The plot on all layers ordering the last time the dialog was opened.
|
/// The plot on all layers ordering the last time the dialog was opened.
|
||||||
static LSEQ s_lastAllLayersOrder;
|
static LSEQ s_lastAllLayersOrder;
|
||||||
};
|
};
|
||||||
|
@ -132,30 +132,16 @@ void PlotBoardLayers( BOARD* aBoard, PLOTTER* aPlotter, const LSEQ& aLayers,
|
|||||||
if( !aBoard || !aPlotter || aLayers.empty() )
|
if( !aBoard || !aPlotter || aLayers.empty() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// if a drill mark must be plotted,it must be plotted as a filled
|
|
||||||
// white shape *after* all other shapes are plotted, provided that
|
|
||||||
// the other shapes are not copper layers
|
|
||||||
int copperLayers = 0;
|
|
||||||
int nonCopperLayers = 0;
|
|
||||||
|
|
||||||
for( PCB_LAYER_ID layer : aLayers )
|
|
||||||
{
|
|
||||||
if( IsCopperLayer( layer ) )
|
|
||||||
copperLayers++;
|
|
||||||
else
|
|
||||||
nonCopperLayers++;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool plot_mark = ( aPlotOptions.GetDrillMarksType() != DRILL_MARKS::NO_DRILL_SHAPE
|
|
||||||
&& copperLayers > 0 && nonCopperLayers > 0 );
|
|
||||||
|
|
||||||
for( PCB_LAYER_ID layer : aLayers )
|
for( PCB_LAYER_ID layer : aLayers )
|
||||||
PlotOneBoardLayer( aBoard, aPlotter, layer, aPlotOptions, layer == aLayers[0] );
|
PlotOneBoardLayer( aBoard, aPlotter, layer, aPlotOptions, layer == aLayers[0] );
|
||||||
|
|
||||||
if( plot_mark )
|
// Drill marks are plotted in white to knockout the pad if any layers of the pad are
|
||||||
|
// being plotted, and in black if the pad is not being plotted. For the former, this
|
||||||
|
// must happen after all other layers are plotted.
|
||||||
|
if( aPlotOptions.GetDrillMarksType() != DRILL_MARKS::NO_DRILL_SHAPE )
|
||||||
{
|
{
|
||||||
aPlotter->SetColor( WHITE );
|
|
||||||
BRDITEMS_PLOTTER itemplotter( aPlotter, aBoard, aPlotOptions );
|
BRDITEMS_PLOTTER itemplotter( aPlotter, aBoard, aPlotOptions );
|
||||||
|
itemplotter.SetLayerSet( aLayers );
|
||||||
itemplotter.PlotDrillMarks();
|
itemplotter.PlotDrillMarks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -256,9 +242,6 @@ void PlotOneBoardLayer( BOARD *aBoard, PLOTTER* aPlotter, PCB_LAYER_ID aLayer,
|
|||||||
{
|
{
|
||||||
case B_Mask:
|
case B_Mask:
|
||||||
case F_Mask:
|
case F_Mask:
|
||||||
// Disable plot pad holes
|
|
||||||
plotOpt.SetDrillMarksType( DRILL_MARKS::NO_DRILL_SHAPE );
|
|
||||||
|
|
||||||
// Use outline mode for DXF
|
// Use outline mode for DXF
|
||||||
plotOpt.SetDXFPlotPolygonMode( true );
|
plotOpt.SetDXFPlotPolygonMode( true );
|
||||||
|
|
||||||
@ -841,10 +824,6 @@ void PlotStandardLayer( BOARD* aBoard, PLOTTER* aPlotter, LSET aLayerMask,
|
|||||||
}
|
}
|
||||||
|
|
||||||
aPlotter->EndBlock( nullptr );
|
aPlotter->EndBlock( nullptr );
|
||||||
|
|
||||||
// Adding drill marks, if required and if the plotter is able to plot them:
|
|
||||||
if( aPlotOpt.GetDrillMarksType() != DRILL_MARKS::NO_DRILL_SHAPE )
|
|
||||||
itemplotter.PlotDrillMarks();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1178,7 +1178,6 @@ void BRDITEMS_PLOTTER::plotOneDrillMark( PAD_DRILL_SHAPE aDrillShape, const VECT
|
|||||||
|
|
||||||
void BRDITEMS_PLOTTER::PlotDrillMarks()
|
void BRDITEMS_PLOTTER::PlotDrillMarks()
|
||||||
{
|
{
|
||||||
bool onCopperLayer = ( LSET::AllCuMask() & m_layerMask ).any();
|
|
||||||
int smallDrill = 0;
|
int smallDrill = 0;
|
||||||
|
|
||||||
if( GetDrillMarksType() == DRILL_MARKS::SMALL_DRILL_SHAPE )
|
if( GetDrillMarksType() == DRILL_MARKS::SMALL_DRILL_SHAPE )
|
||||||
@ -1190,11 +1189,11 @@ void BRDITEMS_PLOTTER::PlotDrillMarks()
|
|||||||
- In HPGL you can't see them
|
- In HPGL you can't see them
|
||||||
- In gerbers you can't see them, too. This is arguably the right thing to do since having
|
- In gerbers you can't see them, too. This is arguably the right thing to do since having
|
||||||
drill marks and high speed drill stations is a sure recipe for broken tools and angry
|
drill marks and high speed drill stations is a sure recipe for broken tools and angry
|
||||||
manufacturers. If you *really* want them you could start a layer with negative polarity
|
manufacturers. If you *really* want them you could start a layer with negative
|
||||||
to knock-out the film.
|
polarity to knock-out the film.
|
||||||
- In DXF they go into the 'WHITE' layer. This could be useful.
|
- In DXF they go into the 'WHITE' layer. This could be useful.
|
||||||
*/
|
*/
|
||||||
if( GetPlotMode() == FILLED && onCopperLayer )
|
if( GetPlotMode() == FILLED )
|
||||||
m_plotter->SetColor( WHITE );
|
m_plotter->SetColor( WHITE );
|
||||||
|
|
||||||
for( PCB_TRACK* track : m_board->Tracks() )
|
for( PCB_TRACK* track : m_board->Tracks() )
|
||||||
@ -1221,11 +1220,14 @@ void BRDITEMS_PLOTTER::PlotDrillMarks()
|
|||||||
if( pad->GetDrillSize().x == 0 )
|
if( pad->GetDrillSize().x == 0 )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if( GetPlotMode() == FILLED )
|
||||||
|
m_plotter->SetColor( ( pad->GetLayerSet() & m_layerMask ).any() ? WHITE : BLACK );
|
||||||
|
|
||||||
plotOneDrillMark( pad->GetDrillShape(), pad->GetPosition(), pad->GetDrillSize(),
|
plotOneDrillMark( pad->GetDrillShape(), pad->GetPosition(), pad->GetDrillSize(),
|
||||||
pad->GetSize( PADSTACK::ALL_LAYERS ), pad->GetOrientation(), smallDrill );
|
pad->GetSize( PADSTACK::ALL_LAYERS ), pad->GetOrientation(), smallDrill );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( GetPlotMode() == FILLED && onCopperLayer )
|
if( GetPlotMode() == FILLED )
|
||||||
m_plotter->SetColor( BLACK );
|
m_plotter->SetColor( BLACK );
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user