KiCad PCB EDA Suite
Loading...
Searching...
No Matches
board_construction_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 The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
21
22#include <pcb_shape.h>
23#include <footprint.h>
24#include <geometry/seg.h>
25#include <math/vector2d.h>
26
27
28namespace KI_TEST
29{
30
31void DrawSegment( FOOTPRINT& aFootprint, const SEG& aSeg, int aWidth, PCB_LAYER_ID aLayer )
32{
33 std::unique_ptr<PCB_SHAPE> seg = std::make_unique<PCB_SHAPE>( &aFootprint, SHAPE_T::SEGMENT );
34
35 seg->SetStart( aSeg.A );
36 seg->SetEnd( aSeg.B );
37
38 seg->SetStroke( STROKE_PARAMS( aWidth, LINE_STYLE::SOLID ) );
39 seg->SetLayer( aLayer );
40
41 seg->Rotate( { 0, 0 }, aFootprint.GetOrientation() );
42 seg->Move( aFootprint.GetPosition() );
43
44 aFootprint.Add( seg.release() );
45}
46
47
48void DrawPolyline( FOOTPRINT& aFootprint, const std::vector<VECTOR2I>& aPts, int aWidth,
49 PCB_LAYER_ID aLayer )
50{
51 for( unsigned i = 0; i < aPts.size() - 1; ++i )
52 {
53 DrawSegment( aFootprint, { aPts[i], aPts[i + 1] }, aWidth, aLayer );
54 }
55}
56
57
58void DrawArc( FOOTPRINT& aFootprint, const VECTOR2I& aCentre, const VECTOR2I& aStart,
59 const EDA_ANGLE& aAngle, int aWidth, PCB_LAYER_ID aLayer )
60{
61 std::unique_ptr<PCB_SHAPE> arc = std::make_unique<PCB_SHAPE>( &aFootprint, SHAPE_T::ARC );
62
63 arc->SetCenter( aCentre );
64 arc->SetStart( aStart );
65 arc->SetArcAngleAndEnd( aAngle );
66
67 arc->SetStroke( STROKE_PARAMS( aWidth, LINE_STYLE::SOLID ) );
68 arc->SetLayer( aLayer );
69
70 arc->Rotate( { 0, 0 }, aFootprint.GetOrientation() );
71 arc->Move( aFootprint.GetPosition() );
72
73 aFootprint.Add( arc.release() );
74}
75
76
77void DrawRect( FOOTPRINT& aFootprint, const VECTOR2I& aPos, const VECTOR2I& aSize, int aRadius,
78 int aWidth, PCB_LAYER_ID aLayer )
79{
80 const auto x_r = aPos.x + aSize.x / 2;
81 const auto x_l = aPos.x - aSize.x / 2;
82 const auto y_t = aPos.y + aSize.y / 2;
83 const auto y_b = aPos.y - aSize.y / 2;
84
85 const auto xin_r = x_r - aRadius;
86 const auto xin_l = x_l + aRadius;
87 const auto yin_t = y_t - aRadius;
88 const auto yin_b = y_b + aRadius;
89
90 // If non-zero (could be zero if it's a stadium shape)
91 if( xin_l != xin_r )
92 {
93 DrawSegment( aFootprint, { { xin_l, y_t }, { xin_r, y_t } }, aWidth, aLayer );
94 DrawSegment( aFootprint, { { xin_l, y_b }, { xin_r, y_b } }, aWidth, aLayer );
95 }
96
97 if( yin_b != yin_t )
98 {
99 DrawSegment( aFootprint, { { x_l, yin_b }, { x_l, yin_t } }, aWidth, aLayer );
100 DrawSegment( aFootprint, { { x_r, yin_b }, { x_r, yin_t } }, aWidth, aLayer );
101 }
102
103 if( aRadius > 0 )
104 {
105 DrawArc( aFootprint, { xin_r, yin_t }, { x_r, yin_t }, ANGLE_90, aWidth, aLayer );
106 DrawArc( aFootprint, { xin_l, yin_t }, { xin_l, y_t }, ANGLE_90, aWidth, aLayer );
107 DrawArc( aFootprint, { xin_l, yin_b }, { x_l, yin_b }, ANGLE_90, aWidth, aLayer );
108 DrawArc( aFootprint, { xin_r, yin_b }, { xin_r, y_b }, ANGLE_90, aWidth, aLayer );
109 }
110}
111
112} // namespace KI_TEST
Construction utilities for PCB tests.
EDA_ANGLE GetOrientation() const
Definition footprint.h:404
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
VECTOR2I GetPosition() const override
Definition footprint.h:401
Definition seg.h:38
VECTOR2I A
Definition seg.h:45
VECTOR2I B
Definition seg.h:46
Simple container to manage line stroke parameters.
static constexpr EDA_ANGLE ANGLE_90
Definition eda_angle.h:413
@ SEGMENT
Definition eda_shape.h:46
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
void DrawArc(FOOTPRINT &aFootprint, const VECTOR2I &aCentre, const VECTOR2I &aStart, const EDA_ANGLE &aAngle, int aWidth, PCB_LAYER_ID aLayer)
Draw an arc on a footprint.
void DrawSegment(FOOTPRINT &aFootprint, const SEG &aSeg, int aWidth, PCB_LAYER_ID aLayer)
Draw a segment in the given footprint.
void DrawRect(FOOTPRINT &aFootprint, const VECTOR2I &aPos, const VECTOR2I &aSize, int aRadius, int aWidth, PCB_LAYER_ID aLayer)
Draw a rectangle on a footprint.
void DrawPolyline(FOOTPRINT &aFootprint, const std::vector< VECTOR2I > &aPts, int aWidth, PCB_LAYER_ID aLayer)
Draw a polyline - a set of linked segments.
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:683