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, see <https://www.gnu.org/licenses/>.
22 */
23
24#include <boost/version.hpp>
25#include <boost/uuid/entropy_error.hpp>
26
28#include <advanced_config.h>
29#include <base_units.h>
30#include <board.h>
31#include <cleanup_item.h>
32#include <collectors.h>
33#include <confirm.h>
34#include <footprint.h>
38#include <lset.h>
39#include <kiface_base.h>
40#include <pad.h>
41#include <pcb_painter.h>
42#include <pcbnew_id.h>
43#include <pcbnew_settings.h>
44#include <pcb_base_frame.h>
45#include <pcb_draw_panel_gal.h>
46#include <pcb_track.h>
47#include <pgm_base.h>
48#include <project_pcb.h>
49#include <scoped_set_reset.h>
50#include <trace_helpers.h>
52#include <zone.h>
53
54#include <math/vector2d.h>
55#include <math/vector2wx.h>
56#include <widgets/msgpanel.h>
57#include <wx/fswatcher.h>
58
61#include <tool/tool_manager.h>
63#include <tools/pcb_actions.h>
64#include <tool/grid_menu.h>
66
67#if defined(__linux__) || defined(__FreeBSD__)
69#else
71#endif
72
75
76wxDEFINE_EVENT( EDA_EVT_BOARD_CHANGING, wxCommandEvent );
77wxDEFINE_EVENT( EDA_EVT_BOARD_CHANGED, wxCommandEvent );
78
79PCB_BASE_FRAME::PCB_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType,
80 const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize,
81 long aStyle, const wxString& aFrameName ) :
82 EDA_DRAW_FRAME( aKiway, aParent, aFrameType, aTitle, aPos, aSize, aStyle, aFrameName, pcbIUScale ),
83 m_pcb( nullptr ),
84 m_originTransforms( *this ),
86{
88}
89
90
92{
93 // Ensure m_canvasType is up to date, to save it in config
94 if( GetCanvas() )
96
97 if( m_toolManager )
98 m_toolManager->ClearModel();
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 if( wxWindow* our3DViewer = GetOur3DViewerFrame() )
110 our3DViewer->Close( true );
111
112 // Similarly, wxConvBrokenFileNames uses some statically allocated variables that make it
113 // crash when run later from a d'tor.
115
116 return true;
117}
118
119
120void PCB_BASE_FRAME::handleActivateEvent( wxActivateEvent& aEvent )
121{
123
124 if( m_spaceMouse )
125 m_spaceMouse->SetFocus( aEvent.GetActive() );
126}
127
128
129void PCB_BASE_FRAME::handleIconizeEvent( wxIconizeEvent& aEvent )
130{
132
133 if( m_spaceMouse && aEvent.IsIconized() )
134 m_spaceMouse->SetFocus( false );
135}
136
137
139{
140 wxWindow* frame = FindWindowByName( QUALIFIED_VIEWER3D_FRAMENAME( this ) );
141 return dynamic_cast<EDA_3D_VIEWER_FRAME*>( frame );
142}
143
144
145void PCB_BASE_FRAME::Update3DView( bool aMarkDirty, bool aRefresh, const wxString* aTitle )
146{
147 if( EDA_3D_VIEWER_FRAME* draw3DFrame = GetOur3DViewerFrame() )
148 {
149 if( aTitle )
150 draw3DFrame->SetTitle( *aTitle );
151
152 if( aMarkDirty )
153 draw3DFrame->ReloadRequest();
154
155 if( aRefresh )
156 draw3DFrame->Redraw();
157 }
158}
159
160
162{
163 if( m_pcb != aBoard )
164 {
165 delete m_pcb;
166 m_pcb = aBoard;
167
168 if( GetBoard() )
170
171 if( GetBoard() && GetCanvas() )
172 {
174
175 if( rs )
176 {
177 rs->SetDashLengthRatio( GetBoard()->GetPlotOptions().GetDashedLineDashRatio() );
178 rs->SetGapLengthRatio( GetBoard()->GetPlotOptions().GetDashedLineGapRatio() );
179 }
180 }
181
182 wxCommandEvent e( EDA_EVT_BOARD_CHANGED );
183 ProcessEventLocally( e );
184 }
185}
186
187
189{
190 if( aFootprint )
191 {
192 GetBoard()->Add( aFootprint, ADD_MODE::APPEND );
193
194 aFootprint->SetFlags( IS_NEW );
195 aFootprint->SetPosition( VECTOR2I( 0, 0 ) ); // cursor in GAL may not be initialized yet
196
197 // Put it on FRONT layer (note that it might be stored flipped if the lib is an archive
198 // built from a board)
199 if( aFootprint->IsFlipped() )
200 aFootprint->Flip( aFootprint->GetPosition(), GetPcbNewSettings()->m_FlipDirection );
201
202 // Place it in orientation 0 even if it is not saved with orientation 0 in lib (note that
203 // it might be stored in another orientation if the lib is an archive built from a board)
204 aFootprint->SetOrientation( ANGLE_0 );
205
206 GetBoard()->UpdateUserUnits( aFootprint, GetCanvas()->GetView() );
207
209 }
210}
211
212
213EDA_ITEM* PCB_BASE_FRAME::ResolveItem( const KIID& aId, bool aAllowNullptrReturn ) const
214{
215 return GetBoard()->ResolveItem( aId, aAllowNullptrReturn );
216}
217
218void PCB_BASE_FRAME::FocusOnItem( EDA_ITEM* aItem, bool aAllowScroll )
219{
220 // nullptr will clear the current focus
221 if( aItem != nullptr && !aItem->IsBOARD_ITEM() )
222 return;
223
224 FocusOnItem( static_cast<BOARD_ITEM*>( aItem ), UNDEFINED_LAYER, aAllowScroll );
225}
226
227void PCB_BASE_FRAME::FocusOnItem( BOARD_ITEM* aItem, PCB_LAYER_ID aLayer, bool aAllowScroll )
228{
229 std::vector<BOARD_ITEM*> items;
230
231 if( aItem )
232 items.push_back( aItem );
233
234 FocusOnItems( items, aLayer, aAllowScroll );
235}
236
237
238void PCB_BASE_FRAME::FocusOnItems( const std::vector<BOARD_ITEM*>& aItems, PCB_LAYER_ID aLayer, bool aAllowScroll )
239{
240 static std::vector<KIID> lastBrightenedItemIDs;
241
242 bool itemsUnbrightened = false;
243
244 for( KIID lastBrightenedItemID : lastBrightenedItemIDs )
245 {
246 if( BOARD_ITEM* lastItem = GetBoard()->ResolveItem( lastBrightenedItemID, true ) )
247 {
248 lastItem->ClearBrightened();
249 GetCanvas()->GetView()->Update( lastItem );
250 itemsUnbrightened = true;
251 }
252 }
253
254 if( itemsUnbrightened )
255 GetCanvas()->Refresh();
256
257 lastBrightenedItemIDs.clear();
258
259 if( aItems.empty() )
260 return;
261
262 for( BOARD_ITEM* item : aItems )
263 {
264 if( item && item != DELETED_BOARD_ITEM::GetInstance() )
265 {
266 item->SetBrightened();
267 lastBrightenedItemIDs.push_back( item->m_Uuid );
268
269 item->RunOnChildren(
270 [&]( BOARD_ITEM* child )
271 {
272 child->SetBrightened();
273 lastBrightenedItemIDs.push_back( child->m_Uuid );
274 },
276
277 GetCanvas()->GetView()->Update( item );
278 }
279 }
280
281 VECTOR2I focusPt;
282 KIGFX::VIEW* view = GetCanvas()->GetView();
283 SHAPE_POLY_SET viewportPoly( view->GetViewport() );
284
285 for( wxWindow* dialog : findDialogs() )
286 {
287 wxPoint dialogPos = GetCanvas()->ScreenToClient( dialog->GetScreenPosition() );
288 SHAPE_POLY_SET dialogPoly( BOX2D( view->ToWorld( ToVECTOR2D( dialogPos ), true ),
289 view->ToWorld( ToVECTOR2D( dialog->GetSize() ), false ) ) );
290
291 try
292 {
293 viewportPoly.BooleanSubtract( dialogPoly );
294 }
295 catch( const std::exception& e )
296 {
297 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
298 }
299 }
300
301 SHAPE_POLY_SET itemPoly, clippedPoly;
302
303 for( BOARD_ITEM* item : aItems )
304 {
305 if( item && item != DELETED_BOARD_ITEM::GetInstance() )
306 {
307 // Focus on the object's location. Prefer a visible part of the object to its anchor
308 // in order to keep from scrolling around.
309
310 focusPt = item->GetPosition();
311
312 if( aLayer == UNDEFINED_LAYER && item->GetLayerSet().any() )
313 aLayer = item->GetLayerSet().Seq()[0];
314
315 switch( item->Type() )
316 {
317 case PCB_FOOTPRINT_T:
318 try
319 {
320 itemPoly = static_cast<FOOTPRINT*>( item )->GetBoundingHull();
321 }
322 catch( const std::exception& e )
323 {
324 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
325 }
326
327 break;
328
329 case PCB_PAD_T:
330 case PCB_MARKER_T:
331 case PCB_VIA_T:
332 FocusOnLocation( item->GetFocusPosition(), aAllowScroll );
333 GetCanvas()->Refresh();
334 return;
335
336 case PCB_SHAPE_T:
337 case PCB_FIELD_T:
338 case PCB_TEXT_T:
339 case PCB_TEXTBOX_T:
340 case PCB_BARCODE_T:
341 case PCB_TRACE_T:
342 case PCB_ARC_T:
344 case PCB_DIM_LEADER_T:
345 case PCB_DIM_CENTER_T:
346 case PCB_DIM_RADIAL_T:
348 item->TransformShapeToPolygon( itemPoly, aLayer, 0, pcbIUScale.mmToIU( 0.1 ), ERROR_INSIDE );
349 break;
350
351 case PCB_ZONE_T:
352 {
353 ZONE* zone = static_cast<ZONE*>( item );
354#if 0
355 // Using the filled area shapes to find a Focus point can give good results, but
356 // unfortunately the calculations are highly time consuming, even for not very
357 // large areas (can be easily a few minutes for large areas).
358 // so we used only the zone outline that usually do not have too many vertices.
359 zone->TransformShapeToPolygon( itemPoly, aLayer, 0, pcbIUScale.mmToIU( 0.1 ), ERROR_INSIDE );
360
361 if( itemPoly.IsEmpty() )
362 itemPoly = zone->GetBoardOutline();
363#else
364 // much faster calculation time when using only the zone outlines
365 itemPoly = zone->GetBoardOutline();
366#endif
367
368 break;
369 }
370
371 default:
372 {
373 BOX2I item_bbox = item->GetBoundingBox();
374 itemPoly.NewOutline();
375 itemPoly.Append( item_bbox.GetOrigin() );
376 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( item_bbox.GetWidth(), 0 ) );
377 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( 0, item_bbox.GetHeight() ) );
378 itemPoly.Append( item_bbox.GetOrigin() + VECTOR2I( item_bbox.GetWidth(),
379 item_bbox.GetHeight() ) );
380 break;
381 }
382 }
383
384 try
385 {
386 itemPoly.ClearArcs();
387 viewportPoly.ClearArcs();
388 clippedPoly.BooleanIntersection( itemPoly, viewportPoly );
389 }
390 catch( const std::exception& e )
391 {
392 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
393 }
394
395 if( !clippedPoly.IsEmpty() )
396 itemPoly = clippedPoly;
397 }
398 }
399
400 /*
401 * Perform a step-wise deflate to find the visual-center-of-mass
402 */
403
404 if( itemPoly.IsEmpty() )
405 {
406 FocusOnLocation( focusPt, aAllowScroll );
407 GetCanvas()->Refresh();
408 return;
409 }
410
411 BOX2I bbox = itemPoly.BBox();
412 int step = std::min( bbox.GetWidth(), bbox.GetHeight() ) / 10;
413
414 // Tiny shapes can quantize to a zero deflate step
415 if( step <= 0 )
416 {
417 FocusOnLocation( bbox.Centre(), aAllowScroll );
418 GetCanvas()->Refresh();
419 return;
420 }
421
422 while( !itemPoly.IsEmpty() )
423 {
424 focusPt = itemPoly.BBox().Centre();
425
426 try
427 {
429 }
430 catch( const std::exception& e )
431 {
432 wxFAIL_MSG( wxString::Format( wxT( "Clipper exception occurred: %s" ), e.what() ) );
433 }
434 }
435
436 FocusOnLocation( focusPt, aAllowScroll );
437
438 GetCanvas()->Refresh();
439}
440
441
443{
444 KIGFX::PCB_VIEW* view = GetCanvas()->GetView();
445
446 if( view && GetBoard()->m_SolderMaskBridges && view->HasItem( GetBoard()->m_SolderMaskBridges ) )
447 view->Remove( GetBoard()->m_SolderMaskBridges );
448}
449
450
452{
453 KIGFX::PCB_VIEW* view = GetCanvas()->GetView();
454
455 if( view && GetBoard()->m_SolderMaskBridges )
456 {
457 if( view->HasItem( GetBoard()->m_SolderMaskBridges ) )
458 view->Remove( GetBoard()->m_SolderMaskBridges );
459
460 view->Add( GetBoard()->m_SolderMaskBridges );
461 }
462}
463
464
465void PCB_BASE_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
466{
467 m_pcb->SetPageSettings( aPageSettings );
468
469 if( GetScreen() )
470 GetScreen()->InitDataPoints( aPageSettings.GetSizeIU( pcbIUScale.IU_PER_MILS ) );
471}
472
473
475{
476 return m_pcb->GetPageSettings();
477}
478
479
481{
482 // this function is only needed because EDA_DRAW_FRAME is not compiled
483 // with either -DPCBNEW or -DEESCHEMA, so the virtual is used to route
484 // into an application specific source file.
485 return m_pcb->GetPageSettings().GetSizeIU( pcbIUScale.IU_PER_MILS );
486}
487
488
490{
491 return m_pcb->GetDesignSettings().GetGridOrigin();
492}
493
494
496{
497 m_pcb->GetDesignSettings().SetGridOrigin( aPoint );
498}
499
500
502{
503 return m_pcb->GetDesignSettings().GetAuxOrigin();
504}
505
506
508{
509 VECTOR2I origin( 0, 0 );
510
511 switch( GetPcbNewSettings()->m_Display.m_DisplayOrigin )
512 {
514 case PCB_DISPLAY_ORIGIN::PCB_ORIGIN_AUX: origin = GetAuxOrigin(); break;
516 default: wxASSERT( false ); break;
517 }
518
519 return origin;
520}
521
526
527
529{
530 return m_pcb->GetTitleBlock();
531}
532
533
535{
536 m_pcb->SetTitleBlock( aTitleBlock );
537}
538
539
541{
542 return m_pcb->GetDesignSettings();
543}
544
545
547{
548 m_drawBgColor= aColor;
549 m_auimgr.Update();
550}
551
552
554{
555 return m_pcb->GetPlotOptions();
556}
557
558
560{
561 m_pcb->SetPlotOptions( aSettings );
562
563 // Plot Settings can also change the "tent vias" setting, which can affect the solder mask.
564 LSET visibleLayers = GetBoard()->GetVisibleLayers();
565
566 if( visibleLayers.test( F_Mask ) || visibleLayers.test( B_Mask ) )
567 {
569 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
570 {
571 BOARD_ITEM* item = nullptr;
572
573 if( aItem->IsBOARD_ITEM() )
574 item = static_cast<BOARD_ITEM*>( aItem );
575
576 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to
577 // visible as they won't be found in the view layer's itemset for re-painting.
578 if( item && item->Type() == PCB_VIA_T )
579 return KIGFX::ALL;
580
581 return 0;
582 } );
583
584 GetCanvas()->Refresh();
585 }
586}
587
588
589BOX2I PCB_BASE_FRAME::GetBoardBoundingBox( bool aBoardEdgesOnly ) const
590{
591 BOX2I area = aBoardEdgesOnly ? m_pcb->GetBoardEdgesBoundingBox() : m_pcb->GetBoundingBox();
592
593 if( area.GetWidth() == 0 && area.GetHeight() == 0 )
594 {
595 VECTOR2I pageSize = GetPageSizeIU();
596
598 {
599 area.SetOrigin( 0, 0 );
600 area.SetEnd( pageSize.x, pageSize.y );
601 }
602 else
603 {
604 area.SetOrigin( -pageSize.x / 2, -pageSize.y / 2 );
605 area.SetEnd( pageSize.x / 2, pageSize.y / 2 );
606 }
607 }
608
609 return area;
610}
611
612
613const BOX2I PCB_BASE_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
614{
615 /* "Zoom to Fit" calls this with "aIncludeAllVisible" as true. Since that feature
616 * always ignored the page and border, this function returns a bbox without them
617 * as well when passed true. This technically is not all things visible, but it
618 * keeps behavior consistent.
619 *
620 * When passed false, this function returns a bbox of just the board edge. This
621 * allows things like fabrication text or anything else outside the board edge to
622 * be ignored, and just zooms up to the board itself.
623 *
624 * Calling "GetBoardBoundingBox(true)" when edge cuts are turned off will return
625 * the entire page and border, so we call "GetBoardBoundingBox(false)" instead.
626 */
627 if( aIncludeAllVisible || !m_pcb->IsLayerVisible( Edge_Cuts ) )
628 return GetBoardBoundingBox( false );
629 else
630 return GetBoardBoundingBox( true );
631}
632
633
634// Virtual function
638
639
641{
642 return static_cast<PCB_SCREEN*>( EDA_DRAW_FRAME::GetScreen() );
643}
644
645
647{
648 GetScreen()->m_Active_Layer = aLayer;
649}
650
651
656
657
659{
660 // call my base class
662
663 // tooltips in toolbars
665
666 if( EDA_3D_VIEWER_FRAME* viewer3D = GetOur3DViewerFrame() )
667 viewer3D->ShowChangedLanguage();
668}
669
670
672{
674
675 if( !draw3DFrame )
676 draw3DFrame = new EDA_3D_VIEWER_FRAME( &Kiway(), this, _( "3D Viewer" ) );
677
678 // Raising the window does not show the window on Windows if iconized. This should work
679 // on any platform.
680 if( draw3DFrame->IsIconized() )
681 draw3DFrame->Iconize( false );
682
683 draw3DFrame->Raise();
684 draw3DFrame->Show( true );
685
686 // Raising the window does not set the focus on Linux. This should work on any platform.
687 if( wxWindow::FindFocus() != draw3DFrame )
688 draw3DFrame->SetFocus();
689
690 // Allocate a slice of time to display the 3D frame
691 // a call to wxSafeYield() should be enough (and better), but on Linux we need
692 // to call wxYield()
693 // otherwise the activity messages are not displayed during the first board loading
694 wxYield();
695
696 // Note, the caller is responsible to load/update the board 3D view.
697 // after frame creation the board is not automatically created.
698
699 return draw3DFrame;
700}
701
702
704{
705 PCB_LAYER_ID preslayer = GetActiveLayer();
706 auto& displ_opts = GetDisplayOptions();
707
708 // Check if the specified layer matches the present layer
709 if( layer == preslayer )
710 return;
711
712 // Copper layers cannot be selected unconditionally; how many of those layers are
713 // currently enabled needs to be checked.
714 if( IsCopperLayer( layer ) )
715 {
716 if( layer > m_pcb->GetCopperLayerStackMaxId() )
717 return;
718 }
719
720 // Is yet more checking required? E.g. when the layer to be selected is a non-copper
721 // layer, or when switching between a copper layer and a non-copper layer, or vice-versa?
722 // ...
723
724 SetActiveLayer( layer );
725
726 if( displ_opts.m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL )
727 GetCanvas()->Refresh();
728}
729
730
732{
733 GENERAL_COLLECTORS_GUIDE guide( m_pcb->GetVisibleLayers(), GetActiveLayer(),
734 GetCanvas()->GetView() );
735
736 // account for the globals
737 guide.SetIgnoreFPTextOnBack( !m_pcb->IsElementVisible( LAYER_FP_TEXT ) );
738 guide.SetIgnoreFPTextOnFront( !m_pcb->IsElementVisible( LAYER_FP_TEXT ) );
739 guide.SetIgnoreFootprintsOnBack( !m_pcb->IsElementVisible( LAYER_FOOTPRINTS_BK ) );
740 guide.SetIgnoreFootprintsOnFront( !m_pcb->IsElementVisible( LAYER_FOOTPRINTS_FR ) );
741 guide.SetIgnoreThroughHolePads( ! m_pcb->IsElementVisible( LAYER_PADS ) );
742 guide.SetIgnoreFPValues( !m_pcb->IsElementVisible( LAYER_FP_VALUES ) );
743 guide.SetIgnoreFPReferences( !m_pcb->IsElementVisible( LAYER_FP_REFERENCES ) );
744 guide.SetIgnoreThroughVias( ! m_pcb->IsElementVisible( LAYER_VIAS ) );
745 guide.SetIgnoreBlindBuriedVias( ! m_pcb->IsElementVisible( LAYER_VIAS ) );
746 guide.SetIgnoreMicroVias( ! m_pcb->IsElementVisible( LAYER_VIAS ) );
747 guide.SetIgnoreTracks( ! m_pcb->IsElementVisible( LAYER_TRACKS ) );
748
749 return guide;
750}
751
752
754{
756
757 BASE_SCREEN* screen = GetScreen();
758
759 if( !screen )
760 return;
761
762 wxString line;
764
765 if( GetShowPolarCoords() ) // display polar coordinates
766 {
767 double dx = cursorPos.x - screen->m_LocalOrigin.x;
768 double dy = cursorPos.y - screen->m_LocalOrigin.y;
769 double theta = RAD2DEG( atan2( -dy, dx ) );
770 double ro = hypot( dx, dy );
771
772 line.Printf( wxT( "r %s theta %.3f" ),
773 MessageTextFromValue( ro, false ),
774 theta );
775
776 SetStatusText( line, 3 );
777 }
778
779 // Transform absolute coordinates for user origin preferences
780 double userXpos = m_originTransforms.ToDisplayAbsX( static_cast<double>( cursorPos.x ) );
781 double userYpos = m_originTransforms.ToDisplayAbsY( static_cast<double>( cursorPos.y ) );
782
783 // Display absolute coordinates:
784 line.Printf( wxT( "X %s Y %s" ),
785 MessageTextFromValue( userXpos, false ),
786 MessageTextFromValue( userYpos, false ) );
787 SetStatusText( line, 2 );
788
789 if( !GetShowPolarCoords() ) // display relative cartesian coordinates
790 {
791 // Calculate relative coordinates
792 double relXpos = cursorPos.x - screen->m_LocalOrigin.x;
793 double relYpos = cursorPos.y - screen->m_LocalOrigin.y;
794
795 // Transform relative coordinates for user origin preferences
796 userXpos = m_originTransforms.ToDisplayRelX( relXpos );
797 userYpos = m_originTransforms.ToDisplayRelY( relYpos );
798
799 line.Printf( wxT( "dx %s dy %s dist %s" ),
800 MessageTextFromValue( userXpos, false ),
801 MessageTextFromValue( userYpos, false ),
802 MessageTextFromValue( hypot( userXpos, userYpos ), false ) );
803 SetStatusText( line, 3 );
804 }
805
807}
808
809
811{
812 EDA_DRAW_FRAME::unitsChangeRefresh(); // Update the status bar.
813
814 if( GetBoard() )
816
818}
819
820
822{
824
825 // Move legacy user grids to grid list
826 if( !aCfg->m_Window.grid.user_grid_x.empty() )
827 {
828 aCfg->m_Window.grid.grids.emplace_back( GRID{ "User Grid", aCfg->m_Window.grid.user_grid_x,
829 aCfg->m_Window.grid.user_grid_y } );
830 aCfg->m_Window.grid.user_grid_x = wxEmptyString;
831 aCfg->m_Window.grid.user_grid_y = wxEmptyString;
832 }
833
834 // Some, but not all, derived classes have a PCBNEW_SETTINGS.
835 if( PCBNEW_SETTINGS* pcbnew_cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg ) )
836 m_polarCoords = pcbnew_cfg->m_PolarCoords;
837
838 wxASSERT( GetCanvas() );
839
840 if( GetCanvas() )
841 {
843
844 if( rs )
845 {
848 rs->SetDefaultFont( wxEmptyString ); // Always the KiCad font for PCBs
849 }
850 }
851}
852
853
855{
856 if( aErrorCode >= CLEANUP_FIRST )
857 return RPT_SEVERITY_ACTION;
858
859 return GetBoard()->GetDesignSettings().m_DRCSeverities[ aErrorCode ];
860}
861
862
864{
866
867 // Some, but not all derived classes have a PCBNEW_SETTINGS.
868 PCBNEW_SETTINGS* cfg = dynamic_cast<PCBNEW_SETTINGS*>( aCfg );
869
870 if( cfg )
872}
873
874
879
880
885
886
908
909
911{
912 static MAGNETIC_SETTINGS fallback;
913
915 return &cfg->m_MagneticItems;
916
917 return &fallback;
918}
919
920
922{
924
925 KIGFX::VIEW* view = GetCanvas()->GetView();
926 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( view->GetPainter() );
927 PCB_RENDER_SETTINGS* settings = painter->GetSettings();
928
929 settings->LoadColors( GetColorSettings( true ) );
932
933 if( aFlags & TEXTVARS_CHANGED )
935
936 // Note: KIGFX::REPAINT isn't enough for things that go from invisible to visible as
937 // they won't be found in the view layer's itemset for re-painting.
939 [&]( KIGFX::VIEW_ITEM* aItem ) -> int
940 {
941 if( dynamic_cast<RATSNEST_VIEW_ITEM*>( aItem ) )
942 {
943 return KIGFX::ALL; // ratsnest display
944 }
945 else if( dynamic_cast<PCB_TRACK*>( aItem ) )
946 {
947 return KIGFX::REPAINT; // track, arc & via clearance display
948 }
949 else if( dynamic_cast<PAD*>( aItem ) )
950 {
951 return KIGFX::REPAINT; // pad clearance display
952 }
953 else if( EDA_TEXT* text = dynamic_cast<EDA_TEXT*>( aItem ) )
954 {
955 if( text->HasTextVars() )
956 {
957 text->ClearRenderCache();
958 text->ClearBoundingBoxCache();
960 }
961 }
962
963 return 0;
964 } );
965
967
969
970 // The 3D viewer isn't in the Kiway, so send its update manually
972 viewer->CommonSettingsChanged( aFlags );
973}
974
975
977{
979
982
983 if( m_isClosing )
984 return;
985
988}
989
990
997
998
1003
1004
1006{
1008
1009 EDA_DRAW_PANEL_GAL* canvas = GetCanvas();
1010 KIGFX::VIEW* view = canvas->GetView();
1011
1012 if( m_toolManager )
1013 {
1014 m_toolManager->SetEnvironment( m_pcb, view, canvas->GetViewControls(), config(), this );
1015
1016 m_toolManager->ResetTools( TOOL_BASE::GAL_SWITCH );
1017 }
1018
1019 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( view->GetPainter() );
1020 KIGFX::PCB_RENDER_SETTINGS* settings = painter->GetSettings();
1021 const PCB_DISPLAY_OPTIONS& displ_opts = GetDisplayOptions();
1022
1023 settings->LoadDisplayOptions( displ_opts );
1024 settings->LoadColors( GetColorSettings() );
1026
1027 view->RecacheAllItems();
1029 canvas->StartDrawing();
1030
1031 try
1032 {
1033 if( !m_spaceMouse )
1034 {
1035#if defined(__linux__) || defined(__FreeBSD__)
1036 m_spaceMouse = std::make_unique<SPNAV_2D_PLUGIN>( GetCanvas() );
1037 m_spaceMouse->SetScale( 0.01 );
1038#else
1039 m_spaceMouse = std::make_unique<NL_PCBNEW_PLUGIN>( GetCanvas() );
1040#endif
1041 }
1042 }
1043 catch( const std::exception& e )
1044 {
1045 wxLogTrace( wxT( "KI_TRACE_NAVLIB" ), wxS( "%s" ), e.what() );
1046 }
1047 catch( ... )
1048 {
1049 wxLogTrace( wxT( "KI_TRACE_NAVLIB" ),
1050 wxT( "Unknown exception during SpaceMouse initialization" ) );
1051 }
1052}
1053
1054
1056 const PCB_DISPLAY_OPTIONS& aNew )
1057{
1058 // only zone mode and board flip change geometry
1059 // colour opacity contrast are recolour only
1060 return aOld.m_ZoneDisplayMode != aNew.m_ZoneDisplayMode
1061 || aOld.m_FlipBoardView != aNew.m_FlipBoardView;
1062}
1063
1064
1065void PCB_BASE_FRAME::SetDisplayOptions( const PCB_DISPLAY_OPTIONS& aOptions, bool aRefresh )
1066{
1067 bool needsRecache = displayOptionsRequireRecache( m_displayOptions, aOptions );
1068 m_displayOptions = aOptions;
1069
1070 EDA_DRAW_PANEL_GAL* canvas = GetCanvas();
1071 KIGFX::PCB_VIEW* view = static_cast<KIGFX::PCB_VIEW*>( canvas->GetView() );
1072
1073 view->UpdateDisplayOptions( aOptions );
1074 view->SetMirror( aOptions.m_FlipBoardView, view->IsMirroredY() );
1075
1076 // skip recache for colour/alpha-only changes handled by the recolour below
1077 if( needsRecache )
1078 view->RecacheAllItems();
1079
1082
1083 if( aRefresh )
1084 canvas->Refresh();
1085}
1086
1087
1089{
1090 wxLogTrace( traceLibWatch, "setFPWatcher" );
1091
1092 Unbind( wxEVT_FSWATCHER, &PCB_BASE_FRAME::OnFPChange, this );
1093
1094 if( m_watcher )
1095 {
1096 wxLogTrace( traceLibWatch, "Remove watch" );
1097 m_watcher->RemoveAll();
1098 m_watcher->SetOwner( nullptr );
1099 m_watcher.reset();
1100 }
1101
1102 wxString libfullname;
1104
1105 if( !aFootprint || !adapter )
1106 return;
1107
1108 try
1109 {
1110 std::optional<LIBRARY_TABLE_ROW*> row = adapter->GetRow( aFootprint->GetFPID().GetLibNickname() );
1111
1112 if( !row )
1113 return;
1114
1115 libfullname = LIBRARY_MANAGER::GetFullURI( *row, true );
1116 }
1117 catch( const IO_ERROR& error )
1118 {
1119 wxLogTrace( traceLibWatch, "Error: %s", error.What() );
1120 return;
1121 }
1122 catch( const std::exception& e )
1123 {
1124 DisplayInfoMessage( this, e.what() );
1125 return;
1126 }
1127
1128 m_watcherFileName.Assign( libfullname, aFootprint->GetFPID().GetLibItemName(),
1130
1131 if( !m_watcherFileName.FileExists() )
1132 return;
1133
1134 m_watcherLastModified = m_watcherFileName.GetModificationTime();
1135
1136 wxFileName fn;
1137 fn.AssignDir( m_watcherFileName.GetPath() );
1138 fn.DontFollowLink();
1139
1140 // wxMSW frees a watch before SMB completes its pending read, which then corrupts the heap
1141 if( KIPLATFORM::ENV::IsNetworkPath( fn.GetPath() ) )
1142 {
1143 wxLogTrace( traceLibWatch, "Network path, not watching: %s", fn.GetPath() );
1144 return;
1145 }
1146
1147 Bind( wxEVT_FSWATCHER, &PCB_BASE_FRAME::OnFPChange, this );
1148 m_watcher = std::make_unique<wxFileSystemWatcher>();
1149 m_watcher->SetOwner( this );
1150
1151 wxLogTrace( traceLibWatch, "Add watch: %s", fn.GetPath() );
1152
1153 {
1154 // Silence OS errors that come from the watcher
1155 wxLogNull silence;
1156 m_watcher->Add( fn );
1157 }
1158}
1159
1160
1161void PCB_BASE_FRAME::OnFPChange( wxFileSystemWatcherEvent& aEvent )
1162{
1163 if( aEvent.GetPath() != m_watcherFileName.GetFullPath() )
1164 return;
1165
1166 // Start the debounce timer (set to 1 second)
1167 if( !m_watcherDebounceTimer.StartOnce( 1000 ) )
1168 {
1169 wxLogTrace( traceLibWatch, "Failed to start the debounce timer" );
1170 return;
1171 }
1172}
1173
1174
1176{
1177 if( aEvent.GetId() != m_watcherDebounceTimer.GetId() )
1178 {
1179 aEvent.Skip();
1180 return;
1181 }
1182
1184 {
1185 wxLogTrace( traceLibWatch, "Restarting debounce timer" );
1186 m_watcherDebounceTimer.StartOnce( 3000 );
1187 return;
1188 }
1189
1190 // If the frame is currently disabled then a quasi-modal/modal dialog is open on top of it (for
1191 // example the footprint properties dialog). Reloading the footprint now would delete the items
1192 // the dialog is editing and crash on dialog close. Defer the reload until the dialog is gone.
1193 if( !IsEnabled() )
1194 {
1195 wxLogTrace( traceLibWatch, "Frame disabled (dialog open); restarting debounce timer" );
1196 m_watcherDebounceTimer.StartOnce( 1000 );
1197 return;
1198 }
1199
1200 // An interactive tool (move, draw, place) holds references into the current footprint while its
1201 // event loop runs. Reloading now would free those out from under the running tool and crash.
1202 // Restart the timer before touching the watcher timestamp so the reload is retried once the tool
1203 // finishes rather than silently dropped.
1204 if( !ToolStackIsEmpty() )
1205 {
1206 wxLogTrace( traceLibWatch, "Interactive tool active; restarting debounce timer" );
1207 m_watcherDebounceTimer.StartOnce( 1000 );
1208 return;
1209 }
1210
1211 wxLogTrace( traceLibWatch, "OnFpChangeDebounceTimer" );
1212
1213 wxDateTime lastModified;
1214
1215 {
1216 // Silence spurious OS messages while checking if the file has changed
1217 wxLogNull silence;
1218 lastModified = m_watcherFileName.GetModificationTime();
1219 }
1220
1221 if( lastModified == m_watcherLastModified || !lastModified.IsValid() )
1222 return;
1223
1224 m_watcherLastModified = lastModified;
1225
1228
1229 // When loading a footprint from a library in the footprint editor
1230 // the items UUIDs must be keep and not reinitialized
1231 bool keepUUID = IsType( FRAME_FOOTPRINT_EDITOR );
1232
1233 if( !fp || !adapter )
1234 return;
1235
1236 SCOPED_SET_RESET<bool> inTimerEvent( m_inFpChangeTimerEvent, true );
1237
1239 || IsOK( this, _( "The library containing the current footprint has changed.\n"
1240 "Do you want to reload the footprint?" ) ) )
1241 {
1242 wxString fpname = fp->GetFPID().GetLibItemName();
1243 wxString nickname = fp->GetFPID().GetLibNickname();
1244
1245 try
1246 {
1247 FOOTPRINT* newfp = adapter->LoadFootprint( nickname, fpname, keepUUID );
1248
1249 if( newfp )
1250 {
1251 std::vector<KIID> selectedItems;
1252
1253 for( const EDA_ITEM* item : GetCurrentSelection() )
1254 selectedItems.emplace_back( item->m_Uuid );
1255
1257
1258 ReloadFootprint( newfp );
1259
1260 newfp->ClearAllNets();
1264
1265 std::vector<EDA_ITEM*> sel;
1266
1267 for( const KIID& uuid : selectedItems )
1268 {
1269 if( BOARD_ITEM* item = GetBoard()->ResolveItem( uuid, true ) )
1270 sel.push_back( item );
1271 }
1272
1273 if( !sel.empty() )
1274 m_toolManager->RunAction( ACTIONS::selectItems, &sel );
1275 }
1276 }
1277 catch( const IO_ERROR& ioe )
1278 {
1279 DisplayError( this, ioe.What() );
1280 }
1281 }
1282}
@ ERROR_INSIDE
constexpr EDA_IU_SCALE pcbIUScale
Definition base_units.h:128
constexpr int ARC_LOW_DEF
Definition base_units.h:143
@ NORMAL
Inactive layers are shown normally (no high-contrast mode)
BOX2< VECTOR2I > BOX2I
Definition box2.h:914
BOX2< VECTOR2D > BOX2D
Definition box2.h:915
static TOOL_ACTION selectItems
Select a list of items (specified as the event parameter)
Definition actions.h:228
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:37
VECTOR2D m_LocalOrigin
Relative Screen cursor coordinate (on grid) in user units.
Definition base_screen.h:86
void SetContentModified(bool aModified=true)
Definition base_screen.h:55
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:85
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:411
void Add(BOARD_ITEM *aItem, ADD_MODE aMode=ADD_MODE::INSERT, bool aSkipConnectivity=false) override
Removes an item from the container.
Definition board.cpp:1520
void UpdateUserUnits(BOARD_ITEM *aItem, KIGFX::VIEW *aView)
Update any references within aItem (or its descendants) to the user units.
Definition board.cpp:2044
const LSET & GetVisibleLayers() const
A proxy function that calls the correspondent function in m_BoardSettings.
Definition board.cpp:1188
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:369
FOOTPRINT * GetFirstFootprint() const
Get the first footprint on the board or nullptr.
Definition board.h:713
void IncrementTimeStamp()
Definition board.cpp:448
void SynchronizeProperties()
Copy the current project's text variables into the boards property cache.
Definition board.cpp:2949
BOARD_ITEM * ResolveItem(const KIID &aID, bool aAllowNullptrReturn=false) const
Definition board.cpp:2142
BOARD_DESIGN_SETTINGS & GetDesignSettings()
Definition board.cpp:1290
void SetUserUnits(EDA_UNITS aUnits)
Definition board.h:1033
constexpr void SetOrigin(const Vec &pos)
Definition box2.h:234
constexpr size_type GetWidth() const
Definition box2.h:211
constexpr Vec Centre() const
Definition box2.h:94
constexpr size_type GetHeight() const
Definition box2.h:212
constexpr const Vec & GetOrigin() const
Definition box2.h:207
constexpr void SetEnd(coord_type x, coord_type y)
Definition box2.h:294
static DELETED_BOARD_ITEM * GetInstance()
Definition board_item.h:641
Create and handle a window for the 3d viewer connected to a Kiway and a pcbboard.
FRAME_T GetFrameType() const
virtual APP_SETTINGS_BASE * config() const
Return the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
virtual void handleIconizeEvent(wxIconizeEvent &aEvent)
Handle a window iconize event.
virtual void OnModify()
Must be called after a model change in order to set the "modify" flag and do other frame-specific pro...
wxAuiManager m_auimgr
virtual bool IsContentModified() const
Get if the contents of the frame have been modified since the last save.
virtual void RecreateToolbars()
bool m_isClosing
Set by the close window event handler after frames are asked if they can close.
bool IsType(FRAME_T aType) const
virtual void ActivateGalCanvas()
Use to start up the GAL drawing canvas.
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType
The current canvas type.
virtual BASE_SCREEN * GetScreen() const
Return a pointer to a BASE_SCREEN or one of its derivatives.
void UpdateGridSelectBox()
Rebuild the grid combobox to respond to any changes in the GUI (units, user grid changes,...
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
EDA_DRAW_FRAME(KIWAY *aKiway, wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName, const EDA_IU_SCALE &aIuScale)
virtual void handleActivateEvent(wxActivateEvent &aEvent)
Handle a window activation event.
virtual void UpdateMsgPanel()
Redraw the message panel.
void FocusOnLocation(const VECTOR2I &aPos, bool aAllowScroll=true)
Useful to focus on a particular location, in find functions.
void UpdateStatusBar() override
Update the status bar information.
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual EDA_DRAW_PANEL_GAL * GetCanvas() const
Return a pointer to GAL-based canvas of given EDA draw frame.
void unitsChangeRefresh() override
Called when when the units setting has changed to allow for any derived classes to handle refreshing ...
std::vector< wxWindow * > findDialogs()
virtual void DisplayGridMsg()
Display current grid size in the status bar.
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
bool m_showBorderAndTitleBlock
bool GetShowPolarCoords() const
For those frames that support polar coordinates.
GAL_TYPE GetBackend() const
Return the type of backend currently used by GAL canvas.
virtual void SetHighContrastLayer(int aLayer)
Take care of display settings for the given layer to be displayed in high contrast mode.
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the KIGFX::VIEW_CONTROLS instance used in the panel.
virtual KIGFX::VIEW * GetView() const
Return a pointer to the KIGFX::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:158
const KIID m_Uuid
Definition eda_item.h:599
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
void SetBrightened()
Definition eda_item.h:151
A mix-in class (via multiple inheritance) that handles texts such as labels, parts,...
Definition eda_text.h:94
static const TOOL_EVENT ConnectivityChangedEvent
Definition actions.h:350
An interface to the global shared library manager that is schematic-specific and linked to one projec...
FOOTPRINT * LoadFootprint(const wxString &aNickname, const wxString &aName, bool aKeepUUID)
Load a FOOTPRINT having aName from the library given by aNickname.
void SetPosition(const VECTOR2I &aPos) override
void SetOrientation(const EDA_ANGLE &aNewAngle)
bool IsFlipped() const
Definition footprint.h:620
const LIB_ID & GetFPID() const
Definition footprint.h:417
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:379
A general implementation of a COLLECTORS_GUIDE.
Definition collectors.h:320
void SetIgnoreBlindBuriedVias(bool ignore)
Definition collectors.h:461
void SetIgnoreTracks(bool ignore)
Definition collectors.h:467
void SetIgnoreFootprintsOnFront(bool ignore)
Definition collectors.h:425
void SetIgnoreFPTextOnFront(bool ignore)
Definition collectors.h:413
void SetIgnoreMicroVias(bool ignore)
Definition collectors.h:464
void SetIgnoreFPTextOnBack(bool ignore)
Definition collectors.h:407
void SetIgnoreThroughVias(bool ignore)
Definition collectors.h:458
void SetIgnoreThroughHolePads(bool ignore)
Definition collectors.h:443
void SetIgnoreFPReferences(bool ignore)
Definition collectors.h:455
void SetIgnoreFPValues(bool ignore)
Definition collectors.h:449
void SetIgnoreFootprintsOnBack(bool ignore)
Definition collectors.h:419
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:101
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:94
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:87
virtual void Add(VIEW_ITEM *aItem, int aDrawPriority=-1) override
Add a VIEW_ITEM to the view.
Definition pcb_view.cpp:53
virtual void Remove(VIEW_ITEM *aItem) override
Remove a VIEW_ITEM from the view.
Definition pcb_view.cpp:70
void UpdateDisplayOptions(const PCB_DISPLAY_OPTIONS &aOptions)
Definition pcb_view.cpp:145
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:82
bool IsBOARD_ITEM() const
Definition view_item.h:98
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition view.h:68
void SetMirror(bool aMirrorX, bool aMirrorY)
Control the mirroring of the VIEW.
Definition view.cpp:888
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
Definition view.cpp:861
bool HasItem(const VIEW_ITEM *aItem) const
Indicates whether or not the given item has been added to the view.
Definition view.cpp:2617
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:791
void RecacheAllItems()
Rebuild GAL display lists.
Definition view.cpp:2222
bool IsMirroredY() const
Return true if view is flipped across the Y axis.
Definition view.h:280
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition view.cpp:2475
PAINTER * GetPainter() const
Return the painter object used by the view for drawing VIEW_ITEM objects.
Definition view.h:242
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:2492
Definition kiid.h:46
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:348
std::optional< LIBRARY_TABLE_ROW * > GetRow(const wxString &aNickname, LIBRARY_TABLE_SCOPE aScope=LIBRARY_TABLE_SCOPE::BOTH) const
Like LIBRARY_MANAGER::GetRow but filtered to the LIBRARY_TABLE_TYPE of this adapter.
std::optional< wxString > GetFullURI(LIBRARY_TABLE_TYPE aType, const wxString &aNickname, bool aSubstituted=false)
Return the full location specifying URI for the LIB, either in original UI form or in environment var...
const UTF8 & GetLibItemName() const
Definition lib_id.h:98
const UTF8 & GetLibNickname() const
Return the logical library name portion of a LIB_ID.
Definition lib_id.h:83
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:61
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition page_info.h:75
const VECTOR2D GetSizeIU(double aIUScale) const
Gets the page size in internal units.
Definition page_info.h:172
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...
void FocusOnItems(const std::vector< BOARD_ITEM * > &aItems, PCB_LAYER_ID aLayer=UNDEFINED_LAYER, bool aAllowScroll=true)
PCBNEW_SETTINGS * GetPcbNewSettings() const
virtual void SwitchLayer(PCB_LAYER_ID aLayer)
Change the active layer in the frame.
PCB_BASE_FRAME(KIWAY *aKiway, wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName)
virtual void SetActiveLayer(PCB_LAYER_ID aLayer)
void OnModify() override
Must be called after a change in order to set the "modify" flag and update other data structures and ...
const VECTOR2I & GetAuxOrigin() const
virtual PCB_VIEWERS_SETTINGS_BASE * GetViewerSettingsBase() const
const VECTOR2I GetUserOrigin() const
virtual MAGNETIC_SETTINGS * GetMagneticItemsSettings()
void 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
static bool displayOptionsRequireRecache(const PCB_DISPLAY_OPTIONS &aOld, const PCB_DISPLAY_OPTIONS &aNew)
Return true when moving from aOld to aNew changes drawn item geometry and therefore requires the GAL ...
const PAGE_INFO & GetPageSettings() const override
BOX2I GetBoardBoundingBox(bool aBoardEdgesOnly=false) const
Calculate the bounding box containing all board items (or board edge segments).
EDA_ITEM * ResolveItem(const KIID &aId, bool aAllowNullptrReturn=false) const override
Fetch an item by KIID.
PCB_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual void ActivateGalCanvas() override
Use to start up the GAL drawing canvas.
void SetDrawBgColor(const COLOR4D &aColor) override
void OnFpChangeDebounceTimer(wxTimerEvent &aEvent)
Handler for the filesystem watcher debounce timer.
virtual void SetBoard(BOARD *aBoard, PROGRESS_REPORTER *aReporter=nullptr)
Set the m_pcb member in such as way as to ensure deleting any previous BOARD.
virtual PCB_LAYER_ID GetActiveLayer() const
virtual void SetPageSettings(const PAGE_INFO &aPageSettings) override
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock) override
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
PCB_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
BOARD * GetBoard() const
virtual BOARD_DESIGN_SETTINGS & GetDesignSettings() const
Return the BOARD_DESIGN_SETTINGS for the open project.
virtual void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual void AddFootprintToBoard(FOOTPRINT *aFootprint)
Add the given footprint to the board.
virtual void doReCreateMenuBar() override
void SetDisplayOptions(const PCB_DISPLAY_OPTIONS &aOptions, bool aRefresh=true)
Update the current display options.
GENERAL_COLLECTORS_GUIDE GetCollectorsGuide()
virtual void SetPlotSettings(const PCB_PLOT_PARAMS &aSettings)
void FocusOnItem(EDA_ITEM *aItem, bool aAllowScroll=true) override
Focus on a particular canvas item.
PCB_DISPLAY_OPTIONS m_displayOptions
FOOTPRINT_EDITOR_SETTINGS * GetFootprintEditorSettings() const
void SetGridOrigin(const VECTOR2I &aPoint) override
PCB_ORIGIN_TRANSFORMS m_originTransforms
EDA_3D_VIEWER_FRAME * CreateAndShow3D_Frame()
Show the 3D view frame.
EDA_3D_VIEWER_FRAME * GetOur3DViewerFrame()
wxTimer m_watcherDebounceTimer
virtual COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Helper to retrieve the current color settings.
wxFileName m_watcherFileName
virtual void Update3DView(bool aMarkDirty, bool aRefresh, const wxString *aTitle=nullptr)
Update the 3D view, if the viewer is opened by this frame.
virtual void UpdateStatusBar() override
Update the status bar information.
bool m_FlipBoardView
true if the board is flipped to show the mirrored view
ZONE_DISPLAY_MODE m_ZoneDisplayMode
void UpdateColors()
Update the color settings in the painter and GAL.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the KIGFX::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()
Force refresh of the ratsnest visual representation.
Parameters and options when plotting/printing a board.
PCB_LAYER_ID m_Active_Layer
Definition pcb_screen.h:38
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:123
A progress reporter interface for use in multi-threaded environments.
static void Cleanup3DCache(PROJECT *aProject)
static FOOTPRINT_LIBRARY_ADAPTER * FootprintLibAdapter(PROJECT *aProject)
RAII class that sets an value at construction and resets it to the original value at destruction.
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:38
TOOL_MANAGER * m_toolManager
TOOL_DISPATCHER * m_toolDispatcher
bool ToolStackIsEmpty()
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:76
@ GAL_SWITCH
Rendering engine changes.
Definition tool_base.h:78
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:70
SHAPE_POLY_SET GetBoardOutline() const
Definition zone.cpp:951
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:2073
@ CLEANUP_FIRST
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
Definition confirm.cpp:274
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
Definition confirm.cpp:245
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition confirm.cpp:192
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:448
#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:29
@ FRAME_PCB_EDITOR
Definition frame_type.h:38
@ FRAME_CVPCB_DISPLAY
Definition frame_type.h:49
@ FRAME_FOOTPRINT_VIEWER
Definition frame_type.h:41
@ FRAME_FOOTPRINT_WIZARD
Definition frame_type.h:42
@ FRAME_FOOTPRINT_PREVIEW
Definition frame_type.h:44
@ FRAME_FOOTPRINT_CHOOSER
Definition frame_type.h:40
@ FRAME_FOOTPRINT_EDITOR
Definition frame_type.h:39
@ FRAME_PCB_DISPLAY3D
Definition frame_type.h:43
@ FRAME_CVPCB
Definition frame_type.h:48
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:741
@ LAYER_FOOTPRINTS_FR
Show footprints on front.
Definition layer_ids.h:255
@ LAYER_FP_REFERENCES
Show footprints references (when texts are visible).
Definition layer_ids.h:262
@ LAYER_PADS
Meta control for all pads opacity/visibility (color ignored).
Definition layer_ids.h:288
@ LAYER_TRACKS
Definition layer_ids.h:263
@ LAYER_FP_TEXT
Definition layer_ids.h:236
@ LAYER_FOOTPRINTS_BK
Show footprints on back.
Definition layer_ids.h:256
@ LAYER_FP_VALUES
Show footprints values (when texts are visible).
Definition layer_ids.h:259
@ LAYER_VIAS
Meta control for all vias opacity/visibility.
Definition layer_ids.h:228
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
@ Edge_Cuts
Definition layer_ids.h:108
@ B_Mask
Definition layer_ids.h:94
@ F_Mask
Definition layer_ids.h:93
@ UNDEFINED_LAYER
Definition layer_ids.h:57
Message panel definition file.
@ COLOR
Color has changed.
Definition view_item.h:50
@ REPAINT
Item needs to be redrawn.
Definition view_item.h:54
@ GEOMETRY
Position or shape has changed.
Definition view_item.h:51
@ ALL
All except INITIAL_ADD.
Definition view_item.h:55
bool IsNetworkPath(const wxString &aPath)
Determines if a given path is a network shared file apth On Windows for example, any form of path is ...
Declaration of the NL_PCBNEW_PLUGIN class.
wxDEFINE_EVENT(EDA_EVT_BOARD_CHANGING, wxCommandEvent)
@ PCB_ORIGIN_AUX
@ PCB_ORIGIN_GRID
@ PCB_ORIGIN_PAGE
PGM_BASE & Pgm()
The global program "get" accessor.
see class PGM_BASE
SEVERITY
@ RPT_SEVERITY_ACTION
KIWAY Kiway(KFCTL_STANDALONE)
float highlight_factor
How much to brighten highlighted objects by.
float select_factor
How much to brighten selected objects by.
wxString user_grid_x
std::vector< GRID > grids
wxString user_grid_y
Common grid settings, available to every frame.
GRID_SETTINGS grid
#define TEXTVARS_CHANGED
wxLogTrace helper definitions.
double RAD2DEG(double rad)
Definition trigo.h:179
@ PCB_SHAPE_T
class PCB_SHAPE, a segment not on copper layers
Definition typeinfo.h:80
@ PCB_DIM_ORTHOGONAL_T
class PCB_DIM_ORTHOGONAL, a linear dimension constrained to x/y
Definition typeinfo.h:98
@ PCB_DIM_LEADER_T
class PCB_DIM_LEADER, a leader dimension (graphic item)
Definition typeinfo.h:95
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
Definition typeinfo.h:89
@ PCB_DIM_CENTER_T
class PCB_DIM_CENTER, a center point marking (graphic item)
Definition typeinfo.h:96
@ PCB_TEXTBOX_T
class PCB_TEXTBOX, wrapped text on a layer
Definition typeinfo.h:85
@ PCB_ZONE_T
class ZONE, a copper pour area
Definition typeinfo.h:100
@ PCB_TEXT_T
class PCB_TEXT, text on a layer
Definition typeinfo.h:84
@ PCB_FIELD_T
class PCB_FIELD, text associated with a footprint property
Definition typeinfo.h:82
@ PCB_MARKER_T
class PCB_MARKER, a marker used to show something
Definition typeinfo.h:91
@ PCB_BARCODE_T
class PCB_BARCODE, a barcode (graphic item)
Definition typeinfo.h:93
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition typeinfo.h:78
@ PCB_DIM_ALIGNED_T
class PCB_DIM_ALIGNED, a linear dimension (graphic item)
Definition typeinfo.h:94
@ PCB_PAD_T
class PAD, a pad in a footprint
Definition typeinfo.h:79
@ PCB_ARC_T
class PCB_ARC, an arc track segment on a copper layer
Definition typeinfo.h:90
@ PCB_TRACE_T
class PCB_TRACK, a track segment (segment on a copper layer)
Definition typeinfo.h:88
@ PCB_DIM_RADIAL_T
class PCB_DIM_RADIAL, a radius or diameter dimension
Definition typeinfo.h:97
VECTOR2< int32_t > VECTOR2I
Definition vector2d.h:708
VECTOR2< double > VECTOR2D
Definition vector2d.h:707
VECTOR2D ToVECTOR2D(const wxPoint &aPoint)
Definition vector2wx.h:36
Definition of file extensions used in Kicad.