KiCad PCB EDA Suite
pcb_target.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) 2012 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <[email protected]>
6 * Copyright (C) 2012 Wayne Stambaugh <[email protected]>
7 * Copyright (C) 1992-2022 KiCad Developers, see AUTHORS.txt for contributors.
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, you may find one here:
21 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22 * or you may search the http://www.gnu.org website for the version 2 license,
23 * or you may write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25 */
26
27#include <bitmaps.h>
28#include <board.h>
30#include <pcb_target.h>
31#include <base_units.h>
34#include <trigo.h>
35#include <i18n_utility.h>
37#include <eda_draw_frame.h>
38#include <pcb_shape.h>
39
41 BOARD_ITEM( aParent, PCB_TARGET_T )
42{
43 m_shape = 0;
44 m_size = pcbIUScale.mmToIU( 5 ); // Gives a decent size
46 m_layer = Edge_Cuts; // a target is on all layers
47}
48
49PCB_TARGET::PCB_TARGET( BOARD_ITEM* aParent, int aShape, PCB_LAYER_ID aLayer, const VECTOR2I& aPos,
50 int aSize, int aWidth ) :
51 BOARD_ITEM( aParent, PCB_TARGET_T )
52{
53 m_shape = aShape;
54 m_layer = aLayer;
55 m_pos = aPos;
56 m_size = aSize;
57 m_lineWidth = aWidth;
58}
59
60
62{
63}
64
65
66bool PCB_TARGET::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
67{
68 int dX = aPosition.x - m_pos.x;
69 int dY = aPosition.y - m_pos.y;
70 int radius = aAccuracy + ( m_size / 2 );
71 return abs( dX ) <= radius && abs( dY ) <= radius;
72}
73
74
75bool PCB_TARGET::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
76{
77 BOX2I arect = aRect;
78 arect.Inflate( aAccuracy );
79
80 if( aContained )
81 return arect.Contains( GetBoundingBox() );
82 else
83 return GetBoundingBox().Intersects( arect );
84}
85
86
87void PCB_TARGET::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
88{
89 RotatePoint( m_pos, aRotCentre, aAngle );
90}
91
92
93void PCB_TARGET::Flip( const VECTOR2I& aCentre, bool aFlipLeftRight )
94{
95 if( aFlipLeftRight )
96 m_pos.x = aCentre.x - ( m_pos.x - aCentre.x );
97 else
98 m_pos.y = aCentre.y - ( m_pos.y - aCentre.y );
99
100 SetLayer( FlipLayer( GetLayer(), GetBoard()->GetCopperLayerCount() ) );
101}
102
103
105{
106 BOX2I bBox;
107 bBox.SetX( m_pos.x - m_size / 2 );
108 bBox.SetY( m_pos.y - m_size / 2 );
109 bBox.SetWidth( m_size );
110 bBox.SetHeight( m_size );
111
112 return bBox;
113}
114
115
116std::shared_ptr<SHAPE> PCB_TARGET::GetEffectiveShape( PCB_LAYER_ID aLayer, FLASHING aFlash ) const
117{
118 return std::make_shared<SHAPE_CIRCLE>( m_pos, m_size / 2 );
119}
120
121
122wxString PCB_TARGET::GetSelectMenuText( UNITS_PROVIDER* aUnitsProvider ) const
123{
124 // Targets are on *every* layer by definition
125 return _( "Target" );
126}
127
128
130{
132}
133
134
136{
137 return new PCB_TARGET( *this );
138}
139
140
142{
143 assert( aImage->Type() == PCB_TARGET_T );
144
145 std::swap( *((PCB_TARGET*) this), *((PCB_TARGET*) aImage) );
146}
147
148
149void PCB_TARGET::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
150{
151 aList.emplace_back( _( "PCB Target" ), wxEmptyString );
152
153 aList.emplace_back( _( "Layer" ), GetLayerName() );
154
155 aList.emplace_back( _( "Size" ), aFrame->MessageTextFromValue( GetSize() ) );
156 aList.emplace_back( _( "Width" ), aFrame->MessageTextFromValue( GetWidth() ) );
157 aList.emplace_back( _( "Shape" ), GetShape() == 0 ? wxT( "+" ) : wxT( "X" ) );
158}
159
160
162 int aClearance, int aError, ERROR_LOC aErrorLoc,
163 bool ignoreLineWidth ) const
164{
165 int size = GetShape() ? GetSize() / 1.5 : GetSize() / 2.0;
166 int radius = GetShape() ? GetSize() / 2.0 : GetSize() / 3.0;
167
168 PCB_SHAPE line1, line2;
169 PCB_SHAPE circle( nullptr, SHAPE_T::CIRCLE );
170 line1.SetStart( VECTOR2I( -size, 0.0 ) );
171 line1.SetEnd( VECTOR2I( size, 0.0 ) );
172 line2.SetStart( VECTOR2I( 0.0, -size ) );
173 line2.SetEnd( VECTOR2I( 0.0, size ) );
174 circle.SetEndX( radius );
175
176 if( GetShape() ) // shape x
177 {
178 line1.Rotate( VECTOR2I(0,0), EDA_ANGLE( 45.0, DEGREES_T ) );
179 line2.Rotate( VECTOR2I(0,0), EDA_ANGLE( 45.0, DEGREES_T ) );
180 }
181
182 for( PCB_SHAPE* item: { &line1, &line2, &circle } )
183 {
184 item->SetWidth( GetWidth() );
185 item->Move( GetPosition() );
186 item->TransformShapeToPolygon( aBuffer, aLayer, aClearance, aError, aErrorLoc,
187 ignoreLineWidth );
188 }
189}
190
191
192static struct PCB_TARGET_DESC
193{
195 {
199 propMgr.AddProperty( new PROPERTY<PCB_TARGET, int>( _HKI( "Size" ),
201 propMgr.AddProperty( new PROPERTY<PCB_TARGET, int>( _HKI( "Width" ),
203
204 auto shape = new PROPERTY<PCB_TARGET, int>( _HKI( "Shape" ),
206 // TODO change the integer to an enum?
207 //shape->SetValues( { { 0, _HKI( "Cross" ) }, { 1, ( "Plus" ) } } );
208 propMgr.AddProperty( shape );
209 }
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:109
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:33
@ add_pcb_target
#define DEFAULT_COPPER_LINE_WIDTH
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:58
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:180
PCB_LAYER_ID m_layer
Definition: board_item.h:329
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:214
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:43
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
Definition: board_item.cpp:94
void SetX(coord_type val)
Definition: box2.h:235
bool Intersects(const BOX2< Vec > &aRect) const
Definition: box2.h:269
void SetY(coord_type val)
Definition: box2.h:240
void SetWidth(coord_type val)
Definition: box2.h:245
bool Contains(const Vec &aPoint) const
Definition: box2.h:141
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:506
void SetHeight(coord_type val)
Definition: box2.h:250
The base class for create windows for drawing purpose.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:85
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:97
void SetEndX(int x)
Definition: eda_shape.h:157
void SetStart(const VECTOR2I &aStart)
Definition: eda_shape.h:120
void SetEnd(const VECTOR2I &aEnd)
Definition: eda_shape.h:145
virtual void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
Definition: pcb_shape.cpp:191
int m_lineWidth
Definition: pcb_target.h:123
int GetShape() const
Definition: pcb_target.h:58
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition: pcb_target.cpp:135
int GetWidth() const
Definition: pcb_target.h:64
PCB_TARGET(BOARD_ITEM *aParent)
Definition: pcb_target.cpp:40
void SetWidth(int aWidth)
Definition: pcb_target.h:63
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
Definition: pcb_target.cpp:87
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the shape to a closed polygon.
Definition: pcb_target.cpp:161
void SetSize(int aSize)
Definition: pcb_target.h:60
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer, FLASHING aFlash=FLASHING::DEFAULT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
Definition: pcb_target.cpp:116
void Flip(const VECTOR2I &aCentre, bool aFlipLeftRight) override
Flip this object, i.e.
Definition: pcb_target.cpp:93
wxString GetSelectMenuText(UNITS_PROVIDER *aUnitsProvider) const override
Return the text to display to be used in the selection clarification context menu when multiple items...
Definition: pcb_target.cpp:122
void SetShape(int aShape)
Definition: pcb_target.h:57
int GetSize() const
Definition: pcb_target.h:61
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
Definition: pcb_target.cpp:66
VECTOR2I m_pos
Definition: pcb_target.h:124
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
Definition: pcb_target.cpp:129
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
Definition: pcb_target.cpp:149
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
Definition: pcb_target.cpp:104
virtual void swapData(BOARD_ITEM *aImage) override
Definition: pcb_target.cpp:141
VECTOR2I GetPosition() const override
Definition: pcb_target.h:55
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:64
void AddProperty(PROPERTY_BASE *aProperty)
Register a property.
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:66
Represent a set of closed polygons.
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE)
A lower-precision version of StringFromValue().
#define _HKI(x)
#define _(s)
@ DEGREES_T
Definition: eda_angle.h:31
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
Some functions to handle hotkeys in KiCad.
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
Definition: layer_ids.h:147
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:59
@ Edge_Cuts
Definition: layer_ids.h:113
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayerId, int aCopperLayersCount)
Definition: lset.cpp:544
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
Definition: eda_angle.h:401
static struct PCB_TARGET_DESC _PCB_TARGET_DESC
#define TYPE_HASH(x)
Definition: property.h:61
@ PT_SIZE
Size expressed in distance units (mm/inch)
Definition: property.h:54
#define REGISTER_TYPE(x)
Definition: property_mgr.h:256
constexpr int mmToIU(double mm) const
Definition: base_units.h:89
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Definition: trigo.cpp:183
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
Definition: typeinfo.h:111
VECTOR2< int > VECTOR2I
Definition: vector2d.h:618