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, 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::GetItemDescription( UNITS_PROVIDER* aUnitsProvider ) 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& aOther ) const
193{
194 if( aOther.Type() != Type() )
195 return false;
196
197 const PCB_TARGET& other = static_cast<const PCB_TARGET&>( aOther );
198
199 return m_shape == other.m_shape && m_size == other.m_size && m_lineWidth == other.m_lineWidth
200 && m_layer == other.m_layer && m_pos == other.m_pos;
201}
202
203
204double PCB_TARGET::Similarity( const BOARD_ITEM& aOther ) const
205{
206 if( aOther.Type() != Type() )
207 return 0.0;
208
209 const PCB_TARGET& other = static_cast<const PCB_TARGET&>( aOther );
210
211 double similarity = 1.0;
212
213 if( GetShape() != other.GetShape() )
214 similarity *= 0.9;
215
216 if( GetSize() != other.GetSize() )
217 similarity *= 0.9;
218
219 if( GetWidth() != other.GetWidth() )
220 similarity *= 0.9;
221
222 if( GetLayer() != other.GetLayer() )
223 similarity *= 0.9;
224
225 if( GetPosition() != other.GetPosition() )
226 similarity *= 0.9;
227
228 return similarity;
229}
230
231static struct PCB_TARGET_DESC
232{
234 {
238 propMgr.AddProperty( new PROPERTY<PCB_TARGET, int>( _HKI( "Size" ),
239 &PCB_TARGET::SetSize, &PCB_TARGET::GetSize, PROPERTY_DISPLAY::PT_SIZE ) );
240 propMgr.AddProperty( new PROPERTY<PCB_TARGET, int>( _HKI( "Width" ),
241 &PCB_TARGET::SetWidth, &PCB_TARGET::GetWidth, PROPERTY_DISPLAY::PT_SIZE ) );
242
243 auto shape = new PROPERTY<PCB_TARGET, int>( _HKI( "Shape" ),
245 // TODO change the integer to an enum?
246 //shape->SetValues( { { 0, _HKI( "Cross" ) }, { 1, ( "Plus" ) } } );
247 propMgr.AddProperty( shape );
248 }
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:77
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:405
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:272
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:46
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
Definition: board_item.cpp:103
void SetHeight(size_type val)
Definition: box2.h:275
void SetX(coord_type val)
Definition: box2.h:260
bool Intersects(const BOX2< Vec > &aRect) const
Definition: box2.h:294
void SetWidth(size_type val)
Definition: box2.h:270
void SetY(coord_type val)
Definition: box2.h:265
bool Contains(const Vec &aPoint) const
Definition: box2.h:158
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:541
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:88
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:100
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:525
int m_lineWidth
Definition: pcb_target.h:127
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
bool operator==(const BOARD_ITEM &aBoardItem) const override
Definition: pcb_target.cpp:192
void SetSize(int aSize)
Definition: pcb_target.h:60
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider) const override
Return a user-visible description string of this item.
Definition: pcb_target.cpp:122
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
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:128
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:204
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
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:149
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ Edge_Cuts
Definition: layer_ids.h:113
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayerId, int aCopperLayersCount)
Definition: lset.cpp:634
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:228
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
Definition: typeinfo.h:106
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:673