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() );
612 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
618 default: Unexpected( CurText() );
break;
626 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
628 if( token == T_LEFT )
639 Unexpected( CurText() );
645 NeedSYMBOLorNUMBER();
646 aItem->
m_Info = FromUTF8();
655 NeedSYMBOLorNUMBER();
656 aItem->
m_Name = FromUTF8();
689 Unexpected( CurText() );
701 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
703 if( token == T_LEFT )
709 NeedSYMBOLorNUMBER();
710 aItem->
m_Info = FromUTF8();
719 NeedSYMBOLorNUMBER();
720 aItem->
m_Name = FromUTF8();
764 for( token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
773 faceName = FromUTF8();
805 Unexpected( CurText() );
810 if( !faceName.IsEmpty() )
817 for( token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
843 Unexpected( CurText() );
855 Unexpected( CurText() );
867 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
875 default: Unexpected( CurText() );
break;
884 if( token != T_NUMBER )
885 Expecting( T_NUMBER );
887 return atoi( CurText() );
896 else if( val > aMax )
907 if( token != T_NUMBER )
908 Expecting( T_NUMBER );
953 parser.
Parse(
this );
966 if( aFullFileName.IsEmpty() )
972 if( !wxFileExists( aFullFileName ) )
975 *aMsg =
_(
"File not found." );
982 wxFFile wksFile( aFullFileName, wxS(
"rb" ) );
984 if( ! wksFile.IsOpened() )
987 *aMsg =
_(
"File could not be opened." );
995 size_t filelen = wksFile.Length();
996 std::unique_ptr<char[]> buffer = std::make_unique<char[]>(filelen+10);
998 if( wksFile.Read( buffer.get(), filelen ) != filelen )
1001 *aMsg =
_(
"Drawing sheet was not fully read." );
1016 parser.
Parse(
this );
1025 catch(
const std::bad_alloc& )
1028 *aMsg =
_(
"Ran out of memory." );
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.
bool LoadDrawingSheet(const wxString &aFullFileName, wxString *aMsg, bool aAppend=false)
Populates the list with a custom layout or the default layout if no custom layout is available.
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.
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, const std::vector< wxString > *aEmbeddedFiles=nullptr, bool aForDrawingSheet=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.