3D viewer: do not show via/pad shapes of pads not connected on copper layers.

Show the same vias/pad shapes as plot functions.
This commit is contained in:
jean-pierre charras 2020-08-11 11:26:00 +02:00
parent a06a0c1236
commit 29d6fe88f0
3 changed files with 29 additions and 18 deletions

View File

@ -460,6 +460,10 @@ void BOARD_ADAPTER::AddPadsShapesWithClearanceToContainer( const MODULE* aModule
if( !pad->IsOnLayer( aLayerId ) ) if( !pad->IsOnLayer( aLayerId ) )
continue; continue;
// Skip pad annulus when not connected on this layer (if removing is enabled)
if( !pad->IsPadOnLayer( aLayerId ) && IsCopperLayer( aLayerId ) )
continue;
// NPTH pads are not drawn on layers if the // NPTH pads are not drawn on layers if the
// shape size and pos is the same as their hole: // shape size and pos is the same as their hole:
if( aSkipNPTHPadsWihNoCopper && (pad->GetAttribute() == PAD_ATTRIB_HOLE_NOT_PLATED) ) if( aSkipNPTHPadsWihNoCopper && (pad->GetAttribute() == PAD_ATTRIB_HOLE_NOT_PLATED) )

View File

@ -220,7 +220,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
CBVHCONTAINER2D *layerContainer = m_layers_container2D[curr_layer_id]; CBVHCONTAINER2D *layerContainer = m_layers_container2D[curr_layer_id];
// ADD TRACKS // Add track segments shapes and via annulus shapes
unsigned int nTracks = trackList.size(); unsigned int nTracks = trackList.size();
for( unsigned int trackIdx = 0; trackIdx < nTracks; ++trackIdx ) for( unsigned int trackIdx = 0; trackIdx < nTracks; ++trackIdx )
@ -231,6 +231,12 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
if( !track->IsOnLayer( curr_layer_id ) ) if( !track->IsOnLayer( curr_layer_id ) )
continue; continue;
// Skip vias annulus when not connected on this layer (if removing is enabled)
const VIA *via = dyn_cast< const VIA*>( track );
if( via && !via->IsPadOnLayer( curr_layer_id ) && IsCopperLayer( curr_layer_id ) )
continue;
// Add object item to layer container // Add object item to layer container
createNewTrack( track, layerContainer, 0.0f ); createNewTrack( track, layerContainer, 0.0f );
} }
@ -353,9 +359,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
if( viatype != VIATYPE::THROUGH ) if( viatype != VIATYPE::THROUGH )
{ {
// Add VIA hole contourns // Add VIA hole contourns
// /////////////////////////////////////////////////////////
// Add outer holes of VIAs // Add outer holes of VIAs
SHAPE_POLY_SET *layerOuterHolesPoly = NULL; SHAPE_POLY_SET *layerOuterHolesPoly = NULL;
@ -409,10 +413,11 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
TransformCircleToPolygon( m_through_inner_holes_poly, via->GetStart(), TransformCircleToPolygon( m_through_inner_holes_poly, via->GetStart(),
holediameter / 2, ARC_HIGH_DEF ); holediameter / 2, ARC_HIGH_DEF );
// Add samething for vias only // Add same thing for vias only
TransformCircleToPolygon( m_through_outer_holes_vias_poly, TransformCircleToPolygon( m_through_outer_holes_vias_poly,
via->GetStart(), hole_outer_radius, ARC_HIGH_DEF ); via->GetStart(), hole_outer_radius, ARC_HIGH_DEF );
if( GetFlag( FL_CLIP_SILK_ON_VIA_ANNULUS ) ) if( GetFlag( FL_CLIP_SILK_ON_VIA_ANNULUS ) )
{ {
TransformCircleToPolygon( m_through_outer_ring_holes_vias_poly, TransformCircleToPolygon( m_through_outer_ring_holes_vias_poly,
@ -433,7 +438,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
start_Time = GetRunningMicroSecs(); start_Time = GetRunningMicroSecs();
#endif #endif
// Creates outline contours of the tracks and add it to the poly of the layer // Creates vertical outline contours of the tracks and add it to the poly of the layer
// ///////////////////////////////////////////////////////////////////////// // /////////////////////////////////////////////////////////////////////////
if( GetFlag( FL_RENDER_OPENGL_COPPER_THICKNESS ) if( GetFlag( FL_RENDER_OPENGL_COPPER_THICKNESS )
&& ( m_render_engine == RENDER_ENGINE::OPENGL_LEGACY ) ) && ( m_render_engine == RENDER_ENGINE::OPENGL_LEGACY ) )
@ -454,7 +459,13 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
if( !track->IsOnLayer( curr_layer_id ) ) if( !track->IsOnLayer( curr_layer_id ) )
continue; continue;
// Add the track contour // Skip vias annulus when not connected on this layer (if removing is enabled)
const VIA *via = dyn_cast< const VIA*>( track );
if( via && !via->IsPadOnLayer( curr_layer_id ) && IsCopperLayer( curr_layer_id ) )
continue;
// Add the track/via contour
track->TransformShapeWithClearanceToPolygon( *layerPoly, 0 ); track->TransformShapeWithClearanceToPolygon( *layerPoly, 0 );
} }
} }
@ -486,10 +497,12 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
pad->GetDrillSize().y ) / 2.0f ) * m_biuTo3Dunits; pad->GetDrillSize().y ) / 2.0f ) * m_biuTo3Dunits;
m_through_holes_outer.Add( createNewPadDrill( pad, inflate ) ); m_through_holes_outer.Add( createNewPadDrill( pad, inflate ) );
if( GetFlag( FL_CLIP_SILK_ON_VIA_ANNULUS ) ) if( GetFlag( FL_CLIP_SILK_ON_VIA_ANNULUS ) )
{ {
m_through_holes_outer_ring.Add( createNewPadDrill( pad, inflate ) ); m_through_holes_outer_ring.Add( createNewPadDrill( pad, inflate ) );
} }
m_through_holes_inner.Add( createNewPadDrill( pad, 0 ) ); m_through_holes_inner.Add( createNewPadDrill( pad, 0 ) );
} }
} }
@ -565,8 +578,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
start_Time = GetRunningMicroSecs(); start_Time = GetRunningMicroSecs();
#endif #endif
// Add modules PADs poly contourns // Add modules PADs poly contourns (vertical outlines)
// /////////////////////////////////////////////////////////////////////////
if( GetFlag( FL_RENDER_OPENGL_COPPER_THICKNESS ) if( GetFlag( FL_RENDER_OPENGL_COPPER_THICKNESS )
&& ( m_render_engine == RENDER_ENGINE::OPENGL_LEGACY ) ) && ( m_render_engine == RENDER_ENGINE::OPENGL_LEGACY ) )
{ {
@ -576,12 +588,9 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
SHAPE_POLY_SET *layerPoly = m_layers_poly[curr_layer_id]; SHAPE_POLY_SET *layerPoly = m_layers_poly[curr_layer_id];
// ADD PADS // Add pads to polygon list
for( auto module : m_board->Modules() ) for( auto module : m_board->Modules() )
{ {
// Construct polys
// /////////////////////////////////////////////////////////////
// Note: NPTH pads are not drawn on copper layers when the pad // Note: NPTH pads are not drawn on copper layers when the pad
// has same shape as its hole // has same shape as its hole
module->TransformPadsShapesWithClearanceToPolygon( curr_layer_id, module->TransformPadsShapesWithClearanceToPolygon( curr_layer_id,
@ -589,11 +598,6 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter )
0, 0,
true ); true );
// Micro-wave modules may have items on copper layers
module->TransformGraphicTextWithClearanceToPolygonSet( curr_layer_id,
*layerPoly,
0 );
transformGraphicModuleEdgeToPolygonSet( module, curr_layer_id, *layerPoly ); transformGraphicModuleEdgeToPolygonSet( module, curr_layer_id, *layerPoly );
} }
} }

