KiCad PCB EDA Suite
Loading...
Searching...
No Matches
api_utils.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 (C) 2023 Jon Evans <[email protected]>
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software: you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License along
18 * with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21#include <magic_enum.hpp>
22#include <api/api_utils.h>
24#include <kiid.h>
25#include <wx/log.h>
26
27const wxChar* const traceApi = wxT( "KICAD_API" );
28
29
31{
32
33KICOMMON_API std::optional<KICAD_T> TypeNameFromAny( const google::protobuf::Any& aMessage )
34{
35 static const std::map<std::string, KICAD_T> s_types = {
36 { "type.googleapis.com/kiapi.board.types.Track", PCB_TRACE_T },
37 { "type.googleapis.com/kiapi.board.types.Arc", PCB_ARC_T },
38 { "type.googleapis.com/kiapi.board.types.Via", PCB_VIA_T },
39 { "type.googleapis.com/kiapi.board.types.BoardText", PCB_TEXT_T },
40 { "type.googleapis.com/kiapi.board.types.BoardTextBox", PCB_TEXTBOX_T },
41 { "type.googleapis.com/kiapi.board.types.BoardGraphicShape", PCB_SHAPE_T },
42 { "type.googleapis.com/kiapi.board.types.Barcode", PCB_BARCODE_T },
43 { "type.googleapis.com/kiapi.board.types.Pad", PCB_PAD_T },
44 { "type.googleapis.com/kiapi.board.types.Zone", PCB_ZONE_T },
45 { "type.googleapis.com/kiapi.board.types.Dimension", PCB_DIMENSION_T },
46 { "type.googleapis.com/kiapi.board.types.ReferenceImage", PCB_REFERENCE_IMAGE_T },
47 { "type.googleapis.com/kiapi.board.types.Group", PCB_GROUP_T },
48 { "type.googleapis.com/kiapi.board.types.Field", PCB_FIELD_T },
49 { "type.googleapis.com/kiapi.board.types.FootprintInstance", PCB_FOOTPRINT_T },
50 };
51
52 auto it = s_types.find( aMessage.type_url() );
53
54 if( it != s_types.end() )
55 return it->second;
56
57 wxLogTrace( traceApi, wxString::Format( wxS( "Any message type %s is not known" ),
58 aMessage.type_url() ) );
59
60 return std::nullopt;
61}
62
63
64KICOMMON_API LIB_ID LibIdFromProto( const types::LibraryIdentifier& aId )
65{
66 return LIB_ID( aId.library_nickname(), aId.entry_name() );
67}
68
69
70KICOMMON_API types::LibraryIdentifier LibIdToProto( const LIB_ID& aId )
71{
72 types::LibraryIdentifier msg;
73 msg.set_library_nickname( aId.GetLibNickname() );
74 msg.set_entry_name( aId.GetLibItemName() );
75 return msg;
76}
77
78
79KICOMMON_API void PackVector2( types::Vector2& aOutput, const VECTOR2I& aInput )
80{
81 aOutput.set_x_nm( aInput.x );
82 aOutput.set_y_nm( aInput.y );
83}
84
85
86KICOMMON_API VECTOR2I UnpackVector2( const types::Vector2& aInput )
87{
88 return VECTOR2I( aInput.x_nm(), aInput.y_nm() );
89}
90
91
92KICOMMON_API void PackVector3D( types::Vector3D& aOutput, const VECTOR3D& aInput )
93{
94 aOutput.set_x_nm( aInput.x );
95 aOutput.set_y_nm( aInput.y );
96 aOutput.set_z_nm( aInput.z );
97}
98
99
100KICOMMON_API VECTOR3D UnpackVector3D( const types::Vector3D& aInput )
101{
102 return VECTOR3D( aInput.x_nm(), aInput.y_nm(), aInput.z_nm() );
103}
104
105
106KICOMMON_API void PackBox2( types::Box2& aOutput, const BOX2I& aInput )
107{
108 PackVector2( *aOutput.mutable_position(), aInput.GetOrigin() );
109 PackVector2( *aOutput.mutable_size(), aInput.GetSize() );
110}
111
112
113KICOMMON_API BOX2I UnpackBox2( const types::Box2& aInput )
114{
115 return BOX2I( UnpackVector2( aInput.position() ), UnpackVector2( aInput.size() ) );
116}
117
118
119KICOMMON_API void PackPolyLine( types::PolyLine& aOutput, const SHAPE_LINE_CHAIN& aSlc )
120{
121 for( int vertex = 0; vertex < aSlc.PointCount(); vertex = aSlc.NextShape( vertex ) )
122 {
123 if( vertex < 0 )
124 break;
125
126 types::PolyLineNode* node = aOutput.mutable_nodes()->Add();
127
128 if( aSlc.IsPtOnArc( vertex ) )
129 {
130 const SHAPE_ARC& arc = aSlc.Arc( aSlc.ArcIndex( vertex ) );
131 node->mutable_arc()->mutable_start()->set_x_nm( arc.GetP0().x );
132 node->mutable_arc()->mutable_start()->set_y_nm( arc.GetP0().y );
133 node->mutable_arc()->mutable_mid()->set_x_nm( arc.GetArcMid().x );
134 node->mutable_arc()->mutable_mid()->set_y_nm( arc.GetArcMid().y );
135 node->mutable_arc()->mutable_end()->set_x_nm( arc.GetP1().x );
136 node->mutable_arc()->mutable_end()->set_y_nm( arc.GetP1().y );
137 }
138 else
139 {
140 node->mutable_point()->set_x_nm( aSlc.CPoint( vertex ).x );
141 node->mutable_point()->set_y_nm( aSlc.CPoint( vertex ).y );
142 }
143 }
144
145 aOutput.set_closed( aSlc.IsClosed() );
146}
147
148
149KICOMMON_API SHAPE_LINE_CHAIN UnpackPolyLine( const types::PolyLine& aInput )
150{
152
153 for( const types::PolyLineNode& node : aInput.nodes() )
154 {
155 if( node.has_point() )
156 {
157 slc.Append( VECTOR2I( node.point().x_nm(), node.point().y_nm() ) );
158 }
159 else if( node.has_arc() )
160 {
161 slc.Append( SHAPE_ARC( VECTOR2I( node.arc().start().x_nm(), node.arc().start().y_nm() ),
162 VECTOR2I( node.arc().mid().x_nm(), node.arc().mid().y_nm() ),
163 VECTOR2I( node.arc().end().x_nm(), node.arc().end().y_nm() ),
164 0 /* don't care about width here */ ) );
165 }
166 }
167
168 slc.SetClosed( aInput.closed() );
169
170 return slc;
171}
172
173
174KICOMMON_API void PackPolySet( types::PolySet& aOutput, const SHAPE_POLY_SET& aInput )
175{
176 for( int idx = 0; idx < aInput.OutlineCount(); ++idx )
177 {
178 const SHAPE_POLY_SET::POLYGON& poly = aInput.Polygon( idx );
179
180 if( poly.empty() )
181 continue;
182
183 types::PolygonWithHoles* polyMsg = aOutput.mutable_polygons()->Add();
184 PackPolyLine( *polyMsg->mutable_outline(), poly.front() );
185
186 if( poly.size() > 1 )
187 {
188 for( size_t hole = 1; hole < poly.size(); ++hole )
189 {
190 types::PolyLine* pl = polyMsg->mutable_holes()->Add();
191 PackPolyLine( *pl, poly[hole] );
192 }
193 }
194 }
195}
196
197
198KICOMMON_API SHAPE_POLY_SET UnpackPolySet( const types::PolySet& aInput )
199{
200 SHAPE_POLY_SET sps;
201
202 for( const types::PolygonWithHoles& polygonWithHoles : aInput.polygons() )
203 {
205
206 polygon.emplace_back( UnpackPolyLine( polygonWithHoles.outline() ) );
207
208 for( const types::PolyLine& holeMsg : polygonWithHoles.holes() )
209 polygon.emplace_back( UnpackPolyLine( holeMsg ) );
210
211 sps.AddPolygon( polygon );
212 }
213
214 return sps;
215}
216
217
218KICOMMON_API void PackColor( types::Color& aOutput, const KIGFX::COLOR4D& aInput )
219{
220 aOutput.set_r( aInput.r );
221 aOutput.set_g( aInput.g );
222 aOutput.set_b( aInput.b );
223 aOutput.set_a( aInput.a );
224}
225
226
227KICOMMON_API KIGFX::COLOR4D UnpackColor( const types::Color& aInput )
228{
229 double r = std::clamp( aInput.r(), 0.0, 1.0 );
230 double g = std::clamp( aInput.g(), 0.0, 1.0 );
231 double b = std::clamp( aInput.b(), 0.0, 1.0 );
232 double a = std::clamp( aInput.a(), 0.0, 1.0 );
233
234 return KIGFX::COLOR4D( r, g, b, a );
235}
236
237KICOMMON_API void PackSheetPath( types::SheetPath& aOutput, const KIID_PATH& aInput )
238{
239 aOutput.clear_path();
240
241 for( const KIID& entry : aInput )
242 aOutput.add_path()->set_value( entry.AsStdString() );
243}
244
245} // namespace kiapi::common
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
constexpr const Vec & GetOrigin() const
Definition box2.h:210
constexpr const SizeVec & GetSize() const
Definition box2.h:206
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
A logical library item identifier and consists of various portions much like a URI.
Definition lib_id.h:49
const UTF8 & GetLibItemName() const
Definition lib_id.h:102
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition lib_id.h:87
const VECTOR2I & GetArcMid() const
Definition shape_arc.h:118
const VECTOR2I & GetP1() const
Definition shape_arc.h:117
const VECTOR2I & GetP0() const
Definition shape_arc.h:116
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
bool IsPtOnArc(size_t aPtIndex) const
const SHAPE_ARC & Arc(size_t aArc) const
bool IsClosed() const override
void SetClosed(bool aClosed)
Mark the line chain as closed (i.e.
int PointCount() const
Return the number of points (vertices) in this line chain.
ssize_t ArcIndex(size_t aSegment) const
Return the arc index for the given segment index.
int NextShape(int aPointIndex) const
Return the vertex index of the next shape in the chain, or -1 if aPointIndex is the last shape.
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
Represent a set of closed polygons.
POLYGON & Polygon(int aIndex)
Return the aIndex-th subpolygon in the set.
int AddPolygon(const POLYGON &apolygon)
Adds a polygon to the set.
std::vector< SHAPE_LINE_CHAIN > POLYGON
represents a single polygon outline with holes.
int OutlineCount() const
Return the number of outlines in the set.
const wxChar *const traceApi
Flag to enable debug output related to the IPC API and its plugin system.
Definition api_utils.cpp:27
#define KICOMMON_API
Definition kicommon.h:28
KICOMMON_API SHAPE_LINE_CHAIN UnpackPolyLine(const types::PolyLine &aInput)
KICOMMON_API void PackColor(types::Color &aOutput, const KIGFX::COLOR4D &aInput)
KICOMMON_API BOX2I UnpackBox2(const types::Box2 &aInput)
KICOMMON_API void PackBox2(types::Box2 &aOutput, const BOX2I &aInput)
KICOMMON_API std::optional< KICAD_T > TypeNameFromAny(const google::protobuf::Any &aMessage)
Definition api_utils.cpp:33
KICOMMON_API VECTOR3D UnpackVector3D(const types::Vector3D &aInput)
KICOMMON_API VECTOR2I UnpackVector2(const types::Vector2 &aInput)
Definition api_utils.cpp:86
KICOMMON_API SHAPE_POLY_SET UnpackPolySet(const types::PolySet &aInput)
KICOMMON_API KIGFX::COLOR4D UnpackColor(const types::Color &aInput)
KICOMMON_API void PackVector2(types::Vector2 &aOutput, const VECTOR2I &aInput)
Definition api_utils.cpp:79
KICOMMON_API void PackSheetPath(types::SheetPath &aOutput, const KIID_PATH &aInput)
KICOMMON_API LIB_ID LibIdFromProto(const types::LibraryIdentifier &aId)
Definition api_utils.cpp:64
KICOMMON_API types::LibraryIdentifier LibIdToProto(const LIB_ID &aId)
Definition api_utils.cpp:70
KICOMMON_API void PackPolyLine(types::PolyLine &aOutput, const SHAPE_LINE_CHAIN &aSlc)
KICOMMON_API void PackVector3D(types::Vector3D &aOutput, const VECTOR3D &aInput)
Definition api_utils.cpp:92
KICOMMON_API void PackPolySet(types::PolySet &aOutput, const SHAPE_POLY_SET &aInput)
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition typeinfo.h:88
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
Definition typeinfo.h:97
@ PCB_GROUP_T
class PCB_GROUP, a set of BOARD_ITEMs
Definition typeinfo.h:111
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition typeinfo.h:93
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition typeinfo.h:108
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition typeinfo.h:92
@ PCB_REFERENCE_IMAGE_T
class PCB_REFERENCE_IMAGE, bitmap on a layer
Definition typeinfo.h:89
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
Definition typeinfo.h:90
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
Definition typeinfo.h:101
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition typeinfo.h:86
@ PCB_PAD_T
class PAD, a pad in a footprint
Definition typeinfo.h:87
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
Definition typeinfo.h:98
@ PCB_DIMENSION_T
class PCB_DIMENSION_BASE: abstract dimension meta-type
Definition typeinfo.h:100
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
Definition typeinfo.h:96
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695
VECTOR3< double > VECTOR3D
Definition vector3.h:230