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 (C) 2023 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
26{
27
28std::optional<KICAD_T> TypeNameFromAny( const google::protobuf::Any& aMessage )
29{
30 static const std::map<std::string, KICAD_T> s_types = {
31 { "type.googleapis.com/kiapi.board.types.Track", PCB_TRACE_T },
32 { "type.googleapis.com/kiapi.board.types.Arc", PCB_ARC_T },
33 { "type.googleapis.com/kiapi.board.types.Via", PCB_VIA_T },
34 { "type.googleapis.com/kiapi.board.types.Text", PCB_TEXT_T },
35 { "type.googleapis.com/kiapi.board.types.TextBox", PCB_TEXTBOX_T },
36 { "type.googleapis.com/kiapi.board.types.GraphicShape", PCB_SHAPE_T },
37 { "type.googleapis.com/kiapi.board.types.Pad", PCB_PAD_T },
38 { "type.googleapis.com/kiapi.board.types.Zone", PCB_ZONE_T },
39 { "type.googleapis.com/kiapi.board.types.Dimension", PCB_DIMENSION_T },
40 { "type.googleapis.com/kiapi.board.types.ReferenceImage", PCB_REFERENCE_IMAGE_T },
41 { "type.googleapis.com/kiapi.board.types.Group", PCB_GROUP_T },
42 { "type.googleapis.com/kiapi.board.types.Field", PCB_FIELD_T },
43 { "type.googleapis.com/kiapi.board.types.FootprintInstance", PCB_FOOTPRINT_T },
44 };
45
46 auto it = s_types.find( aMessage.type_url() );
47
48 if( it != s_types.end() )
49 return it->second;
50
51 return std::nullopt;
52}
53
54
55LIB_ID LibIdFromProto( const types::LibraryIdentifier& aId )
56{
57 return LIB_ID( aId.library_nickname(), aId.entry_name() );
58}
59
60
61types::LibraryIdentifier LibIdToProto( const LIB_ID& aId )
62{
63 types::LibraryIdentifier msg;
64 msg.set_library_nickname( aId.GetLibNickname() );
65 msg.set_entry_name( aId.GetLibItemName() );
66 return msg;
67}
68
69
70void PackVector2( types::Vector2& aOutput, const VECTOR2I& aInput )
71{
72 aOutput.set_x_nm( aInput.x );
73 aOutput.set_y_nm( aInput.y );
74}
75
76
77VECTOR2I UnpackVector2( const types::Vector2& aInput )
78{
79 return VECTOR2I( aInput.x_nm(), aInput.y_nm() );
80}
81
82
83void PackBox2( types::Box2& aOutput, const BOX2I& aInput )
84{
85 PackVector2( *aOutput.mutable_position(), aInput.GetOrigin() );
86 PackVector2( *aOutput.mutable_size(), aInput.GetSize() );
87}
88
89
90BOX2I UnpackBox2( const types::Box2& aInput )
91{
92 return BOX2I( UnpackVector2( aInput.position() ), UnpackVector2( aInput.size() ) );
93}
94
95
96void PackPolyLine( kiapi::common::types::PolyLine& aOutput, const SHAPE_LINE_CHAIN& aSlc )
97{
98 for( int vertex = 0; vertex < aSlc.PointCount(); vertex = aSlc.NextShape( vertex ) )
99 {
100 if( vertex < 0 )
101 break;
102
103 kiapi::common::types::PolyLineNode* node = aOutput.mutable_nodes()->Add();
104
105 if( aSlc.IsPtOnArc( vertex ) )
106 {
107 const SHAPE_ARC& arc = aSlc.Arc( aSlc.ArcIndex( vertex ) );
108 node->mutable_arc()->mutable_start()->set_x_nm( arc.GetP0().x );
109 node->mutable_arc()->mutable_start()->set_y_nm( arc.GetP0().y );
110 node->mutable_arc()->mutable_mid()->set_x_nm( arc.GetArcMid().x );
111 node->mutable_arc()->mutable_mid()->set_y_nm( arc.GetArcMid().y );
112 node->mutable_arc()->mutable_end()->set_x_nm( arc.GetP1().x );
113 node->mutable_arc()->mutable_end()->set_y_nm( arc.GetP1().y );
114 }
115 else
116 {
117 node->mutable_point()->set_x_nm( aSlc.CPoint( vertex ).x );
118 node->mutable_point()->set_y_nm( aSlc.CPoint( vertex ).y );
119 }
120 }
121
122 aOutput.set_closed( aSlc.IsClosed() );
123}
124
125
126SHAPE_LINE_CHAIN UnpackPolyLine( const kiapi::common::types::PolyLine& aInput )
127{
129
130 for( const kiapi::common::types::PolyLineNode& node : aInput.nodes() )
131 {
132 if( node.has_point() )
133 {
134 slc.Append( VECTOR2I( node.point().x_nm(), node.point().y_nm() ) );
135 }
136 else if( node.has_arc() )
137 {
138 slc.Append( SHAPE_ARC( VECTOR2I( node.arc().start().x_nm(), node.arc().start().y_nm() ),
139 VECTOR2I( node.arc().mid().x_nm(), node.arc().mid().y_nm() ),
140 VECTOR2I( node.arc().end().x_nm(), node.arc().end().y_nm() ),
141 0 /* don't care about width here */ ) );
142 }
143 }
144
145 slc.SetClosed( aInput.closed() );
146
147 return slc;
148}
149
150
151void PackPolySet( types::PolySet& aOutput, const SHAPE_POLY_SET& aInput )
152{
153 for( int idx = 0; idx < aInput.OutlineCount(); ++idx )
154 {
155 const SHAPE_POLY_SET::POLYGON& poly = aInput.Polygon( idx );
156
157 if( poly.empty() )
158 continue;
159
160 types::PolygonWithHoles* polyMsg = aOutput.mutable_polygons()->Add();
161 PackPolyLine( *polyMsg->mutable_outline(), poly.front() );
162
163 if( poly.size() > 1 )
164 {
165 for( size_t hole = 1; hole < poly.size(); ++hole )
166 {
167 types::PolyLine* pl = polyMsg->mutable_holes()->Add();
168 PackPolyLine( *pl, poly[hole] );
169 }
170 }
171 }
172}
173
174
175SHAPE_POLY_SET UnpackPolySet( const types::PolySet& aInput )
176{
177 SHAPE_POLY_SET sps;
178
179 for( const types::PolygonWithHoles& polygonWithHoles : aInput.polygons() )
180 {
182
183 polygon.emplace_back( UnpackPolyLine( polygonWithHoles.outline() ) );
184
185 for( const types::PolyLine& holeMsg : polygonWithHoles.holes() )
186 polygon.emplace_back( UnpackPolyLine( holeMsg ) );
187
188 sps.AddPolygon( polygon );
189 }
190
191 return sps;
192}
193
194} // 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 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:116
const VECTOR2I & GetP1() const
Definition: shape_arc.h:115
const VECTOR2I & GetP0() const
Definition: shape_arc.h:114
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.
void PackPolySet(types::PolySet &aOutput, const SHAPE_POLY_SET &aInput)
Definition: api_utils.cpp:151
std::optional< KICAD_T > TypeNameFromAny(const google::protobuf::Any &aMessage)
Definition: api_utils.cpp:28
types::LibraryIdentifier LibIdToProto(const LIB_ID &aId)
Definition: api_utils.cpp:61
SHAPE_POLY_SET UnpackPolySet(const types::PolySet &aInput)
Definition: api_utils.cpp:175
VECTOR2I UnpackVector2(const types::Vector2 &aInput)
Definition: api_utils.cpp:77
void PackVector2(types::Vector2 &aOutput, const VECTOR2I &aInput)
Definition: api_utils.cpp:70
void PackPolyLine(kiapi::common::types::PolyLine &aOutput, const SHAPE_LINE_CHAIN &aSlc)
Definition: api_utils.cpp:96
BOX2I UnpackBox2(const types::Box2 &aInput)
Definition: api_utils.cpp:90
SHAPE_LINE_CHAIN UnpackPolyLine(const kiapi::common::types::PolyLine &aInput)
Definition: api_utils.cpp:126
LIB_ID LibIdFromProto(const types::LibraryIdentifier &aId)
Definition: api_utils.cpp:55
void PackBox2(types::Box2 &aOutput, const BOX2I &aInput)
Definition: api_utils.cpp:83
@ 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:110
@ 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:107
@ 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_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:691