27#include <fmt/format.h>
38#include <drawing_sheet/drawing_sheet_lexer.h>
42using namespace DRAWINGSHEET_T;
120 const wxString& aSource ) :
121 DRAWING_SHEET_LEXER( aLine, aSource ),
122 m_requiredVersion( 0 )
148 for(
unsigned ii = 0; ii < aTextbase.Len(); ii++ )
150 if( aTextbase[ii] !=
'%' )
152 msg << aTextbase[ii];
156 if( ++ii >= aTextbase.Len() )
159 wxChar format = aTextbase[ii];
163 case '%': msg +=
'%';
break;
164 case 'D': msg += wxT(
"${ISSUE_DATE}" );
break;
165 case 'R': msg += wxT(
"${REVISION}" );
break;
166 case 'K': msg += wxT(
"${KICAD_VERSION}" );
break;
167 case 'Z': msg += wxT(
"${PAPER}" );
break;
168 case 'S': msg += wxT(
"${#}" );
break;
169 case 'N': msg += wxT(
"${##}" );
break;
170 case 'F': msg += wxT(
"${FILENAME}" );
break;
171 case 'L': msg += wxT(
"${LAYER}" );
break;
172 case 'P': msg += wxT(
"${SHEETPATH}" );
break;
173 case 'Y': msg += wxT(
"${COMPANY}" );
break;
174 case 'T': msg += wxT(
"${TITLE}" );
break;
176 format = aTextbase[++ii];
180 case '0': msg += wxT(
"${COMMENT1}" );
break;
181 case '1': msg += wxT(
"${COMMENT2}" );
break;
182 case '2': msg += wxT(
"${COMMENT3}" );
break;
183 case '3': msg += wxT(
"${COMMENT4}" );
break;
184 case '4': msg += wxT(
"${COMMENT5}" );
break;
185 case '5': msg += wxT(
"${COMMENT6}" );
break;
186 case '6': msg += wxT(
"${COMMENT7}" );
break;
187 case '7': msg += wxT(
"${COMMENT8}" );
break;
188 case '8': msg += wxT(
"${COMMENT9}" );
break;
222 for( token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
224 if( token == T_LEFT )
235 case T_generator_version:
284 NeedSYMBOLorNUMBER();
291 Unexpected( CurText() );
304 if( aHeaderType == T_kicad_wks || aHeaderType == T_drawing_sheet )
310 if( tok == T_version )
318 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() );
461 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
463 if( token == T_LEFT )
476 Unexpected( CurText() );
488 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
490 if( token == T_LEFT )
496 NeedSYMBOLorNUMBER();
497 aItem->
m_Name = FromUTF8();
531 NeedSYMBOLorNUMBER();
532 aItem->
m_Info = FromUTF8();
544 data.reserve( 1 << 19 );
546 while( token != T_RIGHT )
548 if( !IsSymbol( token ) )
549 Expecting(
"base64 image data" );
555 wxMemoryBuffer buffer = wxBase64Decode( data );
572 Unexpected( CurText() );
583 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
585 if( token == T_LEFT )
591 NeedSYMBOLorNUMBER();
598 Unexpected( CurText() );
614 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
620 default: Unexpected( CurText() );
break;
628 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
630 if( token == T_LEFT )
641 Unexpected( CurText() );
647 NeedSYMBOLorNUMBER();
648 aItem->
m_Info = FromUTF8();
657 NeedSYMBOLorNUMBER();
658 aItem->
m_Name = FromUTF8();
691 Unexpected( CurText() );
703 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
705 if( token == T_LEFT )
711 NeedSYMBOLorNUMBER();
712 aItem->
m_Info = FromUTF8();
721 NeedSYMBOLorNUMBER();
722 aItem->
m_Name = FromUTF8();
766 for( token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
775 faceName = FromUTF8();
807 Unexpected( CurText() );
812 if( !faceName.IsEmpty() )
819 for( token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
845 Unexpected( CurText() );
857 Unexpected( CurText() );
869 for( T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
877 default: Unexpected( CurText() );
break;
887 if( token != T_NUMBER )
888 Expecting( T_NUMBER );
890 return atoi( CurText() );
900 else if( val > aMax )
911 if( token != T_NUMBER )
912 Expecting( T_NUMBER );
961 parser.
Parse(
this );
974 if( aFullFileName.IsEmpty() )
980 if( !wxFileExists( aFullFileName ) )
983 *aMsg =
_(
"File not found." );
990 wxFFile wksFile( aFullFileName, wxS(
"rb" ) );
992 if( ! wksFile.IsOpened() )
995 *aMsg =
_(
"File could not be opened." );
1003 size_t filelen = wksFile.Length();
1004 std::unique_ptr<char[]> buffer = std::make_unique<char[]>(filelen+10);
1006 if( wksFile.Read( buffer.get(), filelen ) != filelen )
1009 *aMsg =
_(
"Drawing sheet was not fully read." );
1024 parser.
Parse(
this );
1033 catch(
const std::bad_alloc& )
1036 *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)
Hold data and functions pertinent to parsing a S-expression file for a DS_DATA_MODEL.
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)
Populate 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.