KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pns_via.h
Go to the documentation of this file.
1/*
2 * KiRouter - a push-and-(sometimes-)shove PCB router
3 *
4 * Copyright (C) 2013-2014 CERN
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 * Author: Tomasz Wlostowski <[email protected]>
7 *
8 * This program is free software: you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation, either version 3 of the License, or (at your
11 * option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along
19 * with this program. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22#ifndef __PNS_VIA_H
23#define __PNS_VIA_H
24
28#include <math/box2.h>
29
30#include "pcb_track.h"
31
32#include "pns_item.h"
33#include "pns_linked_item.h"
34#include "pns_hole.h"
35
36namespace PNS {
37
38class NODE;
39
40// uniquely identifies a VIA within a NODE without using pointers. Used to
41// simplify (or complexifiy, depending on the point of view) the pointer management
42// in PNS::NODE. Sooner or later I'll have to fix it for good using smart pointers - twl
44{
45 VIA_HANDLE() : valid( false ) {};
47 valid( true ),
48 pos( aPos ),
49 layers (aLayers),
50 net (aNet ) {};
51
52 bool valid = false;
55 NET_HANDLE net = nullptr;
56};
57
58class VIA : public LINKED_ITEM
59{
60public:
61 enum class STACK_MODE
62 {
63 // The via is the same size on every layer
64 NORMAL,
65
66 // The via can have three different sizes -- note that in this context, front means
67 // m_layers.Start() and back means m_layers.End(), which does not align with KiCad in the
68 // case of blind/buried vias. Using this STACK_MODE only makes sense for vias that extend
69 // through the whole PCB
71
72 // The via can have a different size on each layer
73 CUSTOM
74 };
75
76 static constexpr int ALL_LAYERS = 0;
77 static constexpr int INNER_LAYERS = 1;
78
79 VIA() :
81 m_hole( nullptr )
82 {
84 m_diameters[0] = 2; // Dummy value
85 m_drill = 1; // Dummy value
86 m_viaType = VIATYPE::THROUGH;
88 m_isFree = false;
89 m_isVirtual = false;
91 }
92
93 VIA( const VECTOR2I& aPos, const PNS_LAYER_RANGE& aLayers, int aDiameter, int aDrill,
94 NET_HANDLE aNet = nullptr, VIATYPE aViaType = VIATYPE::THROUGH ) :
96 m_hole( nullptr )
97 {
98 SetNet( aNet );
99 SetLayers( aLayers );
100 m_pos = aPos;
102 m_diameters[0] = aDiameter;
103 m_drill = aDrill;
104 m_shapes[0] = SHAPE_CIRCLE( aPos, aDiameter / 2 );
106 m_viaType = aViaType;
108 m_isFree = false;
109 m_isVirtual = false;
110 }
111
112 VIA( const VIA& aB ) :
113 LINKED_ITEM( aB ),
114 m_hole( nullptr )
115 {
116 SetNet( aB.Net() );
117 SetLayers( aB.Layers() );
118 m_pos = aB.m_pos;
121
122 for( const auto& [layer, shape] : aB.m_shapes )
123 m_shapes[layer] = SHAPE_CIRCLE( m_pos, shape.GetRadius() );
124
125 m_drill = aB.m_drill;
127 m_marker = aB.m_marker;
128 m_rank = aB.m_rank;
129 m_viaType = aB.m_viaType;
131 m_isFree = aB.m_isFree;
133 }
134
135 virtual ~VIA()
136 {
137 if ( m_hole && m_hole->BelongsTo( this ) )
138 delete m_hole;
139 }
140
141 VIA& operator=( const VIA& aB )
142 {
143 SetParent( aB.Parent() );
145
146 SetNet( aB.Net() );
147 SetLayers( aB.Layers() );
148 m_movable = aB.m_movable;
149 m_pos = aB.m_pos;
152
153 for( const auto& [layer, shape] : aB.m_shapes )
154 m_shapes[layer] = SHAPE_CIRCLE( m_pos, shape.GetRadius() );
155
156 m_drill = aB.m_drill;
158 m_marker = aB.m_marker;
159 m_rank = aB.m_rank;
161 m_viaType = aB.m_viaType;
163 m_isFree = aB.m_isFree;
165 m_uid = aB.m_uid;
166 return *this;
167 }
168
169 static inline bool ClassOf( const ITEM* aItem )
170 {
171 return aItem && VIA_T == aItem->Kind();
172 }
173
174 STACK_MODE StackMode() const { return m_stackMode; }
175
176 void SetStackMode( STACK_MODE aStackMode );
177
178 int EffectiveLayer( int aLayer ) const;
179
180 std::vector<int> UniqueShapeLayers() const override;
181
182 bool HasUniqueShapeLayers() const override { return true; }
183
184 const VECTOR2I& Pos() const { return m_pos; }
185
186 void SetPos( const VECTOR2I& aPos )
187 {
188 m_pos = aPos;
189
190 for( auto& [layer, shape] : m_shapes )
191 shape.SetCenter( aPos );
192
193 if( m_hole )
194 m_hole->SetCenter( aPos );
195 }
196
197 VIATYPE ViaType() const { return m_viaType; }
198 void SetViaType( VIATYPE aViaType ) { m_viaType = aViaType; }
199
202 {
204 }
205
206 bool ConnectsLayer( int aLayer ) const;
207
208 int Diameter( int aLayer ) const
209 {
210 int layer = EffectiveLayer( aLayer );
211 wxCHECK( m_diameters.contains( layer ), m_diameters.begin()->second );
212 return m_diameters.at( layer );
213 }
214
215 void SetDiameter( int aLayer, int aDiameter )
216 {
217 int layer = EffectiveLayer( aLayer );
218 m_diameters[layer] = aDiameter;
219
220 if( !m_shapes.contains( layer ) )
221 m_shapes[layer] = SHAPE_CIRCLE( m_pos, aDiameter / 2 );
222 else
223 m_shapes[layer].SetRadius( aDiameter / 2 );
224 }
225
226 bool PadstackMatches( const VIA& aOther ) const;
227
228 int Drill() const { return m_drill; }
229
230 void SetDrill( int aDrill )
231 {
232 m_drill = aDrill;
233
234 if( m_hole )
235 m_hole->SetRadius( m_drill / 2 );
236 }
237
238 bool IsFree() const { return m_isFree; }
239 void SetIsFree( bool aIsFree ) { m_isFree = aIsFree; }
240
241 bool PushoutForce( NODE* aNode, const VECTOR2I& aDirection, VECTOR2I& aForce,
242 int aCollisionMask = ITEM::ANY_T, int aMaxIterations = 10 );
243
244 bool PushoutForce( NODE* aNode, const ITEM* aOther, VECTOR2I& aForce );
245
246 const SHAPE* Shape( int aLayer ) const override
247 {
248 int layer = EffectiveLayer( aLayer );
249 wxCHECK( m_shapes.contains( layer ), nullptr );
250 return &m_shapes.at( layer );
251 }
252
253 VIA* Clone() const override;
254
255 const SHAPE_LINE_CHAIN Hull( int aClearance = 0, int aWalkaroundThickness = 0,
256 int aLayer = -1 ) const override;
257
258 virtual VECTOR2I Anchor( int n ) const override
259 {
260 return m_pos;
261 }
262
263 virtual int AnchorCount() const override
264 {
265 return 1;
266 }
267
268 OPT_BOX2I ChangedArea( const VIA* aOther ) const;
269
270 const VIA_HANDLE MakeHandle() const;
271
272 virtual void SetHole( HOLE* aHole ) override
273 {
274 if( m_hole && m_hole->BelongsTo( this ) )
275 delete m_hole;
276
277 m_hole = aHole;
278 m_hole->SetParentPadVia( this );
279 m_hole->SetOwner( this );
280 m_hole->SetLayers( m_layers ); // fixme: backdrill vias can have hole layer set different
281 // than copper layer set
282 }
283
284 virtual bool HasHole() const override { return true; }
285 virtual HOLE *Hole() const override { return m_hole; }
286
287 virtual const std::string Format() const override;
288
289private:
291
293 std::map<int, int> m_diameters;
294 std::map<int, SHAPE_CIRCLE> m_shapes;
295
302};
303
304
305class VVIA : public VIA
306{
307public:
308 VVIA( const VECTOR2I& aPos, int aLayer, int aDiameter, NET_HANDLE aNet ) :
309 VIA( aPos, PNS_LAYER_RANGE( aLayer, aLayer ), aDiameter, aDiameter / 2, aNet )
310 {
311 m_isVirtual = true;
312 }
313
314 bool HasHole() const override { return false; }
315};
316
317}
318
319#endif
std::optional< BOX2I > OPT_BOX2I
Definition: box2.h:926
UNCONNECTED_LAYER_MODE
! Whether or not to remove the copper shape for unconnected layers
Definition: padstack.h:152
void SetCenter(const VECTOR2I &aCenter)
Definition: pns_hole.cpp:111
void SetRadius(int aRadius)
Definition: pns_hole.cpp:118
void SetParentPadVia(ITEM *aParent)
Definition: pns_hole.h:71
static HOLE * MakeCircularHole(const VECTOR2I &pos, int radius, PNS_LAYER_RANGE aLayers)
Definition: pns_hole.cpp:131
Base class for PNS router board items.
Definition: pns_item.h:98
BOARD_ITEM * Parent() const
Definition: pns_item.h:199
void SetLayers(const PNS_LAYER_RANGE &aLayers)
Definition: pns_item.h:213
bool m_isVirtual
Definition: pns_item.h:330
void SetSourceItem(BOARD_ITEM *aSourceItem)
Definition: pns_item.h:201
const PNS_LAYER_RANGE & Layers() const
Definition: pns_item.h:212
bool m_movable
Definition: pns_item.h:325
virtual NET_HANDLE Net() const
Definition: pns_item.h:210
PNS_LAYER_RANGE m_layers
Definition: pns_item.h:323
bool m_routable
Definition: pns_item.h:329
PnsKind Kind() const
Return the type (kind) of the item.
Definition: pns_item.h:173
void SetNet(NET_HANDLE aNet)
Definition: pns_item.h:209
BOARD_ITEM * GetSourceItem() const
Definition: pns_item.h:202
void SetParent(BOARD_ITEM *aParent)
Definition: pns_item.h:191
int m_marker
Definition: pns_item.h:327
int m_rank
Definition: pns_item.h:328
Keep the router "world" - i.e.
Definition: pns_node.h:232
void SetOwner(const ITEM_OWNER *aOwner)
Set the node that owns this item.
Definition: pns_item.h:77
bool BelongsTo(const ITEM_OWNER *aNode) const
Definition: pns_item.h:82
VIA()
Definition: pns_via.h:79
int Diameter(int aLayer) const
Definition: pns_via.h:208
void SetDiameter(int aLayer, int aDiameter)
Definition: pns_via.h:215
OPT_BOX2I ChangedArea(const VIA *aOther) const
Definition: pns_via.cpp:276
std::vector< int > UniqueShapeLayers() const override
Return a list of layers that have unique (potentially different) shapes.
Definition: pns_via.cpp:56
static bool ClassOf(const ITEM *aItem)
Definition: pns_via.h:169
int m_drill
Definition: pns_via.h:296
virtual VECTOR2I Anchor(int n) const override
Definition: pns_via.h:258
VIA(const VIA &aB)
Definition: pns_via.h:112
const VECTOR2I & Pos() const
Definition: pns_via.h:184
virtual void SetHole(HOLE *aHole) override
Definition: pns_via.h:272
std::map< int, int > m_diameters
May contain 1..n diameters depending on m_stackMode.
Definition: pns_via.h:293
VIA(const VECTOR2I &aPos, const PNS_LAYER_RANGE &aLayers, int aDiameter, int aDrill, NET_HANDLE aNet=nullptr, VIATYPE aViaType=VIATYPE::THROUGH)
Definition: pns_via.h:93
const VIA_HANDLE MakeHandle() const
Definition: pns_via.cpp:295
const SHAPE * Shape(int aLayer) const override
Return the geometrical shape of the item.
Definition: pns_via.h:246
VIATYPE ViaType() const
Definition: pns_via.h:197
virtual const std::string Format() const override
Definition: pns_via.cpp:306
bool PushoutForce(NODE *aNode, const VECTOR2I &aDirection, VECTOR2I &aForce, int aCollisionMask=ITEM::ANY_T, int aMaxIterations=10)
Definition: pns_via.cpp:134
virtual int AnchorCount() const override
Definition: pns_via.h:263
std::map< int, SHAPE_CIRCLE > m_shapes
Definition: pns_via.h:294
virtual HOLE * Hole() const override
Definition: pns_via.h:285
void SetIsFree(bool aIsFree)
Definition: pns_via.h:239
void SetViaType(VIATYPE aViaType)
Definition: pns_via.h:198
int EffectiveLayer(int aLayer) const
Definition: pns_via.cpp:33
PADSTACK::UNCONNECTED_LAYER_MODE UnconnectedLayerMode() const
Definition: pns_via.h:200
int Drill() const
Definition: pns_via.h:228
void SetPos(const VECTOR2I &aPos)
Definition: pns_via.h:186
VIA & operator=(const VIA &aB)
Definition: pns_via.h:141
void SetDrill(int aDrill)
Definition: pns_via.h:230
VIATYPE m_viaType
Definition: pns_via.h:298
bool ConnectsLayer(int aLayer) const
Definition: pns_via.cpp:78
virtual ~VIA()
Definition: pns_via.h:135
HOLE * m_hole
Definition: pns_via.h:301
bool PadstackMatches(const VIA &aOther) const
Definition: pns_via.cpp:99
bool IsFree() const
Definition: pns_via.h:238
VECTOR2I m_pos
Definition: pns_via.h:297
const SHAPE_LINE_CHAIN Hull(int aClearance=0, int aWalkaroundThickness=0, int aLayer=-1) const override
Definition: pns_via.cpp:226
void SetUnconnectedLayerMode(PADSTACK::UNCONNECTED_LAYER_MODE aMode)
Definition: pns_via.h:201
STACK_MODE
Definition: pns_via.h:62
static constexpr int ALL_LAYERS
Definition: pns_via.h:76
static constexpr int INNER_LAYERS
Definition: pns_via.h:77
void SetStackMode(STACK_MODE aStackMode)
Definition: pns_via.cpp:87
PADSTACK::UNCONNECTED_LAYER_MODE m_unconnectedLayerMode
Definition: pns_via.h:299
bool HasUniqueShapeLayers() const override
Definition: pns_via.h:182
bool m_isFree
Definition: pns_via.h:300
STACK_MODE StackMode() const
Definition: pns_via.h:174
STACK_MODE m_stackMode
Definition: pns_via.h:290
virtual bool HasHole() const override
Definition: pns_via.h:284
VIA * Clone() const override
Return a deep copy of the item.
Definition: pns_via.cpp:244
VVIA(const VECTOR2I &aPos, int aLayer, int aDiameter, NET_HANDLE aNet)
Definition: pns_via.h:308
bool HasHole() const override
Definition: pns_via.h:314
Represent a contiguous set of PCB layers.
Definition: pns_layerset.h:32
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
An abstract shape on 2D plane.
Definition: shape.h:126
Push and Shove diff pair dimensions (gap) settings dialog.
void * NET_HANDLE
Definition: pns_item.h:55
VIATYPE
Definition: pcb_track.h:66
VIA_HANDLE(VECTOR2I aPos, PNS_LAYER_RANGE aLayers, NET_HANDLE aNet)
Definition: pns_via.h:46
VECTOR2I pos
Definition: pns_via.h:53
NET_HANDLE net
Definition: pns_via.h:55
PNS_LAYER_RANGE layers
Definition: pns_via.h:54