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>
28#include <base_units.h>
31#include <trigo.h>
32#include <i18n_utility.h>
34#include <eda_draw_frame.h>
35#include <pcb_shape.h>
36#include <properties/property.h>
38
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
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
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
133
134
136{
137 return new PCB_TARGET( *this );
138}
139
140
142{
143 wxASSERT( 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 aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth ) const
163{
164 int size = KiROUND( GetShape() ? GetSize() / 1.5 : GetSize() / 2.0 );
165 int radius = KiROUND( GetShape() ? GetSize() / 2.0 : GetSize() / 3.0 );
166
167 PCB_SHAPE line1, line2;
168 PCB_SHAPE circle( nullptr, SHAPE_T::CIRCLE );
169 line1.SetStart( VECTOR2I( -size, 0.0 ) );
170 line1.SetEnd( VECTOR2I( size, 0.0 ) );
171 line2.SetStart( VECTOR2I( 0.0, -size ) );
172 line2.SetEnd( VECTOR2I( 0.0, size ) );
173 circle.SetEndX( radius );
174
175 if( GetShape() ) // shape x
176 {
177 line1.Rotate( VECTOR2I(0,0), EDA_ANGLE( 45.0, DEGREES_T ) );
178 line2.Rotate( VECTOR2I(0,0), EDA_ANGLE( 45.0, DEGREES_T ) );
179 }
180
181 for( PCB_SHAPE* item: { &line1, &line2, &circle } )
182 {
183 item->SetWidth( GetWidth() );
184 item->Move( GetPosition() );
185 item->TransformShapeToPolygon( aBuffer, aLayer, aClearance, aError, aErrorLoc, ignoreLineWidth );
186 }
187}
188
189
190bool PCB_TARGET::operator==( const BOARD_ITEM& aBoardItem ) const
191{
192 if( aBoardItem.Type() != Type() )
193 return false;
194
195 const PCB_TARGET& other = static_cast<const PCB_TARGET&>( aBoardItem );
196
197 return *this == other;
198}
199
200
201bool PCB_TARGET::operator==( const PCB_TARGET& aOther ) const
202{
203 return m_shape == aOther.m_shape
204 && m_size == aOther.m_size
205 && m_lineWidth == aOther.m_lineWidth
206 && m_layer == aOther.m_layer
207 && m_pos == aOther.m_pos;
208}
209
210
211double PCB_TARGET::Similarity( const BOARD_ITEM& aOther ) const
212{
213 if( aOther.Type() != Type() )
214 return 0.0;
215
216 const PCB_TARGET& other = static_cast<const PCB_TARGET&>( aOther );
217
218 double similarity = 1.0;
219
220 if( GetShape() != other.GetShape() )
221 similarity *= 0.9;
222
223 if( GetSize() != other.GetSize() )
224 similarity *= 0.9;
225
226 if( GetWidth() != other.GetWidth() )
227 similarity *= 0.9;
228
229 if( GetLayer() != other.GetLayer() )
230 similarity *= 0.9;
231
232 if( GetPosition() != other.GetPosition() )
233 similarity *= 0.9;
234
235 return similarity;
236}
237
238static struct PCB_TARGET_DESC
239{
241 {
245 propMgr.AddProperty( new PROPERTY<PCB_TARGET, int>( _HKI( "Size" ),
247 propMgr.AddProperty( new PROPERTY<PCB_TARGET, int>( _HKI( "Width" ),
249
250 // TODO change the integer to an enum?
251 //shape->SetValues( { { 0, _HKI( "Cross" ) }, { 1, ( "Plus" ) } } );
252 propMgr.AddProperty( new PROPERTY<PCB_TARGET, int>( _HKI( "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:128
BITMAPS
A list of all bitmap identifiers.
@ add_pcb_target
#define DEFAULT_COPPER_LINE_WIDTH
BOX2< VECTOR2I > BOX2I
Definition box2.h:914
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:982
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:85
BOARD_ITEM(BOARD_ITEM *aParent, KICAD_T idtype, PCB_LAYER_ID aLayer=F_Cu)
Definition board_item.h:87
PCB_LAYER_ID GetFlippedLayer(PCB_LAYER_ID aLayer) const
Return the layer paired with aLayer on the opposite side of the board.
PCB_LAYER_ID m_layer
Definition board_item.h:600
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition board_item.h:383
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:553
constexpr void SetHeight(size_type val)
Definition box2.h:289
constexpr bool Contains(const Vec &aPoint) const
Definition box2.h:165
constexpr void SetWidth(size_type val)
Definition box2.h:284
constexpr void SetX(coord_type val)
Definition box2.h:274
constexpr void SetY(coord_type val)
Definition box2.h:279
constexpr bool Intersects(const BOX2< Vec > &aRect) const
Definition box2.h:308
The base class for create windows for drawing purpose.
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
EDA_ITEM(EDA_ITEM *parent, KICAD_T idType, bool isSCH_ITEM=false, bool isBOARD_ITEM=false)
Definition eda_item.cpp:84
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:126
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
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.
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT, DRC_CONSTRAINT_T aUsage=NULL_CONSTRAINT) const override
Some pad shapes can be complex (rounded/chamfered rectangle), even without considering custom shapes.
VECTOR2I m_pos
Definition pcb_target.h:127
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
PROPERTY_BASE & SetIsCopyable(bool aIsCopyable=true)
Definition property.h:371
Provide class metadata.
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:30
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: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)
Macro to generate unique identifier for a type.
Definition property.h:74
@ PT_SIZE
Size expressed in distance units (mm/inch)
Definition property.h:63
#define REGISTER_TYPE(x)
Helper macro to map type hashes to names.
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:227
@ PCB_TARGET_T
class PCB_TARGET, a target (graphic item)
Definition typeinfo.h:99
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:708