Browse Source
Remove duplicate files.
Remove duplicate files.
Page layout editor: Add bitmap items to the page layout existing items. Now a bitmap image can be added to a page layout description. Currently the bitmap is expected having a 300 ppi definition. Note: not all plotters can plot a bitmap, and in this case the bounding box is plotted instead of the bitmappull/1/head
22 changed files with 478 additions and 878 deletions
-
23d-viewer/3d_canvas.cpp
-
33common/class_bitmap_base.cpp
-
15common/common_plot_functions.cpp
-
2common/page_layout/class_worksheet_dataitem.cpp
-
74common/page_layout/page_layout_graphic_items.cpp
-
113common/page_layout/page_layout_reader.cpp
-
4common/page_layout/page_layout_reader.keywords
-
15common/page_layout/title_block_shapes.cpp
-
198common/page_layout_default_description.cpp
-
623common/page_layout_reader.cpp
-
37common/page_layout_reader.keywords
-
20include/class_bitmap_base.h
-
43include/class_worksheet_dataitem.h
-
43include/worksheet_shape_builder.h
-
23pagelayout_editor/design_tree_frame.cpp
-
2pagelayout_editor/dialogs/dialog_new_dataitem.cpp
-
22pagelayout_editor/events_functions.cpp
-
9pagelayout_editor/onrightclick.cpp
-
34pagelayout_editor/page_layout_writer.cpp
-
35pagelayout_editor/pl_editor_frame.cpp
-
2pagelayout_editor/pl_editor_id.h
-
7pagelayout_editor/properties_frame.cpp
@ -1,198 +0,0 @@ |
|||||
/**
|
|
||||
* @file common/page_layout_default_description.cpp |
|
||||
*/ |
|
||||
|
|
||||
/*
|
|
||||
* This program source code file is part of KiCad, a free EDA CAD application. |
|
||||
* |
|
||||
* Copyright (C) 1992-2013 Jean-Pierre Charras <jp.charras at wanadoo.fr>. |
|
||||
* Copyright (C) 1992-2013 KiCad Developers, see change_log.txt for contributors. |
|
||||
* |
|
||||
* |
|
||||
* This program is free software; you can redistribute it and/or |
|
||||
* modify it under the terms of the GNU General Public License |
|
||||
* as published by the Free Software Foundation; either version 2 |
|
||||
* of the License, or (at your option) any later version. |
|
||||
* |
|
||||
* This program is distributed in the hope that it will be useful, |
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
* GNU General Public License for more details. |
|
||||
* |
|
||||
* You should have received a copy of the GNU General Public License |
|
||||
* along with this program; if not, you may find one here: |
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
|
||||
* or you may write to the Free Software Foundation, Inc., |
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|
||||
*/ |
|
||||
|
|
||||
/* keyword used in page layout description are (see page_layout_reader.keywords)
|
|
||||
* page_layout |
|
||||
* setup |
|
||||
* linewidth |
|
||||
* textlinewidth |
|
||||
* textsize |
|
||||
* comment |
|
||||
* line |
|
||||
* rect |
|
||||
* polygon |
|
||||
* tbtext |
|
||||
* ltcorner |
|
||||
* lbcorner |
|
||||
* rbcorner |
|
||||
* rtcorner |
|
||||
* name |
|
||||
* pos |
|
||||
* start |
|
||||
* end |
|
||||
* pts |
|
||||
* xy |
|
||||
* maxlen |
|
||||
* maxheight |
|
||||
* font |
|
||||
* bold |
|
||||
* italic |
|
||||
* size |
|
||||
* justify |
|
||||
* left |
|
||||
* center |
|
||||
* right |
|
||||
* top |
|
||||
* bottom |
|
||||
* rotate |
|
||||
* repeat |
|
||||
* incrx |
|
||||
* incry |
|
||||
* incrlabel |
|
||||
*/ |
|
||||
/*
|
|
||||
* Items use coordinates. |
|
||||
* A coordinate is defined relative to a page corner |
|
||||
* A coordinate is the X pos, the Y pos, and the corner which is the coordinate origin |
|
||||
* the default is the bottom right corner |
|
||||
* example: (start 10 0 ltcorner) or (start 20 10) |
|
||||
* The direction depends on the corner: a positive coordinate define a point |
|
||||
* from the corner origin, to the opposite corner. |
|
||||
* |
|
||||
* Items are defined by a name, coordinates in mm and some attributes, |
|
||||
* and can be repeated. |
|
||||
* for instance (repeat 2) (incrx 2) (incry 2) repeat the item 2 times, |
|
||||
* and coordinates are incremented by 2 on X direction, and 2 on Y direction |
|
||||
* Comments are allowed. they are inside (), and start by the keyword comment |
|
||||
* example: |
|
||||
* (comment rect around the title block) |
|
||||
* |
|
||||
* Lines and rect are defined by 2 coordinates start and end, and attributes. |
|
||||
* Attributes are linewidth and repeat parameters. |
|
||||
* example: |
|
||||
* (line (start 50 2 ltcorner) (end 50 0 ltcorner) (repeat 30) (incrx 50) ) |
|
||||
* (rect (comment rect around the title block) (linewidth 0.15) (start 110 34) (end 2 2) ) |
|
||||
* |
|
||||
* Texts are defined by the text (between quotes), the position, and attributes |
|
||||
* example |
|
||||
* "(tbtext \"1\" (pos 25 1 lbcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50) )" |
|
||||
* the text can be rotated by (rotation <value>) with value = rot angle in degrees |
|
||||
* (font (size 1.3 1.3) bold italic) defines a specific size, |
|
||||
* with bold and italic options |
|
||||
* (justify <justif keyword>) controls the text justification (the default is left) |
|
||||
* justif keyword is center, left, right, top and bottom |
|
||||
* (justify center top) is a text centered on X axis and top aligned on vertical axis |
|
||||
* The text size can be constrained: |
|
||||
* (maxlen <value>) and (maxheight <value>) force the actual text x and/or y size to be |
|
||||
* reduced to limit the text height to the maxheight value, |
|
||||
* and the full text x size to the maxlen value. |
|
||||
* If the actual text size is smaller than limits, its size is not modified. |
|
||||
* |
|
||||
* Texts can include a format symbol, a la printf. |
|
||||
* At run time these format symbols will be replaced by their actual value. |
|
||||
* |
|
||||
* format symbols are: |
|
||||
* |
|
||||
* %% = replaced by % |
|
||||
* %K = Kicad version |
|
||||
* %Z = paper format name (A4, USLetter ...) |
|
||||
* %Y = company name |
|
||||
* %D = date |
|
||||
* %R = revision |
|
||||
* %S = sheet number |
|
||||
* %N = number of sheets |
|
||||
* %Cx = comment (x = 0 to 9 to identify the comment) |
|
||||
* %F = filename |
|
||||
* %P = sheet path (sheet full name) |
|
||||
* %T = title |
|
||||
* |
|
||||
* example: |
|
||||
* (tbtext \"Size: %Z\" ...) displays "Size A4" or Size USLetter" |
|
||||
* |
|
||||
* Poly Polygons |
|
||||
* Set of filled polygons are supported. |
|
||||
* |
|
||||
* The main purpose is to allow logos, or complex shapes |
|
||||
* They support the repeat and rotation options |
|
||||
* They are defined by |
|
||||
* (polygon (position ..) <rotation> <linewidth> |
|
||||
* the parameter linewidth defines the pen size used to draw/plot |
|
||||
* the polygon outlines (default = 0) |
|
||||
* example: |
|
||||
* (polygon (pos 134 18 rbcorner) (rotate 20) (linewidth 0.00254) |
|
||||
* |
|
||||
* and a list of corners like |
|
||||
* (pts (xy 20.574 8.382) (xy 19.9009 8.382) (xy 19.9009 6.26364) (xy 19.7485 5.98932) |
|
||||
* .... ) |
|
||||
* |
|
||||
* each sequence like |
|
||||
* (pts (xy 20.574 8.382) (xy 19.9009 8.382) (xy 19.9009 6.26364) (xy 19.7485 5.98932) |
|
||||
* .... ) |
|
||||
* defines a polygon. |
|
||||
* Each coordinate is relative to the polygon position. |
|
||||
* Therefore a "polygon" is in fact a set of polygons, of a poly polygon |
|
||||
* |
|
||||
*/ |
|
||||
|
|
||||
#include <worksheet.h> // defaultPageLayout
|
|
||||
|
|
||||
|
|
||||
// height of the band reference grid 2.0 mm
|
|
||||
// worksheet frame reference text size 1.3 mm
|
|
||||
// default text size 1.5 mm
|
|
||||
// default line width 0.15 mm
|
|
||||
// frame ref pitch 50 mm
|
|
||||
|
|
||||
// export defaultPageLayout:
|
|
||||
extern const char defaultPageLayout[]; |
|
||||
|
|
||||
// Default page layout (sizes are in mm)
|
|
||||
const char defaultPageLayout[] = "( page_layout\n" |
|
||||
"(setup (textsize 1.5 1.5) (linewidth 0.15) (textlinewidth 0.15) )" |
|
||||
"(rect (comment \"rect around the title block\") (linewidth 0.15) (start 110 34) (end 2 2) )\n" |
|
||||
"(rect (start 0 0 ltcorner) (end 0 0 rbcorner) (repeat 2) (incrx 2) (incry 2) )\n" |
|
||||
"(line (start 50 2 ltcorner) (end 50 0 ltcorner) (repeat 30) (incrx 50) )\n" |
|
||||
"(tbtext \"1\" (pos 25 1 ltcorner) (font (size 1.3 1.3))(repeat 100) (incrx 50) )\n" |
|
||||
"(line (start 50 2 lbcorner) (end 50 0 lbcorner) (repeat 30) (incrx 50) )\n" |
|
||||
"(tbtext \"1\" (pos 25 1 lbcorner) (font (size 1.3 1.3)) (repeat 100) (incrx 50) )\n" |
|
||||
"(line (start 0 50 ltcorner) (end 2 50 ltcorner) (repeat 30) (incry 50) )\n" |
|
||||
"(tbtext \"A\" (pos 1 25 ltcorner) (font (size 1.3 1.3)) (justify center)(repeat 100) (incry 50) )\n" |
|
||||
"(line (start 0 50 rtcorner) (end 2 50 rtcorner) (repeat 30) (incry 50) )\n" |
|
||||
"(tbtext \"A\" (pos 1 25 rtcorner) (font (size 1.3 1.3)) (justify center) (repeat 100) (incry 50) )\n" |
|
||||
"(tbtext \"Date: %D\" (pos 87 6.9) )\n" |
|
||||
"(line (start 110 5.5) end 2 5.5) )\n" |
|
||||
"(tbtext \"%K\" (pos 109 4.1) (comment \"Kicad version\" ) )\n" |
|
||||
"(line (start 110 8.5) end 2 8.5) )\n" |
|
||||
"(tbtext \"Rev: %R\" (pos 24 6.9)(font bold)(justify left) )\n" |
|
||||
"(tbtext \"Size: %Z\" (comment \"Paper format name\")(pos 109 6.9) )\n" |
|
||||
"(tbtext \"Id: %S/%N\" (comment \"Sheet id\")(pos 24 4.1) )\n" |
|
||||
"(line (start 110 12.5) end 2 12.5) )\n" |
|
||||
"(tbtext \"Title: %T\" (pos 109 10.7)(font bold italic (size 2 2)) )\n" |
|
||||
"(tbtext \"File: %F\" (pos 109 14.3) )\n" |
|
||||
"(line (start 110 18.5) end 2 18.5) )\n" |
|
||||
"(tbtext \"Sheet: %P\" (pos 109 17) )\n" |
|
||||
"(tbtext \"%Y\" (comment \"Company name\") (pos 109 20)(font bold) )\n" |
|
||||
"(tbtext \"%C0\" (comment \"Comment 0\") (pos 109 23) )\n" |
|
||||
"(tbtext \"%C1\" (comment \"Comment 1\") (pos 109 26) )\n" |
|
||||
"(tbtext \"%C2\" (comment \"Comment 2\") (pos 109 29) )\n" |
|
||||
"(tbtext \"%C3\" (comment \"Comment 3\") (pos 109 32) )\n" |
|
||||
"(line (start 90 8.5) end 90 5.5) )\n" |
|
||||
"(line (start 26 8.5) end 26 2) )\n" |
|
||||
")\n" |
|
||||
; |
|
||||
@ -1,623 +0,0 @@ |
|||||
/**
|
|
||||
* @file common/page_layout_reader.cpp |
|
||||
* @brief read an S expression of description of graphic items and texts |
|
||||
* to build a title block and page layout |
|
||||
*/ |
|
||||
|
|
||||
/*
|
|
||||
* This program source code file is part of KiCad, a free EDA CAD application. |
|
||||
* |
|
||||
* Copyright (C) 1992-2013 Jean-Pierre Charras <jp.charras at wanadoo.fr>. |
|
||||
* Copyright (C) 1992-2013 KiCad Developers, see change_log.txt for contributors. |
|
||||
* |
|
||||
* |
|
||||
* This program is free software; you can redistribute it and/or |
|
||||
* modify it under the terms of the GNU General Public License |
|
||||
* as published by the Free Software Foundation; either version 2 |
|
||||
* of the License, or (at your option) any later version. |
|
||||
* |
|
||||
* This program is distributed in the hope that it will be useful, |
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||
* GNU General Public License for more details. |
|
||||
* |
|
||||
* You should have received a copy of the GNU General Public License |
|
||||
* along with this program; if not, you may find one here: |
|
||||
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
||||
* or you may search the http://www.gnu.org website for the version 2 license,
|
|
||||
* or you may write to the Free Software Foundation, Inc., |
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA |
|
||||
*/ |
|
||||
|
|
||||
#include <fctsys.h>
|
|
||||
#include <base_struct.h>
|
|
||||
#include <worksheet.h>
|
|
||||
#include <worksheet_shape_builder.h>
|
|
||||
#include <vector2d.h>
|
|
||||
#include <page_layout_reader_lexer.h>
|
|
||||
|
|
||||
|
|
||||
using namespace TB_READER_T; |
|
||||
|
|
||||
/**
|
|
||||
* Class PAGE_LAYOUT_READER_PARSER |
|
||||
* holds data and functions pertinent to parsing a S-expression file |
|
||||
* for a WORKSHEET_LAYOUT. |
|
||||
*/ |
|
||||
class PAGE_LAYOUT_READER_PARSER : public PAGE_LAYOUT_READER_LEXER |
|
||||
{ |
|
||||
DSIZE m_defaultTextSize; // Default text size, when not defined inside a tbtext
|
|
||||
double m_defaultLineWidth; |
|
||||
double m_defaulTextLineWidth; |
|
||||
|
|
||||
public: |
|
||||
PAGE_LAYOUT_READER_PARSER( const char* aLine, const wxString& aSource ); |
|
||||
void Parse( WORKSHEET_LAYOUT* aLayout ) |
|
||||
throw( PARSE_ERROR, IO_ERROR ); |
|
||||
|
|
||||
private: |
|
||||
|
|
||||
/**
|
|
||||
* Function parseInt |
|
||||
* parses an integer and constrains it between two values. |
|
||||
* @param aMin is the smallest return value. |
|
||||
* @param aMax is the largest return value. |
|
||||
* @return int - the parsed integer. |
|
||||
*/ |
|
||||
int parseInt( int aMin, int aMax ); |
|
||||
|
|
||||
/**
|
|
||||
* Function parseDouble |
|
||||
* parses a double |
|
||||
* @return double - the parsed double. |
|
||||
*/ |
|
||||
double parseDouble(); |
|
||||
|
|
||||
void parseSetup() throw( IO_ERROR, PARSE_ERROR ); |
|
||||
void parseGraphic( WORKSHEET_DATAITEM * aItem ) throw( IO_ERROR, PARSE_ERROR ); |
|
||||
void parseText( WORKSHEET_DATAITEM_TEXT * aItem ) throw( IO_ERROR, PARSE_ERROR ); |
|
||||
void parsePolygon( WORKSHEET_DATAITEM_POLYPOLYGON * aItem ) |
|
||||
throw( IO_ERROR, PARSE_ERROR ); |
|
||||
void parsePolyOutline( WORKSHEET_DATAITEM_POLYPOLYGON * aItem ) |
|
||||
throw( IO_ERROR, PARSE_ERROR ); |
|
||||
void parseCoordinate( POINT_COORD& aCoord) throw( IO_ERROR, PARSE_ERROR ); |
|
||||
}; |
|
||||
|
|
||||
// PCB_PLOT_PARAMS_PARSER
|
|
||||
|
|
||||
PAGE_LAYOUT_READER_PARSER::PAGE_LAYOUT_READER_PARSER( const char* aLine, const wxString& aSource ) : |
|
||||
PAGE_LAYOUT_READER_LEXER( aLine, aSource ) |
|
||||
{ |
|
||||
m_defaultTextSize.x = m_defaultTextSize.y = TB_DEFAULT_TEXTSIZE; |
|
||||
m_defaultLineWidth = 0.0; |
|
||||
m_defaulTextLineWidth = 0.0; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
void PAGE_LAYOUT_READER_PARSER::Parse( WORKSHEET_LAYOUT* aLayout ) |
|
||||
throw( PARSE_ERROR, IO_ERROR ) |
|
||||
{ |
|
||||
T token; |
|
||||
WORKSHEET_DATAITEM * item; |
|
||||
|
|
||||
LOCALE_IO toggle; |
|
||||
|
|
||||
while( ( token = NextTok() ) != T_RIGHT ) |
|
||||
{ |
|
||||
if( token == T_EOF) |
|
||||
break; |
|
||||
|
|
||||
if( token == T_LEFT ) |
|
||||
token = NextTok(); |
|
||||
|
|
||||
if( token == T_page_layout ) |
|
||||
continue; |
|
||||
|
|
||||
switch( token ) |
|
||||
{ |
|
||||
case T_setup: // Defines default values for graphic items
|
|
||||
parseSetup(); |
|
||||
break; |
|
||||
|
|
||||
case T_line: |
|
||||
item = new WORKSHEET_DATAITEM( WORKSHEET_DATAITEM::WS_SEGMENT ); |
|
||||
parseGraphic( item ); |
|
||||
aLayout->Append( item ); |
|
||||
break; |
|
||||
|
|
||||
case T_rect: |
|
||||
item = new WORKSHEET_DATAITEM( WORKSHEET_DATAITEM::WS_RECT ); |
|
||||
parseGraphic( item ); |
|
||||
aLayout->Append( item ); |
|
||||
break; |
|
||||
|
|
||||
case T_polygon: |
|
||||
item = new WORKSHEET_DATAITEM_POLYPOLYGON(); |
|
||||
parsePolygon( (WORKSHEET_DATAITEM_POLYPOLYGON*) item ); |
|
||||
aLayout->Append( item ); |
|
||||
break; |
|
||||
|
|
||||
case T_tbtext: |
|
||||
NeedSYMBOLorNUMBER(); |
|
||||
item = new WORKSHEET_DATAITEM_TEXT( FromUTF8() ); |
|
||||
parseText( (WORKSHEET_DATAITEM_TEXT*) item ); |
|
||||
aLayout->Append( item ); |
|
||||
break; |
|
||||
|
|
||||
default: |
|
||||
Unexpected( CurText() ); |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
void PAGE_LAYOUT_READER_PARSER::parseSetup() throw( IO_ERROR, PARSE_ERROR ) |
|
||||
{ |
|
||||
T token; |
|
||||
while( ( token = NextTok() ) != T_RIGHT ) |
|
||||
{ |
|
||||
if( token == T_EOF) |
|
||||
break; |
|
||||
|
|
||||
switch( token ) |
|
||||
{ |
|
||||
case T_LEFT: |
|
||||
break; |
|
||||
|
|
||||
case T_linewidth: |
|
||||
m_defaultLineWidth = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_textsize: |
|
||||
m_defaultTextSize.x = parseDouble(); |
|
||||
m_defaultTextSize.y = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_textlinewidth: |
|
||||
m_defaulTextLineWidth = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
default: |
|
||||
Unexpected( CurText() ); |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
void PAGE_LAYOUT_READER_PARSER::parsePolygon( WORKSHEET_DATAITEM_POLYPOLYGON * aItem ) |
|
||||
throw( IO_ERROR, PARSE_ERROR ) |
|
||||
{ |
|
||||
aItem->m_LineWidth = 0; |
|
||||
|
|
||||
T token; |
|
||||
|
|
||||
while( ( token = NextTok() ) != T_RIGHT ) |
|
||||
{ |
|
||||
if( token == T_EOF) |
|
||||
break; |
|
||||
|
|
||||
if( token == T_LEFT ) |
|
||||
token = NextTok(); |
|
||||
|
|
||||
switch( token ) |
|
||||
{ |
|
||||
case T_comment: // Comment, search the closing ')'
|
|
||||
while( ( token = NextTok() ) != T_RIGHT && token != T_EOF ); |
|
||||
break; |
|
||||
|
|
||||
case T_pos: |
|
||||
parseCoordinate( aItem->m_Pos ); |
|
||||
break; |
|
||||
|
|
||||
case T_pts: |
|
||||
parsePolyOutline( aItem ); |
|
||||
aItem->CloseContour(); |
|
||||
break; |
|
||||
|
|
||||
case T_rotate: |
|
||||
aItem->m_Orient = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_repeat: |
|
||||
aItem->m_RepeatCount = parseInt( -1, 100 ); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_incrx: |
|
||||
aItem->m_IncrementVector.x = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_incry: |
|
||||
aItem->m_IncrementVector.y = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_linewidth: |
|
||||
aItem->m_LineWidth = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
default: |
|
||||
Unexpected( CurText() ); |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
aItem->SetBoundingBox(); |
|
||||
} |
|
||||
|
|
||||
void PAGE_LAYOUT_READER_PARSER::parsePolyOutline( WORKSHEET_DATAITEM_POLYPOLYGON * aItem ) |
|
||||
throw( IO_ERROR, PARSE_ERROR ) |
|
||||
{ |
|
||||
DPOINT corner; |
|
||||
T token; |
|
||||
|
|
||||
while( ( token = NextTok() ) != T_RIGHT ) |
|
||||
{ |
|
||||
if( token == T_EOF) |
|
||||
break; |
|
||||
|
|
||||
if( token == T_LEFT ) |
|
||||
token = NextTok(); |
|
||||
|
|
||||
switch( token ) |
|
||||
{ |
|
||||
case T_xy: |
|
||||
corner.x = parseDouble(); |
|
||||
corner.y = parseDouble(); |
|
||||
aItem->AppendCorner( corner ); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
default: |
|
||||
Unexpected( CurText() ); |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
void PAGE_LAYOUT_READER_PARSER::parseGraphic( WORKSHEET_DATAITEM * aItem ) |
|
||||
throw( IO_ERROR, PARSE_ERROR ) |
|
||||
{ |
|
||||
T token; |
|
||||
|
|
||||
aItem->m_LineWidth = m_defaultLineWidth; |
|
||||
|
|
||||
while( ( token = NextTok() ) != T_RIGHT ) |
|
||||
{ |
|
||||
if( token == T_EOF) |
|
||||
break; |
|
||||
|
|
||||
if( token == T_LEFT ) |
|
||||
token = NextTok(); |
|
||||
|
|
||||
switch( token ) |
|
||||
{ |
|
||||
case T_comment: // Comment, search the closing ')'
|
|
||||
while( ( token = NextTok() ) != T_RIGHT && token != T_EOF ); |
|
||||
break; |
|
||||
|
|
||||
case T_start: |
|
||||
parseCoordinate( aItem->m_Pos ); |
|
||||
break; |
|
||||
|
|
||||
case T_end: |
|
||||
parseCoordinate( aItem->m_End ); |
|
||||
break; |
|
||||
|
|
||||
case T_repeat: |
|
||||
aItem->m_RepeatCount = parseInt( -1, 100 ); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_incrx: |
|
||||
aItem->m_IncrementVector.x = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_incry: |
|
||||
aItem->m_IncrementVector.y = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_linewidth: |
|
||||
aItem->m_LineWidth = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
default: |
|
||||
Unexpected( CurText() ); |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
|
|
||||
void PAGE_LAYOUT_READER_PARSER::parseText( WORKSHEET_DATAITEM_TEXT* aItem ) |
|
||||
throw( IO_ERROR, PARSE_ERROR ) |
|
||||
{ |
|
||||
T token; |
|
||||
|
|
||||
aItem->m_TextSize = m_defaultTextSize; |
|
||||
aItem->m_LineWidth = m_defaulTextLineWidth; |
|
||||
|
|
||||
while( ( token = NextTok() ) != T_RIGHT ) |
|
||||
{ |
|
||||
if( token == T_EOF) |
|
||||
break; |
|
||||
|
|
||||
if( token == T_LEFT ) |
|
||||
token = NextTok(); |
|
||||
|
|
||||
switch( token ) |
|
||||
{ |
|
||||
case T_comment: // Comment, search the closing ')'
|
|
||||
while( ( token = NextTok() ) != T_RIGHT && token != T_EOF ); |
|
||||
break; |
|
||||
|
|
||||
case T_pos: |
|
||||
parseCoordinate( aItem->m_Pos ); |
|
||||
break; |
|
||||
|
|
||||
case T_repeat: |
|
||||
aItem->m_RepeatCount = parseInt( -1, 100 ); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_incrx: |
|
||||
aItem->m_IncrementVector.x = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_incry: |
|
||||
aItem->m_IncrementVector.y = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_incrlabel: |
|
||||
aItem->m_IncrementLabel = parseInt(INT_MIN, INT_MAX); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_maxlen: |
|
||||
aItem->m_BoundingBoxSize.x = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_maxheight: |
|
||||
aItem->m_BoundingBoxSize.y = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_font: |
|
||||
while( ( token = NextTok() ) != T_RIGHT ) |
|
||||
{ |
|
||||
if( token == T_EOF) |
|
||||
break; |
|
||||
|
|
||||
switch( token ) |
|
||||
{ |
|
||||
case T_LEFT: |
|
||||
break; |
|
||||
|
|
||||
case T_bold: |
|
||||
aItem->m_Flags |= USE_BOLD; |
|
||||
break; |
|
||||
|
|
||||
case T_italic: |
|
||||
aItem->m_Flags |= USE_ITALIC; |
|
||||
break; |
|
||||
|
|
||||
case T_size: |
|
||||
aItem->m_TextSize.x = parseDouble(); |
|
||||
aItem->m_TextSize.y = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
case T_linewidth: |
|
||||
aItem->m_LineWidth = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
default: |
|
||||
Unexpected( CurText() ); |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
break; |
|
||||
|
|
||||
case T_justify: |
|
||||
while( ( token = NextTok() ) != T_RIGHT ) |
|
||||
{ |
|
||||
if( token == T_EOF) |
|
||||
break; |
|
||||
|
|
||||
switch( token ) |
|
||||
{ |
|
||||
case T_center: |
|
||||
aItem->m_Hjustify = GR_TEXT_HJUSTIFY_CENTER; |
|
||||
aItem->m_Vjustify = GR_TEXT_VJUSTIFY_CENTER; |
|
||||
break; |
|
||||
|
|
||||
case T_left: |
|
||||
aItem->m_Hjustify = GR_TEXT_HJUSTIFY_LEFT; |
|
||||
break; |
|
||||
|
|
||||
case T_right: |
|
||||
aItem->m_Hjustify = GR_TEXT_HJUSTIFY_RIGHT; |
|
||||
break; |
|
||||
|
|
||||
case T_top: |
|
||||
aItem->m_Vjustify = GR_TEXT_VJUSTIFY_TOP; |
|
||||
break; |
|
||||
|
|
||||
case T_bottom: |
|
||||
aItem->m_Vjustify = GR_TEXT_VJUSTIFY_BOTTOM; |
|
||||
break; |
|
||||
|
|
||||
default: |
|
||||
Unexpected( CurText() ); |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
break; |
|
||||
|
|
||||
case T_rotate: |
|
||||
aItem->m_Orient = parseDouble(); |
|
||||
NeedRIGHT(); |
|
||||
break; |
|
||||
|
|
||||
default: |
|
||||
Unexpected( CurText() ); |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
// parse an expression like " 25 1 ltcorner)"
|
|
||||
void PAGE_LAYOUT_READER_PARSER::parseCoordinate( POINT_COORD& aCoord) |
|
||||
throw( IO_ERROR, PARSE_ERROR ) |
|
||||
{ |
|
||||
T token; |
|
||||
|
|
||||
aCoord.m_Pos.x = parseDouble(); |
|
||||
aCoord.m_Pos.y = parseDouble(); |
|
||||
|
|
||||
while( ( token = NextTok() ) != T_RIGHT ) |
|
||||
{ |
|
||||
switch( token ) |
|
||||
{ |
|
||||
case T_ltcorner: |
|
||||
aCoord.m_Anchor = LT_CORNER; // left top corner
|
|
||||
break; |
|
||||
|
|
||||
case T_lbcorner: |
|
||||
aCoord.m_Anchor = LB_CORNER; // left bottom corner
|
|
||||
break; |
|
||||
|
|
||||
case T_rbcorner: |
|
||||
aCoord.m_Anchor = RB_CORNER; // right bottom corner
|
|
||||
break; |
|
||||
|
|
||||
case T_rtcorner: |
|
||||
aCoord.m_Anchor = RT_CORNER; // right top corner
|
|
||||
break; |
|
||||
|
|
||||
default: |
|
||||
Unexpected( CurText() ); |
|
||||
break; |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
int PAGE_LAYOUT_READER_PARSER::parseInt( int aMin, int aMax ) |
|
||||
{ |
|
||||
T token = NextTok(); |
|
||||
|
|
||||
if( token != T_NUMBER ) |
|
||||
Expecting( T_NUMBER ); |
|
||||
|
|
||||
int val = atoi( CurText() ); |
|
||||
|
|
||||
if( val < aMin ) |
|
||||
val = aMin; |
|
||||
else if( val > aMax ) |
|
||||
val = aMax; |
|
||||
|
|
||||
return val; |
|
||||
} |
|
||||
|
|
||||
|
|
||||
double PAGE_LAYOUT_READER_PARSER::parseDouble() |
|
||||
{ |
|
||||
T token = NextTok(); |
|
||||
|
|
||||
if( token != T_NUMBER ) |
|
||||
Expecting( T_NUMBER ); |
|
||||
|
|
||||
double val = strtod( CurText(), NULL ); |
|
||||
|
|
||||
return val; |
|
||||
} |
|
||||
|
|
||||
// defaultPageLayout is the default page layout description
|
|
||||
// using the S expr.
|
|
||||
// see page_layout_default_shape.cpp
|
|
||||
extern const char defaultPageLayout[]; |
|
||||
|
|
||||
void WORKSHEET_LAYOUT::SetDefaultLayout() |
|
||||
{ |
|
||||
ClearList(); |
|
||||
PAGE_LAYOUT_READER_PARSER lp_parser( defaultPageLayout, wxT( "default page" ) ); |
|
||||
|
|
||||
try |
|
||||
{ |
|
||||
lp_parser.Parse( this ); |
|
||||
} |
|
||||
catch( IO_ERROR ioe ) |
|
||||
{ |
|
||||
wxLogMessage( ioe.errorText ); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
#include <wx/file.h>
|
|
||||
|
|
||||
// SetLayout() try to load a custom layout file,
|
|
||||
// currently defined by the environment variable KICAD_WKSFILE
|
|
||||
// (a *.kicad_wks file).
|
|
||||
// if does not exists, loads the default page layout.
|
|
||||
void WORKSHEET_LAYOUT::SetLayout() |
|
||||
{ |
|
||||
wxString fullFileName; |
|
||||
wxGetEnv( wxT( "KICAD_WKSFILE" ), &fullFileName ); |
|
||||
|
|
||||
if( fullFileName.IsEmpty() || !wxFileExists( fullFileName ) ) |
|
||||
{ |
|
||||
#if 0
|
|
||||
if( !fullFileName.IsEmpty() ) |
|
||||
{ |
|
||||
wxLogMessage( wxT("Page layout file <%s> not found"), |
|
||||
fullFileName.GetData() ); |
|
||||
} |
|
||||
#endif
|
|
||||
SetDefaultLayout(); |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
wxFile wksFile( fullFileName ); |
|
||||
|
|
||||
if( ! wksFile.IsOpened() ) |
|
||||
{ |
|
||||
SetDefaultLayout(); |
|
||||
return; |
|
||||
} |
|
||||
|
|
||||
int filelen = wksFile.Length(); |
|
||||
char * buffer = new char[filelen+10]; |
|
||||
|
|
||||
if( wksFile.Read( buffer, filelen ) != filelen ) |
|
||||
wxLogMessage( _("The file <%s> was not fully read"), |
|
||||
fullFileName.GetData() ); |
|
||||
else |
|
||||
{ |
|
||||
buffer[filelen]=0; |
|
||||
ClearList(); |
|
||||
PAGE_LAYOUT_READER_PARSER lp_parser( buffer, fullFileName ); |
|
||||
|
|
||||
try |
|
||||
{ |
|
||||
lp_parser.Parse( this ); |
|
||||
} |
|
||||
catch( IO_ERROR ioe ) |
|
||||
{ |
|
||||
wxLogMessage( ioe.errorText ); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
delete[] buffer; |
|
||||
} |
|
||||
@ -1,37 +0,0 @@ |
|||||
page_layout |
|
||||
setup |
|
||||
linewidth |
|
||||
textlinewidth |
|
||||
textsize |
|
||||
comment |
|
||||
line |
|
||||
rect |
|
||||
polygon |
|
||||
tbtext |
|
||||
ltcorner |
|
||||
lbcorner |
|
||||
rbcorner |
|
||||
rtcorner |
|
||||
name |
|
||||
pos |
|
||||
start |
|
||||
end |
|
||||
pts |
|
||||
xy |
|
||||
maxlen |
|
||||
maxheight |
|
||||
font |
|
||||
bold |
|
||||
italic |
|
||||
size |
|
||||
justify |
|
||||
left |
|
||||
center |
|
||||
right |
|
||||
top |
|
||||
bottom |
|
||||
rotate |
|
||||
repeat |
|
||||
incrx |
|
||||
incry |
|
||||
incrlabel |
|
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue