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 faec486f83..99d41d0941 100644 Binary files a/internat/fr/kicad.mo and b/internat/fr/kicad.mo differ 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: