KiCad PCB EDA Suite
Loading...
Searching...
No Matches
sch_sheet_pin.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) 2006 Jean-Pierre Charras, [email protected]
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
25#include <algorithm>
26
27#include <bitmaps.h>
28#include <general.h>
30#include <string_utils.h>
31#include <plotters/plotter.h>
32#include <sch_draw_panel.h>
33#include <sch_edit_frame.h>
34#include <sch_sheet.h>
35#include <sch_sheet_pin.h>
36#include <sch_painter.h>
37#include <schematic.h>
38#include <trigo.h>
39#include <properties/property.h>
41
42
43SCH_SHEET_PIN::SCH_SHEET_PIN( SCH_SHEET* parent, const VECTOR2I& pos, const wxString& text ) :
46{
47 SetParent( parent );
48 wxASSERT( parent );
50
51 SetTextPos( pos );
52
53 if( parent->IsVerticalOrientation() )
55 else
57
59 m_isDangling = true;
60 m_number = 2;
61}
62
63
65{
66 return new SCH_SHEET_PIN( *this );
67}
68
69
71{
73
74 wxCHECK_RET( aItem->Type() == SCH_SHEET_PIN_T,
75 wxString::Format( "SCH_SHEET_PIN object cannot swap data with %s object.",
76 aItem->GetClass() ) );
77
78 SCH_SHEET_PIN* pin = static_cast<SCH_SHEET_PIN*>( aItem );
79
80 std::swap( m_number, pin->m_number );
81 std::swap( m_edge, pin->m_edge );
82}
83
84
86{
87 return aPin == this;
88}
89
90
92{
93 if( Schematic() )
95
96 return schIUScale.MilsToIU( DEFAULT_LINE_WIDTH_MILS );
97}
98
99
100void SCH_SHEET_PIN::SetNumber( int aNumber )
101{
102 wxASSERT( aNumber >= 2 );
103
104 m_number = aNumber;
105}
106
107
109{
110 SCH_SHEET* sheet = GetParent();
111
112 // use SHEET_UNDEFINED_SIDE to adjust text orientation without changing edge
113
114 switch( aEdge )
115 {
116 case SHEET_SIDE::LEFT:
117 m_edge = aEdge;
118 SetTextX( sheet->m_pos.x );
119 SetSpinStyle( SPIN_STYLE::RIGHT ); // Orientation horiz inverse
120 break;
121
123 m_edge = aEdge;
124 SetTextX( sheet->m_pos.x + sheet->m_size.x );
125 SetSpinStyle( SPIN_STYLE::LEFT ); // Orientation horiz normal
126 break;
127
128 case SHEET_SIDE::TOP:
129 m_edge = aEdge;
130 SetTextY( sheet->m_pos.y );
131 SetSpinStyle( SPIN_STYLE::BOTTOM ); // Orientation vert BOTTOM
132 break;
133
135 m_edge = aEdge;
136 SetTextY( sheet->m_pos.y + sheet->m_size.y );
137 SetSpinStyle( SPIN_STYLE::UP ); // Orientation vert UP
138 break;
139
140 default:
141 break;
142 }
143}
144
145
147{
148 return m_edge;
149}
150
151
152void SCH_SHEET_PIN::ConstrainOnEdge( const VECTOR2I& aPos, bool aAllowEdgeSwitch )
153{
154 SCH_SHEET* sheet = GetParent();
155
156 if( sheet == nullptr )
157 return;
158
159 int leftSide = sheet->m_pos.x;
160 int rightSide = sheet->m_pos.x + sheet->m_size.x;
161 int topSide = sheet->m_pos.y;
162 int botSide = sheet->m_pos.y + sheet->m_size.y;
163
164 SHAPE_LINE_CHAIN sheetEdge;
165
166 sheetEdge.Append( leftSide, topSide );
167 sheetEdge.Append( rightSide, topSide );
168 sheetEdge.Append( rightSide, botSide );
169 sheetEdge.Append( leftSide, botSide );
170 sheetEdge.Append( leftSide, topSide );
171
172 if( aAllowEdgeSwitch )
173 {
174 switch( sheetEdge.NearestSegment( aPos ) )
175 {
176 case 0: SetSide( SHEET_SIDE::TOP ); break;
177 case 1: SetSide( SHEET_SIDE::RIGHT ); break;
178 case 2: SetSide( SHEET_SIDE::BOTTOM ); break;
179 case 3: SetSide( SHEET_SIDE::LEFT ); break;
180 default: wxASSERT( "Invalid segment number" );
181 }
182 }
183 else
184 {
185 SetSide( GetSide() );
186 }
187
188 switch( GetSide() )
189 {
191 case SHEET_SIDE::LEFT:
192 SetTextY( aPos.y );
193
194 if( GetTextPos().y < topSide )
195 SetTextY( topSide );
196
197 if( GetTextPos().y > botSide )
198 SetTextY( botSide );
199
200 break;
201
203 case SHEET_SIDE::TOP:
204 SetTextX( aPos.x );
205
206 if( GetTextPos().x < leftSide )
207 SetTextX( leftSide );
208
209 if( GetTextPos().x > rightSide )
210 SetTextX( rightSide );
211
212 break;
213
215 wxASSERT( "Undefined sheet side" );
216 }
217}
218
219
221{
222 int p = GetTextPos().y - aCenter;
223
224 SetTextY( aCenter - p );
225
226 switch( m_edge )
227 {
230 default: break;
231 }
232}
233
234
236{
237 int p = GetTextPos().x - aCenter;
238
239 SetTextX( aCenter - p );
240
241 switch( m_edge )
242 {
245 default: break;
246 }
247}
248
249
250void SCH_SHEET_PIN::Rotate( const VECTOR2I& aCenter, bool aRotateCCW )
251{
252 VECTOR2I pt = GetTextPos();
253 VECTOR2I delta = pt - aCenter;
254
255 RotatePoint( pt, aCenter, aRotateCCW ? ANGLE_90 : ANGLE_270 );
256
257 SHEET_SIDE oldSide = GetSide();
258 ConstrainOnEdge( pt, true );
259
260 // If the new side is the same as the old side, instead mirror across the center of that side.
261 if( GetSide() == oldSide )
262 {
263 switch( GetSide() )
264 {
265 case SHEET_SIDE::TOP:
267 SetTextPos( VECTOR2I( aCenter.x - delta.x, GetTextPos().y ) );
268 break;
269
270 case SHEET_SIDE::LEFT:
272 SetTextPos( VECTOR2I( GetTextPos().x, aCenter.y - delta.y ) );
273 break;
274
275 default:
276 break;
277 }
278 }
279 // If the new side is opposite to the old side, instead mirror across the center of an adjacent
280 // side.
281 else if( GetSide() == GetOppositeSide( oldSide ) )
282 {
283 switch( GetSide() )
284 {
285 case SHEET_SIDE::TOP:
287 SetTextPos( VECTOR2I( aCenter.x + delta.x, GetTextPos().y ) );
288 break;
289
290 case SHEET_SIDE::LEFT:
292 SetTextPos( VECTOR2I( GetTextPos().x, aCenter.y + delta.y ) );
293 break;
294
295 default:
296 break;
297 }
298 }
299}
300
301
303 std::vector<VECTOR2I>& aPoints, const VECTOR2I& aPos ) const
304{
305 /*
306 * These are the same icon shapes as SCH_HIERLABEL but the graphic icon is slightly
307 * different in 2 cases:
308 * for INPUT type the icon is the OUTPUT shape of SCH_HIERLABEL
309 * for OUTPUT type the icon is the INPUT shape of SCH_HIERLABEL
310 */
312
313 switch( shape )
314 {
317 default: break;
318 }
319
320 SCH_HIERLABEL::CreateGraphicShape( aSettings, aPoints, aPos, shape );
321}
322
323
324void SCH_SHEET_PIN::GetEndPoints( std::vector<DANGLING_END_ITEM>& aItemList )
325{
327 aItemList.push_back( item );
328}
329
330
331wxString SCH_SHEET_PIN::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
332{
333 return wxString::Format( _( "Hierarchical Sheet Pin '%s'" ),
334 aFull ? GetShownText( false ) : KIUI::EllipsizeMenuText( GetText() ) );
335}
336
337
342
343
344bool SCH_SHEET_PIN::HitTest( const VECTOR2I& aPoint, int aAccuracy ) const
345{
346 BOX2I rect = GetBoundingBox();
347
348 rect.Inflate( aAccuracy );
349
350 return rect.Contains( aPoint );
351}
352
353
354bool SCH_SHEET_PIN::operator==( const SCH_ITEM& aOther ) const
355{
356 if( aOther.Type() != Type() )
357 return false;
358
359 const SCH_SHEET_PIN* other = static_cast<const SCH_SHEET_PIN*>( &aOther );
360
361 return m_edge == other->m_edge && m_number == other->m_number
362 && SCH_HIERLABEL::operator==( aOther );
363}
364
365
366double SCH_SHEET_PIN::Similarity( const SCH_ITEM& aOther ) const
367{
368 if( aOther.Type() != Type() )
369 return 0.0;
370
371 const SCH_SHEET_PIN* other = static_cast<const SCH_SHEET_PIN*>( &aOther );
372
373 double similarity = 1.0;
374
375 if( m_edge != other->m_edge )
376 similarity *= 0.9;
377
378 if( m_number != other->m_number )
379 similarity *= 0.9;
380
381 similarity *= SCH_HIERLABEL::Similarity( aOther );
382
383 return similarity;
384}
385
386
388 const SCH_SHEET_PATH* aInstance ) const
389{
390 // Do not compare to ourself.
391 if( aItem == this )
392 return false;
393
394 const SCH_SHEET_PIN* pin = dynamic_cast<const SCH_SHEET_PIN*>( aItem );
395
396 // Don't compare against a different SCH_ITEM.
397 wxCHECK( pin, false );
398
399 if( GetPosition() != pin->GetPosition() )
400 return true;
401
402 return GetText() != pin->GetText();
403}
404
405
406#if defined(DEBUG)
407
408void SCH_SHEET_PIN::Show( int nestLevel, std::ostream& os ) const
409{
410 // XML output:
411 NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << ">"
412 << " pin_name=\"" << TO_UTF8( GetText() )
413 << '"' << "/>\n" << std::flush;
414}
415
416#endif
417
418
constexpr EDA_IU_SCALE schIUScale
Definition base_units.h:114
BITMAPS
A list of all bitmap identifiers.
@ add_hierar_pin
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
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 bool Contains(const Vec &aPoint) const
Definition box2.h:168
Helper class used to store the state of schematic items that can be connected to other schematic item...
Definition sch_item.h:97
A base class for most all the KiCad significant classes used in schematics and boards.
Definition eda_item.h:99
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:111
virtual void SetParent(EDA_ITEM *aParent)
Definition eda_item.cpp:93
const VECTOR2I & GetTextPos() const
Definition eda_text.h:273
virtual const wxString & GetText() const
Return the string associated with the text object.
Definition eda_text.h:98
void SetTextPos(const VECTOR2I &aPoint)
Definition eda_text.cpp:590
void SetTextX(int aX)
Definition eda_text.cpp:596
void SetTextY(int aY)
Definition eda_text.cpp:602
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
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()
void AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
SCHEMATIC_SETTINGS & Settings() const
void SetSpinStyle(SPIN_STYLE aSpinStyle) override
void CreateGraphicShape(const RENDER_SETTINGS *aSettings, std::vector< VECTOR2I > &aPoints, const VECTOR2I &aPos) const override
Calculate the graphic shape (a polygon) associated to the text.
SCH_HIERLABEL(const VECTOR2I &aPos=VECTOR2I(0, 0), const wxString &aText=wxEmptyString, KICAD_T aType=SCH_HIER_LABEL_T)
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition sch_item.h:168
virtual void swapData(SCH_ITEM *aItem)
Swap the internal data structures aItem with the schematic item.
Definition sch_item.cpp:607
SCHEMATIC * Schematic() const
Search the item hierarchy to find a SCHEMATIC.
Definition sch_item.cpp:254
virtual double Similarity(const SCH_ITEM &aItem) const
Return a measure of how likely the other object is to represent the same object.
Definition sch_item.h:370
virtual bool operator==(const SCH_ITEM &aOther) const
Definition sch_item.cpp:674
wxString GetClass() const override
Return the class name.
Definition sch_item.h:178
SCH_LAYER_ID m_layer
Definition sch_item.h:778
wxString GetShownText(const SCH_SHEET_PATH *aPath, bool aAllowExtraText, int aDepth=0) const override
const BOX2I GetBoundingBox() const override
Return the bounding box of the label including its fields.
LABEL_FLAG_SHAPE m_shape
Definition sch_label.h:377
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
Define a sheet pin (label) used in sheets to create hierarchical schematics.
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
void SetNumber(int aNumber)
Set the sheet label number.
SCH_SHEET_PIN(SCH_SHEET *parent, const VECTOR2I &pos=VECTOR2I(0, 0), const wxString &text=wxEmptyString)
SHEET_SIDE m_edge
int m_number
Label number use for saving sheet label to file.
void MirrorHorizontally(int aCenter) override
Mirror item horizontally about aCenter.
bool HasConnectivityChanges(const SCH_ITEM *aItem, const SCH_SHEET_PATH *aInstance=nullptr) const override
Check if aItem has connectivity changes against this object.
void swapData(SCH_ITEM *aItem) override
Swap the internal data structures aItem with the schematic item.
void MirrorVertically(int aCenter) override
Mirror item vertically about aCenter.
double Similarity(const SCH_ITEM &aOther) const override
Return a measure of how likely the other object is to represent the same object.
int GetPenWidth() const override
static SHEET_SIDE GetOppositeSide(SHEET_SIDE aSide)
void CreateGraphicShape(const RENDER_SETTINGS *aSettings, std::vector< VECTOR2I > &aPoints, const VECTOR2I &aPos) const override
Calculate the graphic shape (a polygon) associated to the text.
SHEET_SIDE GetSide() const
wxString GetClass() const override
Return the class name.
void GetEndPoints(std::vector< DANGLING_END_ITEM > &aItemList) override
Add the schematic item end points to aItemList if the item has end points.
bool operator==(const SCH_SHEET_PIN *aPin) const
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
void Rotate(const VECTOR2I &aCenter, bool aRotateCCW) override
Rotate the item around aCenter 90 degrees in the clockwise direction.
bool HitTest(const VECTOR2I &aPosition, int aAccuracy=0) const override
Test if aPosition is inside or on the boundary of this item.
SCH_SHEET * GetParent() const
Get the parent sheet object of this sheet pin.
void ConstrainOnEdge(const VECTOR2I &aPos, bool aAllowEdgeSwitch)
Adjust label position to edge based on proximity to vertical or horizontal edge of the parent sheet.
void SetSide(SHEET_SIDE aEdge)
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
Definition sch_sheet.h:48
VECTOR2I m_size
Definition sch_sheet.h:676
VECTOR2I m_pos
Definition sch_sheet.h:675
bool IsVerticalOrientation() const
VECTOR2I GetPosition() const override
Definition sch_text.h:147
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
int NearestSegment(const VECTOR2I &aP) const
Find the segment nearest the given point.
void Append(int aX, int aY, bool aAllowDuplication=false)
Append a new point at the end of the line chain.
#define DEFAULT_LINE_WIDTH_MILS
The default wire width in mils. (can be changed in preference menu)
#define _(s)
static constexpr EDA_ANGLE ANGLE_90
Definition eda_angle.h:413
static constexpr EDA_ANGLE ANGLE_270
Definition eda_angle.h:416
@ LAYER_SHEETLABEL
Definition layer_ids.h:475
KICOMMON_API wxString EllipsizeMenuText(const wxString &aString)
Ellipsize text (at the end) to be no more than 36 characters.
#define TYPE_HASH(x)
Definition property.h:74
#define REGISTER_TYPE(x)
@ SHEET_LABEL_END
Definition sch_item.h:87
LABEL_FLAG_SHAPE
Definition sch_label.h:99
@ L_OUTPUT
Definition sch_label.h:101
@ L_INPUT
Definition sch_label.h:100
static struct SCH_SHEET_PIN_DESC _SCH_SHEET_PIN_DESC
SHEET_SIDE
Define the edge of the sheet that the sheet pin is positioned.
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
KIBIS_PIN * pin
int delta
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
@ SCH_SHEET_PIN_T
Definition typeinfo.h:178
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695