Loading change_log.txt +6 −4 Original line number Diff line number Diff line Loading @@ -7,15 +7,17 @@ email address. 2007-Sep-25 UPDATE Dick Hollenbeck <dick@softplc.com> ================================================================================ + pcbnew * got rid of reference to global display options DisplayOpt.DisplayZones from * removed reference to global display options DisplayOpt.DisplayZones in collectors.cpp so collectors.cpp can continue to be used in multiple future (non-display related) general contexts. (non-display related) general contexts. I don't want unnecessary dependencies in there. The way to completely ignore a type is to exclude it from scanList. The way to sometimes ignore a type is to add support for this in COLLECTORS_GUIDE. * Moved TYPEZONE to end of AllBoardItems, added GENERAL_COLLECTOR::AllButZones to provide support of DisplayOpt.DisplayZones. provide support for DisplayOpt.DisplayZones. * Added aHotKeyCode to PcbGeneralLocateAndDisplay() + gerbview * viewer was getting stuck in a loop when loading a bad gerber file. Fixed the bug, but line 223 through 225 of readgerb.cpp need review. the bug, but line 223 through 225 of readgerb.cpp needs review. * beautified a few files with uncrustify, (any I had to look at). Loading gerbview/rs274d.cpp +773 −677 Original line number Diff line number Diff line Loading @@ -10,59 +10,60 @@ #include "protos.h" #define IsNumber(x) ( ( ((x) >= '0') && ((x) <='9') ) ||\ ((x) == '-') || ((x) == '+') || ((x) == '.')) #define IsNumber( x ) ( ( ( (x) >= '0' ) && ( (x) <='9' ) ) \ || ( (x) == '-' ) || ( (x) == '+' ) || ( (x) == '.' ) ) /* Format Gerber : NOTES : Fonctions preparatoires: Gn = G01 interpolation lineaire ( trace de droites ) G02,G20,G21 Interpolation circulaire , sens trigo < 0 G03,G30,G31 Interpolation circulaire , sens trigo > 0 G04 commentaire G06 Interpolation parabolique G07 Interpolation cubique G10 interpolation lineaire ( echelle 10x ) G11 interpolation lineaire ( echelle 0.1x ) G12 interpolation lineaire ( echelle 0.01x ) G52 plot symbole reference par Dnn code G53 plot symbole reference par Dnn ; symbole tourne de -90 degres G54 Selection d'outil G55 Mode exposition photo G56 plot symbole reference par Dnn A code G57 affiche le symbole reference sur la console G58 plot et affiche le symbole reference sur la console G60 interpolation lineaire ( echelle 100x ) G70 Unites = Inches G71 Unites = Millimetres G74 supprime interpolation circulaire sur 360 degre, revient a G01 G75 Active interpolation circulaire sur 360 degre G90 Mode Coordonnees absolues G91 Mode Coordonnees Relatives Coordonnees X,Y X,Y sont suivies de + ou - et de m+n chiffres (non separes) m = partie entiere n = partie apres la virgule formats classiques : m = 2, n = 3 (format 2.3) m = 3, n = 4 (format 3.4) ex: G__ X00345Y-06123 D__* Outils et D_CODES numero d'outil ( identification des formes ) 1 a 99 (classique) 1 a 999 D_CODES: D01 ... D9 = codes d'action: D01 = activation de lumiere (baisser de plume) lors du dplacement D02 = extinction de lumiere (lever de plume) lors du dplacement D03 = Flash D09 = VAPE Flash D51 = precede par G54 -> Select VAPE D10 ... D255 = Indentification d'outils ( d'ouvertures ) Ne sont pas tj dans l'ordre ( voir tableau dans PCBPLOT.H) * Fonctions preparatoires: * Gn = * G01 interpolation lineaire ( trace de droites ) * G02,G20,G21 Interpolation circulaire , sens trigo < 0 * G03,G30,G31 Interpolation circulaire , sens trigo > 0 * G04 commentaire * G06 Interpolation parabolique * G07 Interpolation cubique * G10 interpolation lineaire ( echelle 10x ) * G11 interpolation lineaire ( echelle 0.1x ) * G12 interpolation lineaire ( echelle 0.01x ) * G52 plot symbole reference par Dnn code * G53 plot symbole reference par Dnn ; symbole tourne de -90 degres * G54 Selection d'outil * G55 Mode exposition photo * G56 plot symbole reference par Dnn A code * G57 affiche le symbole reference sur la console * G58 plot et affiche le symbole reference sur la console * G60 interpolation lineaire ( echelle 100x ) * G70 Unites = Inches * G71 Unites = Millimetres * G74 supprime interpolation circulaire sur 360 degre, revient a G01 * G75 Active interpolation circulaire sur 360 degre * G90 Mode Coordonnees absolues * G91 Mode Coordonnees Relatives * * Coordonnees X,Y * X,Y sont suivies de + ou - et de m+n chiffres (non separes) * m = partie entiere * n = partie apres la virgule * formats classiques : m = 2, n = 3 (format 2.3) * m = 3, n = 4 (format 3.4) * ex: * G__ X00345Y-06123 D__* * * Outils et D_CODES * numero d'outil ( identification des formes ) * 1 a 99 (classique) * 1 a 999 * D_CODES: * * D01 ... D9 = codes d'action: * D01 = activation de lumiere (baisser de plume) lors du dplacement * D02 = extinction de lumiere (lever de plume) lors du dplacement * D03 = Flash * D09 = VAPE Flash * D51 = precede par G54 -> Select VAPE * * D10 ... D255 = Indentification d'outils ( d'ouvertures ) * Ne sont pas tj dans l'ordre ( voir tableau dans PCBPLOT.H) */ // Type d'action du phototraceur: Loading Loading @@ -91,18 +92,19 @@ static void Append_1_SEG_ARC_GERBER(int Dcode_index, bool trigo_sens, bool multiquadrant ); /****************************************************************/ static void Append_1_Flash_ROND_GERBER( int Dcode_tool, WinEDA_GerberFrame* frame, wxDC* DC, const wxPoint& pos, int diametre ) /****************************************************************/ /* Trace 1 flash ROND en position pos */ { TRACK* track; track = new TRACK( frame->m_Pcb ); track->Insert( frame->m_Pcb, NULL ); track->SetLayer( frame->GetScreen()->m_Active_Layer ); Loading @@ -116,14 +118,16 @@ TRACK * track; Trace_Segment( frame->DrawPanel, DC, track, GR_OR ); } /**********************************************************************/ static void Append_1_Flash_GERBER( int Dcode_index, WinEDA_GerberFrame* frame, wxDC* DC, const wxPoint& pos, const wxSize& size, int forme ) /*********************************************************************/ /* Trace 1 flash rectangulaire ou ovale vertical ou horizontal donne par son centre et ses dimensions X et Y * Trace 1 flash rectangulaire ou ovale vertical ou horizontal * donne par son centre et ses dimensions X et Y */ { TRACK* track; Loading @@ -133,6 +137,7 @@ int width, len; len = MAX( size.x, size.y ) - width; track = new TRACK( frame->m_Pcb ); track->Insert( frame->m_Pcb, NULL ); track->SetLayer( frame->GetScreen()->m_Active_Layer ); Loading @@ -153,7 +158,6 @@ int width, len; track->m_Start.x -= len; track->m_End.x += len; } else // ovale / rect vertical { track->m_Start.y -= len; Loading @@ -174,6 +178,7 @@ static void Append_1_Line_GERBER(int Dcode_index, TRACK* track; track = new TRACK( frame->m_Pcb ); track->Insert( frame->m_Pcb, NULL ); track->SetLayer( frame->GetScreen()->m_Active_Layer ); Loading @@ -187,6 +192,7 @@ TRACK * track; Trace_Segment( frame->DrawPanel, DC, track, GR_OR ); } /*****************************************************************/ static void Append_1_SEG_ARC_GERBER( int Dcode_index, WinEDA_GerberFrame* frame, wxDC* DC, Loading @@ -196,20 +202,21 @@ static void Append_1_SEG_ARC_GERBER(int Dcode_index, /*****************************************************************/ /* creation d'un arc: si multiquadrant == TRUE arc de 0 a 360 degres et rel_center est la coordonne du centre relativement au startpoint si multiquadrant == FALSE arc de 0 90 entierement contenu dans le meme quadrant et rel_center est la coordonne du centre relativement au startpoint, mais en VALEUR ABSOLUE et le signe des valeurs x et y de rel_center doit etre deduit de cette limite de 90 degres * si multiquadrant == TRUE arc de 0 a 360 degres * et rel_center est la coordonne du centre relativement au startpoint * * si multiquadrant == FALSE arc de 0 90 entierement contenu dans le meme quadrant * et rel_center est la coordonne du centre relativement au startpoint, * mais en VALEUR ABSOLUE et le signe des valeurs x et y de rel_center doit * etre deduit de cette limite de 90 degres * */ { TRACK* track; wxPoint center, delta; track = new TRACK( frame->m_Pcb ); track->Insert( frame->m_Pcb, NULL ); track->m_Shape = S_ARC; Loading Loading @@ -237,19 +244,18 @@ wxPoint center, delta; center = rel_center; delta.x = endpoint.x - startpoint.x; delta.y = endpoint.y - startpoint.y; // il faut corriger de signe de rel_center.x et rel_center.y // selon le quadrant ou on se trouve if( (delta.x >= 0) && (delta.y >= 0) ) // 1er quadrant { center.x = -center.x; } else if( (delta.x < 0) && (delta.y >= 0) ) // 2eme quadrant { center.x = -center.x; center.y = -center.y; } else if( (delta.x < 0) && (delta.y < 0) ) // 3eme quadrant { center.y = -center.y; Loading Loading @@ -288,13 +294,15 @@ wxPoint center, delta; /**************************************************/ /* Routines utilises en lecture de ficher gerber */ /**************************************************/ /* ces routines lisent la chaine de texte pointe par Text. Apres appel, Text pointe le debut de la sequence non lue * Apres appel, Text pointe le debut de la sequence non lue */ /***********************************************/ wxPoint GERBER_Descr::ReadXYCoord( char*& Text ) /***********************************************/ /* Retourne la coord courante pointee par Text (XnnnnYmmmm) */ { Loading @@ -305,10 +313,13 @@ char * text; char line[256]; if ( m_Relative ) pos.x = pos.y = 0; else pos = m_CurrentPos; if( m_Relative ) pos.x = pos.y = 0; else pos = m_CurrentPos; if ( Text == NULL ) return pos; if( Text == NULL ) return pos; text = line; while( *Text ) Loading @@ -320,10 +331,13 @@ char line[256]; text = line; nbchar = 0; while( IsNumber( *Text ) ) { if ( *Text == '.' ) is_float = TRUE; if( *Text == '.' ) is_float = TRUE; *(text++) = *(Text++); if ( (*Text >= '0') && (*Text <='9') ) nbchar++; if( (*Text >= '0') && (*Text <='9') ) nbchar++; } *text = 0; if( is_float ) { Loading @@ -338,42 +352,70 @@ char line[256]; if( m_NoTrailingZeros ) { int min_digit = (type_coord == 'X') ? m_FmtLen.x : m_FmtLen.y; while (nbchar < min_digit) { *(text++) ='0'; nbchar++; } while( nbchar < min_digit ) { *(text++) = '0'; nbchar++; } *text = 0; } current_coord = atoi( line ); double real_scale = 1.0; switch( fmt_scale ) { case 0: real_scale = 10000.0; case 0: real_scale = 10000.0; break; case 1: real_scale = 1000.0; case 1: real_scale = 1000.0; break; case 2: real_scale = 100.0; case 2: real_scale = 100.0; break; case 3: real_scale = 10.0; case 3: real_scale = 10.0; break; case 4: break; case 5: real_scale = 0.1; case 5: real_scale = 0.1; break; case 6: real_scale = 0.01; case 6: real_scale = 0.01; break; case 7: real_scale = 0.001; case 7: real_scale = 0.001; break; case 8: real_scale = 0.0001; case 8: real_scale = 0.0001; break; case 9: real_scale = 0.00001; case 9: real_scale = 0.00001; break; } if ( m_GerbMetric ) real_scale = real_scale / 25.4; 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; if( type_coord == 'X' ) pos.x = current_coord; else if( type_coord == 'Y' ) pos.y = current_coord; continue; } else break; else break; } if( m_Relative ) Loading @@ -386,21 +428,25 @@ char line[256]; return pos; } /************************************************/ wxPoint GERBER_Descr::ReadIJCoord( char*& Text ) /************************************************/ /* Retourne la coord type InnJnn courante pointee par Text (InnnnJmmmm) Ces coordonnes sont relatives, donc si une coord est absente, sa valeur par defaut est 0 * Ces coordonnes sont relatives, donc si une coord est absente, sa valeur * par defaut est 0 */ { wxPoint pos( 0, 0 ); int type_coord = 0, current_coord, nbchar; bool is_float = FALSE; char* text; char line[256]; if ( Text == NULL ) return pos; if( Text == NULL ) return pos; text = line; while( *Text ) Loading @@ -412,10 +458,13 @@ char line[256]; text = line; nbchar = 0; while( IsNumber( *Text ) ) { if ( *Text == '.' ) is_float = TRUE; if( *Text == '.' ) is_float = TRUE; *(text++) = *(Text++); if ( (*Text >= '0') && (*Text <='9') ) nbchar++; if( (*Text >= '0') && (*Text <='9') ) nbchar++; } *text = 0; if( is_float ) { Loading @@ -430,50 +479,81 @@ char line[256]; if( m_NoTrailingZeros ) { int min_digit = (type_coord == 'I') ? m_FmtLen.x : m_FmtLen.y; while (nbchar < min_digit) { *(text++) ='0'; nbchar++; } while( nbchar < min_digit ) { *(text++) = '0'; nbchar++; } *text = 0; } current_coord = atoi( line ); double real_scale = 1.0; switch( fmt_scale ) { case 0: real_scale = 10000.0; case 0: real_scale = 10000.0; break; case 1: real_scale = 1000.0; case 1: real_scale = 1000.0; break; case 2: real_scale = 100.0; case 2: real_scale = 100.0; break; case 3: real_scale = 10.0; case 3: real_scale = 10.0; break; case 4: break; case 5: real_scale = 0.1; case 5: real_scale = 0.1; break; case 6: real_scale = 0.01; case 6: real_scale = 0.01; break; case 7: real_scale = 0.001; case 7: real_scale = 0.001; break; case 8: real_scale = 0.0001; case 8: real_scale = 0.0001; break; case 9: real_scale = 0.00001; case 9: real_scale = 0.00001; break; } if ( m_GerbMetric ) real_scale = real_scale / 25.4; if( m_GerbMetric ) real_scale = real_scale / 25.4; current_coord = (int) round( current_coord * real_scale ); } if ( type_coord == 'I' ) pos.x = current_coord; else if ( type_coord == 'J' ) pos.y = current_coord; if( type_coord == 'I' ) pos.x = current_coord; else if( type_coord == 'J' ) pos.y = current_coord; continue; } else break; else break; } m_IJPos = pos; return pos; } /*****************************************************/ int GERBER_Descr::ReturnGCodeNumber( char*& Text ) /*****************************************************/ /* Lit la sequence Gnn et retourne la valeur nn */ { Loading @@ -481,23 +561,25 @@ int ii = 0; char* text; char line[1024]; if ( Text == NULL ) return 0; if( Text == NULL ) return 0; Text++; text = line; while( IsNumber( *Text ) ) { *(text++) = *(Text++); } *text = 0; ii = atoi( line ); return ii; } /**************************************************/ int GERBER_Descr::ReturnDCodeNumber( char*& Text ) /**************************************************/ /* Lit la sequence Dnn et retourne la valeur nn */ { Loading @@ -505,15 +587,19 @@ int ii = 0; char* text; char line[1024]; if ( Text == NULL ) return 0; if( Text == NULL ) return 0; Text++; text = line; while( IsNumber(*Text) ) *(text++) = *(Text++); while( IsNumber( *Text ) ) *(text++) = *(Text++); *text = 0; ii = atoi( line ); return ii; } /******************************************************************/ bool GERBER_Descr::Execute_G_Command( char*& text, int G_commande ) /******************************************************************/ Loading Loading @@ -552,11 +638,14 @@ bool GERBER_Descr::Execute_G_Command(char * &text, int G_commande) case GC_SELECT_TOOL: { int D_commande = ReturnDCodeNumber( text ); if ( D_commande < FIRST_DCODE) return FALSE; if (D_commande > (MAX_TOOLS-1)) D_commande = MAX_TOOLS-1; if( D_commande < FIRST_DCODE ) return FALSE; if( D_commande > (MAX_TOOLS - 1) ) D_commande = MAX_TOOLS - 1; m_Current_Tool = D_commande; D_CODE* pt_Dcode = ReturnToolDescr( m_Layer, D_commande ); if ( pt_Dcode ) pt_Dcode->m_InUse = TRUE; if( pt_Dcode ) pt_Dcode->m_InUse = TRUE; break; } Loading Loading @@ -606,25 +695,28 @@ bool GERBER_Descr::Execute_G_Command(char * &text, int G_commande) return TRUE; } /*****************************************************************************/ bool GERBER_Descr::Execute_DCODE_Command( WinEDA_GerberFrame* frame, wxDC* DC, char*& text, int D_commande ) /*****************************************************************************/ { wxSize size( 15, 15 ); int shape = 1, dcode = 0; D_CODE* pt_Tool = NULL; wxString msg; if( D_commande >= FIRST_DCODE ) // This is a "Set tool" command { if (D_commande > (MAX_TOOLS-1)) D_commande = MAX_TOOLS-1; if( D_commande > (MAX_TOOLS - 1) ) D_commande = MAX_TOOLS - 1; m_Current_Tool = D_commande; D_CODE* pt_Dcode = ReturnToolDescr( m_Layer, D_commande ); if ( pt_Dcode ) pt_Dcode->m_InUse = TRUE; 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) { m_Last_Pen_Command = D_commande; Loading @@ -639,8 +731,12 @@ wxString msg; SEGZONE* edge_poly, * last; edge_poly = new SEGZONE( frame->m_Pcb ); last = (SEGZONE*) frame->m_Pcb->m_Zone; if ( last ) while (last->Pnext ) last = (SEGZONE*)last->Pnext; if( last ) while( last->Pnext ) last = (SEGZONE*) last->Pnext; edge_poly->Insert( frame->m_Pcb, last ); edge_poly->SetLayer( frame->GetScreen()->m_Active_Layer ); Loading @@ -664,9 +760,8 @@ wxString msg; return FALSE; } } else switch ( D_commande ) else switch( D_commande ) { case 1: //code D01 Draw line, exposure ON pt_Tool = ReturnToolDescr( m_Layer, m_Current_Tool ); Loading @@ -676,6 +771,7 @@ wxString msg; dcode = pt_Tool->m_Num_Dcode; shape = pt_Tool->m_Shape; } switch( m_Iterpolation ) { case GERB_INTERPOL_LINEAR_1X: Loading Loading @@ -711,6 +807,7 @@ wxString msg; DisplayError( frame, msg ); break; } m_PreviousPos = m_CurrentPos; break; Loading Loading @@ -753,8 +850,8 @@ wxString msg; default: // Special (Macro) : Non implant break; } m_PreviousPos = m_CurrentPos; break; Loading @@ -764,4 +861,3 @@ wxString msg; return TRUE; } pcbnew/class_track.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -246,7 +246,8 @@ void SEGVIA::SetLayerPair( int top_layer, int bottom_layer ) if( via_type == VIA_NORMALE ) { top_layer = LAYER_CMP_N; bottom_layer = LAYER_CUIVRE_N; top_layer = LAYER_CMP_N; bottom_layer = LAYER_CUIVRE_N; } if( bottom_layer > top_layer ) Loading Loading @@ -695,12 +696,12 @@ void TRACK::Display_Infos( WinEDA_DrawFrame* frame ) || Type() == TYPEVIA ) { EQUIPOT* equipot = ((WinEDA_PcbFrame*)frame)->m_Pcb->FindNet( m_NetCode ); if( equipot ) { msg = equipot->m_Netname; } else msg = wxT( "<noname>" ); Affiche_1_Parametre( frame, text_pos, _( "NetName" ), msg, RED ); /* Affiche net code :*/ Loading Loading
change_log.txt +6 −4 Original line number Diff line number Diff line Loading @@ -7,15 +7,17 @@ email address. 2007-Sep-25 UPDATE Dick Hollenbeck <dick@softplc.com> ================================================================================ + pcbnew * got rid of reference to global display options DisplayOpt.DisplayZones from * removed reference to global display options DisplayOpt.DisplayZones in collectors.cpp so collectors.cpp can continue to be used in multiple future (non-display related) general contexts. (non-display related) general contexts. I don't want unnecessary dependencies in there. The way to completely ignore a type is to exclude it from scanList. The way to sometimes ignore a type is to add support for this in COLLECTORS_GUIDE. * Moved TYPEZONE to end of AllBoardItems, added GENERAL_COLLECTOR::AllButZones to provide support of DisplayOpt.DisplayZones. provide support for DisplayOpt.DisplayZones. * Added aHotKeyCode to PcbGeneralLocateAndDisplay() + gerbview * viewer was getting stuck in a loop when loading a bad gerber file. Fixed the bug, but line 223 through 225 of readgerb.cpp need review. the bug, but line 223 through 225 of readgerb.cpp needs review. * beautified a few files with uncrustify, (any I had to look at). Loading
gerbview/rs274d.cpp +773 −677 Original line number Diff line number Diff line Loading @@ -10,59 +10,60 @@ #include "protos.h" #define IsNumber(x) ( ( ((x) >= '0') && ((x) <='9') ) ||\ ((x) == '-') || ((x) == '+') || ((x) == '.')) #define IsNumber( x ) ( ( ( (x) >= '0' ) && ( (x) <='9' ) ) \ || ( (x) == '-' ) || ( (x) == '+' ) || ( (x) == '.' ) ) /* Format Gerber : NOTES : Fonctions preparatoires: Gn = G01 interpolation lineaire ( trace de droites ) G02,G20,G21 Interpolation circulaire , sens trigo < 0 G03,G30,G31 Interpolation circulaire , sens trigo > 0 G04 commentaire G06 Interpolation parabolique G07 Interpolation cubique G10 interpolation lineaire ( echelle 10x ) G11 interpolation lineaire ( echelle 0.1x ) G12 interpolation lineaire ( echelle 0.01x ) G52 plot symbole reference par Dnn code G53 plot symbole reference par Dnn ; symbole tourne de -90 degres G54 Selection d'outil G55 Mode exposition photo G56 plot symbole reference par Dnn A code G57 affiche le symbole reference sur la console G58 plot et affiche le symbole reference sur la console G60 interpolation lineaire ( echelle 100x ) G70 Unites = Inches G71 Unites = Millimetres G74 supprime interpolation circulaire sur 360 degre, revient a G01 G75 Active interpolation circulaire sur 360 degre G90 Mode Coordonnees absolues G91 Mode Coordonnees Relatives Coordonnees X,Y X,Y sont suivies de + ou - et de m+n chiffres (non separes) m = partie entiere n = partie apres la virgule formats classiques : m = 2, n = 3 (format 2.3) m = 3, n = 4 (format 3.4) ex: G__ X00345Y-06123 D__* Outils et D_CODES numero d'outil ( identification des formes ) 1 a 99 (classique) 1 a 999 D_CODES: D01 ... D9 = codes d'action: D01 = activation de lumiere (baisser de plume) lors du dplacement D02 = extinction de lumiere (lever de plume) lors du dplacement D03 = Flash D09 = VAPE Flash D51 = precede par G54 -> Select VAPE D10 ... D255 = Indentification d'outils ( d'ouvertures ) Ne sont pas tj dans l'ordre ( voir tableau dans PCBPLOT.H) * Fonctions preparatoires: * Gn = * G01 interpolation lineaire ( trace de droites ) * G02,G20,G21 Interpolation circulaire , sens trigo < 0 * G03,G30,G31 Interpolation circulaire , sens trigo > 0 * G04 commentaire * G06 Interpolation parabolique * G07 Interpolation cubique * G10 interpolation lineaire ( echelle 10x ) * G11 interpolation lineaire ( echelle 0.1x ) * G12 interpolation lineaire ( echelle 0.01x ) * G52 plot symbole reference par Dnn code * G53 plot symbole reference par Dnn ; symbole tourne de -90 degres * G54 Selection d'outil * G55 Mode exposition photo * G56 plot symbole reference par Dnn A code * G57 affiche le symbole reference sur la console * G58 plot et affiche le symbole reference sur la console * G60 interpolation lineaire ( echelle 100x ) * G70 Unites = Inches * G71 Unites = Millimetres * G74 supprime interpolation circulaire sur 360 degre, revient a G01 * G75 Active interpolation circulaire sur 360 degre * G90 Mode Coordonnees absolues * G91 Mode Coordonnees Relatives * * Coordonnees X,Y * X,Y sont suivies de + ou - et de m+n chiffres (non separes) * m = partie entiere * n = partie apres la virgule * formats classiques : m = 2, n = 3 (format 2.3) * m = 3, n = 4 (format 3.4) * ex: * G__ X00345Y-06123 D__* * * Outils et D_CODES * numero d'outil ( identification des formes ) * 1 a 99 (classique) * 1 a 999 * D_CODES: * * D01 ... D9 = codes d'action: * D01 = activation de lumiere (baisser de plume) lors du dplacement * D02 = extinction de lumiere (lever de plume) lors du dplacement * D03 = Flash * D09 = VAPE Flash * D51 = precede par G54 -> Select VAPE * * D10 ... D255 = Indentification d'outils ( d'ouvertures ) * Ne sont pas tj dans l'ordre ( voir tableau dans PCBPLOT.H) */ // Type d'action du phototraceur: Loading Loading @@ -91,18 +92,19 @@ static void Append_1_SEG_ARC_GERBER(int Dcode_index, bool trigo_sens, bool multiquadrant ); /****************************************************************/ static void Append_1_Flash_ROND_GERBER( int Dcode_tool, WinEDA_GerberFrame* frame, wxDC* DC, const wxPoint& pos, int diametre ) /****************************************************************/ /* Trace 1 flash ROND en position pos */ { TRACK* track; track = new TRACK( frame->m_Pcb ); track->Insert( frame->m_Pcb, NULL ); track->SetLayer( frame->GetScreen()->m_Active_Layer ); Loading @@ -116,14 +118,16 @@ TRACK * track; Trace_Segment( frame->DrawPanel, DC, track, GR_OR ); } /**********************************************************************/ static void Append_1_Flash_GERBER( int Dcode_index, WinEDA_GerberFrame* frame, wxDC* DC, const wxPoint& pos, const wxSize& size, int forme ) /*********************************************************************/ /* Trace 1 flash rectangulaire ou ovale vertical ou horizontal donne par son centre et ses dimensions X et Y * Trace 1 flash rectangulaire ou ovale vertical ou horizontal * donne par son centre et ses dimensions X et Y */ { TRACK* track; Loading @@ -133,6 +137,7 @@ int width, len; len = MAX( size.x, size.y ) - width; track = new TRACK( frame->m_Pcb ); track->Insert( frame->m_Pcb, NULL ); track->SetLayer( frame->GetScreen()->m_Active_Layer ); Loading @@ -153,7 +158,6 @@ int width, len; track->m_Start.x -= len; track->m_End.x += len; } else // ovale / rect vertical { track->m_Start.y -= len; Loading @@ -174,6 +178,7 @@ static void Append_1_Line_GERBER(int Dcode_index, TRACK* track; track = new TRACK( frame->m_Pcb ); track->Insert( frame->m_Pcb, NULL ); track->SetLayer( frame->GetScreen()->m_Active_Layer ); Loading @@ -187,6 +192,7 @@ TRACK * track; Trace_Segment( frame->DrawPanel, DC, track, GR_OR ); } /*****************************************************************/ static void Append_1_SEG_ARC_GERBER( int Dcode_index, WinEDA_GerberFrame* frame, wxDC* DC, Loading @@ -196,20 +202,21 @@ static void Append_1_SEG_ARC_GERBER(int Dcode_index, /*****************************************************************/ /* creation d'un arc: si multiquadrant == TRUE arc de 0 a 360 degres et rel_center est la coordonne du centre relativement au startpoint si multiquadrant == FALSE arc de 0 90 entierement contenu dans le meme quadrant et rel_center est la coordonne du centre relativement au startpoint, mais en VALEUR ABSOLUE et le signe des valeurs x et y de rel_center doit etre deduit de cette limite de 90 degres * si multiquadrant == TRUE arc de 0 a 360 degres * et rel_center est la coordonne du centre relativement au startpoint * * si multiquadrant == FALSE arc de 0 90 entierement contenu dans le meme quadrant * et rel_center est la coordonne du centre relativement au startpoint, * mais en VALEUR ABSOLUE et le signe des valeurs x et y de rel_center doit * etre deduit de cette limite de 90 degres * */ { TRACK* track; wxPoint center, delta; track = new TRACK( frame->m_Pcb ); track->Insert( frame->m_Pcb, NULL ); track->m_Shape = S_ARC; Loading Loading @@ -237,19 +244,18 @@ wxPoint center, delta; center = rel_center; delta.x = endpoint.x - startpoint.x; delta.y = endpoint.y - startpoint.y; // il faut corriger de signe de rel_center.x et rel_center.y // selon le quadrant ou on se trouve if( (delta.x >= 0) && (delta.y >= 0) ) // 1er quadrant { center.x = -center.x; } else if( (delta.x < 0) && (delta.y >= 0) ) // 2eme quadrant { center.x = -center.x; center.y = -center.y; } else if( (delta.x < 0) && (delta.y < 0) ) // 3eme quadrant { center.y = -center.y; Loading Loading @@ -288,13 +294,15 @@ wxPoint center, delta; /**************************************************/ /* Routines utilises en lecture de ficher gerber */ /**************************************************/ /* ces routines lisent la chaine de texte pointe par Text. Apres appel, Text pointe le debut de la sequence non lue * Apres appel, Text pointe le debut de la sequence non lue */ /***********************************************/ wxPoint GERBER_Descr::ReadXYCoord( char*& Text ) /***********************************************/ /* Retourne la coord courante pointee par Text (XnnnnYmmmm) */ { Loading @@ -305,10 +313,13 @@ char * text; char line[256]; if ( m_Relative ) pos.x = pos.y = 0; else pos = m_CurrentPos; if( m_Relative ) pos.x = pos.y = 0; else pos = m_CurrentPos; if ( Text == NULL ) return pos; if( Text == NULL ) return pos; text = line; while( *Text ) Loading @@ -320,10 +331,13 @@ char line[256]; text = line; nbchar = 0; while( IsNumber( *Text ) ) { if ( *Text == '.' ) is_float = TRUE; if( *Text == '.' ) is_float = TRUE; *(text++) = *(Text++); if ( (*Text >= '0') && (*Text <='9') ) nbchar++; if( (*Text >= '0') && (*Text <='9') ) nbchar++; } *text = 0; if( is_float ) { Loading @@ -338,42 +352,70 @@ char line[256]; if( m_NoTrailingZeros ) { int min_digit = (type_coord == 'X') ? m_FmtLen.x : m_FmtLen.y; while (nbchar < min_digit) { *(text++) ='0'; nbchar++; } while( nbchar < min_digit ) { *(text++) = '0'; nbchar++; } *text = 0; } current_coord = atoi( line ); double real_scale = 1.0; switch( fmt_scale ) { case 0: real_scale = 10000.0; case 0: real_scale = 10000.0; break; case 1: real_scale = 1000.0; case 1: real_scale = 1000.0; break; case 2: real_scale = 100.0; case 2: real_scale = 100.0; break; case 3: real_scale = 10.0; case 3: real_scale = 10.0; break; case 4: break; case 5: real_scale = 0.1; case 5: real_scale = 0.1; break; case 6: real_scale = 0.01; case 6: real_scale = 0.01; break; case 7: real_scale = 0.001; case 7: real_scale = 0.001; break; case 8: real_scale = 0.0001; case 8: real_scale = 0.0001; break; case 9: real_scale = 0.00001; case 9: real_scale = 0.00001; break; } if ( m_GerbMetric ) real_scale = real_scale / 25.4; 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; if( type_coord == 'X' ) pos.x = current_coord; else if( type_coord == 'Y' ) pos.y = current_coord; continue; } else break; else break; } if( m_Relative ) Loading @@ -386,21 +428,25 @@ char line[256]; return pos; } /************************************************/ wxPoint GERBER_Descr::ReadIJCoord( char*& Text ) /************************************************/ /* Retourne la coord type InnJnn courante pointee par Text (InnnnJmmmm) Ces coordonnes sont relatives, donc si une coord est absente, sa valeur par defaut est 0 * Ces coordonnes sont relatives, donc si une coord est absente, sa valeur * par defaut est 0 */ { wxPoint pos( 0, 0 ); int type_coord = 0, current_coord, nbchar; bool is_float = FALSE; char* text; char line[256]; if ( Text == NULL ) return pos; if( Text == NULL ) return pos; text = line; while( *Text ) Loading @@ -412,10 +458,13 @@ char line[256]; text = line; nbchar = 0; while( IsNumber( *Text ) ) { if ( *Text == '.' ) is_float = TRUE; if( *Text == '.' ) is_float = TRUE; *(text++) = *(Text++); if ( (*Text >= '0') && (*Text <='9') ) nbchar++; if( (*Text >= '0') && (*Text <='9') ) nbchar++; } *text = 0; if( is_float ) { Loading @@ -430,50 +479,81 @@ char line[256]; if( m_NoTrailingZeros ) { int min_digit = (type_coord == 'I') ? m_FmtLen.x : m_FmtLen.y; while (nbchar < min_digit) { *(text++) ='0'; nbchar++; } while( nbchar < min_digit ) { *(text++) = '0'; nbchar++; } *text = 0; } current_coord = atoi( line ); double real_scale = 1.0; switch( fmt_scale ) { case 0: real_scale = 10000.0; case 0: real_scale = 10000.0; break; case 1: real_scale = 1000.0; case 1: real_scale = 1000.0; break; case 2: real_scale = 100.0; case 2: real_scale = 100.0; break; case 3: real_scale = 10.0; case 3: real_scale = 10.0; break; case 4: break; case 5: real_scale = 0.1; case 5: real_scale = 0.1; break; case 6: real_scale = 0.01; case 6: real_scale = 0.01; break; case 7: real_scale = 0.001; case 7: real_scale = 0.001; break; case 8: real_scale = 0.0001; case 8: real_scale = 0.0001; break; case 9: real_scale = 0.00001; case 9: real_scale = 0.00001; break; } if ( m_GerbMetric ) real_scale = real_scale / 25.4; if( m_GerbMetric ) real_scale = real_scale / 25.4; current_coord = (int) round( current_coord * real_scale ); } if ( type_coord == 'I' ) pos.x = current_coord; else if ( type_coord == 'J' ) pos.y = current_coord; if( type_coord == 'I' ) pos.x = current_coord; else if( type_coord == 'J' ) pos.y = current_coord; continue; } else break; else break; } m_IJPos = pos; return pos; } /*****************************************************/ int GERBER_Descr::ReturnGCodeNumber( char*& Text ) /*****************************************************/ /* Lit la sequence Gnn et retourne la valeur nn */ { Loading @@ -481,23 +561,25 @@ int ii = 0; char* text; char line[1024]; if ( Text == NULL ) return 0; if( Text == NULL ) return 0; Text++; text = line; while( IsNumber( *Text ) ) { *(text++) = *(Text++); } *text = 0; ii = atoi( line ); return ii; } /**************************************************/ int GERBER_Descr::ReturnDCodeNumber( char*& Text ) /**************************************************/ /* Lit la sequence Dnn et retourne la valeur nn */ { Loading @@ -505,15 +587,19 @@ int ii = 0; char* text; char line[1024]; if ( Text == NULL ) return 0; if( Text == NULL ) return 0; Text++; text = line; while( IsNumber(*Text) ) *(text++) = *(Text++); while( IsNumber( *Text ) ) *(text++) = *(Text++); *text = 0; ii = atoi( line ); return ii; } /******************************************************************/ bool GERBER_Descr::Execute_G_Command( char*& text, int G_commande ) /******************************************************************/ Loading Loading @@ -552,11 +638,14 @@ bool GERBER_Descr::Execute_G_Command(char * &text, int G_commande) case GC_SELECT_TOOL: { int D_commande = ReturnDCodeNumber( text ); if ( D_commande < FIRST_DCODE) return FALSE; if (D_commande > (MAX_TOOLS-1)) D_commande = MAX_TOOLS-1; if( D_commande < FIRST_DCODE ) return FALSE; if( D_commande > (MAX_TOOLS - 1) ) D_commande = MAX_TOOLS - 1; m_Current_Tool = D_commande; D_CODE* pt_Dcode = ReturnToolDescr( m_Layer, D_commande ); if ( pt_Dcode ) pt_Dcode->m_InUse = TRUE; if( pt_Dcode ) pt_Dcode->m_InUse = TRUE; break; } Loading Loading @@ -606,25 +695,28 @@ bool GERBER_Descr::Execute_G_Command(char * &text, int G_commande) return TRUE; } /*****************************************************************************/ bool GERBER_Descr::Execute_DCODE_Command( WinEDA_GerberFrame* frame, wxDC* DC, char*& text, int D_commande ) /*****************************************************************************/ { wxSize size( 15, 15 ); int shape = 1, dcode = 0; D_CODE* pt_Tool = NULL; wxString msg; if( D_commande >= FIRST_DCODE ) // This is a "Set tool" command { if (D_commande > (MAX_TOOLS-1)) D_commande = MAX_TOOLS-1; if( D_commande > (MAX_TOOLS - 1) ) D_commande = MAX_TOOLS - 1; m_Current_Tool = D_commande; D_CODE* pt_Dcode = ReturnToolDescr( m_Layer, D_commande ); if ( pt_Dcode ) pt_Dcode->m_InUse = TRUE; 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) { m_Last_Pen_Command = D_commande; Loading @@ -639,8 +731,12 @@ wxString msg; SEGZONE* edge_poly, * last; edge_poly = new SEGZONE( frame->m_Pcb ); last = (SEGZONE*) frame->m_Pcb->m_Zone; if ( last ) while (last->Pnext ) last = (SEGZONE*)last->Pnext; if( last ) while( last->Pnext ) last = (SEGZONE*) last->Pnext; edge_poly->Insert( frame->m_Pcb, last ); edge_poly->SetLayer( frame->GetScreen()->m_Active_Layer ); Loading @@ -664,9 +760,8 @@ wxString msg; return FALSE; } } else switch ( D_commande ) else switch( D_commande ) { case 1: //code D01 Draw line, exposure ON pt_Tool = ReturnToolDescr( m_Layer, m_Current_Tool ); Loading @@ -676,6 +771,7 @@ wxString msg; dcode = pt_Tool->m_Num_Dcode; shape = pt_Tool->m_Shape; } switch( m_Iterpolation ) { case GERB_INTERPOL_LINEAR_1X: Loading Loading @@ -711,6 +807,7 @@ wxString msg; DisplayError( frame, msg ); break; } m_PreviousPos = m_CurrentPos; break; Loading Loading @@ -753,8 +850,8 @@ wxString msg; default: // Special (Macro) : Non implant break; } m_PreviousPos = m_CurrentPos; break; Loading @@ -764,4 +861,3 @@ wxString msg; return TRUE; }
pcbnew/class_track.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -246,7 +246,8 @@ void SEGVIA::SetLayerPair( int top_layer, int bottom_layer ) if( via_type == VIA_NORMALE ) { top_layer = LAYER_CMP_N; bottom_layer = LAYER_CUIVRE_N; top_layer = LAYER_CMP_N; bottom_layer = LAYER_CUIVRE_N; } if( bottom_layer > top_layer ) Loading Loading @@ -695,12 +696,12 @@ void TRACK::Display_Infos( WinEDA_DrawFrame* frame ) || Type() == TYPEVIA ) { EQUIPOT* equipot = ((WinEDA_PcbFrame*)frame)->m_Pcb->FindNet( m_NetCode ); if( equipot ) { msg = equipot->m_Netname; } else msg = wxT( "<noname>" ); Affiche_1_Parametre( frame, text_pos, _( "NetName" ), msg, RED ); /* Affiche net code :*/ Loading