altium: Fix parsing of zones which use the KEEP_OUT_LAYER

This commit is contained in:
Thomas Pointhuber 2022-02-19 14:37:05 +01:00
parent b184b43431
commit 86c025eb30
3 changed files with 28 additions and 65 deletions

View File

@ -1664,16 +1664,6 @@ void ALTIUM_PCB::ParsePolygons6Data( const ALTIUM_COMPOUND_FILE& aAltiumPcbF
checkpoint(); checkpoint();
APOLYGON6 elem( reader ); APOLYGON6 elem( reader );
PCB_LAYER_ID klayer = GetKicadLayer( elem.layer );
if( klayer == UNDEFINED_LAYER )
{
wxLogWarning( _( "Polygon found on an Altium layer (%d) with no KiCad equivalent. "
"It has been moved to KiCad layer Eco1_User." ),
elem.layer );
klayer = Eco1_User;
}
SHAPE_LINE_CHAIN linechain; SHAPE_LINE_CHAIN linechain;
HelperShapeLineChainFromAltiumVertices( linechain, elem.vertices ); HelperShapeLineChainFromAltiumVertices( linechain, elem.vertices );
@ -1697,12 +1687,13 @@ void ALTIUM_PCB::ParsePolygons6Data( const ALTIUM_COMPOUND_FILE& aAltiumPcbF
m_polygons.emplace_back( zone ); m_polygons.emplace_back( zone );
zone->SetNetCode( GetNetCode( elem.net ) ); zone->SetNetCode( GetNetCode( elem.net ) );
zone->SetLayerSet( LSET( klayer ) );
zone->SetPosition( elem.vertices.at( 0 ).position ); zone->SetPosition( elem.vertices.at( 0 ).position );
zone->SetLocked( elem.locked ); zone->SetLocked( elem.locked );
zone->SetPriority( elem.pourindex > 0 ? elem.pourindex : 0 ); zone->SetPriority( elem.pourindex > 0 ? elem.pourindex : 0 );
zone->Outline()->AddOutline( linechain ); zone->Outline()->AddOutline( linechain );
HelperSetZoneLayers( zone, elem.layer );
if( elem.pourindex > m_highest_pour_index ) if( elem.pourindex > m_highest_pour_index )
m_highest_pour_index = elem.pourindex; m_highest_pour_index = elem.pourindex;
@ -1905,23 +1896,7 @@ void ALTIUM_PCB::ConvertShapeBasedRegions6ToBoardItem( const AREGION6& aElem )
zone->SetPosition( aElem.outline.at( 0 ).position ); zone->SetPosition( aElem.outline.at( 0 ).position );
zone->Outline()->AddOutline( linechain ); zone->Outline()->AddOutline( linechain );
if( aElem.layer == ALTIUM_LAYER::MULTI_LAYER ) HelperSetZoneLayers( zone, aElem.layer );
{
zone->SetLayerSet( LSET::AllCuMask() );
}
else
{
PCB_LAYER_ID klayer = GetKicadLayer( aElem.layer );
if( klayer == UNDEFINED_LAYER )
{
wxLogWarning( _( "Zone found on an Altium layer (%d) with no KiCad equivalent. "
"It has been moved to KiCad layer Eco1_User." ),
aElem.layer );
klayer = Eco1_User;
}
zone->SetLayerSet( LSET( klayer ) );
}
zone->SetBorderDisplayStyle( ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE, zone->SetBorderDisplayStyle( ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE,
ZONE::GetDefaultHatchPitch(), true ); ZONE::GetDefaultHatchPitch(), true );
@ -1972,15 +1947,7 @@ void ALTIUM_PCB::ConvertShapeBasedRegions6ToFootprintItem( FOOTPRINT* aFoot
zone->SetPosition( aElem.outline.at( 0 ).position ); zone->SetPosition( aElem.outline.at( 0 ).position );
zone->Outline()->AddOutline( linechain ); zone->Outline()->AddOutline( linechain );
if( aElem.layer == ALTIUM_LAYER::MULTI_LAYER ) HelperSetZoneLayers( zone, aElem.layer );
{
zone->SetLayerSet( LSET::AllCuMask() );
}
else
{
std::vector<PCB_LAYER_ID> klayers = GetKicadLayersToIterate( aElem.layer );
zone->SetLayerSet( LSET( klayers.at( 0 ) ) );
}
zone->SetBorderDisplayStyle( ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE, zone->SetBorderDisplayStyle( ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE,
ZONE::GetDefaultHatchPitch(), true ); ZONE::GetDefaultHatchPitch(), true );
@ -3261,15 +3228,8 @@ void ALTIUM_PCB::ConvertFills6ToBoardItemWithNet( const AFILL6& aElem )
zone->SetPosition( aElem.pos1 ); zone->SetPosition( aElem.pos1 );
zone->SetPriority( 1000 ); zone->SetPriority( 1000 );
if( aElem.layer == ALTIUM_LAYER::MULTI_LAYER )
{ HelperSetZoneLayers( zone, aElem.layer );
zone->SetLayerSet( LSET::AllCuMask() );
}
else
{
std::vector<PCB_LAYER_ID> klayers = GetKicadLayersToIterate( aElem.layer );
zone->SetLayerSet( LSET( klayers.at( 0 ) ) );
}
VECTOR2I p11( aElem.pos1.x, aElem.pos1.y ); VECTOR2I p11( aElem.pos1.x, aElem.pos1.y );
VECTOR2I p12( aElem.pos1.x, aElem.pos2.y ); VECTOR2I p12( aElem.pos1.x, aElem.pos2.y );
@ -3352,6 +3312,24 @@ void ALTIUM_PCB::ConvertFills6ToFootprintItemOnLayer( FOOTPRINT* aFootprint, con
} }
void ALTIUM_PCB::HelperSetZoneLayers( ZONE* aZone, const ALTIUM_LAYER aAltiumLayer )
{
if( aAltiumLayer == ALTIUM_LAYER::MULTI_LAYER || aAltiumLayer == ALTIUM_LAYER::KEEP_OUT_LAYER )
{
aZone->SetLayerSet( LSET::AllCuMask() );
}
else
{
LSET layerSet;
for( PCB_LAYER_ID klayer : GetKicadLayersToIterate( aAltiumLayer ) )
{
layerSet.set( klayer );
}
aZone->SetLayerSet( layerSet );
}
}
void ALTIUM_PCB::HelperPcpShapeAsBoardKeepoutRegion( const PCB_SHAPE& aShape, void ALTIUM_PCB::HelperPcpShapeAsBoardKeepoutRegion( const PCB_SHAPE& aShape,
ALTIUM_LAYER aAltiumLayer ) ALTIUM_LAYER aAltiumLayer )
{ {
@ -3364,15 +3342,7 @@ void ALTIUM_PCB::HelperPcpShapeAsBoardKeepoutRegion( const PCB_SHAPE& aShape,
zone->SetDoNotAllowFootprints( false ); zone->SetDoNotAllowFootprints( false );
zone->SetDoNotAllowCopperPour( true ); zone->SetDoNotAllowCopperPour( true );
if( aAltiumLayer == ALTIUM_LAYER::MULTI_LAYER ) HelperSetZoneLayers( zone, aAltiumLayer );
{
zone->SetLayerSet( LSET::AllCuMask() );
}
else
{
std::vector<PCB_LAYER_ID> klayers = GetKicadLayersToIterate( aAltiumLayer );
zone->SetLayerSet( LSET( klayers.at( 0 ) ) );
}
aShape.EDA_SHAPE::TransformShapeWithClearanceToPolygon( *zone->Outline(), 0, ARC_HIGH_DEF, aShape.EDA_SHAPE::TransformShapeWithClearanceToPolygon( *zone->Outline(), 0, ARC_HIGH_DEF,
ERROR_INSIDE, false ); ERROR_INSIDE, false );
@ -3396,15 +3366,7 @@ void ALTIUM_PCB::HelperPcpShapeAsFootprintKeepoutRegion( FOOTPRINT* aFootp
zone->SetDoNotAllowFootprints( false ); zone->SetDoNotAllowFootprints( false );
zone->SetDoNotAllowCopperPour( true ); zone->SetDoNotAllowCopperPour( true );
if( aAltiumLayer == ALTIUM_LAYER::MULTI_LAYER ) HelperSetZoneLayers( zone, aAltiumLayer );
{
zone->SetLayerSet( LSET::AllCuMask() );
}
else
{
std::vector<PCB_LAYER_ID> klayers = GetKicadLayersToIterate( aAltiumLayer );
zone->SetLayerSet( LSET( klayers.at( 0 ) ) );
}
aShape.EDA_SHAPE::TransformShapeWithClearanceToPolygon( *zone->Outline(), 0, ARC_HIGH_DEF, aShape.EDA_SHAPE::TransformShapeWithClearanceToPolygon( *zone->Outline(), 0, ARC_HIGH_DEF,
ERROR_INSIDE, false ); ERROR_INSIDE, false );

View File

@ -216,6 +216,7 @@ private:
void HelperCreateBoardOutline( const std::vector<ALTIUM_VERTICE>& aVertices ); void HelperCreateBoardOutline( const std::vector<ALTIUM_VERTICE>& aVertices );
void HelperSetZoneLayers( ZONE* aZone, const ALTIUM_LAYER aAltiumLayer );
void HelperPcpShapeAsBoardKeepoutRegion( const PCB_SHAPE& aShape, ALTIUM_LAYER aAltiumLayer ); void HelperPcpShapeAsBoardKeepoutRegion( const PCB_SHAPE& aShape, ALTIUM_LAYER aAltiumLayer );
void HelperPcpShapeAsFootprintKeepoutRegion( FOOTPRINT* aFootprint, const PCB_SHAPE& aShape, void HelperPcpShapeAsFootprintKeepoutRegion( FOOTPRINT* aFootprint, const PCB_SHAPE& aShape,
ALTIUM_LAYER aAltiumLayer ); ALTIUM_LAYER aAltiumLayer );

View File

@ -146,7 +146,7 @@
(solder_mask_margin 0.05) (thermal_bridge_angle 45) (tstamp f57881b5-c9c9-4bcf-be4b-dd8cfd505873)) (solder_mask_margin 0.05) (thermal_bridge_angle 45) (tstamp f57881b5-c9c9-4bcf-be4b-dd8cfd505873))
(pad "39" smd rect (at 0.835 1.835 180) (size 1.33 1.33) (layers "F.Cu" "F.Paste" "F.Mask") (pad "39" smd rect (at 0.835 1.835 180) (size 1.33 1.33) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05) (thermal_bridge_angle 45) (tstamp 7c70a95d-e021-4338-a3de-d7656880600e)) (solder_mask_margin 0.05) (thermal_bridge_angle 45) (tstamp 7c70a95d-e021-4338-a3de-d7656880600e))
(zone (net 0) (net_name "") (layer "F.Cu") (tstamp da4ad6f3-5f0a-4c19-ae8d-5aa0f1ec37b7) (hatch edge 0.508) (zone (net 0) (net_name "") (layers *.Cu) (tstamp da4ad6f3-5f0a-4c19-ae8d-5aa0f1ec37b7) (hatch edge 0.508)
(connect_pads (clearance 0)) (connect_pads (clearance 0))
(min_thickness 0.254) (filled_areas_thickness no) (min_thickness 0.254) (filled_areas_thickness no)
(keepout (tracks allowed) (vias allowed) (pads allowed ) (copperpour not_allowed) (footprints allowed)) (keepout (tracks allowed) (vias allowed) (pads allowed ) (copperpour not_allowed) (footprints allowed))