From a1998410fcea9de1311a2362eb22e65797c4554a Mon Sep 17 00:00:00 2001 From: charras Date: Wed, 30 Dec 2009 18:06:12 +0000 Subject: [PATCH] Some enhancements and fixes. (see changelog) --- CHANGELOG.txt | 9 + common/drawpanel.cpp | 4 +- common/gr_basic.cpp | 114 ++++++------ eeschema/class_libentry.cpp | 4 +- eeschema/class_libentry_fields.h | 9 +- eeschema/class_sch_cmp_field.h | 8 + eeschema/class_sch_component.cpp | 53 +++--- eeschema/class_sch_component.h | 7 + eeschema/general.h | 2 - eeschema/locate.cpp | 9 +- eeschema/program.h | 6 +- gerbview/files.cpp | 11 +- include/base_struct.h | 14 +- include/gr_basic.h | 17 +- internat/fr/kicad.mo | Bin 218792 -> 218955 bytes internat/fr/kicad.po | 238 +++++++++++++------------ kicad/treeprj_frame.cpp | 7 +- pcbnew/pcbplot.cpp | 295 +++++++++++++++++++++---------- 18 files changed, 500 insertions(+), 307 deletions(-) diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 6b7d631b24..9af8d7a3b5 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -4,6 +4,15 @@ KiCad ChangeLog 2009 Please add newer entries at the top, list the date and your name with email address. +2009-Dec-30 UPDATE Jean-Pierre Charras +================================================================================ +++pcbnew + Added option to use some usual Gerber files extension, depending on the layer + Do not allow in plot menu to output files for non enabled layers. +++Kicad and Gerbview + Display Gerber files that use usual files extension (in tree project or dialog files) + (See http://en.wikipedia.org/wiki/Gerber_File) + 2009-Dec-20 UPDATE Dick Hollenbeck ================================================================================ ++pcbnew diff --git a/common/drawpanel.cpp b/common/drawpanel.cpp index df66546922..187d621a0c 100644 --- a/common/drawpanel.cpp +++ b/common/drawpanel.cpp @@ -521,7 +521,7 @@ void WinEDA_DrawPanel::EraseScreen( wxDC* DC ) #ifndef WX_ZOOM GRSFilledRect( &m_ClipBox, DC, m_ClipBox.GetX(), m_ClipBox.GetY(), m_ClipBox.GetRight(), m_ClipBox.GetBottom(), - g_DrawBgColor, g_DrawBgColor ); + 0, g_DrawBgColor, g_DrawBgColor ); #else EDA_Rect tmp = m_ClipBox; @@ -534,7 +534,7 @@ void WinEDA_DrawPanel::EraseScreen( wxDC* DC ) GRSFilledRect( &m_ClipBox, DC, m_ClipBox.GetX(), m_ClipBox.GetY(), m_ClipBox.GetRight(), m_ClipBox.GetBottom(), - g_DrawBgColor, g_DrawBgColor ); + 0, g_DrawBgColor, g_DrawBgColor ); m_ClipBox = tmp; #endif diff --git a/common/gr_basic.cpp b/common/gr_basic.cpp index 6e859eb77c..6f7df5f837 100644 --- a/common/gr_basic.cpp +++ b/common/gr_basic.cpp @@ -60,15 +60,22 @@ static int PenMinWidth = 1; /* minimum pen width (must be> 0) * (Useful for printing) */ static bool ForceBlackPen; /* if true: draws in black instead of * color for printing. */ -static int xcliplo = 0, - ycliplo = 0, - xcliphi = 2000, - ycliphi = 2000; -static int lastcolor = -1; -static int lastwidth = -1; +static int xcliplo = 0, + ycliplo = 0, + xcliphi = 2000, + ycliphi = 2000; +static int lastcolor = -1; +static int lastwidth = -1; static int s_Last_Pen_Style = -1; static wxDC* lastDC = NULL; + +/* Local functions: */ +static void GRSRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, + int x2, int y2, int Color ); +static void GRSRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, + int x2, int y2, int width, int Color ); + /* * Macro clipping the trace of a line: * Line (x1, y1 x2, y2) is clipped to remain within @@ -362,9 +369,13 @@ void GRSetDrawMode( wxDC* DC, int draw_mode ) if( draw_mode & GR_OR ) #if defined(__WXMAC__) && (wxMAC_USE_CORE_GRAPHICS || wxCHECK_VERSION( 2, 9, 0 ) ) + + DC->SetLogicalFunction( wxCOPY ); #else + + DC->SetLogicalFunction( wxOR ); #endif else if( draw_mode & GR_XOR ) @@ -372,9 +383,13 @@ void GRSetDrawMode( wxDC* DC, int draw_mode ) else if( draw_mode & GR_NXOR ) #if defined(__WXMAC__) && (wxMAC_USE_CORE_GRAPHICS || wxCHECK_VERSION( 2, 9, 0 ) ) + + DC->SetLogicalFunction( wxXOR ); #else + + DC->SetLogicalFunction( wxEQUIV ); #endif else @@ -1397,7 +1412,7 @@ void GRArc( EDA_Rect* ClipBox, wxDC* DC, int xc, int yc, int StAngle, GRSetColorPen( DC, Color ); GRSetBrush( DC, Color, FALSE ); DC->DrawArc( GRMapX( xc + x1 ), GRMapY( yc - y1 ), GRMapX( xc + x2 ), - GRMapY( yc - y2 ), GRMapX( xc ), GRMapY( yc ) ); + GRMapY( yc - y2 ), GRMapX( xc ), GRMapY( yc ) ); } @@ -1422,13 +1437,9 @@ void GRArc( EDA_Rect* ClipBox, /* * Draw a rectangle in drawing space. */ -void GRRect( EDA_Rect* ClipBox, - wxDC* DC, - int x1, - int y1, - int x2, - int y2, - int Color ) +void GRRect( EDA_Rect* ClipBox, wxDC* DC, + int x1, int y1, int x2, int y2, + int Color ) { x1 = GRMapX( x1 ); y1 = GRMapY( y1 ); @@ -1438,18 +1449,25 @@ void GRRect( EDA_Rect* ClipBox, GRSRect( ClipBox, DC, x1, y1, x2, y2, Color ); } +void GRRect( EDA_Rect* aClipBox, wxDC* aDC, + const EDA_Rect& aRect, + int aColor ) +{ + int x1 = GRMapX( aRect.GetX() ); + int y1 = GRMapY( aRect.GetY() ); + int x2 = GRMapX( aRect.GetRight() ); + int y2 = GRMapY( aRect.GetBottom() ); + + GRSRect( aClipBox, aDC, x1, y1, x2, y2, aColor ); +} + /* - * Draw a rectangle in drawing space. + * Draw a rectangle (thick lines) in drawing space. */ -void GRRect( EDA_Rect* ClipBox, - wxDC* DC, - int x1, - int y1, - int x2, - int y2, - int width, - int Color ) +void GRRect( EDA_Rect* ClipBox, wxDC* DC, + int x1, int y1, int x2, int y2, + int width, int Color ) { x1 = GRMapX( x1 ); y1 = GRMapY( y1 ); @@ -1460,6 +1478,20 @@ void GRRect( EDA_Rect* ClipBox, GRSRect( ClipBox, DC, x1, y1, x2, y2, width, Color ); } +void GRRect( EDA_Rect* aClipBox, wxDC* aDC, + const EDA_Rect& aRect, + int aWidth, int aColor ) +{ + int x1 = GRMapX( aRect.GetX() ); + int y1 = GRMapY( aRect.GetY() ); + int x2 = GRMapX( aRect.GetRight() ); + int y2 = GRMapY( aRect.GetBottom() ); + + int width = ZoomValue( aWidth ); + + GRSRect( aClipBox, aDC, x1, y1, x2, y2, width, aColor ); +} + /* * Draw a rectangle (filled with AreaColor) in drawing space. @@ -1543,31 +1575,10 @@ void GRSRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, } -/* - * Draw a filled rectangle in screen space. - */ -void GRSFilledRect( EDA_Rect* ClipBox, - wxDC* DC, - int x1, - int y1, - int x2, - int y2, - int Color, - int BgColor ) -{ - GRSFilledRect( ClipBox, DC, x1, y1, x2, y2, 0, Color, BgColor ); -} - -void GRSFilledRect( EDA_Rect* ClipBox, - wxDC* DC, - int x1, - int y1, - int x2, - int y2, - int width, - int Color, - int BgColor ) +void GRSFilledRect( EDA_Rect* ClipBox, wxDC* DC, + int x1, int y1, int x2, int y2, + int width, int Color, int BgColor ) { if( x1 > x2 ) EXCHG( x1, x2 ); @@ -1635,11 +1646,11 @@ void ClipAndDrawFilledPoly( EDA_Rect* aClipBox, clippedPolygon.clear(); for( int ii = 0; ii < n; ii++ ) inputPolygon.push_back( PointF( (REAL) aPoints[ii].x, - (REAL) aPoints[ii].y ) ); + (REAL) aPoints[ii].y ) ); RectF window( (REAL) aClipBox->GetX(), (REAL) aClipBox->GetY(), - (REAL) aClipBox->GetWidth(), - (REAL) aClipBox->GetHeight() ); + (REAL) aClipBox->GetWidth(), + (REAL) aClipBox->GetHeight() ); SutherlandHodgman sh( window ); sh.Clip( inputPolygon, outputPolygon ); @@ -1649,13 +1660,14 @@ void ClipAndDrawFilledPoly( EDA_Rect* aClipBox, ++cit ) { clippedPolygon.push_back( wxPoint( wxRound( cit->X ), - wxRound( cit->Y ) ) ); + wxRound( cit->Y ) ) ); } if( clippedPolygon.size() ) aDC->DrawPolygon( clippedPolygon.size(), &clippedPolygon[0] ); } + #endif diff --git a/eeschema/class_libentry.cpp b/eeschema/class_libentry.cpp index c2a0e01f8a..2629d4ff1d 100644 --- a/eeschema/class_libentry.cpp +++ b/eeschema/class_libentry.cpp @@ -451,7 +451,7 @@ bool LIB_COMPONENT::Save( FILE* aFile ) if( fprintf( aFile, "DEF" ) < 0 ) return false; - if( ( value.m_Attributs & TEXT_NO_VISIBLE ) == 0 ) + if( value.IsVisible() ) { if( fprintf( aFile, " %s", CONV_TO_UTF8( value.m_Text ) ) < 0 ) return false; @@ -859,7 +859,7 @@ EDA_Rect LIB_COMPONENT::GetBoundaryBox( int aUnit, int aConvert ) continue; if ( ( item.Type() == COMPONENT_FIELD_DRAW_TYPE ) - && ( ( ( LIB_TEXT& ) item ).m_Attributs & TEXT_NO_VISIBLE ) ) + && !( ( LIB_FIELD& ) item ).IsVisible() ) continue; bBox.Merge( item.GetBoundingBox() ); diff --git a/eeschema/class_libentry_fields.h b/eeschema/class_libentry_fields.h index e6e64b9d91..e1c61a8df9 100644 --- a/eeschema/class_libentry_fields.h +++ b/eeschema/class_libentry_fields.h @@ -84,9 +84,16 @@ public: int aColor, int aDrawMode, void* aData, const int aTransformMatrix[2][2] ); + /** Function IsVisible + * @return true is this field is visible, false if flagged invisible + */ + bool IsVisible() + { + return (m_Attributs & TEXT_NO_VISIBLE) == 0 ? true : false; + } + /** * Return the bounding rectangle of the field text. - * * @return Bounding rectangle. */ virtual EDA_Rect GetBoundingBox(); diff --git a/eeschema/class_sch_cmp_field.h b/eeschema/class_sch_cmp_field.h index 244b15ad6d..4d6d078616 100644 --- a/eeschema/class_sch_cmp_field.h +++ b/eeschema/class_sch_cmp_field.h @@ -67,6 +67,14 @@ public: */ int GetPenSize( ); + /** Function IsVisible + * @return true is this field is visible, false if flagged invisible + */ + bool IsVisible() + { + return (m_Attributs & TEXT_NO_VISIBLE) == 0 ? true : false; + } + /** * Function Draw */ diff --git a/eeschema/class_sch_component.cpp b/eeschema/class_sch_component.cpp index 93078f5b81..9bdc42b889 100644 --- a/eeschema/class_sch_component.cpp +++ b/eeschema/class_sch_component.cpp @@ -205,8 +205,7 @@ void SCH_COMPONENT::Draw( WinEDA_DrawPanel* panel, wxDC* DC, SCH_FIELD* field = GetField( REFERENCE ); - if( ( ( field->m_Attributs & TEXT_NO_VISIBLE ) == 0 ) - && !( field->m_Flags & IS_MOVED ) ) + if( field->IsVisible() && !( field->m_Flags & IS_MOVED ) ) { if( Entry->GetPartCount() > 1 ) { @@ -236,23 +235,20 @@ void SCH_COMPONENT::Draw( WinEDA_DrawPanel* panel, wxDC* DC, { EDA_Rect BoundaryBox; BoundaryBox = GetBoundaryBox(); - int x1 = BoundaryBox.GetX(); - int y1 = BoundaryBox.GetY(); - int x2 = BoundaryBox.GetRight(); - int y2 = BoundaryBox.GetBottom(); - GRRect( &panel->m_ClipBox, DC, x1, y1, x2, y2, BROWN ); - BoundaryBox = GetField( REFERENCE )->GetBoundaryBox(); - x1 = BoundaryBox.GetX(); - y1 = BoundaryBox.GetY(); - x2 = BoundaryBox.GetRight(); - y2 = BoundaryBox.GetBottom(); - GRRect( &panel->m_ClipBox, DC, x1, y1, x2, y2, BROWN ); - BoundaryBox = GetField( VALUE )->GetBoundaryBox(); - x1 = BoundaryBox.GetX(); - y1 = BoundaryBox.GetY(); - x2 = BoundaryBox.GetRight(); - y2 = BoundaryBox.GetBottom(); - GRRect( &panel->m_ClipBox, DC, x1, y1, x2, y2, BROWN ); + GRRect( &panel->m_ClipBox, DC, BoundaryBox, BROWN ); +#if 1 + if( GetField( REFERENCE )->IsVisible() ) + { + BoundaryBox = GetField( REFERENCE )->GetBoundaryBox(); + GRRect( &panel->m_ClipBox, DC, BoundaryBox, BROWN ); + } + + if( GetField( VALUE )->IsVisible() ) + { + BoundaryBox = GetField( VALUE )->GetBoundaryBox(); + GRRect( &panel->m_ClipBox, DC, BoundaryBox, BROWN ); + } +#endif } #endif } @@ -530,7 +526,13 @@ LIB_PIN* SCH_COMPONENT::GetPin( const wxString& number ) return Entry->GetPin( number, m_Multi, m_Convert ); } - +/** + * Function GetBoundaryBox + * returns the orthogonal, bounding box of this object for display purposes. + * This box should be an enclosing perimeter for graphic items and pins. + * this include only fields defined in library + * use GetBoundingBox() to include fields in schematic + */ EDA_Rect SCH_COMPONENT::GetBoundaryBox() const { LIB_COMPONENT* Entry = CMP_LIBRARY::FindLibraryComponent( m_ChipName ); @@ -1064,6 +1066,13 @@ bool SCH_COMPONENT::Save( FILE* f ) const } +/** + * Function GetBoundingBox + * returns the orthogonal, bounding box of this object for display purposes. + * This box should be an enclosing perimeter for visible components of this + * object, and the units should be in the pcb or schematic coordinate system. + * It is OK to overestimate the size by a few counts. + */ EDA_Rect SCH_COMPONENT::GetBoundingBox() { const int PADDING = 40; @@ -1074,11 +1083,13 @@ EDA_Rect SCH_COMPONENT::GetBoundingBox() // Include BoundingBoxes of fields for( int ii = 0; ii < GetFieldCount(); ii++ ) { + if( ! GetField( ii )->IsVisible() ) + continue; bbox.Merge( GetField( ii )->GetBoundaryBox() ); } // ... add padding - bbox.Inflate( PADDING, PADDING ); + bbox.Inflate( PADDING ); return bbox; } diff --git a/eeschema/class_sch_component.h b/eeschema/class_sch_component.h index 933fad3d44..2d4f13137b 100644 --- a/eeschema/class_sch_component.h +++ b/eeschema/class_sch_component.h @@ -209,6 +209,13 @@ public: */ void SetTimeStamp( long aNewTimeStamp); + /** + * Function GetBoundaryBox + * returns the orthogonal, bounding box of this object for display purposes. + * This box should be an enclosing perimeter for graphic items and pins. + * this include only fields defined in library + * use GetBoundingBox() to include fields in schematic + */ EDA_Rect GetBoundaryBox() const; /** diff --git a/eeschema/general.h b/eeschema/general.h index d97a4ebe4a..7008b28046 100644 --- a/eeschema/general.h +++ b/eeschema/general.h @@ -22,8 +22,6 @@ /* Used for EDA_BaseStruct, .m_Select member */ #define IS_SELECTED 1 -#define TEXT_NO_VISIBLE 1 - //#define GR_DEFAULT_DRAWMODE GR_COPY #define GR_DEFAULT_DRAWMODE GR_COPY diff --git a/eeschema/locate.cpp b/eeschema/locate.cpp index 46dc5e664f..3d35ea62d3 100644 --- a/eeschema/locate.cpp +++ b/eeschema/locate.cpp @@ -417,7 +417,6 @@ bool IsItemInBox( EDA_Rect& aBox, SCH_ITEM* DrawStruct ) case TYPE_SCH_TEXT: case TYPE_SCH_HIERLABEL: case TYPE_SCH_GLOBALLABEL: - case TYPE_SCH_COMPONENT: case DRAW_SHEET_STRUCT_TYPE: case TYPE_SCH_MARKER: BoundaryBox = DrawStruct->GetBoundingBox(); @@ -425,6 +424,14 @@ bool IsItemInBox( EDA_Rect& aBox, SCH_ITEM* DrawStruct ) return true; break; + case TYPE_SCH_COMPONENT: + // Use a more restrictive area than GetBoundingBox() + // Area is restricted to the body area, excludint fields outside this area + BoundaryBox = ((SCH_COMPONENT*)DrawStruct)->GetBoundaryBox(); + if( aBox.Intersects( BoundaryBox ) ) + return true; + break; + case DRAW_HIERARCHICAL_PIN_SHEET_STRUCT_TYPE: break; diff --git a/eeschema/program.h b/eeschema/program.h index d2f51afd07..c7f2771733 100644 --- a/eeschema/program.h +++ b/eeschema/program.h @@ -5,6 +5,9 @@ #ifndef PROGRAM_H #define PROGRAM_H +#define HIGHLIGHT_COLOR WHITE +#define TEXT_NO_VISIBLE 1 + #include "wxEeschemaStruct.h" #include "macros.h" #include "base_struct.h" @@ -17,9 +20,6 @@ #include "class_text-label.h" #include "class_schematic_items.h" -#define HIGHLIGHT_COLOR WHITE - -#define TEXT_NO_VISIBLE 1 /* Rotation, mirror of graphic items in components bodies are handled by a * transform matrix. The default matix is useful to draw lib entries with diff --git a/gerbview/files.cpp b/gerbview/files.cpp index 42449a65a0..8fe166380b 100644 --- a/gerbview/files.cpp +++ b/gerbview/files.cpp @@ -110,9 +110,14 @@ bool WinEDA_GerberFrame::LoadOneGerberFile( const wxString& FullFileName, { wxString current_path = filename.GetPath(); - /* Standard gerber filetypes */ - filetypes += _( "Gerber files (.gbr .gbx .lgr .ger .pho)| \ -.gbr;*.GBR;*.gbx;*.GBX;*.lgr;*.LGR;*.ger;*.GER;*.pho;*.PHO|" ); + /* Standard gerber filetypes + * (See http://en.wikipedia.org/wiki/Gerber_File) + * the .pho extension is the default used in Pcbnew + */ + filetypes = _( "Gerber files (.gb* .gt* .lgr .ger .pho)" ); + filetypes << wxT("|"); + filetypes += wxT("*.gb*;*.GB*;.gt*;.GT*;.gko;.GKO;*.GPB;*.gpb;*.lgr;*.LGR;*.ger;*.GER;*.pho;*.PHO" ); + filetypes << wxT("|"); /* Special gerber filetypes */ filetypes += _( "Top layer (*.GTL)|*.GTL;*.gtl|" ); diff --git a/include/base_struct.h b/include/base_struct.h index d257e84f10..68a322b062 100644 --- a/include/base_struct.h +++ b/include/base_struct.h @@ -175,15 +175,15 @@ public: bool Inside( int x, int y ) { return Inside( wxPoint( x, y ) ); } wxSize GetSize() { return m_Size; } - int GetX() { return m_Pos.x; } - int GetY() { return m_Pos.y; } + int GetX() const { return m_Pos.x; } + int GetY() const { return m_Pos.y; } wxPoint GetOrigin() { return m_Pos; } wxPoint GetPosition() { return m_Pos; } - wxPoint GetEnd() { return wxPoint( GetRight(), GetBottom() ); } - int GetWidth() { return m_Size.x; } - int GetHeight() { return m_Size.y; } - int GetRight() { return m_Pos.x + m_Size.x; } - int GetBottom() { return m_Pos.y + m_Size.y; } + wxPoint GetEnd() const { return wxPoint( GetRight(), GetBottom() ); } + int GetWidth() const { return m_Size.x; } + int GetHeight() const { return m_Size.y; } + int GetRight() const { return m_Pos.x + m_Size.x; } + int GetBottom() const { return m_Pos.y + m_Size.y; } void SetOrigin( const wxPoint& pos ) { m_Pos = pos; } void SetOrigin( int x, int y ) { m_Pos.x = x; m_Pos.y = y; } void SetSize( const wxSize& size ) { m_Size = size; } diff --git a/include/gr_basic.h b/include/gr_basic.h index 1e2eea2d8a..4a817be294 100644 --- a/include/gr_basic.h +++ b/include/gr_basic.h @@ -58,6 +58,10 @@ void GRForceBlackPen( bool flagforce ); bool GetGRForceBlackPenState( void ); void SetPenMinWidth( int minwidth ); +void GRSPutPixel( EDA_Rect* ClipBox, wxDC* DC, int x, int y, int color ); +void GRSFilledRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, + int x2, int y2, int width, int Color, int BgColor ); + void GRLine( EDA_Rect* aClipBox, wxDC* aDC, wxPoint aStart, wxPoint aEnd, int aWidth, int aColor ); void GRLine( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, @@ -205,24 +209,19 @@ void GRSetColor( int Color ); void GRSetDefaultPalette(); int GRGetColor(); void GRPutPixel( EDA_Rect* ClipBox, wxDC* DC, int x, int y, int color ); -void GRSPutPixel( EDA_Rect* ClipBox, wxDC* DC, int x, int y, int color ); int GRGetPixel( wxDC* DC, int x, int y ); void GRFilledRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, int Color, int BgColor ); void GRFilledRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, int width, int Color, int BgColor ); -void GRSFilledRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, - int x2, int y2, int Color, int BgColor ); -void GRSFilledRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, - int x2, int y2, int width, int Color, int BgColor ); void GRRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, int Color ); +void GRRect( EDA_Rect* ClipBox, wxDC* DC,const EDA_Rect& aRect, + int Color ); void GRRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, int x2, int y2, int width, int Color ); -void GRSRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, - int x2, int y2, int Color ); -void GRSRect( EDA_Rect* ClipBox, wxDC* DC, int x1, int y1, - int x2, int y2, int width, int Color ); +void GRRect( EDA_Rect* aClipBox, wxDC* aDC,const EDA_Rect& aRect, + int aWidth, int aColor ); #endif /* define GR_BASIC */ diff --git a/internat/fr/kicad.mo b/internat/fr/kicad.mo index faec486f83fcbaf1f950f247bb9e52a99920465d..99d41d09417917e37c8546be585e0551f8129df5 100644 GIT binary patch delta 63870 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 VQT&fqKO(ip#N;vbZ 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
jrH|k1&*et75c%vr4{;s zFDt@c>qk-}__71|D-b`3F958KZzzqtW}T4rIMaCJVRLWM>?NAey?RMV2Lter?J8i|hoH8~@g4~ADo1nPS}E=OcL zfKA}fw_ube`c$W|z7;$8e0AS@c^^ zJ%YO#%^?=F29)TvC?rL;oy?|S04Mg8bqG1}z&Qxdg%e`U^g_I(V%E@ggpRPzLBXAB zEHb}?s2$Y4XF%6(ZMGi!`mKA&x(Y8DY zygdqK%v!EwO+Lc#%r^UD)j z?3-VLnBj632*{Bmq)~)0fzC8^M1(NY@+Pmgy4{{vkv;R^r& diff --git a/internat/fr/kicad.po b/internat/fr/kicad.po index 85bb7324c3..5f7163580b 100644 --- a/internat/fr/kicad.po +++ b/internat/fr/kicad.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: kicad\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-12-29 11:30+0100\n" -"PO-Revision-Date: 2009-12-29 11:34+0100\n" +"POT-Creation-Date: 2009-12-30 18:30+0100\n" +"PO-Revision-Date: 2009-12-30 18:34+0100\n" "Last-Translator: \n" "Language-Team: kicad team \n" "MIME-Version: 1.0\n" @@ -2423,236 +2423,244 @@ msgstr "&3D Visu" msgid "&Help" msgstr "&Aide" -#: pcbnew/pcbplot.cpp:178 -#: pcbnew/pcbplot.cpp:327 +#: pcbnew/pcbplot.cpp:184 +#: pcbnew/pcbplot.cpp:328 msgid "Plot" msgstr "Tracer" -#: pcbnew/pcbplot.cpp:226 +#: pcbnew/pcbplot.cpp:232 msgid "Plot Format" msgstr "Format de tracé" -#: pcbnew/pcbplot.cpp:240 +#: pcbnew/pcbplot.cpp:243 msgid "HPGL Options:" msgstr "Options HPGL:" -#: pcbnew/pcbplot.cpp:245 +#: pcbnew/pcbplot.cpp:248 msgid "Pen size" msgstr "Diam plume" -#: pcbnew/pcbplot.cpp:252 +#: pcbnew/pcbplot.cpp:255 msgid "Pen Speed (cm/s)" msgstr "Vitesse Plume ( cm/s )" -#: pcbnew/pcbplot.cpp:256 +#: pcbnew/pcbplot.cpp:259 msgid "Set pen speed in cm/s" msgstr "Ajuster Vitesse plume en centimètres par seconde" -#: pcbnew/pcbplot.cpp:258 +#: pcbnew/pcbplot.cpp:261 msgid "Pen ovr" msgstr "Recouvrement" -#: pcbnew/pcbplot.cpp:264 +#: pcbnew/pcbplot.cpp:267 msgid "Set plot overlay for filling" msgstr "Ajuste recouvrement des tracés pour les remplissages" -#: pcbnew/pcbplot.cpp:266 +#: pcbnew/pcbplot.cpp:269 msgid "Line width" msgstr "Epaisseur ligne" -#: pcbnew/pcbplot.cpp:272 +#: pcbnew/pcbplot.cpp:276 msgid "Set lines width used to plot in sketch mode and plot pads outlines on silk screen layers" msgstr "Ajuste l'épaisseur des lignes utilisées pour tracer en mode contour et pour les contours des pads sur les couches de sérigraphie" -#: pcbnew/pcbplot.cpp:277 +#: pcbnew/pcbplot.cpp:281 msgid "Absolute" msgstr "Absolu" -#: pcbnew/pcbplot.cpp:277 +#: pcbnew/pcbplot.cpp:281 msgid "Auxiliary axis" msgstr "Axe Auxiliaire" -#: pcbnew/pcbplot.cpp:280 +#: pcbnew/pcbplot.cpp:284 msgid "Plot Origin" msgstr "Origine des Coord de Tracé" -#: pcbnew/pcbplot.cpp:308 +#: pcbnew/pcbplot.cpp:309 msgid "X scale adjust" msgstr "Ajustage Echelle X" -#: pcbnew/pcbplot.cpp:311 +#: pcbnew/pcbplot.cpp:312 msgid "Set X scale adjust for exact scale plotting" msgstr "Ajuster échelle X pour traçage à l'échelle exacte" -#: pcbnew/pcbplot.cpp:315 +#: pcbnew/pcbplot.cpp:316 msgid "Y scale adjust" msgstr "Ajustage Echelle Y" -#: pcbnew/pcbplot.cpp:318 +#: pcbnew/pcbplot.cpp:319 msgid "Set Y scale adjust for exact scale plotting" msgstr "Ajuster échelle Y pour traçage à l'échelle exacte" -#: pcbnew/pcbplot.cpp:321 +#: pcbnew/pcbplot.cpp:322 msgid "Plot negative" msgstr "Tracé en Négatif" -#: pcbnew/pcbplot.cpp:330 +#: pcbnew/pcbplot.cpp:331 msgid "Save Options" msgstr "Sauver Options" -#: pcbnew/pcbplot.cpp:334 +#: pcbnew/pcbplot.cpp:335 msgid "Generate drill file" msgstr "Créer Fichier de perçage" -#: pcbnew/pcbplot.cpp:337 +#: pcbnew/pcbplot.cpp:338 msgid "Close" msgstr "Fermer" -#: pcbnew/pcbplot.cpp:383 +#: pcbnew/pcbplot.cpp:384 +msgid "Use Proper Gerber Extensions" +msgstr "Utiliser Extensions Gerber Particulières" + +#: pcbnew/pcbplot.cpp:390 +msgid "Use Proper Gerber Extensions - .GBL, .GTL, etc..." +msgstr "Utiliser les extensions GERBER specifiques aux couches - .GBL, .GTL, etc..." + +#: pcbnew/pcbplot.cpp:397 msgid "Exclude pcb edge layer" msgstr "Exclure couche contours PCB" -#: pcbnew/pcbplot.cpp:387 +#: pcbnew/pcbplot.cpp:401 msgid "Exclude contents of the pcb edge layer from all other layers" msgstr "Exclure les tracés contour PCB des autres couches" -#: pcbnew/pcbplot.cpp:394 +#: pcbnew/pcbplot.cpp:408 msgid "Print sheet reference" msgstr "Imprimer cartouche" -#: pcbnew/pcbplot.cpp:405 +#: pcbnew/pcbplot.cpp:419 msgid "Print pads on silkscreen" msgstr "Pads sur Sérigraphie" -#: pcbnew/pcbplot.cpp:413 +#: pcbnew/pcbplot.cpp:426 msgid "Enable/disable print/plot pads on silkscreen layers" msgstr "Active/désactive tracé des pastilles sur les couches de sérigraphie" -#: pcbnew/pcbplot.cpp:417 +#: pcbnew/pcbplot.cpp:430 msgid "Always print pads" msgstr "Toujours tracer pads" -#: pcbnew/pcbplot.cpp:423 +#: pcbnew/pcbplot.cpp:435 msgid "Force print/plot pads on ALL layers" msgstr "Force le tracé des pastilles sur TOUTES les couches" -#: pcbnew/pcbplot.cpp:428 +#: pcbnew/pcbplot.cpp:440 msgid "Print module value" msgstr "Imprimer Valeur Module" -#: pcbnew/pcbplot.cpp:432 +#: pcbnew/pcbplot.cpp:444 msgid "Enable/disable print/plot module value on silkscreen layers" msgstr "Active/désactive le tracé des textes valeurs des modules sur couches de sérigraphie" -#: pcbnew/pcbplot.cpp:436 +#: pcbnew/pcbplot.cpp:448 msgid "Print module reference" msgstr "Imprimer Référence Module" -#: pcbnew/pcbplot.cpp:440 +#: pcbnew/pcbplot.cpp:452 msgid "Enable/disable print/plot module reference on silkscreen layers" msgstr "Active/désactive le tracé des textes référence des modules sur couches de sérigraphie" -#: pcbnew/pcbplot.cpp:444 +#: pcbnew/pcbplot.cpp:456 msgid "Print other module texts" msgstr "Imprimer autres textes module" -#: pcbnew/pcbplot.cpp:448 +#: pcbnew/pcbplot.cpp:460 msgid "Enable/disable print/plot module field texts on silkscreen layers" msgstr "Active/désactive le tracé des textes des champs des modules sur couches de sérigraphie" -#: pcbnew/pcbplot.cpp:453 +#: pcbnew/pcbplot.cpp:465 msgid "Force print invisible texts" msgstr "Force tracé textes invisibles" -#: pcbnew/pcbplot.cpp:457 +#: pcbnew/pcbplot.cpp:469 msgid "Force print/plot module invisible texts on silkscreen layers" msgstr "Force le tracé des textes invisibles sur couches de sérigraphie" -#: pcbnew/pcbplot.cpp:462 +#: pcbnew/pcbplot.cpp:475 msgid "No drill mark" msgstr "Pas de marque" -#: pcbnew/pcbplot.cpp:463 +#: pcbnew/pcbplot.cpp:476 msgid "Small mark" msgstr "Petite marque" -#: pcbnew/pcbplot.cpp:464 +#: pcbnew/pcbplot.cpp:477 msgid "Real drill" msgstr "Perçage réel" -#: pcbnew/pcbplot.cpp:468 +#: pcbnew/pcbplot.cpp:481 msgid "Pads Drill Opt" msgstr "Options Perçage Pads" -#: pcbnew/pcbplot.cpp:477 +#: pcbnew/pcbplot.cpp:490 msgid "Auto scale" msgstr "Ech. auto" -#: pcbnew/pcbplot.cpp:478 +#: pcbnew/pcbplot.cpp:491 msgid "Scale 1" msgstr "Echelle 1" -#: pcbnew/pcbplot.cpp:479 +#: pcbnew/pcbplot.cpp:492 msgid "Scale 1.5" msgstr "Echelle 1,5" -#: pcbnew/pcbplot.cpp:480 +#: pcbnew/pcbplot.cpp:493 msgid "Scale 2" msgstr "Echelle 2" -#: pcbnew/pcbplot.cpp:481 +#: pcbnew/pcbplot.cpp:494 msgid "Scale 3" msgstr "Echelle 3" -#: pcbnew/pcbplot.cpp:485 +#: pcbnew/pcbplot.cpp:498 msgid "Scale Opt" msgstr "Echelle" -#: pcbnew/pcbplot.cpp:492 +#: pcbnew/pcbplot.cpp:507 msgid "Line" msgstr "Ligne" -#: pcbnew/pcbplot.cpp:492 +#: pcbnew/pcbplot.cpp:507 msgid "Filled" msgstr "Plein" -#: pcbnew/pcbplot.cpp:493 +#: pcbnew/pcbplot.cpp:508 msgid "Sketch" msgstr "Contour" -#: pcbnew/pcbplot.cpp:495 +#: pcbnew/pcbplot.cpp:511 msgid "Plot Mode" msgstr "Mode de Tracé" -#: pcbnew/pcbplot.cpp:503 +#: pcbnew/pcbplot.cpp:519 msgid "Plot mirror" msgstr "Tracé Miroir" -#: pcbnew/pcbplot.cpp:509 +#: pcbnew/pcbplot.cpp:525 msgid "Vias on mask" msgstr "Vias sur masque" -#: pcbnew/pcbplot.cpp:513 +#: pcbnew/pcbplot.cpp:529 msgid "Print/plot vias on mask layers. They are in this case not protected" msgstr "Trace vias sur vernis épargne. Elles seront non protégées" -#: pcbnew/pcbplot.cpp:762 +#: pcbnew/pcbplot.cpp:784 msgid "Adobe post script files (.ps)|*.ps" msgstr "Fichiers Adobe post script (.ps)|*.ps" -#: pcbnew/pcbplot.cpp:768 -msgid "GERBER photo plot files (.pho)|*.pho" -msgstr "Fichiers phottraçage GERBER (.pho)|*.pho" +#: pcbnew/pcbplot.cpp:790 +msgid "GERBER photo plot files (.pho .gbr)|*.pho;*.gbr" +msgstr "Fichiers photraçage GERBER (.pho .gbr)|*.pho;*.gbr" -#: pcbnew/pcbplot.cpp:786 +#: pcbnew/pcbplot.cpp:808 msgid "Warning: Scale option set to a very small value" msgstr "Attention: option d'échelle ajustée à une valeur très petite" -#: pcbnew/pcbplot.cpp:789 +#: pcbnew/pcbplot.cpp:811 msgid "Warning: Scale option set to a very large value" msgstr "Attention: option d'échelle ajustée à une valeur très grande" -#: pcbnew/pcbplot.cpp:838 +#: pcbnew/pcbplot.cpp:939 msgid "No layer selected" msgstr "Pas de couche sélectionnée" @@ -9710,7 +9718,7 @@ msgstr "Imprimer Tout" msgid "Current" msgstr "Courant" -#: eeschema/class_sch_component.cpp:1103 +#: eeschema/class_sch_component.cpp:1114 msgid "Power symbol" msgstr "Symbole d'alimentation" @@ -11220,105 +11228,105 @@ msgstr "Fichier exécutable (" msgid "Select Prefered Editor" msgstr "Sélection Editeur Préféré" -#: kicad/treeprj_frame.cpp:123 +#: kicad/treeprj_frame.cpp:126 msgid "&Run" msgstr "Exécute&r" -#: kicad/treeprj_frame.cpp:124 +#: kicad/treeprj_frame.cpp:127 msgid "Run the Python Script" msgstr "Exécuter le Script Python" -#: kicad/treeprj_frame.cpp:133 -#: kicad/treeprj_frame.cpp:208 +#: kicad/treeprj_frame.cpp:136 +#: kicad/treeprj_frame.cpp:211 msgid "&Edit in a text editor" msgstr "Editer avec un éditeur de Texte" -#: kicad/treeprj_frame.cpp:134 +#: kicad/treeprj_frame.cpp:137 msgid "&Open the file in a Text Editor" msgstr "&Ouvrir le fichier avec un Editeur de texte" -#: kicad/treeprj_frame.cpp:151 +#: kicad/treeprj_frame.cpp:154 msgid "New D&irectory" msgstr "&Nouveau Répertoire" -#: kicad/treeprj_frame.cpp:152 +#: kicad/treeprj_frame.cpp:155 msgid "Create a New Directory" msgstr "Créer un nouveau Répertoire" -#: kicad/treeprj_frame.cpp:161 +#: kicad/treeprj_frame.cpp:164 msgid "New P&ython Script" msgstr "Nouveau Script P&ython" -#: kicad/treeprj_frame.cpp:162 +#: kicad/treeprj_frame.cpp:165 msgid "Create a New Python Script" msgstr "Créer un nouveau script Python" -#: kicad/treeprj_frame.cpp:171 +#: kicad/treeprj_frame.cpp:174 msgid "New &Text File" msgstr "Nouveau Fichier &Texte" -#: kicad/treeprj_frame.cpp:172 +#: kicad/treeprj_frame.cpp:175 msgid "Create a New Txt File" msgstr "Créer un nouveau Fichier texte" -#: kicad/treeprj_frame.cpp:180 +#: kicad/treeprj_frame.cpp:183 msgid "New &File" msgstr "Nouveau &Fichier" -#: kicad/treeprj_frame.cpp:181 +#: kicad/treeprj_frame.cpp:184 msgid "Create a New File" msgstr "Créer un nouveau Fichier" -#: kicad/treeprj_frame.cpp:195 +#: kicad/treeprj_frame.cpp:198 msgid "&Rename file" msgstr "&Renommer fichier" -#: kicad/treeprj_frame.cpp:196 -#: kicad/treeprj_frame.cpp:198 +#: kicad/treeprj_frame.cpp:199 +#: kicad/treeprj_frame.cpp:201 msgid "&Rename directory" msgstr "&Renommer répertoire" -#: kicad/treeprj_frame.cpp:197 +#: kicad/treeprj_frame.cpp:200 msgid "Rename file" msgstr "Renommer fichier" -#: kicad/treeprj_frame.cpp:209 +#: kicad/treeprj_frame.cpp:212 msgid "Open the file in a Text Editor" msgstr "Ouvrir le fichier avec un Editeur de texte" -#: kicad/treeprj_frame.cpp:217 +#: kicad/treeprj_frame.cpp:220 msgid "&Delete File" msgstr "&Supprimer Fichier" -#: kicad/treeprj_frame.cpp:218 +#: kicad/treeprj_frame.cpp:221 msgid "&Delete Directory" msgstr "&Supprimer le Répertoire" -#: kicad/treeprj_frame.cpp:219 +#: kicad/treeprj_frame.cpp:222 msgid "Delete the File" msgstr "Supprimer le fichier" -#: kicad/treeprj_frame.cpp:220 +#: kicad/treeprj_frame.cpp:223 msgid "&Delete the Directory and its content" msgstr "Effacer le Répertoire et son contenu" -#: kicad/treeprj_frame.cpp:546 +#: kicad/treeprj_frame.cpp:549 msgid "Create New File" msgstr "Créer un Nouveau Fichier" -#: kicad/treeprj_frame.cpp:547 +#: kicad/treeprj_frame.cpp:550 msgid "Create New Directory" msgstr "Créer un nouveau Répertoire" -#: kicad/treeprj_frame.cpp:556 +#: kicad/treeprj_frame.cpp:559 msgid "noname." msgstr "noname." -#: kicad/treeprj_frame.cpp:1085 +#: kicad/treeprj_frame.cpp:1088 msgid "Change filename: " msgstr "Changer Nom Fichier: " -#: kicad/treeprj_frame.cpp:1087 +#: kicad/treeprj_frame.cpp:1090 msgid "Change filename" msgstr "Changer Nom Fichier" @@ -11360,14 +11368,14 @@ msgid "%d errors while reading Gerber file [%s]" msgstr "%d erreurs pendant lecture fichier gerber [%s]" #: gerbview/readgerb.cpp:267 -#: gerbview/files.cpp:183 -#: gerbview/files.cpp:216 +#: gerbview/files.cpp:185 +#: gerbview/files.cpp:218 #, c-format msgid "Gerber DCODE files (%s)|*.%s" msgstr "Fichiers Gerber DCODE (%s)|*.%s" #: gerbview/readgerb.cpp:272 -#: gerbview/files.cpp:189 +#: gerbview/files.cpp:191 msgid "Load GERBER DCODE File" msgstr "Charger Fichier de DCodes" @@ -11384,62 +11392,62 @@ msgid "Not yet available..." msgstr "non encore disponible" #: gerbview/files.cpp:114 -msgid "Gerber files (.gbr .gbx .lgr .ger .pho)| .gbr;*.GBR;*.gbx;*.GBX;*.lgr;*.LGR;*.ger;*.GER;*.pho;*.PHO|" -msgstr "Fichiers Gerber (.gbr .gbx .lgr .ger .pho)| *.gbr;*.GBR;*.gbx;*.GBX;*.lgr;*.LGR;*.ger;*.GER;*.pho;*.PHO|" +msgid "Gerber files (.gb* .gt* .lgr .ger .pho)" +msgstr "Fichiers Gerber .gb* .gt* .lgr .ger .pho)" -#: gerbview/files.cpp:118 +#: gerbview/files.cpp:120 msgid "Top layer (*.GTL)|*.GTL;*.gtl|" msgstr "Couche composant" -#: gerbview/files.cpp:119 +#: gerbview/files.cpp:121 msgid "Bottom layer (*.GBL)|*.GBL;*.gbl|" msgstr "Couche cuivre" -#: gerbview/files.cpp:120 +#: gerbview/files.cpp:122 msgid "Bottom solder resist (*.GBS)|*.GBS;*.gbs|" msgstr "Masque soudure cuivre (*.GBS)|*.GBS;*.gbs|" -#: gerbview/files.cpp:121 +#: gerbview/files.cpp:123 msgid "Top solder resist (*.GTS)|*.GTS;*.gts|" msgstr "Masque soudure composant (*.GTS)|*.GTS;*.gts|" -#: gerbview/files.cpp:122 +#: gerbview/files.cpp:124 msgid "Bottom overlay (*.GBO)|*.GBO;*.gbo|" -msgstr "Simple face, CMS coté Cuivre." +msgstr "Bottom overlay (*.GBO)|*.GBO;*.gbo|" -#: gerbview/files.cpp:123 +#: gerbview/files.cpp:125 msgid "Top overlay (*.GTO)|*.GTO;*.gto|" msgstr "Top overlay (*.GTO)|*.GTO;*.gto|" -#: gerbview/files.cpp:124 +#: gerbview/files.cpp:126 msgid "Bottom paste (*.GBP)|*.GBP;*.gbp|" -msgstr "Bottom paste (*.GBP)|*.GBP;*.gbp|" +msgstr "Masque pate à souder cuivre (*.GBP)|*.GBP;*.gbp|" -#: gerbview/files.cpp:125 +#: gerbview/files.cpp:127 msgid "Top paste (*.GTP)|*.GTP;*.gtp|" msgstr "Masque pate à souder composant (*.GTP)|*.GTP;*.gtp|" -#: gerbview/files.cpp:126 +#: gerbview/files.cpp:128 msgid "Keep-out layer (*.GKO)|*.GKO;*.gko|" msgstr "Couche de \"Keep-out\" (*.GKO)|*.GKO;*.gko|" -#: gerbview/files.cpp:127 +#: gerbview/files.cpp:129 msgid "Mechanical layers (*.GMx)|*.GM1;*.gm1;*.GM2;*.gm2;*.GM3;*.gm3|" msgstr "Couches mécaniques (*.GMx)|*.GM1;*.gm1;*.GM2;*.gm2;*.GM3;*.gm3|" -#: gerbview/files.cpp:128 +#: gerbview/files.cpp:130 msgid "Top Pad Master (*.GPT)|*.GPT;*.gpt|" msgstr "Top Pad Master (*.GPT)|*.GPT;*.gpt|" -#: gerbview/files.cpp:129 +#: gerbview/files.cpp:131 msgid "Bottom Pad Master (*.GPB)|*.GPB;*.gpb|" msgstr "Bottom Pad Master (*.GPB)|*.GPB;*.gpb|" -#: gerbview/files.cpp:139 +#: gerbview/files.cpp:141 msgid "Open Gerber File" msgstr "Ouvrir Fichier Gerber" -#: gerbview/files.cpp:220 +#: gerbview/files.cpp:222 msgid "Save Gerber File" msgstr "Sauver Fichier Gerber" @@ -12842,6 +12850,12 @@ msgstr "Options d'Affichage" msgid "Page Settings" msgstr "Ajustage opt Page" +#~ msgid "" +#~ "Gerber files (.gbr .gbx .lgr .ger .pho)| .gbr;*.GBR;*.gbx;*.GBX;*.lgr;*." +#~ "LGR;*.ger;*.GER;*.pho;*.PHO|" +#~ msgstr "" +#~ "Fichiers Gerber (.gbr .gbx .lgr .ger .pho)| *.gbr;*.GBR;*.gbx;*.GBX;*.lgr;" +#~ "*.LGR;*.ger;*.GER;*.pho;*.PHO|" #~ msgid "&Name:" #~ msgstr "&Nom:" #~ msgid "N&umber:" diff --git a/kicad/treeprj_frame.cpp b/kicad/treeprj_frame.cpp index 053ccf0e5f..737f9fe29c 100644 --- a/kicad/treeprj_frame.cpp +++ b/kicad/treeprj_frame.cpp @@ -40,8 +40,11 @@ const wxChar* s_AllowedExtensionsToList[] = wxT( "^[^$].*\\.brd$" ), wxT( "^.*\\.net$" ), wxT( "^.*\\.txt$" ), - wxT( "^.*\\.pho$" ), - wxT( "^.*\\.gbr$" ), + wxT( "^.*\\.pho$" ), // Gerber file + wxT( "^.*\\.gbr$" ), // Gerber file + wxT( "^.*\\.gb[alops]$" ), // Gerber back (or bottom) layer file + wxT( "^.*\\.gt[alops]$" ), // Gerber front (or top) layer file + wxT( "^.*\\.g[0-9]{1,2}$" ), // Gerber inner layer file wxT( "^.*\\.odt$" ), wxT( "^.*\\.sxw$" ), wxT( "^.*\\.htm$" ), diff --git a/pcbnew/pcbplot.cpp b/pcbnew/pcbplot.cpp index 6104a2e48a..a8e3c44a51 100644 --- a/pcbnew/pcbplot.cpp +++ b/pcbnew/pcbplot.cpp @@ -14,11 +14,14 @@ #include "worksheet.h" #include "pcbnew_id.h" #include "protos.h" +#include "pcbstruct.h" +#include "class_board_design_settings.h" #define PLOT_DEFAULT_MARGE 300 // mils /* Keywords to r/w options in config */ #define OPTKEY_EDGELAYER_GERBER wxT( "EdgeLayerGerberOpt" ) +#define OPTKEY_GERBER_EXTENSIONS wxT( "GerberOptUseLayersExt" ) #define OPTKEY_XFINESCALE_ADJ wxT( "PlotXFineScaleAdj" ) #define OPTKEY_YFINESCALE_ADJ wxT( "PlotYFineScaleAdj" ) #define OPTKEY_PADS_ON_SILKSCREEN wxT( "PlotPadsOnSilkscreen" ) @@ -37,12 +40,13 @@ PCB_Plot_Options::PCB_Plot_Options() Sel_Texte_Divers = true; DrillShapeOpt = PCB_Plot_Options::SMALL_DRILL_SHAPE; Trace_Mode = FILLED; - Scale = 1.0; - ScaleAdjX = 1.0; - ScaleAdjY = 1.0; + Scale = 1.0; + ScaleAdjX = 1.0; + ScaleAdjY = 1.0; PlotScaleOpt = 1; } + static long s_SelectedLayers = LAYER_BACK | LAYER_FRONT | SILKSCREEN_LAYER_FRONT | SILKSCREEN_LAYER_BACK; @@ -69,7 +73,8 @@ enum id_plotps { ID_PRINT_PAD_ON_SILKSCREEN, ID_FORCE_PRINT_PAD, ID_CREATE_DRILL_FILE, - ID_SEL_PLOT_OFFSET_OPTION + ID_SEL_PLOT_OFFSET_OPTION, + ID_USE_GERBER_EXTENSIONS }; @@ -94,6 +99,7 @@ public: wxCheckBox* m_PlotMirorOpt; wxCheckBox* m_PlotNoViaOnMaskOpt; wxCheckBox* m_Exclude_Edges_Pcb; + wxCheckBox* m_Use_Gerber_Extensions; wxCheckBox* m_Plot_Sheet_Ref; wxCheckBox* m_Plot_Invisible_Text; wxCheckBox* m_Plot_Text_Value; @@ -110,8 +116,8 @@ public: WinEDA_DFloatValueCtrl* m_FineAdjustXscaleOpt; WinEDA_DFloatValueCtrl* m_FineAdjustYscaleOpt; - double m_XScaleAdjust; - double m_YScaleAdjust; + double m_XScaleAdjust; + double m_YScaleAdjust; bool useA4() { @@ -130,15 +136,16 @@ public: // change the A4 to the simple postscript, according to the // PlotFormat enum - switch (radioNdx) - { - case 3: + switch( radioNdx ) + { + case 3: radioNdx = PLOT_FORMAT_POST; - break; - case 4: - radioNdx = PLOT_FORMAT_DXF; - break; - } + break; + + case 4: + radioNdx = PLOT_FORMAT_DXF; + break; + } return PlotFormat( radioNdx ); } @@ -160,14 +167,14 @@ private: }; BEGIN_EVENT_TABLE( WinEDA_PlotFrame, wxDialog ) - EVT_INIT_DIALOG( WinEDA_PlotFrame::OnInitDialog ) - EVT_CLOSE( WinEDA_PlotFrame::OnClose ) - EVT_BUTTON( wxID_CANCEL, WinEDA_PlotFrame::OnQuit ) - EVT_BUTTON( ID_EXEC_PLOT, WinEDA_PlotFrame::Plot ) - EVT_BUTTON( ID_SAVE_OPT_PLOT, WinEDA_PlotFrame::SaveOptPlot ) - EVT_BUTTON( ID_CREATE_DRILL_FILE, WinEDA_PlotFrame::CreateDrillFile ) - EVT_RADIOBOX( ID_SEL_PLOT_FORMAT, WinEDA_PlotFrame::SetCommands ) - EVT_RADIOBOX( ID_SCALE_OPT, WinEDA_PlotFrame::OnSetScaleOpt ) +EVT_INIT_DIALOG( WinEDA_PlotFrame::OnInitDialog ) +EVT_CLOSE( WinEDA_PlotFrame::OnClose ) +EVT_BUTTON( wxID_CANCEL, WinEDA_PlotFrame::OnQuit ) +EVT_BUTTON( ID_EXEC_PLOT, WinEDA_PlotFrame::Plot ) +EVT_BUTTON( ID_SAVE_OPT_PLOT, WinEDA_PlotFrame::SaveOptPlot ) +EVT_BUTTON( ID_CREATE_DRILL_FILE, WinEDA_PlotFrame::CreateDrillFile ) +EVT_RADIOBOX( ID_SEL_PLOT_FORMAT, WinEDA_PlotFrame::SetCommands ) +EVT_RADIOBOX( ID_SCALE_OPT, WinEDA_PlotFrame::OnSetScaleOpt ) END_EVENT_TABLE() @@ -228,12 +235,9 @@ void WinEDA_PlotFrame::OnInitDialog( wxInitDialogEvent& event ) 5, fmtmsg, 1, wxRA_SPECIFY_COLS ); MidRightBoxSizer->Add( m_PlotFormatOpt, 0, wxGROW | wxALL, 5 ); - if( config ) - { - config->Read( OPTKEY_OUTPUT_FORMAT, &g_pcb_plot_options.PlotFormat ); - config->Read( OPTKEY_PLOT_LINEWIDTH_VALUE, - &g_pcb_plot_options.PlotLine_Width ); - } + config->Read( OPTKEY_OUTPUT_FORMAT, &g_pcb_plot_options.PlotFormat ); + config->Read( OPTKEY_PLOT_LINEWIDTH_VALUE, + &g_pcb_plot_options.PlotLine_Width ); m_PlotFormatOpt->SetSelection( g_pcb_plot_options.PlotFormat ); @@ -269,7 +273,8 @@ void WinEDA_PlotFrame::OnInitDialog( wxInitDialogEvent& event ) MidRightBoxSizer, PCB_INTERNAL_UNIT ); - m_LinesWidth->SetToolTip( _( "Set lines width used to plot in sketch \ + m_LinesWidth->SetToolTip( _( + "Set lines width used to plot in sketch \ mode and plot pads outlines on silk screen layers" ) ); // Create the right column commands @@ -292,12 +297,9 @@ mode and plot pads outlines on silk screen layers" ) ); // Create scale adjust option m_XScaleAdjust = m_YScaleAdjust = 1.0; - if( config ) - { - config->Read( OPTKEY_EDGELAYER_GERBER, &g_pcb_plot_options.Exclude_Edges_Pcb ); - config->Read( OPTKEY_XFINESCALE_ADJ, &m_XScaleAdjust ); - config->Read( OPTKEY_YFINESCALE_ADJ, &m_YScaleAdjust ); - } + config->Read( OPTKEY_EDGELAYER_GERBER, &g_pcb_plot_options.Exclude_Edges_Pcb ); + config->Read( OPTKEY_XFINESCALE_ADJ, &m_XScaleAdjust ); + config->Read( OPTKEY_YFINESCALE_ADJ, &m_YScaleAdjust ); // Test for a reasonable scale value. Set to 1 if problem if( m_XScaleAdjust < MIN_SCALE || m_YScaleAdjust < MIN_SCALE @@ -331,7 +333,7 @@ scale plotting" ) ); RightBoxSizer->Add( button, 0, wxGROW | wxALL, 5 ); button = new wxButton( this, ID_CREATE_DRILL_FILE, - _( "Generate drill file" ) ); + _( "Generate drill file" ) ); RightBoxSizer->Add( button, 0, wxGROW | wxALL, 5 ); button = new wxButton( this, wxID_CANCEL, _( "Close" ) ); @@ -341,7 +343,7 @@ scale plotting" ) ); wxBoxSizer* OneColumnLayerBoxSizer = new wxBoxSizer( wxVERTICAL ); LayersBoxSizer->Add( OneColumnLayerBoxSizer, 0, wxGROW | wxALL, 5 ); - int mask = 1; + int mask = 1; for( int layer = 0; layerm_BoardSettings->IsLayerEnabled( layer ) ) + { + m_BoxSelectLayer[layer]->Enable( false ); + m_BoxSelectLayer[layer]->SetValue( false ); + } + } + + // Option for using proper Gerber extensions + m_Use_Gerber_Extensions = new wxCheckBox( this, + ID_USE_GERBER_EXTENSIONS, + _( "Use Proper Gerber Extensions" ) ); + + long ltmp; + config->Read( OPTKEY_GERBER_EXTENSIONS, <mp ); + m_Use_Gerber_Extensions->SetValue( ltmp ); + m_Use_Gerber_Extensions->SetToolTip( + _( "Use Proper Gerber Extensions - .GBL, .GTL, etc..." ) ); + LeftBoxSizer->Add( m_Use_Gerber_Extensions, 0, wxGROW | wxALL, 1 ); + // Option for excluding contents of "Edges Pcb" layer m_Exclude_Edges_Pcb = new wxCheckBox( this, - ID_EXCLUDE_EDGES_PCB, - _( "Exclude pcb edge layer" ) ); + ID_EXCLUDE_EDGES_PCB, + _( "Exclude pcb edge layer" ) ); m_Exclude_Edges_Pcb->SetValue( g_pcb_plot_options.Exclude_Edges_Pcb ); m_Exclude_Edges_Pcb->SetToolTip( @@ -391,7 +415,7 @@ scale plotting" ) ); if( m_Parent->m_Print_Sheet_Ref ) { m_Plot_Sheet_Ref = new wxCheckBox( this, ID_PRINT_REF, - _( "Print sheet reference" ) ); + _( "Print sheet reference" ) ); m_Plot_Sheet_Ref->SetValue( g_pcb_plot_options.Plot_Frame_Ref ); LeftBoxSizer->Add( m_Plot_Sheet_Ref, 0, wxGROW | wxALL, 1 ); @@ -401,12 +425,11 @@ scale plotting" ) ); // Option to plot pads on silkscreen layers or all layers m_Plot_Pads_on_Silkscreen = new wxCheckBox( this, - ID_PRINT_PAD_ON_SILKSCREEN, - _( "Print pads on silkscreen" ) ); + ID_PRINT_PAD_ON_SILKSCREEN, + _( "Print pads on silkscreen" ) ); - if( config ) - config->Read( OPTKEY_PADS_ON_SILKSCREEN, - &g_pcb_plot_options.PlotPadsOnSilkLayer ); + config->Read( OPTKEY_PADS_ON_SILKSCREEN, + &g_pcb_plot_options.PlotPadsOnSilkLayer ); m_Plot_Pads_on_Silkscreen->SetValue( &g_pcb_plot_options.PlotPadsOnSilkLayer ); m_Plot_Pads_on_Silkscreen->SetToolTip( @@ -414,10 +437,9 @@ scale plotting" ) ); LeftBoxSizer->Add( m_Plot_Pads_on_Silkscreen, 0, wxGROW | wxALL, 1 ); m_Force_Plot_Pads = new wxCheckBox( this, ID_FORCE_PRINT_PAD, - _( "Always print pads" ) ); - if( config ) - config->Read( OPTKEY_ALWAYS_PRINT_PADS, - &g_pcb_plot_options.Plot_Pads_All_Layers ); + _( "Always print pads" ) ); + config->Read( OPTKEY_ALWAYS_PRINT_PADS, + &g_pcb_plot_options.Plot_Pads_All_Layers ); m_Force_Plot_Pads->SetValue( g_pcb_plot_options.Plot_Pads_All_Layers ); m_Force_Plot_Pads->SetToolTip( _( "Force print/plot pads on ALL layers" ) ); @@ -425,7 +447,7 @@ scale plotting" ) ); // Options to plot texts on footprints m_Plot_Text_Value = new wxCheckBox( this, ID_PRINT_VALUE, - _( "Print module value" ) ); + _( "Print module value" ) ); m_Plot_Text_Value->SetValue( g_pcb_plot_options.Sel_Texte_Valeur ); m_Plot_Text_Value->SetToolTip( @@ -433,7 +455,7 @@ scale plotting" ) ); LeftBoxSizer->Add( m_Plot_Text_Value, 0, wxGROW | wxALL, 1 ); m_Plot_Text_Ref = new wxCheckBox( this, ID_PRINT_REF, - _( "Print module reference" ) ); + _( "Print module reference" ) ); m_Plot_Text_Ref->SetValue( g_pcb_plot_options.Sel_Texte_Reference ); m_Plot_Text_Ref->SetToolTip( @@ -441,7 +463,7 @@ scale plotting" ) ); LeftBoxSizer->Add( m_Plot_Text_Ref, 0, wxGROW | wxALL, 1 ); m_Plot_Text_Div = new wxCheckBox( this, ID_PRINT_MODULE_TEXTS, - _( "Print other module texts" ) ); + _( "Print other module texts" ) ); m_Plot_Text_Div->SetValue( g_pcb_plot_options.Sel_Texte_Divers ); m_Plot_Text_Div->SetToolTip( @@ -449,8 +471,8 @@ scale plotting" ) ); LeftBoxSizer->Add( m_Plot_Text_Div, 0, wxGROW | wxALL, 1 ); m_Plot_Invisible_Text = new wxCheckBox( this, - ID_FORCE_PRINT_INVISIBLE_TEXT, - _( "Force print invisible texts" ) ); + ID_FORCE_PRINT_INVISIBLE_TEXT, + _( "Force print invisible texts" ) ); m_Plot_Invisible_Text->SetValue( g_pcb_plot_options.Sel_Texte_Invisible ); m_Plot_Invisible_Text->SetToolTip( @@ -458,7 +480,8 @@ scale plotting" ) ); LeftBoxSizer->Add( m_Plot_Invisible_Text, 0, wxGROW | wxALL, 1 ); - static const wxString drillmsg[3] = { + static const wxString drillmsg[3] = + { _( "No drill mark" ), _( "Small mark" ), _( "Real drill" ) @@ -489,8 +512,11 @@ scale plotting" ) ); m_Scale_Opt->SetSelection( g_pcb_plot_options.PlotScaleOpt ); MidLeftBoxSizer->Add( m_Scale_Opt, 0, wxGROW | wxALL, 5 ); - static const wxString list_opt3[3] = { _( "Line" ), _( "Filled" ), - _( "Sketch" ) }; + static const wxString list_opt3[3] = + { + _( "Line" ), _( "Filled" ), + _( "Sketch" ) + }; m_PlotModeOpt = new wxRadioBox( this, ID_PLOT_MODE_OPT, _( "Plot Mode" ), wxDefaultPosition, wxDefaultSize, @@ -500,13 +526,13 @@ scale plotting" ) ); MidLeftBoxSizer->Add( m_PlotModeOpt, 0, wxGROW | wxALL, 5 ); m_PlotMirorOpt = new wxCheckBox( this, ID_MIROR_OPT, - _( "Plot mirror" ) ); + _( "Plot mirror" ) ); m_PlotMirorOpt->SetValue( g_pcb_plot_options.Plot_Set_MIROIR ); MidLeftBoxSizer->Add( m_PlotMirorOpt, 0, wxGROW | wxALL, 5 ); m_PlotNoViaOnMaskOpt = new wxCheckBox( this, ID_MASKVIA_OPT, - _( "Vias on mask" ) ); + _( "Vias on mask" ) ); m_PlotNoViaOnMaskOpt->SetValue( g_pcb_plot_options.DrawViaOnMaskLayer ); m_PlotNoViaOnMaskOpt->SetToolTip( @@ -526,7 +552,7 @@ scale plotting" ) ); } -void WinEDA_PlotFrame::OnQuit( wxCommandEvent& WXUNUSED( event ) ) +void WinEDA_PlotFrame::OnQuit( wxCommandEvent& WXUNUSED(event) ) { Close( true ); // true is to force the frame to close } @@ -543,16 +569,19 @@ void WinEDA_PlotFrame::CreateDrillFile( wxCommandEvent& event ) ( (WinEDA_PcbFrame*) m_Parent )->InstallDrillFrame( event ); } + void WinEDA_PlotFrame::OnSetScaleOpt( wxCommandEvent& event ) { /* Disable sheet reference for scale != 1:1 */ bool scale1 = ( m_Scale_Opt->GetSelection() == 1 ); + m_Plot_Sheet_Ref->Enable( scale1 ); - if ( !scale1 ) + if( !scale1 ) m_Plot_Sheet_Ref->SetValue( false ); } + void WinEDA_PlotFrame::SetCommands( wxCommandEvent& event ) { int format = getFormat(); @@ -572,6 +601,7 @@ void WinEDA_PlotFrame::SetCommands( wxCommandEvent& event ) m_HPGLPenOverlayOpt->Enable( false ); m_Exclude_Edges_Pcb->SetValue( false ); m_Exclude_Edges_Pcb->Enable( false ); + m_Use_Gerber_Extensions->Enable( false ); m_Scale_Opt->Enable( true ); m_FineAdjustXscaleOpt->Enable( true ); m_FineAdjustYscaleOpt->Enable( true ); @@ -591,6 +621,7 @@ void WinEDA_PlotFrame::SetCommands( wxCommandEvent& event ) m_HPGLPenSpeedOpt->Enable( false ); m_HPGLPenOverlayOpt->Enable( false ); m_Exclude_Edges_Pcb->Enable( true ); + m_Use_Gerber_Extensions->Enable( true ); m_Scale_Opt->SetSelection( 1 ); m_Scale_Opt->Enable( false ); m_FineAdjustXscaleOpt->Enable( false ); @@ -611,6 +642,7 @@ void WinEDA_PlotFrame::SetCommands( wxCommandEvent& event ) m_HPGLPenOverlayOpt->Enable( true ); m_Exclude_Edges_Pcb->SetValue( false ); m_Exclude_Edges_Pcb->Enable( false ); + m_Use_Gerber_Extensions->Enable( false ); m_Scale_Opt->Enable( true ); m_FineAdjustXscaleOpt->Enable( false ); m_FineAdjustYscaleOpt->Enable( false ); @@ -631,6 +663,7 @@ void WinEDA_PlotFrame::SetCommands( wxCommandEvent& event ) m_HPGLPenOverlayOpt->Enable( false ); m_Exclude_Edges_Pcb->SetValue( false ); m_Exclude_Edges_Pcb->Enable( false ); + m_Use_Gerber_Extensions->Enable( false ); m_Scale_Opt->Enable( false ); m_Scale_Opt->SetSelection( 1 ); m_FineAdjustXscaleOpt->Enable( false ); @@ -670,7 +703,7 @@ void WinEDA_PlotFrame::SaveOptPlot( wxCommandEvent& event ) g_pcb_plot_options.PlotOrient = PLOT_MIROIR; else g_pcb_plot_options.PlotOrient = 0; - g_pcb_plot_options.Trace_Mode = (GRTraceMode)m_PlotModeOpt->GetSelection(); + g_pcb_plot_options.Trace_Mode = (GRTraceMode) m_PlotModeOpt->GetSelection(); g_pcb_plot_options.DrawViaOnMaskLayer = m_PlotNoViaOnMaskOpt->GetValue(); g_pcb_plot_options.HPGL_Pen_Diam = m_HPGLPenSizeOpt->GetValue(); @@ -683,28 +716,27 @@ void WinEDA_PlotFrame::SaveOptPlot( wxCommandEvent& event ) wxConfig* config = wxGetApp().m_EDA_Config; - if( config ) + config->Write( OPTKEY_EDGELAYER_GERBER, + g_pcb_plot_options.Exclude_Edges_Pcb ); + config->Write( OPTKEY_GERBER_EXTENSIONS, + m_Use_Gerber_Extensions->GetValue() ); + config->Write( OPTKEY_XFINESCALE_ADJ, m_XScaleAdjust ); + config->Write( OPTKEY_YFINESCALE_ADJ, m_YScaleAdjust ); + config->Write( OPTKEY_PADS_ON_SILKSCREEN, + g_pcb_plot_options.PlotPadsOnSilkLayer ); + config->Write( OPTKEY_ALWAYS_PRINT_PADS, + g_pcb_plot_options.Plot_Pads_All_Layers ); + + int formatNdx = m_PlotFormatOpt->GetSelection(); + config->Write( OPTKEY_OUTPUT_FORMAT, formatNdx ); + config->Write( OPTKEY_PLOT_LINEWIDTH_VALUE, + g_pcb_plot_options.PlotLine_Width ); + + wxString layerKey; + for( int layer = 0; layerWrite( OPTKEY_EDGELAYER_GERBER, - g_pcb_plot_options.Exclude_Edges_Pcb ); - config->Write( OPTKEY_XFINESCALE_ADJ, m_XScaleAdjust ); - config->Write( OPTKEY_YFINESCALE_ADJ, m_YScaleAdjust ); - config->Write( OPTKEY_PADS_ON_SILKSCREEN, - g_pcb_plot_options.PlotPadsOnSilkLayer ); - config->Write( OPTKEY_ALWAYS_PRINT_PADS, - g_pcb_plot_options.Plot_Pads_All_Layers ); - - int formatNdx = m_PlotFormatOpt->GetSelection(); - config->Write( OPTKEY_OUTPUT_FORMAT, formatNdx ); - config->Write( OPTKEY_PLOT_LINEWIDTH_VALUE, - g_pcb_plot_options.PlotLine_Width ); - - wxString layerKey; - for( int layer = 0; layerWrite( layerKey, m_BoxSelectLayer[layer]->IsChecked() ); - } + layerKey.Printf( OPTKEY_LAYERBASE, layer ); + config->Write( layerKey, m_BoxSelectLayer[layer]->IsChecked() ); } g_pcb_plot_options.Plot_PS_Negative = m_Plot_PS_Negative->GetValue(); @@ -764,8 +796,8 @@ void WinEDA_PlotFrame::Plot( wxCommandEvent& event ) case PLOT_FORMAT_GERBER: g_pcb_plot_options.Scale = 1.0; // No scale option allowed in gerber format - ext = wxT( "pho" ); - wildcard = _( "GERBER photo plot files (.pho)|*.pho" ); + ext = wxT( "pho" ); + wildcard = _( "GERBER photo plot files (.pho .gbr)|*.pho;*.gbr" ); break; case PLOT_FORMAT_HPGL: @@ -783,10 +815,10 @@ void WinEDA_PlotFrame::Plot( wxCommandEvent& event ) // Test for a reasonable scale value if( g_pcb_plot_options.Scale < MIN_SCALE ) DisplayInfoMessage( this, - _( "Warning: Scale option set to a very small value" ) ); + _( "Warning: Scale option set to a very small value" ) ); if( g_pcb_plot_options.Scale > MAX_SCALE ) DisplayInfoMessage( this, - _( "Warning: Scale option set to a very large value" ) ); + _( "Warning: Scale option set to a very large value" ) ); int mask = 1; s_SelectedLayers = 0; @@ -802,9 +834,90 @@ void WinEDA_PlotFrame::Plot( wxCommandEvent& event ) fn = m_Parent->GetScreen()->m_FileName; // Create file name. - fn.SetName( fn.GetName() + wxT( "-" ) + - board->GetLayerName( layer_to_plot ) ); - fn.SetExt( ext ); + wxString layername = board->GetLayerName( layer_to_plot ); + layername.Trim(true); layername.Trim(false); // remove leading and trailing spaces if any + fn.SetName( fn.GetName() + wxT( "-" ) + layername ); + + // Use Gerber Extensions based on layer number + // (See http://en.wikipedia.org/wiki/Gerber_File) + if( (format == PLOT_FORMAT_GERBER) && m_Use_Gerber_Extensions->GetValue() ) + { + switch( layer_to_plot ) + { + case LAYER_N_FRONT: + fn.SetExt( wxT( "gtl" ) ); + break; + + case LAYER_N_2: + case LAYER_N_3: + case LAYER_N_4: + case LAYER_N_5: + case LAYER_N_6: + case LAYER_N_7: + case LAYER_N_8: + case LAYER_N_9: + case LAYER_N_10: + case LAYER_N_11: + case LAYER_N_12: + case LAYER_N_13: + case LAYER_N_14: + case LAYER_N_15: + + // TODO: use g1 to gxx according to the + // new internal layers designation + // (1 is the first internal layer from the front layer) + fn.SetExt( wxT( "gbr" ) ); + break; + + case LAYER_N_BACK: + fn.SetExt( wxT( "gbl" ) ); + break; + + case ADHESIVE_N_BACK: + fn.SetExt( wxT( "gba" ) ); + break; + + case ADHESIVE_N_FRONT: + fn.SetExt( wxT( "gta" ) ); + break; + + case SOLDERPASTE_N_BACK: + fn.SetExt( wxT( "gbp" ) ); + break; + + case SOLDERPASTE_N_FRONT: + fn.SetExt( wxT( "gtp" ) ); + break; + + case SILKSCREEN_N_BACK: + fn.SetExt( wxT( "gbo" ) ); + break; + + case SILKSCREEN_N_FRONT: + fn.SetExt( wxT( "gto" ) ); + break; + + case SOLDERMASK_N_BACK: + fn.SetExt( wxT( "gbs" ) ); + break; + + case SOLDERMASK_N_FRONT: + fn.SetExt( wxT( "gts" ) ); + break; + + case DRAW_N: + case COMMENT_N: + case ECO1_N: + case ECO2_N: + case EDGE_N: + fn.SetExt( wxT( "gbr" ) ); + break; + } + } + else + { + fn.SetExt( ext ); + } switch( format ) { @@ -816,7 +929,7 @@ void WinEDA_PlotFrame::Plot( wxCommandEvent& event ) case PLOT_FORMAT_GERBER: m_Parent->Genere_GERBER( fn.GetFullPath(), layer_to_plot, s_PlotOriginIsAuxAxis, - g_pcb_plot_options.Trace_Mode ); + g_pcb_plot_options.Trace_Mode ); break; case PLOT_FORMAT_HPGL: