23#include <fmt/format.h>
34#include <drawing_sheet/drawing_sheet_lexer.h>
38using namespace DRAWINGSHEET_T;
117 const wxString& aSource ) :
118 DRAWING_SHEET_LEXER( aLine, aSource ),
145 for(
unsigned ii = 0; ii < aTextbase.Len(); ii++ )
147 if( aTextbase[ii] !=
'%' )
149 msg << aTextbase[ii];
153 if( ++ii >= aTextbase.Len() )
156 wxChar format = aTextbase[ii];
160 case '%': msg +=
'%';
break;
161 case 'D': msg += wxT(
"${ISSUE_DATE}" );
break;
162 case 'R': msg += wxT(
"${REVISION}" );
break;
163 case 'K': msg += wxT(
"${KICAD_VERSION}" );
break;
164 case 'Z': msg += wxT(
"${PAPER}" );
break;
165 case 'S': msg += wxT(
"${#}" );
break;
166 case 'N': msg += wxT(
"${##}" );
break;
167 case 'F': msg += wxT(
"${FILENAME}" );
break;
168 case 'L': msg += wxT(
"${LAYER}" );
break;
169 case 'P': msg += wxT(
"${SHEETPATH}" );
break;
170 case 'Y': msg += wxT(
"${COMPANY}" );
break;
171 case 'T': msg += wxT(
"${TITLE}" );
break;
173 format = aTextbase[++ii];
177 case '0': msg += wxT(
"${COMMENT1}" );
break;
178 case '1': msg += wxT(
"${COMMENT2}" );
break;
179 case '2': msg += wxT(
"${COMMENT3}" );
break;
180 case '3': msg += wxT(
"${COMMENT4}" );
break;
181 case '4': msg += wxT(
"${COMMENT5}" );
break;
182 case '5': msg += wxT(
"${COMMENT6}" );
break;
183 case '6': msg += wxT(
"${COMMENT7}" );
break;
184 case '7': msg += wxT(
"${COMMENT8}" );
break;
185 case '8': msg += wxT(
"${COMMENT9}" );
break;
219 for( token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
221 if( token == T_LEFT )
232 case T_generator_version:
281 NeedSYMBOLorNUMBER();
288 Unexpected( CurText() );
301 if( aHeaderType == T_kicad_wks || aHeaderType == T_drawing_sheet )
307 if( tok == T_version )
315 Expecting( T_version );
330 for(
T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
348 case T_textlinewidth:
368 case T_bottom_margin:
374 Unexpected( CurText() );
387 for(
T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
389 if( token == T_LEFT )
395 NeedSYMBOLorNUMBER();
396 aItem->
m_Info = FromUTF8();
405 NeedSYMBOLorNUMBER();
406 aItem->
m_Name = FromUTF8();
445 Unexpected( CurText() );
458 for(
T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
460 if( token == T_LEFT )
473 Unexpected( CurText() );
485 for(
T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
487 if( token == T_LEFT )
493 NeedSYMBOLorNUMBER();
494 aItem->
m_Name = FromUTF8();
528 NeedSYMBOLorNUMBER();
529 aItem->
m_Info = FromUTF8();
541 data.reserve( 1 << 19 );
543 while( token != T_RIGHT )
545 if( !IsSymbol( token ) )
546 Expecting(
"base64 image data" );
552 wxMemoryBuffer buffer = wxBase64Decode( data );
569 Unexpected( CurText() );
580 for(
T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
582 if( token == T_LEFT )
588 NeedSYMBOLorNUMBER();
595 Unexpected( CurText() );
611 for(
T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
617 default: Unexpected( CurText() );
break;
625 for(
T token = NextTok(); token != T_RIGHT && token != EOF; token = NextTok() )
627 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;
884 if( token != T_NUMBER )
885 Expecting( T_NUMBER );
887 return atoi( CurText() );
897 else if( val > aMax )
908 if( token != T_NUMBER )
909 Expecting( T_NUMBER );
958 parser.
Parse(
this );
971 if( aFullFileName.IsEmpty() )
977 if( !wxFileExists( aFullFileName ) )
980 *aMsg =
_(
"File not found." );
987 wxFFile wksFile( aFullFileName, wxS(
"rb" ) );
989 if( ! wksFile.IsOpened() )
992 *aMsg =
_(
"File could not be opened." );
1000 size_t filelen = wksFile.Length();
1001 std::unique_ptr<char[]> buffer = std::make_unique<char[]>(filelen+10);
1003 if( wksFile.Read( buffer.get(), filelen ) != filelen )
1006 *aMsg =
_(
"Drawing sheet was not fully read." );
1021 parser.
Parse(
this );
1030 catch(
const std::bad_alloc& )
1033 *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)
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
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[]
wxString convertLegacyVariableRefs(const wxString &aTextbase)
#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)
macro which captures the "call site" values of FILE_, __FUNCTION & LINE
wxString ConvertToNewOverbarNotation(const wxString &aOldStr)
Convert the old ~...~ overbar notation to the new ~{...} one.
VECTOR2< double > VECTOR2D