diff --git a/common/class_plotter.cpp b/common/class_plotter.cpp index 2fa3501fd9..4d6e20f814 100644 --- a/common/class_plotter.cpp +++ b/common/class_plotter.cpp @@ -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, diff --git a/common/common_plotDXF_functions.cpp b/common/common_plotDXF_functions.cpp index fcbe7e8d6a..5240088ea5 100644 --- a/common/common_plotDXF_functions.cpp +++ b/common/common_plotDXF_functions.cpp @@ -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 } diff --git a/common/common_plotHPGL_functions.cpp b/common/common_plotHPGL_functions.cpp index b2548ebab5..782508d526 100644 --- a/common/common_plotHPGL_functions.cpp +++ b/common/common_plotHPGL_functions.cpp @@ -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 ); + } } diff --git a/common/common_plotPDF_functions.cpp b/common/common_plotPDF_functions.cpp index a8c1c50569..1404afed88 100644 --- a/common/common_plotPDF_functions.cpp +++ b/common/common_plotPDF_functions.cpp @@ -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 ); + } } diff --git a/common/common_plotPS_functions.cpp b/common/common_plotPS_functions.cpp index 23aab5639a..ce39fb2eeb 100644 --- a/common/common_plotPS_functions.cpp +++ b/common/common_plotPS_functions.cpp @@ -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 ); + } } diff --git a/common/common_plotSVG_functions.cpp b/common/common_plotSVG_functions.cpp index dc07094998..50671d14ae 100644 --- a/common/common_plotSVG_functions.cpp +++ b/common/common_plotSVG_functions.cpp @@ -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 ) { diff --git a/eeschema/dialogs/dialog_edit_line_style.cpp b/eeschema/dialogs/dialog_edit_line_style.cpp index d72b68867a..30c103d8fb 100644 --- a/eeschema/dialogs/dialog_edit_line_style.cpp +++ b/eeschema/dialogs/dialog_edit_line_style.cpp @@ -22,6 +22,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ +#include #include @@ -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(); } diff --git a/eeschema/sch_line.cpp b/eeschema/sch_line.cpp index 7a23f8bcad..cb133147b3 100644 --- a/eeschema/sch_line.cpp +++ b/eeschema/sch_line.cpp @@ -42,6 +42,15 @@ #include +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 ); } diff --git a/eeschema/sch_line.h b/eeschema/sch_line.h index db5ab18733..5a81e33bcd 100644 --- a/eeschema/sch_line.h +++ b/eeschema/sch_line.h @@ -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 ); diff --git a/include/plot_common.h b/include/plot_common.h index ad7942674a..462f63ee38 100644 --- a/include/plot_common.h +++ b/include/plot_common.h @@ -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;