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
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 <lset.h>
47#include <kiface_base.h>
48#include <pcb_painter.h>
49#include <pcbnew_id.h>
50#include <pcbnew_settings.h>
51#include <pcb_base_frame.h>
52#include <pcb_draw_panel_gal.h>
53#include <pgm_base.h>
54#include <project_pcb.h>
56#include <zoom_defines.h>
57
58#include <math/vector2d.h>
59#include <math/vector2wx.h>
60#include <widgets/msgpanel.h>
61#include <wx/fswatcher.h>
62
65#include <tool/tool_manager.h>
67#include <tools/pcb_actions.h>
68#include <tool/grid_menu.h>
70
72
75
76wxDEFINE_EVENT( EDA_EVT_BOARD_CHANGED, wxCommandEvent );
77
78PCB_BASE_FRAME::PCB_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType,
79 const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize,
80 long aStyle, const wxString& aFrameName ) :
81 EDA_DRAW_FRAME( aKiway, aParent, aFrameType, aTitle, aPos, aSize, aStyle, aFrameName,
82 pcbIUScale ),
83 m_pcb( nullptr ),
84 m_originTransforms( *this )
85{
87}
88
89
91{
92 // Ensure m_canvasType is up to date, to save it in config
93 if( GetCanvas() )
95
96 delete m_pcb;
97 m_pcb = nullptr;
98}
99
100
101bool PCB_BASE_FRAME::canCloseWindow( wxCloseEvent& aEvent )
102{
103 // Close modeless dialogs. They're trouble when they get destroyed after the frame and/or
104 // board.
105 wxWindow* viewer3D = Get3DViewerFrame();
106
107 if( viewer3D )
108 viewer3D->Close( true );
109
110 // Similarly, wxConvBrokenFileNames uses some statically allocated variables that make it
111 // crash when run later from a d'tor.
113
114 return true;
115}
116
117
118void PCB_BASE_FRAME::handleActivateEvent( wxActivateEvent& aEvent )
119{
121
122 if( m_spaceMouse )
123 m_spaceMouse->SetFocus( aEvent.GetActive() );
124}
125
126
127void PCB_BASE_FRAME::handleIconizeEvent( wxIconizeEvent& aEvent )
128{
130
131 if( m_spaceMouse && aEvent.IsIconized() )
132 m_spaceMouse->SetFocus( false );
133}
134
135
137{
138 wxWindow* frame = FindWindowByName( QUALIFIED_VIEWER3D_FRAMENAME( this ) );
139 return dynamic_cast<EDA_3D_VIEWER_FRAME*>( frame );
140}
141
142
143void PCB_BASE_FRAME::Update3DView( bool aMarkDirty, bool aRefresh, const wxString* aTitle )
144{
145 EDA_3D_VIEWER_FRAME* draw3DFrame = Get3DViewerFrame();
146
147 if( draw3DFrame )
148 {
149 if( aTitle )
150 draw3DFrame->SetTitle( *aTitle );
151
152 if( aMarkDirty )
153 draw3DFrame->ReloadRequest();
154
155 if( aRefresh )
156 draw3DFrame->Redraw();
157 }
158}
159
160
162{
163 if( m_pcb != aBoard )
164 {
165 delete m_pcb;
166 m_pcb = aBoard;
167
168 if( GetBoard() )
170
171 if( GetBoard() && GetCanvas() )
172 {
174
175 if( rs )
176 {
177 rs->SetDashLengthRatio( GetBoard()->GetPlotOptions().GetDashedLineDashRatio() );
178 rs->SetGapLengthRatio( GetBoard()->GetPlotOptions().GetDashedLineGapRatio() );
179 }
180 }
181
182 wxCommandEvent e( EDA_EVT_BOARD_CHANGED );
183 ProcessEventLocally( e );
184
185 for( wxEvtHandler* listener : m_boardChangeListeners )
186 {
187 wxCHECK2( listener, continue );
188
189 // Use the windows variant when handling event messages in case there is any special
190 // event handler pre and/or post processing specific to windows.
191 wxWindow* win = dynamic_cast<wxWindow*>( listener );
192
193 if( win )
194 win->HandleWindowEvent( e );
195 else
196 listener->SafelyProcessEvent( e );
197 }
198 }
199}
200
201
202void PCB_BASE_FRAME::AddBoardChangeListener( wxEvtHandler* aListener )
203{
204 auto it = std::find( m_boardChangeListeners.begin(), m_boardChangeListeners.end(), aListener );
205
206 // Don't add duplicate listeners.
207 if( it == m_boardChangeListeners.end() )
208 m_boardChangeListeners.push_back( aListener );
209}
210
211
212void PCB_BASE_FRAME::RemoveBoardChangeListener( wxEvtHandler* aListener )
213{
214 auto it = std::find( m_boardChangeListeners.begin(), m_boardChangeListeners.end(), aListener );
215
216 // Don't add duplicate listeners.
217 if( it != m_boardChangeListeners.end() )
218 m_boardChangeListeners.erase( it );
219}
220
221
223{
224 if( aFootprint )
225 {
226 GetBoard()->Add( aFootprint, ADD_MODE::APPEND );
227
228 aFootprint->SetFlags( IS_NEW );
229 aFootprint->SetPosition( VECTOR2I( 0, 0 ) ); // cursor in GAL may not be initialized yet
230
231 // Put it on FRONT layer (note that it might be stored flipped if the lib is an archive
232 // built from a board)
233 if( aFootprint->IsFlipped() )
234 aFootprint->Flip( aFootprint->GetPosition(), GetPcbNewSettings()->m_FlipDirection );
235
236 // Place it in orientation 0 even if it is not saved with orientation 0 in lib (note that
237 // it might be stored in another orientation if the lib is an archive built from a board)
238 aFootprint->SetOrientation( ANGLE_0 );
239
240 GetBoard()->UpdateUserUnits( aFootprint, GetCanvas()->GetView() );
241 }
242}
243
244
246{
247 return GetBoard()->GetItem( aId );
248}
249
250
252{
253 std::vector<BOARD_ITEM*> items;
254
255 if( aItem )
256 items.push_back( aItem );
257
258 FocusOnItems( items, aLayer );
259}
260
261
262void PCB_BASE_FRAME::FocusOnItems( std::vector<BOARD_ITEM*> aItems, PCB_LAYER_ID aLayer )
263{
264 static std::vector<KIID> lastBrightenedItemIDs;
265
266 BOARD_ITEM* lastItem = nullptr;
267
268 for( KIID lastBrightenedItemID : lastBrightenedItemIDs )
269 {
272 #if BOOST_VERSION >= 106700
273 try
274 {
275 lastItem = GetBoard()->GetItem( lastBrightenedItemID );
276 }
277 catch( const boost::uuids::entropy_error& )
278 {
279 wxLogError( wxT( "A Boost UUID entropy exception was thrown in %s:%s." ),
280 __FILE__, __FUNCTION__ );
281 }
282 #else
283 lastItem = GetBoard()->GetItem( lastBrightenedItemID );
284 #endif
285
286 if( lastItem && lastItem != DELETED_BOARD_ITEM::GetInstance() )
287 {
288 lastItem->ClearBrightened();
289
290 lastItem->RunOnDescendants(
291 [&]( BOARD_ITEM* child )
292 {
293 child->ClearBrightened();
294 } );
295
296 GetCanvas()->GetView()->Update( lastItem );
297 lastBrightenedItemID = niluuid;
298 GetCanvas()->Refresh();
299 }
300 }
301
302 lastBrightenedItemIDs.clear();
303
304 if( aItems.empty() )
305 return;
306
307 VECTOR2I focusPt;
308 KIGFX::VIEW* view = GetCanvas()->GetView();
309 SHAPE_POLY_SET viewportPoly( view->GetViewport() );
310
311 for( wxWindow* dialog : findDialogs() )
312 {
313 wxPoint dialogPos = GetCanvas()->ScreenToClient( dialog->GetScreenPosition() );
314 SHAPE_POLY_SET dialogPoly( BOX2D( view->ToWorld( ToVECTOR2D( dialogPos ), true ),
315 view->ToWorld( ToVECTOR2D( dialog->GetSize() ), false ) ) );
316
317 try
318 {
319 viewportPoly.BooleanSubtract( dialogPoly );
320 }
321 catch( const std::exception& e )
322 {
323 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
324 }
325 }
326
327 SHAPE_POLY_SET itemPoly, clippedPoly;
328
329 for( BOARD_ITEM* item : aItems )
330 {
331 if( item && item != DELETED_BOARD_ITEM::GetInstance() )
332 {
333 item->SetBrightened();
334
335 item->RunOnDescendants(
336 [&]( BOARD_ITEM* child )
337 {
338 child->SetBrightened();
339 });
340
341 GetCanvas()->GetView()->Update( item );
342 lastBrightenedItemIDs.push_back( item->m_Uuid );
343
344 // Focus on the object's location. Prefer a visible part of the object to its anchor
345 // in order to keep from scrolling around.
346
347 focusPt = item->GetPosition();
348
349 if( aLayer == UNDEFINED_LAYER && item->GetLayerSet().any() )
350 aLayer = item->GetLayerSet().Seq()[0];
351
352 switch( item->Type() )
353 {
354 case PCB_FOOTPRINT_T:
355 try
356 {
357 itemPoly = static_cast<FOOTPRINT*>( item )->GetBoundingHull();
358 }
359 catch( const std::exception& e )
360 {
361 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ),
362 e.what() ) );
363 }
364
365 break;
366
367 case PCB_PAD_T:
368 case PCB_MARKER_T:
369 case PCB_VIA_T:
370 FocusOnLocation( item->GetFocusPosition() );
371 GetCanvas()->Refresh();
372 return;
373
374 case PCB_SHAPE_T:
375 case PCB_FIELD_T:
376 case PCB_TEXT_T:
377 case PCB_TEXTBOX_T:
378 case PCB_TRACE_T:
379 case PCB_ARC_T:
381 case PCB_DIM_LEADER_T:
382 case PCB_DIM_CENTER_T:
383 case PCB_DIM_RADIAL_T:
385 item->TransformShapeToPolygon( itemPoly, aLayer, 0, pcbIUScale.mmToIU( 0.1 ),
386 ERROR_INSIDE );
387 break;
388
389 case PCB_ZONE_T:
390 {
391 ZONE* zone = static_cast<ZONE*>( item );
392 #if 0
393 // Using the filled area shapes to find a Focus point can give good results, but
394 // unfortunately the calculations are highly time consuming, even for not very
395 // large areas (can be easily a few minutes for large areas).
396 // so we used only the zone outline that usually do not have too many vertices.
397 zone->TransformShapeToPolygon( itemPoly, aLayer, 0, pcbIUScale.mmToIU( 0.1 ),
398 ERROR_INSIDE );
399
400 if( itemPoly.IsEmpty() )
401 itemPoly = *zone->Outline();
402 #else
403 // much faster calculation time when using only the zone outlines
404 itemPoly = *zone->Outline();
405 #endif
406
407 break;
408 }
409
410 default:
411 {
412 BOX2I item_bbox = item->GetBoundingBox();
413 itemPoly.NewOutline();
414 itemPoly.Append( item_bbox.GetOrigin() );
415 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( item_bbox.GetWidth(), 0 ) );
416 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( 0, item_bbox.GetHeight() ) );
417 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( item_bbox.GetWidth(),
418 item_bbox.GetHeight() ) );
419 break;
420 }
421 }
422
423 try
424 {
425 clippedPoly.BooleanIntersection( itemPoly, viewportPoly );
426 }
427 catch( const std::exception& e )
428 {
429 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
430 }
431
432 if( !clippedPoly.IsEmpty() )
433 itemPoly = clippedPoly;
434 }
435 }
436
437 /*
438 * Perform a step-wise deflate to find the visual-center-of-mass
439 */
440
441 BOX2I bbox = itemPoly.BBox();
442 int step = std::min( bbox.GetWidth(), bbox.GetHeight() ) / 10;
443
444 while( !itemPoly.IsEmpty() )
445 {
446 focusPt = itemPoly.BBox().Centre();
447
448 try
449 {
450 itemPoly.Deflate( step, CORNER_STRATEGY::ALLOW_ACUTE_CORNERS, ARC_LOW_DEF );
451 }
452 catch( const std::exception& e )
453 {
454 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
455 }
456 }
457
458 FocusOnLocation( focusPt );
459
460 GetCanvas()->Refresh();
461}
462
463
465{
466 KIGFX::PCB_VIEW* view = GetCanvas()->GetView();
467
468 if( view && GetBoard()->m_SolderMaskBridges && view->HasItem( GetBoard()->m_SolderMaskBridges ) )
469 view->Remove( GetBoard()->m_SolderMaskBridges );
470}
471
472
474{
475 KIGFX::PCB_VIEW* view = GetCanvas()->GetView();
476
477 if( view && GetBoard()->m_SolderMaskBridges )
478 {
479 if( view->HasItem( GetBoard()->m_SolderMaskBridges ) )
480 view->Remove( GetBoard()->m_SolderMaskBridges );
481
482 view->Add( GetBoard()->m_SolderMaskBridges );
483 }
484}
485
486
487void PCB_BASE_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
488{
489 m_pcb->SetPageSettings( aPageSettings );
490
491 if( GetScreen() )
493}
494
495
497{
498 return m_pcb->GetPageSettings();
499}
500
501
503{
504 // this function is only needed because EDA_DRAW_FRAME is not compiled
505 // with either -DPCBNEW or -DEESCHEMA, so the virtual is used to route
506 // into an application specific source file.
508}
509
510
512{
514}
515
516
518{
520}
521
522
524{
526}
527
528
530{
531 VECTOR2I origin( 0, 0 );
532
533 switch( GetPcbNewSettings()->m_Display.m_DisplayOrigin )
534 {
535 case PCB_DISPLAY_ORIGIN::PCB_ORIGIN_PAGE: break;
536 case PCB_DISPLAY_ORIGIN::PCB_ORIGIN_AUX: origin = GetAuxOrigin(); break;
537 case PCB_DISPLAY_ORIGIN::PCB_ORIGIN_GRID: origin = GetGridOrigin(); break;
538 default: wxASSERT( false ); break;
539 }
540
541 return origin;
542}
543
545{
546 return m_originTransforms;
547}
548
549
551{
552 return m_pcb->GetTitleBlock();
553}
554
555
557{
558 m_pcb->SetTitleBlock( aTitleBlock );
559}
560
561
563{
564 return m_pcb->GetDesignSettings();
565}
566
567
569{
570 m_drawBgColor= aColor;
571 m_auimgr.Update();
572}
573
574
576{
577 return m_pcb->GetPlotOptions();
578}
579
580
582{
583 m_pcb->SetPlotOptions( aSettings );
584
585 // Plot Settings can also change the "tent vias" setting, which can affect the solder mask.
586 LSET visibleLayers = GetBoard()->GetVisibleLayers();
587
588 if( visibleLayers.test( F_Mask ) || visibleLayers.test( B_Mask ) )
589 {
591 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
592 {
593 BOARD_ITEM* item = nullptr;
594
595 if( aItem->IsBOARD_ITEM() )
596 item = static_cast<BOARD_ITEM*>( aItem );
597
598 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to
599 // visible as they won't be found in the view layer's itemset for re-painting.
600 if( item && item->Type() == PCB_VIA_T )
601 return KIGFX::ALL;
602
603 return 0;
604 } );
605
606 GetCanvas()->Refresh();
607 }
608}
609
610
611BOX2I PCB_BASE_FRAME::GetBoardBoundingBox( bool aBoardEdgesOnly ) const
612{
613 BOX2I area = aBoardEdgesOnly ? m_pcb->GetBoardEdgesBoundingBox() : m_pcb->GetBoundingBox();
614
615 if( area.GetWidth() == 0 && area.GetHeight() == 0 )
616 {
617 VECTOR2I pageSize = GetPageSizeIU();
618
620 {
621 area.SetOrigin( 0, 0 );
622 area.SetEnd( pageSize.x, pageSize.y );
623 }
624 else
625 {
626 area.SetOrigin( -pageSize.x / 2, -pageSize.y / 2 );
627 area.SetEnd( pageSize.x / 2, pageSize.y / 2 );
628 }
629 }
630
631 return area;
632}
633
634
635const BOX2I PCB_BASE_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
636{
637 /* "Zoom to Fit" calls this with "aIncludeAllVisible" as true. Since that feature
638 * always ignored the page and border, this function returns a bbox without them
639 * as well when passed true. This technically is not all things visible, but it
640 * keeps behavior consistent.
641 *
642 * When passed false, this function returns a bbox of just the board edge. This
643 * allows things like fabrication text or anything else outside the board edge to
644 * be ignored, and just zooms up to the board itself.
645 *
646 * Calling "GetBoardBoundingBox(true)" when edge cuts are turned off will return
647 * the entire page and border, so we call "GetBoardBoundingBox(false)" instead.
648 */
649 if( aIncludeAllVisible || !m_pcb->IsLayerVisible( Edge_Cuts ) )
650 return GetBoardBoundingBox( false );
651 else
652 return GetBoardBoundingBox( true );
653}
654
655
656// Virtual function
658{
659}
660
661
663{
664 // call my base class
666
667 // tooltips in toolbars
669
671
672 if( viewer3D )
673 viewer3D->ShowChangedLanguage();
674}
675
676
678{
679 EDA_3D_VIEWER_FRAME* draw3DFrame = Get3DViewerFrame();
680
681 if( !draw3DFrame )
682 draw3DFrame = new EDA_3D_VIEWER_FRAME( &Kiway(), this, _( "3D Viewer" ) );
683
684 // Raising the window does not show the window on Windows if iconized. This should work
685 // on any platform.
686 if( draw3DFrame->IsIconized() )
687 draw3DFrame->Iconize( false );
688
689 draw3DFrame->Raise();
690 draw3DFrame->Show( true );
691
692 // Raising the window does not set the focus on Linux. This should work on any platform.
693 if( wxWindow::FindFocus() != draw3DFrame )
694 draw3DFrame->SetFocus();
695
696 // Allocate a slice of time to display the 3D frame
697 // a call to wxSafeYield() should be enough (and better), but on Linux we need
698 // to call wxYield()
699 // otherwise the activity messages are not displayed during the first board loading
700 wxYield();
701
702 // Note, the caller is responsible to load/update the board 3D view.
703 // after frame creation the board is not automatically created.
704
705 return draw3DFrame;
706}
707
708
710{
711 PCB_LAYER_ID preslayer = GetActiveLayer();
712 auto& displ_opts = GetDisplayOptions();
713
714 // Check if the specified layer matches the present layer
715 if( layer == preslayer )
716 return;
717
718 // Copper layers cannot be selected unconditionally; how many of those layers are
719 // currently enabled needs to be checked.
720 if( IsCopperLayer( layer ) )
721 {
722 if( layer > m_pcb->GetCopperLayerStackMaxId() )
723 return;
724 }
725
726 // Is yet more checking required? E.g. when the layer to be selected is a non-copper
727 // layer, or when switching between a copper layer and a non-copper layer, or vice-versa?
728 // ...
729
730 SetActiveLayer( layer );
731
732 if( displ_opts.m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL )
733 GetCanvas()->Refresh();
734}
735
736
738{
740 GetCanvas()->GetView() );
741
742 // account for the globals
754
755 return guide;
756}
757
758
760{
762
763 BASE_SCREEN* screen = GetScreen();
764
765 if( !screen )
766 return;
767
768 wxString line;
770
771 if( GetShowPolarCoords() ) // display polar coordinates
772 {
773 double dx = cursorPos.x - screen->m_LocalOrigin.x;
774 double dy = cursorPos.y - screen->m_LocalOrigin.y;
775 double theta = RAD2DEG( atan2( -dy, dx ) );
776 double ro = hypot( dx, dy );
777
778 line.Printf( wxT( "r %s theta %.3f" ),
779 MessageTextFromValue( ro, false ),
780 theta );
781
782 SetStatusText( line, 3 );
783 }
784
785 // Transform absolute coordinates for user origin preferences
786 double userXpos = m_originTransforms.ToDisplayAbsX( static_cast<double>( cursorPos.x ) );
787 double userYpos = m_originTransforms.ToDisplayAbsY( static_cast<double>( cursorPos.y ) );
788
789 // Display absolute coordinates:
790 line.Printf( wxT( "X %s Y %s" ),
791 MessageTextFromValue( userXpos, false ),
792 MessageTextFromValue( userYpos, false ) );
793 SetStatusText( line, 2 );
794
795 if( !GetShowPolarCoords() ) // display relative cartesian coordinates
796 {
797 // Calculate relative coordinates
798 double relXpos = cursorPos.x - screen->m_LocalOrigin.x;
799 double relYpos = cursorPos.y - screen->m_LocalOrigin.y;
800
801 // Transform relative coordinates for user origin preferences
802 userXpos = m_originTransforms.ToDisplayRelX( relXpos );
803 userYpos = m_originTransforms.ToDisplayRelY( relYpos );
804
805 line.Printf( wxT( "dx %s dy %s dist %s" ),
806 MessageTextFromValue( userXpos, false ),
807 MessageTextFromValue( userYpos, false ),
808 MessageTextFromValue( hypot( userXpos, userYpos ), false ) );
809 SetStatusText( line, 3 );
810 }
811
813}
814
815
817{
818 EDA_DRAW_FRAME::unitsChangeRefresh(); // Update the status bar.
819
820 if( GetBoard() )
822
824}
825
826
828{
830
831 if( aCfg->m_Window.grid.grids.empty() )
832 aCfg->m_Window.grid.grids = aCfg->DefaultGridSizeList();
833
834 // Move legacy user grids to grid list
835 if( !aCfg->m_Window.grid.user_grid_x.empty() )
836 {
837 aCfg->m_Window.grid.grids.emplace_back( GRID{ "User Grid", aCfg->m_Window.grid.user_grid_x,
838 aCfg->m_Window.grid.user_grid_y } );
839 aCfg->m_Window.grid.user_grid_x = wxEmptyString;
840 aCfg->m_Window.grid.user_grid_y = wxEmptyString;
841 }
842
843 // Currently values read from config file are not used because the user cannot
844 // change this config
845 // if( aCfg->m_Window.zoom_factors.empty() )
846 {
847 if( ADVANCED_CFG::GetCfg().m_HyperZoom )
849 else
851 }
852
853 // Some, but not all, derived classes have a PCBNEW_SETTINGS.
854 if( PCBNEW_SETTINGS* pcbnew_cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg ) )
855 m_polarCoords = pcbnew_cfg->m_PolarCoords;
856
857 wxASSERT( GetCanvas() );
858
859 if( GetCanvas() )
860 {
862
863 if( rs )
864 {
867 rs->SetDefaultFont( wxEmptyString ); // Always the KiCad font for PCBs
868 }
869 }
870}
871
872
874{
875 if( aErrorCode >= CLEANUP_FIRST )
876 return RPT_SEVERITY_ACTION;
877
879
880 return bds.m_DRCSeverities[ aErrorCode ];
881}
882
883
885{
887
888 // Some, but not all derived classes have a PCBNEW_SETTINGS.
889 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
890
891 if( cfg )
893}
894
895
897{
899}
900
901
903{
905}
906
907
909{
910 switch( GetFrameType() )
911 {
912 case FRAME_PCB_EDITOR:
914 default:
916
920
924 case FRAME_CVPCB:
927 }
928}
929
930
932{
934}
935
936
937void PCB_BASE_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
938{
939 EDA_DRAW_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
940
941 KIGFX::VIEW* view = GetCanvas()->GetView();
942 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( view->GetPainter() );
943 PCB_RENDER_SETTINGS* settings = painter->GetSettings();
944
945 settings->LoadColors( GetColorSettings( true ) );
948
949 if( aTextVarsChanged )
951
952 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible as
953 // they won't be found in the view layer's itemset for re-painting.
955 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
956 {
957 if( dynamic_cast<RATSNEST_VIEW_ITEM*>( aItem ) )
958 {
959 return KIGFX::ALL; // ratsnest display
960 }
961 else if( dynamic_cast<PCB_TRACK*>( aItem ) )
962 {
963 return KIGFX::REPAINT; // track, arc & via clearance display
964 }
965 else if( dynamic_cast<PAD*>( aItem ) )
966 {
967 return KIGFX::REPAINT; // pad clearance display
968 }
969 else if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
970 {
971 if( text->HasTextVars() )
972 {
973 text->ClearRenderCache();
974 text->ClearBoundingBoxCache();
975 return KIGFX::GEOMETRY | KIGFX::REPAINT;
976 }
977 }
978
979 return 0;
980 } );
981
983
985
986 // The 3D viewer isn't in the Kiway, so send its update manually
988
989 if( viewer )
990 viewer->CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
991}
992
993
995{
997
999 m_autoSaveRequired = true;
1000
1002
1005}
1006
1007
1009{
1013}
1014
1015
1017{
1018 return static_cast<PCB_DRAW_PANEL_GAL*>( EDA_DRAW_FRAME::GetCanvas() );
1019}
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
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 m_spaceMouse = std::make_unique<NL_PCBNEW_PLUGIN>( GetCanvas() );
1054 }
1055 }
1056 catch( const std::system_error& e )
1057 {
1058 wxLogTrace( wxT( "KI_TRACE_NAVLIB" ), e.what() );
1059 }
1060}
1061
1062
1063void PCB_BASE_FRAME::SetDisplayOptions( const PCB_DISPLAY_OPTIONS& aOptions, bool aRefresh )
1064{
1066 bool hcVisChanged = m_displayOptions.m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN
1067 || aOptions.m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN;
1068 m_displayOptions = aOptions;
1069
1070 EDA_DRAW_PANEL_GAL* canvas = GetCanvas();
1071 KIGFX::PCB_VIEW* view = static_cast<KIGFX::PCB_VIEW*>( canvas->GetView() );
1072
1073 view->UpdateDisplayOptions( aOptions );
1076
1077 // Vias on a restricted layer set must be redrawn when high contrast mode is changed
1078 if( hcChanged )
1079 {
1080 bool showNetNames = false;
1081
1082 if( PCBNEW_SETTINGS* config = dynamic_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() ) )
1083 showNetNames = config->m_Display.m_NetNames > 0;
1084
1085 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible as
1086 // they won't be found in the view layer's itemset for re-painting.
1088 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1089 {
1090 if( PCB_VIA* via = dynamic_cast<PCB_VIA*>( aItem ) )
1091 {
1092 if( via->GetViaType() != VIATYPE::THROUGH
1093 || via->GetRemoveUnconnected()
1094 || showNetNames )
1095 {
1096 return hcVisChanged ? KIGFX::ALL : KIGFX::REPAINT;
1097 }
1098 }
1099 else if( PAD* pad = dynamic_cast<PAD*>( aItem ) )
1100 {
1101 if( pad->GetRemoveUnconnected()
1102 || showNetNames )
1103 {
1104 return hcVisChanged ? KIGFX::ALL : KIGFX::REPAINT;
1105 }
1106 }
1107
1108 return 0;
1109 } );
1110 }
1111
1112 if( aRefresh )
1113 canvas->Refresh();
1114}
1115
1116
1118{
1119 wxLogTrace( "KICAD_LIB_WATCH", "setFPWatcher" );
1120
1121 Unbind( wxEVT_FSWATCHER, &PCB_BASE_FRAME::OnFPChange, this );
1122
1123 if( m_watcher )
1124 {
1125 wxLogTrace( "KICAD_LIB_WATCH", "Remove watch" );
1126 m_watcher->RemoveAll();
1127 m_watcher->SetOwner( nullptr );
1128 m_watcher.reset();
1129 }
1130
1131 wxString libfullname;
1133
1134 if( !aFootprint || !tbl )
1135 return;
1136
1137 try
1138 {
1139 const FP_LIB_TABLE_ROW* row = tbl->FindRow( aFootprint->GetFPID().GetLibNickname() );
1140
1141 if( !row )
1142 return;
1143
1144 libfullname = row->GetFullURI( true );
1145 }
1146 catch( const std::exception& e )
1147 {
1148 DisplayInfoMessage( this, e.what() );
1149 return;
1150 }
1151 catch( const IO_ERROR& error )
1152 {
1153 wxLogTrace( "KICAD_LIB_WATCH", "Error: %s", error.What() );
1154 return;
1155 }
1156
1157 m_watcherFileName.Assign( libfullname, aFootprint->GetFPID().GetLibItemName(),
1159
1160 if( !m_watcherFileName.FileExists() )
1161 return;
1162
1163 m_watcherLastModified = m_watcherFileName.GetModificationTime();
1164
1165 Bind( wxEVT_FSWATCHER, &PCB_BASE_FRAME::OnFPChange, this );
1166 m_watcher = std::make_unique<wxFileSystemWatcher>();
1167 m_watcher->SetOwner( this );
1168
1169 wxFileName fn;
1170 fn.AssignDir( m_watcherFileName.GetPath() );
1171 fn.DontFollowLink();
1172
1173 wxLogTrace( "KICAD_LIB_WATCH", "Add watch: %s", fn.GetPath() );
1174
1175 m_watcher->Add( fn );
1176}
1177
1178
1179void PCB_BASE_FRAME::OnFPChange( wxFileSystemWatcherEvent& aEvent )
1180{
1181 if( aEvent.GetPath() != m_watcherFileName.GetFullPath() )
1182 return;
1183
1184 // Start the debounce timer (set to 1 second)
1185 if( !m_watcherDebounceTimer.StartOnce( 1000 ) )
1186 {
1187 wxLogTrace( "KICAD_LIB_WATCH", "Failed to start the debounce timer" );
1188 return;
1189 }
1190}
1191
1192
1194{
1195 wxLogTrace( "KICAD_LIB_WATCH", "OnFpChangeDebounceTimer" );
1196
1197 // Disable logging to avoid spurious messages and check if the file has changed
1198 wxLog::EnableLogging( false );
1199 wxDateTime lastModified = m_watcherFileName.GetModificationTime();
1200 wxLog::EnableLogging( true );
1201
1202 if( lastModified == m_watcherLastModified || !lastModified.IsValid() )
1203 return;
1204
1205 m_watcherLastModified = lastModified;
1206
1209
1210 // When loading a footprint from a library in the footprint editor
1211 // the items UUIDs must be keep and not reinitialized
1212 bool keepUUID = IsType( FRAME_FOOTPRINT_EDITOR );
1213
1214 if( !fp || !tbl )
1215 return;
1216
1218 || IsOK( this, _( "The library containing the current footprint has changed.\n"
1219 "Do you want to reload the footprint?" ) ) )
1220 {
1221 wxString fpname = fp->GetFPID().GetLibItemName();
1222 wxString nickname = fp->GetFPID().GetLibNickname();
1223
1224 try
1225 {
1226 FOOTPRINT* newfp = tbl->FootprintLoad( nickname, fpname, keepUUID );
1227
1228 if( newfp )
1229 {
1230 std::vector<KIID> selectedItems;
1231
1232 for( const EDA_ITEM* item : GetCurrentSelection() )
1233 {
1234 wxString uuidStr = item->m_Uuid.AsString();
1235 selectedItems.emplace_back( item->m_Uuid );
1236 }
1237
1239
1240 ReloadFootprint( newfp );
1241
1242 newfp->ClearAllNets();
1246
1247 std::vector<EDA_ITEM*> sel;
1248
1249 for( const KIID& uuid : selectedItems )
1250 {
1251 BOARD_ITEM* item = GetBoard()->GetItem( uuid );
1252
1253 if( item != DELETED_BOARD_ITEM::GetInstance() )
1254 sel.push_back( item );
1255 }
1256
1257 if( !sel.empty() )
1259 }
1260 }
1261 catch( const IO_ERROR& ioe )
1262 {
1263 DisplayError( this, ioe.What() );
1264 }
1265 }
1266}
@ ERROR_INSIDE
Definition: approximation.h:34
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:923
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:196
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:79
virtual void RunOnDescendants(const std::function< void(BOARD_ITEM *)> &aFunction, int aDepth=0) const
Invoke a function on all descendants.
Definition: board_item.h:214
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:295
void SetPlotOptions(const PCB_PLOT_PARAMS &aOptions)
Definition: board.h:701
PCB_LAYER_ID GetCopperLayerStackMaxId() const
Definition: board.cpp:792
LSET GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
Definition: board.cpp:831
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
Definition: board.cpp:1042
const BOX2I GetBoardEdgesBoundingBox() const
Return the board bounding box calculated using exclusively the board edges (graphics on Edge....
Definition: board.h:937
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
Definition: board.h:923
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Test whether a given element category is visible.
Definition: board.cpp:883
const PAGE_INFO & GetPageSettings() const
Definition: board.h:697
void UpdateUserUnits(BOARD_ITEM *aItem, KIGFX::VIEW *aView)
Update any references within aItem (or its descendants) to the user units.
Definition: board.cpp:1374
BOARD_ITEM * GetItem(const KIID &aID) const
Definition: board.cpp:1451
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:187
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
Definition: board.h:456
TITLE_BLOCK & GetTitleBlock()
Definition: board.h:703
void IncrementTimeStamp()
Definition: board.cpp:255
void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition: board.h:698
const PCB_PLOT_PARAMS & GetPlotOptions() const
Definition: board.h:700
bool IsLayerVisible(PCB_LAYER_ID aLayer) const
A proxy function that calls the correspondent function in m_BoardSettings tests whether a given layer...
Definition: board.cpp:823
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:934
void SynchronizeProperties()
Copy the current project's text variables into the boards property cache.
Definition: board.cpp:2085
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
Definition: board.h:705
void SetUserUnits(EDA_UNITS aUnits)
Definition: board.h:710
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:477
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
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.
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
The current canvas type.
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:89
void SetFlags(EDA_ITEM_FLAGS aMask)
Definition: eda_item.h:127
const KIID m_Uuid
Definition: eda_item.h:490
KICAD_T Type() const
Returns the type of object.
Definition: eda_item.h:101
void ClearBrightened()
Definition: eda_item.h:123
void SetBrightened()
Definition: eda_item.h:120
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition: eda_text.h:80
static const TOOL_EVENT ConnectivityChangedEvent
Selected item had a property changed (except movement)
Definition: actions.h:296
void SetPosition(const VECTOR2I &aPos) override
Definition: footprint.cpp:2451
void SetOrientation(const EDA_ANGLE &aNewAngle)
Definition: footprint.cpp:2539
bool IsFlipped() const
Definition: footprint.h:389
const LIB_ID & GetFPID() const
Definition: footprint.h:246
void ClearAllNets()
Clear (i.e.
Definition: footprint.cpp:1070
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
Definition: footprint.cpp:2389
VECTOR2I GetPosition() const override
Definition: footprint.h:222
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:319
void SetIgnoreBlindBuriedVias(bool ignore)
Definition: collectors.h:458
void SetIgnoreTracks(bool ignore)
Definition: collectors.h:464
void SetIgnoreFootprintsOnFront(bool ignore)
Definition: collectors.h:422
void SetIgnoreFPTextOnFront(bool ignore)
Definition: collectors.h:410
void SetIgnoreMicroVias(bool ignore)
Definition: collectors.h:461
void SetIgnoreFPTextOnBack(bool ignore)
Definition: collectors.h:404
void SetIgnoreThroughVias(bool ignore)
Definition: collectors.h:455
void SetIgnoreThroughHolePads(bool ignore)
Definition: collectors.h:440
void SetIgnoreFPReferences(bool ignore)
Definition: collectors.h:452
void SetIgnoreFPValues(bool ignore)
Definition: collectors.h:446
void SetIgnoreFootprintsOnBack(bool ignore)
Definition: collectors.h:416
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:180
virtual PCB_RENDER_SETTINGS * GetSettings() override
Return a pointer to current settings that are going to be used when drawing items.
Definition: pcb_painter.h:185
PCB specific render settings.
Definition: pcb_painter.h:78
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:121
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
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
Definition: view.cpp:520
bool HasItem(const VIEW_ITEM *aItem) const
Indicates whether or not the given item has been added to the view.
Definition: view.cpp:1659
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:457
void RecacheAllItems()
Rebuild GAL display lists.
Definition: view.cpp:1439
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1549
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:216
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:1559
Definition: kiid.h:49
wxString AsString() const
Definition: kiid.cpp:246
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:285
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: lset.h:37
A class to perform either relative or absolute display origin transforms for a single axis of a point...
Definition: pad.h:54
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.
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 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)
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 ...
EDA_ITEM * GetItem(const KIID &aId) const override
Fetch an item by KIID.
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.
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
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.
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)
Update the current display options.
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()
Show 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)
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:125
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(const wxString &aFilename)
Return a handle to the a given settings by type.
Represent a set of closed polygons.
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
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:150
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:73
SHAPE_POLY_SET * Outline()
Definition: zone.h:340
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:1596
@ 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:250
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
Definition: confirm.cpp:170
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition: confirm.cpp:222
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:401
#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
static const std::string KiCadFootprintFileExtension
KIID niluuid(0)
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
Definition: layer_ids.h:581
@ LAYER_FOOTPRINTS_FR
Show footprints on front.
Definition: layer_ids.h:221
@ LAYER_FP_REFERENCES
Show footprints references (when texts are visible).
Definition: layer_ids.h:228
@ LAYER_PADS
Meta control for all pads opacity/visibility (color ignored).
Definition: layer_ids.h:254
@ LAYER_TRACKS
Definition: layer_ids.h:229
@ LAYER_FP_TEXT
Definition: layer_ids.h:202
@ LAYER_FOOTPRINTS_BK
Show footprints on back.
Definition: layer_ids.h:222
@ LAYER_FP_VALUES
Show footprints values (when texts are visible).
Definition: layer_ids.h:225
@ LAYER_VIAS
Meta control for all vias opacity/visibility.
Definition: layer_ids.h:195
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
@ ALL
All except INITIAL_ADD.
Definition: view_item.h:59
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:1073
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:122
float select_factor
How much to brighten selected objects by.
Definition: app_settings.h:123
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:167
@ 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< int32_t > VECTOR2I
Definition: vector2d.h:695
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