View File

@ -121,11 +121,14 @@ void MODULE::TransformPadsShapesWithClearanceToPolygon( PCB_LAYER_ID aLayer,
SHAPE_POLY_SET& aCornerBuffer, int aInflateValue, int aMaxError, SHAPE_POLY_SET& aCornerBuffer, int aInflateValue, int aMaxError,
bool aSkipNPTHPadsWihNoCopper ) const bool aSkipNPTHPadsWihNoCopper ) const
{ {
for( auto pad : m_pads ) for( D_PAD* pad : m_pads )
{ {
if( aLayer != UNDEFINED_LAYER && !pad->IsOnLayer(aLayer) ) if( aLayer != UNDEFINED_LAYER && !pad->IsOnLayer(aLayer) )
continue; continue;
if( !pad->IsPadOnLayer( aLayer ) && IsCopperLayer( aLayer ) )
continue;
// NPTH pads are not drawn on layers if the shape size and pos is the same // NPTH pads are not drawn on layers if the shape size and pos is the same
// as their hole: // as their hole:
if( aSkipNPTHPadsWihNoCopper && pad->GetAttribute() == PAD_ATTRIB_HOLE_NOT_PLATED ) if( aSkipNPTHPadsWihNoCopper && pad->GetAttribute() == PAD_ATTRIB_HOLE_NOT_PLATED )