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>
55#include <trace_helpers.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
71#ifdef __linux__
73#else
75#endif
76
79
80wxDEFINE_EVENT( EDA_EVT_BOARD_CHANGING, wxCommandEvent );
81wxDEFINE_EVENT( EDA_EVT_BOARD_CHANGED, wxCommandEvent );
82
83PCB_BASE_FRAME::PCB_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType,
84 const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize,
85 long aStyle, const wxString& aFrameName ) :
86 EDA_DRAW_FRAME( aKiway, aParent, aFrameType, aTitle, aPos, aSize, aStyle, aFrameName, pcbIUScale ),
87 m_pcb( nullptr ),
88 m_originTransforms( *this ),
90{
92}
93
94
96{
97 // Ensure m_canvasType is up to date, to save it in config
98 if( GetCanvas() )
100
101 delete m_pcb;
102 m_pcb = nullptr;
103}
104
105
106bool PCB_BASE_FRAME::canCloseWindow( wxCloseEvent& aEvent )
107{
108 // Close modeless dialogs. They're trouble when they get destroyed after the frame and/or
109 // board.
110 wxWindow* viewer3D = Get3DViewerFrame();
111
112 if( viewer3D )
113 viewer3D->Close( true );
114
115 // Similarly, wxConvBrokenFileNames uses some statically allocated variables that make it
116 // crash when run later from a d'tor.
118
119 return true;
120}
121
122
123void PCB_BASE_FRAME::handleActivateEvent( wxActivateEvent& aEvent )
124{
126
127 if( m_spaceMouse )
128 m_spaceMouse->SetFocus( aEvent.GetActive() );
129}
130
131
132void PCB_BASE_FRAME::handleIconizeEvent( wxIconizeEvent& aEvent )
133{
135
136 if( m_spaceMouse && aEvent.IsIconized() )
137 m_spaceMouse->SetFocus( false );
138}
139
140
142{
143 wxWindow* frame = FindWindowByName( QUALIFIED_VIEWER3D_FRAMENAME( this ) );
144 return dynamic_cast<EDA_3D_VIEWER_FRAME*>( frame );
145}
146
147
148void PCB_BASE_FRAME::Update3DView( bool aMarkDirty, bool aRefresh, const wxString* aTitle )
149{
150 EDA_3D_VIEWER_FRAME* draw3DFrame = Get3DViewerFrame();
151
152 if( draw3DFrame )
153 {
154 if( aTitle )
155 draw3DFrame->SetTitle( *aTitle );
156
157 if( aMarkDirty )
158 draw3DFrame->ReloadRequest();
159
160 if( aRefresh )
161 draw3DFrame->Redraw();
162 }
163}
164
165
167{
168 if( m_pcb != aBoard )
169 {
170 delete m_pcb;
171 m_pcb = aBoard;
172
173 if( GetBoard() )
175
176 if( GetBoard() && GetCanvas() )
177 {
179
180 if( rs )
181 {
182 rs->SetDashLengthRatio( GetBoard()->GetPlotOptions().GetDashedLineDashRatio() );
183 rs->SetGapLengthRatio( GetBoard()->GetPlotOptions().GetDashedLineGapRatio() );
184 }
185 }
186
187 wxCommandEvent e( EDA_EVT_BOARD_CHANGED );
188 ProcessEventLocally( e );
189 }
190}
191
192
194{
195 if( aFootprint )
196 {
197 GetBoard()->Add( aFootprint, ADD_MODE::APPEND );
198
199 aFootprint->SetFlags( IS_NEW );
200 aFootprint->SetPosition( VECTOR2I( 0, 0 ) ); // cursor in GAL may not be initialized yet
201
202 // Put it on FRONT layer (note that it might be stored flipped if the lib is an archive
203 // built from a board)
204 if( aFootprint->IsFlipped() )
205 aFootprint->Flip( aFootprint->GetPosition(), GetPcbNewSettings()->m_FlipDirection );
206
207 // Place it in orientation 0 even if it is not saved with orientation 0 in lib (note that
208 // it might be stored in another orientation if the lib is an archive built from a board)
209 aFootprint->SetOrientation( ANGLE_0 );
210
211 GetBoard()->UpdateUserUnits( aFootprint, GetCanvas()->GetView() );
212
214 }
215}
216
217
218EDA_ITEM* PCB_BASE_FRAME::ResolveItem( const KIID& aId, bool aAllowNullptrReturn ) const
219{
220 return GetBoard()->ResolveItem( aId, aAllowNullptrReturn );
221}
222
223void PCB_BASE_FRAME::FocusOnItem( EDA_ITEM* aItem, bool aAllowScroll )
224{
225 // nullptr will clear the current focus
226 if( aItem != nullptr && !aItem->IsBOARD_ITEM() )
227 return;
228
229 FocusOnItem( static_cast<BOARD_ITEM*>( aItem ), UNDEFINED_LAYER, aAllowScroll );
230}
231
232void PCB_BASE_FRAME::FocusOnItem( BOARD_ITEM* aItem, PCB_LAYER_ID aLayer, bool aAllowScroll )
233{
234 std::vector<BOARD_ITEM*> items;
235
236 if( aItem )
237 items.push_back( aItem );
238
239 FocusOnItems( items, aLayer, aAllowScroll );
240}
241
242
243void PCB_BASE_FRAME::FocusOnItems( std::vector<BOARD_ITEM*> aItems, PCB_LAYER_ID aLayer, bool aAllowScroll )
244{
245 static std::vector<KIID> lastBrightenedItemIDs;
246
247 bool itemsUnbrightened = false;
248
249 for( KIID lastBrightenedItemID : lastBrightenedItemIDs )
250 {
251 if( BOARD_ITEM* lastItem = GetBoard()->ResolveItem( lastBrightenedItemID, true ) )
252 {
253 lastItem->ClearBrightened();
254 GetCanvas()->GetView()->Update( lastItem );
255 itemsUnbrightened = true;
256 }
257 }
258
259 if( itemsUnbrightened )
260 GetCanvas()->Refresh();
261
262 lastBrightenedItemIDs.clear();
263
264 if( aItems.empty() )
265 return;
266
267 VECTOR2I focusPt;
268 KIGFX::VIEW* view = GetCanvas()->GetView();
269 SHAPE_POLY_SET viewportPoly( view->GetViewport() );
270
271 for( wxWindow* dialog : findDialogs() )
272 {
273 wxPoint dialogPos = GetCanvas()->ScreenToClient( dialog->GetScreenPosition() );
274 SHAPE_POLY_SET dialogPoly( BOX2D( view->ToWorld( ToVECTOR2D( dialogPos ), true ),
275 view->ToWorld( ToVECTOR2D( dialog->GetSize() ), false ) ) );
276
277 try
278 {
279 viewportPoly.BooleanSubtract( dialogPoly );
280 }
281 catch( const std::exception& e )
282 {
283 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
284 }
285 }
286
287 SHAPE_POLY_SET itemPoly, clippedPoly;
288
289 for( BOARD_ITEM* item : aItems )
290 {
291 if( item && item != DELETED_BOARD_ITEM::GetInstance() )
292 {
293 item->SetBrightened();
294 lastBrightenedItemIDs.push_back( item->m_Uuid );
295
296 item->RunOnChildren(
297 [&]( BOARD_ITEM* child )
298 {
299 child->SetBrightened();
300 lastBrightenedItemIDs.push_back( child->m_Uuid );
301 },
303
304 GetCanvas()->GetView()->Update( item );
305
306 // Focus on the object's location. Prefer a visible part of the object to its anchor
307 // in order to keep from scrolling around.
308
309 focusPt = item->GetPosition();
310
311 if( aLayer == UNDEFINED_LAYER && item->GetLayerSet().any() )
312 aLayer = item->GetLayerSet().Seq()[0];
313
314 switch( item->Type() )
315 {
316 case PCB_FOOTPRINT_T:
317 try
318 {
319 itemPoly = static_cast<FOOTPRINT*>( item )->GetBoundingHull();
320 }
321 catch( const std::exception& e )
322 {
323 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
324 }
325
326 break;
327
328 case PCB_PAD_T:
329 case PCB_MARKER_T:
330 case PCB_VIA_T:
331 FocusOnLocation( item->GetFocusPosition(), aAllowScroll );
332 GetCanvas()->Refresh();
333 return;
334
335 case PCB_SHAPE_T:
336 case PCB_FIELD_T:
337 case PCB_TEXT_T:
338 case PCB_TEXTBOX_T:
339 case PCB_BARCODE_T:
340 case PCB_TRACE_T:
341 case PCB_ARC_T:
343 case PCB_DIM_LEADER_T:
344 case PCB_DIM_CENTER_T:
345 case PCB_DIM_RADIAL_T:
347 item->TransformShapeToPolygon( itemPoly, aLayer, 0, pcbIUScale.mmToIU( 0.1 ), ERROR_INSIDE );
348 break;
349
350 case PCB_ZONE_T:
351 {
352 ZONE* zone = static_cast<ZONE*>( item );
353#if 0
354 // Using the filled area shapes to find a Focus point can give good results, but
355 // unfortunately the calculations are highly time consuming, even for not very
356 // large areas (can be easily a few minutes for large areas).
357 // so we used only the zone outline that usually do not have too many vertices.
358 zone->TransformShapeToPolygon( itemPoly, aLayer, 0, pcbIUScale.mmToIU( 0.1 ), ERROR_INSIDE );
359
360 if( itemPoly.IsEmpty() )
361 itemPoly = *zone->Outline();
362#else
363 // much faster calculation time when using only the zone outlines
364 itemPoly = *zone->Outline();
365#endif
366
367 break;
368 }
369
370 default:
371 {
372 BOX2I item_bbox = item->GetBoundingBox();
373 itemPoly.NewOutline();
374 itemPoly.Append( item_bbox.GetOrigin() );
375 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( item_bbox.GetWidth(), 0 ) );
376 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( 0, item_bbox.GetHeight() ) );
377 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( item_bbox.GetWidth(),
378 item_bbox.GetHeight() ) );
379 break;
380 }
381 }
382
383 try
384 {
385 itemPoly.ClearArcs();
386 viewportPoly.ClearArcs();
387 clippedPoly.BooleanIntersection( itemPoly, viewportPoly );
388 }
389 catch( const std::exception& e )
390 {
391 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
392 }
393
394 if( !clippedPoly.IsEmpty() )
395 itemPoly = clippedPoly;
396 }
397 }
398
399 /*
400 * Perform a step-wise deflate to find the visual-center-of-mass
401 */
402
403 BOX2I bbox = itemPoly.BBox();
404 int step = std::min( bbox.GetWidth(), bbox.GetHeight() ) / 10;
405
406 while( !itemPoly.IsEmpty() )
407 {
408 focusPt = itemPoly.BBox().Centre();
409
410 try
411 {
413 }
414 catch( const std::exception& e )
415 {
416 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
417 }
418 }
419
420 FocusOnLocation( focusPt, aAllowScroll );
421
422 GetCanvas()->Refresh();
423}
424
425
427{
428 KIGFX::PCB_VIEW* view = GetCanvas()->GetView();
429
430 if( view && GetBoard()->m_SolderMaskBridges && view->HasItem( GetBoard()->m_SolderMaskBridges ) )
431 view->Remove( GetBoard()->m_SolderMaskBridges );
432}
433
434
436{
437 KIGFX::PCB_VIEW* view = GetCanvas()->GetView();
438
439 if( view && GetBoard()->m_SolderMaskBridges )
440 {
441 if( view->HasItem( GetBoard()->m_SolderMaskBridges ) )
442 view->Remove( GetBoard()->m_SolderMaskBridges );
443
444 view->Add( GetBoard()->m_SolderMaskBridges );
445 }
446}
447
448
449void PCB_BASE_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
450{
451 m_pcb->SetPageSettings( aPageSettings );
452
453 if( GetScreen() )
454 GetScreen()->InitDataPoints( aPageSettings.GetSizeIU( pcbIUScale.IU_PER_MILS ) );
455}
456
457
459{
460 return m_pcb->GetPageSettings();
461}
462
463
465{
466 // this function is only needed because EDA_DRAW_FRAME is not compiled
467 // with either -DPCBNEW or -DEESCHEMA, so the virtual is used to route
468 // into an application specific source file.
469 return m_pcb->GetPageSettings().GetSizeIU( pcbIUScale.IU_PER_MILS );
470}
471
472
474{
475 return m_pcb->GetDesignSettings().GetGridOrigin();
476}
477
478
480{
481 m_pcb->GetDesignSettings().SetGridOrigin( aPoint );
482}
483
484
486{
487 return m_pcb->GetDesignSettings().GetAuxOrigin();
488}
489
490
492{
493 VECTOR2I origin( 0, 0 );
494
495 switch( GetPcbNewSettings()->m_Display.m_DisplayOrigin )
496 {
498 case PCB_DISPLAY_ORIGIN::PCB_ORIGIN_AUX: origin = GetAuxOrigin(); break;
500 default: wxASSERT( false ); break;
501 }
502
503 return origin;
504}
505
510
511
513{
514 return m_pcb->GetTitleBlock();
515}
516
517
519{
520 m_pcb->SetTitleBlock( aTitleBlock );
521}
522
523
525{
526 return m_pcb->GetDesignSettings();
527}
528
529
531{
532 m_drawBgColor= aColor;
533 m_auimgr.Update();
534}
535
536
538{
539 return m_pcb->GetPlotOptions();
540}
541
542
544{
545 m_pcb->SetPlotOptions( aSettings );
546
547 // Plot Settings can also change the "tent vias" setting, which can affect the solder mask.
548 LSET visibleLayers = GetBoard()->GetVisibleLayers();
549
550 if( visibleLayers.test( F_Mask ) || visibleLayers.test( B_Mask ) )
551 {
553 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
554 {
555 BOARD_ITEM* item = nullptr;
556
557 if( aItem->IsBOARD_ITEM() )
558 item = static_cast<BOARD_ITEM*>( aItem );
559
560 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to
561 // visible as they won't be found in the view layer's itemset for re-painting.
562 if( item && item->Type() == PCB_VIA_T )
563 return KIGFX::ALL;
564
565 return 0;
566 } );
567
568 GetCanvas()->Refresh();
569 }
570}
571
572
573BOX2I PCB_BASE_FRAME::GetBoardBoundingBox( bool aBoardEdgesOnly ) const
574{
575 BOX2I area = aBoardEdgesOnly ? m_pcb->GetBoardEdgesBoundingBox() : m_pcb->GetBoundingBox();
576
577 if( area.GetWidth() == 0 && area.GetHeight() == 0 )
578 {
579 VECTOR2I pageSize = GetPageSizeIU();
580
582 {
583 area.SetOrigin( 0, 0 );
584 area.SetEnd( pageSize.x, pageSize.y );
585 }
586 else
587 {
588 area.SetOrigin( -pageSize.x / 2, -pageSize.y / 2 );
589 area.SetEnd( pageSize.x / 2, pageSize.y / 2 );
590 }
591 }
592
593 return area;
594}
595
596
597const BOX2I PCB_BASE_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
598{
599 /* "Zoom to Fit" calls this with "aIncludeAllVisible" as true. Since that feature
600 * always ignored the page and border, this function returns a bbox without them
601 * as well when passed true. This technically is not all things visible, but it
602 * keeps behavior consistent.
603 *
604 * When passed false, this function returns a bbox of just the board edge. This
605 * allows things like fabrication text or anything else outside the board edge to
606 * be ignored, and just zooms up to the board itself.
607 *
608 * Calling "GetBoardBoundingBox(true)" when edge cuts are turned off will return
609 * the entire page and border, so we call "GetBoardBoundingBox(false)" instead.
610 */
611 if( aIncludeAllVisible || !m_pcb->IsLayerVisible( Edge_Cuts ) )
612 return GetBoardBoundingBox( false );
613 else
614 return GetBoardBoundingBox( true );
615}
616
617
618// Virtual function
622
623
625{
626 // call my base class
628
629 // tooltips in toolbars
631
633
634 if( viewer3D )
635 viewer3D->ShowChangedLanguage();
636}
637
638
640{
641 EDA_3D_VIEWER_FRAME* draw3DFrame = Get3DViewerFrame();
642
643 if( !draw3DFrame )
644 draw3DFrame = new EDA_3D_VIEWER_FRAME( &Kiway(), this, _( "3D Viewer" ) );
645
646 // Raising the window does not show the window on Windows if iconized. This should work
647 // on any platform.
648 if( draw3DFrame->IsIconized() )
649 draw3DFrame->Iconize( false );
650
651 draw3DFrame->Raise();
652 draw3DFrame->Show( true );
653
654 // Raising the window does not set the focus on Linux. This should work on any platform.
655 if( wxWindow::FindFocus() != draw3DFrame )
656 draw3DFrame->SetFocus();
657
658 // Allocate a slice of time to display the 3D frame
659 // a call to wxSafeYield() should be enough (and better), but on Linux we need
660 // to call wxYield()
661 // otherwise the activity messages are not displayed during the first board loading
662 wxYield();
663
664 // Note, the caller is responsible to load/update the board 3D view.
665 // after frame creation the board is not automatically created.
666
667 return draw3DFrame;
668}
669
670
672{
673 PCB_LAYER_ID preslayer = GetActiveLayer();
674 auto& displ_opts = GetDisplayOptions();
675
676 // Check if the specified layer matches the present layer
677 if( layer == preslayer )
678 return;
679
680 // Copper layers cannot be selected unconditionally; how many of those layers are
681 // currently enabled needs to be checked.
682 if( IsCopperLayer( layer ) )
683 {
684 if( layer > m_pcb->GetCopperLayerStackMaxId() )
685 return;
686 }
687
688 // Is yet more checking required? E.g. when the layer to be selected is a non-copper
689 // layer, or when switching between a copper layer and a non-copper layer, or vice-versa?
690 // ...
691
692 SetActiveLayer( layer );
693
694 if( displ_opts.m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL )
695 GetCanvas()->Refresh();
696}
697
698
700{
701 GENERAL_COLLECTORS_GUIDE guide( m_pcb->GetVisibleLayers(), GetActiveLayer(),
702 GetCanvas()->GetView() );
703
704 // account for the globals
705 guide.SetIgnoreFPTextOnBack( !m_pcb->IsElementVisible( LAYER_FP_TEXT ) );
706 guide.SetIgnoreFPTextOnFront( !m_pcb->IsElementVisible( LAYER_FP_TEXT ) );
707 guide.SetIgnoreFootprintsOnBack( !m_pcb->IsElementVisible( LAYER_FOOTPRINTS_BK ) );
708 guide.SetIgnoreFootprintsOnFront( !m_pcb->IsElementVisible( LAYER_FOOTPRINTS_FR ) );
709 guide.SetIgnoreThroughHolePads( ! m_pcb->IsElementVisible( LAYER_PADS ) );
710 guide.SetIgnoreFPValues( !m_pcb->IsElementVisible( LAYER_FP_VALUES ) );
711 guide.SetIgnoreFPReferences( !m_pcb->IsElementVisible( LAYER_FP_REFERENCES ) );
712 guide.SetIgnoreThroughVias( ! m_pcb->IsElementVisible( LAYER_VIAS ) );
713 guide.SetIgnoreBlindBuriedVias( ! m_pcb->IsElementVisible( LAYER_VIAS ) );
714 guide.SetIgnoreMicroVias( ! m_pcb->IsElementVisible( LAYER_VIAS ) );
715 guide.SetIgnoreTracks( ! m_pcb->IsElementVisible( LAYER_TRACKS ) );
716
717 return guide;
718}
719
720
722{
724
725 BASE_SCREEN* screen = GetScreen();
726
727 if( !screen )
728 return;
729
730 wxString line;
732
733 if( GetShowPolarCoords() ) // display polar coordinates
734 {
735 double dx = cursorPos.x - screen->m_LocalOrigin.x;
736 double dy = cursorPos.y - screen->m_LocalOrigin.y;
737 double theta = RAD2DEG( atan2( -dy, dx ) );
738 double ro = hypot( dx, dy );
739
740 line.Printf( wxT( "r %s theta %.3f" ),
741 MessageTextFromValue( ro, false ),
742 theta );
743
744 SetStatusText( line, 3 );
745 }
746
747 // Transform absolute coordinates for user origin preferences
748 double userXpos = m_originTransforms.ToDisplayAbsX( static_cast<double>( cursorPos.x ) );
749 double userYpos = m_originTransforms.ToDisplayAbsY( static_cast<double>( cursorPos.y ) );
750
751 // Display absolute coordinates:
752 line.Printf( wxT( "X %s Y %s" ),
753 MessageTextFromValue( userXpos, false ),
754 MessageTextFromValue( userYpos, false ) );
755 SetStatusText( line, 2 );
756
757 if( !GetShowPolarCoords() ) // display relative cartesian coordinates
758 {
759 // Calculate relative coordinates
760 double relXpos = cursorPos.x - screen->m_LocalOrigin.x;
761 double relYpos = cursorPos.y - screen->m_LocalOrigin.y;
762
763 // Transform relative coordinates for user origin preferences
764 userXpos = m_originTransforms.ToDisplayRelX( relXpos );
765 userYpos = m_originTransforms.ToDisplayRelY( relYpos );
766
767 line.Printf( wxT( "dx %s dy %s dist %s" ),
768 MessageTextFromValue( userXpos, false ),
769 MessageTextFromValue( userYpos, false ),
770 MessageTextFromValue( hypot( userXpos, userYpos ), false ) );
771 SetStatusText( line, 3 );
772 }
773
775}
776
777
779{
780 EDA_DRAW_FRAME::unitsChangeRefresh(); // Update the status bar.
781
782 if( GetBoard() )
784
786}
787
788
790{
792
793 // Move legacy user grids to grid list
794 if( !aCfg->m_Window.grid.user_grid_x.empty() )
795 {
796 aCfg->m_Window.grid.grids.emplace_back( GRID{ "User Grid", aCfg->m_Window.grid.user_grid_x,
797 aCfg->m_Window.grid.user_grid_y } );
798 aCfg->m_Window.grid.user_grid_x = wxEmptyString;
799 aCfg->m_Window.grid.user_grid_y = wxEmptyString;
800 }
801
802 // Some, but not all, derived classes have a PCBNEW_SETTINGS.
803 if( PCBNEW_SETTINGS* pcbnew_cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg ) )
804 m_polarCoords = pcbnew_cfg->m_PolarCoords;
805
806 wxASSERT( GetCanvas() );
807
808 if( GetCanvas() )
809 {
811
812 if( rs )
813 {
816 rs->SetDefaultFont( wxEmptyString ); // Always the KiCad font for PCBs
817 }
818 }
819}
820
821
823{
824 if( aErrorCode >= CLEANUP_FIRST )
825 return RPT_SEVERITY_ACTION;
826
828
829 return bds.m_DRCSeverities[ aErrorCode ];
830}
831
832
834{
836
837 // Some, but not all derived classes have a PCBNEW_SETTINGS.
838 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
839
840 if( cfg )
842}
843
844
849
850
855
856
878
879
881{
882 static MAGNETIC_SETTINGS fallback;
883
885 return &cfg->m_MagneticItems;
886
887 return &fallback;
888}
889
890
892{
894
895 KIGFX::VIEW* view = GetCanvas()->GetView();
896 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( view->GetPainter() );
897 PCB_RENDER_SETTINGS* settings = painter->GetSettings();
898
899 settings->LoadColors( GetColorSettings( true ) );
902
903 if( aFlags & TEXTVARS_CHANGED )
905
906 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible as
907 // they won't be found in the view layer's itemset for re-painting.
909 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
910 {
911 if( dynamic_cast<RATSNEST_VIEW_ITEM*>( aItem ) )
912 {
913 return KIGFX::ALL; // ratsnest display
914 }
915 else if( dynamic_cast<PCB_TRACK*>( aItem ) )
916 {
917 return KIGFX::REPAINT; // track, arc & via clearance display
918 }
919 else if( dynamic_cast<PAD*>( aItem ) )
920 {
921 return KIGFX::REPAINT; // pad clearance display
922 }
923 else if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
924 {
925 if( text->HasTextVars() )
926 {
927 text->ClearRenderCache();
928 text->ClearBoundingBoxCache();
930 }
931 }
932
933 return 0;
934 } );
935
937
939
940 // The 3D viewer isn't in the Kiway, so send its update manually
942
943 if( viewer )
944 viewer->CommonSettingsChanged( aFlags );
945}
946
947
949{
951
954
955 if( m_isClosing )
956 return;
957
960}
961
962
969
970
975
976
978{
980
981 EDA_DRAW_PANEL_GAL* canvas = GetCanvas();
982 KIGFX::VIEW* view = canvas->GetView();
983
984 if( m_toolManager )
985 {
986 m_toolManager->SetEnvironment( m_pcb, view, canvas->GetViewControls(), config(), this );
987
989 }
990
991 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( view->GetPainter() );
992 KIGFX::PCB_RENDER_SETTINGS* settings = painter->GetSettings();
993 const PCB_DISPLAY_OPTIONS& displ_opts = GetDisplayOptions();
994
995 settings->LoadDisplayOptions( displ_opts );
996 settings->LoadColors( GetColorSettings() );
998
999 view->RecacheAllItems();
1001 canvas->StartDrawing();
1002
1003 try
1004
1005 {
1006 if( !m_spaceMouse )
1007 {
1008#ifndef __linux__
1009 m_spaceMouse = std::make_unique<NL_PCBNEW_PLUGIN>( GetCanvas() );
1010#else
1011 m_spaceMouse = std::make_unique<SPNAV_2D_PLUGIN>( GetCanvas() );
1012 m_spaceMouse->SetScale( 0.01 );
1013#endif
1014 }
1015 }
1016 catch( const std::system_error& e )
1017 {
1018 wxLogTrace( wxT( "KI_TRACE_NAVLIB" ), e.what() );
1019 }
1020}
1021
1022
1023void PCB_BASE_FRAME::SetDisplayOptions( const PCB_DISPLAY_OPTIONS& aOptions, bool aRefresh )
1024{
1025 bool hcChanged = m_displayOptions.m_ContrastModeDisplay != aOptions.m_ContrastModeDisplay;
1026 bool hcVisChanged = m_displayOptions.m_ContrastModeDisplay == HIGH_CONTRAST_MODE::HIDDEN
1028 m_displayOptions = aOptions;
1029
1030 EDA_DRAW_PANEL_GAL* canvas = GetCanvas();
1031 KIGFX::PCB_VIEW* view = static_cast<KIGFX::PCB_VIEW*>( canvas->GetView() );
1032
1033 view->UpdateDisplayOptions( aOptions );
1036
1037 // Vias on a restricted layer set must be redrawn when high contrast mode is changed
1038 if( hcChanged )
1039 {
1040 bool showNetNames = false;
1041
1042 if( PCBNEW_SETTINGS* config = dynamic_cast<PCBNEW_SETTINGS*>( Kiface().KifaceSettings() ) )
1043 showNetNames = config->m_Display.m_NetNames > 0;
1044
1045 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible as
1046 // they won't be found in the view layer's itemset for re-painting.
1048 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
1049 {
1050 if( PCB_VIA* via = dynamic_cast<PCB_VIA*>( aItem ) )
1051 {
1052 if( via->GetViaType() != VIATYPE::THROUGH
1053 || via->GetRemoveUnconnected()
1054 || showNetNames )
1055 {
1056 return hcVisChanged ? KIGFX::ALL : KIGFX::REPAINT;
1057 }
1058 }
1059 else if( PAD* pad = dynamic_cast<PAD*>( aItem ) )
1060 {
1061 if( pad->GetRemoveUnconnected()
1062 || showNetNames )
1063 {
1064 return hcVisChanged ? KIGFX::ALL : KIGFX::REPAINT;
1065 }
1066 }
1067
1068 return 0;
1069 } );
1070 }
1071
1072 if( aRefresh )
1073 canvas->Refresh();
1074}
1075
1076
1078{
1079 wxLogTrace( traceLibWatch, "setFPWatcher" );
1080
1081 Unbind( wxEVT_FSWATCHER, &PCB_BASE_FRAME::OnFPChange, this );
1082
1083 if( m_watcher )
1084 {
1085 wxLogTrace( traceLibWatch, "Remove watch" );
1086 m_watcher->RemoveAll();
1087 m_watcher->SetOwner( nullptr );
1088 m_watcher.reset();
1089 }
1090
1091 wxString libfullname;
1093
1094 if( !aFootprint || !tbl )
1095 return;
1096
1097 try
1098 {
1099 const FP_LIB_TABLE_ROW* row = tbl->FindRow( aFootprint->GetFPID().GetLibNickname() );
1100
1101 if( !row )
1102 return;
1103
1104 libfullname = row->GetFullURI( true );
1105 }
1106 catch( const std::exception& e )
1107 {
1108 DisplayInfoMessage( this, e.what() );
1109 return;
1110 }
1111 catch( const IO_ERROR& error )
1112 {
1113 wxLogTrace( traceLibWatch, "Error: %s", error.What() );
1114 return;
1115 }
1116
1117 m_watcherFileName.Assign( libfullname, aFootprint->GetFPID().GetLibItemName(),
1119
1120 if( !m_watcherFileName.FileExists() )
1121 return;
1122
1123 m_watcherLastModified = m_watcherFileName.GetModificationTime();
1124
1125 Bind( wxEVT_FSWATCHER, &PCB_BASE_FRAME::OnFPChange, this );
1126 m_watcher = std::make_unique<wxFileSystemWatcher>();
1127 m_watcher->SetOwner( this );
1128
1129 wxFileName fn;
1130 fn.AssignDir( m_watcherFileName.GetPath() );
1131 fn.DontFollowLink();
1132
1133 wxLogTrace( traceLibWatch, "Add watch: %s", fn.GetPath() );
1134
1135 {
1136 // Silence OS errors that come from the watcher
1137 wxLogNull silence;
1138 m_watcher->Add( fn );
1139 }
1140}
1141
1142
1143void PCB_BASE_FRAME::OnFPChange( wxFileSystemWatcherEvent& aEvent )
1144{
1145 if( aEvent.GetPath() != m_watcherFileName.GetFullPath() )
1146 return;
1147
1148 // Start the debounce timer (set to 1 second)
1149 if( !m_watcherDebounceTimer.StartOnce( 1000 ) )
1150 {
1151 wxLogTrace( traceLibWatch, "Failed to start the debounce timer" );
1152 return;
1153 }
1154}
1155
1156
1158{
1159 if( aEvent.GetId() != m_watcherDebounceTimer.GetId() )
1160 {
1161 aEvent.Skip();
1162 return;
1163 }
1164
1166 {
1167 wxLogTrace( traceLibWatch, "Restarting debounce timer" );
1168 m_watcherDebounceTimer.StartOnce( 3000 );
1169 }
1170
1171 wxLogTrace( traceLibWatch, "OnFpChangeDebounceTimer" );
1172
1173 // Disable logging to avoid spurious messages and check if the file has changed
1174 wxLog::EnableLogging( false );
1175 wxDateTime lastModified = m_watcherFileName.GetModificationTime();
1176 wxLog::EnableLogging( true );
1177
1178 if( lastModified == m_watcherLastModified || !lastModified.IsValid() )
1179 return;
1180
1181 m_watcherLastModified = lastModified;
1182
1185
1186 // When loading a footprint from a library in the footprint editor
1187 // the items UUIDs must be keep and not reinitialized
1188 bool keepUUID = IsType( FRAME_FOOTPRINT_EDITOR );
1189
1190 if( !fp || !tbl )
1191 return;
1192
1194
1196 || IsOK( this, _( "The library containing the current footprint has changed.\n"
1197 "Do you want to reload the footprint?" ) ) )
1198 {
1199 wxString fpname = fp->GetFPID().GetLibItemName();
1200 wxString nickname = fp->GetFPID().GetLibNickname();
1201
1202 try
1203 {
1204 FOOTPRINT* newfp = tbl->FootprintLoad( nickname, fpname, keepUUID );
1205
1206 if( newfp )
1207 {
1208 std::vector<KIID> selectedItems;
1209
1210 for( const EDA_ITEM* item : GetCurrentSelection() )
1211 selectedItems.emplace_back( item->m_Uuid );
1212
1214
1215 ReloadFootprint( newfp );
1216
1217 newfp->ClearAllNets();
1221
1222 std::vector<EDA_ITEM*> sel;
1223
1224 for( const KIID& uuid : selectedItems )
1225 {
1226 if( BOARD_ITEM* item = GetBoard()->ResolveItem( uuid, true ) )
1227 sel.push_back( item );
1228 }
1229
1230 if( !sel.empty() )
1231 m_toolManager->RunAction( ACTIONS::selectItems, &sel );
1232 }
1233 }
1234 catch( const IO_ERROR& ioe )
1235 {
1236 DisplayError( this, ioe.What() );
1237 }
1238 }
1239
1240 m_inFpChangeTimerEvent = false;
1241}
@ ERROR_INSIDE
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:112
constexpr int ARC_LOW_DEF
Definition base_units.h:128
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
@ NORMAL
Inactive layers are shown normally (no high-contrast mode)
@ HIDDEN
Inactive layers are hidden.
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
BOX2< VECTOR2D > BOX2D
Definition box2.h:923
static TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
Definition actions.h:231
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
WINDOW_SETTINGS m_Window
Handles how to draw a screen (a board, a schematic ...)
Definition base_screen.h:41
VECTOR2D m_LocalOrigin
Relative Screen cursor coordinate (on grid) in user units.
Definition base_screen.h:90
void SetContentModified(bool aModified=true)
Definition base_screen.h:59
void InitDataPoints(const VECTOR2I &aPageSizeInternalUnits)
Container for design settings for a BOARD object.
std::map< int, SEVERITY > m_DRCSeverities
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:79
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:322
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
Definition board.cpp:1167
void UpdateUserUnits(BOARD_ITEM *aItem, KIGFX::VIEW *aView)
Update any references within aItem (or its descendants) to the user units.
Definition board.cpp:1666
const LSET & GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
Definition board.cpp:941
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:192
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
Definition board.h:505
void IncrementTimeStamp()
Definition board.cpp:260
BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Definition board.cpp:1044
void SynchronizeProperties()
Copy the current project's text variables into the boards property cache.
Definition board.cpp:2407
BOARD_ITEM * ResolveItem(const KIID &aID, bool aAllowNullptrReturn=false) const
Definition board.cpp:1745
void SetUserUnits(EDA_UNITS aUnits)
Definition board.h:771
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:490
Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard.
void CommonSettingsChanged(int aFlags) override
Notification that common settings are updated.
void ShowChangedLanguage() override
void ReloadRequest()
Request reloading the 3D view.
FRAME_T GetFrameType() const
virtual APP_SETTINGS_BASE * config() const
Return the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
virtual void handleIconizeEvent(wxIconizeEvent &aEvent)
Handle a window iconize event.
virtual void OnModify()
Must be called after a model change in order to set the "modify" flag and do other frame-specific pro...
wxAuiManager m_auimgr
virtual bool IsContentModified() const
Get if the contents of the frame have been modified since the last save.
virtual void RecreateToolbars()
bool m_isClosing
Set by the close window event handler after frames are asked if they can close.
bool IsType(FRAME_T aType) const
virtual void ActivateGalCanvas()
Use to start up the GAL drawing canvas.
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType
The current canvas type.
void UpdateGridSelectBox()
Rebuild the grid combobox to respond to any changes in the GUI (units, user grid changes,...
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
EDA_DRAW_FRAME(KIWAY *aKiway, wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName, const EDA_IU_SCALE &aIuScale)
virtual void handleActivateEvent(wxActivateEvent &aEvent)
Handle a window activation event.
virtual void UpdateMsgPanel()
Redraw the message panel.
void FocusOnLocation(const VECTOR2I &aPos, bool aAllowScroll=true)
Useful to focus on a particular location, in find functions.
void UpdateStatusBar() override
Update the status bar information.
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual EDA_DRAW_PANEL_GAL * GetCanvas() const
Return a pointer to GAL-based canvas of given EDA draw frame.
void unitsChangeRefresh() override
Called when when the units setting has changed to allow for any derived classes to handle refreshing ...
std::vector< wxWindow * > findDialogs()
virtual void DisplayGridMsg()
Display current grid size in the status bar.
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
bool m_showBorderAndTitleBlock
bool GetShowPolarCoords() const
For those frames that support polar coordinates.
GAL_TYPE GetBackend() const
Return the type of backend currently used by GAL canvas.
virtual void SetHighContrastLayer(int aLayer)
Take care of display settings for the given layer to be displayed in high contrast mode.
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the #VIEW_CONTROLS instance used in the panel.
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
void SetEventDispatcher(TOOL_DISPATCHER *aEventDispatcher)
Set a dispatcher that processes events and forwards them to tools.
void StartDrawing()
Begin drawing if it was stopped previously.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition eda_item.h:98
void SetFlags(EDA_ITEM_FLAGS aMask)
Definition eda_item.h:142
const KIID m_Uuid
Definition eda_item.h:516
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
void SetBrightened()
Definition eda_item.h:135
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:350
void SetPosition(const VECTOR2I &aPos) override
void SetOrientation(const EDA_ANGLE &aNewAngle)
bool IsFlipped() const
Definition footprint.h:434
const LIB_ID & GetFPID() const
Definition footprint.h:269
void ClearAllNets()
Clear (i.e.
void Flip(const VECTOR2I &aCentre, FLIP_DIRECTION aFlipDirection) override
Flip this object, i.e.
VECTOR2I GetPosition() const override
Definition footprint.h:245
Hold a record identifying a library accessed by the appropriate footprint library #PLUGIN object in t...
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:324
void SetIgnoreBlindBuriedVias(bool ignore)
Definition collectors.h:464
void SetIgnoreTracks(bool ignore)
Definition collectors.h:470
void SetIgnoreFootprintsOnFront(bool ignore)
Definition collectors.h:428
void SetIgnoreFPTextOnFront(bool ignore)
Definition collectors.h:416
void SetIgnoreMicroVias(bool ignore)
Definition collectors.h:467
void SetIgnoreFPTextOnBack(bool ignore)
Definition collectors.h:410
void SetIgnoreThroughVias(bool ignore)
Definition collectors.h:461
void SetIgnoreThroughHolePads(bool ignore)
Definition collectors.h:446
void SetIgnoreFPReferences(bool ignore)
Definition collectors.h:458
void SetIgnoreFPValues(bool ignore)
Definition collectors.h:452
void SetIgnoreFootprintsOnBack(bool ignore)
Definition collectors.h:422
Hold an error message and may be used when throwing exceptions containing meaningful error messages.
virtual const wxString What() const
A composite of Problem() and Where()
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h: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.
virtual PCB_RENDER_SETTINGS * GetSettings() override
Return a pointer to current settings that are going to be used when drawing items.
PCB specific render settings.
Definition pcb_painter.h:82
void LoadColors(const COLOR_SETTINGS *aSettings) override
void LoadDisplayOptions(const PCB_DISPLAY_OPTIONS &aOptions)
Load settings related to display options (high-contrast mode, full or outline modes for vias/pads/tra...
virtual void Update(const VIEW_ITEM *aItem, int aUpdateFlags) const override
For dynamic VIEWs, inform the associated VIEW that the graphical representation of this item has chan...
Definition pcb_view.cpp:91
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1) override
Add a VIEW_ITEM to the view.
Definition pcb_view.cpp:57
virtual void Remove(VIEW_ITEM *aItem) override
Remove a VIEW_ITEM from the view.
Definition pcb_view.cpp:74
void UpdateDisplayOptions(const PCB_DISPLAY_OPTIONS &aOptions)
Definition pcb_view.cpp:149
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
void SetDefaultFont(const wxString &aFont)
void SetGapLengthRatio(double aRatio)
void SetDashLengthRatio(double aRatio)
void SetHighlightFactor(float aFactor)
void SetSelectFactor(float aFactor)
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
An abstract base class for deriving all objects that can be added to a VIEW.
Definition view_item.h:86
bool IsBOARD_ITEM() const
Definition view_item.h:102
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition view.h:66
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
Definition view.cpp:530
bool HasItem(const VIEW_ITEM *aItem) const
Indicates whether or not the given item has been added to the view.
Definition view.cpp:1671
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:467
void RecacheAllItems()
Rebuild GAL display lists.
Definition view.cpp:1451
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition view.cpp:1561
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition view.h:220
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:1571
Definition kiid.h:49
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:292
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:79
const VECTOR2D GetSizeIU(double aIUScale) const
Gets the page size in internal units.
Definition page_info.h:177
DISPLAY_OPTIONS m_Display
static TOOL_ACTION rehatchShapes
SEVERITY GetSeverity(int aErrorCode) const override
std::unique_ptr< wxFileSystemWatcher > m_watcher
virtual void ReloadFootprint(FOOTPRINT *aFootprint)
Reload the footprint from the library.
virtual void OnDisplayOptionsChanged()
void handleIconizeEvent(wxIconizeEvent &aEvent) override
Handle a window iconize event.
ORIGIN_TRANSFORMS & GetOriginTransforms() override
Return a reference to the default ORIGIN_TRANSFORMS object.
virtual const PCB_PLOT_PARAMS & GetPlotSettings() const
Return the PCB_PLOT_PARAMS for the BOARD owned by this frame.
std::unique_ptr< NL_PCBNEW_PLUGIN > m_spaceMouse
wxDateTime m_watcherLastModified
const PCB_DISPLAY_OPTIONS & GetDisplayOptions() const
Display options control the way tracks, vias, outlines and other things are shown (for instance solid...
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
void handleActivateEvent(wxActivateEvent &aEvent) override
Handle a window activation event.
void setFPWatcher(FOOTPRINT *aFootprint)
Create or removes a watcher on the specified footprint.
virtual void unitsChangeRefresh() override
Called when when the units setting has changed to allow for any derived classes to handle refreshing ...
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Return bounding box of document with option to not include some items.
const VECTOR2I GetPageSizeIU() const override
Works off of GetPageSettings() to return the size of the paper page in the internal units of this par...
PCBNEW_SETTINGS * GetPcbNewSettings() const
virtual void SwitchLayer(PCB_LAYER_ID aLayer)
Change the active layer in the frame.
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()
void FocusOnItems(std::vector< BOARD_ITEM * > aItems, PCB_LAYER_ID aLayer=UNDEFINED_LAYER, bool aAllowScroll=true)
void OnFPChange(wxFileSystemWatcherEvent &aEvent)
Handler for FP change events.
bool canCloseWindow(wxCloseEvent &aCloseEvent) override
const VECTOR2I & GetGridOrigin() const override
Return the absolute coordinates of the origin of the snap grid.
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
const TITLE_BLOCK & GetTitleBlock() const override
const PAGE_INFO & GetPageSettings() const override
BOX2I GetBoardBoundingBox(bool aBoardEdgesOnly=false) const
Calculate the bounding box containing all board items (or board edge segments).
EDA_ITEM * ResolveItem(const KIID &aId, bool aAllowNullptrReturn=false) const override
Fetch an item by KIID.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual void ActivateGalCanvas() override
Use to start up the GAL drawing canvas.
void SetDrawBgColor(const COLOR4D &aColor) override
void OnFpChangeDebounceTimer(wxTimerEvent &aEvent)
Handler for the filesystem watcher debounce timer.
virtual void SetBoard(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr)
Set the #m_Pcb member in such as way as to ensure deleting any previous BOARD.
virtual void SetPageSettings(const PAGE_INFO &aPageSettings) override
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock) override
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
BOARD * GetBoard() const
virtual BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Return the BOARD_DESIGN_SETTINGS for the open project.
virtual void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual void AddFootprintToBoard(FOOTPRINT *aFootprint)
Add the given footprint to the board.
virtual void doReCreateMenuBar() override
void SetDisplayOptions(const PCB_DISPLAY_OPTIONS &aOptions, bool aRefresh=true)
Update the current display options.
GENERAL_COLLECTORS_GUIDE GetCollectorsGuide()
virtual void SetPlotSettings(const PCB_PLOT_PARAMS &aSettings)
void FocusOnItem(EDA_ITEM *aItem, bool aAllowScroll=true) override
Focus on a particular canvas item.
PCB_DISPLAY_OPTIONS m_displayOptions
FOOTPRINT_EDITOR_SETTINGS * GetFootprintEditorSettings() const
void SetGridOrigin(const VECTOR2I &aPoint) override
PCB_ORIGIN_TRANSFORMS m_originTransforms
EDA_3D_VIEWER_FRAME * CreateAndShow3D_Frame()
Show the 3D view frame.
wxTimer m_watcherDebounceTimer
EDA_3D_VIEWER_FRAME * Get3DViewerFrame()
virtual 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
virtual void Update3DView(bool aMarkDirty, bool aRefresh, const wxString *aTitle=nullptr)
Update the 3D view, if the viewer is opened by this frame.
virtual void UpdateStatusBar() override
Update the status bar information.
HIGH_CONTRAST_MODE m_ContrastModeDisplay
How inactive layers are displayed.
void UpdateColors()
Update the color settings in the painter and GAL.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void DisplayBoard(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr)
Add all items from the current board to the VIEW, so they can be displayed by GAL.
void RedrawRatsnest()
Return the bounding box of the view that should be used if model is not valid.
Parameters and options when plotting/printing a board.
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:128
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.
static void Cleanup3DCache(PROJECT *aProject)
T * GetAppSettings(const char *aFilename)
Return a handle to the a given settings by type.
Represent a set of closed polygons.
void ClearArcs()
Removes all arc references from all the outlines and holes in the polyset.
bool IsEmpty() const
Return true if the set is empty (no polygons at all)
int Append(int x, int y, int aOutline=-1, int aHole=-1, bool aAllowDuplication=false)
Appends a vertex at the end of the given outline/hole (default: the last outline)
int NewOutline()
Creates a new empty polygon in the set and returns its index.
void Deflate(int aAmount, CORNER_STRATEGY aCornerStrategy, int aMaxError)
void BooleanIntersection(const SHAPE_POLY_SET &b)
Perform boolean polyset intersection.
void BooleanSubtract(const SHAPE_POLY_SET &b)
Perform boolean polyset difference.
const BOX2I BBox(int aClearance=0) const override
Compute a bounding box of the shape, with a margin of aClearance a collision.
Hold the information shown in the lower right corner of a plot, printout, or editing view.
Definition title_block.h:41
TOOL_MANAGER * m_toolManager
TOOL_DISPATCHER * m_toolDispatcher
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
virtual SELECTION & GetCurrentSelection()
Get the current selection from the canvas area.
@ MODEL_RELOAD
Model changes (the sheet for a schematic)
Definition tool_base.h:80
@ GAL_SWITCH
Rendering engine changes.
Definition tool_base.h:82
void PostEvent(const TOOL_EVENT &aEvent)
Put an event to the event queue to be processed at the end of event processing cycle.
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
EDA_UNITS GetUserUnits() const
Handle a list of polygons defining a copper zone.
Definition zone.h:74
SHAPE_POLY_SET * Outline()
Definition zone.h:335
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:1569
@ CLEANUP_FIRST
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
Definition confirm.cpp:259
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition confirm.cpp:230
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition confirm.cpp:177
This file is part of the common library.
@ ALLOW_ACUTE_CORNERS
just inflate the polygon. Acute angles create spikes
#define _(s)
Declaration of the eda_3d_viewer class.
static constexpr EDA_ANGLE ANGLE_0
Definition eda_angle.h:411
#define QUALIFIED_VIEWER3D_FRAMENAME(parent)
@ RECURSE
Definition eda_item.h:51
#define IS_NEW
New item, just created.
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition frame_type.h:33
@ FRAME_PCB_EDITOR
Definition frame_type.h:42
@ FRAME_CVPCB_DISPLAY
Definition frame_type.h:53
@ FRAME_FOOTPRINT_VIEWER
Definition frame_type.h:45
@ FRAME_FOOTPRINT_WIZARD
Definition frame_type.h:46
@ FRAME_FOOTPRINT_PREVIEW
Definition frame_type.h:48
@ FRAME_FOOTPRINT_CHOOSER
Definition frame_type.h:44
@ FRAME_FOOTPRINT_EDITOR
Definition frame_type.h:43
@ FRAME_PCB_DISPLAY3D
Definition frame_type.h:47
@ FRAME_CVPCB
Definition frame_type.h:52
static const std::string KiCadFootprintFileExtension
const wxChar *const traceLibWatch
Flag to enable debug output for library file watch refreshes.
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
Definition layer_ids.h:677
@ LAYER_FOOTPRINTS_FR
Show footprints on front.
Definition layer_ids.h:259
@ LAYER_FP_REFERENCES
Show footprints references (when texts are visible).
Definition layer_ids.h:266
@ LAYER_PADS
Meta control for all pads opacity/visibility (color ignored).
Definition layer_ids.h:292
@ LAYER_TRACKS
Definition layer_ids.h:267
@ LAYER_FP_TEXT
Definition layer_ids.h:240
@ LAYER_FOOTPRINTS_BK
Show footprints on back.
Definition layer_ids.h:260
@ LAYER_FP_VALUES
Show footprints values (when texts are visible).
Definition layer_ids.h:263
@ LAYER_VIAS
Meta control for all vias opacity/visibility.
Definition layer_ids.h:232
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:60
@ Edge_Cuts
Definition layer_ids.h:112
@ B_Mask
Definition layer_ids.h:98
@ F_Mask
Definition layer_ids.h:97
@ UNDEFINED_LAYER
Definition layer_ids.h:61
Message panel definition file.
@ COLOR
Color has changed.
Definition view_item.h:54
@ REPAINT
Item needs to be redrawn.
Definition view_item.h:58
@ GEOMETRY
Position or shape has changed.
Definition view_item.h:55
@ ALL
All except INITIAL_ADD.
Definition view_item.h:59
Declaration of the NL_PCBNEW_PLUGIN class.
wxDEFINE_EVENT(EDA_EVT_BOARD_CHANGING, wxCommandEvent)
@ THROUGH
Definition pcb_track.h:68
@ PCB_ORIGIN_AUX
@ PCB_ORIGIN_GRID
@ PCB_ORIGIN_PAGE
PGM_BASE & Pgm()
The global program "get" accessor.
Definition pgm_base.cpp:946
see class PGM_BASE
SEVERITY
@ RPT_SEVERITY_ACTION
KIWAY Kiway(KFCTL_STANDALONE)
float highlight_factor
How much to brighten highlighted objects by.
float select_factor
How much to brighten selected objects by.
wxString user_grid_x
std::vector< GRID > grids
wxString user_grid_y
Common grid settings, available to every frame.
GRID_SETTINGS grid
#define TEXTVARS_CHANGED
wxLogTrace helper definitions.
double RAD2DEG(double rad)
Definition trigo.h:167
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition typeinfo.h:88
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition typeinfo.h:106
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition typeinfo.h:103
@ 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:104
@ 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:108
@ 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_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
Definition typeinfo.h:101
@ 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:102
@ 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:105
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:695
VECTOR2< double > VECTOR2D
Definition vector2d.h:694
VECTOR2D ToVECTOR2D(const wxPoint &aPoint)
Definition vector2wx.h:40
Definition of file extensions used in Kicad.