KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pcb_draw_panel_gal.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) 2014-2017 CERN
5 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
6 * @author Maciej Suminski <[email protected]>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
22#include "pcb_draw_panel_gal.h"
23
25#include <pcb_view.h>
27#include <pcb_painter.h>
30
31#include <board.h>
32#include <footprint.h>
33#include <pad.h>
34#include <pcb_track.h>
35#include <macros.h>
36#include <pcb_generator.h>
37#include <pcb_marker.h>
38#include <pcb_point.h>
39#include <pcb_grid_item.h>
40#include <pcb_base_frame.h>
41#include <pcbnew_settings.h>
44#include <pcb_board_outline.h>
45
46#include <pgm_base.h>
48#include <confirm.h>
49#include <progress_reporter.h>
50#include <string_utils.h>
51
53#include <zoom_defines.h>
54
55#include <functional>
56#include <memory>
57#include <thread>
58#include <fmt/format.h>
59
60using namespace std::placeholders;
61
62
63const int GAL_LAYER_ORDER[] = {
66
68
70
72
78
109
111
113
115
120
123 // POINT_LAYER_FOR( F_Cu ),
127
188
193
196
209
212
221
224
226
228};
229
230
231PCB_DRAW_PANEL_GAL::PCB_DRAW_PANEL_GAL( wxWindow* aParentWindow, wxWindowID aWindowId,
232 const wxPoint& aPosition, const wxSize& aSize,
233 KIGFX::GAL_DISPLAY_OPTIONS& aOptions, GAL_TYPE aGalType ) :
234 EDA_DRAW_PANEL_GAL( aParentWindow, aWindowId, aPosition, aSize, aOptions, aGalType )
235{
236 m_view = new KIGFX::PCB_VIEW();
237 m_view->SetGAL( m_gal );
238
240
241 if( EDA_BASE_FRAME* frame = dynamic_cast<EDA_BASE_FRAME*>( aParentWindow ) )
242 frameType = frame->GetFrameType();
243
244 m_painter = std::make_unique<KIGFX::PCB_PAINTER>( m_gal, frameType );
245 m_view->SetPainter( m_painter.get() );
246
247 // This fixes the zoom in and zoom out limits:
249
252
253 // View controls is the first in the event handler chain, so the Tool Framework operates
254 // on updated viewport data.
256
257 // Load display options (such as filled/outline display of items).
258 // Can be made only if the parent window is an EDA_DRAW_FRAME (or a derived class)
259 // which is not always the case (namely when it is used from a wxDialog like the pad editor)
260 if( !IsDialogPreview() )
261 {
262 KIGFX::PCB_VIEW* view = static_cast<KIGFX::PCB_VIEW*>( m_view );
263 PCB_BASE_FRAME* frame = dynamic_cast<PCB_BASE_FRAME*>( GetParentEDAFrame() );
264
265 if( frame )
266 view->UpdateDisplayOptions( frame->GetDisplayOptions() );
267 }
268}
269
270
274
275
277{
278 m_view->Clear();
279
280 aBoard->CacheTriangulation( aReporter );
281
282 if( m_drawingSheet )
283 m_drawingSheet->SetFileName( TO_UTF8( aBoard->GetFileName() ) );
284
285 // Collect all board items, expanding footprints into their children (pads, fields,
286 // graphics, zones) which are individually registered in the VIEW for rendering and
287 // selection. Then bulk-load all items in a single pass for efficient R-tree construction.
288 std::vector<KIGFX::VIEW_ITEM*> viewItems;
289
290 for( BOARD_ITEM* item : aBoard->GetItemSet() )
291 {
292 // Geometry-free items (constraints) are never rendered; VIEW::Add would stamp their
293 // view data on an empty layer set and risk a later "already in a different view" assert.
294 if( item->Type() == PCB_CONSTRAINT_T )
295 continue;
296
297 viewItems.push_back( item );
298
299 if( item->Type() == PCB_FOOTPRINT_T )
300 {
301 static_cast<FOOTPRINT*>( item )->RunOnChildren(
302 [&viewItems]( BOARD_ITEM* child )
303 {
304 if( child->Type() != PCB_CONSTRAINT_T )
305 viewItems.push_back( child );
306 },
308 }
309 }
310
311 m_view->AddBatch( viewItems );
312
313 aBoard->UpdateBoardOutline();
314 m_view->Add( aBoard->BoardOutline() );
315
316 // Ratsnest
317 if( !aBoard->IsFootprintHolder() )
318 {
319 m_ratsnest = std::make_unique<RATSNEST_VIEW_ITEM>( aBoard->GetConnectivity() );
320 m_view->Add( m_ratsnest.get() );
321 }
322}
323
324
326{
327 m_drawingSheet.reset( aDrawingSheet );
328 m_view->Add( m_drawingSheet.get() );
329}
330
331
333{
335 PCB_BASE_FRAME* frame = dynamic_cast<PCB_BASE_FRAME*>( GetParentEDAFrame() );
336
337 if( frame )
338 cs = frame->GetColorSettings();
339 else if( PCBNEW_SETTINGS* cfg = GetAppSettings<PCBNEW_SETTINGS>( "pcbnew" ) )
340 cs = ::GetColorSettings( cfg->m_ColorTheme );
341
342 wxCHECK_RET( cs, wxT( "null COLOR_SETTINGS" ) );
343
344 auto rs = static_cast<KIGFX::PCB_RENDER_SETTINGS*>( m_view->GetPainter()->GetSettings() );
345 rs->LoadColors( cs );
346
347 m_gal->SetGridColor( cs->GetColor( LAYER_GRID ) );
348 m_gal->SetAxesColor( cs->GetColor( LAYER_GRID_AXES ) );
349 m_gal->SetCursorColor( cs->GetColor( LAYER_CURSOR ) );
350}
351
352
354{
355 std::vector<KIGFX::GRID_SOURCE> sources;
356
357 BOARD* board = nullptr;
358
359 if( PCB_BASE_FRAME* frame = dynamic_cast<PCB_BASE_FRAME*>( GetParentEDAFrame() ) )
360 board = frame->GetBoard();
361
362 // The "Grid Items" object visibility toggle hides the rendered grid
363 // content; the items themselves (selection decorations, snap) follow
364 // the same flag at their own sites.
365 if( !board || !board->IsElementVisible( LAYER_SUBGRIDS ) )
366 {
367 m_gal->SetGridSources( std::move( sources ) );
368 return;
369 }
370
371 // Grid content color comes from the "Grid Items" entry of the color
372 // theme, falling back to the global grid color.
373 COLOR4D gridItemColor = m_gal->GetGridColor();
374
375 if( PCB_BASE_FRAME* frame = dynamic_cast<PCB_BASE_FRAME*>( GetParentEDAFrame() ) )
376 {
377 if( COLOR_SETTINGS* cs = frame->GetColorSettings() )
378 gridItemColor = cs->GetColor( LAYER_SUBGRIDS );
379 }
380
381 for( BOARD_ITEM* item : board->Drawings() )
382 {
383 if( item->Type() != PCB_GRID_ITEM_T )
384 continue;
385
386 PCB_GRID_ITEM* grid = static_cast<PCB_GRID_ITEM*>( item );
387
388 // Priority 0 is the background grid's; a grid item must never sink behind it.
389 wxASSERT( grid->GetAssignedPriority() > 0 );
390
392 static_cast<GRID_GEOMETRY&>( src ) = grid->AsGridGeometry();
393
394 // Pitch is a loop step in the renderer; the spacing setters keep it positive.
395 wxASSERT( src.pitch.x > 0.0 && src.pitch.y > 0.0 );
396
397 src.tick = grid->GetTickInterval();
398 src.highlighted = grid->IsSelected();
399 src.snapCursor = grid->Affects().cursor && !grid->IsSelected();
400 src.color = gridItemColor;
401 src.style = m_gal->GetGridStyle(); // inherit display style
402
403 sources.push_back( src );
404 }
405
406 m_gal->SetGridSources( std::move( sources ) );
407}
408
409
411{
412 // Set display settings for high contrast mode
413 KIGFX::RENDER_SETTINGS* rSettings = m_view->GetPainter()->GetSettings();
414
415 SetTopLayer( aLayer );
416 rSettings->SetActiveLayer( aLayer );
417
418 rSettings->ClearHighContrastLayers();
419 rSettings->SetLayerIsHighContrast( aLayer );
420
421 if( IsCopperLayer( aLayer ) )
422 {
423 // Bring some other layers to the front in case of copper layers and make them colored
424 // fixme do not like the idea of storing the list of layers here,
425 // should be done in some other way I guess..
426 int layers[] = {
428 GetNetnameLayer( aLayer ),
431 PAD_COPPER_LAYER_FOR( aLayer ),
432 VIA_COPPER_LAYER_FOR( aLayer ),
433 ZONE_LAYER_FOR( aLayer ),
434 BITMAP_LAYER_FOR( aLayer ),
435 POINT_LAYER_FOR( aLayer ),
445 };
446
447 for( int i : layers )
448 rSettings->SetLayerIsHighContrast( i );
449
450 for( int i = LAYER_UI_START; i < LAYER_UI_END; ++i )
451 rSettings->SetLayerIsHighContrast( i );
452
453 // Pads should be shown too
454 if( aLayer == B_Cu )
455 {
457 }
458 else if( aLayer == F_Cu )
459 {
461 }
462 }
463
464 m_view->UpdateAllLayersColor();
465}
466
467
469{
470 m_view->ClearTopLayers();
472 m_view->SetTopLayer( aLayer );
473
474 // Layers that should always have on-top attribute enabled
475 const std::vector<int> layers = {
481 };
482
483 for( auto layer : layers )
484 m_view->SetTopLayer( layer );
485
486 for( int i = LAYER_UI_START; i < LAYER_UI_END; i++ )
487 m_view->SetTopLayer( i );
488
489 // Extra layers that are brought to the top if a F.* or B.* is selected
490 const std::vector<int> frontLayers = {
493 };
494
495 const std::vector<int> backLayers = {
498 };
499
500 const std::vector<int>* extraLayers = nullptr;
501
502 // Bring a few more extra layers to the top depending on the selected board side
503 if( IsFrontLayer( aLayer ) )
504 extraLayers = &frontLayers;
505 else if( IsBackLayer( aLayer ) )
506 extraLayers = &backLayers;
507
508 if( extraLayers )
509 {
510 for( auto layer : *extraLayers )
511 {
512 m_view->SetTopLayer( layer );
513
514 if( layer < PCB_LAYER_ID_COUNT )
515 {
516 m_view->SetTopLayer( ZONE_LAYER_FOR( layer ) );
517 m_view->SetTopLayer( PAD_COPPER_LAYER_FOR( layer ) );
518 m_view->SetTopLayer( VIA_COPPER_LAYER_FOR( layer ) );
519 m_view->SetTopLayer( CLEARANCE_LAYER_FOR( layer ) );
520 m_view->SetTopLayer( POINT_LAYER_FOR( layer ) );
521 }
522 }
523
524 // Move the active layer to the top of the stack but below all the overlay layers
525 if( !IsCopperLayer( aLayer ) )
526 {
527 m_view->SetLayerOrder( aLayer, m_view->GetLayerOrder( LAYER_MARKER_SHADOWS ) + 1 );
528 m_view->SetLayerOrder( ZONE_LAYER_FOR( aLayer ),
529 m_view->GetLayerOrder( LAYER_MARKER_SHADOWS ) + 2 );
530 m_view->SetLayerOrder( POINT_LAYER_FOR( aLayer ),
531 m_view->GetLayerOrder( LAYER_MARKER_SHADOWS ) + 3 );
532
533 // Fix up pad and via netnames to be below. This is hacky, we need a rethink
534 // of layer ordering...
535 m_view->SetLayerOrder( LAYER_PAD_NETNAMES,
536 m_view->GetLayerOrder( LAYER_MARKER_SHADOWS ) + 4 );
537 m_view->SetLayerOrder( LAYER_VIA_NETNAMES,
538 m_view->GetLayerOrder( LAYER_MARKER_SHADOWS ) + 5 );
539 }
540 }
541
542 if( IsCopperLayer( aLayer ) )
543 {
544 m_view->SetTopLayer( ZONE_LAYER_FOR( aLayer ) );
545 m_view->SetTopLayer( PAD_COPPER_LAYER_FOR( aLayer ) );
546 m_view->SetTopLayer( VIA_COPPER_LAYER_FOR( aLayer ) );
547 m_view->SetTopLayer( CLEARANCE_LAYER_FOR( aLayer ) );
548
549 // Display labels for copper layers on the top
550 m_view->SetTopLayer( GetNetnameLayer( aLayer ) );
551 }
552
553 m_view->SetTopLayer( POINT_LAYER_FOR( aLayer ) );
554 m_view->SetTopLayer( BITMAP_LAYER_FOR( aLayer ) );
555 m_view->EnableTopLayer( true );
556 m_view->UpdateAllLayersOrder();
557}
558
559
561{
562 // Load layer & elements visibility settings
563 for( int i = 0; i < PCB_LAYER_ID_COUNT; ++i )
564 m_view->SetLayerVisible( i, aBoard->IsLayerVisible( PCB_LAYER_ID( i ) ) );
565
567 m_view->SetLayerVisible( i, aBoard->IsElementVisible( i ) );
568
569 // Via layers controlled by dependencies
570 m_view->SetLayerVisible( LAYER_VIA_MICROVIA, true );
571 m_view->SetLayerVisible( LAYER_VIA_BLIND, true );
572 m_view->SetLayerVisible( LAYER_VIA_BURIED, true );
573 m_view->SetLayerVisible( LAYER_VIA_THROUGH, true );
574
575 // Always enable netname layers, as their visibility is controlled by layer dependencies
576 for( int i = NETNAMES_LAYER_ID_START; i < NETNAMES_LAYER_ID_END; ++i )
577 m_view->SetLayerVisible( i, true );
578
579 for( int i = LAYER_ZONE_START; i < LAYER_ZONE_END; i++ )
580 m_view->SetLayerVisible( i, true );
581
582 for( int i = LAYER_PAD_COPPER_START; i < LAYER_PAD_COPPER_END; i++ )
583 m_view->SetLayerVisible( i, true );
584
585 for( int i = LAYER_VIA_COPPER_START; i < LAYER_VIA_COPPER_END; i++ )
586 m_view->SetLayerVisible( i, true );
587
588 // Holes draw their drill map symbols here. Whether anything appears is governed by the
589 // documentation layer these depend on, not by this flag
590 for( int i = LAYER_DRILL_SYMBOL_START; i < LAYER_DRILL_SYMBOL_END; i++ )
591 m_view->SetLayerVisible( i, true );
592
593 for( int i = LAYER_CLEARANCE_START; i < LAYER_CLEARANCE_END; i++ )
594 m_view->SetLayerVisible( i, false );
595
596 for( int i = LAYER_POINT_START; i < LAYER_POINT_END; i++ )
597 m_view->SetLayerVisible( i, true );
598
599 for( int i = LAYER_BITMAP_START; i < LAYER_BITMAP_END; i++ )
600 m_view->SetLayerVisible( i, true );
601
602 for( int i = LAYER_UI_START; i < LAYER_UI_END; i++ )
603 m_view->SetLayerVisible( i, true );
604
605 // Enable some layers that are GAL specific
606 m_view->SetLayerVisible( LAYER_PAD_PLATEDHOLES, true );
607 m_view->SetLayerVisible( LAYER_NON_PLATEDHOLES, true );
608 m_view->SetLayerVisible( LAYER_PAD_HOLEWALLS, true );
609 m_view->SetLayerVisible( LAYER_VIA_HOLES, true );
610 m_view->SetLayerVisible( LAYER_VIA_HOLEWALLS, true );
611 m_view->SetLayerVisible( LAYER_GP_OVERLAY, true );
612 m_view->SetLayerVisible( LAYER_SELECT_OVERLAY, true );
613 m_view->SetLayerVisible( LAYER_RATSNEST, true );
614 m_view->SetLayerVisible( LAYER_MARKER_SHADOWS, true );
615 m_view->SetLayerVisible( LAYER_DRC_HIGHLIGHTED, true );
616}
617
618
620 std::vector<MSG_PANEL_ITEM>& aList )
621{
622 BOARD* board = static_cast<PCB_BASE_FRAME*>( GetParentEDAFrame() )->GetBoard();
623 int padCount = 0;
624 int viaCount = 0;
625 int trackSegmentCount = 0;
626 std::set<int> netCodes;
627 int unconnected = (int) board->GetConnectivity()->GetUnconnectedCount( true );
628
629 for( PCB_TRACK* item : board->Tracks() )
630 {
631 if( item->Type() == PCB_VIA_T )
632 viaCount++;
633 else
634 trackSegmentCount++;
635
636 if( item->GetNetCode() > 0 )
637 netCodes.insert( item->GetNetCode() );
638 }
639
640 for( FOOTPRINT* footprint : board->Footprints() )
641 {
642 for( PAD* pad : footprint->Pads() )
643 {
644 padCount++;
645
646 if( pad->GetNetCode() > 0 )
647 netCodes.insert( pad->GetNetCode() );
648 }
649 }
650
651 aList.emplace_back( _( "Pads" ), fmt::format( "{}", padCount ) );
652 aList.emplace_back( _( "Vias" ), fmt::format( "{}", viaCount ) );
653 aList.emplace_back( _( "Track Segments" ), fmt::format( "{}", trackSegmentCount ) );
654 aList.emplace_back( _( "Nets" ), fmt::format( "{}", (int) netCodes.size() ) );
655 aList.emplace_back( _( "Unrouted" ), fmt::format( "{}", unconnected ) );
656}
657
658
660{
661 PCB_BASE_FRAME* frame = nullptr;
662
663 if( !IsDialogPreview() )
664 frame = dynamic_cast<PCB_BASE_FRAME*>( GetParentEDAFrame() );
665
666 try
667 {
668 // Check if the current rendering back end can be properly initialized
669 m_view->UpdateItems();
670 }
671 catch( const std::runtime_error& e )
672 {
673 DisplayError( GetParent(), e.what() );
674
675 // Use the fallback if we have one
676 if( GAL_FALLBACK != m_backend )
677 {
679
680 if( frame )
681 frame->ActivateGalCanvas();
682 }
683 }
684
685 if( frame )
686 {
687 SetTopLayer( frame->GetActiveLayer() );
688
689 KIGFX::PCB_PAINTER* painter = static_cast<KIGFX::PCB_PAINTER*>( m_view->GetPainter() );
690 KIGFX::PCB_RENDER_SETTINGS* settings = painter->GetSettings();
691
692 settings->LoadDisplayOptions( frame->GetDisplayOptions() );
694 }
695}
696
697
699{
700 for( int i = 0; (unsigned) i < sizeof( GAL_LAYER_ORDER ) / sizeof( int ); ++i )
701 {
702 int layer = GAL_LAYER_ORDER[i];
703 wxASSERT( layer < KIGFX::VIEW::VIEW_MAX_LAYERS );
704
705 // MW: Gross hack to make SetTopLayer bring the correct bitmap layer to
706 // the top of the other bitmaps, but still below all the other layers
707 if( layer >= LAYER_BITMAP_START && layer < LAYER_BITMAP_END )
708 aView->SetLayerOrder( layer, i - KIGFX::VIEW::TOP_LAYER_MODIFIER, false );
709 else
710 aView->SetLayerOrder( layer, i, false );
711 }
712
713 // Drill symbol layers are not listed in the table above. Each one draws with the
714 // documentation layer whose map owns it
715 for( int i = 0; i < PCB_LAYER_ID_COUNT; ++i )
716 {
717 const PCB_LAYER_ID boardLayer = static_cast<PCB_LAYER_ID>( i );
718
719 aView->SetLayerOrder( DRILL_SYMBOL_LAYER_FOR( boardLayer ),
720 aView->GetLayerOrder( boardLayer ), false );
721 }
722
723 aView->SortOrderedLayers();
724}
725
726
731
732
734{
735 bool rv = EDA_DRAW_PANEL_GAL::SwitchBackend( aGalType );
737 m_gal->SetWorldUnitLength( 1e-9 /* 1 nm */ / 0.0254 /* 1 inch in meters */ );
738 return rv;
739}
740
741
743{
744 if( m_ratsnest )
745 m_view->Update( m_ratsnest.get() );
746}
747
748
750{
751 if( m_drawingSheet && m_view->IsLayerVisible( LAYER_DRAWINGSHEET ) )
752 return m_drawingSheet->ViewBBox();
753
754 return BOX2I();
755}
756
757
759{
760 // caching makes no sense for Cairo and other software renderers
762
763 for( int i = 0; i < KIGFX::VIEW::VIEW_MAX_LAYERS; i++ )
764 m_view->SetLayerTarget( i, target );
765
766 // A map's offset changes while its hole owners do not. Rebuilding every drilled pad and
767 // via on each mouse event makes dragging scale with the board's hole count.
768 for( int i = LAYER_DRILL_SYMBOL_START; i < LAYER_DRILL_SYMBOL_END; ++i )
769 m_view->SetLayerTarget( i, KIGFX::TARGET_NONCACHED );
770
771 for( int i = 0; (unsigned) i < sizeof( GAL_LAYER_ORDER ) / sizeof( int ); ++i )
772 {
773 int layer = GAL_LAYER_ORDER[i];
774 wxASSERT( layer < KIGFX::VIEW::VIEW_MAX_LAYERS );
775
776 // Set layer display dependencies & targets
777 if( IsCopperLayer( layer ) )
778 {
779 m_view->SetRequired( ZONE_LAYER_FOR( layer ), layer );
780 m_view->SetRequired( PAD_COPPER_LAYER_FOR( layer ), layer );
781 m_view->SetRequired( VIA_COPPER_LAYER_FOR( layer ), layer );
782 m_view->SetRequired( CLEARANCE_LAYER_FOR( layer ), layer );
783 m_view->SetRequired( POINT_LAYER_FOR( layer ), layer );
784
785 m_view->SetRequired( BITMAP_LAYER_FOR( layer ), layer );
786 m_view->SetLayerTarget( BITMAP_LAYER_FOR( layer ), KIGFX::TARGET_NONCACHED );
787 m_view->SetRequired( GetNetnameLayer( layer ), layer );
788 m_view->SetRequired( DRILL_SYMBOL_LAYER_FOR( layer ), layer );
789 }
790 else if( IsNonCopperLayer( layer ) )
791 {
792 m_view->SetRequired( POINT_LAYER_FOR( layer ), layer );
793 m_view->SetRequired( ZONE_LAYER_FOR( layer ), layer );
794 m_view->SetLayerTarget( BITMAP_LAYER_FOR( layer ), KIGFX::TARGET_NONCACHED );
795 m_view->SetRequired( BITMAP_LAYER_FOR( layer ), layer );
796 m_view->SetRequired( DRILL_SYMBOL_LAYER_FOR( layer ), layer );
797 }
798 else if( IsNetnameLayer( layer ) )
799 {
800 m_view->SetLayerDisplayOnly( layer );
801 }
802 }
803
804 m_view->SetLayerTarget( LAYER_ANCHOR, KIGFX::TARGET_NONCACHED );
805 m_view->SetLayerDisplayOnly( LAYER_ANCHOR );
806
807 // Use TARGET_OVERLAY for LAYER_CONFLICTS_SHADOW, it is for items
808 // that may change while the view stays the same.
810
811 // Constraint shadow drawn under item like locked-item shadow
812 // kept on cached target not overlay and re-cached on set change
813 m_view->SetLayerDisplayOnly( LAYER_LOCKED_ITEM_SHADOW );
814 m_view->SetLayerDisplayOnly( LAYER_CONFLICTS_SHADOW );
815 m_view->SetLayerDisplayOnly( LAYER_CONSTRAINT_SHADOW );
816 m_view->SetLayerDisplayOnly( LAYER_BOARD_OUTLINE_AREA );
817
818 // Some more required layers settings
819 m_view->SetRequired( LAYER_PAD_NETNAMES, LAYER_PADS );
820
821 // Holes can be independent of their host objects (cf: printing drill marks)
822 m_view->SetRequired( LAYER_VIA_HOLES, LAYER_VIAS );
823 m_view->SetRequired( LAYER_VIA_HOLEWALLS, LAYER_VIAS );
824 m_view->SetRequired( LAYER_PAD_PLATEDHOLES, LAYER_PADS );
825 m_view->SetRequired( LAYER_PAD_HOLEWALLS, LAYER_PADS );
826 m_view->SetRequired( LAYER_NON_PLATEDHOLES, LAYER_PADS );
827
828 // Via visibility
829 m_view->SetRequired( LAYER_VIA_MICROVIA, LAYER_VIAS );
830 m_view->SetRequired( LAYER_VIA_BLIND, LAYER_VIAS );
831 m_view->SetRequired( LAYER_VIA_BURIED, LAYER_VIAS );
832 m_view->SetRequired( LAYER_VIA_THROUGH, LAYER_VIAS );
833 m_view->SetRequired( LAYER_VIA_NETNAMES, LAYER_VIAS );
834
836 m_view->SetLayerDisplayOnly( LAYER_SELECT_OVERLAY ) ;
838 m_view->SetLayerDisplayOnly( LAYER_GP_OVERLAY ) ;
839 m_view->SetLayerTarget( LAYER_RATSNEST, KIGFX::TARGET_OVERLAY );
840 m_view->SetLayerDisplayOnly( LAYER_RATSNEST );
841
842 m_view->SetLayerTarget( LAYER_DRC_ERROR, KIGFX::TARGET_OVERLAY );
846 m_view->SetLayerDisplayOnly( LAYER_MARKER_SHADOWS );
847
849 m_view->SetLayerDisplayOnly( LAYER_DRAWINGSHEET ) ; // drawing sheet can't be selected
850 m_view->SetLayerDisplayOnly( LAYER_GRID ); // grid can't be selected
851
852 for( int i = LAYER_UI_START; i < LAYER_UI_END; ++i )
853 {
854 m_view->SetLayerTarget( i, KIGFX::TARGET_OVERLAY );
855 m_view->SetLayerDisplayOnly( i );
856 }
857}
858
859
861{
862 return static_cast<KIGFX::PCB_VIEW*>( m_view );
863}
BOX2< VECTOR2I > BOX2I
Definition box2.h:927
A base class for any item which can be embedded within the BOARD container class, and therefore insta...
Definition board_item.h:84
virtual const BOARD * GetBoard() const
Return the BOARD in which this BOARD_ITEM resides, or NULL if none.
Information pertinent to a Pcbnew printed circuit board.
Definition board.h:409
bool IsFootprintHolder() const
Find out if the board is being used to hold a single footprint for editing/viewing.
Definition board.h:439
bool IsElementVisible(GAL_LAYER_ID aLayer) const
Test whether a given element category is visible.
Definition board.cpp:1250
PCB_BOARD_OUTLINE * BoardOutline()
Definition board.h:478
void UpdateBoardOutline()
Definition board.cpp:4462
const FOOTPRINTS & Footprints() const
Definition board.h:463
const BOARD_ITEM_SET GetItemSet()
Collect every owned item (tracks, zones, generators, footprints, drawings, markers,...
Definition board.cpp:4377
const TRACKS & Tracks() const
Definition board.h:461
const wxString & GetFileName() const
Definition board.h:452
bool IsLayerVisible(PCB_LAYER_ID aLayer) const
A proxy function that calls the correspondent function in m_BoardSettings tests whether a given layer...
Definition board.cpp:1189
std::shared_ptr< CONNECTIVITY_DATA > GetConnectivity() const
Return a list of missing connections between components/tracks.
Definition board.h:751
void CacheTriangulation(PROGRESS_REPORTER *aReporter=nullptr, const std::vector< ZONE * > &aZones={})
Definition board.cpp:1357
const DRAWINGS & Drawings() const
Definition board.h:465
Color settings are a bit different than most of the settings objects in that there can be more than o...
COLOR4D GetColor(int aLayer) const
unsigned int GetUnconnectedCount(bool aVisibileOnly) const
The base frame for deriving all KiCad main window classes.
The base class for create windows for drawing purpose.
static constexpr GAL_TYPE GAL_FALLBACK
std::unique_ptr< KIGFX::PAINTER > m_painter
Contains information about how to draw items using GAL.
KIGFX::GAL * m_gal
Interface for drawing objects on a 2D-surface.
EDA_DRAW_PANEL_GAL(wxWindow *aParentWindow, wxWindowID aWindowId, const wxPoint &aPosition, const wxSize &aSize, KIGFX::GAL_DISPLAY_OPTIONS &aOptions, GAL_TYPE aGalType=GAL_TYPE_OPENGL)
Create a drawing panel that is contained inside aParentWindow.
@ GAL_TYPE_OPENGL
OpenGL implementation.
KIGFX::VIEW * m_view
Stores view settings (scale, center, etc.) and items to be drawn.
KIGFX::WX_VIEW_CONTROLS * m_viewControls
Control for VIEW (moving, zooming, etc.)
virtual bool SwitchBackend(GAL_TYPE aGalType)
Switch method of rendering graphics.
GAL_TYPE m_backend
Currently used GAL.
EDA_DRAW_FRAME * GetParentEDAFrame() const
Returns parent EDA_DRAW_FRAME, if available or NULL otherwise.
KICAD_T Type() const
Returns the type of object.
Definition eda_item.h:110
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
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:84
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...
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 ClearHighContrastLayers()
Clear the list of active layers.
void SetActiveLayer(PCB_LAYER_ID aLayer)
void SetLayerIsHighContrast(int aLayerId, bool aEnabled=true)
Set the specified layer as high-contrast.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition view.h:63
static constexpr int TOP_LAYER_MODIFIER
Rendering order modifier for layers that are marked as top layers.
Definition view.h:776
int GetLayerOrder(int aLayer) const
Return rendering order of a particular layer.
Definition view.cpp:750
void SetLayerOrder(int aLayer, int aRenderingOrder, bool aAutoSort=true)
Set rendering order of a particular layer.
Definition view.cpp:741
static constexpr int VIEW_MAX_LAYERS
Maximum number of layers that may be shown.
Definition view.h:773
void SortOrderedLayers()
Sorts m_orderedLayers after layer rendering order has changed.
Definition view.cpp:1377
An implementation of class VIEW_CONTROLS for wxWidgets library.
Definition pad.h:61
DISPLAY_OPTIONS m_Display
Base PCB main window class for Pcbnew, Gerbview, and CvPcb footprint viewer.
const PCB_DISPLAY_OPTIONS & GetDisplayOptions() const
Display options control the way tracks, vias, outlines and other things are shown (for instance solid...
PCBNEW_SETTINGS * GetPcbNewSettings() const
virtual void ActivateGalCanvas() override
Use to start up the GAL drawing canvas.
virtual PCB_LAYER_ID GetActiveLayer() const
virtual COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const override
Helper to retrieve the current color settings.
void UpdateColors()
Update the color settings in the painter and GAL.
PCB_DRAW_PANEL_GAL(wxWindow *aParentWindow, wxWindowID aWindowId, const wxPoint &aPosition, const wxSize &aSize, KIGFX::GAL_DISPLAY_OPTIONS &aOptions, GAL_TYPE aGalType=GAL_TYPE_OPENGL)
BOX2I GetDefaultViewBBox() const override
Return the bounding box of the view that should be used if model is not valid.
virtual void SetTopLayer(int aLayer) override
SetTopLayer(), with some extra smarts for PCB.
void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList) override
Called when the window is shown for the first time.
std::unique_ptr< RATSNEST_VIEW_ITEM > m_ratsnest
Ratsnest view item.
void SetDrawingSheet(DS_PROXY_VIEW_ITEM *aDrawingSheet)
Sets (or updates) drawing-sheet used by the draw panel.
virtual KIGFX::PCB_VIEW * GetView() const override
Return a pointer to the #VIEW instance used in the panel.
void OnShow() override
Called when the window is shown for the first time.
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 SyncLayersVisibility(const BOARD *aBoard)
Update "visibility" property of each layer of a given BOARD.
void setDefaultLayerOrder()
< Reassign layer order to the initial settings.
virtual void SetHighContrastLayer(int aLayer) override
SetHighContrastLayer(), with some extra smarts for PCB.
std::unique_ptr< DS_PROXY_VIEW_ITEM > m_drawingSheet
Currently used drawing-sheet.
bool SwitchBackend(GAL_TYPE aGalType) override
Force refresh of the ratsnest visual representation.
void RedrawRatsnest()
Return the bounding box of the view that should be used if model is not valid.
void prepareGridSources() override
Push a GRID_SOURCE for every PCB_GRIDITEM on the board to the GAL.
A progress reporter interface for use in multi-threaded environments.
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.
#define _(s)
@ NO_RECURSE
Definition eda_item.h:52
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition frame_type.h:29
@ FRAME_FOOTPRINT_PREVIEW
Definition frame_type.h:44
@ LAYER_PAD_FR_NETNAMES
Additional netnames layers (not associated with a PCB layer).
Definition layer_ids.h:196
@ LAYER_PAD_BK_NETNAMES
Definition layer_ids.h:197
@ LAYER_PAD_NETNAMES
Definition layer_ids.h:198
@ NETNAMES_LAYER_ID_START
Definition layer_ids.h:190
@ NETNAMES_LAYER_ID_END
Definition layer_ids.h:201
@ LAYER_VIA_NETNAMES
Definition layer_ids.h:199
#define BITMAP_LAYER_FOR(boardLayer)
Macros for getting the extra layers for a given board layer.
Definition layer_ids.h:386
#define NETNAMES_LAYER_INDEX(layer)
Macro for obtaining netname layer for a given PCB layer.
Definition layer_ids.h:205
bool IsFrontLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a front layer.
Definition layer_ids.h:806
bool IsBackLayer(PCB_LAYER_ID aLayerId)
Layer classification: check if it's a back layer.
Definition layer_ids.h:829
#define POINT_LAYER_FOR(boardLayer)
Definition layer_ids.h:394
bool IsNonCopperLayer(int aLayerId)
Test whether a layer is a non copper layer.
Definition layer_ids.h:736
int GetNetnameLayer(int aLayer)
Return a netname layer corresponding to the given layer.
Definition layer_ids.h:880
bool IsCopperLayer(int aLayerId)
Test whether a layer is a copper layer.
Definition layer_ids.h:703
GAL_LAYER_ID
GAL layers are "virtual" layers, i.e.
Definition layer_ids.h:224
@ LAYER_GRID
Definition layer_ids.h:250
@ LAYER_DRILL_SYMBOL_START
Drill symbols, one channel per board layer.
Definition layer_ids.h:376
@ LAYER_POINTS
PCB reference/manual snap points visibility.
Definition layer_ids.h:317
@ GAL_LAYER_ID_START
Definition layer_ids.h:225
@ LAYER_LOCKED_ITEM_SHADOW
Shadow layer for locked items.
Definition layer_ids.h:303
@ LAYER_PAD_COPPER_START
Virtual layers for pad copper on a given copper layer.
Definition layer_ids.h:349
@ LAYER_VIA_HOLEWALLS
Definition layer_ids.h:294
@ LAYER_CLEARANCE_END
Definition layer_ids.h:358
@ LAYER_GRID_AXES
Definition layer_ids.h:251
@ LAYER_CONFLICTS_SHADOW
Shadow layer for items flagged conflicting.
Definition layer_ids.h:306
@ LAYER_FOOTPRINTS_FR
Show footprints on front.
Definition layer_ids.h:255
@ LAYER_ZONE_END
Definition layer_ids.h:346
@ LAYER_NON_PLATEDHOLES
Draw usual through hole vias.
Definition layer_ids.h:235
@ LAYER_VIA_STITCHING
Outline of via stitching generators.
Definition layer_ids.h:326
@ LAYER_DRAWINGSHEET
Sheet frame and title block.
Definition layer_ids.h:274
@ LAYER_FP_REFERENCES
Show footprints references (when texts are visible).
Definition layer_ids.h:262
@ LAYER_BOARD_OUTLINE_AREA
PCB board outline.
Definition layer_ids.h:314
@ LAYER_DRC_EXCLUSION
Layer for DRC markers which have been individually excluded.
Definition layer_ids.h:300
@ LAYER_POINT_END
Definition layer_ids.h:366
@ LAYER_DRC_HIGHLIGHTED
Color for highlighted DRC markers.
Definition layer_ids.h:337
@ LAYER_PADS
Meta control for all pads opacity/visibility (color ignored).
Definition layer_ids.h:288
@ LAYER_DRC_WARNING
Layer for DRC markers with #SEVERITY_WARNING.
Definition layer_ids.h:297
@ LAYER_UI_START
Definition layer_ids.h:369
@ LAYER_PAD_PLATEDHOLES
to draw pad holes (plated)
Definition layer_ids.h:267
@ GAL_LAYER_ID_END
Definition layer_ids.h:379
@ LAYER_GP_OVERLAY
General purpose overlay.
Definition layer_ids.h:275
@ LAYER_VIA_COPPER_START
Virtual layers for via copper on a given copper layer.
Definition layer_ids.h:353
@ LAYER_CONSTRAINT_SHADOW
Shadow layer for items bound to a constraint.
Definition layer_ids.h:320
@ LAYER_CURSOR
PCB cursor.
Definition layer_ids.h:278
@ LAYER_RATSNEST
Definition layer_ids.h:249
@ LAYER_CLEARANCE_START
Virtual layers for pad/via/track clearance outlines for a given copper layer.
Definition layer_ids.h:357
@ LAYER_DRILL_SYMBOL_END
Definition layer_ids.h:377
@ LAYER_PAD_COPPER_END
Definition layer_ids.h:350
@ LAYER_ZONE_START
Virtual layers for stacking zones and tracks on a given copper layer.
Definition layer_ids.h:345
@ LAYER_FP_TEXT
Definition layer_ids.h:236
@ LAYER_FOOTPRINTS_BK
Show footprints on back.
Definition layer_ids.h:256
@ LAYER_UI_END
Definition layer_ids.h:370
@ LAYER_ANCHOR
Anchor of items having an anchor point (texts, footprints).
Definition layer_ids.h:244
@ LAYER_VIA_BURIED
Draw blind vias.
Definition layer_ids.h:231
@ LAYER_VIA_COPPER_END
Definition layer_ids.h:354
@ LAYER_MARKER_SHADOWS
Shadows for DRC markers.
Definition layer_ids.h:301
@ LAYER_VIA_HOLES
Draw via holes (pad holes do not use this layer).
Definition layer_ids.h:270
@ LAYER_VIA_BLIND
Draw micro vias.
Definition layer_ids.h:230
@ LAYER_FP_VALUES
Show footprints values (when texts are visible).
Definition layer_ids.h:259
@ LAYER_POINT_START
Virtual layers for points per board layer.
Definition layer_ids.h:365
@ LAYER_VIA_MICROVIA
Definition layer_ids.h:229
@ LAYER_SELECT_OVERLAY
Selected items overlay.
Definition layer_ids.h:276
@ LAYER_VIA_THROUGH
Draw buried vias.
Definition layer_ids.h:232
@ LAYER_SUBGRIDS
Routing/placement subgrids (PCB_GRID_ITEM) visibility and color.
Definition layer_ids.h:323
@ LAYER_BITMAP_END
Definition layer_ids.h:362
@ LAYER_BITMAP_START
Virtual layers for background images per board layer.
Definition layer_ids.h:361
@ LAYER_DRC_ERROR
Layer for DRC markers with #SEVERITY_ERROR.
Definition layer_ids.h:273
@ LAYER_VIAS
Meta control for all vias opacity/visibility.
Definition layer_ids.h:228
@ LAYER_PAD_HOLEWALLS
Definition layer_ids.h:293
#define CLEARANCE_LAYER_FOR(boardLayer)
Definition layer_ids.h:390
#define DRILL_SYMBOL_LAYER_FOR(boardLayer)
Definition layer_ids.h:391
bool IsNetnameLayer(int aLayer)
Test whether a layer is a netname layer.
Definition layer_ids.h:895
#define VIA_COPPER_LAYER_FOR(boardLayer)
Definition layer_ids.h:389
PCB_LAYER_ID
A quick note on layer IDs:
Definition layer_ids.h:56
@ User_16
Definition layer_ids.h:135
@ In22_Cu
Definition layer_ids.h:83
@ In11_Cu
Definition layer_ids.h:72
@ User_29
Definition layer_ids.h:148
@ In29_Cu
Definition layer_ids.h:90
@ In30_Cu
Definition layer_ids.h:91
@ User_40
Definition layer_ids.h:159
@ User_15
Definition layer_ids.h:134
@ User_8
Definition layer_ids.h:127
@ F_CrtYd
Definition layer_ids.h:112
@ User_11
Definition layer_ids.h:130
@ User_25
Definition layer_ids.h:144
@ In17_Cu
Definition layer_ids.h:78
@ User_34
Definition layer_ids.h:153
@ User_45
Definition layer_ids.h:164
@ B_Adhes
Definition layer_ids.h:99
@ User_36
Definition layer_ids.h:155
@ Edge_Cuts
Definition layer_ids.h:108
@ Dwgs_User
Definition layer_ids.h:103
@ F_Paste
Definition layer_ids.h:100
@ In9_Cu
Definition layer_ids.h:70
@ Cmts_User
Definition layer_ids.h:104
@ User_6
Definition layer_ids.h:125
@ User_7
Definition layer_ids.h:126
@ In19_Cu
Definition layer_ids.h:80
@ User_19
Definition layer_ids.h:138
@ User_23
Definition layer_ids.h:142
@ In7_Cu
Definition layer_ids.h:68
@ In28_Cu
Definition layer_ids.h:89
@ In26_Cu
Definition layer_ids.h:87
@ F_Adhes
Definition layer_ids.h:98
@ User_41
Definition layer_ids.h:160
@ B_Mask
Definition layer_ids.h:94
@ B_Cu
Definition layer_ids.h:61
@ User_14
Definition layer_ids.h:133
@ User_39
Definition layer_ids.h:158
@ User_5
Definition layer_ids.h:124
@ User_20
Definition layer_ids.h:139
@ Eco1_User
Definition layer_ids.h:105
@ F_Mask
Definition layer_ids.h:93
@ In21_Cu
Definition layer_ids.h:82
@ User_42
Definition layer_ids.h:161
@ User_43
Definition layer_ids.h:162
@ In23_Cu
Definition layer_ids.h:84
@ B_Paste
Definition layer_ids.h:101
@ In15_Cu
Definition layer_ids.h:76
@ In2_Cu
Definition layer_ids.h:63
@ User_10
Definition layer_ids.h:129
@ User_9
Definition layer_ids.h:128
@ User_27
Definition layer_ids.h:146
@ User_28
Definition layer_ids.h:147
@ F_Fab
Definition layer_ids.h:115
@ In10_Cu
Definition layer_ids.h:71
@ Margin
Definition layer_ids.h:109
@ F_SilkS
Definition layer_ids.h:96
@ In4_Cu
Definition layer_ids.h:65
@ B_CrtYd
Definition layer_ids.h:111
@ Eco2_User
Definition layer_ids.h:106
@ In16_Cu
Definition layer_ids.h:77
@ In24_Cu
Definition layer_ids.h:85
@ In1_Cu
Definition layer_ids.h:62
@ User_35
Definition layer_ids.h:154
@ User_31
Definition layer_ids.h:150
@ User_3
Definition layer_ids.h:122
@ User_1
Definition layer_ids.h:120
@ User_12
Definition layer_ids.h:131
@ B_SilkS
Definition layer_ids.h:97
@ User_30
Definition layer_ids.h:149
@ User_37
Definition layer_ids.h:156
@ User_22
Definition layer_ids.h:141
@ User_38
Definition layer_ids.h:157
@ In13_Cu
Definition layer_ids.h:74
@ User_4
Definition layer_ids.h:123
@ In8_Cu
Definition layer_ids.h:69
@ User_21
Definition layer_ids.h:140
@ In14_Cu
Definition layer_ids.h:75
@ User_24
Definition layer_ids.h:143
@ PCB_LAYER_ID_COUNT
Definition layer_ids.h:167
@ User_13
Definition layer_ids.h:132
@ User_2
Definition layer_ids.h:121
@ In12_Cu
Definition layer_ids.h:73
@ User_17
Definition layer_ids.h:136
@ In27_Cu
Definition layer_ids.h:88
@ In6_Cu
Definition layer_ids.h:67
@ In5_Cu
Definition layer_ids.h:66
@ User_33
Definition layer_ids.h:152
@ User_26
Definition layer_ids.h:145
@ In3_Cu
Definition layer_ids.h:64
@ User_32
Definition layer_ids.h:151
@ In20_Cu
Definition layer_ids.h:81
@ User_18
Definition layer_ids.h:137
@ User_44
Definition layer_ids.h:163
@ F_Cu
Definition layer_ids.h:60
@ In18_Cu
Definition layer_ids.h:79
@ In25_Cu
Definition layer_ids.h:86
@ B_Fab
Definition layer_ids.h:114
#define ZONE_LAYER_FOR(boardLayer)
Definition layer_ids.h:387
#define PAD_COPPER_LAYER_FOR(boardLayer)
Definition layer_ids.h:388
This file contains miscellaneous commonly used macros and functions.
@ TARGET_NONCACHED
Auxiliary rendering target (noncached)
Definition definitions.h:34
@ TARGET_CACHED
Main rendering target (cached)
Definition definitions.h:33
@ TARGET_OVERLAY
Items that may change while the view stays the same (noncached)
Definition definitions.h:35
const int GAL_LAYER_ORDER[]
void ApplyPcbGalLayerOrder(KIGFX::VIEW *aView)
Apply pcbnew's canonical GAL layer order (copper and zones below silk, fab and courtyard) to any view...
void ApplyPcbGalLayerOrder(KIGFX::VIEW *aView)
Apply pcbnew's canonical GAL layer order (copper and zones below silk, fab and courtyard) to any view...
see class PGM_BASE
Class that computes missing connections on a PCB.
#define DEFAULT_THEME
COLOR_SETTINGS * GetColorSettings(const wxString &aName)
T * GetAppSettings(const char *aFilename)
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
Geometry of a regular grid (cartesian or polar) and the math operations for snapping and coverage tes...
VECTOR2D pitch
Cartesian: (dx, dy); polar: (dr, dPhi rad).
Render-time projection of a grid: GRID_GEOMETRY (kind/origin/pitch/orientation/extent) plus rendering...
bool snapCursor
Participate in the cursor snap (GAL::GetGridPoint).
unsigned tick
Major-tick interval (0 = inherit default).
bool highlighted
Render with edit-mode emphasis (selected grid).
@ PCB_CONSTRAINT_T
a geometric constraint between board items
Definition typeinfo.h:237
@ PCB_VIA_T
class PCB_VIA, a via (like a track segment on a copper layer)
Definition typeinfo.h:89
@ PCB_FOOTPRINT_T
class FOOTPRINT, a footprint
Definition typeinfo.h:78
@ PCB_GRID_ITEM_T
a subgrid placed on a board
Definition typeinfo.h:238
WX_VIEW_CONTROLS class definition.
#define ZOOM_MAX_LIMIT_PCBNEW
#define ZOOM_MIN_LIMIT_PCBNEW