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 for( BOARD_ITEM* item : aItems )
274 {
275 if( item && item != DELETED_BOARD_ITEM::GetInstance() )
276 {
277 item->SetBrightened();
278 lastBrightenedItemIDs.push_back( item->m_Uuid );
279
280 item->RunOnChildren(
281 [&]( BOARD_ITEM* child )
282 {
283 child->SetBrightened();
284 lastBrightenedItemIDs.push_back( child->m_Uuid );
285 },
287
288 GetCanvas()->GetView()->Update( item );
289 }
290 }
291
292 VECTOR2I focusPt;
293 KIGFX::VIEW* view = GetCanvas()->GetView();
294 SHAPE_POLY_SET viewportPoly( view->GetViewport() );
295
296 for( wxWindow* dialog : findDialogs() )
297 {
298 wxPoint dialogPos = GetCanvas()->ScreenToClient( dialog->GetScreenPosition() );
299 SHAPE_POLY_SET dialogPoly( BOX2D( view->ToWorld( ToVECTOR2D( dialogPos ), true ),
300 view->ToWorld( ToVECTOR2D( dialog->GetSize() ), false ) ) );
301
302 try
303 {
304 viewportPoly.BooleanSubtract( dialogPoly );
305 }
306 catch( const std::exception& e )
307 {
308 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
309 }
310 }
311
312 SHAPE_POLY_SET itemPoly, clippedPoly;
313
314 for( BOARD_ITEM* item : aItems )
315 {
316 if( item && item != DELETED_BOARD_ITEM::GetInstance() )
317 {
318 // Focus on the object's location. Prefer a visible part of the object to its anchor
319 // in order to keep from scrolling around.
320
321 focusPt = item->GetPosition();
322
323 if( aLayer == UNDEFINED_LAYER && item->GetLayerSet().any() )
324 aLayer = item->GetLayerSet().Seq()[0];
325
326 switch( item->Type() )
327 {
328 case PCB_FOOTPRINT_T:
329 try
330 {
331 itemPoly = static_cast<FOOTPRINT*>( item )->GetBoundingHull();
332 }
333 catch( const std::exception& e )
334 {
335 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
336 }
337
338 break;
339
340 case PCB_PAD_T:
341 case PCB_MARKER_T:
342 case PCB_VIA_T:
343 FocusOnLocation( item->GetFocusPosition(), aAllowScroll );
344 GetCanvas()->Refresh();
345 return;
346
347 case PCB_SHAPE_T:
348 case PCB_FIELD_T:
349 case PCB_TEXT_T:
350 case PCB_TEXTBOX_T:
351 case PCB_BARCODE_T:
352 case PCB_TRACE_T:
353 case PCB_ARC_T:
355 case PCB_DIM_LEADER_T:
356 case PCB_DIM_CENTER_T:
357 case PCB_DIM_RADIAL_T:
359 item->TransformShapeToPolygon( itemPoly, aLayer, 0, pcbIUScale.mmToIU( 0.1 ), ERROR_INSIDE );
360 break;
361
362 case PCB_ZONE_T:
363 {
364 ZONE* zone = static_cast<ZONE*>( item );
365#if 0
366 // Using the filled area shapes to find a Focus point can give good results, but
367 // unfortunately the calculations are highly time consuming, even for not very
368 // large areas (can be easily a few minutes for large areas).
369 // so we used only the zone outline that usually do not have too many vertices.
370 zone->TransformShapeToPolygon( itemPoly, aLayer, 0, pcbIUScale.mmToIU( 0.1 ), ERROR_INSIDE );
371
372 if( itemPoly.IsEmpty() )
373 itemPoly = *zone->Outline();
374#else
375 // much faster calculation time when using only the zone outlines
376 itemPoly = *zone->Outline();
377#endif
378
379 break;
380 }
381
382 default:
383 {
384 BOX2I item_bbox = item->GetBoundingBox();
385 itemPoly.NewOutline();
386 itemPoly.Append( item_bbox.GetOrigin() );
387 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( item_bbox.GetWidth(), 0 ) );
388 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( 0, item_bbox.GetHeight() ) );
389 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( item_bbox.GetWidth(),
390 item_bbox.GetHeight() ) );
391 break;
392 }
393 }
394
395 try
396 {
397 itemPoly.ClearArcs();
398 viewportPoly.ClearArcs();
399 clippedPoly.BooleanIntersection( itemPoly, viewportPoly );
400 }
401 catch( const std::exception& e )
402 {
403 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
404 }
405
406 if( !clippedPoly.IsEmpty() )
407 itemPoly = clippedPoly;
408 }
409 }
410
411 /*
412 * Perform a step-wise deflate to find the visual-center-of-mass
413 */
414
415 if( itemPoly.IsEmpty() )
416 {
417 FocusOnLocation( focusPt, aAllowScroll );
418 GetCanvas()->Refresh();
419 return;
420 }
421
422 BOX2I bbox = itemPoly.BBox();
423 int step = std::min( bbox.GetWidth(), bbox.GetHeight() ) / 10;
424
425 // Tiny shapes can quantize to a zero deflate step
426 if( step <= 0 )
427 {
428 FocusOnLocation( bbox.Centre(), aAllowScroll );
429 GetCanvas()->Refresh();
430 return;
431 }
432
433 while( !itemPoly.IsEmpty() )
434 {
435 focusPt = itemPoly.BBox().Centre();
436
437 try
438 {
440 }
441 catch( const std::exception& e )
442 {
443 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
444 }
445 }
446
447 FocusOnLocation( focusPt, aAllowScroll );
448
449 GetCanvas()->Refresh();
450}
451
452
454{
455 KIGFX::PCB_VIEW* view = GetCanvas()->GetView();
456
457 if( view && GetBoard()->m_SolderMaskBridges && view->HasItem( GetBoard()->m_SolderMaskBridges ) )
458 view->Remove( GetBoard()->m_SolderMaskBridges );
459}
460
461
463{
464 KIGFX::PCB_VIEW* view = GetCanvas()->GetView();
465
466 if( view && GetBoard()->m_SolderMaskBridges )
467 {
468 if( view->HasItem( GetBoard()->m_SolderMaskBridges ) )
469 view->Remove( GetBoard()->m_SolderMaskBridges );
470
471 view->Add( GetBoard()->m_SolderMaskBridges );
472 }
473}
474
475
476void PCB_BASE_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
477{
478 m_pcb->SetPageSettings( aPageSettings );
479
480 if( GetScreen() )
481 GetScreen()->InitDataPoints( aPageSettings.GetSizeIU( pcbIUScale.IU_PER_MILS ) );
482}
483
484
486{
487 return m_pcb->GetPageSettings();
488}
489
490
492{
493 // this function is only needed because EDA_DRAW_FRAME is not compiled
494 // with either -DPCBNEW or -DEESCHEMA, so the virtual is used to route
495 // into an application specific source file.
496 return m_pcb->GetPageSettings().GetSizeIU( pcbIUScale.IU_PER_MILS );
497}
498
499
501{
502 return m_pcb->GetDesignSettings().GetGridOrigin();
503}
504
505
507{
508 m_pcb->GetDesignSettings().SetGridOrigin( aPoint );
509}
510
511
513{
514 return m_pcb->GetDesignSettings().GetAuxOrigin();
515}
516
517
519{
520 VECTOR2I origin( 0, 0 );
521
522 switch( GetPcbNewSettings()->m_Display.m_DisplayOrigin )
523 {
525 case PCB_DISPLAY_ORIGIN::PCB_ORIGIN_AUX: origin = GetAuxOrigin(); break;
527 default: wxASSERT( false ); break;
528 }
529
530 return origin;
531}
532
537
538
540{
541 return m_pcb->GetTitleBlock();
542}
543
544
546{
547 m_pcb->SetTitleBlock( aTitleBlock );
548}
549
550
552{
553 return m_pcb->GetDesignSettings();
554}
555
556
558{
559 m_drawBgColor= aColor;
560 m_auimgr.Update();
561}
562
563
565{
566 return m_pcb->GetPlotOptions();
567}
568
569
571{
572 m_pcb->SetPlotOptions( aSettings );
573
574 // Plot Settings can also change the "tent vias" setting, which can affect the solder mask.
575 LSET visibleLayers = GetBoard()->GetVisibleLayers();
576
577 if( visibleLayers.test( F_Mask ) || visibleLayers.test( B_Mask ) )
578 {
580 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
581 {
582 BOARD_ITEM* item = nullptr;
583
584 if( aItem->IsBOARD_ITEM() )
585 item = static_cast<BOARD_ITEM*>( aItem );
586
587 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to
588 // visible as they won't be found in the view layer's itemset for re-painting.
589 if( item && item->Type() == PCB_VIA_T )
590 return KIGFX::ALL;
591
592 return 0;
593 } );
594
595 GetCanvas()->Refresh();
596 }
597}
598
599
600BOX2I PCB_BASE_FRAME::GetBoardBoundingBox( bool aBoardEdgesOnly ) const
601{
602 BOX2I area = aBoardEdgesOnly ? m_pcb->GetBoardEdgesBoundingBox() : m_pcb->GetBoundingBox();
603
604 if( area.GetWidth() == 0 && area.GetHeight() == 0 )
605 {
606 VECTOR2I pageSize = GetPageSizeIU();
607
609 {
610 area.SetOrigin( 0, 0 );
611 area.SetEnd( pageSize.x, pageSize.y );
612 }
613 else
614 {
615 area.SetOrigin( -pageSize.x / 2, -pageSize.y / 2 );
616 area.SetEnd( pageSize.x / 2, pageSize.y / 2 );
617 }
618 }
619
620 return area;
621}
622
623
624const BOX2I PCB_BASE_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
625{
626 /* "Zoom to Fit" calls this with "aIncludeAllVisible" as true. Since that feature
627 * always ignored the page and border, this function returns a bbox without them
628 * as well when passed true. This technically is not all things visible, but it
629 * keeps behavior consistent.
630 *
631 * When passed false, this function returns a bbox of just the board edge. This
632 * allows things like fabrication text or anything else outside the board edge to
633 * be ignored, and just zooms up to the board itself.
634 *
635 * Calling "GetBoardBoundingBox(true)" when edge cuts are turned off will return
636 * the entire page and border, so we call "GetBoardBoundingBox(false)" instead.
637 */
638 if( aIncludeAllVisible || !m_pcb->IsLayerVisible( Edge_Cuts ) )
639 return GetBoardBoundingBox( false );
640 else
641 return GetBoardBoundingBox( true );
642}
643
644
645// Virtual function
649
650
652{
653 return static_cast<PCB_SCREEN*>( EDA_DRAW_FRAME::GetScreen() );
654}
655
656
658{
659 GetScreen()->m_Active_Layer = aLayer;
660}
661
662
667
668
670{
671 // call my base class
673
674 // tooltips in toolbars
676
678
679 if( viewer3D )
680 viewer3D->ShowChangedLanguage();
681}
682
683
685{
686 EDA_3D_VIEWER_FRAME* draw3DFrame = Get3DViewerFrame();
687
688 if( !draw3DFrame )
689 draw3DFrame = new EDA_3D_VIEWER_FRAME( &Kiway(), this, _( "3D Viewer" ) );
690
691 // Raising the window does not show the window on Windows if iconized. This should work
692 // on any platform.
693 if( draw3DFrame->IsIconized() )
694 draw3DFrame->Iconize( false );
695
696 draw3DFrame->Raise();
697 draw3DFrame->Show( true );
698
699 // Raising the window does not set the focus on Linux. This should work on any platform.
700 if( wxWindow::FindFocus() != draw3DFrame )
701 draw3DFrame->SetFocus();
702
703 // Allocate a slice of time to display the 3D frame
704 // a call to wxSafeYield() should be enough (and better), but on Linux we need
705 // to call wxYield()
706 // otherwise the activity messages are not displayed during the first board loading
707 wxYield();
708
709 // Note, the caller is responsible to load/update the board 3D view.
710 // after frame creation the board is not automatically created.
711
712 return draw3DFrame;
713}
714
715
717{
718 PCB_LAYER_ID preslayer = GetActiveLayer();
719 auto& displ_opts = GetDisplayOptions();
720
721 // Check if the specified layer matches the present layer
722 if( layer == preslayer )
723 return;
724
725 // Copper layers cannot be selected unconditionally; how many of those layers are
726 // currently enabled needs to be checked.
727 if( IsCopperLayer( layer ) )
728 {
729 if( layer > m_pcb->GetCopperLayerStackMaxId() )
730 return;
731 }
732
733 // Is yet more checking required? E.g. when the layer to be selected is a non-copper
734 // layer, or when switching between a copper layer and a non-copper layer, or vice-versa?
735 // ...
736
737 SetActiveLayer( layer );
738
739 if( displ_opts.m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL )
740 GetCanvas()->Refresh();
741}
742
743
745{
746 GENERAL_COLLECTORS_GUIDE guide( m_pcb->GetVisibleLayers(), GetActiveLayer(),
747 GetCanvas()->GetView() );
748
749 // account for the globals
750 guide.SetIgnoreFPTextOnBack( !m_pcb->IsElementVisible( LAYER_FP_TEXT ) );
751 guide.SetIgnoreFPTextOnFront( !m_pcb->IsElementVisible( LAYER_FP_TEXT ) );
752 guide.SetIgnoreFootprintsOnBack( !m_pcb->IsElementVisible( LAYER_FOOTPRINTS_BK ) );
753 guide.SetIgnoreFootprintsOnFront( !m_pcb->IsElementVisible( LAYER_FOOTPRINTS_FR ) );
754 guide.SetIgnoreThroughHolePads( ! m_pcb->IsElementVisible( LAYER_PADS ) );
755 guide.SetIgnoreFPValues( !m_pcb->IsElementVisible( LAYER_FP_VALUES ) );
756 guide.SetIgnoreFPReferences( !m_pcb->IsElementVisible( LAYER_FP_REFERENCES ) );
757 guide.SetIgnoreThroughVias( ! m_pcb->IsElementVisible( LAYER_VIAS ) );
758 guide.SetIgnoreBlindBuriedVias( ! m_pcb->IsElementVisible( LAYER_VIAS ) );
759 guide.SetIgnoreMicroVias( ! m_pcb->IsElementVisible( LAYER_VIAS ) );
760 guide.SetIgnoreTracks( ! m_pcb->IsElementVisible( LAYER_TRACKS ) );
761
762 return guide;
763}
764
765
767{
769
770 BASE_SCREEN* screen = GetScreen();
771
772 if( !screen )
773 return;
774
775 wxString line;
777
778 if( GetShowPolarCoords() ) // display polar coordinates
779 {
780 double dx = cursorPos.x - screen->m_LocalOrigin.x;
781 double dy = cursorPos.y - screen->m_LocalOrigin.y;
782 double theta = RAD2DEG( atan2( -dy, dx ) );
783 double ro = hypot( dx, dy );
784
785 line.Printf( wxT( "r %s theta %.3f" ),
786 MessageTextFromValue( ro, false ),
787 theta );
788
789 SetStatusText( line, 3 );
790 }
791
792 // Transform absolute coordinates for user origin preferences
793 double userXpos = m_originTransforms.ToDisplayAbsX( static_cast<double>( cursorPos.x ) );
794 double userYpos = m_originTransforms.ToDisplayAbsY( static_cast<double>( cursorPos.y ) );
795
796 // Display absolute coordinates:
797 line.Printf( wxT( "X %s Y %s" ),
798 MessageTextFromValue( userXpos, false ),
799 MessageTextFromValue( userYpos, false ) );
800 SetStatusText( line, 2 );
801
802 if( !GetShowPolarCoords() ) // display relative cartesian coordinates
803 {
804 // Calculate relative coordinates
805 double relXpos = cursorPos.x - screen->m_LocalOrigin.x;
806 double relYpos = cursorPos.y - screen->m_LocalOrigin.y;
807
808 // Transform relative coordinates for user origin preferences
809 userXpos = m_originTransforms.ToDisplayRelX( relXpos );
810 userYpos = m_originTransforms.ToDisplayRelY( relYpos );
811
812 line.Printf( wxT( "dx %s dy %s dist %s" ),
813 MessageTextFromValue( userXpos, false ),
814 MessageTextFromValue( userYpos, false ),
815 MessageTextFromValue( hypot( userXpos, userYpos ), false ) );
816 SetStatusText( line, 3 );
817 }
818
820}
821
822
824{
825 EDA_DRAW_FRAME::unitsChangeRefresh(); // Update the status bar.
826
827 if( GetBoard() )
829
831}
832
833
835{
837
838 // Move legacy user grids to grid list
839 if( !aCfg->m_Window.grid.user_grid_x.empty() )
840 {
841 aCfg->m_Window.grid.grids.emplace_back( GRID{ "User Grid", aCfg->m_Window.grid.user_grid_x,
842 aCfg->m_Window.grid.user_grid_y } );
843 aCfg->m_Window.grid.user_grid_x = wxEmptyString;
844 aCfg->m_Window.grid.user_grid_y = wxEmptyString;
845 }
846
847 // Some, but not all, derived classes have a PCBNEW_SETTINGS.
848 if( PCBNEW_SETTINGS* pcbnew_cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg ) )
849 m_polarCoords = pcbnew_cfg->m_PolarCoords;
850
851 wxASSERT( GetCanvas() );
852
853 if( GetCanvas() )
854 {
856
857 if( rs )
858 {
861 rs->SetDefaultFont( wxEmptyString ); // Always the KiCad font for PCBs
862 }
863 }
864}
865
866
868{
869 if( aErrorCode >= CLEANUP_FIRST )
870 return RPT_SEVERITY_ACTION;
871
873
874 return bds.m_DRCSeverities[ aErrorCode ];
875}
876
877
879{
881
882 // Some, but not all derived classes have a PCBNEW_SETTINGS.
883 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
884
885 if( cfg )
887}
888
889
894
895
900
901
923
924
926{
927 static MAGNETIC_SETTINGS fallback;
928
930 return &cfg->m_MagneticItems;
931
932 return &fallback;
933}
934
935
937{
939
940 KIGFX::VIEW* view = GetCanvas()->GetView();
941 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( view->GetPainter() );
942 PCB_RENDER_SETTINGS* settings = painter->GetSettings();
943
944 settings->LoadColors( GetColorSettings( true ) );
947
948 if( aFlags & TEXTVARS_CHANGED )
950
951 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible as
952 // they won't be found in the view layer's itemset for re-painting.
954 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
955 {
956 if( dynamic_cast<RATSNEST_VIEW_ITEM*>( aItem ) )
957 {
958 return KIGFX::ALL; // ratsnest display
959 }
960 else if( dynamic_cast<PCB_TRACK*>( aItem ) )
961 {
962 return KIGFX::REPAINT; // track, arc & via clearance display
963 }
964 else if( dynamic_cast<PAD*>( aItem ) )
965 {
966 return KIGFX::REPAINT; // pad clearance display
967 }
968 else if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
969 {
970 if( text->HasTextVars() )
971 {
972 text->ClearRenderCache();
973 text->ClearBoundingBoxCache();
975 }
976 }
977
978 return 0;
979 } );
980
982
984
985 // The 3D viewer isn't in the Kiway, so send its update manually
987
988 if( viewer )
989 viewer->CommonSettingsChanged( aFlags );
990}
991
992
994{
996
999
1000 if( m_isClosing )
1001 return;
1002
1005}
1006
1007
1014
1015
1020
1021
1023{
1025
1026 EDA_DRAW_PANEL_GAL* canvas = GetCanvas();
1027 KIGFX::VIEW* view = canvas->GetView();
1028
1029 if( m_toolManager )
1030 {
1031 m_toolManager->SetEnvironment( m_pcb, view, canvas->GetViewControls(), config(), this );
1032
1033 m_toolManager->ResetTools( TOOL_BASE::GAL_SWITCH );
1034 }
1035
1036 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( view->GetPainter() );
1037 KIGFX::PCB_RENDER_SETTINGS* settings = painter->GetSettings();
1038 const PCB_DISPLAY_OPTIONS& displ_opts = GetDisplayOptions();
1039
1040 settings->LoadDisplayOptions( displ_opts );
1041 settings->LoadColors( GetColorSettings() );
1043
1044 view->RecacheAllItems();
1046 canvas->StartDrawing();
1047
1048 try
1049
1050 {
1051 if( !m_spaceMouse )
1052 {
1053#if defined(__linux__) || defined(__FreeBSD__)
1054 m_spaceMouse = std::make_unique<SPNAV_2D_PLUGIN>( GetCanvas() );
1055 m_spaceMouse->SetScale( 0.01 );
1056#else
1057 m_spaceMouse = std::make_unique<NL_PCBNEW_PLUGIN>( GetCanvas() );
1058#endif
1059 }
1060 }
1061 catch( const std::system_error& e )
1062 {
1063 wxLogTrace( wxT( "KI_TRACE_NAVLIB" ), e.what() );
1064 }
1065}
1066
1067
1068void PCB_BASE_FRAME::SetDisplayOptions( const PCB_DISPLAY_OPTIONS& aOptions, bool aRefresh )
1069{
1070 bool hcChanged = m_displayOptions.m_ContrastModeDisplay != aOptions.m_ContrastModeDisplay;
1071 bool hcVisChanged = m_displayOptions.m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN
1073 m_displayOptions = aOptions;
1074
1075 EDA_DRAW_PANEL_GAL* canvas = GetCanvas();
1076 KIGFX::PCB_VIEW* view = static_cast<KIGFX::PCB_VIEW*>( canvas->GetView() );
1077
1078 view->UpdateDisplayOptions( aOptions );
1079 view->SetMirror( aOptions.m_FlipBoardView, view->IsMirroredY() );
1080 view->RecacheAllItems();
1081
1084
1085 // Vias on a restricted layer set must be redrawn when high contrast mode is changed
1086 if( hcChanged )
1087 {
1088 bool showNetNames = false;
1089
1090 if( PCBNEW_SETTINGS* config = dynamic_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() ) )
1091 showNetNames = config->m_Display.m_NetNames > 0;
1092
1093 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible as
1094 // they won't be found in the view layer's itemset for re-painting.
1096 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1097 {
1098 if( PCB_VIA* via = dynamic_cast<PCB_VIA*>( aItem ) )
1099 {
1100 if( via->GetViaType() != VIATYPE::THROUGH
1101 || via->GetRemoveUnconnected()
1102 || showNetNames )
1103 {
1104 return hcVisChanged ? KIGFX::ALL : KIGFX::REPAINT;
1105 }
1106 }
1107 else if( PAD* pad = dynamic_cast<PAD*>( aItem ) )
1108 {
1109 if( pad->GetRemoveUnconnected()
1110 || showNetNames )
1111 {
1112 return hcVisChanged ? KIGFX::ALL : KIGFX::REPAINT;
1113 }
1114 }
1115
1116 return 0;
1117 } );
1118 }
1119
1120 if( aRefresh )
1121 canvas->Refresh();
1122}
1123
1124
1126{
1127 wxLogTrace( traceLibWatch, "setFPWatcher" );
1128
1129 Unbind( wxEVT_FSWATCHER, &PCB_BASE_FRAME::OnFPChange, this );
1130
1131 if( m_watcher )
1132 {
1133 wxLogTrace( traceLibWatch, "Remove watch" );
1134 m_watcher->RemoveAll();
1135 m_watcher->SetOwner( nullptr );
1136 m_watcher.reset();
1137 }
1138
1139 wxString libfullname;
1141
1142 if( !aFootprint || !adapter )
1143 return;
1144
1145 try
1146 {
1147 std::optional<LIBRARY_TABLE_ROW*> row = adapter->GetRow( aFootprint->GetFPID().GetLibNickname() );
1148
1149 if( !row )
1150 return;
1151
1152 libfullname = LIBRARY_MANAGER::GetFullURI( *row, true );
1153 }
1154 catch( const IO_ERROR& error )
1155 {
1156 wxLogTrace( traceLibWatch, "Error: %s", error.What() );
1157 return;
1158 }
1159 catch( const std::exception& e )
1160 {
1161 DisplayInfoMessage( this, e.what() );
1162 return;
1163 }
1164
1165 m_watcherFileName.Assign( libfullname, aFootprint->GetFPID().GetLibItemName(),
1167
1168 if( !m_watcherFileName.FileExists() )
1169 return;
1170
1171 m_watcherLastModified = m_watcherFileName.GetModificationTime();
1172
1173 Bind( wxEVT_FSWATCHER, &PCB_BASE_FRAME::OnFPChange, this );
1174 m_watcher = std::make_unique<wxFileSystemWatcher>();
1175 m_watcher->SetOwner( this );
1176
1177 wxFileName fn;
1178 fn.AssignDir( m_watcherFileName.GetPath() );
1179 fn.DontFollowLink();
1180
1181 wxLogTrace( traceLibWatch, "Add watch: %s", fn.GetPath() );
1182
1183 {
1184 // Silence OS errors that come from the watcher
1185 wxLogNull silence;
1186 m_watcher->Add( fn );
1187 }
1188}
1189
1190
1191void PCB_BASE_FRAME::OnFPChange( wxFileSystemWatcherEvent& aEvent )
1192{
1193 if( aEvent.GetPath() != m_watcherFileName.GetFullPath() )
1194 return;
1195
1196 // Start the debounce timer (set to 1 second)
1197 if( !m_watcherDebounceTimer.StartOnce( 1000 ) )
1198 {
1199 wxLogTrace( traceLibWatch, "Failed to start the debounce timer" );
1200 return;
1201 }
1202}
1203
1204
1206{
1207 if( aEvent.GetId() != m_watcherDebounceTimer.GetId() )
1208 {
1209 aEvent.Skip();
1210 return;
1211 }
1212
1214 {
1215 wxLogTrace( traceLibWatch, "Restarting debounce timer" );
1216 m_watcherDebounceTimer.StartOnce( 3000 );
1217 }
1218
1219 wxLogTrace( traceLibWatch, "OnFpChangeDebounceTimer" );
1220
1221 // Disable logging to avoid spurious messages and check if the file has changed
1222 wxLog::EnableLogging( false );
1223 wxDateTime lastModified = m_watcherFileName.GetModificationTime();
1224 wxLog::EnableLogging( true );
1225
1226 if( lastModified == m_watcherLastModified || !lastModified.IsValid() )
1227 return;
1228
1229 m_watcherLastModified = lastModified;
1230
1233
1234 // When loading a footprint from a library in the footprint editor
1235 // the items UUIDs must be keep and not reinitialized
1236 bool keepUUID = IsType( FRAME_FOOTPRINT_EDITOR );
1237
1238 if( !fp || !adapter )
1239 return;
1240
1242
1244 || IsOK( this, _( "The library containing the current footprint has changed.\n"
1245 "Do you want to reload the footprint?" ) ) )
1246 {
1247 wxString fpname = fp->GetFPID().GetLibItemName();
1248 wxString nickname = fp->GetFPID().GetLibNickname();
1249
1250 try
1251 {
1252 FOOTPRINT* newfp = adapter->LoadFootprint( nickname, fpname, keepUUID );
1253
1254 if( newfp )
1255 {
1256 std::vector<KIID> selectedItems;
1257
1258 for( const EDA_ITEM* item : GetCurrentSelection() )
1259 selectedItems.emplace_back( item->m_Uuid );
1260
1262
1263 ReloadFootprint( newfp );
1264
1265 newfp->ClearAllNets();
1269
1270 std::vector<EDA_ITEM*> sel;
1271
1272 for( const KIID& uuid : selectedItems )
1273 {
1274 if( BOARD_ITEM* item = GetBoard()->ResolveItem( uuid, true ) )
1275 sel.push_back( item );
1276 }
1277
1278 if( !sel.empty() )
1279 m_toolManager->RunAction( ACTIONS::selectItems, &sel );
1280 }
1281 }
1282 catch( const IO_ERROR& ioe )
1283 {
1284 DisplayError( this, ioe.What() );
1285 }
1286 }
1287
1288 m_inFpChangeTimerEvent = false;
1289}
@ ERROR_INSIDE
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:125
constexpr int ARC_LOW_DEF
Definition base_units.h:140
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:1247
void UpdateUserUnits(BOARD_ITEM *aItem, KIGFX::VIEW *aView)
Update any references within aItem (or its descendants) to the user units.
Definition board.cpp:1715
const LSET & GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
Definition board.cpp:1000
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:203
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
Definition board.h:524
void IncrementTimeStamp()
Definition board.cpp:274
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition board.cpp:1101
void SynchronizeProperties()
Copy the current project's text variables into the boards property cache.
Definition board.cpp:2758
BOARD_ITEM * ResolveItem(const KIID &aID, bool aAllowNullptrReturn=false) const
Definition board.cpp:1798
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:93
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:602
const LIB_ID & GetFPID() const
Definition footprint.h:429
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:405
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:628
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
Definition view.cpp:601
bool HasItem(const VIEW_ITEM *aItem) const
Indicates whether or not the given item has been added to the view.
Definition view.cpp:1814
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:538
void RecacheAllItems()
Rebuild GAL display lists.
Definition view.cpp:1551
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:1685
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:1701
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:422
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:1749
@ CLEANUP_FIRST
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
Definition confirm.cpp:278
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition confirm.cpp:249
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition confirm.cpp:196
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.