|
|
@ -125,7 +125,7 @@ void BOARD_ADAPTER::destroyLayers() |
|
|
|
m_NPTH_ODPolys.RemoveAllContours(); |
|
|
|
m_TH_ODPolys.RemoveAllContours(); |
|
|
|
m_viaTH_ODPolys.RemoveAllContours(); |
|
|
|
m_THAnnularRingPolys.RemoveAllContours(); |
|
|
|
m_viaAnnuliPolys.RemoveAllContours(); |
|
|
|
|
|
|
|
DELETE_AND_FREE_MAP( m_layerMap ) |
|
|
|
DELETE_AND_FREE_MAP( m_layerHoleMap ) |
|
|
@ -135,7 +135,7 @@ void BOARD_ADAPTER::destroyLayers() |
|
|
|
|
|
|
|
m_TH_ODs.Clear(); |
|
|
|
m_TH_IDs.Clear(); |
|
|
|
m_THAnnularRings.Clear(); |
|
|
|
m_viaAnnuli.Clear(); |
|
|
|
m_viaTH_ODs.Clear(); |
|
|
|
} |
|
|
|
|
|
|
@ -157,6 +157,8 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
PCB_LAYER_ID cu_seq[MAX_CU_LAYERS]; |
|
|
|
LSET cu_set = LSET::AllCuMask( m_copperLayersCount ); |
|
|
|
|
|
|
|
EDA_3D_VIEWER_SETTINGS::RENDER_SETTINGS& cfg = m_Cfg->m_Render; |
|
|
|
|
|
|
|
std::bitset<LAYER_3D_END> visibilityFlags = GetVisibleLayers(); |
|
|
|
|
|
|
|
m_trackCount = 0; |
|
|
@ -225,22 +227,20 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
BVH_CONTAINER_2D *layerContainer = new BVH_CONTAINER_2D; |
|
|
|
m_layerMap[layer] = layerContainer; |
|
|
|
|
|
|
|
if( m_Cfg->m_Render.opengl_copper_thickness |
|
|
|
&& m_Cfg->m_Render.engine == RENDER_ENGINE::OPENGL ) |
|
|
|
if( cfg.opengl_copper_thickness && cfg.engine == RENDER_ENGINE::OPENGL ) |
|
|
|
{ |
|
|
|
SHAPE_POLY_SET* layerPoly = new SHAPE_POLY_SET; |
|
|
|
SHAPE_POLY_SET* layerPoly = new SHAPE_POLY_SET; |
|
|
|
m_layers_poly[layer] = layerPoly; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if( m_Cfg->m_Render.renderPlatedPadsAsPlated ) |
|
|
|
if( cfg.renderPlatedPadsAsPlated ) |
|
|
|
{ |
|
|
|
m_frontPlatedPadPolys = new SHAPE_POLY_SET; |
|
|
|
m_backPlatedPadPolys = new SHAPE_POLY_SET; |
|
|
|
|
|
|
|
m_platedPadsFront = new BVH_CONTAINER_2D; |
|
|
|
m_platedPadsBack = new BVH_CONTAINER_2D; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if( aStatusReporter ) |
|
|
@ -332,16 +332,11 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
m_viaTH_ODs.Add( new FILLED_CIRCLE_2D( via_center, hole_inner_radius + thickness, |
|
|
|
*track ) ); |
|
|
|
|
|
|
|
if( m_Cfg->m_Render.clip_silk_on_via_annulus && ring_radius > 0.0 ) |
|
|
|
{ |
|
|
|
m_THAnnularRings.Add( new FILLED_CIRCLE_2D( via_center, ring_radius, |
|
|
|
*track ) ); |
|
|
|
} |
|
|
|
if( cfg.clip_silk_on_via_annuli && ring_radius > 0.0 ) |
|
|
|
m_viaAnnuli.Add( new FILLED_CIRCLE_2D( via_center, ring_radius, *track ) ); |
|
|
|
|
|
|
|
if( hole_inner_radius > 0.0 ) |
|
|
|
{ |
|
|
|
m_TH_IDs.Add( new FILLED_CIRCLE_2D( via_center, hole_inner_radius, *track ) ); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -419,9 +414,9 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
TransformCircleToPolygon( m_viaTH_ODPolys, via->GetStart(), hole_outer_radius, |
|
|
|
maxError, ERROR_INSIDE ); |
|
|
|
|
|
|
|
if( m_Cfg->m_Render.clip_silk_on_via_annulus ) |
|
|
|
if( cfg.clip_silk_on_via_annuli ) |
|
|
|
{ |
|
|
|
TransformCircleToPolygon( m_THAnnularRingPolys, via->GetStart(), |
|
|
|
TransformCircleToPolygon( m_viaAnnuliPolys, via->GetStart(), |
|
|
|
hole_outer_ring_radius, maxError, ERROR_INSIDE ); |
|
|
|
} |
|
|
|
} |
|
|
@ -430,7 +425,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
} |
|
|
|
|
|
|
|
// Creates vertical outline contours of the tracks and add it to the poly of the layer
|
|
|
|
if( m_Cfg->m_Render.opengl_copper_thickness && m_Cfg->m_Render.engine == RENDER_ENGINE::OPENGL ) |
|
|
|
if( cfg.opengl_copper_thickness && cfg.engine == RENDER_ENGINE::OPENGL ) |
|
|
|
{ |
|
|
|
for( PCB_LAYER_ID layer : layer_ids ) |
|
|
|
{ |
|
|
@ -450,7 +445,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
|
|
|
|
// Skip vias annulus when not flashed on this layer
|
|
|
|
if( track->Type() == PCB_VIA_T |
|
|
|
&& !static_cast<const PCB_VIA*>( track )->FlashLayer( layer ) ) |
|
|
|
&& !static_cast<const PCB_VIA*>( track )->FlashLayer( layer ) ) |
|
|
|
{ |
|
|
|
continue; |
|
|
|
} |
|
|
@ -483,8 +478,8 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
|
|
|
|
createPadWithHole( pad, &m_TH_ODs, inflate ); |
|
|
|
|
|
|
|
if( m_Cfg->m_Render.clip_silk_on_via_annulus ) |
|
|
|
createPadWithHole( pad, &m_THAnnularRings, inflate ); |
|
|
|
if( cfg.clip_silk_on_via_annuli ) |
|
|
|
createPadWithHole( pad, &m_viaAnnuli, inflate ); |
|
|
|
|
|
|
|
createPadWithHole( pad, &m_TH_IDs, 0 ); |
|
|
|
} |
|
|
@ -508,16 +503,16 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
|
|
|
|
if( pad->GetAttribute () != PAD_ATTRIB::NPTH ) |
|
|
|
{ |
|
|
|
if( m_Cfg->m_Render.clip_silk_on_via_annulus ) |
|
|
|
pad->TransformHoleToPolygon( m_THAnnularRingPolys, inflate, maxError, ERROR_INSIDE ); |
|
|
|
if( cfg.clip_silk_on_via_annuli ) |
|
|
|
pad->TransformHoleToPolygon( m_viaAnnuliPolys, inflate, maxError, ERROR_INSIDE ); |
|
|
|
|
|
|
|
pad->TransformHoleToPolygon( m_TH_ODPolys, inflate, maxError, ERROR_INSIDE ); |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
// If not plated, no copper.
|
|
|
|
if( m_Cfg->m_Render.clip_silk_on_via_annulus ) |
|
|
|
pad->TransformHoleToPolygon( m_THAnnularRingPolys, 0, maxError, ERROR_INSIDE ); |
|
|
|
if( cfg.clip_silk_on_via_annuli ) |
|
|
|
pad->TransformHoleToPolygon( m_viaAnnuliPolys, 0, maxError, ERROR_INSIDE ); |
|
|
|
|
|
|
|
pad->TransformHoleToPolygon( m_NPTH_ODPolys, 0, maxError, ERROR_INSIDE ); |
|
|
|
} |
|
|
@ -534,15 +529,14 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
// ADD PADS
|
|
|
|
for( FOOTPRINT* footprint : m_board->Footprints() ) |
|
|
|
{ |
|
|
|
addPads( footprint, layerContainer, layer, m_Cfg->m_Render.renderPlatedPadsAsPlated, |
|
|
|
false ); |
|
|
|
addPads( footprint, layerContainer, layer, cfg.renderPlatedPadsAsPlated, false ); |
|
|
|
|
|
|
|
// Micro-wave footprints may have items on copper layers
|
|
|
|
addFootprintShapes( footprint, layerContainer, layer, visibilityFlags ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if( m_Cfg->m_Render.renderPlatedPadsAsPlated ) |
|
|
|
if( cfg.renderPlatedPadsAsPlated ) |
|
|
|
{ |
|
|
|
// ADD PLATED PADS
|
|
|
|
for( FOOTPRINT* footprint : m_board->Footprints() ) |
|
|
@ -556,7 +550,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
} |
|
|
|
|
|
|
|
// Add footprints PADs poly contours (vertical outlines)
|
|
|
|
if( m_Cfg->m_Render.opengl_copper_thickness && m_Cfg->m_Render.engine == RENDER_ENGINE::OPENGL ) |
|
|
|
if( cfg.opengl_copper_thickness && cfg.engine == RENDER_ENGINE::OPENGL ) |
|
|
|
{ |
|
|
|
for( PCB_LAYER_ID layer : layer_ids ) |
|
|
|
{ |
|
|
@ -570,14 +564,13 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
// Note: NPTH pads are not drawn on copper layers when the pad has same shape as
|
|
|
|
// its hole
|
|
|
|
footprint->TransformPadsToPolySet( *layerPoly, layer, 0, maxError, ERROR_INSIDE, |
|
|
|
true, m_Cfg->m_Render.renderPlatedPadsAsPlated, |
|
|
|
false ); |
|
|
|
true, cfg.renderPlatedPadsAsPlated, false ); |
|
|
|
|
|
|
|
transformFPShapesToPolySet( footprint, layer, *layerPoly, maxError, ERROR_INSIDE ); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if( m_Cfg->m_Render.renderPlatedPadsAsPlated ) |
|
|
|
if( cfg.renderPlatedPadsAsPlated ) |
|
|
|
{ |
|
|
|
// ADD PLATED PADS contours
|
|
|
|
for( FOOTPRINT* footprint : m_board->Footprints() ) |
|
|
@ -636,7 +629,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
} |
|
|
|
|
|
|
|
// Add graphic item on copper layers to poly contours (vertical outlines)
|
|
|
|
if( m_Cfg->m_Render.opengl_copper_thickness && m_Cfg->m_Render.engine == RENDER_ENGINE::OPENGL ) |
|
|
|
if( cfg.opengl_copper_thickness && cfg.engine == RENDER_ENGINE::OPENGL ) |
|
|
|
{ |
|
|
|
for( PCB_LAYER_ID layer : layer_ids ) |
|
|
|
{ |
|
|
@ -681,7 +674,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if( m_Cfg->m_Render.show_zones ) |
|
|
|
if( cfg.show_zones ) |
|
|
|
{ |
|
|
|
if( aStatusReporter ) |
|
|
|
aStatusReporter->Report( _( "Create zones" ) ); |
|
|
@ -726,9 +719,8 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
if( layerContainer != m_layerMap.end() ) |
|
|
|
addSolidAreasShapes( zone, layerContainer->second, layer ); |
|
|
|
|
|
|
|
if( m_Cfg->m_Render.opengl_copper_thickness |
|
|
|
&& m_Cfg->m_Render.engine == RENDER_ENGINE::OPENGL |
|
|
|
&& layerPolyContainer != m_layers_poly.end() ) |
|
|
|
if( cfg.opengl_copper_thickness && cfg.engine == RENDER_ENGINE::OPENGL |
|
|
|
&& layerPolyContainer != m_layers_poly.end() ) |
|
|
|
{ |
|
|
|
auto mut_it = layer_lock.find( layer ); |
|
|
|
|
|
|
@ -753,9 +745,9 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
if( aStatusReporter ) |
|
|
|
aStatusReporter->Report( _( "Simplifying copper layers polygons" ) ); |
|
|
|
|
|
|
|
if( m_Cfg->m_Render.opengl_copper_thickness && m_Cfg->m_Render.engine == RENDER_ENGINE::OPENGL ) |
|
|
|
if( cfg.opengl_copper_thickness && cfg.engine == RENDER_ENGINE::OPENGL ) |
|
|
|
{ |
|
|
|
if( m_Cfg->m_Render.renderPlatedPadsAsPlated ) |
|
|
|
if( cfg.renderPlatedPadsAsPlated ) |
|
|
|
{ |
|
|
|
if( m_frontPlatedPadPolys && ( m_layers_poly.find( F_Cu ) != m_layers_poly.end() ) ) |
|
|
|
{ |
|
|
@ -783,7 +775,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
std::vector<PCB_LAYER_ID> &selected_layer_id = layer_ids; |
|
|
|
std::vector<PCB_LAYER_ID> layer_id_without_F_and_B; |
|
|
|
|
|
|
|
if( m_Cfg->m_Render.renderPlatedPadsAsPlated ) |
|
|
|
if( cfg.renderPlatedPadsAsPlated ) |
|
|
|
{ |
|
|
|
layer_id_without_F_and_B.clear(); |
|
|
|
layer_id_without_F_and_B.reserve( layer_ids.size() ); |
|
|
@ -864,7 +856,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
m_TH_ODPolys.Simplify( SHAPE_POLY_SET::PM_FAST ); |
|
|
|
m_NPTH_ODPolys.Simplify( SHAPE_POLY_SET::PM_FAST ); |
|
|
|
m_viaTH_ODPolys.Simplify( SHAPE_POLY_SET::PM_FAST ); |
|
|
|
m_THAnnularRingPolys.Simplify( SHAPE_POLY_SET::PM_FAST ); |
|
|
|
m_viaAnnuliPolys.Simplify( SHAPE_POLY_SET::PM_FAST ); |
|
|
|
|
|
|
|
// Build Tech layers
|
|
|
|
// Based on:
|
|
|
@ -876,8 +868,8 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
|
|
|
|
// Vertical walls (layer thickness) around shapes is really time consumming
|
|
|
|
// They are built on request
|
|
|
|
bool buildVerticalWallsForTechLayers = m_Cfg->m_Render.opengl_copper_thickness |
|
|
|
&& m_Cfg->m_Render.engine == RENDER_ENGINE::OPENGL; |
|
|
|
bool buildVerticalWallsForTechLayers = cfg.opengl_copper_thickness |
|
|
|
&& cfg.engine == RENDER_ENGINE::OPENGL; |
|
|
|
|
|
|
|
static const PCB_LAYER_ID techLayerList[] = { |
|
|
|
B_Adhes, |
|
|
@ -1070,7 +1062,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
} |
|
|
|
|
|
|
|
// Draw non copper zones
|
|
|
|
if( m_Cfg->m_Render.show_zones ) |
|
|
|
if( cfg.show_zones ) |
|
|
|
{ |
|
|
|
for( ZONE* zone : m_board->Zones() ) |
|
|
|
{ |
|
|
@ -1097,7 +1089,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
// A somewhat experimental feature: if we're rendering off-board silk, turn any pads of
|
|
|
|
// footprints which are entirely outside the board outline into silk. This makes off-board
|
|
|
|
// footprints more visually recognizable.
|
|
|
|
if( m_Cfg->m_Render.show_off_board_silk ) |
|
|
|
if( cfg.show_off_board_silk ) |
|
|
|
{ |
|
|
|
BOX2I boardBBox = m_board_poly.BBox(); |
|
|
|
|
|
|
@ -1127,7 +1119,7 @@ void BOARD_ADAPTER::createLayers( REPORTER* aStatusReporter ) |
|
|
|
|
|
|
|
m_TH_IDs.BuildBVH(); |
|
|
|
m_TH_ODs.BuildBVH(); |
|
|
|
m_THAnnularRings.BuildBVH(); |
|
|
|
m_viaAnnuli.BuildBVH(); |
|
|
|
|
|
|
|
if( !m_layerHoleMap.empty() ) |
|
|
|
{ |
|
|
|