From c3fb1445c741c465d8528fc1af24dba51700fb20 Mon Sep 17 00:00:00 2001 From: Alex Shvartzkop Date: Tue, 5 Nov 2024 19:41:15 +0300 Subject: [PATCH] Fix assert failures in 3D renderer after padstack changes. Fixes https://gitlab.com/kicad/code/kicad/-/issues/19069 --- 3d-viewer/3d_canvas/board_adapter.h | 2 +- 3d-viewer/3d_canvas/create_3Dgraphic_brd_items.cpp | 12 +++++++++--- 3d-viewer/3d_canvas/create_layer_items.cpp | 7 +++---- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/3d-viewer/3d_canvas/board_adapter.h b/3d-viewer/3d_canvas/board_adapter.h index 55d6b0f791..f8e92fcf55 100644 --- a/3d-viewer/3d_canvas/board_adapter.h +++ b/3d-viewer/3d_canvas/board_adapter.h @@ -369,7 +369,7 @@ private: // Helper functions to create the board void createTrackWithMargin( const PCB_TRACK* aTrack, CONTAINER_2D_BASE* aDstContainer, - int aMargin = 0 ); + PCB_LAYER_ID aLayer, int aMargin = 0 ); void createPadWithMargin( const PAD *aPad, CONTAINER_2D_BASE* aDstContainer, PCB_LAYER_ID aLayer, const VECTOR2I& aMargin ) const; diff --git a/3d-viewer/3d_canvas/create_3Dgraphic_brd_items.cpp b/3d-viewer/3d_canvas/create_3Dgraphic_brd_items.cpp index 122539eb24..ab11cccadc 100644 --- a/3d-viewer/3d_canvas/create_3Dgraphic_brd_items.cpp +++ b/3d-viewer/3d_canvas/create_3Dgraphic_brd_items.cpp @@ -273,18 +273,23 @@ void BOARD_ADAPTER::addFootprintShapes( const FOOTPRINT* aFootprint, CONTAINER_2 } -void BOARD_ADAPTER::createTrackWithMargin( const PCB_TRACK* aTrack, CONTAINER_2D_BASE* aDstContainer, +void BOARD_ADAPTER::createTrackWithMargin( const PCB_TRACK* aTrack, + CONTAINER_2D_BASE* aDstContainer, PCB_LAYER_ID aLayer, int aMargin ) { SFVEC2F start3DU = TO_SFVEC2F( aTrack->GetStart() ); SFVEC2F end3DU = TO_SFVEC2F( aTrack->GetEnd() ); - float width3DU = TO_3DU( aTrack->GetWidth() + aMargin * 2 ); switch( aTrack->Type() ) { case PCB_VIA_T: + { + const PCB_VIA* via = static_cast( aTrack ); + float width3DU = TO_3DU( via->GetWidth( aLayer ) + aMargin * 2 ); + addFILLED_CIRCLE_2D( aDstContainer, start3DU, width3DU / 2.0, *aTrack ); break; + } case PCB_ARC_T: { @@ -299,7 +304,7 @@ void BOARD_ADAPTER::createTrackWithMargin( const PCB_TRACK* aTrack, CONTAINER_2D track.SetWidth( arc->GetWidth() ); track.SetLayer( arc->GetLayer() ); - createTrackWithMargin( &track, aDstContainer, aMargin ); + createTrackWithMargin( &track, aDstContainer, aLayer, aMargin ); return; } @@ -333,6 +338,7 @@ void BOARD_ADAPTER::createTrackWithMargin( const PCB_TRACK* aTrack, CONTAINER_2D case PCB_TRACE_T: // Track is a usual straight segment { + float width3DU = TO_3DU( aTrack->GetWidth() + aMargin * 2 ); addROUND_SEGMENT_2D( aDstContainer, start3DU, end3DU, width3DU, *aTrack ); break; } diff --git a/3d-viewer/3d_canvas/create_layer_items.cpp b/3d-viewer/3d_canvas/create_layer_items.cpp index 9b7374fcd5..7345bb5f11 100644 --- a/3d-viewer/3d_canvas/create_layer_items.cpp +++ b/3d-viewer/3d_canvas/create_layer_items.cpp @@ -206,9 +206,8 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) else { m_trackCount++; + m_averageTrackWidth += static_cast( track->GetWidth() * m_biuTo3Dunits ); } - - m_averageTrackWidth += static_cast( track->GetWidth() * m_biuTo3Dunits ); } if( m_trackCount ) @@ -280,7 +279,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) } // Add object item to layer container - createTrackWithMargin( track, layerContainer ); + createTrackWithMargin( track, layerContainer, layer ); } } @@ -888,7 +887,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) continue; int maskExpansion = track->GetSolderMaskExpansion(); - createTrackWithMargin( track, layerContainer, maskExpansion ); + createTrackWithMargin( track, layerContainer, layer, maskExpansion ); } }