diff --git a/gerbview/gerbview.h b/gerbview/gerbview.h index 8fc2530b1a..03ddb0399f 100644 --- a/gerbview/gerbview.h +++ b/gerbview/gerbview.h @@ -177,8 +177,8 @@ typedef std::vector DCODE_PARAMS; */ struct AM_PRIMITIVE { - AM_PRIMITIVE_ID primitive_id; - DCODE_PARAMS params; + AM_PRIMITIVE_ID primitive_id; ///< The primitive type + DCODE_PARAMS params; ///< A sequence of parameters used by the primitive }; @@ -190,8 +190,8 @@ typedef std::vector AM_PRIMITIVES; */ struct APERTURE_MACRO { - wxString name; - AM_PRIMITIVES primitives; + wxString name; ///< The name of the aperture macro + AM_PRIMITIVES primitives; ///< A sequence of AM_PRIMITIVEs }; @@ -260,6 +260,7 @@ public: { m_Macro = aMacro; } + APERTURE_MACRO* GetMacro() { return m_Macro; } /** * Function ShowApertureType diff --git a/gerbview/rs274d.cpp b/gerbview/rs274d.cpp index bb3a9ec198..7bdfe4b7d1 100644 --- a/gerbview/rs274d.cpp +++ b/gerbview/rs274d.cpp @@ -330,7 +330,8 @@ wxPoint GERBER::ReadXYCoord( char*& Text ) { type_coord = *Text; Text++; - text = line; nbchar = 0; + text = line; + nbchar = 0; while( IsNumber( *Text ) ) { if( *Text == '.' ) @@ -356,7 +357,8 @@ wxPoint GERBER::ReadXYCoord( char*& Text ) int min_digit = (type_coord == 'X') ? m_FmtLen.x : m_FmtLen.y; while( nbchar < min_digit ) { - *(text++) = '0'; nbchar++; + *(text++) = '0'; + nbchar++; } *text = 0; @@ -408,12 +410,15 @@ wxPoint GERBER::ReadXYCoord( char*& Text ) if( m_GerbMetric ) real_scale = real_scale / 25.4; + current_coord = (int) round( current_coord * real_scale ); } + if( type_coord == 'X' ) pos.x = current_coord; else if( type_coord == 'Y' ) pos.y = current_coord; + continue; } else @@ -715,10 +720,12 @@ bool GERBER::Execute_DCODE_Command( WinEDA_GerberFrame* frame, wxDC* DC, { if( D_commande > (MAX_TOOLS - 1) ) D_commande = MAX_TOOLS - 1; + m_Current_Tool = D_commande; D_CODE* pt_Dcode = GetDCODE( D_commande, false ); if( pt_Dcode ) pt_Dcode->m_InUse = TRUE; + return TRUE; } else // D_commande = 0..9: this is a pen command (usualy D1, D2 or D3) @@ -730,7 +737,7 @@ bool GERBER::Execute_DCODE_Command( WinEDA_GerberFrame* frame, wxDC* DC, { switch( D_commande ) { - case 1: //code D01 Draw line, exposure ON + case 1: // code D01 Draw line, exposure ON { SEGZONE* edge_poly, * last; @@ -755,7 +762,7 @@ bool GERBER::Execute_DCODE_Command( WinEDA_GerberFrame* frame, wxDC* DC, break; } - case 2: //code D2: exposure OFF (i.e. "move to") + case 2: // code D2: exposure OFF (i.e. "move to") m_PreviousPos = m_CurrentPos; m_PolygonFillModeState = 0; break; @@ -767,7 +774,7 @@ bool GERBER::Execute_DCODE_Command( WinEDA_GerberFrame* frame, wxDC* DC, else switch( D_commande ) { - case 1: //code D01 Draw line, exposure ON + case 1: // code D01 Draw line, exposure ON pt_Tool = GetDCODE( m_Current_Tool, false ); if( pt_Tool ) { @@ -815,11 +822,11 @@ bool GERBER::Execute_DCODE_Command( WinEDA_GerberFrame* frame, wxDC* DC, m_PreviousPos = m_CurrentPos; break; - case 2: //code D2: exposure OFF (i.e. "move to") + case 2: // code D2: exposure OFF (i.e. "move to") m_PreviousPos = m_CurrentPos; break; - case 3: // code D3: flash aperture + case 3: // code D3: flash aperture pt_Tool = GetDCODE( m_Current_Tool, false ); if( pt_Tool ) { @@ -852,7 +859,43 @@ bool GERBER::Execute_DCODE_Command( WinEDA_GerberFrame* frame, wxDC* DC, PAD_RECT ); break; - default: // Special (Macro) : Non implant� + case APT_MACRO: + { + APERTURE_MACRO* macro = pt_Tool->GetMacro(); + wxASSERT( macro ); + + // split the macro primitives up into multiple normal TRACK elements + for( AM_PRIMITIVES::iterator i=macro->primitives.begin(); i!=macro->primitives.end(); ++i ) + { + switch( i->primitive_id ) + { + case AMP_CIRCLE: + /* + Append_1_Flash_ROND_GERBER( dcode, + frame, DC, + m_CurrentPos, + size.x ); + */ + break; + + case AMP_LINE2: + case AMP_LINE20: + break; + case AMP_LINE_CENTER: + case AMP_LINE_LOWER_LEFT: + case AMP_EOF: + case AMP_OUTLINE: + case AMP_POLYGON: + case AMP_MOIRE: + case AMP_THERMAL: + default: + break; + } + } + } + break; + + default: break; }