Adds plot functionality to Eeschema line formats
Dotted, dashed and dash-dot lines are provided in HPGL, PDF, PS and SVG plot outputs along with line width and color formatting. DXF format does not currently provide any dashed line functionality A bug in HPGL plotted is corrected. Previous HPGL dashed line commands were incorrect, plotting all lines as solid.
This commit is contained in:
parent
b576189a00
commit
7c0a7f9f7b
|
@ -63,8 +63,9 @@ PLOTTER::PLOTTER( )
|
|||
// Temporary init to avoid not initialized vars, will be set later
|
||||
m_IUsPerDecimil = 1; // will be set later to the actual value
|
||||
iuPerDeviceUnit = 1; // will be set later to the actual value
|
||||
m_dashMarkLength_mm = 0.5; // Dashed line parameter in mm: segment
|
||||
m_dashGapLength_mm = 0.25; // Dashed line parameter in mm: gap
|
||||
m_dotMarkLength_mm = 0.1; // Dotted line parameter in mm: segment
|
||||
// Dashed line parameter is 5 * dotted line mark
|
||||
// Dashed line gap is 3 * dotted line mark
|
||||
}
|
||||
|
||||
PLOTTER::~PLOTTER()
|
||||
|
@ -131,16 +132,22 @@ double PLOTTER::userToDeviceSize( double size ) const
|
|||
}
|
||||
|
||||
|
||||
double PLOTTER::GetDotMarkLenIU() const
|
||||
{
|
||||
return userToDeviceSize( std::max( 1.0,
|
||||
m_dotMarkLength_mm * 10000 / 25.4 * m_IUsPerDecimil - GetCurrentLineWidth() ) );
|
||||
}
|
||||
|
||||
|
||||
double PLOTTER::GetDashMarkLenIU() const
|
||||
{
|
||||
double mark = userToDeviceSize( m_dashMarkLength_mm*10000/25.4*m_IUsPerDecimil - GetCurrentLineWidth() );
|
||||
return ( mark < 0.0 ) ? 0.0 : mark;
|
||||
return std::max( GetDashGapLenIU(), 5.0 * GetDotMarkLenIU() );
|
||||
}
|
||||
|
||||
|
||||
double PLOTTER::GetDashGapLenIU() const
|
||||
{
|
||||
return userToDeviceSize( m_dashGapLength_mm*10000/25.4*m_IUsPerDecimil + GetCurrentLineWidth() );
|
||||
return 3.0 * GetDotMarkLenIU() + userToDeviceSize( 2 * GetCurrentLineWidth() );
|
||||
}
|
||||
|
||||
void PLOTTER::Arc( const wxPoint& centre, double StAngle, double EndAngle, int radius,
|
||||
|
|
|
@ -496,7 +496,7 @@ void DXF_PLOTTER::PenTo( const wxPoint& pos, char plume )
|
|||
/**
|
||||
* Dashed lines are not (yet) supported by DXF_PLOTTER
|
||||
*/
|
||||
void DXF_PLOTTER::SetDash( bool dashed )
|
||||
void DXF_PLOTTER::SetDash( int dashed )
|
||||
{
|
||||
// NOP for now
|
||||
}
|
||||
|
|
|
@ -420,14 +420,24 @@ void HPGL_PLOTTER::PenTo( const wxPoint& pos, char plume )
|
|||
/**
|
||||
* HPGL supports dashed lines
|
||||
*/
|
||||
void HPGL_PLOTTER::SetDash( bool dashed )
|
||||
void HPGL_PLOTTER::SetDash( int dashed )
|
||||
{
|
||||
wxASSERT( outputFile );
|
||||
|
||||
if( dashed )
|
||||
fputs( "LI 2;\n", outputFile );
|
||||
else
|
||||
fputs( "LI;\n", outputFile );
|
||||
switch( dashed )
|
||||
{
|
||||
case PLOTDASHTYPE_DASH:
|
||||
fprintf( outputFile, "LT -2 4 1;\n" );
|
||||
break;
|
||||
case PLOTDASHTYPE_DOT:
|
||||
fprintf( outputFile, "LT -1 2 1;\n" );
|
||||
break;
|
||||
case PLOTDASHTYPE_DASHDOT:
|
||||
fprintf( outputFile, "LT -4 6 1;\n" );
|
||||
break;
|
||||
default:
|
||||
fputs( "LT;\n", outputFile );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -131,14 +131,27 @@ void PDF_PLOTTER::emitSetRGBColor( double r, double g, double b )
|
|||
/**
|
||||
* PDF supports dashed lines
|
||||
*/
|
||||
void PDF_PLOTTER::SetDash( bool dashed )
|
||||
void PDF_PLOTTER::SetDash( int dashed )
|
||||
{
|
||||
wxASSERT( workFile );
|
||||
if( dashed )
|
||||
switch( dashed )
|
||||
{
|
||||
case PLOTDASHTYPE_DASH:
|
||||
fprintf( workFile, "[%d %d] 0 d\n",
|
||||
(int) GetDashMarkLenIU(), (int) GetDashGapLenIU() );
|
||||
else
|
||||
(int) GetDashMarkLenIU(), (int) GetDashGapLenIU() );
|
||||
break;
|
||||
case PLOTDASHTYPE_DOT:
|
||||
fprintf( workFile, "[%d %d] 0 d\n",
|
||||
(int) GetDotMarkLenIU(), (int) GetDashGapLenIU() );
|
||||
break;
|
||||
case PLOTDASHTYPE_DASHDOT:
|
||||
fprintf( workFile, "[%d %d %d %d] 0 d\n",
|
||||
(int) GetDashMarkLenIU(), (int) GetDashGapLenIU(),
|
||||
(int) GetDotMarkLenIU(), (int) GetDashGapLenIU() );
|
||||
break;
|
||||
default:
|
||||
fputs( "[] 0 d\n", workFile );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -545,14 +545,26 @@ void PS_PLOTTER::emitSetRGBColor( double r, double g, double b )
|
|||
/**
|
||||
* Postscript supports dashed lines
|
||||
*/
|
||||
void PS_PLOTTER::SetDash( bool dashed )
|
||||
void PS_PLOTTER::SetDash( int dashed )
|
||||
{
|
||||
wxASSERT( outputFile );
|
||||
if( dashed )
|
||||
switch( dashed )
|
||||
{
|
||||
case PLOTDASHTYPE_DASH:
|
||||
fprintf( outputFile, "[%d %d] 0 setdash\n",
|
||||
(int) GetDashMarkLenIU(), (int) GetDashGapLenIU() );
|
||||
else
|
||||
(int) GetDashMarkLenIU(), (int) GetDashGapLenIU() );
|
||||
break;
|
||||
case PLOTDASHTYPE_DOT:
|
||||
fprintf( outputFile, "[%d %d] 0 setdash\n",
|
||||
(int) GetDotMarkLenIU(), (int) GetDashGapLenIU() );
|
||||
break;
|
||||
case PLOTDASHTYPE_DASHDOT:
|
||||
fprintf( outputFile, "[%d %d %d %d] 0 setdash\n",
|
||||
(int) GetDashMarkLenIU(), (int) GetDashGapLenIU(),
|
||||
(int) GetDotMarkLenIU(), (int) GetDashGapLenIU() );
|
||||
break;
|
||||
default:
|
||||
fputs( "solidline\n", outputFile );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -233,9 +233,21 @@ void SVG_PLOTTER::setSVGPlotStyle()
|
|||
m_pen_rgb_color, pen_w );
|
||||
fputs( "stroke-linecap:round; stroke-linejoin:round;", outputFile );
|
||||
|
||||
if( m_dashed )
|
||||
switch( m_dashed )
|
||||
{
|
||||
case PLOTDASHTYPE_DASH:
|
||||
fprintf( outputFile, "stroke-dasharray:%g,%g;",
|
||||
GetDashMarkLenIU(), GetDashGapLenIU() );
|
||||
break;
|
||||
case PLOTDASHTYPE_DOT:
|
||||
fprintf( outputFile, "stroke-dasharray:%g,%g;",
|
||||
GetDotMarkLenIU(), GetDashGapLenIU() );
|
||||
break;
|
||||
case PLOTDASHTYPE_DASHDOT:
|
||||
fprintf( outputFile, "stroke-dasharray:%g,%g,%g,%g;",
|
||||
GetDashMarkLenIU(), GetDashGapLenIU(), GetDotMarkLenIU(), GetDashGapLenIU() );
|
||||
break;
|
||||
}
|
||||
|
||||
fputs( "\">\n", outputFile );
|
||||
|
||||
|
@ -289,7 +301,7 @@ void SVG_PLOTTER::emitSetRGBColor( double r, double g, double b )
|
|||
/**
|
||||
* SVG supports dashed lines
|
||||
*/
|
||||
void SVG_PLOTTER::SetDash( bool dashed )
|
||||
void SVG_PLOTTER::SetDash( int dashed )
|
||||
{
|
||||
if( m_dashed != dashed )
|
||||
{
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
||||
*/
|
||||
|
||||
#include <cassert>
|
||||
#include <dialog_edit_line_style.h>
|
||||
|
||||
|
||||
|
@ -29,6 +30,7 @@ DIALOG_EDIT_LINE_STYLE::DIALOG_EDIT_LINE_STYLE( wxWindow* parent ) :
|
|||
DIALOG_EDIT_LINE_STYLE_BASE( parent )
|
||||
{
|
||||
m_sdbSizer1Apply->SetLabel( _( "Default" ) );
|
||||
|
||||
m_lineStyle->SetSelection( 0 );
|
||||
|
||||
m_lineWidth->SetFocus();
|
||||
|
@ -57,39 +59,24 @@ void DIALOG_EDIT_LINE_STYLE::resetDefaults( wxCommandEvent& event )
|
|||
|
||||
void DIALOG_EDIT_LINE_STYLE::SetColor( const COLOR4D& aColor )
|
||||
{
|
||||
assert( aColor.r >= 0.0 && aColor.r <= 1.0 );
|
||||
assert( aColor.g >= 0.0 && aColor.g <= 1.0 );
|
||||
assert( aColor.b >= 0.0 && aColor.b <= 1.0 );
|
||||
assert( aColor.a >= 0.0 && aColor.a <= 1.0 );
|
||||
|
||||
m_colorPicker->SetColour( aColor.ToColour() );
|
||||
}
|
||||
|
||||
|
||||
void DIALOG_EDIT_LINE_STYLE::SetStyle( const int aStyle )
|
||||
{
|
||||
switch( aStyle )
|
||||
{
|
||||
case wxPENSTYLE_SHORT_DASH:
|
||||
m_lineStyle->SetSelection( 1 );
|
||||
break;
|
||||
case wxPENSTYLE_DOT:
|
||||
m_lineStyle->SetSelection( 2 );
|
||||
break;
|
||||
case wxPENSTYLE_DOT_DASH:
|
||||
m_lineStyle->SetSelection( 3 );
|
||||
break;
|
||||
default:
|
||||
m_lineStyle->SetSelection( 0 );
|
||||
break;
|
||||
}
|
||||
assert( aStyle >= 0 && aStyle < 4 );
|
||||
|
||||
m_lineStyle->SetSelection( aStyle );
|
||||
}
|
||||
|
||||
|
||||
int DIALOG_EDIT_LINE_STYLE::GetStyle()
|
||||
{
|
||||
const int retval[4] =
|
||||
{
|
||||
wxPENSTYLE_SOLID,
|
||||
wxPENSTYLE_SHORT_DASH,
|
||||
wxPENSTYLE_DOT,
|
||||
wxPENSTYLE_DOT_DASH,
|
||||
};
|
||||
|
||||
return retval[ m_lineStyle->GetSelection() ];
|
||||
return m_lineStyle->GetSelection();
|
||||
}
|
||||
|
|
|
@ -42,6 +42,15 @@
|
|||
|
||||
#include <dialogs/dialog_edit_line_style.h>
|
||||
|
||||
const enum wxPenStyle SCH_LINE::PenStyle[] =
|
||||
{
|
||||
[PLOTDASHTYPE_SOLID] = wxPENSTYLE_SOLID,
|
||||
[PLOTDASHTYPE_DASH] = wxPENSTYLE_SHORT_DASH,
|
||||
[PLOTDASHTYPE_DOT] = wxPENSTYLE_DOT,
|
||||
[PLOTDASHTYPE_DASHDOT] = wxPENSTYLE_DOT_DASH
|
||||
};
|
||||
|
||||
|
||||
SCH_LINE::SCH_LINE( const wxPoint& pos, int layer ) :
|
||||
SCH_ITEM( NULL, SCH_LINE_T )
|
||||
{
|
||||
|
@ -49,7 +58,7 @@ SCH_LINE::SCH_LINE( const wxPoint& pos, int layer ) :
|
|||
m_end = pos;
|
||||
m_startIsDangling = m_endIsDangling = false;
|
||||
m_size = 0;
|
||||
m_style = 0;
|
||||
m_style = -1;
|
||||
m_color = COLOR4D::UNSPECIFIED;
|
||||
|
||||
switch( layer )
|
||||
|
@ -243,34 +252,30 @@ COLOR4D SCH_LINE::GetLineColor() const
|
|||
return m_color;
|
||||
}
|
||||
|
||||
|
||||
enum wxPenStyle SCH_LINE::GetDefaultStyle() const
|
||||
int SCH_LINE::GetDefaultStyle() const
|
||||
{
|
||||
if( m_Layer == LAYER_NOTES )
|
||||
return wxPENSTYLE_SHORT_DASH;
|
||||
return PLOTDASHTYPE_DASH;
|
||||
|
||||
return wxPENSTYLE_SOLID;
|
||||
return PLOTDASHTYPE_SOLID;
|
||||
}
|
||||
|
||||
|
||||
void SCH_LINE::SetLineStyle( const int aStyle )
|
||||
{
|
||||
if( aStyle == GetDefaultStyle() )
|
||||
m_style = 0;
|
||||
m_style = -1;
|
||||
else
|
||||
m_style = aStyle;
|
||||
}
|
||||
|
||||
|
||||
enum wxPenStyle SCH_LINE::GetLineStyle() const
|
||||
int SCH_LINE::GetLineStyle() const
|
||||
{
|
||||
if( m_style > 0 )
|
||||
return (enum wxPenStyle) m_style;
|
||||
if( m_style >= 0 )
|
||||
return m_style;
|
||||
|
||||
if( m_Layer == LAYER_NOTES )
|
||||
return wxPENSTYLE_SHORT_DASH;
|
||||
|
||||
return wxPENSTYLE_SOLID;
|
||||
return GetDefaultStyle();
|
||||
}
|
||||
|
||||
|
||||
|
@ -328,7 +333,8 @@ void SCH_LINE::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& offset,
|
|||
if( ( m_Flags & ENDPOINT ) == 0 )
|
||||
end += offset;
|
||||
|
||||
GRLine( panel->GetClipBox(), DC, start.x, start.y, end.x, end.y, width, color, GetLineStyle() );
|
||||
GRLine( panel->GetClipBox(), DC, start.x, start.y, end.x, end.y, width, color,
|
||||
PenStyle[ GetLineStyle() ] );
|
||||
|
||||
if( m_startIsDangling )
|
||||
DrawDanglingSymbol( panel, DC, start, color );
|
||||
|
@ -685,17 +691,19 @@ bool SCH_LINE::doIsConnected( const wxPoint& aPosition ) const
|
|||
|
||||
void SCH_LINE::Plot( PLOTTER* aPlotter )
|
||||
{
|
||||
aPlotter->SetColor( GetLayerColor( GetLayer() ) );
|
||||
if( m_color != COLOR4D::UNSPECIFIED )
|
||||
aPlotter->SetColor( m_color );
|
||||
else
|
||||
aPlotter->SetColor( GetLayerColor( GetLayer() ) );
|
||||
|
||||
aPlotter->SetCurrentLineWidth( GetPenSize() );
|
||||
|
||||
if( m_Layer == LAYER_NOTES )
|
||||
aPlotter->SetDash( true );
|
||||
aPlotter->SetDash( GetLineStyle() );
|
||||
|
||||
aPlotter->MoveTo( m_start );
|
||||
aPlotter->FinishTo( m_end );
|
||||
|
||||
if( m_Layer == LAYER_NOTES )
|
||||
aPlotter->SetDash( false );
|
||||
aPlotter->SetDash( 0 );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -50,6 +50,9 @@ class SCH_LINE : public SCH_ITEM
|
|||
COLOR4D m_color; ///< Line color
|
||||
|
||||
public:
|
||||
|
||||
static const enum wxPenStyle PenStyle[];
|
||||
|
||||
SCH_LINE( const wxPoint& pos = wxPoint( 0, 0 ), int layer = LAYER_NOTES );
|
||||
|
||||
SCH_LINE( const SCH_LINE& aLine );
|
||||
|
@ -79,11 +82,11 @@ public:
|
|||
|
||||
void SetEndPoint( const wxPoint& aPosition ) { m_end = aPosition; }
|
||||
|
||||
enum wxPenStyle GetDefaultStyle() const;
|
||||
int GetDefaultStyle() const;
|
||||
|
||||
void SetLineStyle( const int aStyle );
|
||||
|
||||
enum wxPenStyle GetLineStyle() const;
|
||||
int GetLineStyle() const;
|
||||
|
||||
void SetLineColor( const COLOR4D aColor );
|
||||
|
||||
|
|
|
@ -76,6 +76,16 @@ enum PlotTextMode {
|
|||
PLOTTEXTMODE_DEFAULT
|
||||
};
|
||||
|
||||
/**
|
||||
* Enum for choosing dashed line type
|
||||
*/
|
||||
enum PlotDashType {
|
||||
PLOTDASHTYPE_SOLID,
|
||||
PLOTDASHTYPE_DASH,
|
||||
PLOTDASHTYPE_DOT,
|
||||
PLOTDASHTYPE_DASHDOT,
|
||||
PLOTDASHTYPE_COUNT,
|
||||
};
|
||||
|
||||
/**
|
||||
* Base plotter engine class. General rule: all the interface with the caller
|
||||
|
@ -86,8 +96,7 @@ enum PlotTextMode {
|
|||
class PLOTTER
|
||||
{
|
||||
private:
|
||||
double m_dashMarkLength_mm ; ///< Dashed line parameter in mm: segment
|
||||
double m_dashGapLength_mm; ///< Dashed line parameter in mm: gap
|
||||
double m_dotMarkLength_mm ; ///< Dotted line parameter in mm: segment
|
||||
|
||||
public:
|
||||
// These values are used as flag for pen or aperture selection
|
||||
|
@ -146,7 +155,7 @@ public:
|
|||
|
||||
virtual void SetColor( COLOR4D color ) = 0;
|
||||
|
||||
virtual void SetDash( bool dashed ) = 0;
|
||||
virtual void SetDash( int dashed ) = 0;
|
||||
|
||||
virtual void SetCreator( const wxString& aCreator )
|
||||
{
|
||||
|
@ -501,6 +510,8 @@ protected:
|
|||
*/
|
||||
virtual double userToDeviceSize( double size ) const;
|
||||
|
||||
double GetDotMarkLenIU() const;
|
||||
|
||||
double GetDashMarkLenIU() const;
|
||||
|
||||
double GetDashGapLenIU() const;
|
||||
|
@ -576,7 +587,7 @@ public:
|
|||
}
|
||||
|
||||
virtual void SetDefaultLineWidth( int width ) override {}
|
||||
virtual void SetDash( bool dashed ) override;
|
||||
virtual void SetDash( int dashed ) override;
|
||||
|
||||
virtual void SetColor( COLOR4D color ) override {}
|
||||
|
||||
|
@ -751,7 +762,7 @@ public:
|
|||
virtual bool StartPlot() override;
|
||||
virtual bool EndPlot() override;
|
||||
virtual void SetCurrentLineWidth( int width, void* aData = NULL ) override;
|
||||
virtual void SetDash( bool dashed ) override;
|
||||
virtual void SetDash( int dashed ) override;
|
||||
|
||||
virtual void SetViewport( const wxPoint& aOffset, double aIusPerDecimil,
|
||||
double aScale, bool aMirror ) override;
|
||||
|
@ -821,7 +832,7 @@ public:
|
|||
virtual void StartPage();
|
||||
virtual void ClosePage();
|
||||
virtual void SetCurrentLineWidth( int width, void* aData = NULL ) override;
|
||||
virtual void SetDash( bool dashed ) override;
|
||||
virtual void SetDash( int dashed ) override;
|
||||
|
||||
/** PDF can have multiple pages, so SetPageSettings can be called
|
||||
* with the outputFile open (but not inside a page stream!) */
|
||||
|
@ -894,7 +905,7 @@ public:
|
|||
virtual bool StartPlot() override;
|
||||
virtual bool EndPlot() override;
|
||||
virtual void SetCurrentLineWidth( int width, void* aData = NULL ) override;
|
||||
virtual void SetDash( bool dashed ) override;
|
||||
virtual void SetDash( int dashed ) override;
|
||||
|
||||
virtual void SetViewport( const wxPoint& aOffset, double aIusPerDecimil,
|
||||
double aScale, bool aMirror ) override;
|
||||
|
@ -938,7 +949,10 @@ protected:
|
|||
bool m_graphics_changed; // true if a pen/brush parameter is modified
|
||||
// color, pen size, fil mode ...
|
||||
// the new SVG stype must be output on file
|
||||
bool m_dashed; // true to use plot dashed line style
|
||||
int m_dashed; // 0 = plot solid line style
|
||||
// 1 = plot dashed line style
|
||||
// 2 = plot dotted line style
|
||||
// 3 = plot dash-dot line style
|
||||
|
||||
/**
|
||||
* function emitSetRGBColor()
|
||||
|
@ -1008,7 +1022,7 @@ public:
|
|||
virtual void SetDefaultLineWidth( int width ) override;
|
||||
|
||||
// RS274X has no dashing, nor colours
|
||||
virtual void SetDash( bool dashed ) override {}
|
||||
virtual void SetDash( int dashed ) override {}
|
||||
virtual void SetColor( COLOR4D color ) override {}
|
||||
// Currently, aScale and aMirror are not used in gerber plotter
|
||||
virtual void SetViewport( const wxPoint& aOffset, double aIusPerDecimil,
|
||||
|
@ -1246,7 +1260,7 @@ public:
|
|||
defaultPenWidth = 0;
|
||||
}
|
||||
|
||||
virtual void SetDash( bool dashed ) override;
|
||||
virtual void SetDash( int dashed ) override;
|
||||
|
||||
virtual void SetColor( COLOR4D color ) override;
|
||||
|
||||
|
|
Loading…
Reference in New Issue