KiCad PCB EDA Suite
Loading...
Searching...
No Matches
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, FLIP_DIRECTION aFlipDirection )
94{
95 if( aFlipDirection == FLIP_DIRECTION::LEFT_RIGHT )
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
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::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
123{
124 // Targets are on *every* layer by definition
125 return _( "Target" );
126}
127
128
130{
131 return BITMAPS::add_pcb_target;
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
192bool PCB_TARGET::operator==( const BOARD_ITEM& aBoardItem ) const
193{
194 if( aBoardItem.Type() != Type() )
195 return false;
196
197 const PCB_TARGET& other = static_cast<const PCB_TARGET&>( aBoardItem );
198
199 return *this == other;
200}
201
202
203bool PCB_TARGET::operator==( const PCB_TARGET& aOther ) const
204{
205 return m_shape == aOther.m_shape
206 && m_size == aOther.m_size
207 && m_lineWidth == aOther.m_lineWidth
208 && m_layer == aOther.m_layer
209 && m_pos == aOther.m_pos;
210}
211
212
213double PCB_TARGET::Similarity( const BOARD_ITEM& aOther ) const
214{
215 if( aOther.Type() != Type() )
216 return 0.0;
217
218 const PCB_TARGET& other = static_cast<const PCB_TARGET&>( aOther );
219
220 double similarity = 1.0;
221
222 if( GetShape() != other.GetShape() )
223 similarity *= 0.9;
224
225 if( GetSize() != other.GetSize() )
226 similarity *= 0.9;
227
228 if( GetWidth() != other.GetWidth() )
229 similarity *= 0.9;
230
231 if( GetLayer() != other.GetLayer() )
232 similarity *= 0.9;
233
234 if( GetPosition() != other.GetPosition() )
235 similarity *= 0.9;
236
237 return similarity;
238}
239
240static struct PCB_TARGET_DESC
241{
243 {
247 propMgr.AddProperty( new PROPERTY<PCB_TARGET, int>( _HKI( "Size" ),
248 &PCB_TARGET::SetSize, &PCB_TARGET::GetSize, PROPERTY_DISPLAY::PT_SIZE ) );
249 propMgr.AddProperty( new PROPERTY<PCB_TARGET, int>( _HKI( "Width" ),
250 &PCB_TARGET::SetWidth, &PCB_TARGET::GetWidth, PROPERTY_DISPLAY::PT_SIZE ) );
251
252 auto shape = new PROPERTY<PCB_TARGET, int>( _HKI( "Shape" ),
254 // TODO change the integer to an enum?
255 //shape->SetValues( { { 0, _HKI( "Cross" ) }, { 1, ( "Plus" ) } } );
256 propMgr.AddProperty( shape );
257 }
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
Definition: approximation.h:32
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:33
#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:80
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:238
PCB_LAYER_ID m_layer
Definition: board_item.h:435
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:289
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:47
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
Definition: board_item.cpp:139
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:558
constexpr void SetHeight(size_type val)
Definition: box2.h:292
constexpr bool Contains(const Vec &aPoint) const
Definition: box2.h:168
constexpr void SetWidth(size_type val)
Definition: box2.h:287
constexpr void SetX(coord_type val)
Definition: box2.h:277
constexpr void SetY(coord_type val)
Definition: box2.h:282
constexpr bool Intersects(const BOX2< Vec > &aRect) const
Definition: box2.h:311
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:89
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:101
void SetEndX(int aX)
Definition: eda_shape.h:183
void SetStart(const VECTOR2I &aStart)
Definition: eda_shape.h:134
void SetEnd(const VECTOR2I &aEnd)
Definition: eda_shape.h:171
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
Definition: pcb_shape.cpp:636
int m_lineWidth
Definition: pcb_target.h:128
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
Definition: pcb_target.cpp:122
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 Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
Definition: pcb_target.cpp:93
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
bool operator==(const PCB_TARGET &aOther) const
Definition: pcb_target.cpp:203
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 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:129
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
double Similarity(const BOARD_ITEM &aBoardItem) const override
Return a measure of how likely the other object is to represent the same object.
Definition: pcb_target.cpp:213
VECTOR2I GetPosition() const override
Definition: pcb_target.h:55
Provide class metadata.Helper macro to map type hashes to names.
Definition: property_mgr.h:85
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:87
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
Represent a set of closed polygons.
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
#define _HKI(x)
#define _(s)
@ DEGREES_T
Definition: eda_angle.h:31
Some functions to handle hotkeys in KiCad.
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayerId, int aCopperLayersCount)
Definition: layer_id.cpp:209
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:60
@ Edge_Cuts
Definition: layer_ids.h:112
FLIP_DIRECTION
Definition: mirror.h:27
static struct PCB_TARGET_DESC _PCB_TARGET_DESC
#define TYPE_HASH(x)
Definition: property.h:71
#define REGISTER_TYPE(x)
Definition: property_mgr.h:371
constexpr int mmToIU(double mm) const
Definition: base_units.h:88
void RotatePoint(int *pX, int *pY, const EDA_ANGLE &aAngle)
Calculate the new point of coord coord pX, pY, for a rotation center 0, 0.
Definition: trigo.cpp:229
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
Definition: typeinfo.h:106
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:691