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 The 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, see <https://www.gnu.org/licenses/>.
21 */
22#include "pcb_target.h"
23
24#include <bitmaps.h>
25#include <board.h>
27#include <base_units.h>
30#include <trigo.h>
31#include <i18n_utility.h>
33#include <eda_draw_frame.h>
34#include <pcb_shape.h>
35#include <properties/property.h>
37
38
40 BOARD_ITEM( aParent, PCB_TARGET_T )
41{
42 m_shape = 0;
43 m_size = pcbIUScale.mmToIU( 5 ); // Gives a decent size
45 m_layer = Edge_Cuts; // a target is on all layers
46}
47
48PCB_TARGET::PCB_TARGET( BOARD_ITEM* aParent, int aShape, PCB_LAYER_ID aLayer, const VECTOR2I& aPos,
49 int aSize, int aWidth ) :
50 BOARD_ITEM( aParent, PCB_TARGET_T )
51{
52 m_shape = aShape;
53 m_layer = aLayer;
54 m_pos = aPos;
55 m_size = aSize;
56 m_lineWidth = aWidth;
57}
58
59
63
64
65bool PCB_TARGET::HitTest( const VECTOR2I& aPosition, int aAccuracy ) const
66{
67 int dX = aPosition.x - m_pos.x;
68 int dY = aPosition.y - m_pos.y;
69 int radius = aAccuracy + ( m_size / 2 );
70 return abs( dX ) <= radius && abs( dY ) <= radius;
71}
72
73
74bool PCB_TARGET::HitTest( const BOX2I& aRect, bool aContained, int aAccuracy ) const
75{
76 BOX2I arect = aRect;
77 arect.Inflate( aAccuracy );
78
79 if( aContained )
80 return arect.Contains( GetBoundingBox() );
81 else
82 return GetBoundingBox().Intersects( arect );
83}
84
85
86void PCB_TARGET::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
87{
88 RotatePoint( m_pos, aRotCentre, aAngle );
89}
90
91
92void PCB_TARGET::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
93{
94 if( aFlipDirection == FLIP_DIRECTION::LEFT_RIGHT )
95 m_pos.x = aCentre.x - ( m_pos.x - aCentre.x );
96 else
97 m_pos.y = aCentre.y - ( m_pos.y - aCentre.y );
98
100}
101
102
104{
105 BOX2I bBox;
106 bBox.SetX( m_pos.x - m_size / 2 );
107 bBox.SetY( m_pos.y - m_size / 2 );
108 bBox.SetWidth( m_size );
109 bBox.SetHeight( m_size );
110
111 return bBox;
112}
113
114
115std::shared_ptr<SHAPE> PCB_TARGET::GetEffectiveShape( PCB_LAYER_ID aLayer, FLASHING aFlash ) const
116{
117 return std::make_shared<SHAPE_CIRCLE>( m_pos, m_size / 2 );
118}
119
120
121wxString PCB_TARGET::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
122{
123 // Targets are on *every* layer by definition
124 return _( "Target" );
125}
126
127
132
133
135{
136 return new PCB_TARGET( *this );
137}
138
139
141{
142 wxASSERT( aImage->Type() == PCB_TARGET_T );
143
144 std::swap( *((PCB_TARGET*) this), *((PCB_TARGET*) aImage) );
145}
146
147
148void PCB_TARGET::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
149{
150 aList.emplace_back( _( "PCB Target" ), wxEmptyString );
151
152 aList.emplace_back( _( "Layer" ), GetLayerName() );
153
154 aList.emplace_back( _( "Size" ), aFrame->MessageTextFromValue( GetSize() ) );
155 aList.emplace_back( _( "Width" ), aFrame->MessageTextFromValue( GetWidth() ) );
156 aList.emplace_back( _( "Shape" ), GetShape() == 0 ? wxT( "+" ) : wxT( "X" ) );
157}
158
159
161 int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth ) const
162{
163 int size = KiROUND( GetShape() ? GetSize() / 1.5 : GetSize() / 2.0 );
164 int radius = KiROUND( GetShape() ? GetSize() / 2.0 : GetSize() / 3.0 );
165
166 PCB_SHAPE line1, line2;
167 PCB_SHAPE circle( nullptr, SHAPE_T::CIRCLE );
168 line1.SetStart( VECTOR2I( -size, 0.0 ) );
169 line1.SetEnd( VECTOR2I( size, 0.0 ) );
170 line2.SetStart( VECTOR2I( 0.0, -size ) );
171 line2.SetEnd( VECTOR2I( 0.0, size ) );
172 circle.SetEndX( radius );
173
174 if( GetShape() ) // shape x
175 {
176 line1.Rotate( VECTOR2I(0,0), EDA_ANGLE( 45.0, DEGREES_T ) );
177 line2.Rotate( VECTOR2I(0,0), EDA_ANGLE( 45.0, DEGREES_T ) );
178 }
179
180 for( PCB_SHAPE* item: { &line1, &line2, &circle } )
181 {
182 item->SetWidth( GetWidth() );
183 item->Move( GetPosition() );
184 item->TransformShapeToPolygon( aBuffer, aLayer, aClearance, aError, aErrorLoc, ignoreLineWidth );
185 }
186}
187
188
189bool PCB_TARGET::operator==( const BOARD_ITEM& aBoardItem ) const
190{
191 if( aBoardItem.Type() != Type() )
192 return false;
193
194 const PCB_TARGET& other = static_cast<const PCB_TARGET&>( aBoardItem );
195
196 return *this == other;
197}
198
199
200bool PCB_TARGET::operator==( const PCB_TARGET& aOther ) const
201{
202 return m_shape == aOther.m_shape
203 && m_size == aOther.m_size
204 && m_lineWidth == aOther.m_lineWidth
205 && m_layer == aOther.m_layer
206 && m_pos == aOther.m_pos;
207}
208
209
210double PCB_TARGET::Similarity( const BOARD_ITEM& aOther ) const
211{
212 if( aOther.Type() != Type() )
213 return 0.0;
214
215 const PCB_TARGET& other = static_cast<const PCB_TARGET&>( aOther );
216
217 double similarity = 1.0;
218
219 if( GetShape() != other.GetShape() )
220 similarity *= 0.9;
221
222 if( GetSize() != other.GetSize() )
223 similarity *= 0.9;
224
225 if( GetWidth() != other.GetWidth() )
226 similarity *= 0.9;
227
228 if( GetLayer() != other.GetLayer() )
229 similarity *= 0.9;
230
231 if( GetPosition() != other.GetPosition() )
232 similarity *= 0.9;
233
234 return similarity;
235}
236
237static struct PCB_TARGET_DESC
238{
240 {
244 propMgr.AddProperty( new PROPERTY<PCB_TARGET, int>( _HKI( "Size" ),
246 propMgr.AddProperty( new PROPERTY<PCB_TARGET, int>( _HKI( "Width" ),
248
249 auto shape = new PROPERTY<PCB_TARGET, int>( _HKI( "Shape" ),
251 // TODO change the integer to an enum?
252 //shape->SetValues( { { 0, _HKI( "Cross" ) }, { 1, ( "Plus" ) } } );
253 propMgr.AddProperty( shape );
254 }
ERROR_LOC
When approximating an arc or circle, should the error be placed on the outside or inside of the curve...
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:121
BITMAPS
A list of all bitmap identifiers.
@ add_pcb_target
#define DEFAULT_COPPER_LINE_WIDTH
BOX2< VECTOR2I > BOX2I
Definition box2.h:918
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:986
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:81
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
Definition board_item.h:83
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition board_item.h:265
PCB_LAYER_ID m_layer
Definition board_item.h:508
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition board_item.h:313
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition box2.h:554
constexpr void SetHeight(size_type val)
Definition box2.h:288
constexpr bool Contains(const Vec &aPoint) const
Definition box2.h:164
constexpr void SetWidth(size_type val)
Definition box2.h:283
constexpr void SetX(coord_type val)
Definition box2.h:273
constexpr void SetY(coord_type val)
Definition box2.h:278
constexpr bool Intersects(const BOX2< Vec > &aRect) const
Definition box2.h:307
The base class for create windows for drawing purpose.
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:108
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:37
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
void SetEnd(const VECTOR2I &aEnd) override
void SetStart(const VECTOR2I &aStart) override
int m_lineWidth
Definition pcb_target.h:124
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
int GetShape() const
Definition pcb_target.h:54
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
int GetWidth() const
Definition pcb_target.h:60
PCB_TARGET(BOARD_ITEM *aParent)
void SetWidth(int aWidth)
Definition pcb_target.h:59
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
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.
void SetSize(int aSize)
Definition pcb_target.h:56
bool operator==(const PCB_TARGET &aOther) const
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.
void SetShape(int aShape)
Definition pcb_target.h:53
int GetSize() const
Definition pcb_target.h:57
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
VECTOR2I m_pos
Definition pcb_target.h:125
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
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.
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
virtual void swapData(BOARD_ITEM *aImage) override
double Similarity(const BOARD_ITEM &aBoardItem) const override
Return a measure of how likely the other object is to represent the same object.
VECTOR2I GetPosition() const override
Definition pcb_target.h:51
Provide class metadata.Helper macro to map type hashes to names.
void InheritsAfter(TYPE_ID aDerived, TYPE_ID aBase)
Declare an inheritance relationship between types.
static PROPERTY_MANAGER & Instance()
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 _(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:173
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
Definition layer_ids.h:180
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
@ Edge_Cuts
Definition layer_ids.h:108
FLIP_DIRECTION
Definition mirror.h:23
@ LEFT_RIGHT
Flip left to right (around the Y axis)
Definition mirror.h:24
#define _HKI(x)
Definition page_info.cpp:40
static struct PCB_TARGET_DESC _PCB_TARGET_DESC
#define TYPE_HASH(x)
Definition property.h:74
@ PT_SIZE
Size expressed in distance units (mm/inch)
Definition property.h:63
#define REGISTER_TYPE(x)
int radius
SHAPE_CIRCLE circle(c.m_circle_center, c.m_circle_radius)
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:225
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
Definition typeinfo.h:100
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:683