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();
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;
HelperShapeLineChainFromAltiumVertices( linechain, elem.vertices );
@ -1697,12 +1687,13 @@ void ALTIUM_PCB::ParsePolygons6Data( const ALTIUM_COMPOUND_FILE& aAltiumPcbF
m_polygons.emplace_back( zone );
zone->SetNetCode( GetNetCode( elem.net ) );
zone->SetLayerSet( LSET( klayer ) );
zone->SetPosition( elem.vertices.at( 0 ).position );
zone->SetLocked( elem.locked );
zone->SetPriority( elem.pourindex > 0 ? elem.pourindex : 0 );
zone->Outline()->AddOutline( linechain );
HelperSetZoneLayers( zone, elem.layer );
if( elem.pourindex > m_highest_pour_index )
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->Outline()->AddOutline( linechain );
if( aElem.layer == ALTIUM_LAYER::MULTI_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 ) );
}
HelperSetZoneLayers( zone, aElem.layer );
zone->SetBorderDisplayStyle( ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE,
ZONE::GetDefaultHatchPitch(), true );
@ -1972,15 +1947,7 @@ void ALTIUM_PCB::ConvertShapeBasedRegions6ToFootprintItem( FOOTPRINT* aFoot
zone->SetPosition( aElem.outline.at( 0 ).position );
zone->Outline()->AddOutline( linechain );
if( aElem.layer == ALTIUM_LAYER::MULTI_LAYER )
{
zone->SetLayerSet( LSET::AllCuMask() );
}
else
{
std::vector<PCB_LAYER_ID> klayers = GetKicadLayersToIterate( aElem.layer );
zone->SetLayerSet( LSET( klayers.at( 0 ) ) );
}
HelperSetZoneLayers( zone, aElem.layer );
zone->SetBorderDisplayStyle( ZONE_BORDER_DISPLAY_STYLE::DIAGONAL_EDGE,
ZONE::GetDefaultHatchPitch(), true );
@ -3261,15 +3228,8 @@ void ALTIUM_PCB::ConvertFills6ToBoardItemWithNet( const AFILL6& aElem )
zone->SetPosition( aElem.pos1 );
zone->SetPriority( 1000 );
if( aElem.layer == ALTIUM_LAYER::MULTI_LAYER )
{
zone->SetLayerSet( LSET::AllCuMask() );
}
else
{
std::vector<PCB_LAYER_ID> klayers = GetKicadLayersToIterate( aElem.layer );
zone->SetLayerSet( LSET( klayers.at( 0 ) ) );
}
HelperSetZoneLayers( zone, aElem.layer );
VECTOR2I p11( aElem.pos1.x, aElem.pos1.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,
ALTIUM_LAYER aAltiumLayer )
{
@ -3364,15 +3342,7 @@ void ALTIUM_PCB::HelperPcpShapeAsBoardKeepoutRegion( const PCB_SHAPE& aShape,
zone->SetDoNotAllowFootprints( false );
zone->SetDoNotAllowCopperPour( true );
if( aAltiumLayer == ALTIUM_LAYER::MULTI_LAYER )
{
zone->SetLayerSet( LSET::AllCuMask() );
}
else
{
std::vector<PCB_LAYER_ID> klayers = GetKicadLayersToIterate( aAltiumLayer );
zone->SetLayerSet( LSET( klayers.at( 0 ) ) );
}
HelperSetZoneLayers( zone, aAltiumLayer );
aShape.EDA_SHAPE::TransformShapeWithClearanceToPolygon( *zone->Outline(), 0, ARC_HIGH_DEF,
ERROR_INSIDE, false );
@ -3396,15 +3366,7 @@ void ALTIUM_PCB::HelperPcpShapeAsFootprintKeepoutRegion( FOOTPRINT* aFootp
zone->SetDoNotAllowFootprints( false );
zone->SetDoNotAllowCopperPour( true );
if( aAltiumLayer == ALTIUM_LAYER::MULTI_LAYER )
{
zone->SetLayerSet( LSET::AllCuMask() );
}
else
{
std::vector<PCB_LAYER_ID> klayers = GetKicadLayersToIterate( aAltiumLayer );
zone->SetLayerSet( LSET( klayers.at( 0 ) ) );
}
HelperSetZoneLayers( zone, aAltiumLayer );
aShape.EDA_SHAPE::TransformShapeWithClearanceToPolygon( *zone->Outline(), 0, ARC_HIGH_DEF,
ERROR_INSIDE, false );

View File

@ -216,6 +216,7 @@ private:
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 HelperPcpShapeAsFootprintKeepoutRegion( FOOTPRINT* aFootprint, const PCB_SHAPE& aShape,
ALTIUM_LAYER aAltiumLayer );

View File

@ -146,7 +146,7 @@
(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")
(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))
(min_thickness 0.254) (filled_areas_thickness no)
(keepout (tracks allowed) (vias allowed) (pads allowed ) (copperpour not_allowed) (footprints allowed))