27#include <fmt/format.h>
38#include <drawing_sheet/drawing_sheet_lexer.h>
42using namespace DRAWINGSHEET_T;
122 const wxString& aSource ) :
123 DRAWING_SHEET_LEXER( aLine, aSource ),
124 m_requiredVersion( 0 )
150 for(
unsigned ii = 0; ii < aTextbase.Len(); ii++ )
152 if( aTextbase[ii] !=
'%' )
154 msg << aTextbase[ii];
158 if( ++ii >= aTextbase.Len() )
161 wxChar format = aTextbase[ii];
165 case '%': msg +=
'%';
break;
166 case 'D': msg += wxT(
"${ISSUE_DATE}" );
break;
167 case 'R': msg += wxT(
"${REVISION}" );
break;
168 case 'K': msg += wxT(
"${KICAD_VERSION}" );
break;
169 case 'Z': msg += wxT(
"${PAPER}" );
break;
170 case 'S': msg += wxT(
"${#}" );
break;
171 case 'N': msg += wxT(
"${##}" );
break;
172 case 'F': msg += wxT(
"${FILENAME}" );
break;
173 case 'L': msg += wxT(
"${LAYER}" );
break;
174 case 'P': msg += wxT(
"${SHEETPATH}" );
break;
175 case 'Y': msg += wxT(
"${COMPANY}" );
break;
176 case 'T': msg += wxT(
"${TITLE}" );
break;
178 format = aTextbase[++ii];
182 case '0': msg += wxT(
"${COMMENT1}" );
break;
183 case '1': msg += wxT(
"${COMMENT2}" );
break;
184 case '2': msg += wxT(
"${COMMENT3}" );
break;
185 case '3': msg += wxT(
"${COMMENT4}" );
break;
186 case '4': msg += wxT(
"${COMMENT5}" );
break;
187 case '5': msg += wxT(
"${COMMENT6}" );
break;
188 case '6': msg += wxT(
"${COMMENT7}" );
break;
189 case '7': msg += wxT(
"${COMMENT8}" );
break;
190 case '8': msg += wxT(
"${COMMENT9}" );
break;
224 for( token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
226 if( token == T_LEFT )
237 case T_generator_version:
286 NeedSYMBOLorNUMBER();
293 Unexpected( CurText() );
305 if( aHeaderType == T_kicad_wks || aHeaderType == T_drawing_sheet )
311 if( tok == T_version )
319 Expecting( T_version );
333 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
351 case T_textlinewidth:
371 case T_bottom_margin:
377 Unexpected( CurText() );
390 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
392 if( token == T_LEFT )
398 NeedSYMBOLorNUMBER();
399 aItem->
m_Info = FromUTF8();
408 NeedSYMBOLorNUMBER();
409 aItem->
m_Name = FromUTF8();
448 Unexpected( CurText() );
460 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
462 if( token == T_LEFT )
475 Unexpected( CurText() );
487 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
489 if( token == T_LEFT )
495 NeedSYMBOLorNUMBER();
496 aItem->
m_Name = FromUTF8();
530 NeedSYMBOLorNUMBER();
531 aItem->
m_Info = FromUTF8();
543 data.reserve( 1 << 19 );
545 while( token != T_RIGHT )
547 if( !IsSymbol( token ) )
548 Expecting(
"base64 image data" );
554 wxMemoryBuffer buffer = wxBase64Decode( data );
571 Unexpected( CurText() );
581 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
583 if( token == T_LEFT )
589 NeedSYMBOLorNUMBER();
596 Unexpected( CurText() );
613 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
619 default: Unexpected( CurText() );
break;
627 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
629 if( token == T_LEFT )
638 Unexpected( CurText() );
644 NeedSYMBOLorNUMBER();
645 aItem->
m_Info = FromUTF8();
654 NeedSYMBOLorNUMBER();
655 aItem->
m_Name = FromUTF8();
688 Unexpected( CurText() );
700 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
702 if( token == T_LEFT )
708 NeedSYMBOLorNUMBER();
709 aItem->
m_Info = FromUTF8();
718 NeedSYMBOLorNUMBER();
719 aItem->
m_Name = FromUTF8();
763 for( token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
772 faceName = FromUTF8();
804 Unexpected( CurText() );
809 if( !faceName.IsEmpty() )
816 for( token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
842 Unexpected( CurText() );
854 Unexpected( CurText() );
866 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
874 default: Unexpected( CurText() );
break;
883 if( token != T_NUMBER )
884 Expecting( T_NUMBER );
886 return atoi( CurText() );
895 else if( val > aMax )
906 if( token != T_NUMBER )
907 Expecting( T_NUMBER );
952 parser.
Parse(
this );
956 wxLogMessage( ioe.
What() );
958 catch(
const std::bad_alloc& )
960 wxLogMessage( wxS(
"Memory exhaustion reading drawing sheet" ) );
967 wxString fullFileName = aFullFileName;
971 if( fullFileName.IsEmpty() )
977 if( !wxFileExists( fullFileName ) )
979 wxLogMessage(
_(
"Drawing sheet '%s' not found." ), fullFileName );
985 wxFFile wksFile( fullFileName, wxS(
"rb" ) );
987 if( ! wksFile.IsOpened() )
989 wxLogMessage(
_(
"Drawing sheet '%s' could not be opened." ), fullFileName );
997 size_t filelen = wksFile.Length();
998 std::unique_ptr<char[]> buffer = std::make_unique<char[]>(filelen+10);
1000 if( wksFile.Read( buffer.get(), filelen ) != filelen )
1002 wxLogMessage(
_(
"Drawing sheet '%s' was not fully read." ), fullFileName.GetData() );
1016 parser.
Parse(
this );
1020 wxLogMessage( ioe.
What() );
1023 catch(
const std::bad_alloc& )
1025 wxLogMessage( wxS(
"Memory exhaustion reading drawing sheet" ) );
This class handle bitmap images in KiCad.
bool LoadLegacyData(LINE_READER &aLine, wxString &aErrorMsg)
Load an image data saved by #SaveData.
bool ReadImageFile(const wxString &aFullFilename)
Reads and stores in memory an image file.
void SetScale(double aScale)
DRAWING_SHEET_PARSER holds data and functions pertinent to parsing a S-expression file for a DS_DATA_...
void parseCoordinate(POINT_COORD &aCoord)
void parseHeader(T aHeaderType)
Parse the data specified at the very beginning of the file, like version and the application used to ...
DRAWING_SHEET_PARSER(const char *aLine, const wxString &aSource)
void parseBitmap(DS_DATA_ITEM_BITMAP *aItem)
Parse a bitmap item starting by "( bitmap" and read parameters.
void readPngdata(DS_DATA_ITEM_BITMAP *aItem)
void parsePolygon(DS_DATA_ITEM_POLYGONS *aItem)
Parse a polygon item starting by "( polygon" and read parameters.
void parseText(DS_DATA_ITEM_TEXT *aItem)
Parse a text item starting by "(tbtext" and read parameters.
void Parse(DS_DATA_MODEL *aLayout)
wxString m_generatorVersion
int parseInt()
Parse an integer.
void readOption(DS_DATA_ITEM *aItem)
double parseDouble()
Parse a double.
void parseSetup(DS_DATA_MODEL *aLayout)
void parseGraphic(DS_DATA_ITEM *aItem)
Parse a graphic item starting by "(line" or "(rect" and read parameters.
void parsePolyOutline(DS_DATA_ITEM_POLYGONS *aItem)
Parse a list of corners starting by "( pts" and read coordinates.
double parseDouble()
Parse the current token as an ASCII numeric string with possible leading whitespace into a double pre...
BITMAP_BASE * m_ImageBitmap
void SetBoundingBox()
Calculate the bounding box of the set polygons.
void CloseContour()
Close the current contour, by storing the index of the last corner of the current polygon in m_polyIn...
void AppendCorner(const VECTOR2D &aCorner)
Add a corner in corner list.
GR_TEXT_H_ALIGN_T m_Hjustify
KIGFX::COLOR4D m_TextColor
VECTOR2D m_BoundingBoxSize
GR_TEXT_V_ALIGN_T m_Vjustify
Drawing sheet structure type definitions.
void SetPage1Option(PAGE_OPTION aChoice)
VECTOR2D m_IncrementVector
Handle the graphic items list to draw/plot the frame and title block.
void SetBottomMargin(double aMargin)
VECTOR2D m_DefaultTextSize
void SetRightMargin(double aMargin)
double m_DefaultLineWidth
static wxString DefaultLayout()
Return a string containing the empty layout shape.
static wxString EmptyLayout()
Return a string containing the empty layout shape.
void SetLeftMargin(double aMargin)
double m_DefaultTextThickness
void Append(DS_DATA_ITEM *aItem)
void AllowVoidList(bool Allow)
In KiCad applications, a drawing sheet is needed So if the list is empty, a default drawing sheet is ...
void ClearList()
Erase the list of items.
void SetTopMargin(double aMargin)
void SetFileFormatVersionAtLoad(int aVersion)
void SetPageLayout(const char *aPageLayout, bool aAppend=false, const wxString &aSource=wxT("Sexpr_string"))
Populate the list from a S expr description stored in a string.
bool LoadDrawingSheet(const wxString &aFullFileName=wxEmptyString, bool Append=false)
Populates the list with a custom layout or the default layout if no custom layout is available.
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
static FONT * GetFont(const wxString &aFontName=wxEmptyString, bool aBold=false, bool aItalic=false)
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown.
Is a LINE_READER that reads from a multiline 8 bit wide std::string.
const char emptyDrawingSheet[]
const char defaultDrawingSheet[]
const char emptyDrawingSheet[]
wxString convertLegacyVariableRefs(const wxString &aTextbase)
const char defaultDrawingSheet[]
#define SEXPR_WORKSHEET_FILE_VERSION
This file contains the file format version information for the s-expression drawing sheet file format...
#define THROW_IO_ERROR(msg)
wxString ConvertToNewOverbarNotation(const wxString &aOldStr)
Convert the old ~...~ overbar notation to the new ~{...} one.
constexpr T Clamp(const T &lower, const T &value, const T &upper)
Limit value within the range lower <= value <= upper.