KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcb_base_frame.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, [email protected]
5 * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <[email protected]>
6 * Copyright (C) 2011 Wayne Stambaugh <[email protected]>
7 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
8 * Copyright (C) 2022 CERN
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, you may find one here:
22 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
23 * or you may search the http://www.gnu.org website for the version 2 license,
24 * or you may write to the Free Software Foundation, Inc.,
25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
26 */
27
30#include <boost/version.hpp>
31
32#if BOOST_VERSION >= 106700
33#include <boost/uuid/entropy_error.hpp>
34#endif
35
37#include <advanced_config.h>
38#include <base_units.h>
39#include <board.h>
40#include <cleanup_item.h>
41#include <collectors.h>
42#include <confirm.h>
43#include <footprint.h>
46#include <lset.h>
47#include <kiface_base.h>
48#include <pad.h>
49#include <pcb_painter.h>
50#include <pcbnew_id.h>
51#include <pcbnew_settings.h>
52#include <pcb_base_frame.h>
53#include <pcb_draw_panel_gal.h>
54#include <pcb_track.h>
55#include <pgm_base.h>
56#include <project_pcb.h>
57#include <trace_helpers.h>
59#include <zone.h>
60
61#include <math/vector2d.h>
62#include <math/vector2wx.h>
63#include <widgets/msgpanel.h>
64#include <wx/fswatcher.h>
65
68#include <tool/tool_manager.h>
70#include <tools/pcb_actions.h>
71#include <tool/grid_menu.h>
73
74#if defined(__linux__) || defined(__FreeBSD__)
76#else
78#endif
79
82
83wxDEFINE_EVENT( EDA_EVT_BOARD_CHANGING, wxCommandEvent );
84wxDEFINE_EVENT( EDA_EVT_BOARD_CHANGED, wxCommandEvent );
85
86PCB_BASE_FRAME::PCB_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType,
87 const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize,
88 long aStyle, const wxString& aFrameName ) :
89 EDA_DRAW_FRAME( aKiway, aParent, aFrameType, aTitle, aPos, aSize, aStyle, aFrameName, pcbIUScale ),
90 m_pcb( nullptr ),
91 m_originTransforms( *this ),
93{
95}
96
97
99{
100 // Ensure m_canvasType is up to date, to save it in config
101 if( GetCanvas() )
103
104 if( m_toolManager )
105 m_toolManager->ClearModel();
106
107 delete m_pcb;
108 m_pcb = nullptr;
109}
110
111
112bool PCB_BASE_FRAME::canCloseWindow( wxCloseEvent& aEvent )
113{
114 // Close modeless dialogs. They're trouble when they get destroyed after the frame and/or
115 // board.
116 wxWindow* viewer3D = Get3DViewerFrame();
117
118 if( viewer3D )
119 viewer3D->Close( true );
120
121 // Similarly, wxConvBrokenFileNames uses some statically allocated variables that make it
122 // crash when run later from a d'tor.
124
125 return true;
126}
127
128
129void PCB_BASE_FRAME::handleActivateEvent( wxActivateEvent& aEvent )
130{
132
133 if( m_spaceMouse )
134 m_spaceMouse->SetFocus( aEvent.GetActive() );
135}
136
137
138void PCB_BASE_FRAME::handleIconizeEvent( wxIconizeEvent& aEvent )
139{
141
142 if( m_spaceMouse && aEvent.IsIconized() )
143 m_spaceMouse->SetFocus( false );
144}
145
146
148{
149 wxWindow* frame = FindWindowByName( QUALIFIED_VIEWER3D_FRAMENAME( this ) );
150 return dynamic_cast<EDA_3D_VIEWER_FRAME*>( frame );
151}
152
153
154void PCB_BASE_FRAME::Update3DView( bool aMarkDirty, bool aRefresh, const wxString* aTitle )
155{
156 EDA_3D_VIEWER_FRAME* draw3DFrame = Get3DViewerFrame();
157
158 if( draw3DFrame )
159 {
160 if( aTitle )
161 draw3DFrame->SetTitle( *aTitle );
162
163 if( aMarkDirty )
164 draw3DFrame->ReloadRequest();
165
166 if( aRefresh )
167 draw3DFrame->Redraw();
168 }
169}
170
171
173{
174 if( m_pcb != aBoard )
175 {
176 delete m_pcb;
177 m_pcb = aBoard;
178
179 if( GetBoard() )
181
182 if( GetBoard() && GetCanvas() )
183 {
185
186 if( rs )
187 {
188 rs->SetDashLengthRatio( GetBoard()->GetPlotOptions().GetDashedLineDashRatio() );
189 rs->SetGapLengthRatio( GetBoard()->GetPlotOptions().GetDashedLineGapRatio() );
190 }
191 }
192
193 wxCommandEvent e( EDA_EVT_BOARD_CHANGED );
194 ProcessEventLocally( e );
195 }
196}
197
198
200{
201 if( aFootprint )
202 {
203 GetBoard()->Add( aFootprint, ADD_MODE::APPEND );
204
205 aFootprint->SetFlags( IS_NEW );
206 aFootprint->SetPosition( VECTOR2I( 0, 0 ) ); // cursor in GAL may not be initialized yet
207
208 // Put it on FRONT layer (note that it might be stored flipped if the lib is an archive
209 // built from a board)
210 if( aFootprint->IsFlipped() )
211 aFootprint->Flip( aFootprint->GetPosition(), GetPcbNewSettings()->m_FlipDirection );
212
213 // Place it in orientation 0 even if it is not saved with orientation 0 in lib (note that
214 // it might be stored in another orientation if the lib is an archive built from a board)
215 aFootprint->SetOrientation( ANGLE_0 );
216
217 GetBoard()->UpdateUserUnits( aFootprint, GetCanvas()->GetView() );
218
220 }
221}
222
223
224EDA_ITEM* PCB_BASE_FRAME::ResolveItem( const KIID& aId, bool aAllowNullptrReturn ) const
225{
226 return GetBoard()->ResolveItem( aId, aAllowNullptrReturn );
227}
228
229void PCB_BASE_FRAME::FocusOnItem( EDA_ITEM* aItem, bool aAllowScroll )
230{
231 // nullptr will clear the current focus
232 if( aItem != nullptr && !aItem->IsBOARD_ITEM() )
233 return;
234
235 FocusOnItem( static_cast<BOARD_ITEM*>( aItem ), UNDEFINED_LAYER, aAllowScroll );
236}
237
238void PCB_BASE_FRAME::FocusOnItem( BOARD_ITEM* aItem, PCB_LAYER_ID aLayer, bool aAllowScroll )
239{
240 std::vector<BOARD_ITEM*> items;
241
242 if( aItem )
243 items.push_back( aItem );
244
245 FocusOnItems( items, aLayer, aAllowScroll );
246}
247
248
249void PCB_BASE_FRAME::FocusOnItems( std::vector<BOARD_ITEM*> aItems, PCB_LAYER_ID aLayer, bool aAllowScroll )
250{
251 static std::vector<KIID> lastBrightenedItemIDs;
252
253 bool itemsUnbrightened = false;
254
255 for( KIID lastBrightenedItemID : lastBrightenedItemIDs )
256 {
257 if( BOARD_ITEM* lastItem = GetBoard()->ResolveItem( lastBrightenedItemID, true ) )
258 {
259 lastItem->ClearBrightened();
260 GetCanvas()->GetView()->Update( lastItem );
261 itemsUnbrightened = true;
262 }
263 }
264
265 if( itemsUnbrightened )
266 GetCanvas()->Refresh();
267
268 lastBrightenedItemIDs.clear();
269
270 if( aItems.empty() )
271 return;
272
273 VECTOR2I focusPt;
274 KIGFX::VIEW* view = GetCanvas()->GetView();
275 SHAPE_POLY_SET viewportPoly( view->GetViewport() );
276
277 for( wxWindow* dialog : findDialogs() )
278 {
279 wxPoint dialogPos = GetCanvas()->ScreenToClient( dialog->GetScreenPosition() );
280 SHAPE_POLY_SET dialogPoly( BOX2D( view->ToWorld( ToVECTOR2D( dialogPos ), true ),
281 view->ToWorld( ToVECTOR2D( dialog->GetSize() ), false ) ) );
282
283 try
284 {
285 viewportPoly.BooleanSubtract( dialogPoly );
286 }
287 catch( const std::exception& e )
288 {
289 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
290 }
291 }
292
293 SHAPE_POLY_SET itemPoly, clippedPoly;
294
295 for( BOARD_ITEM* item : aItems )
296 {
297 if( item && item != DELETED_BOARD_ITEM::GetInstance() )
298 {
299 item->SetBrightened();
300 lastBrightenedItemIDs.push_back( item->m_Uuid );
301
302 item->RunOnChildren(
303 [&]( BOARD_ITEM* child )
304 {
305 child->SetBrightened();
306 lastBrightenedItemIDs.push_back( child->m_Uuid );
307 },
309
310 GetCanvas()->GetView()->Update( item );
311
312 // Focus on the object's location. Prefer a visible part of the object to its anchor
313 // in order to keep from scrolling around.
314
315 focusPt = item->GetPosition();
316
317 if( aLayer == UNDEFINED_LAYER && item->GetLayerSet().any() )
318 aLayer = item->GetLayerSet().Seq()[0];
319
320 switch( item->Type() )
321 {
322 case PCB_FOOTPRINT_T:
323 try
324 {
325 itemPoly = static_cast<FOOTPRINT*>( item )->GetBoundingHull();
326 }
327 catch( const std::exception& e )
328 {
329 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
330 }
331
332 break;
333
334 case PCB_PAD_T:
335 case PCB_MARKER_T:
336 case PCB_VIA_T:
337 FocusOnLocation( item->GetFocusPosition(), aAllowScroll );
338 GetCanvas()->Refresh();
339 return;
340
341 case PCB_SHAPE_T:
342 case PCB_FIELD_T:
343 case PCB_TEXT_T:
344 case PCB_TEXTBOX_T:
345 case PCB_BARCODE_T:
346 case PCB_TRACE_T:
347 case PCB_ARC_T:
349 case PCB_DIM_LEADER_T:
350 case PCB_DIM_CENTER_T:
351 case PCB_DIM_RADIAL_T:
353 item->TransformShapeToPolygon( itemPoly, aLayer, 0, pcbIUScale.mmToIU( 0.1 ), ERROR_INSIDE );
354 break;
355
356 case PCB_ZONE_T:
357 {
358 ZONE* zone = static_cast<ZONE*>( item );
359#if 0
360 // Using the filled area shapes to find a Focus point can give good results, but
361 // unfortunately the calculations are highly time consuming, even for not very
362 // large areas (can be easily a few minutes for large areas).
363 // so we used only the zone outline that usually do not have too many vertices.
364 zone->TransformShapeToPolygon( itemPoly, aLayer, 0, pcbIUScale.mmToIU( 0.1 ), ERROR_INSIDE );
365
366 if( itemPoly.IsEmpty() )
367 itemPoly = *zone->Outline();
368#else
369 // much faster calculation time when using only the zone outlines
370 itemPoly = *zone->Outline();
371#endif
372
373 break;
374 }
375
376 default:
377 {
378 BOX2I item_bbox = item->GetBoundingBox();
379 itemPoly.NewOutline();
380 itemPoly.Append( item_bbox.GetOrigin() );
381 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( item_bbox.GetWidth(), 0 ) );
382 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( 0, item_bbox.GetHeight() ) );
383 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( item_bbox.GetWidth(),
384 item_bbox.GetHeight() ) );
385 break;
386 }
387 }
388
389 try
390 {
391 itemPoly.ClearArcs();
392 viewportPoly.ClearArcs();
393 clippedPoly.BooleanIntersection( itemPoly, viewportPoly );
394 }
395 catch( const std::exception& e )
396 {
397 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
398 }
399
400 if( !clippedPoly.IsEmpty() )
401 itemPoly = clippedPoly;
402 }
403 }
404
405 /*
406 * Perform a step-wise deflate to find the visual-center-of-mass
407 */
408
409 if( itemPoly.IsEmpty() )
410 {
411 FocusOnLocation( focusPt, aAllowScroll );
412 GetCanvas()->Refresh();
413 return;
414 }
415
416 BOX2I bbox = itemPoly.BBox();
417 int step = std::min( bbox.GetWidth(), bbox.GetHeight() ) / 10;
418
419 // Tiny shapes can quantize to a zero deflate step
420 if( step <= 0 )
421 {
422 FocusOnLocation( bbox.Centre(), aAllowScroll );
423 GetCanvas()->Refresh();
424 return;
425 }
426
427 while( !itemPoly.IsEmpty() )
428 {
429 focusPt = itemPoly.BBox().Centre();
430
431 try
432 {
434 }
435 catch( const std::exception& e )
436 {
437 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
438 }
439 }
440
441 FocusOnLocation( focusPt, aAllowScroll );
442
443 GetCanvas()->Refresh();
444}
445
446
448{
449 KIGFX::PCB_VIEW* view = GetCanvas()->GetView();
450
451 if( view && GetBoard()->m_SolderMaskBridges && view->HasItem( GetBoard()->m_SolderMaskBridges ) )
452 view->Remove( GetBoard()->m_SolderMaskBridges );
453}
454
455
457{
458 KIGFX::PCB_VIEW* view = GetCanvas()->GetView();
459
460 if( view && GetBoard()->m_SolderMaskBridges )
461 {
462 if( view->HasItem( GetBoard()->m_SolderMaskBridges ) )
463 view->Remove( GetBoard()->m_SolderMaskBridges );
464
465 view->Add( GetBoard()->m_SolderMaskBridges );
466 }
467}
468
469
470void PCB_BASE_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
471{
472 m_pcb->SetPageSettings( aPageSettings );
473
474 if( GetScreen() )
475 GetScreen()->InitDataPoints( aPageSettings.GetSizeIU( pcbIUScale.IU_PER_MILS ) );
476}
477
478
480{
481 return m_pcb->GetPageSettings();
482}
483
484
486{
487 // this function is only needed because EDA_DRAW_FRAME is not compiled
488 // with either -DPCBNEW or -DEESCHEMA, so the virtual is used to route
489 // into an application specific source file.
490 return m_pcb->GetPageSettings().GetSizeIU( pcbIUScale.IU_PER_MILS );
491}
492
493
495{
496 return m_pcb->GetDesignSettings().GetGridOrigin();
497}
498
499
501{
502 m_pcb->GetDesignSettings().SetGridOrigin( aPoint );
503}
504
505
507{
508 return m_pcb->GetDesignSettings().GetAuxOrigin();
509}
510
511
513{
514 VECTOR2I origin( 0, 0 );
515
516 switch( GetPcbNewSettings()->m_Display.m_DisplayOrigin )
517 {
519 case PCB_DISPLAY_ORIGIN::PCB_ORIGIN_AUX: origin = GetAuxOrigin(); break;
521 default: wxASSERT( false ); break;
522 }
523
524 return origin;
525}
526
531
532
534{
535 return m_pcb->GetTitleBlock();
536}
537
538
540{
541 m_pcb->SetTitleBlock( aTitleBlock );
542}
543
544
546{
547 return m_pcb->GetDesignSettings();
548}
549
550
552{
553 m_drawBgColor= aColor;
554 m_auimgr.Update();
555}
556
557
559{
560 return m_pcb->GetPlotOptions();
561}
562
563
565{
566 m_pcb->SetPlotOptions( aSettings );
567
568 // Plot Settings can also change the "tent vias" setting, which can affect the solder mask.
569 LSET visibleLayers = GetBoard()->GetVisibleLayers();
570
571 if( visibleLayers.test( F_Mask ) || visibleLayers.test( B_Mask ) )
572 {
574 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
575 {
576 BOARD_ITEM* item = nullptr;
577
578 if( aItem->IsBOARD_ITEM() )
579 item = static_cast<BOARD_ITEM*>( aItem );
580
581 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to
582 // visible as they won't be found in the view layer's itemset for re-painting.
583 if( item && item->Type() == PCB_VIA_T )
584 return KIGFX::ALL;
585
586 return 0;
587 } );
588
589 GetCanvas()->Refresh();
590 }
591}
592
593
594BOX2I PCB_BASE_FRAME::GetBoardBoundingBox( bool aBoardEdgesOnly ) const
595{
596 BOX2I area = aBoardEdgesOnly ? m_pcb->GetBoardEdgesBoundingBox() : m_pcb->GetBoundingBox();
597
598 if( area.GetWidth() == 0 && area.GetHeight() == 0 )
599 {
600 VECTOR2I pageSize = GetPageSizeIU();
601
603 {
604 area.SetOrigin( 0, 0 );
605 area.SetEnd( pageSize.x, pageSize.y );
606 }
607 else
608 {
609 area.SetOrigin( -pageSize.x / 2, -pageSize.y / 2 );
610 area.SetEnd( pageSize.x / 2, pageSize.y / 2 );
611 }
612 }
613
614 return area;
615}
616
617
618const BOX2I PCB_BASE_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
619{
620 /* "Zoom to Fit" calls this with "aIncludeAllVisible" as true. Since that feature
621 * always ignored the page and border, this function returns a bbox without them
622 * as well when passed true. This technically is not all things visible, but it
623 * keeps behavior consistent.
624 *
625 * When passed false, this function returns a bbox of just the board edge. This
626 * allows things like fabrication text or anything else outside the board edge to
627 * be ignored, and just zooms up to the board itself.
628 *
629 * Calling "GetBoardBoundingBox(true)" when edge cuts are turned off will return
630 * the entire page and border, so we call "GetBoardBoundingBox(false)" instead.
631 */
632 if( aIncludeAllVisible || !m_pcb->IsLayerVisible( Edge_Cuts ) )
633 return GetBoardBoundingBox( false );
634 else
635 return GetBoardBoundingBox( true );
636}
637
638
639// Virtual function
643
644
646{
647 return static_cast<PCB_SCREEN*>( EDA_DRAW_FRAME::GetScreen() );
648}
649
650
652{
653 GetScreen()->m_Active_Layer = aLayer;
654}
655
656
661
662
664{
665 // call my base class
667
668 // tooltips in toolbars
670
672
673 if( viewer3D )
674 viewer3D->ShowChangedLanguage();
675}
676
677
679{
680 EDA_3D_VIEWER_FRAME* draw3DFrame = Get3DViewerFrame();
681
682 if( !draw3DFrame )
683 draw3DFrame = new EDA_3D_VIEWER_FRAME( &Kiway(), this, _( "3D Viewer" ) );
684
685 // Raising the window does not show the window on Windows if iconized. This should work
686 // on any platform.
687 if( draw3DFrame->IsIconized() )
688 draw3DFrame->Iconize( false );
689
690 draw3DFrame->Raise();
691 draw3DFrame->Show( true );
692
693 // Raising the window does not set the focus on Linux. This should work on any platform.
694 if( wxWindow::FindFocus() != draw3DFrame )
695 draw3DFrame->SetFocus();
696
697 // Allocate a slice of time to display the 3D frame
698 // a call to wxSafeYield() should be enough (and better), but on Linux we need
699 // to call wxYield()
700 // otherwise the activity messages are not displayed during the first board loading
701 wxYield();
702
703 // Note, the caller is responsible to load/update the board 3D view.
704 // after frame creation the board is not automatically created.
705
706 return draw3DFrame;
707}
708
709
711{
712 PCB_LAYER_ID preslayer = GetActiveLayer();
713 auto& displ_opts = GetDisplayOptions();
714
715 // Check if the specified layer matches the present layer
716 if( layer == preslayer )
717 return;
718
719 // Copper layers cannot be selected unconditionally; how many of those layers are
720 // currently enabled needs to be checked.
721 if( IsCopperLayer( layer ) )
722 {
723 if( layer > m_pcb->GetCopperLayerStackMaxId() )
724 return;
725 }
726
727 // Is yet more checking required? E.g. when the layer to be selected is a non-copper
728 // layer, or when switching between a copper layer and a non-copper layer, or vice-versa?
729 // ...
730
731 SetActiveLayer( layer );
732
733 if( displ_opts.m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL )
734 GetCanvas()->Refresh();
735}
736
737
739{
740 GENERAL_COLLECTORS_GUIDE guide( m_pcb->GetVisibleLayers(), GetActiveLayer(),
741 GetCanvas()->GetView() );
742
743 // account for the globals
744 guide.SetIgnoreFPTextOnBack( !m_pcb->IsElementVisible( LAYER_FP_TEXT ) );
745 guide.SetIgnoreFPTextOnFront( !m_pcb->IsElementVisible( LAYER_FP_TEXT ) );
746 guide.SetIgnoreFootprintsOnBack( !m_pcb->IsElementVisible( LAYER_FOOTPRINTS_BK ) );
747 guide.SetIgnoreFootprintsOnFront( !m_pcb->IsElementVisible( LAYER_FOOTPRINTS_FR ) );
748 guide.SetIgnoreThroughHolePads( ! m_pcb->IsElementVisible( LAYER_PADS ) );
749 guide.SetIgnoreFPValues( !m_pcb->IsElementVisible( LAYER_FP_VALUES ) );
750 guide.SetIgnoreFPReferences( !m_pcb->IsElementVisible( LAYER_FP_REFERENCES ) );
751 guide.SetIgnoreThroughVias( ! m_pcb->IsElementVisible( LAYER_VIAS ) );
752 guide.SetIgnoreBlindBuriedVias( ! m_pcb->IsElementVisible( LAYER_VIAS ) );
753 guide.SetIgnoreMicroVias( ! m_pcb->IsElementVisible( LAYER_VIAS ) );
754 guide.SetIgnoreTracks( ! m_pcb->IsElementVisible( LAYER_TRACKS ) );
755
756 return guide;
757}
758
759
761{
763
764 BASE_SCREEN* screen = GetScreen();
765
766 if( !screen )
767 return;
768
769 wxString line;
771
772 if( GetShowPolarCoords() ) // display polar coordinates
773 {
774 double dx = cursorPos.x - screen->m_LocalOrigin.x;
775 double dy = cursorPos.y - screen->m_LocalOrigin.y;
776 double theta = RAD2DEG( atan2( -dy, dx ) );
777 double ro = hypot( dx, dy );
778
779 line.Printf( wxT( "r %s theta %.3f" ),
780 MessageTextFromValue( ro, false ),
781 theta );
782
783 SetStatusText( line, 3 );
784 }
785
786 // Transform absolute coordinates for user origin preferences
787 double userXpos = m_originTransforms.ToDisplayAbsX( static_cast<double>( cursorPos.x ) );
788 double userYpos = m_originTransforms.ToDisplayAbsY( static_cast<double>( cursorPos.y ) );
789
790 // Display absolute coordinates:
791 line.Printf( wxT( "X %s Y %s" ),
792 MessageTextFromValue( userXpos, false ),
793 MessageTextFromValue( userYpos, false ) );
794 SetStatusText( line, 2 );
795
796 if( !GetShowPolarCoords() ) // display relative cartesian coordinates
797 {
798 // Calculate relative coordinates
799 double relXpos = cursorPos.x - screen->m_LocalOrigin.x;
800 double relYpos = cursorPos.y - screen->m_LocalOrigin.y;
801
802 // Transform relative coordinates for user origin preferences
803 userXpos = m_originTransforms.ToDisplayRelX( relXpos );
804 userYpos = m_originTransforms.ToDisplayRelY( relYpos );
805
806 line.Printf( wxT( "dx %s dy %s dist %s" ),
807 MessageTextFromValue( userXpos, false ),
808 MessageTextFromValue( userYpos, false ),
809 MessageTextFromValue( hypot( userXpos, userYpos ), false ) );
810 SetStatusText( line, 3 );
811 }
812
814}
815
816
818{
819 EDA_DRAW_FRAME::unitsChangeRefresh(); // Update the status bar.
820
821 if( GetBoard() )
823
825}
826
827
829{
831
832 // Move legacy user grids to grid list
833 if( !aCfg->m_Window.grid.user_grid_x.empty() )
834 {
835 aCfg->m_Window.grid.grids.emplace_back( GRID{ "User Grid", aCfg->m_Window.grid.user_grid_x,
836 aCfg->m_Window.grid.user_grid_y } );
837 aCfg->m_Window.grid.user_grid_x = wxEmptyString;
838 aCfg->m_Window.grid.user_grid_y = wxEmptyString;
839 }
840
841 // Some, but not all, derived classes have a PCBNEW_SETTINGS.
842 if( PCBNEW_SETTINGS* pcbnew_cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg ) )
843 m_polarCoords = pcbnew_cfg->m_PolarCoords;
844
845 wxASSERT( GetCanvas() );
846
847 if( GetCanvas() )
848 {
850
851 if( rs )
852 {
855 rs->SetDefaultFont( wxEmptyString ); // Always the KiCad font for PCBs
856 }
857 }
858}
859
860
862{
863 if( aErrorCode >= CLEANUP_FIRST )
864 return RPT_SEVERITY_ACTION;
865
867
868 return bds.m_DRCSeverities[ aErrorCode ];
869}
870
871
873{
875
876 // Some, but not all derived classes have a PCBNEW_SETTINGS.
877 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
878
879 if( cfg )
881}
882
883
888
889
894
895
917
918
920{
921 static MAGNETIC_SETTINGS fallback;
922
924 return &cfg->m_MagneticItems;
925
926 return &fallback;
927}
928
929
931{
933
934 KIGFX::VIEW* view = GetCanvas()->GetView();
935 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( view->GetPainter() );
936 PCB_RENDER_SETTINGS* settings = painter->GetSettings();
937
938 settings->LoadColors( GetColorSettings( true ) );
941
942 if( aFlags & TEXTVARS_CHANGED )
944
945 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible as
946 // they won't be found in the view layer's itemset for re-painting.
948 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
949 {
950 if( dynamic_cast<RATSNEST_VIEW_ITEM*>( aItem ) )
951 {
952 return KIGFX::ALL; // ratsnest display
953 }
954 else if( dynamic_cast<PCB_TRACK*>( aItem ) )
955 {
956 return KIGFX::REPAINT; // track, arc & via clearance display
957 }
958 else if( dynamic_cast<PAD*>( aItem ) )
959 {
960 return KIGFX::REPAINT; // pad clearance display
961 }
962 else if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
963 {
964 if( text->HasTextVars() )
965 {
966 text->ClearRenderCache();
967 text->ClearBoundingBoxCache();
969 }
970 }
971
972 return 0;
973 } );
974
976
978
979 // The 3D viewer isn't in the Kiway, so send its update manually
981
982 if( viewer )
983 viewer->CommonSettingsChanged( aFlags );
984}
985
986
988{
990
993
994 if( m_isClosing )
995 return;
996
999}
1000
1001
1008
1009
1014
1015
1017{
1019
1020 EDA_DRAW_PANEL_GAL* canvas = GetCanvas();
1021 KIGFX::VIEW* view = canvas->GetView();
1022
1023 if( m_toolManager )
1024 {
1025 m_toolManager->SetEnvironment( m_pcb, view, canvas->GetViewControls(), config(), this );
1026
1027 m_toolManager->ResetTools( TOOL_BASE::GAL_SWITCH );
1028 }
1029
1030 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( view->GetPainter() );
1031 KIGFX::PCB_RENDER_SETTINGS* settings = painter->GetSettings();
1032 const PCB_DISPLAY_OPTIONS& displ_opts = GetDisplayOptions();
1033
1034 settings->LoadDisplayOptions( displ_opts );
1035 settings->LoadColors( GetColorSettings() );
1037
1038 view->RecacheAllItems();
1040 canvas->StartDrawing();
1041
1042 try
1043
1044 {
1045 if( !m_spaceMouse )
1046 {
1047#if defined(__linux__) || defined(__FreeBSD__)
1048 m_spaceMouse = std::make_unique<SPNAV_2D_PLUGIN>( GetCanvas() );
1049 m_spaceMouse->SetScale( 0.01 );
1050#else
1051 m_spaceMouse = std::make_unique<NL_PCBNEW_PLUGIN>( GetCanvas() );
1052#endif
1053 }
1054 }
1055 catch( const std::system_error& e )
1056 {
1057 wxLogTrace( wxT( "KI_TRACE_NAVLIB" ), e.what() );
1058 }
1059}
1060
1061
1062void PCB_BASE_FRAME::SetDisplayOptions( const PCB_DISPLAY_OPTIONS& aOptions, bool aRefresh )
1063{
1064 bool hcChanged = m_displayOptions.m_ContrastModeDisplay != aOptions.m_ContrastModeDisplay;
1065 bool hcVisChanged = m_displayOptions.m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN
1067 m_displayOptions = aOptions;
1068
1069 EDA_DRAW_PANEL_GAL* canvas = GetCanvas();
1070 KIGFX::PCB_VIEW* view = static_cast<KIGFX::PCB_VIEW*>( canvas->GetView() );
1071
1072 view->UpdateDisplayOptions( aOptions );
1073 view->SetMirror( aOptions.m_FlipBoardView, view->IsMirroredY() );
1074 view->RecacheAllItems();
1075
1078
1079 // Vias on a restricted layer set must be redrawn when high contrast mode is changed
1080 if( hcChanged )
1081 {
1082 bool showNetNames = false;
1083
1084 if( PCBNEW_SETTINGS* config = dynamic_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() ) )
1085 showNetNames = config->m_Display.m_NetNames > 0;
1086
1087 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible as
1088 // they won't be found in the view layer's itemset for re-painting.
1090 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1091 {
1092 if( PCB_VIA* via = dynamic_cast<PCB_VIA*>( aItem ) )
1093 {
1094 if( via->GetViaType() != VIATYPE::THROUGH
1095 || via->GetRemoveUnconnected()
1096 || showNetNames )
1097 {
1098 return hcVisChanged ? KIGFX::ALL : KIGFX::REPAINT;
1099 }
1100 }
1101 else if( PAD* pad = dynamic_cast<PAD*>( aItem ) )
1102 {
1103 if( pad->GetRemoveUnconnected()
1104 || showNetNames )
1105 {
1106 return hcVisChanged ? KIGFX::ALL : KIGFX::REPAINT;
1107 }
1108 }
1109
1110 return 0;
1111 } );
1112 }
1113
1114 if( aRefresh )
1115 canvas->Refresh();
1116}
1117
1118
1120{
1121 wxLogTrace( traceLibWatch, "setFPWatcher" );
1122
1123 Unbind( wxEVT_FSWATCHER, &PCB_BASE_FRAME::OnFPChange, this );
1124
1125 if( m_watcher )
1126 {
1127 wxLogTrace( traceLibWatch, "Remove watch" );
1128 m_watcher->RemoveAll();
1129 m_watcher->SetOwner( nullptr );
1130 m_watcher.reset();
1131 }
1132
1133 wxString libfullname;
1135
1136 if( !aFootprint || !adapter )
1137 return;
1138
1139 try
1140 {
1141 std::optional<LIBRARY_TABLE_ROW*> row = adapter->GetRow( aFootprint->GetFPID().GetLibNickname() );
1142
1143 if( !row )
1144 return;
1145
1146 libfullname = LIBRARY_MANAGER::GetFullURI( *row, true );
1147 }
1148 catch( const IO_ERROR& error )
1149 {
1150 wxLogTrace( traceLibWatch, "Error: %s", error.What() );
1151 return;
1152 }
1153 catch( const std::exception& e )
1154 {
1155 DisplayInfoMessage( this, e.what() );
1156 return;
1157 }
1158
1159 m_watcherFileName.Assign( libfullname, aFootprint->GetFPID().GetLibItemName(),
1161
1162 if( !m_watcherFileName.FileExists() )
1163 return;
1164
1165 m_watcherLastModified = m_watcherFileName.GetModificationTime();
1166
1167 Bind( wxEVT_FSWATCHER, &PCB_BASE_FRAME::OnFPChange, this );
1168 m_watcher = std::make_unique<wxFileSystemWatcher>();
1169 m_watcher->SetOwner( this );
1170
1171 wxFileName fn;
1172 fn.AssignDir( m_watcherFileName.GetPath() );
1173 fn.DontFollowLink();
1174
1175 wxLogTrace( traceLibWatch, "Add watch: %s", fn.GetPath() );
1176
1177 {
1178 // Silence OS errors that come from the watcher
1179 wxLogNull silence;
1180 m_watcher->Add( fn );
1181 }
1182}
1183
1184
1185void PCB_BASE_FRAME::OnFPChange( wxFileSystemWatcherEvent& aEvent )
1186{
1187 if( aEvent.GetPath() != m_watcherFileName.GetFullPath() )
1188 return;
1189
1190 // Start the debounce timer (set to 1 second)
1191 if( !m_watcherDebounceTimer.StartOnce( 1000 ) )
1192 {
1193 wxLogTrace( traceLibWatch, "Failed to start the debounce timer" );
1194 return;
1195 }
1196}
1197
1198
1200{
1201 if( aEvent.GetId() != m_watcherDebounceTimer.GetId() )
1202 {
1203 aEvent.Skip();
1204 return;
1205 }
1206
1208 {
1209 wxLogTrace( traceLibWatch, "Restarting debounce timer" );
1210 m_watcherDebounceTimer.StartOnce( 3000 );
1211 }
1212
1213 wxLogTrace( traceLibWatch, "OnFpChangeDebounceTimer" );
1214
1215 // Disable logging to avoid spurious messages and check if the file has changed
1216 wxLog::EnableLogging( false );
1217 wxDateTime lastModified = m_watcherFileName.GetModificationTime();
1218 wxLog::EnableLogging( true );
1219
1220 if( lastModified == m_watcherLastModified || !lastModified.IsValid() )
1221 return;
1222
1223 m_watcherLastModified = lastModified;
1224
1227
1228 // When loading a footprint from a library in the footprint editor
1229 // the items UUIDs must be keep and not reinitialized
1230 bool keepUUID = IsType( FRAME_FOOTPRINT_EDITOR );
1231
1232 if( !fp || !adapter )
1233 return;
1234
1236
1238 || IsOK( this, _( "The library containing the current footprint has changed.\n"
1239 "Do you want to reload the footprint?" ) ) )
1240 {
1241 wxString fpname = fp->GetFPID().GetLibItemName();
1242 wxString nickname = fp->GetFPID().GetLibNickname();
1243
1244 try
1245 {
1246 FOOTPRINT* newfp = adapter->LoadFootprint( nickname, fpname, keepUUID );
1247
1248 if( newfp )
1249 {
1250 std::vector<KIID> selectedItems;
1251
1252 for( const EDA_ITEM* item : GetCurrentSelection() )
1253 selectedItems.emplace_back( item->m_Uuid );
1254
1256
1257 ReloadFootprint( newfp );
1258
1259 newfp->ClearAllNets();
1263
1264 std::vector<EDA_ITEM*> sel;
1265
1266 for( const KIID& uuid : selectedItems )
1267 {
1268 if( BOARD_ITEM* item = GetBoard()->ResolveItem( uuid, true ) )
1269 sel.push_back( item );
1270 }
1271
1272 if( !sel.empty() )
1273 m_toolManager->RunAction( ACTIONS::selectItems, &sel );
1274 }
1275 }
1276 catch( const IO_ERROR& ioe )
1277 {
1278 DisplayError( this, ioe.What() );
1279 }
1280 }
1281
1282 m_inFpChangeTimerEvent = false;
1283}
@ ERROR_INSIDE
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:112
constexpr int ARC_LOW_DEF
Definition base_units.h:127
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
@ NORMAL
Inactive layers are shown normally (no high-contrast mode)
@ HIDDEN
Inactive layers are hidden.
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
BOX2< VECTOR2D > BOX2D
Definition box2.h:923
static TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
Definition actions.h:232
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
WINDOW_SETTINGS m_Window
Handles how to draw a screen (a board, a schematic ...)
Definition base_screen.h:41
VECTOR2D m_LocalOrigin
Relative Screen cursor coordinate (on grid) in user units.
Definition base_screen.h:90
void SetContentModified(bool aModified=true)
Definition base_screen.h:59
void InitDataPoints(const VECTOR2I &aPageSizeInternalUnits)
Container for design settings for a BOARD object.
std::map< int, SEVERITY > m_DRCSeverities
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:84
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:323
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
Definition board.cpp:1237
void UpdateUserUnits(BOARD_ITEM *aItem, KIGFX::VIEW *aView)
Update any references within aItem (or its descendants) to the user units.
Definition board.cpp:1696
const LSET & GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
Definition board.cpp:990
bool BuildConnectivity(PROGRESS_REPORTER *aReporter=nullptr)
Build or rebuild the board connectivity database for the board, especially the list of connected item...
Definition board.cpp:195
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
Definition board.h:524
void IncrementTimeStamp()
Definition board.cpp:266
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition board.cpp:1091
void SynchronizeProperties()
Copy the current project's text variables into the boards property cache.
Definition board.cpp:2701
BOARD_ITEM * ResolveItem(const KIID &aID, bool aAllowNullptrReturn=false) const
Definition board.cpp:1779
void SetUserUnits(EDA_UNITS aUnits)
Definition board.h:820
constexpr void SetOrigin(const Vec &pos)
Definition box2.h:237
constexpr size_type GetWidth() const
Definition box2.h:214
constexpr Vec Centre() const
Definition box2.h:97
constexpr size_type GetHeight() const
Definition box2.h:215
constexpr const Vec & GetOrigin() const
Definition box2.h:210
constexpr void SetEnd(coord_type x, coord_type y)
Definition box2.h:297
static DELETED_BOARD_ITEM * GetInstance()
Definition board_item.h:525
Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard.
void CommonSettingsChanged(int aFlags) override
Notification that common settings are updated.
void ShowChangedLanguage() override
void ReloadRequest()
Request reloading the 3D view.
FRAME_T GetFrameType() const
virtual APP_SETTINGS_BASE * config() const
Return the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
virtual void handleIconizeEvent(wxIconizeEvent &aEvent)
Handle a window iconize event.
virtual void OnModify()
Must be called after a model change in order to set the "modify" flag and do other frame-specific pro...
wxAuiManager m_auimgr
virtual bool IsContentModified() const
Get if the contents of the frame have been modified since the last save.
virtual void RecreateToolbars()
bool m_isClosing
Set by the close window event handler after frames are asked if they can close.
bool IsType(FRAME_T aType) const
virtual void ActivateGalCanvas()
Use to start up the GAL drawing canvas.
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType
The current canvas type.
virtual BASE_SCREEN * GetScreen() const
Return a pointer to a BASE_SCREEN or one of its derivatives.
void UpdateGridSelectBox()
Rebuild the grid combobox to respond to any changes in the GUI (units, user grid changes,...
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
EDA_DRAW_FRAME(KIWAY *aKiway, wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName, const EDA_IU_SCALE &aIuScale)
virtual void handleActivateEvent(wxActivateEvent &aEvent)
Handle a window activation event.
virtual void UpdateMsgPanel()
Redraw the message panel.
void FocusOnLocation(const VECTOR2I &aPos, bool aAllowScroll=true)
Useful to focus on a particular location, in find functions.
void UpdateStatusBar() override
Update the status bar information.
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual EDA_DRAW_PANEL_GAL * GetCanvas() const
Return a pointer to GAL-based canvas of given EDA draw frame.
void unitsChangeRefresh() override
Called when when the units setting has changed to allow for any derived classes to handle refreshing ...
std::vector< wxWindow * > findDialogs()
virtual void DisplayGridMsg()
Display current grid size in the status bar.
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
bool m_showBorderAndTitleBlock
bool GetShowPolarCoords() const
For those frames that support polar coordinates.
GAL_TYPE GetBackend() const
Return the type of backend currently used by GAL canvas.
virtual void SetHighContrastLayer(int aLayer)
Take care of display settings for the given layer to be displayed in high contrast mode.
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the #VIEW_CONTROLS instance used in the panel.
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
void SetEventDispatcher(TOOL_DISPATCHER *aEventDispatcher)
Set a dispatcher that processes events and forwards them to tools.
void StartDrawing()
Begin drawing if it was stopped previously.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition eda_item.h:100
void SetFlags(EDA_ITEM_FLAGS aMask)
Definition eda_item.h:149
const KIID m_Uuid
Definition eda_item.h:528
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:112
void SetBrightened()
Definition eda_item.h:142
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition eda_text.h:91
static const TOOL_EVENT ConnectivityChangedEvent
Selected item had a property changed (except movement)
Definition actions.h:349
An interface to the global shared library manager that is schematic-specific and linked to one projec...
FOOTPRINT * LoadFootprint(const wxString &aNickname, const wxString &aName, bool aKeepUUID)
Load a FOOTPRINT having aName from the library given by aNickname.
void SetPosition(const VECTOR2I &aPos) override
void SetOrientation(const EDA_ANGLE &aNewAngle)
bool IsFlipped() const
Definition footprint.h:544
const LIB_ID & GetFPID() const
Definition footprint.h:371
void ClearAllNets()
Clear (i.e.
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
VECTOR2I GetPosition() const override
Definition footprint.h:347
A general implementation of a COLLECTORS_GUIDE.
Definition collectors.h:324
void SetIgnoreBlindBuriedVias(bool ignore)
Definition collectors.h:464
void SetIgnoreTracks(bool ignore)
Definition collectors.h:470
void SetIgnoreFootprintsOnFront(bool ignore)
Definition collectors.h:428
void SetIgnoreFPTextOnFront(bool ignore)
Definition collectors.h:416
void SetIgnoreMicroVias(bool ignore)
Definition collectors.h:467
void SetIgnoreFPTextOnBack(bool ignore)
Definition collectors.h:410
void SetIgnoreThroughVias(bool ignore)
Definition collectors.h:461
void SetIgnoreThroughHolePads(bool ignore)
Definition collectors.h:446
void SetIgnoreFPReferences(bool ignore)
Definition collectors.h:458
void SetIgnoreFPValues(bool ignore)
Definition collectors.h:452
void SetIgnoreFootprintsOnBack(bool ignore)
Definition collectors.h:422
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
Contains methods for drawing PCB-specific items.
virtual PCB_RENDER_SETTINGS * GetSettings() override
Return a pointer to current settings that are going to be used when drawing items.
PCB specific render settings.
Definition pcb_painter.h:82
void LoadColors(const COLOR_SETTINGS *aSettings) override
void LoadDisplayOptions(const PCB_DISPLAY_OPTIONS &aOptions)
Load settings related to display options (high-contrast mode, full or outline modes for vias/pads/tra...
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition pcb_view.cpp:91
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1) override
Add a VIEW_ITEM to the view.
Definition pcb_view.cpp:57
virtual void Remove(VIEW_ITEM *aItem) override
Remove a VIEW_ITEM from the view.
Definition pcb_view.cpp:74
void UpdateDisplayOptions(const PCB_DISPLAY_OPTIONS &aOptions)
Definition pcb_view.cpp:149
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
void SetDefaultFont(const wxString &aFont)
void SetGapLengthRatio(double aRatio)
void SetDashLengthRatio(double aRatio)
void SetHighlightFactor(float aFactor)
void SetSelectFactor(float aFactor)
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
An abstract base class for deriving all objects that can be added to a VIEW.
Definition view_item.h:86
bool IsBOARD_ITEM() const
Definition view_item.h:102
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition view.h:67
void SetMirror(bool aMirrorX, bool aMirrorY)
Control the mirroring of the VIEW.
Definition view.cpp:625
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
Definition view.cpp:598
bool HasItem(const VIEW_ITEM *aItem) const
Indicates whether or not the given item has been added to the view.
Definition view.cpp:1795
VECTOR2D ToWorld(const VECTOR2D &aCoord, bool aAbsolute=true) const
Converts a screen space point/vector to a point/vector in world space coordinates.
Definition view.cpp:535
void RecacheAllItems()
Rebuild GAL display lists.
Definition view.cpp:1538
bool IsMirroredY() const
Return true if view is flipped across the Y axis.
Definition view.h:267
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition view.cpp:1666
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition view.h:229
void UpdateAllItemsConditionally(int aUpdateFlags, std::function< bool(VIEW_ITEM *)> aCondition)
Update items in the view according to the given flags and condition.
Definition view.cpp:1682
Definition kiid.h:48
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition kiway.h:315
std::optional< LIBRARY_TABLE_ROW * > GetRow(const wxString &aNickname, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH) const
Like LIBRARY_MANAGER::GetRow but filtered to the LIBRARY_TABLE_TYPE of this adapter.
std::optional< wxString > GetFullURI(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, bool aSubstituted=false)
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
const UTF8 & GetLibItemName() const
Definition lib_id.h:102
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition lib_id.h:87
LSET is a set of PCB_LAYER_IDs.
Definition lset.h:37
A class to perform either relative or absolute display origin transforms for a single axis of a point...
Definition pad.h:55
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition page_info.h:79
const VECTOR2D GetSizeIU(double aIUScale) const
Gets the page size in internal units.
Definition page_info.h:177
DISPLAY_OPTIONS m_Display
static TOOL_ACTION rehatchShapes
SEVERITY GetSeverity(int aErrorCode) const override
std::unique_ptr< wxFileSystemWatcher > m_watcher
virtual void ReloadFootprint(FOOTPRINT *aFootprint)
Reload the footprint from the library.
virtual void OnDisplayOptionsChanged()
void handleIconizeEvent(wxIconizeEvent &aEvent) override
Handle a window iconize event.
ORIGIN_TRANSFORMS & GetOriginTransforms() override
Return a reference to the default ORIGIN_TRANSFORMS object.
virtual const PCB_PLOT_PARAMS & GetPlotSettings() const
Return the PCB_PLOT_PARAMS for the BOARD owned by this frame.
std::unique_ptr< NL_PCBNEW_PLUGIN > m_spaceMouse
wxDateTime m_watcherLastModified
const PCB_DISPLAY_OPTIONS & GetDisplayOptions() const
Display options control the way tracks, vias, outlines and other things are shown (for instance solid...
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
void handleActivateEvent(wxActivateEvent &aEvent) override
Handle a window activation event.
void setFPWatcher(FOOTPRINT *aFootprint)
Create or removes a watcher on the specified footprint.
virtual void unitsChangeRefresh() override
Called when when the units setting has changed to allow for any derived classes to handle refreshing ...
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Return bounding box of document with option to not include some items.
const VECTOR2I GetPageSizeIU() const override
Works off of GetPageSettings() to return the size of the paper page in the internal units of this par...
PCBNEW_SETTINGS * GetPcbNewSettings() const
virtual void SwitchLayer(PCB_LAYER_ID aLayer)
Change the active layer in the frame.
PCB_BASE_FRAME(KIWAY *aKiway, wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName)
virtual void SetActiveLayer(PCB_LAYER_ID aLayer)
void OnModify() override
Must be called after a change in order to set the "modify" flag and update other data structures and ...
const VECTOR2I & GetAuxOrigin() const
virtual PCB_VIEWERS_SETTINGS_BASE * GetViewerSettingsBase() const
const VECTOR2I GetUserOrigin() const
virtual MAGNETIC_SETTINGS * GetMagneticItemsSettings()
void FocusOnItems(std::vector< BOARD_ITEM * > aItems, PCB_LAYER_ID aLayer=UNDEFINED_LAYER, bool aAllowScroll=true)
void OnFPChange(wxFileSystemWatcherEvent &aEvent)
Handler for FP change events.
bool canCloseWindow(wxCloseEvent &aCloseEvent) override
const VECTOR2I & GetGridOrigin() const override
Return the absolute coordinates of the origin of the snap grid.
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
const TITLE_BLOCK & GetTitleBlock() const override
const PAGE_INFO & GetPageSettings() const override
BOX2I GetBoardBoundingBox(bool aBoardEdgesOnly=false) const
Calculate the bounding box containing all board items (or board edge segments).
EDA_ITEM * ResolveItem(const KIID &aId, bool aAllowNullptrReturn=false) const override
Fetch an item by KIID.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual void ActivateGalCanvas() override
Use to start up the GAL drawing canvas.
void SetDrawBgColor(const COLOR4D &aColor) override
void OnFpChangeDebounceTimer(wxTimerEvent &aEvent)
Handler for the filesystem watcher debounce timer.
virtual void SetBoard(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr)
Set the #m_Pcb member in such as way as to ensure deleting any previous BOARD.
virtual PCB_LAYER_ID GetActiveLayer() const
virtual void SetPageSettings(const PAGE_INFO &aPageSettings) override
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock) override
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
BOARD * GetBoard() const
virtual BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Return the BOARD_DESIGN_SETTINGS for the open project.
virtual void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual void AddFootprintToBoard(FOOTPRINT *aFootprint)
Add the given footprint to the board.
virtual void doReCreateMenuBar() override
void SetDisplayOptions(const PCB_DISPLAY_OPTIONS &aOptions, bool aRefresh=true)
Update the current display options.
GENERAL_COLLECTORS_GUIDE GetCollectorsGuide()
virtual void SetPlotSettings(const PCB_PLOT_PARAMS &aSettings)
void FocusOnItem(EDA_ITEM *aItem, bool aAllowScroll=true) override
Focus on a particular canvas item.
PCB_DISPLAY_OPTIONS m_displayOptions
FOOTPRINT_EDITOR_SETTINGS * GetFootprintEditorSettings() const
void SetGridOrigin(const VECTOR2I &aPoint) override
PCB_ORIGIN_TRANSFORMS m_originTransforms
EDA_3D_VIEWER_FRAME * CreateAndShow3D_Frame()
Show the 3D view frame.
wxTimer m_watcherDebounceTimer
EDA_3D_VIEWER_FRAME * Get3DViewerFrame()
virtual COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Helper to retrieve the current color settings.
wxFileName m_watcherFileName
virtual void Update3DView(bool aMarkDirty, bool aRefresh, const wxString *aTitle=nullptr)
Update the 3D view, if the viewer is opened by this frame.
virtual void UpdateStatusBar() override
Update the status bar information.
bool m_FlipBoardView
true if the board is flipped to show the mirrored view
HIGH_CONTRAST_MODE m_ContrastModeDisplay
How inactive layers are displayed.
void UpdateColors()
Update the color settings in the painter and GAL.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void DisplayBoard(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr)
Add all items from the current board to the VIEW, so they can be displayed by GAL.
void RedrawRatsnest()
Return the bounding box of the view that should be used if model is not valid.
Parameters and options when plotting/printing a board.
PCB_LAYER_ID m_Active_Layer
Definition pcb_screen.h:42
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:130
A progress reporter interface for use in multi-threaded environments.
static void Cleanup3DCache(PROJECT *aProject)
static FOOTPRINT_LIBRARY_ADAPTER * FootprintLibAdapter(PROJECT *aProject)
T * GetAppSettings(const char *aFilename)
Return a handle to the a given settings by type.
Represent a set of closed polygons.
void ClearArcs()
Removes all arc references from all the outlines and holes in the polyset.
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
int NewOutline()
Creates a new empty polygon in the set and returns its index.
void Deflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError)
void BooleanIntersection(const SHAPE_POLY_SET &b)
Perform boolean polyset intersection.
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
Hold the information shown in the lower right corner of a plot, printout, or editing view.
Definition title_block.h:41
TOOL_MANAGER * m_toolManager
TOOL_DISPATCHER * m_toolDispatcher
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
virtual SELECTION & GetCurrentSelection()
Get the current selection from the canvas area.
@ MODEL_RELOAD
Model changes (the sheet for a schematic)
Definition tool_base.h:80
@ GAL_SWITCH
Rendering engine changes.
Definition tool_base.h:82
void PostEvent(const TOOL_EVENT &aEvent)
Put an event to the event queue to be processed at the end of event processing cycle.
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
EDA_UNITS GetUserUnits() const
Handle a list of polygons defining a copper zone.
Definition zone.h:74
SHAPE_POLY_SET * Outline()
Definition zone.h:336
void TransformShapeToPolygon(SHAPE_POLY_SET &aBuffer, PCB_LAYER_ID aLayer, int aClearance, int aError, ERROR_LOC aErrorLoc, bool ignoreLineWidth=false) const override
Convert the zone shape to a closed polygon Used in filling zones calculations Circles and arcs are ap...
Definition zone.cpp:1654
@ CLEANUP_FIRST
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
Definition confirm.cpp:259
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition confirm.cpp:230
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition confirm.cpp:177
This file is part of the common library.
@ ALLOW_ACUTE_CORNERS
just inflate the polygon. Acute angles create spikes
#define _(s)
Declaration of the eda_3d_viewer class.
static constexpr EDA_ANGLE ANGLE_0
Definition eda_angle.h:411
#define QUALIFIED_VIEWER3D_FRAMENAME(parent)
@ RECURSE
Definition eda_item.h:53
#define IS_NEW
New item, just created.
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition frame_type.h:33
@ FRAME_PCB_EDITOR
Definition frame_type.h:42
@ FRAME_CVPCB_DISPLAY
Definition frame_type.h:53
@ FRAME_FOOTPRINT_VIEWER
Definition frame_type.h:45
@ FRAME_FOOTPRINT_WIZARD
Definition frame_type.h:46
@ FRAME_FOOTPRINT_PREVIEW
Definition frame_type.h:48
@ FRAME_FOOTPRINT_CHOOSER
Definition frame_type.h:44
@ FRAME_FOOTPRINT_EDITOR
Definition frame_type.h:43
@ FRAME_PCB_DISPLAY3D
Definition frame_type.h:47
@ FRAME_CVPCB
Definition frame_type.h:52
static const std::string KiCadFootprintFileExtension
const wxChar *const traceLibWatch
Flag to enable debug output for library file watch refreshes.
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
Definition layer_ids.h:679
@ LAYER_FOOTPRINTS_FR
Show footprints on front.
Definition layer_ids.h:259
@ LAYER_FP_REFERENCES
Show footprints references (when texts are visible).
Definition layer_ids.h:266
@ LAYER_PADS
Meta control for all pads opacity/visibility (color ignored).
Definition layer_ids.h:292
@ LAYER_TRACKS
Definition layer_ids.h:267
@ LAYER_FP_TEXT
Definition layer_ids.h:240
@ LAYER_FOOTPRINTS_BK
Show footprints on back.
Definition layer_ids.h:260
@ LAYER_FP_VALUES
Show footprints values (when texts are visible).
Definition layer_ids.h:263
@ LAYER_VIAS
Meta control for all vias opacity/visibility.
Definition layer_ids.h:232
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
@ F_Mask
Definition layer_ids.h:97
@ UNDEFINED_LAYER
Definition layer_ids.h:61
Message panel definition file.
@ COLOR
Color has changed.
Definition view_item.h:54
@ REPAINT
Item needs to be redrawn.
Definition view_item.h:58
@ GEOMETRY
Position or shape has changed.
Definition view_item.h:55
@ ALL
All except INITIAL_ADD.
Definition view_item.h:59
Declaration of the NL_PCBNEW_PLUGIN class.
wxDEFINE_EVENT(EDA_EVT_BOARD_CHANGING, wxCommandEvent)
@ PCB_ORIGIN_AUX
@ PCB_ORIGIN_GRID
@ PCB_ORIGIN_PAGE
PGM_BASE & Pgm()
The global program "get" accessor.
see class PGM_BASE
SEVERITY
@ RPT_SEVERITY_ACTION
KIWAY Kiway(KFCTL_STANDALONE)
float highlight_factor
How much to brighten highlighted objects by.
float select_factor
How much to brighten selected objects by.
wxString user_grid_x
std::vector< GRID > grids
wxString user_grid_y
Common grid settings, available to every frame.
GRID_SETTINGS grid
#define TEXTVARS_CHANGED
wxLogTrace helper definitions.
double RAD2DEG(double rad)
Definition trigo.h:167
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition typeinfo.h:85
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition typeinfo.h:103
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition typeinfo.h:100
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
Definition typeinfo.h:94
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition typeinfo.h:101
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition typeinfo.h:90
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition typeinfo.h:105
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition typeinfo.h:89
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
Definition typeinfo.h:87
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
Definition typeinfo.h:96
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
Definition typeinfo.h:98
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition typeinfo.h:83
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition typeinfo.h:99
@ PCB_PAD_T
class PAD, a pad in a footprint
Definition typeinfo.h:84
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
Definition typeinfo.h:95
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
Definition typeinfo.h:93
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Definition typeinfo.h:102
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:687
VECTOR2< double > VECTOR2D
Definition vector2d.h:686
VECTOR2D ToVECTOR2D(const wxPoint &aPoint)
Definition vector2wx.h:40
Definition of file extensions used in Kicad.