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 <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 m_spaceMouse( nullptr )
86{
88}
89
90
92{
93 delete m_spaceMouse;
94 m_spaceMouse = nullptr;
95
96 // Ensure m_canvasType is up to date, to save it in config
97 if( GetCanvas() )
99
100 delete m_pcb;
101 m_pcb = nullptr;
102}
103
104
105bool PCB_BASE_FRAME::canCloseWindow( wxCloseEvent& aEvent )
106{
107 // Close modeless dialogs. They're trouble when they get destroyed after the frame and/or
108 // board.
109 wxWindow* viewer3D = Get3DViewerFrame();
110
111 if( viewer3D )
112 viewer3D->Close( true );
113
114 // Similarly, wxConvBrokenFileNames uses some statically allocated variables that make it
115 // crash when run later from a d'tor.
117
118 return true;
119}
120
121
122void PCB_BASE_FRAME::handleActivateEvent( wxActivateEvent& aEvent )
123{
125
126 if( m_spaceMouse )
127 m_spaceMouse->SetFocus( aEvent.GetActive() );
128}
129
130
131void PCB_BASE_FRAME::handleIconizeEvent( wxIconizeEvent& aEvent )
132{
134
135 if( m_spaceMouse != nullptr && aEvent.IsIconized() )
136 m_spaceMouse->SetFocus( false );
137}
138
139
141{
142 wxWindow* frame = FindWindowByName( QUALIFIED_VIEWER3D_FRAMENAME( this ) );
143 return dynamic_cast<EDA_3D_VIEWER_FRAME*>( frame );
144}
145
146
147void PCB_BASE_FRAME::Update3DView( bool aMarkDirty, bool aRefresh, const wxString* aTitle )
148{
149 EDA_3D_VIEWER_FRAME* draw3DFrame = Get3DViewerFrame();
150
151 if( draw3DFrame )
152 {
153 if( aTitle )
154 draw3DFrame->SetTitle( *aTitle );
155
156 if( aMarkDirty )
157 draw3DFrame->ReloadRequest();
158
159 if( aRefresh )
160 draw3DFrame->Redraw();
161 }
162}
163
164
166{
167 if( m_pcb != aBoard )
168 {
169 delete m_pcb;
170 m_pcb = aBoard;
171
172 if( GetBoard() )
174
175 if( GetBoard() && GetCanvas() )
176 {
178
179 if( rs )
180 {
181 rs->SetDashLengthRatio( GetBoard()->GetPlotOptions().GetDashedLineDashRatio() );
182 rs->SetGapLengthRatio( GetBoard()->GetPlotOptions().GetDashedLineGapRatio() );
183 }
184 }
185
186 wxCommandEvent e( EDA_EVT_BOARD_CHANGED );
187 ProcessEventLocally( e );
188
189 for( wxEvtHandler* listener : m_boardChangeListeners )
190 {
191 wxCHECK2( listener, continue );
192
193 // Use the windows variant when handling event messages in case there is any special
194 // event handler pre and/or post processing specific to windows.
195 wxWindow* win = dynamic_cast<wxWindow*>( listener );
196
197 if( win )
198 win->HandleWindowEvent( e );
199 else
200 listener->SafelyProcessEvent( e );
201 }
202 }
203}
204
205
206void PCB_BASE_FRAME::AddBoardChangeListener( wxEvtHandler* aListener )
207{
208 auto it = std::find( m_boardChangeListeners.begin(), m_boardChangeListeners.end(), aListener );
209
210 // Don't add duplicate listeners.
211 if( it == m_boardChangeListeners.end() )
212 m_boardChangeListeners.push_back( aListener );
213}
214
215
216void PCB_BASE_FRAME::RemoveBoardChangeListener( wxEvtHandler* aListener )
217{
218 auto it = std::find( m_boardChangeListeners.begin(), m_boardChangeListeners.end(), aListener );
219
220 // Don't add duplicate listeners.
221 if( it != m_boardChangeListeners.end() )
222 m_boardChangeListeners.erase( it );
223}
224
225
227{
228 if( aFootprint )
229 {
230 GetBoard()->Add( aFootprint, ADD_MODE::APPEND );
231
232 aFootprint->SetFlags( IS_NEW );
233 aFootprint->SetPosition( VECTOR2I( 0, 0 ) ); // cursor in GAL may not be initialized yet
234
235 // Put it on FRONT layer (note that it might be stored flipped if the lib is an archive
236 // built from a board)
237 if( aFootprint->IsFlipped() )
238 aFootprint->Flip( aFootprint->GetPosition(), GetPcbNewSettings()->m_FlipDirection );
239
240 // Place it in orientation 0 even if it is not saved with orientation 0 in lib (note that
241 // it might be stored in another orientation if the lib is an archive built from a board)
242 aFootprint->SetOrientation( ANGLE_0 );
243
244 GetBoard()->UpdateUserUnits( aFootprint, GetCanvas()->GetView() );
245 }
246}
247
248
250{
251 return GetBoard()->GetItem( aId );
252}
253
254
256{
257 std::vector<BOARD_ITEM*> items;
258
259 if( aItem )
260 items.push_back( aItem );
261
262 FocusOnItems( items, aLayer );
263}
264
265
266void PCB_BASE_FRAME::FocusOnItems( std::vector<BOARD_ITEM*> aItems, PCB_LAYER_ID aLayer )
267{
268 static std::vector<KIID> lastBrightenedItemIDs;
269
270 BOARD_ITEM* lastItem = nullptr;
271
272 for( KIID lastBrightenedItemID : lastBrightenedItemIDs )
273 {
276 #if BOOST_VERSION >= 106700
277 try
278 {
279 lastItem = GetBoard()->GetItem( lastBrightenedItemID );
280 }
281 catch( const boost::uuids::entropy_error& )
282 {
283 wxLogError( wxT( "A Boost UUID entropy exception was thrown in %s:%s." ),
284 __FILE__, __FUNCTION__ );
285 }
286 #else
287 lastItem = GetBoard()->GetItem( lastBrightenedItemID );
288 #endif
289
290 if( lastItem && lastItem != DELETED_BOARD_ITEM::GetInstance() )
291 {
292 lastItem->ClearBrightened();
293
294 lastItem->RunOnDescendants(
295 [&]( BOARD_ITEM* child )
296 {
297 child->ClearBrightened();
298 } );
299
300 GetCanvas()->GetView()->Update( lastItem );
301 lastBrightenedItemID = niluuid;
302 GetCanvas()->Refresh();
303 }
304 }
305
306 lastBrightenedItemIDs.clear();
307
308 if( aItems.empty() )
309 return;
310
311 VECTOR2I focusPt;
312 KIGFX::VIEW* view = GetCanvas()->GetView();
313 SHAPE_POLY_SET viewportPoly( view->GetViewport() );
314
315 for( wxWindow* dialog : findDialogs() )
316 {
317 wxPoint dialogPos = GetCanvas()->ScreenToClient( dialog->GetScreenPosition() );
318 SHAPE_POLY_SET dialogPoly( BOX2D( view->ToWorld( ToVECTOR2D( dialogPos ), true ),
319 view->ToWorld( ToVECTOR2D( dialog->GetSize() ), false ) ) );
320
321 try
322 {
323 viewportPoly.BooleanSubtract( dialogPoly, SHAPE_POLY_SET::PM_FAST );
324 }
325 catch( const std::exception& e )
326 {
327 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.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& e )
364 {
365 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ),
366 e.what() ) );
367 }
368
369 break;
370
371 case PCB_PAD_T:
372 case PCB_MARKER_T:
373 case PCB_VIA_T:
374 FocusOnLocation( item->GetFocusPosition() );
375 GetCanvas()->Refresh();
376 return;
377
378 case PCB_SHAPE_T:
379 case PCB_FIELD_T:
380 case PCB_TEXT_T:
381 case PCB_TEXTBOX_T:
382 case PCB_TRACE_T:
383 case PCB_ARC_T:
385 case PCB_DIM_LEADER_T:
386 case PCB_DIM_CENTER_T:
387 case PCB_DIM_RADIAL_T:
389 item->TransformShapeToPolygon( itemPoly, aLayer, 0, pcbIUScale.mmToIU( 0.1 ),
390 ERROR_INSIDE );
391 break;
392
393 case PCB_ZONE_T:
394 {
395 ZONE* zone = static_cast<ZONE*>( item );
396 #if 0
397 // Using the filled area shapes to find a Focus point can give good results, but
398 // unfortunately the calculations are highly time consuming, even for not very
399 // large areas (can be easily a few minutes for large areas).
400 // so we used only the zone outline that usually do not have too many vertices.
401 zone->TransformShapeToPolygon( itemPoly, aLayer, 0, pcbIUScale.mmToIU( 0.1 ),
402 ERROR_INSIDE );
403
404 if( itemPoly.IsEmpty() )
405 itemPoly = *zone->Outline();
406 #else
407 // much faster calculation time when using only the zone outlines
408 itemPoly = *zone->Outline();
409 #endif
410
411 break;
412 }
413
414 default:
415 {
416 BOX2I item_bbox = item->GetBoundingBox();
417 itemPoly.NewOutline();
418 itemPoly.Append( item_bbox.GetOrigin() );
419 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( item_bbox.GetWidth(), 0 ) );
420 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( 0, item_bbox.GetHeight() ) );
421 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( item_bbox.GetWidth(),
422 item_bbox.GetHeight() ) );
423 break;
424 }
425 }
426
427 try
428 {
429 clippedPoly.BooleanIntersection( itemPoly, viewportPoly, SHAPE_POLY_SET::PM_FAST );
430 }
431 catch( const std::exception& e )
432 {
433 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
434 }
435
436 if( !clippedPoly.IsEmpty() )
437 itemPoly = clippedPoly;
438 }
439 }
440
441 /*
442 * Perform a step-wise deflate to find the visual-center-of-mass
443 */
444
445 BOX2I bbox = itemPoly.BBox();
446 int step = std::min( bbox.GetWidth(), bbox.GetHeight() ) / 10;
447
448 while( !itemPoly.IsEmpty() )
449 {
450 focusPt = itemPoly.BBox().Centre();
451
452 try
453 {
454 itemPoly.Deflate( step, CORNER_STRATEGY::ALLOW_ACUTE_CORNERS, ARC_LOW_DEF );
455 }
456 catch( const std::exception& e )
457 {
458 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
459 }
460 }
461
462 FocusOnLocation( focusPt );
463
464 GetCanvas()->Refresh();
465}
466
467
469{
470 KIGFX::PCB_VIEW* view = GetCanvas()->GetView();
471
472 if( view && GetBoard()->m_SolderMaskBridges && view->HasItem( GetBoard()->m_SolderMaskBridges ) )
473 view->Remove( GetBoard()->m_SolderMaskBridges );
474}
475
476
478{
479 KIGFX::PCB_VIEW* view = GetCanvas()->GetView();
480
481 if( view && GetBoard()->m_SolderMaskBridges )
482 {
483 if( view->HasItem( GetBoard()->m_SolderMaskBridges ) )
484 view->Remove( GetBoard()->m_SolderMaskBridges );
485
486 view->Add( GetBoard()->m_SolderMaskBridges );
487 }
488}
489
490
491void PCB_BASE_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
492{
493 m_pcb->SetPageSettings( aPageSettings );
494
495 if( GetScreen() )
497}
498
499
501{
502 return m_pcb->GetPageSettings();
503}
504
505
507{
508 // this function is only needed because EDA_DRAW_FRAME is not compiled
509 // with either -DPCBNEW or -DEESCHEMA, so the virtual is used to route
510 // into an application specific source file.
512}
513
514
516{
518}
519
520
522{
524}
525
526
528{
530}
531
532
534{
535 VECTOR2I origin( 0, 0 );
536
537 switch( GetPcbNewSettings()->m_Display.m_DisplayOrigin )
538 {
539 case PCB_DISPLAY_ORIGIN::PCB_ORIGIN_PAGE: break;
540 case PCB_DISPLAY_ORIGIN::PCB_ORIGIN_AUX: origin = GetAuxOrigin(); break;
541 case PCB_DISPLAY_ORIGIN::PCB_ORIGIN_GRID: origin = GetGridOrigin(); break;
542 default: wxASSERT( false ); break;
543 }
544
545 return origin;
546}
547
549{
550 return m_originTransforms;
551}
552
553
555{
556 return m_pcb->GetTitleBlock();
557}
558
559
561{
562 m_pcb->SetTitleBlock( aTitleBlock );
563}
564
565
567{
568 return m_pcb->GetDesignSettings();
569}
570
571
573{
574 m_drawBgColor= aColor;
575 m_auimgr.Update();
576}
577
578
580{
581 return m_pcb->GetPlotOptions();
582}
583
584
586{
587 m_pcb->SetPlotOptions( aSettings );
588
589 // Plot Settings can also change the "tent vias" setting, which can affect the solder mask.
590 LSET visibleLayers = GetBoard()->GetVisibleLayers();
591
592 if( visibleLayers.test( F_Mask ) || visibleLayers.test( B_Mask ) )
593 {
595 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
596 {
597 BOARD_ITEM* item = nullptr;
598
599 if( aItem->IsBOARD_ITEM() )
600 item = static_cast<BOARD_ITEM*>( aItem );
601
602 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to
603 // visible as they won't be found in the view layer's itemset for re-painting.
604 if( item && item->Type() == PCB_VIA_T )
605 return KIGFX::ALL;
606
607 return 0;
608 } );
609
610 GetCanvas()->Refresh();
611 }
612}
613
614
615BOX2I PCB_BASE_FRAME::GetBoardBoundingBox( bool aBoardEdgesOnly ) const
616{
617 BOX2I area = aBoardEdgesOnly ? m_pcb->GetBoardEdgesBoundingBox() : m_pcb->GetBoundingBox();
618
619 if( area.GetWidth() == 0 && area.GetHeight() == 0 )
620 {
621 VECTOR2I pageSize = GetPageSizeIU();
622
624 {
625 area.SetOrigin( 0, 0 );
626 area.SetEnd( pageSize.x, pageSize.y );
627 }
628 else
629 {
630 area.SetOrigin( -pageSize.x / 2, -pageSize.y / 2 );
631 area.SetEnd( pageSize.x / 2, pageSize.y / 2 );
632 }
633 }
634
635 return area;
636}
637
638
639const BOX2I PCB_BASE_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
640{
641 /* "Zoom to Fit" calls this with "aIncludeAllVisible" as true. Since that feature
642 * always ignored the page and border, this function returns a bbox without them
643 * as well when passed true. This technically is not all things visible, but it
644 * keeps behavior consistent.
645 *
646 * When passed false, this function returns a bbox of just the board edge. This
647 * allows things like fabrication text or anything else outside the board edge to
648 * be ignored, and just zooms up to the board itself.
649 *
650 * Calling "GetBoardBoundingBox(true)" when edge cuts are turned off will return
651 * the entire page and border, so we call "GetBoardBoundingBox(false)" instead.
652 */
653 if( aIncludeAllVisible || !m_pcb->IsLayerVisible( Edge_Cuts ) )
654 return GetBoardBoundingBox( false );
655 else
656 return GetBoardBoundingBox( true );
657}
658
659
660// Virtual function
662{
663}
664
665
667{
668 // call my base class
670
671 // tooltips in toolbars
673
675
676 if( viewer3D )
677 viewer3D->ShowChangedLanguage();
678}
679
680
682{
683 EDA_3D_VIEWER_FRAME* draw3DFrame = Get3DViewerFrame();
684
685 if( !draw3DFrame )
686 draw3DFrame = new EDA_3D_VIEWER_FRAME( &Kiway(), this, _( "3D Viewer" ) );
687
688 // Raising the window does not show the window on Windows if iconized. This should work
689 // on any platform.
690 if( draw3DFrame->IsIconized() )
691 draw3DFrame->Iconize( false );
692
693 draw3DFrame->Raise();
694 draw3DFrame->Show( true );
695
696 // Raising the window does not set the focus on Linux. This should work on any platform.
697 if( wxWindow::FindFocus() != draw3DFrame )
698 draw3DFrame->SetFocus();
699
700 // Allocate a slice of time to display the 3D frame
701 // a call to wxSafeYield() should be enough (and better), but on Linux we need
702 // to call wxYield()
703 // otherwise the activity messages are not displayed during the first board loading
704 wxYield();
705
706 // Note, the caller is responsible to load/update the board 3D view.
707 // after frame creation the board is not automatically created.
708
709 return draw3DFrame;
710}
711
712
714{
715 PCB_LAYER_ID preslayer = GetActiveLayer();
716 auto& displ_opts = GetDisplayOptions();
717
718 // Check if the specified layer matches the present layer
719 if( layer == preslayer )
720 return;
721
722 // Copper layers cannot be selected unconditionally; how many of those layers are
723 // currently enabled needs to be checked.
724 if( IsCopperLayer( layer ) )
725 {
726 if( layer > m_pcb->GetCopperLayerStackMaxId() )
727 return;
728 }
729
730 // Is yet more checking required? E.g. when the layer to be selected is a non-copper
731 // layer, or when switching between a copper layer and a non-copper layer, or vice-versa?
732 // ...
733
734 SetActiveLayer( layer );
735
736 if( displ_opts.m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL )
737 GetCanvas()->Refresh();
738}
739
740
742{
744 GetCanvas()->GetView() );
745
746 // account for the globals
758
759 return guide;
760}
761
762
764{
766
767 BASE_SCREEN* screen = GetScreen();
768
769 if( !screen )
770 return;
771
772 wxString line;
774
775 if( GetShowPolarCoords() ) // display polar coordinates
776 {
777 double dx = cursorPos.x - screen->m_LocalOrigin.x;
778 double dy = cursorPos.y - screen->m_LocalOrigin.y;
779 double theta = RAD2DEG( atan2( -dy, dx ) );
780 double ro = hypot( dx, dy );
781
782 line.Printf( wxT( "r %s theta %.3f" ),
783 MessageTextFromValue( ro, false ),
784 theta );
785
786 SetStatusText( line, 3 );
787 }
788
789 // Transform absolute coordinates for user origin preferences
790 double userXpos = m_originTransforms.ToDisplayAbsX( static_cast<double>( cursorPos.x ) );
791 double userYpos = m_originTransforms.ToDisplayAbsY( static_cast<double>( cursorPos.y ) );
792
793 // Display absolute coordinates:
794 line.Printf( wxT( "X %s Y %s" ),
795 MessageTextFromValue( userXpos, false ),
796 MessageTextFromValue( userYpos, false ) );
797 SetStatusText( line, 2 );
798
799 if( !GetShowPolarCoords() ) // display relative cartesian coordinates
800 {
801 // Calculate relative coordinates
802 double relXpos = cursorPos.x - screen->m_LocalOrigin.x;
803 double relYpos = cursorPos.y - screen->m_LocalOrigin.y;
804
805 // Transform relative coordinates for user origin preferences
806 userXpos = m_originTransforms.ToDisplayRelX( relXpos );
807 userYpos = m_originTransforms.ToDisplayRelY( relYpos );
808
809 line.Printf( wxT( "dx %s dy %s dist %s" ),
810 MessageTextFromValue( userXpos, false ),
811 MessageTextFromValue( userYpos, false ),
812 MessageTextFromValue( hypot( userXpos, userYpos ), false ) );
813 SetStatusText( line, 3 );
814 }
815
817}
818
819
821{
822 EDA_DRAW_FRAME::unitsChangeRefresh(); // Update the status bar.
823
824 if( GetBoard() )
826
828}
829
830
832{
834
835 if( aCfg->m_Window.grid.grids.empty() )
836 aCfg->m_Window.grid.grids = aCfg->DefaultGridSizeList();
837
838 // Move legacy user grids to grid list
839 if( !aCfg->m_Window.grid.user_grid_x.empty() )
840 {
841 aCfg->m_Window.grid.grids.emplace_back( GRID{ "User Grid", aCfg->m_Window.grid.user_grid_x,
842 aCfg->m_Window.grid.user_grid_y } );
843 aCfg->m_Window.grid.user_grid_x = wxEmptyString;
844 aCfg->m_Window.grid.user_grid_y = wxEmptyString;
845 }
846
847 // Currently values read from config file are not used because the user cannot
848 // change this config
849 // if( aCfg->m_Window.zoom_factors.empty() )
850 {
851 if( ADVANCED_CFG::GetCfg().m_HyperZoom )
853 else
855 }
856
857 // Some, but not all, derived classes have a PCBNEW_SETTINGS.
858 if( PCBNEW_SETTINGS* pcbnew_cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg ) )
859 m_polarCoords = pcbnew_cfg->m_PolarCoords;
860
861 wxASSERT( GetCanvas() );
862
863 if( GetCanvas() )
864 {
866
867 if( rs )
868 {
871 rs->SetDefaultFont( wxEmptyString ); // Always the KiCad font for PCBs
872 }
873 }
874}
875
876
878{
879 if( aErrorCode >= CLEANUP_FIRST )
880 return RPT_SEVERITY_ACTION;
881
883
884 return bds.m_DRCSeverities[ aErrorCode ];
885}
886
887
889{
891
892 // Some, but not all derived classes have a PCBNEW_SETTINGS.
893 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
894
895 if( cfg )
897}
898
899
901{
903}
904
905
907{
909}
910
911
913{
914 switch( GetFrameType() )
915 {
916 case FRAME_PCB_EDITOR:
918 default:
920
924
928 case FRAME_CVPCB:
931 }
932}
933
934
936{
938}
939
940
941void PCB_BASE_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
942{
943 EDA_DRAW_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
944
945 KIGFX::VIEW* view = GetCanvas()->GetView();
946 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( view->GetPainter() );
947 PCB_RENDER_SETTINGS* settings = painter->GetSettings();
948
949 settings->LoadColors( GetColorSettings( true ) );
952
953 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible as
954 // they won't be found in the view layer's itemset for re-painting.
956 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
957 {
958 if( dynamic_cast<RATSNEST_VIEW_ITEM*>( aItem ) )
959 {
960 return KIGFX::ALL; // ratsnest display
961 }
962 else if( dynamic_cast<PCB_TRACK*>( aItem ) )
963 {
964 return KIGFX::REPAINT; // track, arc & via clearance display
965 }
966 else if( dynamic_cast<PAD*>( aItem ) )
967 {
968 return KIGFX::REPAINT; // pad clearance display
969 }
970
971 return 0;
972 } );
973
975
977
978 // The 3D viewer isn't in the Kiway, so send its update manually
980
981 if( viewer )
982 viewer->CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
983}
984
985
987{
989
991 m_autoSaveRequired = true;
992
994
997}
998
999
1001{
1005}
1006
1007
1009{
1010 return static_cast<PCB_DRAW_PANEL_GAL*>( EDA_DRAW_FRAME::GetCanvas() );
1011}
1012
1013
1015{
1017
1018 EDA_DRAW_PANEL_GAL* canvas = GetCanvas();
1019 KIGFX::VIEW* view = canvas->GetView();
1020
1021 if( m_toolManager )
1022 {
1023 m_toolManager->SetEnvironment( m_pcb, view, canvas->GetViewControls(), config(), this );
1024
1026 }
1027
1028 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( view->GetPainter() );
1029 KIGFX::PCB_RENDER_SETTINGS* settings = painter->GetSettings();
1030 const PCB_DISPLAY_OPTIONS& displ_opts = GetDisplayOptions();
1031
1032 settings->LoadDisplayOptions( displ_opts );
1033 settings->LoadColors( GetColorSettings() );
1035
1036 view->RecacheAllItems();
1038 canvas->StartDrawing();
1039
1040 try
1041
1042 {
1043 if( m_spaceMouse == nullptr )
1044 {
1046 }
1047 }
1048 catch( const std::system_error& e )
1049 {
1050 wxLogTrace( wxT( "KI_TRACE_NAVLIB" ), e.what() );
1051 }
1052}
1053
1054
1055void PCB_BASE_FRAME::SetDisplayOptions( const PCB_DISPLAY_OPTIONS& aOptions, bool aRefresh )
1056{
1058 bool hcVisChanged = m_displayOptions.m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN
1059 || aOptions.m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN;
1060 m_displayOptions = aOptions;
1061
1062 EDA_DRAW_PANEL_GAL* canvas = GetCanvas();
1063 KIGFX::PCB_VIEW* view = static_cast<KIGFX::PCB_VIEW*>( canvas->GetView() );
1064
1065 view->UpdateDisplayOptions( aOptions );
1068
1069 // Vias on a restricted layer set must be redrawn when high contrast mode is changed
1070 if( hcChanged )
1071 {
1072 bool showNetNames = false;
1073
1074 if( PCBNEW_SETTINGS* config = dynamic_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() ) )
1075 showNetNames = config->m_Display.m_NetNames > 0;
1076
1077 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible as
1078 // they won't be found in the view layer's itemset for re-painting.
1080 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1081 {
1082 if( PCB_VIA* via = dynamic_cast<PCB_VIA*>( aItem ) )
1083 {
1084 if( via->GetViaType() != VIATYPE::THROUGH
1085 || via->GetRemoveUnconnected()
1086 || showNetNames )
1087 {
1088 return hcVisChanged ? KIGFX::ALL : KIGFX::REPAINT;
1089 }
1090 }
1091 else if( PAD* pad = dynamic_cast<PAD*>( aItem ) )
1092 {
1093 if( pad->GetRemoveUnconnected()
1094 || showNetNames )
1095 {
1096 return hcVisChanged ? KIGFX::ALL : KIGFX::REPAINT;
1097 }
1098 }
1099
1100 return 0;
1101 } );
1102 }
1103
1104 if( aRefresh )
1105 canvas->Refresh();
1106}
1107
1108
1110{
1111 wxLogTrace( "KICAD_LIB_WATCH", "setFPWatcher" );
1112
1113 Unbind( wxEVT_FSWATCHER, &PCB_BASE_FRAME::OnFPChange, this );
1114
1115 if( m_watcher )
1116 {
1117 wxLogTrace( "KICAD_LIB_WATCH", "Remove watch" );
1118 m_watcher->RemoveAll();
1119 m_watcher->SetOwner( nullptr );
1120 m_watcher.reset();
1121 }
1122
1123 wxString libfullname;
1125
1126 if( !aFootprint || !tbl )
1127 return;
1128
1129 try
1130 {
1131 const FP_LIB_TABLE_ROW* row = tbl->FindRow( aFootprint->GetFPID().GetLibNickname() );
1132
1133 if( !row )
1134 return;
1135
1136 libfullname = row->GetFullURI( true );
1137 }
1138 catch( const std::exception& e )
1139 {
1140 DisplayInfoMessage( this, e.what() );
1141 return;
1142 }
1143 catch( const IO_ERROR& error )
1144 {
1145 wxLogTrace( "KICAD_LIB_WATCH", "Error: %s", error.What() );
1146 return;
1147 }
1148
1149 m_watcherFileName.Assign( libfullname, aFootprint->GetFPID().GetLibItemName(),
1151
1152 if( !m_watcherFileName.FileExists() )
1153 return;
1154
1155 m_watcherLastModified = m_watcherFileName.GetModificationTime();
1156
1157 Bind( wxEVT_FSWATCHER, &PCB_BASE_FRAME::OnFPChange, this );
1158 m_watcher = std::make_unique<wxFileSystemWatcher>();
1159 m_watcher->SetOwner( this );
1160
1161 wxFileName fn;
1162 fn.AssignDir( m_watcherFileName.GetPath() );
1163 fn.DontFollowLink();
1164
1165 wxLogTrace( "KICAD_LIB_WATCH", "Add watch: %s", fn.GetPath() );
1166
1167 m_watcher->Add( fn );
1168}
1169
1170
1171void PCB_BASE_FRAME::OnFPChange( wxFileSystemWatcherEvent& aEvent )
1172{
1173 if( aEvent.GetPath() != m_watcherFileName.GetFullPath() )
1174 return;
1175
1176 // Start the debounce timer (set to 1 second)
1177 if( !m_watcherDebounceTimer.StartOnce( 1000 ) )
1178 {
1179 wxLogTrace( "KICAD_LIB_WATCH", "Failed to start the debounce timer" );
1180 return;
1181 }
1182}
1183
1184
1186{
1187 wxLogTrace( "KICAD_LIB_WATCH", "OnFpChangeDebounceTimer" );
1188
1189 // Disable logging to avoid spurious messages and check if the file has changed
1190 wxLog::EnableLogging( false );
1191 wxDateTime lastModified = m_watcherFileName.GetModificationTime();
1192 wxLog::EnableLogging( true );
1193
1194 if( lastModified == m_watcherLastModified || !lastModified.IsValid() )
1195 return;
1196
1197 m_watcherLastModified = lastModified;
1198
1201
1202 // When loading a footprint from a library in the footprint editor
1203 // the items UUIDs must be keep and not reinitialized
1204 bool keepUUID = IsType( FRAME_FOOTPRINT_EDITOR );
1205
1206 if( !fp || !tbl )
1207 return;
1208
1210 || IsOK( this, _( "The library containing the current footprint has changed.\n"
1211 "Do you want to reload the footprint?" ) ) )
1212 {
1213 wxString fpname = fp->GetFPID().GetLibItemName();
1214 wxString nickname = fp->GetFPID().GetLibNickname();
1215
1216 try
1217 {
1218 FOOTPRINT* newfp = tbl->FootprintLoad( nickname, fpname, keepUUID );
1219
1220 if( newfp )
1221 {
1222 std::vector<KIID> selectedItems;
1223
1224 for( const EDA_ITEM* item : GetCurrentSelection() )
1225 {
1226 wxString uuidStr = item->m_Uuid.AsString();
1227 selectedItems.emplace_back( item->m_Uuid );
1228 }
1229
1231
1232 ReloadFootprint( newfp );
1233
1234 newfp->ClearAllNets();
1238
1239 std::vector<EDA_ITEM*> sel;
1240
1241 for( const KIID& uuid : selectedItems )
1242 {
1243 BOARD_ITEM* item = GetBoard()->GetItem( uuid );
1244
1245 if( item != DELETED_BOARD_ITEM::GetInstance() )
1246 sel.push_back( item );
1247 }
1248
1249 if( !sel.empty() )
1251 }
1252 }
1253 catch( const IO_ERROR& ioe )
1254 {
1255 DisplayError( this, ioe.What() );
1256 }
1257 }
1258}
@ 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:186
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:212
Information pertinent to a Pcbnew printed circuit board.
Definition: board.h:290
void SetPlotOptions(const PCB_PLOT_PARAMS &aOptions)
Definition: board.h:693
PCB_LAYER_ID GetCopperLayerStackMaxId() const
Definition: board.cpp:750
LSET GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
Definition: board.cpp:789
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
Definition: board.cpp:1000
const BOX2I GetBoardEdgesBoundingBox() const
Return the board bounding box calculated using exclusively the board edges (graphics on Edge....
Definition: board.h:929
const BOX2I GetBoundingBox() const override
Return the orthogonal bounding box of this object for display purposes.
Definition: board.h:915
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Test whether a given element category is visible.
Definition: board.cpp:841
const PAGE_INFO & GetPageSettings() const
Definition: board.h:689
void UpdateUserUnits(BOARD_ITEM *aItem, KIGFX::VIEW *aView)
Update any references within aItem (or its descendants) to the user units.
Definition: board.cpp:1331
BOARD_ITEM * GetItem(const KIID &aID) const
Definition: board.cpp:1408
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:448
TITLE_BLOCK & GetTitleBlock()
Definition: board.h:695
void IncrementTimeStamp()
Definition: board.cpp:255
void SetPageSettings(const PAGE_INFO &aPageSettings)
Definition: board.h:690
const PCB_PLOT_PARAMS & GetPlotOptions() const
Definition: board.h:692
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:781
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition: board.cpp:892
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
Definition: board.h:697
void SetUserUnits(EDA_UNITS aUnits)
Definition: board.h:702
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:475
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:89
void SetFlags(EDA_ITEM_FLAGS aMask)
Definition: eda_item.h:127
const KIID m_Uuid
Definition: eda_item.h:489
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
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:2387
void SetOrientation(const EDA_ANGLE &aNewAngle)
Definition: footprint.cpp:2457
bool IsFlipped() const
Definition: footprint.h:391
const LIB_ID & GetFPID() const
Definition: footprint.h:248
void ClearAllNets()
Clear (i.e.
Definition: footprint.cpp:1015
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
Definition: footprint.cpp:2329
VECTOR2I GetPosition() const override
Definition: footprint.h:224
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:173
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:178
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:84
bool IsBOARD_ITEM() const
Definition: view_item.h:100
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:522
bool HasItem(const VIEW_ITEM *aItem) const
Indicates whether or not the given item has been added to the view.
Definition: view.cpp:1655
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:459
void RecacheAllItems()
Rebuild GAL display lists.
Definition: view.cpp:1435
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1545
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:217
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:1555
Definition: kiid.h:49
wxString AsString() const
Definition: kiid.cpp:238
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:284
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:36
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: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.
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 BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Returns bbox 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
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)
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: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:1591
@ 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)
Tests whether a layer is a copper layer.
Definition: layer_ids.h:531
@ LAYER_FOOTPRINTS_FR
show footprints on front
Definition: layer_ids.h:209
@ LAYER_FP_REFERENCES
show footprints references (when texts are visible)
Definition: layer_ids.h:212
@ LAYER_PADS
Meta control for all pads opacity/visibility (color ignored)
Definition: layer_ids.h:231
@ LAYER_TRACKS
Definition: layer_ids.h:213
@ LAYER_FP_TEXT
Definition: layer_ids.h:199
@ LAYER_FOOTPRINTS_BK
show footprints on back
Definition: layer_ids.h:210
@ LAYER_FP_VALUES
show footprints values (when texts are visible)
Definition: layer_ids.h:211
@ LAYER_VIAS
Meta control for all vias opacity/visibility.
Definition: layer_ids.h:194
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: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:1060
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:691
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