KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sch_io_kicad_sexpr_common.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software: you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation, either version 3 of the License, or (at your
9 * option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include <base_units.h>
21#include <macros.h>
22#include <schematic_lexer.h>
24#include <string_utils.h>
25
26
27using namespace TSCHEMATIC_T;
28
29
30static const char* emptyString = "";
31
32
33void formatFill( OUTPUTFORMATTER* aFormatter, FILL_T aFillMode, const COLOR4D& aFillColor )
34{
35 const char* fillType;
36
37 switch( aFillMode )
38 {
39 default:
40 case FILL_T::NO_FILL: fillType = "none"; break;
41 case FILL_T::FILLED_SHAPE: fillType = "outline"; break;
42 case FILL_T::FILLED_WITH_BG_BODYCOLOR: fillType = "background"; break;
43 case FILL_T::FILLED_WITH_COLOR: fillType = "color"; break;
44 }
45
46 if( aFillMode == FILL_T::FILLED_WITH_COLOR )
47 {
48 aFormatter->Print( "(fill (type %s) (color %d %d %d %s))",
49 fillType,
50 KiROUND( aFillColor.r * 255.0 ),
51 KiROUND( aFillColor.g * 255.0 ),
52 KiROUND( aFillColor.b * 255.0 ),
53 FormatDouble2Str( aFillColor.a ).c_str() );
54 }
55 else
56 {
57 aFormatter->Print( "(fill (type %s))",
58 fillType );
59 }
60}
61
62
64{
65 switch( aType )
66 {
68 return SCHEMATIC_LEXER::TokenName( T_input );
69
71 return SCHEMATIC_LEXER::TokenName( T_output );
72
74 return SCHEMATIC_LEXER::TokenName( T_bidirectional );
75
77 return SCHEMATIC_LEXER::TokenName( T_tri_state );
78
80 return SCHEMATIC_LEXER::TokenName( T_passive );
81
83 return SCHEMATIC_LEXER::TokenName( T_free );
84
86 return SCHEMATIC_LEXER::TokenName( T_unspecified );
87
89 return SCHEMATIC_LEXER::TokenName( T_power_in );
90
92 return SCHEMATIC_LEXER::TokenName( T_power_out );
93
95 return SCHEMATIC_LEXER::TokenName( T_open_collector );
96
98 return SCHEMATIC_LEXER::TokenName( T_open_emitter );
99
101 return SCHEMATIC_LEXER::TokenName( T_no_connect );
102
103 default:
104 wxFAIL_MSG( "Missing symbol library pin connection type" );
105 }
106
107 return emptyString;
108}
109
110
112{
113 switch( aShape )
114 {
116 return SCHEMATIC_LEXER::TokenName( T_line );
117
119 return SCHEMATIC_LEXER::TokenName( T_inverted );
120
122 return SCHEMATIC_LEXER::TokenName( T_clock );
123
125 return SCHEMATIC_LEXER::TokenName( T_inverted_clock );
126
128 return SCHEMATIC_LEXER::TokenName( T_input_low );
129
131 return SCHEMATIC_LEXER::TokenName( T_clock_low );
132
134 return SCHEMATIC_LEXER::TokenName( T_output_low );
135
137 return SCHEMATIC_LEXER::TokenName( T_edge_clock_high );
138
140 return SCHEMATIC_LEXER::TokenName( T_non_logic );
141
142 default:
143 wxFAIL_MSG( "Missing symbol library pin shape type" );
144 }
145
146 return emptyString;
147}
148
149
151{
152 switch( aOrientation )
153 {
158 default: wxFAIL_MSG( "Missing symbol library pin orientation type" ); return ANGLE_0;
159 }
160}
161
162
164{
165 switch( aShape )
166 {
167 case LABEL_FLAG_SHAPE::L_INPUT: return SCHEMATIC_LEXER::TokenName( T_input );
168 case LABEL_FLAG_SHAPE::L_OUTPUT: return SCHEMATIC_LEXER::TokenName( T_output );
169 case LABEL_FLAG_SHAPE::L_BIDI: return SCHEMATIC_LEXER::TokenName( T_bidirectional );
170 case LABEL_FLAG_SHAPE::L_TRISTATE: return SCHEMATIC_LEXER::TokenName( T_tri_state );
171 case LABEL_FLAG_SHAPE::L_UNSPECIFIED: return SCHEMATIC_LEXER::TokenName( T_passive );
172 case LABEL_FLAG_SHAPE::F_DOT: return SCHEMATIC_LEXER::TokenName( T_dot );
173 case LABEL_FLAG_SHAPE::F_ROUND: return SCHEMATIC_LEXER::TokenName( T_round );
174 case LABEL_FLAG_SHAPE::F_DIAMOND: return SCHEMATIC_LEXER::TokenName( T_diamond );
175 case LABEL_FLAG_SHAPE::F_RECTANGLE: return SCHEMATIC_LEXER::TokenName( T_rectangle );
176 default: wxFAIL; return SCHEMATIC_LEXER::TokenName( T_passive );
177 }
178}
179
180
182{
183 switch( aSide )
184 {
186 case SHEET_SIDE::LEFT: return ANGLE_180;
187 case SHEET_SIDE::RIGHT: return ANGLE_0;
188 case SHEET_SIDE::TOP: return ANGLE_90;
189 case SHEET_SIDE::BOTTOM: return ANGLE_270;
190 default: wxFAIL; return ANGLE_0;
191 }
192}
193
194
195const char* getTextTypeToken( KICAD_T aType )
196{
197 switch( aType )
198 {
199 case SCH_TEXT_T: return SCHEMATIC_LEXER::TokenName( T_text );
200 case SCH_LABEL_T: return SCHEMATIC_LEXER::TokenName( T_label );
201 case SCH_GLOBAL_LABEL_T: return SCHEMATIC_LEXER::TokenName( T_global_label );
202 case SCH_HIER_LABEL_T: return SCHEMATIC_LEXER::TokenName( T_hierarchical_label );
203 case SCH_DIRECTIVE_LABEL_T: return SCHEMATIC_LEXER::TokenName( T_netclass_flag );
204 default: wxFAIL; return SCHEMATIC_LEXER::TokenName( T_text );
205 }
206}
207
208
209std::string formatIU( const int& aValue )
210{
212}
213
214
215std::string formatIU( const VECTOR2I& aPt, bool aInvertY )
216{
217 VECTOR2I pt( aPt.x, aInvertY ? -aPt.y : aPt.y );
219}
220
221
222void formatArc( OUTPUTFORMATTER* aFormatter, EDA_SHAPE* aArc, bool aIsPrivate,
223 const STROKE_PARAMS& aStroke, FILL_T aFillMode, const COLOR4D& aFillColor,
224 bool aInvertY, const KIID& aUuid )
225{
226 aFormatter->Print( "(arc %s (start %s) (mid %s) (end %s)",
227 aIsPrivate ? "private" : "",
228 formatIU( aArc->GetStart(), aInvertY ).c_str(),
229 formatIU( aArc->GetArcMid(), aInvertY ).c_str(),
230 formatIU( aArc->GetEnd(), aInvertY ).c_str() );
231
232 aStroke.Format( aFormatter, schIUScale );
233 formatFill( aFormatter, aFillMode, aFillColor );
234
235 if( aUuid != niluuid )
236 aFormatter->Print( "(uuid %s)", TO_UTF8( aUuid.AsString() ) );
237
238 aFormatter->Print( ")" );
239}
240
241
242void formatCircle( OUTPUTFORMATTER* aFormatter, EDA_SHAPE* aCircle, bool aIsPrivate,
243 const STROKE_PARAMS& aStroke, FILL_T aFillMode, const COLOR4D& aFillColor,
244 bool aInvertY, const KIID& aUuid )
245{
246 aFormatter->Print( "(circle %s (center %s) (radius %s)",
247 aIsPrivate ? "private" : "",
248 formatIU( aCircle->GetStart(), aInvertY ).c_str(),
249 formatIU( aCircle->GetRadius() ).c_str() );
250
251 aStroke.Format( aFormatter, schIUScale );
252 formatFill( aFormatter, aFillMode, aFillColor );
253
254 if( aUuid != niluuid )
255 aFormatter->Print( "(uuid %s)", TO_UTF8( aUuid.AsString() ) );
256
257 aFormatter->Print( ")" );
258}
259
260
261void formatRect( OUTPUTFORMATTER* aFormatter, EDA_SHAPE* aRect, bool aIsPrivate,
262 const STROKE_PARAMS& aStroke, FILL_T aFillMode, const COLOR4D& aFillColor,
263 bool aInvertY, const KIID& aUuid )
264{
265 aFormatter->Print( "(rectangle %s (start %s) (end %s)",
266 aIsPrivate ? "private" : "",
267 formatIU( aRect->GetStart(), aInvertY ).c_str(),
268 formatIU( aRect->GetEnd(), aInvertY ).c_str() );
269 aStroke.Format( aFormatter, schIUScale );
270 formatFill( aFormatter, aFillMode, aFillColor );
271
272 if( aUuid != niluuid )
273 aFormatter->Print( "(uuid %s)", TO_UTF8( aUuid.AsString() ) );
274
275 aFormatter->Print( ")" );
276}
277
278
279void formatBezier( OUTPUTFORMATTER* aFormatter, EDA_SHAPE* aBezier, bool aIsPrivate,
280 const STROKE_PARAMS& aStroke, FILL_T aFillMode, const COLOR4D& aFillColor,
281 bool aInvertY, const KIID& aUuid )
282{
283 aFormatter->Print( "(bezier %s (pts ",
284 aIsPrivate ? "private" : "" );
285
286 for( const VECTOR2I& pt : { aBezier->GetStart(), aBezier->GetBezierC1(),
287 aBezier->GetBezierC2(), aBezier->GetEnd() } )
288 {
289 aFormatter->Print( "(xy %s)", formatIU( pt, aInvertY ).c_str() );
290 }
291
292 aFormatter->Print( ")" ); // Closes pts token
293
294 aStroke.Format( aFormatter, schIUScale );
295 formatFill( aFormatter, aFillMode, aFillColor );
296
297 if( aUuid != niluuid )
298 aFormatter->Print( "(uuid %s)", TO_UTF8( aUuid.AsString() ) );
299
300 aFormatter->Print( ")" );
301}
302
303
304void formatPoly( OUTPUTFORMATTER* aFormatter, EDA_SHAPE* aPolyLine, bool aIsPrivate,
305 const STROKE_PARAMS& aStroke, FILL_T aFillMode, const COLOR4D& aFillColor,
306 bool aInvertY, const KIID& aUuid )
307{
308 aFormatter->Print( "(polyline %s (pts ",
309 aIsPrivate ? "private" : "" );
310
311 const SHAPE_POLY_SET& aPolySet = aPolyLine->GetPolyShape();
312
313 if( aPolySet.OutlineCount() == 0 )
314 {
315 // If we've managed to get a polyline with no points, that's probably a bad thing,
316 // but at least don't dereference it and crash.
317 wxFAIL_MSG( "Polyline has no outlines" );
318 }
319 else
320 {
321 for( const VECTOR2I& pt : aPolyLine->GetPolyShape().Outline( 0 ).CPoints() )
322 aFormatter->Print( "(xy %s)", formatIU( pt, aInvertY ).c_str() );
323 }
324
325 aFormatter->Print( ")" ); // Closes pts token
326
327 aStroke.Format( aFormatter, schIUScale );
328 formatFill( aFormatter, aFillMode, aFillColor );
329
330 if( aUuid != niluuid )
331 aFormatter->Print( "(uuid %s)", TO_UTF8( aUuid.AsString() ) );
332
333 aFormatter->Print( ")" );
334}
constexpr EDA_IU_SCALE schIUScale
Definition: base_units.h:110
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition: box2.h:990
const VECTOR2I & GetBezierC2() const
Definition: eda_shape.h:213
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:291
int GetRadius() const
Definition: eda_shape.cpp:840
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:174
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:137
const VECTOR2I & GetBezierC1() const
Definition: eda_shape.h:210
VECTOR2I GetArcMid() const
Definition: eda_shape.cpp:810
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
double r
Red component.
Definition: color4d.h:392
double g
Green component.
Definition: color4d.h:393
double a
Alpha component.
Definition: color4d.h:395
double b
Blue component.
Definition: color4d.h:394
Definition: kiid.h:49
wxString AsString() const
Definition: kiid.cpp:246
An interface used to output 8 bit text in a convenient way.
Definition: richio.h:322
int PRINTF_FUNC_N Print(int nestLevel, const char *fmt,...)
Format and write text to the output stream.
Definition: richio.cpp:460
const std::vector< VECTOR2I > & CPoints() const
Represent a set of closed polygons.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
int OutlineCount() const
Return the number of outlines in the set.
Simple container to manage line stroke parameters.
Definition: stroke_params.h:94
void Format(OUTPUTFORMATTER *out, const EDA_IU_SCALE &aIuScale) const
static constexpr EDA_ANGLE ANGLE_0
Definition: eda_angle.h:401
static constexpr EDA_ANGLE ANGLE_90
Definition: eda_angle.h:403
static constexpr EDA_ANGLE ANGLE_270
Definition: eda_angle.h:406
static constexpr EDA_ANGLE ANGLE_180
Definition: eda_angle.h:405
FILL_T
Definition: eda_shape.h:56
@ FILLED_WITH_COLOR
@ FILLED_WITH_BG_BODYCOLOR
@ FILLED_SHAPE
Fill with object color.
KIID niluuid(0)
This file contains miscellaneous commonly used macros and functions.
KICOMMON_API std::string FormatInternalUnits(const EDA_IU_SCALE &aIuScale, int aValue)
Converts aValue from internal units to a string appropriate for writing to file.
Definition: eda_units.cpp:170
ELECTRICAL_PINTYPE
The symbol library pin object electrical types used in ERC tests.
Definition: pin_type.h:36
@ PT_INPUT
usual pin input: must be connected
@ PT_NC
not connected (must be left open)
@ PT_OUTPUT
usual output
@ PT_TRISTATE
tris state bus pin
@ PT_NIC
not internally connected (may be connected to anything)
@ PT_BIDI
input or output (like port for a microprocessor)
@ PT_OPENEMITTER
pin type open emitter
@ PT_POWER_OUT
output of a regulator: intended to be connected to power input pins
@ PT_OPENCOLLECTOR
pin type open collector
@ PT_POWER_IN
power input (GND, VCC for ICs). Must be connected to a power output.
@ PT_UNSPECIFIED
unknown electrical properties: creates always a warning when connected
@ PT_PASSIVE
pin for passive symbols: must be connected, and can be connected to any pin
PIN_ORIENTATION
The symbol library pin object orientations.
Definition: pin_type.h:78
@ PIN_UP
The pin extends upwards from the connection point: Probably on the bottom side of the symbol.
@ PIN_RIGHT
The pin extends rightwards from the connection point.
@ PIN_LEFT
The pin extends leftwards from the connection point: Probably on the right side of the symbol.
@ PIN_DOWN
The pin extends downwards from the connection: Probably on the top side of the symbol.
GRAPHIC_PINSHAPE
Definition: pin_type.h:57
EDA_ANGLE getPinAngle(PIN_ORIENTATION aOrientation)
void formatArc(OUTPUTFORMATTER *aFormatter, EDA_SHAPE *aArc, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, bool aInvertY, const KIID &aUuid)
const char * getSheetPinShapeToken(LABEL_FLAG_SHAPE aShape)
void formatCircle(OUTPUTFORMATTER *aFormatter, EDA_SHAPE *aCircle, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, bool aInvertY, const KIID &aUuid)
const char * getPinElectricalTypeToken(ELECTRICAL_PINTYPE aType)
const char * getTextTypeToken(KICAD_T aType)
void formatBezier(OUTPUTFORMATTER *aFormatter, EDA_SHAPE *aBezier, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, bool aInvertY, const KIID &aUuid)
void formatRect(OUTPUTFORMATTER *aFormatter, EDA_SHAPE *aRect, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, bool aInvertY, const KIID &aUuid)
std::string formatIU(const int &aValue)
void formatPoly(OUTPUTFORMATTER *aFormatter, EDA_SHAPE *aPolyLine, bool aIsPrivate, const STROKE_PARAMS &aStroke, FILL_T aFillMode, const COLOR4D &aFillColor, bool aInvertY, const KIID &aUuid)
EDA_ANGLE getSheetPinAngle(SHEET_SIDE aSide)
void formatFill(OUTPUTFORMATTER *aFormatter, FILL_T aFillMode, const COLOR4D &aFillColor)
Fill token formatting helper.
const char * getPinShapeToken(GRAPHIC_PINSHAPE aShape)
static const char * emptyString
LABEL_FLAG_SHAPE
Definition: sch_label.h:98
@ L_BIDI
Definition: sch_label.h:101
@ L_TRISTATE
Definition: sch_label.h:102
@ L_UNSPECIFIED
Definition: sch_label.h:103
@ F_DOT
Definition: sch_label.h:106
@ F_ROUND
Definition: sch_label.h:107
@ L_OUTPUT
Definition: sch_label.h:100
@ F_DIAMOND
Definition: sch_label.h:108
@ L_INPUT
Definition: sch_label.h:99
@ F_RECTANGLE
Definition: sch_label.h:109
SHEET_SIDE
Define the edge of the sheet that the sheet pin is positioned.
Definition: sch_sheet_pin.h:46
std::string FormatDouble2Str(double aValue)
Print a float number without using scientific notation and no trailing 0 This function is intended in...
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Definition: string_utils.h:398
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:78
@ SCH_DIRECTIVE_LABEL_T
Definition: typeinfo.h:171
@ SCH_LABEL_T
Definition: typeinfo.h:167
@ SCH_HIER_LABEL_T
Definition: typeinfo.h:169
@ SCH_TEXT_T
Definition: typeinfo.h:151
@ SCH_GLOBAL_LABEL_T
Definition: typeinfo.h:168