KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcb_shape.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) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <[email protected]>
6 * Copyright (C) 2011 Wayne Stambaugh <[email protected]>
7 * Copyright (C) 1992-2024 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 "pcb_shape.h"
28
29#include <google/protobuf/any.pb.h>
30#include <magic_enum.hpp>
31
32#include <bitmaps.h>
33#include <macros.h>
34#include <pcb_edit_frame.h>
36#include <board.h>
37#include <footprint.h>
38#include <lset.h>
39#include <pad.h>
40#include <base_units.h>
45#include <pcb_painter.h>
46#include <api/board/board_types.pb.h>
47#include <api/api_enums.h>
48#include <api/api_utils.h>
49
50
51PCB_SHAPE::PCB_SHAPE( BOARD_ITEM* aParent, KICAD_T aItemType, SHAPE_T aShapeType ) :
52 BOARD_CONNECTED_ITEM( aParent, aItemType ),
53 EDA_SHAPE( aShapeType, pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH ), FILL_T::NO_FILL )
54{
55 m_hasSolderMask = false;
56}
57
58
59PCB_SHAPE::PCB_SHAPE( BOARD_ITEM* aParent, SHAPE_T shapetype ) :
61 EDA_SHAPE( shapetype, pcbIUScale.mmToIU( DEFAULT_LINE_WIDTH ), FILL_T::NO_FILL )
62{
63 m_hasSolderMask = false;
64}
65
66
68{
69}
70
71
72void PCB_SHAPE::Serialize( google::protobuf::Any &aContainer ) const
73{
74 using namespace kiapi::common;
75 using namespace kiapi::board::types;
76 BoardGraphicShape msg;
77
78 msg.set_layer( ToProtoEnum<PCB_LAYER_ID, BoardLayer>( GetLayer() ) );
79 msg.mutable_net()->mutable_code()->set_value( GetNetCode() );
80 msg.mutable_net()->set_name( GetNetname() );
81 msg.mutable_id()->set_value( m_Uuid.AsStdString() );
82 msg.set_locked( IsLocked() ? types::LockedState::LS_LOCKED : types::LockedState::LS_UNLOCKED );
83
84 google::protobuf::Any any;
86 any.UnpackTo( msg.mutable_shape() );
87
88 // TODO m_hasSolderMask and m_solderMaskMargin
89
90 aContainer.PackFrom( msg );
91}
92
93
94bool PCB_SHAPE::Deserialize( const google::protobuf::Any &aContainer )
95{
96 using namespace kiapi::common;
97 using namespace kiapi::board::types;
98
99 BoardGraphicShape msg;
100
101 if( !aContainer.UnpackTo( &msg ) )
102 return false;
103
104 // Initialize everything to a known state that doesn't get touched by every
105 // codepath below, to make sure the equality operator is consistent
106 m_start = {};
107 m_end = {};
108 m_arcCenter = {};
109 m_arcMidData = {};
110 m_bezierC1 = {};
111 m_bezierC2 = {};
112 m_editState = 0;
113 m_proxyItem = false;
114 m_endsSwapped = false;
115
116 const_cast<KIID&>( m_Uuid ) = KIID( msg.id().value() );
117 SetLocked( msg.locked() == types::LS_LOCKED );
118 SetLayer( FromProtoEnum<PCB_LAYER_ID, BoardLayer>( msg.layer() ) );
119 SetNetCode( msg.net().code().value() );
120
121 google::protobuf::Any any;
122 any.PackFrom( msg.shape() );
124
125 // TODO m_hasSolderMask and m_solderMaskMargin
126
127 return true;
128}
129
130
131bool PCB_SHAPE::IsType( const std::vector<KICAD_T>& aScanTypes ) const
132{
133 if( BOARD_ITEM::IsType( aScanTypes ) )
134 return true;
135
136 bool sametype = false;
137
138 for( KICAD_T scanType : aScanTypes )
139 {
140 if( scanType == PCB_LOCATE_BOARD_EDGE_T )
141 sametype = m_layer == Edge_Cuts;
142 else if( scanType == PCB_SHAPE_LOCATE_ARC_T )
143 sametype = m_shape == SHAPE_T::ARC;
144 else if( scanType == PCB_SHAPE_LOCATE_CIRCLE_T )
145 sametype = m_shape == SHAPE_T::CIRCLE;
146 else if( scanType == PCB_SHAPE_LOCATE_RECT_T )
147 sametype = m_shape == SHAPE_T::RECTANGLE;
148 else if( scanType == PCB_SHAPE_LOCATE_SEGMENT_T )
149 sametype = m_shape == SHAPE_T::SEGMENT;
150 else if( scanType == PCB_SHAPE_LOCATE_POLY_T )
151 sametype = m_shape == SHAPE_T::POLY;
152 else if( scanType == PCB_SHAPE_LOCATE_BEZIER_T )
153 sametype = m_shape == SHAPE_T::BEZIER;
154
155 if( sametype )
156 return true;
157 }
158
159 return false;
160}
161
162
164{
165 // Only board-level copper shapes are connectable
166 return IsOnCopperLayer() && !GetParentFootprint();
167}
168
169
171{
172 BOARD_ITEM::SetLayer( aLayer );
173
174 if( !IsOnCopperLayer() )
175 SetNetCode( -1 );
176}
177
178
180{
181 int margin = m_solderMaskMargin.value_or( 0 );
182
183 // If no local margin is set, get the board's solder mask expansion value
184 if( !m_solderMaskMargin.has_value() )
185 {
186 const BOARD* board = GetBoard();
187
188 if( board )
190 }
191
192 // Ensure the resulting mask opening has a non-negative size
193 if( margin < 0 && !IsFilled() )
194 margin = std::max( margin, -GetWidth() / 2 );
195
196 return margin;
197}
198
199
201{
202 if( aLayer == m_layer )
203 {
204 return true;
205 }
206
208 && ( ( aLayer == F_Mask && m_layer == F_Cu )
209 || ( aLayer == B_Mask && m_layer == B_Cu ) ) )
210 {
211 return true;
212 }
213
214 return false;
215}
216
217
219{
220 LSET layermask( { m_layer } );
221
222 if( m_hasSolderMask )
223 {
224 if( layermask.test( F_Cu ) )
225 layermask.set( F_Mask );
226
227 if( layermask.test( B_Cu ) )
228 layermask.set( B_Mask );
229 }
230
231 return layermask;
232}
233
234
235void PCB_SHAPE::SetLayerSet( const LSET& aLayerSet )
236{
237 aLayerSet.RunOnLayers(
238 [&]( PCB_LAYER_ID layer )
239 {
240 if( IsCopperLayer( layer ) )
241 SetLayer( layer );
242 else if( IsSolderMaskLayer( layer ) )
243 SetHasSolderMask( true );
244 } );
245}
246
247
248std::vector<VECTOR2I> PCB_SHAPE::GetConnectionPoints() const
249{
250 std::vector<VECTOR2I> ret;
251
252 // For filled shapes, we may as well use a centroid
253 if( IsFilled() )
254 {
255 ret.emplace_back( GetCenter() );
256 return ret;
257 }
258
259 switch( m_shape )
260 {
261 case SHAPE_T::CIRCLE:
262 {
263 const CIRCLE circle( GetCenter(), GetRadius() );
264 for( const TYPED_POINT2I& pt : KIGEOM::GetCircleKeyPoints( circle, false ) )
265 {
266 ret.emplace_back( pt.m_point );
267 }
268 break;
269 }
270 case SHAPE_T::ARC:
271 ret.emplace_back( GetArcMid() );
273
274 case SHAPE_T::SEGMENT:
275 case SHAPE_T::BEZIER:
276 ret.emplace_back( GetStart() );
277 ret.emplace_back( GetEnd() );
278 break;
279
280 case SHAPE_T::POLY:
281 for( auto iter = GetPolyShape().CIterate(); iter; ++iter )
282 ret.emplace_back( *iter );
283
284 break;
285
286 case SHAPE_T::RECTANGLE:
287 for( const VECTOR2I& pt : GetRectCorners() )
288 ret.emplace_back( pt );
289
290 break;
291
292 case SHAPE_T::UNDEFINED:
293 // No default - handle all cases, even if just break
294 break;
295 }
296
297 return ret;
298}
299
300
302{
303 // A stroke width of 0 in PCBNew means no-border, but negative stroke-widths are only used
304 // in EEschema (see SCH_SHAPE::GetPenWidth()).
305 // Since negative stroke widths can trip up down-stream code (such as the Gerber plotter), we
306 // weed them out here.
307 return std::max( EDA_SHAPE::GetWidth(), 0 );
308}
309
310
312{
314}
315
316
318{
319 // For some shapes return the visual center, but for not filled polygonal shapes,
320 // the center is usually far from the shape: a point on the outline is better
321
322 switch( m_shape )
323 {
324 case SHAPE_T::CIRCLE:
325 if( !IsFilled() )
326 return VECTOR2I( GetCenter().x + GetRadius(), GetCenter().y );
327 else
328 return GetCenter();
329
330 case SHAPE_T::RECTANGLE:
331 if( !IsFilled() )
332 return GetStart();
333 else
334 return GetCenter();
335
336 case SHAPE_T::POLY:
337 if( !IsFilled() )
338 {
339 VECTOR2I pos = GetPolyShape().Outline(0).CPoint(0);
340 return VECTOR2I( pos.x, pos.y );
341 }
342 else
343 {
344 return GetCenter();
345 }
346
347 case SHAPE_T::ARC:
348 return GetArcMid();
349
350 case SHAPE_T::BEZIER:
351 return GetStart();
352
353 default:
354 return GetCenter();
355 }
356}
357
358
359std::vector<VECTOR2I> PCB_SHAPE::GetCorners() const
360{
361 std::vector<VECTOR2I> pts;
362
363 if( GetShape() == SHAPE_T::RECTANGLE )
364 {
365 pts = GetRectCorners();
366 }
367 else if( GetShape() == SHAPE_T::POLY )
368 {
369 for( int ii = 0; ii < GetPolyShape().OutlineCount(); ++ii )
370 {
371 for( const VECTOR2I& pt : GetPolyShape().Outline( ii ).CPoints() )
372 pts.emplace_back( pt );
373 }
374 }
375 else
376 {
378 }
379
380 while( pts.size() < 4 )
381 pts.emplace_back( pts.back() + VECTOR2I( 10, 10 ) );
382
383 return pts;
384}
385
386
387void PCB_SHAPE::Move( const VECTOR2I& aMoveVector )
388{
389 move( aMoveVector );
390}
391
392
393void PCB_SHAPE::Scale( double aScale )
394{
395 scale( aScale );
396}
397
398
400{
401 if( m_shape == SHAPE_T::RECTANGLE )
402 {
403 VECTOR2I start = GetStart();
404 VECTOR2I end = GetEnd();
405
406 BOX2I rect( start, end - start );
407 rect.Normalize();
408
409 SetStart( rect.GetPosition() );
410 SetEnd( rect.GetEnd() );
411 }
412 else if( m_shape == SHAPE_T::POLY )
413 {
414 auto horizontal =
415 []( const SEG& seg )
416 {
417 return seg.A.y == seg.B.y;
418 };
419
420 auto vertical =
421 []( const SEG& seg )
422 {
423 return seg.A.x == seg.B.x;
424 };
425
426 // Convert a poly back to a rectangle if appropriate
427 if( m_poly.OutlineCount() == 1 && m_poly.Outline( 0 ).SegmentCount() == 4 )
428 {
429 SHAPE_LINE_CHAIN& outline = m_poly.Outline( 0 );
430
431 if( horizontal( outline.Segment( 0 ) )
432 && vertical( outline.Segment( 1 ) )
433 && horizontal( outline.Segment( 2 ) )
434 && vertical( outline.Segment( 3 ) ) )
435 {
436 m_shape = SHAPE_T::RECTANGLE;
437 m_start.x = std::min( outline.Segment( 0 ).A.x, outline.Segment( 0 ).B.x );
438 m_start.y = std::min( outline.Segment( 1 ).A.y, outline.Segment( 1 ).B.y );
439 m_end.x = std::max( outline.Segment( 0 ).A.x, outline.Segment( 0 ).B.x );
440 m_end.y = std::max( outline.Segment( 1 ).A.y, outline.Segment( 1 ).B.y );
441 }
442 else if( vertical( outline.Segment( 0 ) )
443 && horizontal( outline.Segment( 1 ) )
444 && vertical( outline.Segment( 2 ) )
445 && horizontal( outline.Segment( 3 ) ) )
446 {
447 m_shape = SHAPE_T::RECTANGLE;
448 m_start.x = std::min( outline.Segment( 1 ).A.x, outline.Segment( 1 ).B.x );
449 m_start.y = std::min( outline.Segment( 0 ).A.y, outline.Segment( 0 ).B.y );
450 m_end.x = std::max( outline.Segment( 1 ).A.x, outline.Segment( 1 ).B.x );
451 m_end.y = std::max( outline.Segment( 0 ).A.y, outline.Segment( 0 ).B.y );
452 }
453 }
454 }
455}
456
457
459{
460 if( m_shape == SHAPE_T::SEGMENT )
461 {
462 // we want start point the top left point and end point the bottom right
463 // (more easy to compare 2 segments: we are seeing them as equivalent if
464 // they have the same end points, not necessary the same order)
465 VECTOR2I start = GetStart();
466 VECTOR2I end = GetEnd();
467
468 if( ( start.x > end.x )
469 || ( start.x == end.x && start.y < end.y ) )
470 {
471 SetStart( end );
472 SetEnd( start );
473 }
474 }
475 else
476 Normalize();
477}
478
479
480void PCB_SHAPE::Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle )
481{
482 rotate( aRotCentre, aAngle );
483}
484
485
486void PCB_SHAPE::Flip( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
487{
488 flip( aCentre, aFlipDirection );
489
491}
492
493
494void PCB_SHAPE::Mirror( const VECTOR2I& aCentre, FLIP_DIRECTION aFlipDirection )
495{
496 // Mirror an edge of the footprint. the layer is not modified
497 // This is a footprint shape modification.
498
499 switch( GetShape() )
500 {
501 case SHAPE_T::ARC:
502 case SHAPE_T::SEGMENT:
503 case SHAPE_T::RECTANGLE:
504 case SHAPE_T::CIRCLE:
505 case SHAPE_T::BEZIER:
506 MIRROR( m_start, aCentre, aFlipDirection );
507 MIRROR( m_end, aCentre, aFlipDirection );
508 MIRROR( m_arcCenter, aCentre, aFlipDirection );
509 MIRROR( m_bezierC1, aCentre, aFlipDirection );
510 MIRROR( m_bezierC2, aCentre, aFlipDirection );
511
512 if( GetShape() == SHAPE_T::ARC )
513 std::swap( m_start, m_end );
514
515 if( GetShape() == SHAPE_T::BEZIER )
517
518 break;
519
520 case SHAPE_T::POLY:
521 m_poly.Mirror( aCentre, aFlipDirection );
522 break;
523
524 default:
526 }
527}
528
529
530void PCB_SHAPE::SetIsProxyItem( bool aIsProxy )
531{
532 PAD* parentPad = nullptr;
533
534 if( GetBoard() && GetBoard()->IsFootprintHolder() )
535 {
536 for( FOOTPRINT* fp : GetBoard()->Footprints() )
537 {
538 for( PAD* pad : fp->Pads() )
539 {
540 if( pad->IsEntered() )
541 {
542 parentPad = pad;
543 break;
544 }
545 }
546 }
547 }
548
549 if( aIsProxy && !m_proxyItem )
550 {
551 if( GetShape() == SHAPE_T::SEGMENT )
552 {
553 if( parentPad && parentPad->GetThermalSpokeWidth() )
554 SetWidth( parentPad->GetThermalSpokeWidth() );
555 else
557 }
558 else
559 {
560 SetWidth( 1 );
561 }
562 }
563 else if( m_proxyItem && !aIsProxy )
564 {
566 }
567
568 m_proxyItem = aIsProxy;
569}
570
571
572double PCB_SHAPE::ViewGetLOD( int aLayer, KIGFX::VIEW* aView ) const
573{
574 constexpr double HIDE = std::numeric_limits<double>::max();
575 constexpr double SHOW = 0.0;
576
577 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( aView->GetPainter() );
578 KIGFX::PCB_RENDER_SETTINGS* renderSettings = painter->GetSettings();
579
580 if( aLayer == LAYER_LOCKED_ITEM_SHADOW )
581 {
582 // Hide shadow if the main layer is not shown
583 if( !aView->IsLayerVisible( m_layer ) )
584 return HIDE;
585
586 // Hide shadow on dimmed tracks
587 if( renderSettings->GetHighContrast() )
588 {
589 if( m_layer != renderSettings->GetPrimaryHighContrastLayer() )
590 return HIDE;
591 }
592 }
593
594 if( FOOTPRINT* parent = GetParentFootprint() )
595 {
596 if( parent->GetLayer() == F_Cu && !aView->IsLayerVisible( LAYER_FOOTPRINTS_FR ) )
597 return HIDE;
598
599 if( parent->GetLayer() == B_Cu && !aView->IsLayerVisible( LAYER_FOOTPRINTS_BK ) )
600 return HIDE;
601 }
602
603 return SHOW;
604}
605
606
607std::vector<int> PCB_SHAPE::ViewGetLayers() const
608{
609 std::vector<int> layers;
610 layers.reserve( 4 );
611
612 layers.push_back( GetLayer() );
613
614 if( IsOnCopperLayer() )
615 {
616 layers.push_back( GetNetnameLayer( GetLayer() ) );
617
618 if( m_hasSolderMask )
619 {
620 if( m_layer == F_Cu )
621 layers.push_back( F_Mask );
622 else if( m_layer == B_Cu )
623 layers.push_back( B_Mask );
624 }
625 }
626
627 if( IsLocked() )
628 layers.push_back( LAYER_LOCKED_ITEM_SHADOW );
629
630 return layers;
631}
632
633
634void PCB_SHAPE::GetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector<MSG_PANEL_ITEM>& aList )
635{
636 if( aFrame->GetName() == PCB_EDIT_FRAME_NAME )
637 {
638 if( FOOTPRINT* parent = GetParentFootprint() )
639 aList.emplace_back( _( "Footprint" ), parent->GetReference() );
640 }
641
642 aList.emplace_back( _( "Type" ), _( "Drawing" ) );
643
644 if( aFrame->GetName() == PCB_EDIT_FRAME_NAME && IsLocked() )
645 aList.emplace_back( _( "Status" ), _( "Locked" ) );
646
647 ShapeGetMsgPanelInfo( aFrame, aList );
648
649 aList.emplace_back( _( "Layer" ), GetLayerName() );
650}
651
652
653wxString PCB_SHAPE::GetItemDescription( UNITS_PROVIDER* aUnitsProvider, bool aFull ) const
654{
655 FOOTPRINT* parentFP = nullptr;
656
657 if( EDA_DRAW_FRAME* frame = dynamic_cast<EDA_DRAW_FRAME*>( aUnitsProvider ) )
658 {
659 if( frame->GetName() == PCB_EDIT_FRAME_NAME )
660 parentFP = GetParentFootprint();
661 }
662
663 if( IsOnCopperLayer() )
664 {
665 if( parentFP )
666 {
667 return wxString::Format( _( "%s %s of %s on %s" ),
670 parentFP->GetReference(),
671 GetLayerName() );
672 }
673 else
674 {
675 return wxString::Format( _( "%s %s on %s" ),
678 GetLayerName() );
679 }
680 }
681 else
682 {
683 if( parentFP )
684 {
685 return wxString::Format( _( "%s of %s on %s" ),
687 parentFP->GetReference(),
688 GetLayerName() );
689 }
690 else
691 {
692 return wxString::Format( _( "%s on %s" ),
694 GetLayerName() );
695 }
696 }
697}
698
699
701{
702 if( GetParentFootprint() )
703 return BITMAPS::show_mod_edge;
704 else
705 return BITMAPS::add_dashed_line;
706}
707
708
710{
711 return new PCB_SHAPE( *this );
712}
713
714
716{
717 BOX2I return_box = EDA_ITEM::ViewBBox();
718
719 // Inflate the bounding box by just a bit more for safety.
720 return_box.Inflate( GetWidth() );
721
722 return return_box;
723}
724
725
726std::shared_ptr<SHAPE> PCB_SHAPE::GetEffectiveShape( PCB_LAYER_ID aLayer, FLASHING aFlash ) const
727{
728 return std::make_shared<SHAPE_COMPOUND>( MakeEffectiveShapes() );
729}
730
731
733{
734 PCB_SHAPE* image = dynamic_cast<PCB_SHAPE*>( aImage );
735 wxCHECK( image, /* void */ );
736
737 SwapShape( image );
738
739 // Swap params not handled by SwapShape( image )
740 std::swap( m_layer, image->m_layer );
741 std::swap( m_isKnockout, image->m_isKnockout );
742 std::swap( m_isLocked, image->m_isLocked );
743 std::swap( m_flags, image->m_flags );
744 std::swap( m_parent, image->m_parent );
745 std::swap( m_forceVisible, image->m_forceVisible );
746 std::swap( m_netinfo, image->m_netinfo );
747 std::swap( m_hasSolderMask, image->m_hasSolderMask );
748 std::swap( m_solderMaskMargin, image->m_solderMaskMargin );
749}
750
751
753 const BOARD_ITEM* aSecond ) const
754{
755 if( aFirst->Type() != aSecond->Type() )
756 return aFirst->Type() < aSecond->Type();
757
758 if( aFirst->GetLayer() != aSecond->GetLayer() )
759 return aFirst->GetLayer() < aSecond->GetLayer();
760
761 if( aFirst->Type() == PCB_SHAPE_T )
762 {
763 const PCB_SHAPE* dwgA = static_cast<const PCB_SHAPE*>( aFirst );
764 const PCB_SHAPE* dwgB = static_cast<const PCB_SHAPE*>( aSecond );
765
766 if( dwgA->GetShape() != dwgB->GetShape() )
767 return dwgA->GetShape() < dwgB->GetShape();
768 }
769
770 return aFirst->m_Uuid < aSecond->m_Uuid;
771}
772
773
775 int aClearance, int aError, ERROR_LOC aErrorLoc,
776 bool ignoreLineWidth ) const
777{
778 EDA_SHAPE::TransformShapeToPolygon( aBuffer, aClearance, aError, aErrorLoc, ignoreLineWidth );
779}
780
781
782bool PCB_SHAPE::operator==( const BOARD_ITEM& aOther ) const
783{
784 if( aOther.Type() != Type() )
785 return false;
786
787 const PCB_SHAPE& other = static_cast<const PCB_SHAPE&>( aOther );
788
789 return *this == other;
790}
791
792
793bool PCB_SHAPE::operator==( const PCB_SHAPE& aOther ) const
794{
795 if( aOther.Type() != Type() )
796 return false;
797
798 const PCB_SHAPE& other = static_cast<const PCB_SHAPE&>( aOther );
799
800 if( m_layer != other.m_layer )
801 return false;
802
803 if( m_isKnockout != other.m_isKnockout )
804 return false;
805
806 if( m_isLocked != other.m_isLocked )
807 return false;
808
809 if( m_flags != other.m_flags )
810 return false;
811
812 if( m_forceVisible != other.m_forceVisible )
813 return false;
814
815 if( m_netinfo->GetNetCode() != other.m_netinfo->GetNetCode() )
816 return false;
817
818 if( m_hasSolderMask != other.m_hasSolderMask )
819 return false;
820
822 return false;
823
824 return EDA_SHAPE::operator==( other );
825}
826
827
828double PCB_SHAPE::Similarity( const BOARD_ITEM& aOther ) const
829{
830 if( aOther.Type() != Type() )
831 return 0.0;
832
833 const PCB_SHAPE& other = static_cast<const PCB_SHAPE&>( aOther );
834
835 double similarity = 1.0;
836
837 if( GetLayer() != other.GetLayer() )
838 similarity *= 0.9;
839
840 if( m_isKnockout != other.m_isKnockout )
841 similarity *= 0.9;
842
843 if( m_isLocked != other.m_isLocked )
844 similarity *= 0.9;
845
846 if( m_flags != other.m_flags )
847 similarity *= 0.9;
848
849 if( m_forceVisible != other.m_forceVisible )
850 similarity *= 0.9;
851
852 if( m_netinfo->GetNetCode() != other.m_netinfo->GetNetCode() )
853 similarity *= 0.9;
854
855 if( m_hasSolderMask != other.m_hasSolderMask )
856 similarity *= 0.9;
857
859 similarity *= 0.9;
860
861 similarity *= EDA_SHAPE::Similarity( other );
862
863 return similarity;
864}
865
866
867static struct PCB_SHAPE_DESC
868{
870 {
877
878 // Need to initialise enum_map before we can use a Property enum for it
880
881 if( layerEnum.Choices().GetCount() == 0 )
882 {
883 layerEnum.Undefined( UNDEFINED_LAYER );
884
885 for( PCB_LAYER_ID layer : LSET::AllLayersMask().Seq() )
886 layerEnum.Map( layer, LSET::Name( layer ) );
887 }
888
889 void ( PCB_SHAPE::*shapeLayerSetter )( PCB_LAYER_ID ) = &PCB_SHAPE::SetLayer;
890 PCB_LAYER_ID ( PCB_SHAPE::*shapeLayerGetter )() const = &PCB_SHAPE::GetLayer;
891
892 auto layerProperty = new PROPERTY_ENUM<PCB_SHAPE, PCB_LAYER_ID>(
893 _HKI( "Layer" ), shapeLayerSetter, shapeLayerGetter );
894
895 propMgr.ReplaceProperty( TYPE_HASH( BOARD_CONNECTED_ITEM ), _HKI( "Layer" ), layerProperty );
896
897 // Only polygons have meaningful Position properties.
898 // On other shapes, these are duplicates of the Start properties.
899 auto isPolygon =
900 []( INSPECTABLE* aItem ) -> bool
901 {
902 if( PCB_SHAPE* shape = dynamic_cast<PCB_SHAPE*>( aItem ) )
903 return shape->GetShape() == SHAPE_T::POLY;
904
905 return false;
906 };
907
909 _HKI( "Position X" ), isPolygon );
911 _HKI( "Position Y" ), isPolygon );
912
913 propMgr.Mask( TYPE_HASH( PCB_SHAPE ), TYPE_HASH( EDA_SHAPE ), _HKI( "Line Color" ) );
914 propMgr.Mask( TYPE_HASH( PCB_SHAPE ), TYPE_HASH( EDA_SHAPE ), _HKI( "Fill Color" ) );
915
916 auto isCopper =
917 []( INSPECTABLE* aItem ) -> bool
918 {
919 if( PCB_SHAPE* shape = dynamic_cast<PCB_SHAPE*>( aItem ) )
920 return shape->IsOnCopperLayer();
921
922 return false;
923 };
924
926 _HKI( "Net" ), isCopper );
927
928 auto isPadEditMode =
929 []( BOARD* aBoard ) -> bool
930 {
931 if( aBoard && aBoard->IsFootprintHolder() )
932 {
933 for( FOOTPRINT* fp : aBoard->Footprints() )
934 {
935 for( PAD* pad : fp->Pads() )
936 {
937 if( pad->IsEntered() )
938 return true;
939 }
940 }
941 }
942
943 return false;
944 };
945
946 auto showNumberBoxProperty =
947 [&]( INSPECTABLE* aItem ) -> bool
948 {
949 if( PCB_SHAPE* shape = dynamic_cast<PCB_SHAPE*>( aItem ) )
950 {
951 if( shape->GetShape() == SHAPE_T::RECTANGLE )
952 return isPadEditMode( shape->GetBoard() );
953 }
954
955 return false;
956 };
957
958 auto showSpokeTemplateProperty =
959 [&]( INSPECTABLE* aItem ) -> bool
960 {
961 if( PCB_SHAPE* shape = dynamic_cast<PCB_SHAPE*>( aItem ) )
962 {
963 if( shape->GetShape() == SHAPE_T::SEGMENT )
964 return isPadEditMode( shape->GetBoard() );
965 }
966
967 return false;
968 };
969
970 const wxString groupPadPrimitives = _HKI( "Pad Primitives" );
971
972 propMgr.AddProperty( new PROPERTY<PCB_SHAPE, bool>( _HKI( "Number Box" ),
975 groupPadPrimitives )
976 .SetAvailableFunc( showNumberBoxProperty )
978
979 propMgr.AddProperty( new PROPERTY<PCB_SHAPE, bool>( _HKI( "Thermal Spoke Template" ),
982 groupPadPrimitives )
983 .SetAvailableFunc( showSpokeTemplateProperty )
985
986 const wxString groupTechLayers = _HKI( "Technical Layers" );
987
988 auto isExternalCuLayer =
989 []( INSPECTABLE* aItem )
990 {
991 if( auto shape = dynamic_cast<PCB_SHAPE*>( aItem ) )
992 return IsExternalCopperLayer( shape->GetLayer() );
993
994 return false;
995 };
996
997 propMgr.AddProperty( new PROPERTY<PCB_SHAPE, bool>( _HKI( "Soldermask" ),
1000 groupTechLayers )
1001 .SetAvailableFunc( isExternalCuLayer );
1002
1003 propMgr.AddProperty( new PROPERTY<PCB_SHAPE, std::optional<int>>(
1004 _HKI( "Soldermask Margin Override" ),
1007 PROPERTY_DISPLAY::PT_SIZE ),
1008 groupTechLayers )
1009 .SetAvailableFunc( isExternalCuLayer );
1010 }
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 int ARC_HIGH_DEF
Definition: base_units.h:120
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:33
#define DEFAULT_LINE_WIDTH
BASE_SET & set(size_t pos)
Definition: base_set.h:115
A base class derived from BOARD_ITEM for items that can be connected and have a net,...
wxString GetNetnameMsg() const
bool SetNetCode(int aNetCode, bool aNoAssert)
Set net using a net code.
NETINFO_ITEM * m_netinfo
Store all information about the net that item belongs to.
Container for design settings for a BOARD object.
int GetLineThickness(PCB_LAYER_ID aLayer) const
Return the default graphic segment thickness from the layer class for the given layer.
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:79
virtual PCB_LAYER_ID GetLayer() const
Return the primary layer this item is on.
Definition: board_item.h:237
bool m_isKnockout
Definition: board_item.h:437
virtual void SetLocked(bool aLocked)
Definition: board_item.h:328
PCB_LAYER_ID m_layer
Definition: board_item.h:436
bool m_isLocked
Definition: board_item.h:439
virtual void SetLayer(PCB_LAYER_ID aLayer)
Set the layer this item is on.
Definition: board_item.h:288
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Definition: board_item.cpp:47
FOOTPRINT * GetParentFootprint() const
Definition: board_item.cpp:298
virtual bool IsLocked() const
Definition: board_item.cpp:75
virtual bool IsOnCopperLayer() const
Definition: board_item.h:150
wxString GetLayerName() const
Return the name of the PCB layer on which the item resides.
Definition: board_item.cpp:139
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:290
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:895
constexpr const Vec & GetPosition() const
Definition: box2.h:211
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 const Vec GetEnd() const
Definition: box2.h:212
constexpr BOX2< Vec > & Normalize()
Ensure that the height and width are positive.
Definition: box2.h:146
Represent basic circle geometry with utility geometry functions.
Definition: circle.h:33
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
const KIID m_Uuid
Definition: eda_item.h:489
bool m_forceVisible
Definition: eda_item.h:501
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:101
EDA_ITEM_FLAGS m_flags
Definition: eda_item.h:499
virtual bool IsType(const std::vector< KICAD_T > &aScanTypes) const
Check whether the item is one of the listed types.
Definition: eda_item.h:176
virtual const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
Definition: eda_item.cpp:276
EDA_ITEM * m_parent
Linked list: Link (parent struct)
Definition: eda_item.h:500
SHAPE_T m_shape
Definition: eda_shape.h:421
bool m_proxyItem
Definition: eda_shape.h:445
bool m_endsSwapped
Definition: eda_shape.h:420
int m_editState
Definition: eda_shape.h:444
void rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle)
Definition: eda_shape.cpp:625
virtual std::vector< SHAPE * > MakeEffectiveShapes(bool aEdgeOnly=false) const
Make a set of SHAPE objects representing the EDA_SHAPE.
Definition: eda_shape.h:326
SHAPE_POLY_SET & GetPolyShape()
Definition: eda_shape.h:286
bool IsFilled() const
Definition: eda_shape.h:98
void ShapeGetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
Definition: eda_shape.cpp:966
bool operator==(const EDA_SHAPE &aOther) const
Definition: eda_shape.cpp:2050
int GetRadius() const
Definition: eda_shape.cpp:826
SHAPE_T GetShape() const
Definition: eda_shape.h:132
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
Definition: eda_shape.cpp:234
VECTOR2I m_arcCenter
Definition: eda_shape.h:435
ARC_MID m_arcMidData
Definition: eda_shape.h:436
void RebuildBezierToSegmentsPointsList(int aMaxError)
Rebuild the m_bezierPoints vertex list that approximate the Bezier curve by a list of segments.
Definition: eda_shape.cpp:725
void flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection)
Definition: eda_shape.cpp:682
VECTOR2I m_start
Definition: eda_shape.h:432
const VECTOR2I & GetEnd() const
Return the ending point of the graphic.
Definition: eda_shape.h:174
void SetStart(const VECTOR2I &aStart)
Definition: eda_shape.h:141
const VECTOR2I & GetStart() const
Return the starting point of the graphic.
Definition: eda_shape.h:137
void SwapShape(EDA_SHAPE *aImage)
Definition: eda_shape.cpp:1852
std::vector< VECTOR2I > GetRectCorners() const
Definition: eda_shape.cpp:1386
void SetEnd(const VECTOR2I &aEnd)
Definition: eda_shape.h:178
wxString SHAPE_T_asString() const
Definition: eda_shape.cpp:340
double Similarity(const EDA_SHAPE &aOther) const
Definition: eda_shape.cpp:2095
VECTOR2I m_end
Definition: eda_shape.h:433
SHAPE_POLY_SET m_poly
Definition: eda_shape.h:442
virtual int GetWidth() const
Definition: eda_shape.h:122
STROKE_PARAMS m_stroke
Definition: eda_shape.h:422
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const
Convert the shape to a closed polygon.
Definition: eda_shape.cpp:1916
VECTOR2I m_bezierC1
Definition: eda_shape.h:438
void SetWidth(int aWidth)
Definition: eda_shape.h:121
VECTOR2I m_bezierC2
Definition: eda_shape.h:439
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
Definition: eda_shape.cpp:146
VECTOR2I GetArcMid() const
Definition: eda_shape.cpp:796
ENUM_MAP & Map(T aValue, const wxString &aName)
Definition: property.h:669
static ENUM_MAP< T > & Instance()
Definition: property.h:663
ENUM_MAP & Undefined(T aValue)
Definition: property.h:676
wxPGChoices & Choices()
Definition: property.h:712
const wxString & GetReference() const
Definition: footprint.h:622
Class that other classes need to inherit from, in order to be inspectable.
Definition: inspectable.h:36
Contains methods for drawing PCB-specific items.
Definition: pcb_painter.h:180
virtual PCB_RENDER_SETTINGS * GetSettings() override
Return a pointer to current settings that are going to be used when drawing items.
Definition: pcb_painter.h:185
PCB specific render settings.
Definition: pcb_painter.h:78
PCB_LAYER_ID GetPrimaryHighContrastLayer() const
Return the board layer which is in high-contrast mode.
bool GetHighContrast() const
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
bool IsLayerVisible(int aLayer) const
Return information about visibility of a particular layer.
Definition: view.h:419
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:217
Definition: kiid.h:49
std::string AsStdString() const
Definition: kiid.cpp:244
LSET is a set of PCB_LAYER_IDs.
Definition: lset.h:36
static LSET AllLayersMask()
Definition: lset.cpp:711
void RunOnLayers(const std::function< void(PCB_LAYER_ID)> &aFunction) const
Execute a function on each layer of the LSET.
Definition: lset.h:243
static wxString Name(PCB_LAYER_ID aLayerId)
Return the fixed name association with aLayerId.
Definition: lset.cpp:193
int GetNetCode() const
Definition: netinfo.h:108
Definition: pad.h:54
int GetThermalSpokeWidth() const
Definition: pad.h:602
virtual void Mirror(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Mirror this object relative to a given horizontal axis the layer is not changed.
Definition: pcb_shape.cpp:494
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_shape.cpp:634
void swapData(BOARD_ITEM *aImage) override
Definition: pcb_shape.cpp:732
bool IsConnected() const override
Returns information if the object is derived from BOARD_CONNECTED_ITEM.
Definition: pcb_shape.cpp:163
std::optional< int > GetLocalSolderMaskMargin() const
Definition: pcb_shape.h:186
VECTOR2I GetCenter() const override
This defaults to the center of the bounding box if not overridden.
Definition: pcb_shape.h:79
void Rotate(const VECTOR2I &aRotCentre, const EDA_ANGLE &aAngle) override
Rotate this object.
Definition: pcb_shape.cpp:480
BITMAPS GetMenuImage() const override
Return a pointer to an image to be used in menus.
Definition: pcb_shape.cpp:700
PCB_SHAPE(BOARD_ITEM *aParent, KICAD_T aItemType, SHAPE_T aShapeType)
Definition: pcb_shape.cpp:51
int GetWidth() const override
Definition: pcb_shape.cpp:301
const BOX2I ViewBBox() const override
Return the bounding box of the item covering all its layers.
Definition: pcb_shape.cpp:715
bool HasSolderMask() const
Definition: pcb_shape.h:183
std::shared_ptr< SHAPE > GetEffectiveShape(PCB_LAYER_ID aLayer=UNDEFINED_LAYER, FLASHING aFlash=FLASHING::DEFAULT) const override
Make a set of SHAPE objects representing the PCB_SHAPE.
Definition: pcb_shape.cpp:726
void SetHasSolderMask(bool aVal)
Definition: pcb_shape.h:182
std::optional< int > m_solderMaskMargin
Definition: pcb_shape.h:203
int GetSolderMaskExpansion() const
Definition: pcb_shape.cpp:179
void NormalizeForCompare() override
Normalize coordinates to compare 2 similar PCB_SHAPES similat to Normalize(), but also normalize SEGM...
Definition: pcb_shape.cpp:458
const VECTOR2I GetFocusPosition() const override
Allows items to return their visual center rather than their anchor.
Definition: pcb_shape.cpp:317
virtual void SetLayerSet(const LSET &aLayers) override
Definition: pcb_shape.cpp:235
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
Definition: pcb_shape.cpp:486
virtual std::vector< VECTOR2I > GetCorners() const
Return 4 corners for a rectangle or rotated rectangle (stored as a poly).
Definition: pcb_shape.cpp:359
bool IsProxyItem() const override
Definition: pcb_shape.h:114
bool m_hasSolderMask
Definition: pcb_shape.h:202
~PCB_SHAPE() override
Definition: pcb_shape.cpp:67
virtual LSET GetLayerSet() const override
Return a std::bitset of all layers on which the item physically resides.
Definition: pcb_shape.cpp:218
bool operator==(const PCB_SHAPE &aShape) const
Definition: pcb_shape.cpp:793
void SetLayer(PCB_LAYER_ID aLayer) override
Set the layer this item is on.
Definition: pcb_shape.cpp:170
wxString GetFriendlyName() const override
Definition: pcb_shape.h:64
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_shape.cpp:774
void SetIsProxyItem(bool aIsProxy=true) override
Definition: pcb_shape.cpp:530
void StyleFromSettings(const BOARD_DESIGN_SETTINGS &settings) override
Definition: pcb_shape.cpp:311
void SetLocalSolderMaskMargin(std::optional< int > aMargin)
Definition: pcb_shape.h:185
void Move(const VECTOR2I &aMoveVector) override
Move this object.
Definition: pcb_shape.cpp:387
std::vector< VECTOR2I > GetConnectionPoints() const
Definition: pcb_shape.cpp:248
bool Deserialize(const google::protobuf::Any &aContainer) override
Deserializes the given protobuf message into this object.
Definition: pcb_shape.cpp:94
EDA_ITEM * Clone() const override
Create a duplicate of this item with linked list members set to NULL.
Definition: pcb_shape.cpp:709
double ViewGetLOD(int aLayer, KIGFX::VIEW *aView) const override
Return the level of detail (LOD) of the item.
Definition: pcb_shape.cpp:572
bool IsOnLayer(PCB_LAYER_ID aLayer) const override
Test to see if this object is on the given layer.
Definition: pcb_shape.cpp:200
wxString GetItemDescription(UNITS_PROVIDER *aUnitsProvider, bool aFull) const override
Return a user-visible description string of this item.
Definition: pcb_shape.cpp:653
void Scale(double aScale)
Definition: pcb_shape.cpp:393
void Serialize(google::protobuf::Any &aContainer) const override
Serializes this object to the given Any message.
Definition: pcb_shape.cpp:72
void Normalize() override
Perform any normalization required after a user rotate and/or flip.
Definition: pcb_shape.cpp:399
bool IsType(const std::vector< KICAD_T > &aScanTypes) const override
Check whether the item is one of the listed types.
Definition: pcb_shape.cpp:131
std::vector< int > ViewGetLayers() const override
Definition: pcb_shape.cpp:607
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_shape.cpp:828
PCB_LAYER_ID GetLayer() const override
Return the primary layer this item is on.
Definition: pcb_shape.h:69
PROPERTY_BASE & SetAvailableFunc(std::function< bool(INSPECTABLE *)> aFunc)
Set a callback function to determine whether an object provides this property.
Definition: property.h:257
PROPERTY_BASE & SetIsHiddenFromRulesEditor(bool aHide=true)
Definition: property.h:307
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.
void Mask(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName)
Sets a base class property as masked in a derived class.
static PROPERTY_MANAGER & Instance()
Definition: property_mgr.h:87
PROPERTY_BASE & AddProperty(PROPERTY_BASE *aProperty, const wxString &aGroup=wxEmptyString)
Register a property.
void OverrideAvailability(TYPE_ID aDerived, TYPE_ID aBase, const wxString &aName, std::function< bool(INSPECTABLE *)> aFunc)
Sets an override availability functor for a base class property of a given derived class.
PROPERTY_BASE & ReplaceProperty(size_t aBase, const wxString &aName, PROPERTY_BASE *aNew, const wxString &aGroup=wxEmptyString)
Replace an existing property for a specific type.
void AddTypeCast(TYPE_CAST_BASE *aCast)
Register a type converter.
Definition: seg.h:42
VECTOR2I A
Definition: seg.h:49
VECTOR2I B
Definition: seg.h:50
Represent a polyline containing arcs as well as line segments: A chain of connected line and/or arc s...
SEG Segment(int aIndex) const
Return a copy of the aIndex-th segment in the line chain.
const VECTOR2I & CPoint(int aIndex) const
Return a reference to a given point in the line chain.
int SegmentCount() const
Return the number of segments in this line chain.
const std::vector< VECTOR2I > & CPoints() const
Represent a set of closed polygons.
SHAPE_LINE_CHAIN & Outline(int aIndex)
Return the reference to aIndex-th outline in the set.
void Mirror(const VECTOR2I &aRef, FLIP_DIRECTION aFlipDirection)
Mirror the line points about y or x (or both)
int OutlineCount() const
Return the number of outlines in the set.
void SetWidth(int aWidth)
Definition: stroke_params.h:90
#define _HKI(x)
#define _(s)
#define PCB_EDIT_FRAME_NAME
SHAPE_T
Definition: eda_shape.h:43
FILL_T
Definition: eda_shape.h:56
PCB_LAYER_ID FlipLayer(PCB_LAYER_ID aLayerId, int aCopperLayersCount)
Definition: layer_id.cpp:208
bool IsSolderMaskLayer(int aLayer)
Definition: layer_ids.h:601
FLASHING
Enum used during connectivity building to ensure we do not query connectivity while building the data...
Definition: layer_ids.h:147
int GetNetnameLayer(int aLayer)
Returns a netname layer corresponding to the given layer.
Definition: layer_ids.h:706
bool IsCopperLayer(int aLayerId)
Tests whether a layer is a copper layer.
Definition: layer_ids.h:531
@ LAYER_LOCKED_ITEM_SHADOW
shadow layer for locked items
Definition: layer_ids.h:240
@ LAYER_FOOTPRINTS_FR
show footprints on front
Definition: layer_ids.h:209
@ LAYER_FOOTPRINTS_BK
show footprints on back
Definition: layer_ids.h:210
bool IsExternalCopperLayer(int aLayerId)
Tests whether a layer is an external (F_Cu or B_Cu) copper layer.
Definition: layer_ids.h:542
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ Edge_Cuts
Definition: layer_ids.h:112
@ B_Mask
Definition: layer_ids.h:98
@ B_Cu
Definition: layer_ids.h:65
@ F_Mask
Definition: layer_ids.h:97
@ UNDEFINED_LAYER
Definition: layer_ids.h:61
@ F_Cu
Definition: layer_ids.h:64
This file contains miscellaneous commonly used macros and functions.
#define KI_FALLTHROUGH
The KI_FALLTHROUGH macro is to be used when switch statement cases should purposely fallthrough from ...
Definition: macros.h:83
#define UNIMPLEMENTED_FOR(type)
Definition: macros.h:96
constexpr void MIRROR(T &aPoint, const T &aMirrorRef)
Updates aPoint with the mirror of aPoint relative to the aMirrorRef.
Definition: mirror.h:45
FLIP_DIRECTION
Definition: mirror.h:27
std::vector< TYPED_POINT2I > GetCircleKeyPoints(const CIRCLE &aCircle, bool aIncludeCenter)
Get key points of an CIRCLE.
static struct PCB_SHAPE_DESC _PCB_SHAPE_DESC
static bool isCopper(const PNS::ITEM *aItem)
#define TYPE_HASH(x)
Definition: property.h:71
#define REGISTER_TYPE(x)
Definition: property_mgr.h:371
Utility functions for working with shapes.
const int scale
constexpr int mmToIU(double mm) const
Definition: base_units.h:88
bool operator()(const BOARD_ITEM *aFirst, const BOARD_ITEM *aSecond) const
Definition: pcb_shape.cpp:752
KICAD_T
The set of class identification values stored in EDA_ITEM::m_structType.
Definition: typeinfo.h:78
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:88
@ PCB_LOCATE_BOARD_EDGE_T
Definition: typeinfo.h:130
@ PCB_SHAPE_LOCATE_CIRCLE_T
Definition: typeinfo.h:135
@ PCB_SHAPE_LOCATE_SEGMENT_T
Definition: typeinfo.h:133
@ PCB_SHAPE_LOCATE_RECT_T
Definition: typeinfo.h:134
@ PCB_SHAPE_LOCATE_BEZIER_T
Definition: typeinfo.h:138
@ PCB_SHAPE_LOCATE_POLY_T
Definition: typeinfo.h:137
@ PCB_SHAPE_LOCATE_ARC_T
Definition: typeinfo.h:136
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:691
#define ZONE_THERMAL_RELIEF_COPPER_WIDTH_MM
Definition: zones.h:34