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 (C) 1992-2023 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
36#include <3d_viewer/eda_3d_viewer_frame.h> // To include VIEWER3D_FRAMENAME
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>
45#include <fp_lib_table.h>
46#include <kiface_base.h>
47#include <pcb_painter.h>
48#include <pcbnew_id.h>
49#include <pcbnew_settings.h>
50#include <pcb_base_frame.h>
51#include <pcb_draw_panel_gal.h>
52#include <pgm_base.h>
53#include <project_pcb.h>
55#include <zoom_defines.h>
56
57#include <math/vector2d.h>
58#include <math/vector2wx.h>
59#include <widgets/msgpanel.h>
60
63#include <tool/tool_manager.h>
65#include <tools/pcb_actions.h>
66#include <tool/grid_menu.h>
68
70
73
74wxDEFINE_EVENT( EDA_EVT_BOARD_CHANGED, wxCommandEvent );
75
76PCB_BASE_FRAME::PCB_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType,
77 const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize,
78 long aStyle, const wxString& aFrameName ) :
79 EDA_DRAW_FRAME( aKiway, aParent, aFrameType, aTitle, aPos, aSize, aStyle, aFrameName,
80 pcbIUScale ),
81 m_pcb( nullptr ),
82 m_originTransforms( *this ),
83 m_spaceMouse( nullptr )
84{
86}
87
88
90{
91 delete m_spaceMouse;
92 m_spaceMouse = nullptr;
93
94 // Ensure m_canvasType is up to date, to save it in config
95 if( GetCanvas() )
97
98 delete m_pcb;
99 m_pcb = nullptr;
100}
101
102
103bool PCB_BASE_FRAME::canCloseWindow( wxCloseEvent& aEvent )
104{
105 // Close modeless dialogs. They're trouble when they get destroyed after the frame and/or
106 // board.
107 wxWindow* viewer3D = Get3DViewerFrame();
108
109 if( viewer3D )
110 viewer3D->Close( true );
111
112 // Similarly, wxConvBrokenFileNames uses some statically allocated variables that make it
113 // crash when run later from a d'tor.
115
116 return true;
117}
118
119
120void PCB_BASE_FRAME::handleActivateEvent( wxActivateEvent& aEvent )
121{
123
124 if( m_spaceMouse )
125 m_spaceMouse->SetFocus( aEvent.GetActive() );
126}
127
128
129void PCB_BASE_FRAME::handleIconizeEvent( wxIconizeEvent& aEvent )
130{
132
133 if( m_spaceMouse != nullptr && aEvent.IsIconized() )
134 m_spaceMouse->SetFocus( false );
135}
136
137
139{
140 wxWindow* frame = FindWindowByName( QUALIFIED_VIEWER3D_FRAMENAME( this ) );
141 return dynamic_cast<EDA_3D_VIEWER_FRAME*>( frame );
142}
143
144
145void PCB_BASE_FRAME::Update3DView( bool aMarkDirty, bool aRefresh, const wxString* aTitle )
146{
147 EDA_3D_VIEWER_FRAME* draw3DFrame = Get3DViewerFrame();
148
149 if( draw3DFrame )
150 {
151 if( aTitle )
152 draw3DFrame->SetTitle( *aTitle );
153
154 if( aMarkDirty )
155 draw3DFrame->ReloadRequest();
156
157 if( aRefresh )
158 draw3DFrame->Redraw();
159 }
160}
161
162
164{
165 if( m_pcb != aBoard )
166 {
167 delete m_pcb;
168 m_pcb = aBoard;
169
170 if( GetBoard() )
172
173 if( GetBoard() && GetCanvas() )
174 {
176
177 if( rs )
178 {
179 rs->SetDashLengthRatio( GetBoard()->GetPlotOptions().GetDashedLineDashRatio() );
180 rs->SetGapLengthRatio( GetBoard()->GetPlotOptions().GetDashedLineGapRatio() );
181 }
182 }
183
184 wxCommandEvent e( EDA_EVT_BOARD_CHANGED );
185 ProcessEventLocally( e );
186
187 for( wxEvtHandler* listener : m_boardChangeListeners )
188 {
189 wxCHECK2( listener, continue );
190
191 // Use the windows variant when handling event messages in case there is any special
192 // event handler pre and/or post processing specific to windows.
193 wxWindow* win = dynamic_cast<wxWindow*>( listener );
194
195 if( win )
196 win->HandleWindowEvent( e );
197 else
198 listener->SafelyProcessEvent( e );
199 }
200 }
201}
202
203
204void PCB_BASE_FRAME::AddBoardChangeListener( wxEvtHandler* aListener )
205{
206 auto it = std::find( m_boardChangeListeners.begin(), m_boardChangeListeners.end(), aListener );
207
208 // Don't add duplicate listeners.
209 if( it == m_boardChangeListeners.end() )
210 m_boardChangeListeners.push_back( aListener );
211}
212
213
214void PCB_BASE_FRAME::RemoveBoardChangeListener( wxEvtHandler* aListener )
215{
216 auto it = std::find( m_boardChangeListeners.begin(), m_boardChangeListeners.end(), aListener );
217
218 // Don't add duplicate listeners.
219 if( it != m_boardChangeListeners.end() )
220 m_boardChangeListeners.erase( it );
221}
222
223
225{
226 if( aFootprint )
227 {
228 GetBoard()->Add( aFootprint, ADD_MODE::APPEND );
229
230 aFootprint->SetFlags( IS_NEW );
231 aFootprint->SetPosition( VECTOR2I( 0, 0 ) ); // cursor in GAL may not be initialized yet
232
233 // Put it on FRONT layer (note that it might be stored flipped if the lib is an archive
234 // built from a board)
235 if( aFootprint->IsFlipped() )
236 aFootprint->Flip( aFootprint->GetPosition(), GetPcbNewSettings()->m_FlipLeftRight );
237
238 // Place it in orientation 0 even if it is not saved with orientation 0 in lib (note that
239 // it might be stored in another orientation if the lib is an archive built from a board)
240 aFootprint->SetOrientation( ANGLE_0 );
241
242 GetBoard()->UpdateUserUnits( aFootprint, GetCanvas()->GetView() );
243 }
244}
245
246
248{
249 return GetBoard()->GetItem( aId );
250}
251
252
254{
255 std::vector<BOARD_ITEM*> items;
256
257 if( aItem )
258 items.push_back( aItem );
259
260 FocusOnItems( items, aLayer );
261}
262
263
264void PCB_BASE_FRAME::FocusOnItems( std::vector<BOARD_ITEM*> aItems, PCB_LAYER_ID aLayer )
265{
266 static std::vector<KIID> lastBrightenedItemIDs;
267
268 BOARD_ITEM* lastItem = nullptr;
269
270 for( KIID lastBrightenedItemID : lastBrightenedItemIDs )
271 {
274 #if BOOST_VERSION >= 106700
275 try
276 {
277 lastItem = GetBoard()->GetItem( lastBrightenedItemID );
278 }
279 catch( const boost::uuids::entropy_error& )
280 {
281 wxLogError( wxT( "A Boost UUID entropy exception was thrown in %s:%s." ),
282 __FILE__, __FUNCTION__ );
283 }
284 #else
285 lastItem = GetBoard()->GetItem( lastBrightenedItemID );
286 #endif
287
288 if( lastItem && lastItem != DELETED_BOARD_ITEM::GetInstance() )
289 {
290 lastItem->ClearBrightened();
291
292 lastItem->RunOnDescendants(
293 [&]( BOARD_ITEM* child )
294 {
295 child->ClearBrightened();
296 } );
297
298 GetCanvas()->GetView()->Update( lastItem );
299 lastBrightenedItemID = niluuid;
300 GetCanvas()->Refresh();
301 }
302 }
303
304 lastBrightenedItemIDs.clear();
305
306 if( aItems.empty() )
307 return;
308
309 VECTOR2I focusPt;
310 KIGFX::VIEW* view = GetCanvas()->GetView();
311 SHAPE_POLY_SET viewportPoly( view->GetViewport() );
312
313 for( wxWindow* dialog : findDialogs() )
314 {
315 wxPoint dialogPos = GetCanvas()->ScreenToClient( dialog->GetScreenPosition() );
316 SHAPE_POLY_SET dialogPoly( BOX2D( view->ToWorld( ToVECTOR2D( dialogPos ), true ),
317 view->ToWorld( ToVECTOR2D( dialog->GetSize() ), false ) ) );
318
319 try
320 {
321 viewportPoly.BooleanSubtract( dialogPoly, SHAPE_POLY_SET::PM_FAST );
322 }
323 catch( const std::exception& exc )
324 {
325 // This may be overkill and could be an assertion but we are more likely to
326 // find any clipper errors this way.
327 wxLogError( wxT( "Clipper library exception '%s' occurred." ), exc.what() );
328 }
329 }
330
331 SHAPE_POLY_SET itemPoly, clippedPoly;
332
333 for( BOARD_ITEM* item : aItems )
334 {
335 if( item && item != DELETED_BOARD_ITEM::GetInstance() )
336 {
337 item->SetBrightened();
338
339 item->RunOnDescendants(
340 [&]( BOARD_ITEM* child )
341 {
342 child->SetBrightened();
343 });
344
345 GetCanvas()->GetView()->Update( item );
346 lastBrightenedItemIDs.push_back( item->m_Uuid );
347
348 // Focus on the object's location. Prefer a visible part of the object to its anchor
349 // in order to keep from scrolling around.
350
351 focusPt = item->GetPosition();
352
353 if( aLayer == UNDEFINED_LAYER && item->GetLayerSet().any() )
354 aLayer = item->GetLayerSet().Seq()[0];
355
356 switch( item->Type() )
357 {
358 case PCB_FOOTPRINT_T:
359 try
360 {
361 itemPoly = static_cast<FOOTPRINT*>( item )->GetBoundingHull();
362 }
363 catch( const std::exception& exc )
364 {
365 // This may be overkill and could be an assertion but we are more likely to
366 // find any clipper errors this way.
367 wxLogError( wxT( "Clipper library exception '%s' occurred." ), exc.what() );
368 }
369
370 break;
371
372 case PCB_PAD_T:
373 case PCB_MARKER_T:
374 case PCB_VIA_T:
375 FocusOnLocation( item->GetFocusPosition() );
376 GetCanvas()->Refresh();
377 return;
378
379 case PCB_SHAPE_T:
380 case PCB_FIELD_T:
381 case PCB_TEXT_T:
382 case PCB_TEXTBOX_T:
383 case PCB_TRACE_T:
384 case PCB_ARC_T:
386 case PCB_DIM_LEADER_T:
387 case PCB_DIM_CENTER_T:
388 case PCB_DIM_RADIAL_T:
390 item->TransformShapeToPolygon( itemPoly, aLayer, 0, pcbIUScale.mmToIU( 0.1 ),
391 ERROR_INSIDE );
392 break;
393
394 case PCB_ZONE_T:
395 {
396 ZONE* zone = static_cast<ZONE*>( item );
397 #if 0
398 // Using the filled area shapes to find a Focus point can give good results, but
399 // unfortunately the calculations are highly time consuming, even for not very
400 // large areas (can be easily a few minutes for large areas).
401 // so we used only the zone outline that usually do not have too many vertices.
402 zone->TransformShapeToPolygon( itemPoly, aLayer, 0, pcbIUScale.mmToIU( 0.1 ),
403 ERROR_INSIDE );
404
405 if( itemPoly.IsEmpty() )
406 itemPoly = *zone->Outline();
407 #else
408 // much faster calculation time when using only the zone outlines
409 itemPoly = *zone->Outline();
410 #endif
411
412 break;
413 }
414
415 default:
416 {
417 BOX2I item_bbox = item->GetBoundingBox();
418 itemPoly.NewOutline();
419 itemPoly.Append( item_bbox.GetOrigin() );
420 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( item_bbox.GetWidth(), 0 ) );
421 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( 0, item_bbox.GetHeight() ) );
422 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( item_bbox.GetWidth(),
423 item_bbox.GetHeight() ) );
424 break;
425 }
426 }
427
428 try
429 {
430 clippedPoly.BooleanIntersection( itemPoly, viewportPoly, SHAPE_POLY_SET::PM_FAST );
431 }
432 catch( const std::exception& exc )
433 {
434 // This may be overkill and could be an assertion but we are more likely to
435 // find any clipper errors this way.
436 wxLogError( wxT( "Clipper library exception '%s' occurred." ), exc.what() );
437 }
438
439 if( !clippedPoly.IsEmpty() )
440 itemPoly = clippedPoly;
441 }
442 }
443
444 /*
445 * Perform a step-wise deflate to find the visual-center-of-mass
446 */
447
448 BOX2I bbox = itemPoly.BBox();
449 int step = std::min( bbox.GetWidth(), bbox.GetHeight() ) / 10;
450
451 while( !itemPoly.IsEmpty() )
452 {
453 focusPt = itemPoly.BBox().Centre();
454
455 try
456 {
457 itemPoly.Deflate( step, CORNER_STRATEGY::ALLOW_ACUTE_CORNERS, ARC_LOW_DEF );
458 }
459 catch( const std::exception& exc )
460 {
461 // This may be overkill and could be an assertion but we are more likely to
462 // find any clipper errors this way.
463 wxLogError( wxT( "Clipper library exception '%s' occurred." ), exc.what() );
464 }
465 }
466
467 FocusOnLocation( focusPt );
468
469 GetCanvas()->Refresh();
470}
471
472
474{
475 KIGFX::PCB_VIEW* view = GetCanvas()->GetView();
476
477 if( view && GetBoard()->m_SolderMaskBridges && view->HasItem( GetBoard()->m_SolderMaskBridges ) )
478 view->Remove( GetBoard()->m_SolderMaskBridges );
479}
480
481
483{
484 KIGFX::PCB_VIEW* view = GetCanvas()->GetView();
485
486 if( view && GetBoard()->m_SolderMaskBridges )
487 {
488 if( view->HasItem( GetBoard()->m_SolderMaskBridges ) )
489 view->Remove( GetBoard()->m_SolderMaskBridges );
490
491 view->Add( GetBoard()->m_SolderMaskBridges );
492 }
493}
494
495
496void PCB_BASE_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
497{
498 m_pcb->SetPageSettings( aPageSettings );
499
500 if( GetScreen() )
502}
503
504
506{
507 return m_pcb->GetPageSettings();
508}
509
510
512{
513 // this function is only needed because EDA_DRAW_FRAME is not compiled
514 // with either -DPCBNEW or -DEESCHEMA, so the virtual is used to route
515 // into an application specific source file.
517}
518
519
521{
523}
524
525
527{
529}
530
531
533{
535}
536
537
539{
540 VECTOR2I origin( 0, 0 );
541
542 switch( GetPcbNewSettings()->m_Display.m_DisplayOrigin )
543 {
544 case PCB_DISPLAY_ORIGIN::PCB_ORIGIN_PAGE: break;
545 case PCB_DISPLAY_ORIGIN::PCB_ORIGIN_AUX: origin = GetAuxOrigin(); break;
546 case PCB_DISPLAY_ORIGIN::PCB_ORIGIN_GRID: origin = GetGridOrigin(); break;
547 default: wxASSERT( false ); break;
548 }
549
550 return origin;
551}
552
554{
555 return m_originTransforms;
556}
557
558
560{
561 return m_pcb->GetTitleBlock();
562}
563
564
566{
567 m_pcb->SetTitleBlock( aTitleBlock );
568}
569
570
572{
573 return m_pcb->GetDesignSettings();
574}
575
576
578{
579 m_drawBgColor= aColor;
580 m_auimgr.Update();
581}
582
583
585{
586 return m_pcb->GetPlotOptions();
587}
588
589
591{
592 m_pcb->SetPlotOptions( aSettings );
593
594 // Plot Settings can also change the "tent vias" setting, which can affect the solder mask.
595 LSET visibleLayers = GetBoard()->GetVisibleLayers();
596
597 if( visibleLayers.test( F_Mask ) || visibleLayers.test( B_Mask ) )
598 {
600 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
601 {
602 BOARD_ITEM* item = dynamic_cast<BOARD_ITEM*>( aItem );
603
604 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to
605 // visible as they won't be found in the view layer's itemset for re-painting.
606 if( item && item->Type() == PCB_VIA_T )
607 return KIGFX::ALL;
608
609 return 0;
610 } );
611
612 GetCanvas()->Refresh();
613 }
614}
615
616
617BOX2I PCB_BASE_FRAME::GetBoardBoundingBox( bool aBoardEdgesOnly ) const
618{
619 BOX2I area = aBoardEdgesOnly ? m_pcb->GetBoardEdgesBoundingBox() : m_pcb->GetBoundingBox();
620
621 if( area.GetWidth() == 0 && area.GetHeight() == 0 )
622 {
623 VECTOR2I pageSize = GetPageSizeIU();
624
626 {
627 area.SetOrigin( 0, 0 );
628 area.SetEnd( pageSize.x, pageSize.y );
629 }
630 else
631 {
632 area.SetOrigin( -pageSize.x / 2, -pageSize.y / 2 );
633 area.SetEnd( pageSize.x / 2, pageSize.y / 2 );
634 }
635 }
636
637 return area;
638}
639
640
641// Virtual function
643{
644}
645
646
648{
649 // call my base class
651
652 // tooltips in toolbars
654
656
657 if( viewer3D )
658 viewer3D->ShowChangedLanguage();
659}
660
661
663{
664 EDA_3D_VIEWER_FRAME* draw3DFrame = Get3DViewerFrame();
665
666 if( !draw3DFrame )
667 draw3DFrame = new EDA_3D_VIEWER_FRAME( &Kiway(), this, _( "3D Viewer" ) );
668
669 // Raising the window does not show the window on Windows if iconized. This should work
670 // on any platform.
671 if( draw3DFrame->IsIconized() )
672 draw3DFrame->Iconize( false );
673
674 draw3DFrame->Raise();
675 draw3DFrame->Show( true );
676
677 // Raising the window does not set the focus on Linux. This should work on any platform.
678 if( wxWindow::FindFocus() != draw3DFrame )
679 draw3DFrame->SetFocus();
680
681 // Allocate a slice of time to display the 3D frame
682 // a call to wxSafeYield() should be enough (and better), but on Linux we need
683 // to call wxYield()
684 // otherwise the activity messages are not displayed during the first board loading
685 wxYield();
686
687 // Note, the caller is responsible to load/update the board 3D view.
688 // after frame creation the board is not automatically created.
689
690 return draw3DFrame;
691}
692
693
695{
696 PCB_LAYER_ID preslayer = GetActiveLayer();
697 auto& displ_opts = GetDisplayOptions();
698
699 // Check if the specified layer matches the present layer
700 if( layer == preslayer )
701 return;
702
703 // Copper layers cannot be selected unconditionally; how many of those layers are
704 // currently enabled needs to be checked.
705 if( IsCopperLayer( layer ) )
706 {
707 // If only one copper layer is enabled, the only such layer that can be selected to
708 // is the "Copper" layer (so the selection of any other copper layer is disregarded).
709 if( m_pcb->GetCopperLayerCount() < 2 )
710 {
711 if( layer != B_Cu )
712 return;
713 }
714
715 // If more than one copper layer is enabled, the "Copper" and "Component" layers
716 // can be selected, but the total number of copper layers determines which internal
717 // layers are also capable of being selected.
718 else
719 {
720 if( layer != B_Cu && layer != F_Cu && layer >= ( m_pcb->GetCopperLayerCount() - 1 ) )
721 return;
722 }
723 }
724
725 // Is yet more checking required? E.g. when the layer to be selected is a non-copper
726 // layer, or when switching between a copper layer and a non-copper layer, or vice-versa?
727 // ...
728
729 SetActiveLayer( layer );
730
731 if( displ_opts.m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL )
732 GetCanvas()->Refresh();
733}
734
735
737{
739 GetCanvas()->GetView() );
740
741 // account for the globals
756
757 return guide;
758}
759
760
762{
764
765 BASE_SCREEN* screen = GetScreen();
766
767 if( !screen )
768 return;
769
770 wxString line;
772
773 if( GetShowPolarCoords() ) // display polar coordinates
774 {
775 double dx = cursorPos.x - screen->m_LocalOrigin.x;
776 double dy = cursorPos.y - screen->m_LocalOrigin.y;
777 double theta = RAD2DEG( atan2( -dy, dx ) );
778 double ro = hypot( dx, dy );
779
780 line.Printf( wxT( "r %s theta %.3f" ),
781 MessageTextFromValue( ro, false ),
782 theta );
783
784 SetStatusText( line, 3 );
785 }
786
787 // Transform absolute coordinates for user origin preferences
788 double userXpos = m_originTransforms.ToDisplayAbsX( static_cast<double>( cursorPos.x ) );
789 double userYpos = m_originTransforms.ToDisplayAbsY( static_cast<double>( cursorPos.y ) );
790
791 // Display absolute coordinates:
792 line.Printf( wxT( "X %s Y %s" ),
793 MessageTextFromValue( userXpos, false ),
794 MessageTextFromValue( userYpos, false ) );
795 SetStatusText( line, 2 );
796
797 if( !GetShowPolarCoords() ) // display relative cartesian coordinates
798 {
799 // Calculate relative coordinates
800 double relXpos = cursorPos.x - screen->m_LocalOrigin.x;
801 double relYpos = cursorPos.y - screen->m_LocalOrigin.y;
802
803 // Transform relative coordinates for user origin preferences
804 userXpos = m_originTransforms.ToDisplayRelX( relXpos );
805 userYpos = m_originTransforms.ToDisplayRelY( relYpos );
806
807 line.Printf( wxT( "dx %s dy %s dist %s" ),
808 MessageTextFromValue( userXpos, false ),
809 MessageTextFromValue( userYpos, false ),
810 MessageTextFromValue( hypot( userXpos, userYpos ), false ) );
811 SetStatusText( line, 3 );
812 }
813
815}
816
817
819{
820 EDA_DRAW_FRAME::unitsChangeRefresh(); // Update the status bar.
821
822 if( GetBoard() )
824
826}
827
828
830{
832
833 if( aCfg->m_Window.grid.grids.empty() )
834 aCfg->m_Window.grid.grids = aCfg->DefaultGridSizeList();
835
836 // Move legacy user grids to grid list
837 if( !aCfg->m_Window.grid.user_grid_x.empty() )
838 {
839 aCfg->m_Window.grid.grids.emplace_back( GRID{ "User Grid", aCfg->m_Window.grid.user_grid_x,
840 aCfg->m_Window.grid.user_grid_y } );
841 aCfg->m_Window.grid.user_grid_x = wxEmptyString;
842 aCfg->m_Window.grid.user_grid_y = wxEmptyString;
843 }
844
845 // Currently values read from config file are not used because the user cannot
846 // change this config
847 // if( aCfg->m_Window.zoom_factors.empty() )
848 {
849 if( ADVANCED_CFG::GetCfg().m_HyperZoom )
851 else
853 }
854
855 // Some, but not all, derived classes have a PCBNEW_SETTINGS.
856 if( PCBNEW_SETTINGS* pcbnew_cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg ) )
857 m_polarCoords = pcbnew_cfg->m_PolarCoords;
858
859 wxASSERT( GetCanvas() );
860
861 if( GetCanvas() )
862 {
864
865 if( rs )
866 {
869 rs->SetDefaultFont( wxEmptyString ); // Always the KiCad font for PCBs
870 }
871 }
872}
873
874
876{
877 if( aErrorCode >= CLEANUP_FIRST )
878 return RPT_SEVERITY_ACTION;
879
881
882 return bds.m_DRCSeverities[ aErrorCode ];
883}
884
885
887{
889
890 // Some, but not all derived classes have a PCBNEW_SETTINGS.
891 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
892
893 if( cfg )
895}
896
897
899{
901}
902
903
905{
907}
908
909
911{
912 switch( GetFrameType() )
913 {
914 case FRAME_PCB_EDITOR:
916 default:
918
922
926 case FRAME_CVPCB:
929 }
930}
931
932
934{
936}
937
938
939void PCB_BASE_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
940{
941 EDA_DRAW_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
942
943 KIGFX::VIEW* view = GetCanvas()->GetView();
944 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( view->GetPainter() );
945 PCB_RENDER_SETTINGS* settings = painter->GetSettings();
946
947 settings->LoadColors( GetColorSettings( true ) );
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
969 return 0;
970 } );
971
973
975
976 // The 3D viewer isn't in the Kiway, so send its update manually
978
979 if( viewer )
980 viewer->CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
981}
982
983
985{
987
989 m_autoSaveRequired = true;
990
992
995}
996
997
999{
1003}
1004
1005
1007{
1008 return static_cast<PCB_DRAW_PANEL_GAL*>( EDA_DRAW_FRAME::GetCanvas() );
1009}
1010
1011
1013{
1015
1016 EDA_DRAW_PANEL_GAL* canvas = GetCanvas();
1017 KIGFX::VIEW* view = canvas->GetView();
1018
1019 if( m_toolManager )
1020 {
1021 m_toolManager->SetEnvironment( m_pcb, view, canvas->GetViewControls(), config(), this );
1022
1024 }
1025
1026 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( view->GetPainter() );
1027 KIGFX::PCB_RENDER_SETTINGS* settings = painter->GetSettings();
1028 const PCB_DISPLAY_OPTIONS& displ_opts = GetDisplayOptions();
1029
1030 settings->LoadDisplayOptions( displ_opts );
1031 settings->LoadColors( GetColorSettings() );
1033
1034 view->RecacheAllItems();
1036 canvas->StartDrawing();
1037
1038 try
1039
1040 {
1041 if( m_spaceMouse == nullptr )
1042 {
1044 }
1045 }
1046 catch( const std::system_error& e )
1047 {
1048 wxLogTrace( wxT( "KI_TRACE_NAVLIB" ), e.what() );
1049 }
1050}
1051
1052
1053void PCB_BASE_FRAME::SetDisplayOptions( const PCB_DISPLAY_OPTIONS& aOptions, bool aRefresh )
1054{
1056 bool hcVisChanged = m_displayOptions.m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN
1057 || aOptions.m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN;
1058 m_displayOptions = aOptions;
1059
1060 EDA_DRAW_PANEL_GAL* canvas = GetCanvas();
1061 KIGFX::PCB_VIEW* view = static_cast<KIGFX::PCB_VIEW*>( canvas->GetView() );
1062
1063 view->UpdateDisplayOptions( aOptions );
1066
1067 // Vias on a restricted layer set must be redrawn when high contrast mode is changed
1068 if( hcChanged )
1069 {
1070 bool showNetNames = false;
1071
1072 if( PCBNEW_SETTINGS* config = dynamic_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() ) )
1073 showNetNames = config->m_Display.m_NetNames > 0;
1074
1075 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible as
1076 // they won't be found in the view layer's itemset for re-painting.
1078 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1079 {
1080 if( PCB_VIA* via = dynamic_cast<PCB_VIA*>( aItem ) )
1081 {
1082 if( via->GetViaType() == VIATYPE::BLIND_BURIED
1083 || via->GetViaType() == VIATYPE::MICROVIA
1084 || via->GetRemoveUnconnected()
1085 || showNetNames )
1086 {
1087 return hcVisChanged ? KIGFX::ALL : KIGFX::REPAINT;
1088 }
1089 }
1090 else if( PAD* pad = dynamic_cast<PAD*>( aItem ) )
1091 {
1092 if( pad->GetRemoveUnconnected()
1093 || showNetNames )
1094 {
1095 return hcVisChanged ? KIGFX::ALL : KIGFX::REPAINT;
1096 }
1097 }
1098
1099 return 0;
1100 } );
1101 }
1102
1103 if( aRefresh )
1104 canvas->Refresh();
1105}
1106
1107
1109{
1110 wxLogTrace( "KICAD_LIB_WATCH", "setFPWatcher" );
1111
1112 Unbind( wxEVT_FSWATCHER, &PCB_BASE_FRAME::OnFPChange, this );
1113
1114 if( m_watcher )
1115 {
1116 wxLogTrace( "KICAD_LIB_WATCH", "Remove watch" );
1117 m_watcher->RemoveAll();
1118 m_watcher->SetOwner( nullptr );
1119 m_watcher.reset();
1120 }
1121
1122 wxString libfullname;
1124
1125 if( !aFootprint || !tbl )
1126 return;
1127
1128 try
1129 {
1130 const FP_LIB_TABLE_ROW* row = tbl->FindRow( aFootprint->GetFPID().GetLibNickname() );
1131
1132 if( !row )
1133 return;
1134
1135 libfullname = row->GetFullURI( true );
1136 }
1137 catch( const std::exception& e )
1138 {
1139 DisplayInfoMessage( this, e.what() );
1140 return;
1141 }
1142 catch( const IO_ERROR& error )
1143 {
1144 wxLogTrace( "KICAD_LIB_WATCH", "Error: %s", error.What() );
1145 return;
1146 }
1147
1148 m_watcherFileName.Assign( libfullname, aFootprint->GetFPID().GetLibItemName(),
1150
1151 if( !m_watcherFileName.FileExists() )
1152 return;
1153
1154 m_watcherLastModified = m_watcherFileName.GetModificationTime();
1155
1156 Bind( wxEVT_FSWATCHER, &PCB_BASE_FRAME::OnFPChange, this );
1157 m_watcher = std::make_unique<wxFileSystemWatcher>();
1158 m_watcher->SetOwner( this );
1159
1160 wxFileName fn;
1161 fn.AssignDir( m_watcherFileName.GetPath() );
1162 fn.DontFollowLink();
1163
1164 wxLogTrace( "KICAD_LIB_WATCH", "Add watch: %s", fn.GetPath() );
1165
1166 m_watcher->AddTree( fn );
1167}
1168
1169
1170void PCB_BASE_FRAME::OnFPChange( wxFileSystemWatcherEvent& aEvent )
1171{
1172 if( aEvent.GetPath() != m_watcherFileName.GetFullPath() )
1173 return;
1174
1175 // Start the debounce timer (set to 1 second)
1176 if( !m_watcherDebounceTimer.StartOnce( 1000 ) )
1177 {
1178 wxLogTrace( "KICAD_LIB_WATCH", "Failed to start the debounce timer" );
1179 return;
1180 }
1181}
1182
1183
1185{
1186 wxLogTrace( "KICAD_LIB_WATCH", "OnFpChangeDebounceTimer" );
1187
1188 // Disable logging to avoid spurious messages and check if the file has changed
1189 wxLog::EnableLogging( false );
1190 wxDateTime lastModified = m_watcherFileName.GetModificationTime();
1191 wxLog::EnableLogging( true );
1192
1193 if( lastModified == m_watcherLastModified || !lastModified.IsValid() )
1194 return;
1195
1196 m_watcherLastModified = lastModified;
1197
1200
1201 // When loading a footprint from a library in the footprint editor
1202 // the items UUIDs must be keep and not reinitialized
1203 bool keepUUID = IsType( FRAME_FOOTPRINT_EDITOR );
1204
1205 if( !fp || !tbl )
1206 return;
1207
1209 || IsOK( this, _( "The library containing the current footprint has changed.\n"
1210 "Do you want to reload the footprint?" ) ) )
1211 {
1212 wxString fpname = fp->GetFPID().GetLibItemName();
1213 wxString nickname = fp->GetFPID().GetLibNickname();
1214
1215 try
1216 {
1217 FOOTPRINT* newfp = tbl->FootprintLoad( nickname, fpname, keepUUID );
1218
1219 if( newfp )
1220 {
1221 std::vector<KIID> selectedItems;
1222
1223 for( const EDA_ITEM* item : GetCurrentSelection() )
1224 {
1225 wxString uuidStr = item->m_Uuid.AsString();
1226 selectedItems.emplace_back( item->m_Uuid );
1227 }
1228
1230
1231 ReloadFootprint( newfp );
1232
1233 newfp->ClearAllNets();
1237
1238 std::vector<EDA_ITEM*> sel;
1239
1240 for( const KIID& uuid : selectedItems )
1241 {
1242 BOARD_ITEM* item = GetBoard()->GetItem( uuid );
1243
1244 if( item != DELETED_BOARD_ITEM::GetInstance() )
1245 sel.push_back( item );
1246 }
1247
1248 if( !sel.empty() )
1250 }
1251 }
1252 catch( const IO_ERROR& ioe )
1253 {
1254 DisplayError( this, ioe.What() );
1255 }
1256 }
1257}
constexpr EDA_IU_SCALE pcbIUScale
Definition: base_units.h:108
constexpr int ARC_LOW_DEF
Definition: base_units.h:119
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
BOX2< VECTOR2D > BOX2D
Definition: box2.h:888
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:92
WINDOW_SETTINGS m_Window
Definition: app_settings.h:170
const std::vector< GRID > DefaultGridSizeList() const
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)
Definition: base_screen.cpp:46
Container for design settings for a BOARD object.
std::map< int, SEVERITY > m_DRCSeverities
void SetGridOrigin(const VECTOR2I &aOrigin)
const VECTOR2I & GetGridOrigin()
const VECTOR2I & GetAuxOrigin()
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition: board_item.h:77
virtual void RunOnDescendants(const std::function< void(BOARD_ITEM *)> &aFunction, int aDepth=0) const
Invoke a function on all descendants.
Definition: board_item.h:201
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:282
void SetPlotOptions(const PCB_PLOT_PARAMS &aOptions)
Definition: board.h:675
LSET GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
Definition: board.cpp:694
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
Definition: board.cpp:882
const BOX2I GetBoardEdgesBoundingBox() const
Return the board bounding box calculated using exclusively the board edges (graphics on Edge....
Definition: board.h:911
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
Definition: board.h:897
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Test whether a given element category is visible.
Definition: board.cpp:746
const PAGE_INFO & GetPageSettings() const
Definition: board.h:671
void UpdateUserUnits(BOARD_ITEM *aItem, KIGFX::VIEW *aView)
Update any references within aItem (or its descendants) to the user units.
Definition: board.cpp:1213
BOARD_ITEM * GetItem(const KIID &aID) const
Definition: board.cpp:1293
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:180
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
Definition: board.h:433
TITLE_BLOCK & GetTitleBlock()
Definition: board.h:677
int GetCopperLayerCount() const
Definition: board.cpp:656
void IncrementTimeStamp()
Definition: board.cpp:249
void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition: board.h:672
const PCB_PLOT_PARAMS & GetPlotOptions() const
Definition: board.h:674
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:797
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
Definition: board.h:679
void SetUserUnits(EDA_UNITS aUnits)
Definition: board.h:684
void SetOrigin(const Vec &pos)
Definition: box2.h:227
const Vec & GetOrigin() const
Definition: box2.h:200
size_type GetHeight() const
Definition: box2.h:205
size_type GetWidth() const
Definition: box2.h:204
Vec Centre() const
Definition: box2.h:87
void SetEnd(coord_type x, coord_type y)
Definition: box2.h:280
static DELETED_BOARD_ITEM * GetInstance()
Definition: board_item.h:427
Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard.
void ShowChangedLanguage() override
void ReloadRequest()
Request reloading the 3D view.
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification that common settings are updated.
FRAME_T GetFrameType() const
virtual APP_SETTINGS_BASE * config() const
Returns 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.
bool IsType(FRAME_T aType) const
The base class for create windows for drawing purpose.
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
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.
void FocusOnLocation(const VECTOR2I &aPos)
Useful to focus on a particular location, in find functions.
void RecreateToolbars()
Rebuild all toolbars, and update the checked state of check tools.
COLOR4D m_drawBgColor
virtual void handleActivateEvent(wxActivateEvent &aEvent)
Handle a window activation event.
virtual void UpdateMsgPanel()
Redraw the message panel.
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 ...
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
std::vector< wxWindow * > findDialogs()
virtual void DisplayGridMsg()
Display current grid size in the status bar.
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:88
void SetFlags(EDA_ITEM_FLAGS aMask)
Definition: eda_item.h:126
const KIID m_Uuid
Definition: eda_item.h:485
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:100
void ClearBrightened()
Definition: eda_item.h:122
void SetBrightened()
Definition: eda_item.h:119
static const TOOL_EVENT ConnectivityChangedEvent
Selected item had a property changed (except movement)
Definition: actions.h:264
void SetPosition(const VECTOR2I &aPos) override
Definition: footprint.cpp:2297
void SetOrientation(const EDA_ANGLE &aNewAngle)
Definition: footprint.cpp:2369
bool IsFlipped() const
Definition: footprint.h:377
const LIB_ID & GetFPID() const
Definition: footprint.h:233
void ClearAllNets()
Clear (i.e.
Definition: footprint.cpp:959
void Flip(const VECTOR2I &aCentre, bool aFlipLeftRight) override
Flip this object, i.e.
Definition: footprint.cpp:2238
VECTOR2I GetPosition() const override
Definition: footprint.h:209
Hold a record identifying a library accessed by the appropriate footprint library #PLUGIN object in t...
Definition: fp_lib_table.h:42
const FP_LIB_TABLE_ROW * FindRow(const wxString &aNickName, bool aCheckIfEnabled=false)
Return an FP_LIB_TABLE_ROW if aNickName is found in this table or in any chained fall back table frag...
FOOTPRINT * FootprintLoad(const wxString &aNickname, const wxString &aFootprintName, bool aKeepUUID=false)
Load a footprint having aFootprintName from the library given by aNickname.
A general implementation of a COLLECTORS_GUIDE.
Definition: collectors.h:323
void SetIgnoreBlindBuriedVias(bool ignore)
Definition: collectors.h:469
void SetIgnoreTracks(bool ignore)
Definition: collectors.h:475
void SetIgnoreMTextsMarkedNoShow(bool ignore)
Definition: collectors.h:409
void SetIgnoreModulesOnFront(bool ignore)
Definition: collectors.h:433
void SetIgnoreModulesRefs(bool ignore)
Definition: collectors.h:463
void SetIgnoreMicroVias(bool ignore)
Definition: collectors.h:472
void SetIgnorePadsOnBack(bool ignore)
Definition: collectors.h:439
void SetIgnoreModulesOnBack(bool ignore)
Definition: collectors.h:427
void SetIgnoreModulesVals(bool ignore)
Definition: collectors.h:457
void SetIgnoreThroughVias(bool ignore)
Definition: collectors.h:466
void SetIgnoreThroughHolePads(bool ignore)
Definition: collectors.h:451
void SetIgnoreMTextsOnFront(bool ignore)
Definition: collectors.h:421
void SetIgnoreMTextsOnBack(bool ignore)
Definition: collectors.h:415
void SetIgnorePadsOnFront(bool ignore)
Definition: collectors.h:445
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
Definition: ki_exception.h:77
virtual const wxString What() const
A composite of Problem() and Where()
Definition: exceptions.cpp:30
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
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.
Definition: pcb_painter.h:164
virtual PCB_RENDER_SETTINGS * GetSettings() override
Return a pointer to current settings that are going to be used when drawing items.
Definition: pcb_painter.h:169
PCB specific render settings.
Definition: pcb_painter.h:77
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:75
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:66
void UpdateDisplayOptions(const PCB_DISPLAY_OPTIONS &aOptions)
Definition: pcb_view.cpp:103
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:84
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
Definition: view.cpp:512
bool HasItem(const VIEW_ITEM *aItem) const
Indicates whether or not the given item has been added to the view.
Definition: view.cpp:1617
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:449
void RecacheAllItems()
Rebuild GAL display lists.
Definition: view.cpp:1410
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1513
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:215
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:1523
Definition: kiid.h:49
wxString AsString() const
Definition: kiid.cpp:257
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:279
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
const wxString GetFullURI(bool aSubstituted=false) const
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
LSET is a set of PCB_LAYER_IDs.
Definition: layer_ids.h:575
The class that implements the public interface to the SpaceMouse plug-in.
void SetFocus(bool aFocus)
Set the connection to the 3Dconnexion driver to the focus state so that 3DMouse data is routed to thi...
A class to perform either relative or absolute display origin transforms for a single axis of a point...
Definition: pad.h:59
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:59
const VECTOR2D GetSizeIU(double aIUScale) const
Gets the page size in internal units.
Definition: page_info.h:171
DISPLAY_OPTIONS m_Display
MAGNETIC_SETTINGS m_MagneticItems
static TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
Definition: pcb_actions.h:76
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 FocusOnItems(std::vector< BOARD_ITEM * > aItems, PCB_LAYER_ID aLayer=UNDEFINED_LAYER)
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.
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 RemoveBoardChangeListener(wxEvtHandler *aListener)
Remove aListener to from the board changed listener list.
void handleActivateEvent(wxActivateEvent &aEvent) override
Handle a window activation event.
void setFPWatcher(FOOTPRINT *aFootprint)
Creates (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 ...
EDA_ITEM * GetItem(const KIID &aId) const override
Fetch an item by KIID.
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.
virtual PCB_LAYER_ID GetActiveLayer() const
PCB_BASE_FRAME(KIWAY *aKiway, wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName)
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()
std::vector< wxEvtHandler * > m_boardChangeListeners
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.
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).
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 void SetPageSettings(const PAGE_INFO &aPageSettings) override
NL_PCBNEW_PLUGIN * m_spaceMouse
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
Returns the BOARD_DESIGN_SETTINGS for the open project.
virtual void ShowChangedLanguage() override
Redraw the menus and what not in current language.
void AddBoardChangeListener(wxEvtHandler *aListener)
Add aListener to post #EDA_EVT_BOARD_CHANGED command events to.
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)
Updates the current display options from the given options struct.
GENERAL_COLLECTORS_GUIDE GetCollectorsGuide()
virtual void SetPlotSettings(const PCB_PLOT_PARAMS &aSettings)
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()
Shows the 3D view frame.
wxTimer m_watcherDebounceTimer
EDA_3D_VIEWER_FRAME * Get3DViewerFrame()
virtual void SetActiveLayer(PCB_LAYER_ID aLayer)
virtual COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Helper to retrieve the current color settings.
wxFileName m_watcherFileName
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
virtual void Update3DView(bool aMarkDirty, bool aRefresh, const wxString *aTitle=nullptr)
Update the 3D view, if the viewer is opened by this frame.
void FocusOnItem(BOARD_ITEM *aItem, PCB_LAYER_ID aLayer=UNDEFINED_LAYER)
void rebuildConnectivity()
virtual void UpdateStatusBar() override
Update the status bar information.
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.
T ToDisplayRelY(T aInternalValue) const
T ToDisplayAbsX(T aInternalValue) const
T ToDisplayRelX(T aInternalValue) const
Transform a 2-D coordinate point referenced to the internal origin to the equivalent point referenced...
T ToDisplayAbsY(T aInternalValue) const
Parameters and options when plotting/printing a board.
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:142
A progress reporter interface for use in multi-threaded environments.
static FP_LIB_TABLE * PcbFootprintLibs(PROJECT *aProject)
Return the table of footprint libraries without Kiway.
Definition: project_pcb.cpp:37
static void Cleanup3DCache(PROJECT *aProject)
T * GetAppSettings()
Returns a handle to the a given settings by type If the settings have already been loaded,...
Represent a set of closed polygons.
void BooleanSubtract(const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
Perform boolean polyset difference For aFastMode meaning, see function booleanOp.
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
void BooleanIntersection(const SHAPE_POLY_SET &b, POLYGON_MODE aFastMode)
Perform boolean polyset intersection For aFastMode meaning, see function booleanOp.
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)
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
Definition: tools_holder.h:167
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:169
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
virtual SELECTION & GetCurrentSelection()
Get the current selection from the canvas area.
Definition: tools_holder.h:98
@ 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.
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
Definition: tool_manager.h:145
void ResetTools(TOOL_BASE::RESET_REASON aReason)
Reset all tools (i.e.
void SetEnvironment(EDA_ITEM *aModel, KIGFX::VIEW *aView, KIGFX::VIEW_CONTROLS *aViewControls, APP_SETTINGS_BASE *aSettings, TOOLS_HOLDER *aFrame)
Set the work environment (model, view, view controls and the parent window).
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:72
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:1353
@ CLEANUP_FIRST
Definition: cleanup_item.h:33
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
Definition: confirm.cpp:360
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:280
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:332
This file is part of the common library.
#define _(s)
Declaration of the eda_3d_viewer class.
static constexpr EDA_ANGLE ANGLE_0
Definition: eda_angle.h:435
#define QUALIFIED_VIEWER3D_FRAMENAME(parent)
#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
@ ERROR_INSIDE
static const std::string KiCadFootprintFileExtension
KIID niluuid(0)
bool IsCopperLayer(int aLayerId)
Tests whether a layer is a copper layer.
Definition: layer_ids.h:881
@ LAYER_FOOTPRINTS_FR
show footprints on front
Definition: layer_ids.h:212
@ LAYER_FP_REFERENCES
show footprints references (when texts are visible)
Definition: layer_ids.h:215
@ LAYER_HIDDEN_TEXT
text marked as invisible
Definition: layer_ids.h:204
@ LAYER_TRACKS
Definition: layer_ids.h:216
@ LAYER_FP_TEXT
Definition: layer_ids.h:202
@ LAYER_FOOTPRINTS_BK
show footprints on back
Definition: layer_ids.h:213
@ LAYER_PADS_SMD_BK
smd pads, back layer
Definition: layer_ids.h:207
@ LAYER_PADS_TH
multilayer pads, usually with holes
Definition: layer_ids.h:217
@ LAYER_PADS_SMD_FR
smd pads, front layer
Definition: layer_ids.h:206
@ LAYER_FP_VALUES
show footprints values (when texts are visible)
Definition: layer_ids.h:214
@ LAYER_VIAS
Meta control for all vias opacity/visibility.
Definition: layer_ids.h:197
PCB_LAYER_ID
A quick note on layer IDs:
Definition: layer_ids.h:60
@ B_Mask
Definition: layer_ids.h:106
@ B_Cu
Definition: layer_ids.h:95
@ F_Mask
Definition: layer_ids.h:107
@ UNDEFINED_LAYER
Definition: layer_ids.h:61
@ F_Cu
Definition: layer_ids.h:64
Message panel definition file.
@ COLOR
Color has changed.
Definition: view_item.h:53
@ REPAINT
Item needs to be redrawn.
Definition: view_item.h:57
@ ALL
All except INITIAL_ADD.
Definition: view_item.h:58
Declaration of the NL_PCBNEW_PLUGIN class.
wxDEFINE_EVENT(EDA_EVT_BOARD_CHANGED, wxCommandEvent)
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1059
see class PGM_BASE
SEVERITY
@ RPT_SEVERITY_ACTION
KIWAY Kiway(KFCTL_STANDALONE)
float highlight_factor
How much to brighten highlighted objects by.
Definition: app_settings.h:110
float select_factor
How much to brighten selected objects by.
Definition: app_settings.h:111
const double IU_PER_MILS
Definition: base_units.h:77
constexpr int mmToIU(double mm) const
Definition: base_units.h:88
wxString user_grid_x
Definition: grid_settings.h:67
std::vector< GRID > grids
Definition: grid_settings.h:66
wxString user_grid_y
Definition: grid_settings.h:68
Common grid settings, available to every frame.
Definition: grid_settings.h:34
GRID_SETTINGS grid
Definition: app_settings.h:81
std::vector< double > zoom_factors
Definition: app_settings.h:78
double RAD2DEG(double rad)
Definition: trigo.h:201
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition: typeinfo.h:88
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition: typeinfo.h:105
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition: typeinfo.h:102
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
Definition: typeinfo.h:97
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition: typeinfo.h:103
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition: typeinfo.h:93
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition: typeinfo.h:107
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition: typeinfo.h:92
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
Definition: typeinfo.h:90
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
Definition: typeinfo.h:99
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition: typeinfo.h:86
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition: typeinfo.h:101
@ PCB_PAD_T
class PAD, a pad in a footprint
Definition: typeinfo.h:87
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
Definition: typeinfo.h:98
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
Definition: typeinfo.h:96
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Definition: typeinfo.h:104
VECTOR2< int > VECTOR2I
Definition: vector2d.h:588
VECTOR2D ToVECTOR2D(const wxPoint &aPoint)
Definition: vector2wx.h:40
Definition of file extensions used in Kicad.
#define ZOOM_LIST_PCBNEW
Definition: zoom_defines.h:32
#define ZOOM_LIST_PCBNEW_HYPER
Definition: zoom_defines.h:35