Gerber files: update unicode coding to the 2019 06 Gerber specifications.
In gbr files, not allowed chars are coded using a 16 bit (4 hexa digits) unicode sequence. Previously, it was \XXXX and now is \uXXXX escape sequence.
This commit is contained in:
parent
2e5b8d0a8f
commit
60dd1cd5c7
|
@ -348,35 +348,46 @@ wxString FormatStringFromGerber( const wxString& aString )
|
||||||
{
|
{
|
||||||
unsigned code = aString[ii];
|
unsigned code = aString[ii];
|
||||||
|
|
||||||
if( code == '\\' )
|
if( code == '\\' && ii < count-5 && aString[ii+1] == 'u' )
|
||||||
{
|
{
|
||||||
// If next char is not a hexadecimal char, just skip the '\'
|
// Note the latest Gerber X2 spec (2019 06) uses \uXXXX to encode
|
||||||
// It is perhaps a escape sequence like \\ or \" or ...
|
// the unicode XXXX hexadecimal value
|
||||||
if( ii < count-1 )
|
// If 4 chars next to 'u' are hexadecimal chars,
|
||||||
{
|
// Convert these 4 hexadecimal digits to a 16 bit unicode
|
||||||
code = aString[ii+1];
|
|
||||||
|
|
||||||
if( char2Hex( code ) < 0 )
|
|
||||||
{
|
|
||||||
++ii;
|
|
||||||
txt.Append( aString[ii] );
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Convert 4 hexadecimal digits to a 16 bit unicode
|
|
||||||
// (Gerber allows only 4 hexadecimal digits)
|
// (Gerber allows only 4 hexadecimal digits)
|
||||||
|
// If an error occurs, the escape sequence is not translated,
|
||||||
|
// and used "as this"
|
||||||
long value = 0;
|
long value = 0;
|
||||||
|
bool error = false;
|
||||||
|
|
||||||
for( int jj = 0; jj < 4; jj++ )
|
for( int jj = 0; jj < 4; jj++ )
|
||||||
{
|
{
|
||||||
value <<= 4;
|
value <<= 4;
|
||||||
code = aString[++ii];
|
code = aString[ii+jj+2];
|
||||||
// Basic conversion (with no control), but it expects a valid gerber file
|
|
||||||
int hexa = char2Hex( code );
|
int hexa = char2Hex( code );
|
||||||
value += hexa;
|
|
||||||
|
if( hexa >= 0 )
|
||||||
|
value += hexa;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
txt.Append( wxChar( value ) );
|
if( !error )
|
||||||
|
{
|
||||||
|
if( value >= ' ' ) // Is a valid wxChar ?
|
||||||
|
txt.Append( wxChar( value ) );
|
||||||
|
|
||||||
|
ii += 5;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
txt.Append( aString[ii] );
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
txt.Append( aString[ii] );
|
txt.Append( aString[ii] );
|
||||||
|
@ -390,6 +401,8 @@ wxString ConvertNotAllowedCharsInGerber( const wxString& aString, bool aAllowUtf
|
||||||
{
|
{
|
||||||
/* format string means convert any code > 0x7E and unautorized codes to a hexadecimal
|
/* format string means convert any code > 0x7E and unautorized codes to a hexadecimal
|
||||||
* 16 bits sequence unicode
|
* 16 bits sequence unicode
|
||||||
|
* However if aAllowUtf8Chars is true only unautorized codes will be escaped, because some
|
||||||
|
* Gerber files accept UTF8 chars.
|
||||||
* unautorized codes are ',' '*' '%' '\' and are used as separators in Gerber files
|
* unautorized codes are ',' '*' '%' '\' and are used as separators in Gerber files
|
||||||
*/
|
*/
|
||||||
wxString txt;
|
wxString txt;
|
||||||
|
@ -420,12 +433,11 @@ wxString ConvertNotAllowedCharsInGerber( const wxString& aString, bool aAllowUtf
|
||||||
|
|
||||||
if( convert )
|
if( convert )
|
||||||
{
|
{
|
||||||
txt += '\\';
|
|
||||||
|
|
||||||
// Convert code to 4 hexadecimal digit
|
// Convert code to 4 hexadecimal digit
|
||||||
// (Gerber allows only 4 hexadecimal digit)
|
// (Gerber allows only 4 hexadecimal digit) in escape seq:
|
||||||
|
// "\uXXXX", XXXX is the unicode 16 bits hexa value
|
||||||
char hexa[32];
|
char hexa[32];
|
||||||
sprintf( hexa,"%4.4X", code & 0xFFFF);
|
sprintf( hexa,"\\u%4.4X", code & 0xFFFF);
|
||||||
txt += hexa;
|
txt += hexa;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue