Plotters: better support of filled circles having a thickness set to 0.
Setting a line thickness = 0 for graphic objects (circle, rect, line) is allowed but creates issues for circles that were plotted a non filled shapes but having a outline thickness = 0.
This commit is contained in:
parent
88102bca46
commit
380534807b
|
@ -1000,6 +1000,31 @@ void GERBER_PLOTTER::ThickCircle( const wxPoint& pos, int diametre, int width,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void GERBER_PLOTTER::FilledCircle( const wxPoint& pos, int diametre,
|
||||||
|
EDA_DRAW_MODE_T tracemode, void* aData )
|
||||||
|
{
|
||||||
|
// A filled circle is a graphic item, not a pad.
|
||||||
|
// So it is drawn, not flashed.
|
||||||
|
GBR_METADATA *gbr_metadata = static_cast<GBR_METADATA*>( aData );
|
||||||
|
|
||||||
|
if( gbr_metadata )
|
||||||
|
formatNetAttribute( &gbr_metadata->m_NetlistMetadata );
|
||||||
|
|
||||||
|
if( tracemode == FILLED )
|
||||||
|
{
|
||||||
|
// Draw a circle of diameter = diametre/2 with a line thickness = radius,
|
||||||
|
// To create a filled circle
|
||||||
|
SetCurrentLineWidth( diametre/2, gbr_metadata );
|
||||||
|
Circle( pos, diametre/2, NO_FILL, DO_NOT_SET_LINE_WIDTH );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetCurrentLineWidth( USE_DEFAULT_LINE_WIDTH, gbr_metadata );
|
||||||
|
Circle( pos, diametre, NO_FILL, DO_NOT_SET_LINE_WIDTH );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void GERBER_PLOTTER::FlashPadCircle( const wxPoint& pos, int diametre, EDA_DRAW_MODE_T trace_mode, void* aData )
|
void GERBER_PLOTTER::FlashPadCircle( const wxPoint& pos, int diametre, EDA_DRAW_MODE_T trace_mode, void* aData )
|
||||||
{
|
{
|
||||||
wxSize size( diametre, diametre );
|
wxSize size( diametre, diametre );
|
||||||
|
|
|
@ -578,6 +578,19 @@ void PLOTTER::ThickCircle( const wxPoint& pos, int diametre, int width,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PLOTTER::FilledCircle( const wxPoint& pos, int diametre,
|
||||||
|
EDA_DRAW_MODE_T tracemode, void* aData )
|
||||||
|
{
|
||||||
|
if( tracemode == FILLED )
|
||||||
|
Circle( pos, diametre, FILLED_SHAPE, 0 );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SetCurrentLineWidth( -1 );
|
||||||
|
Circle( pos, diametre, NO_FILL, -1 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void PLOTTER::PlotPoly( const SHAPE_LINE_CHAIN& aCornerList, FILL_T aFill,
|
void PLOTTER::PlotPoly( const SHAPE_LINE_CHAIN& aCornerList, FILL_T aFill,
|
||||||
int aWidth, void * aData )
|
int aWidth, void * aData )
|
||||||
{
|
{
|
||||||
|
|
|
@ -67,6 +67,8 @@ public:
|
||||||
// Currently, aScale and aMirror are not used in gerber plotter
|
// Currently, aScale and aMirror are not used in gerber plotter
|
||||||
virtual void SetViewport( const wxPoint& aOffset, double aIusPerDecimil,
|
virtual void SetViewport( const wxPoint& aOffset, double aIusPerDecimil,
|
||||||
double aScale, bool aMirror ) override;
|
double aScale, bool aMirror ) override;
|
||||||
|
|
||||||
|
// Basic plot primitives
|
||||||
virtual void Rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill,
|
virtual void Rect( const wxPoint& p1, const wxPoint& p2, FILL_T fill,
|
||||||
int width = USE_DEFAULT_LINE_WIDTH ) override;
|
int width = USE_DEFAULT_LINE_WIDTH ) override;
|
||||||
virtual void Circle( const wxPoint& pos, int diametre, FILL_T fill,
|
virtual void Circle( const wxPoint& pos, int diametre, FILL_T fill,
|
||||||
|
@ -74,6 +76,7 @@ public:
|
||||||
virtual void Arc( const wxPoint& aCenter, double aStAngle, double aEndAngle,
|
virtual void Arc( const wxPoint& aCenter, double aStAngle, double aEndAngle,
|
||||||
int aRadius, FILL_T aFill, int aWidth = USE_DEFAULT_LINE_WIDTH ) override;
|
int aRadius, FILL_T aFill, int aWidth = USE_DEFAULT_LINE_WIDTH ) override;
|
||||||
|
|
||||||
|
// These functions plot an item and manage X2 gerber attributes
|
||||||
virtual void ThickSegment( const wxPoint& start, const wxPoint& end, int width,
|
virtual void ThickSegment( const wxPoint& start, const wxPoint& end, int width,
|
||||||
EDA_DRAW_MODE_T tracemode, void* aData ) override;
|
EDA_DRAW_MODE_T tracemode, void* aData ) override;
|
||||||
|
|
||||||
|
@ -83,6 +86,9 @@ public:
|
||||||
EDA_DRAW_MODE_T tracemode, void* aData ) override;
|
EDA_DRAW_MODE_T tracemode, void* aData ) override;
|
||||||
virtual void ThickCircle( const wxPoint& pos, int diametre, int width,
|
virtual void ThickCircle( const wxPoint& pos, int diametre, int width,
|
||||||
EDA_DRAW_MODE_T tracemode, void* aData ) override;
|
EDA_DRAW_MODE_T tracemode, void* aData ) override;
|
||||||
|
virtual void FilledCircle( const wxPoint& pos, int diametre,
|
||||||
|
EDA_DRAW_MODE_T tracemode, void* aData ) override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gerber polygon: they can (and *should*) be filled with the
|
* Gerber polygon: they can (and *should*) be filled with the
|
||||||
* appropriate G36/G37 sequence
|
* appropriate G36/G37 sequence
|
||||||
|
|
|
@ -321,6 +321,9 @@ public:
|
||||||
EDA_DRAW_MODE_T tracemode, void* aData );
|
EDA_DRAW_MODE_T tracemode, void* aData );
|
||||||
virtual void ThickCircle( const wxPoint& pos, int diametre, int width,
|
virtual void ThickCircle( const wxPoint& pos, int diametre, int width,
|
||||||
EDA_DRAW_MODE_T tracemode, void* aData );
|
EDA_DRAW_MODE_T tracemode, void* aData );
|
||||||
|
virtual void FilledCircle( const wxPoint& pos, int diametre,
|
||||||
|
EDA_DRAW_MODE_T tracemode, void* aData );
|
||||||
|
|
||||||
|
|
||||||
// Flash primitives
|
// Flash primitives
|
||||||
|
|
||||||
|
|
|
@ -578,7 +578,7 @@ void BRDITEMS_PLOTTER::PlotFootprintGraphicItem( FP_SHAPE* aShape )
|
||||||
if( aShape->GetWidth() > 0 )
|
if( aShape->GetWidth() > 0 )
|
||||||
m_plotter->ThickCircle( pos, radius * 2, thickness, GetPlotMode(), &gbr_metadata );
|
m_plotter->ThickCircle( pos, radius * 2, thickness, GetPlotMode(), &gbr_metadata );
|
||||||
else
|
else
|
||||||
m_plotter->Circle( pos, radius * 2, FILLED_SHAPE, -1 );
|
m_plotter->FilledCircle( pos, radius * 2, GetPlotMode(), &gbr_metadata );
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -859,7 +859,11 @@ void BRDITEMS_PLOTTER::PlotPcbShape( PCB_SHAPE* aShape )
|
||||||
|
|
||||||
case S_CIRCLE:
|
case S_CIRCLE:
|
||||||
radius = KiROUND( GetLineLength( end, start ) );
|
radius = KiROUND( GetLineLength( end, start ) );
|
||||||
m_plotter->ThickCircle( start, radius * 2, thickness, GetPlotMode(), &gbr_metadata );
|
|
||||||
|
if( thickness > 0 )
|
||||||
|
m_plotter->ThickCircle( start, radius * 2, thickness, GetPlotMode(), &gbr_metadata );
|
||||||
|
else
|
||||||
|
m_plotter->FilledCircle( start, radius * 2, GetPlotMode(), &gbr_metadata );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S_ARC:
|
case S_ARC:
|
||||||
|
|
Loading…
Reference in New Issue