Fixup for Altium pad/fill importer

The previous commit merged pads with copper areas.  This was appealing
but broke when the pad and the area were meant to have different
size/shape technical layers.  Small pads = Small paste.  Instead, we do
not merge the pads but we assign them to have the appropriate nets in
KiCad, allowing the same effective result but keeping the technical
layers correct

(cherry picked from commit 51eb7aa5b5)
This commit is contained in:
Seth Hillbrand 2024-06-27 13:46:16 -07:00
parent 33b93a3824
commit 8832b22952
2 changed files with 283 additions and 151 deletions

View File

@ -805,14 +805,39 @@ FOOTPRINT* ALTIUM_PCB::ParseFootprint( ALTIUM_COMPOUND_FILE& altiumLibFile,
}
}
// Loop over this multiple times to catch pads that are jumpered to each other by multiple shapes
for( bool changes = true; changes; )
{
changes = false;
alg::for_all_pairs( footprint->Pads().begin(), footprint->Pads().end(),
[&changes]( PAD* aPad1, PAD* aPad2 )
{
if( !( aPad1->GetNumber().IsEmpty() ^ aPad2->GetNumber().IsEmpty() ) )
return;
for( PCB_LAYER_ID layer : aPad1->GetLayerSet().Seq() )
{
std::shared_ptr<SHAPE> shape1 = aPad1->GetEffectiveShape( layer );
std::shared_ptr<SHAPE> shape2 = aPad2->GetEffectiveShape( layer );
if( shape1->Collide( shape2.get() ) )
{
if( aPad1->GetNumber().IsEmpty() )
aPad1->SetNumber( aPad2->GetNumber() );
else
aPad2->SetNumber( aPad1->GetNumber() );
changes = true;
}
}
} );
}
// Auto-position reference and value
footprint->AutoPositionFields();
for( PAD* pad : footprint->Pads() )
{
pad->Recombine( false, ARC_HIGH_DEF );
}
if( parser.HasParsingError() )
{
THROW_IO_ERROR( wxString::Format( wxT( "%s stream was not parsed correctly" ),
@ -2474,14 +2499,70 @@ void ALTIUM_PCB::ConvertShapeBasedRegions6ToFootprintItemOnLayer( FOOTPRINT*
polySet.AddHole( hole_linechain );
}
std::unique_ptr<PCB_SHAPE> shape = std::make_unique<PCB_SHAPE>( aFootprint, SHAPE_T::POLY );
if( aLayer == F_Cu || aLayer == B_Cu )
{
std::unique_ptr<PAD> pad = std::make_unique<PAD>( aFootprint );
shape->SetPolyShape( polySet );
shape->SetFilled( true );
shape->SetLayer( aLayer );
shape->SetStroke( STROKE_PARAMS( 0 ) );
LSET padLayers;
padLayers.set( aLayer );
aFootprint->Add( shape.release(), ADD_MODE::APPEND );
pad->SetAttribute( PAD_ATTRIB::SMD );
pad->SetShape( PAD_SHAPE::CUSTOM );
pad->SetThermalSpokeAngle( ANGLE_90 );
int anchorSize = 1;
VECTOR2I anchorPos = linechain.CPoint( 0 );
pad->SetShape( PAD_SHAPE::CUSTOM );
pad->SetAnchorPadShape( PAD_SHAPE::CIRCLE );
pad->SetSize( { anchorSize, anchorSize } );
pad->SetPosition( anchorPos );
SHAPE_POLY_SET shapePolys = polySet;
shapePolys.Move( -anchorPos );
pad->AddPrimitivePoly( shapePolys, 0, true );
auto& map = m_extendedPrimitiveInformationMaps[ALTIUM_RECORD::REGION];
auto it = map.find( aPrimitiveIndex );
if( it != map.end() )
{
const AEXTENDED_PRIMITIVE_INFORMATION& info = it->second;
if( info.pastemaskexpansionmode == ALTIUM_MODE::MANUAL )
{
pad->SetLocalSolderPasteMargin(
info.pastemaskexpansionmanual ? info.pastemaskexpansionmanual : 1 );
}
if( info.soldermaskexpansionmode == ALTIUM_MODE::MANUAL )
{
pad->SetLocalSolderMaskMargin(
info.soldermaskexpansionmanual ? info.soldermaskexpansionmanual : 1 );
}
if( info.pastemaskexpansionmode != ALTIUM_MODE::NONE )
padLayers.set( aLayer == F_Cu ? F_Paste : B_Paste );
if( info.soldermaskexpansionmode != ALTIUM_MODE::NONE )
padLayers.set( aLayer == F_Cu ? F_Mask : B_Mask );
}
pad->SetLayerSet( padLayers );
aFootprint->Add( pad.release(), ADD_MODE::APPEND );
}
else
{
std::unique_ptr<PCB_SHAPE> shape = std::make_unique<PCB_SHAPE>( aFootprint, SHAPE_T::POLY );
shape->SetPolyShape( polySet );
shape->SetFilled( true );
shape->SetLayer( aLayer );
shape->SetStroke( STROKE_PARAMS( 0 ) );
aFootprint->Add( shape.release(), ADD_MODE::APPEND );
}
}
@ -4224,24 +4305,73 @@ void ALTIUM_PCB::ConvertFills6ToBoardItemOnLayer( const AFILL6& aElem, PCB_LAYER
void ALTIUM_PCB::ConvertFills6ToFootprintItemOnLayer( FOOTPRINT* aFootprint, const AFILL6& aElem,
PCB_LAYER_ID aLayer )
{
PCB_SHAPE* fill = new PCB_SHAPE( aFootprint, SHAPE_T::RECTANGLE );
fill->SetFilled( true );
fill->SetLayer( aLayer );
fill->SetStroke( STROKE_PARAMS( 0 ) );
fill->SetStart( aElem.pos1 );
fill->SetEnd( aElem.pos2 );
if( aElem.rotation != 0. )
if( aLayer == F_Cu || aLayer == B_Cu )
{
// TODO: Do we need SHAPE_T::POLY for non 90° rotations?
VECTOR2I center( aElem.pos1.x / 2 + aElem.pos2.x / 2,
aElem.pos1.y / 2 + aElem.pos2.y / 2 );
fill->Rotate( center, EDA_ANGLE( aElem.rotation, DEGREES_T ) );
}
std::unique_ptr<PAD> pad = std::make_unique<PAD>( aFootprint );
aFootprint->Add( fill, ADD_MODE::APPEND );
LSET padLayers;
padLayers.set( aLayer );
pad->SetAttribute( PAD_ATTRIB::SMD );
if( aElem.rotation == 0. )
{
pad->SetShape( PAD_SHAPE::RECTANGLE );
pad->SetSize( { aElem.pos2.x - aElem.pos1.x, aElem.pos2.y - aElem.pos1.y } );
pad->SetPosition( ( aElem.pos1 + aElem.pos2 ) / 2 );
}
else
{
pad->SetShape( PAD_SHAPE::CUSTOM );
int anchorSize = std::min( std::abs( aElem.pos2.x - aElem.pos1.x ),
std::abs( aElem.pos2.y - aElem.pos1.y ) );
VECTOR2I anchorPos = aElem.pos1;
pad->SetAnchorPadShape( PAD_SHAPE::CIRCLE );
pad->SetSize( { anchorSize, anchorSize } );
pad->SetPosition( anchorPos );
SHAPE_POLY_SET shapePolys;
shapePolys.NewOutline();
shapePolys.Append( aElem.pos1.x - anchorPos.x, aElem.pos1.y - anchorPos.y );
shapePolys.Append( aElem.pos2.x - anchorPos.x, aElem.pos1.y - anchorPos.y );
shapePolys.Append( aElem.pos2.x - anchorPos.x, aElem.pos2.y - anchorPos.y );
shapePolys.Append( aElem.pos1.x - anchorPos.x, aElem.pos2.y - anchorPos.y );
shapePolys.Outline( 0 ).SetClosed( true );
VECTOR2I center( ( aElem.pos1.x + aElem.pos2.x ) / 2 - anchorPos.x,
( aElem.pos1.y + aElem.pos2.y ) / 2 - anchorPos.y );
shapePolys.Rotate( EDA_ANGLE( aElem.rotation, DEGREES_T ), center );
pad->AddPrimitivePoly( shapePolys, 0, true );
}
pad->SetThermalSpokeAngle( ANGLE_90 );
pad->SetLayerSet( padLayers );
aFootprint->Add( pad.release(), ADD_MODE::APPEND );
}
else
{
std::unique_ptr<PCB_SHAPE> fill =
std::make_unique<PCB_SHAPE>( aFootprint, SHAPE_T::RECTANGLE );
fill->SetFilled( true );
fill->SetLayer( aLayer );
fill->SetStroke( STROKE_PARAMS( 0 ) );
fill->SetStart( aElem.pos1 );
fill->SetEnd( aElem.pos2 );
if( aElem.rotation != 0. )
{
// TODO: Do we need SHAPE_T::POLY for non 90° rotations?
VECTOR2I center( aElem.pos1.x / 2 + aElem.pos2.x / 2,
aElem.pos1.y / 2 + aElem.pos2.y / 2 );
fill->Rotate( center, EDA_ANGLE( aElem.rotation, DEGREES_T ) );
}
aFootprint->Add( fill.release(), ADD_MODE::APPEND );
}
}

View File

@ -1,303 +1,305 @@
(footprint "Espressif ESP32-WROOM-32" (version 20240108) (generator "pcbnew") (generator_version "8.0")
(layer "F.Cu")
(descr "39-SMD Module")
(property "Reference" "REF**" (at -0.7949 -15.8 0) (layer "F.SilkS")(uuid "1ba00595-7cdb-41da-b2d6-fe1e55aedb5a")
(property "Reference" "REF**" (at -0.7949 -15.8 0) (layer "F.SilkS")(uuid "f7ddddee-76f3-4a42-9d8f-38560a8d1a7b")
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Value" "Espressif ESP32-WROOM-32" (at -0.7949 11.7 0) (layer "F.Fab")(uuid "a0b801f8-67b0-40af-bc74-5fb922536f1e")
(property "Value" "Espressif ESP32-WROOM-32" (at -0.7949 11.7 0) (layer "F.Fab")(uuid "59df7c48-e724-4ab5-a33b-9e60bc4d2ba8")
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Footprint" "" (at 0 0 0) (layer "F.Fab")(hide yes)
(uuid "d11e7180-2d21-44b8-82e1-14dfae92478f")
(uuid "21c0c3f7-dd20-42d2-b8ca-f18a3d492892")
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Datasheet" "" (at 0 0 0) (layer "F.Fab")(hide yes)
(uuid "9a20ae60-6735-491f-b2ce-7be2e1ce8201")
(uuid "63ad61c5-c2ee-4242-9854-ca508f48c883")
(effects (font (size 1 1) (thickness 0.15)))
)
(property "Description" "" (at 0 0 0) (layer "F.Fab")(hide yes)
(uuid "c9846f16-7334-4c7e-9942-76164abfe712")
(uuid "9cd8cbf3-6cd7-4067-b1fe-7847b84b98ec")
(effects (font (size 1 1) (thickness 0.15)))
)
(fp_rect (start -4 3) (end 2 -3)
(stroke (width 0) (type default)) (fill solid) (layer "F.Cu")(uuid "53a0d484-ba4a-473a-813a-78ba00c68775"))
(fp_rect (start -4 3) (end 2 -3)
(stroke (width 0) (type default)) (fill solid) (layer "B.Cu")(uuid "6f10dc95-dd4b-4c58-8b3f-1c01f0ee7340"))
(fp_line (start -9 -15) (end 9 -15)
(stroke (width 0.2) (type solid)) (layer "F.SilkS")(uuid "80691bf8-c994-4d7f-b35a-ca2db09f8f30"))
(stroke (width 0.2) (type solid)) (layer "F.SilkS")(uuid "ccbcb558-12da-48bb-b4bf-f72362e39ef0"))
(fp_line (start -9 -8.3) (end -9 -15)
(stroke (width 0.2) (type solid)) (layer "F.SilkS")(uuid "c0fc8e99-faa2-4f86-9767-2abba0af87d1"))
(stroke (width 0.2) (type solid)) (layer "F.SilkS")(uuid "6b3b48a7-1e14-4cc2-a554-0e552e218af5"))
(fp_line (start -9 10.5) (end -9 9.6)
(stroke (width 0.2) (type solid)) (layer "F.SilkS")(uuid "6cf50186-6cff-4054-ac04-35cdc465c665"))
(stroke (width 0.2) (type solid)) (layer "F.SilkS")(uuid "61a88ea9-bff4-4f16-8f96-19cf448eb981"))
(fp_line (start -9 10.5) (end -6.4 10.5)
(stroke (width 0.2) (type solid)) (layer "F.SilkS")(uuid "8d1b0767-bf73-4a04-b6e3-65a0eebc4ef6"))
(stroke (width 0.2) (type solid)) (layer "F.SilkS")(uuid "bbe9eb65-c5be-4c38-8c0a-723591cb90a0"))
(fp_line (start 6.4 10.5) (end 9 10.5)
(stroke (width 0.2) (type solid)) (layer "F.SilkS")(uuid "dced984c-c0d0-426d-a7d1-c0807afc815e"))
(stroke (width 0.2) (type solid)) (layer "F.SilkS")(uuid "974d2cde-b3ad-48f6-a99d-d5b30540f52b"))
(fp_line (start 9 -8.3) (end 9 -15)
(stroke (width 0.2) (type solid)) (layer "F.SilkS")(uuid "22567767-03c8-41d7-ae97-5b7b380d06b1"))
(stroke (width 0.2) (type solid)) (layer "F.SilkS")(uuid "80816d7f-d18b-40cd-aa36-206caee69797"))
(fp_line (start 9 10.5) (end 9 9.6)
(stroke (width 0.2) (type solid)) (layer "F.SilkS")(uuid "4b1b5b15-b78d-4c85-b0c8-bc4be1e8bced"))
(stroke (width 0.2) (type solid)) (layer "F.SilkS")(uuid "69ed6f45-b0ca-499f-b17a-9d0db8d1c36c"))
(fp_circle (center -10.4648 -7.62) (end -10.4648 -7.87)
(stroke (width 0.75) (type solid)) (fill none) (layer "F.SilkS")(uuid "7099898e-3e99-4ff9-9998-26b15f8b942d"))
(stroke (width 0.75) (type solid)) (fill none) (layer "F.SilkS")(uuid "6efc53fe-bbe2-48ea-b62e-f4b1a3f8e999"))
(fp_line (start -9.7 -15.2) (end 9.7 -15.2)
(stroke (width 0.05) (type solid)) (layer "Eco2.User")(uuid "14e1cc73-d49a-4c41-80c1-293ddec29a74"))
(stroke (width 0.05) (type solid)) (layer "Eco2.User")(uuid "bbe7a210-7838-4f44-b687-409f584a73a3"))
(fp_line (start -9.7 11.2) (end -9.7 -15.2)
(stroke (width 0.05) (type solid)) (layer "Eco2.User")(uuid "b8869f21-d425-4cea-aece-88023926befe"))
(stroke (width 0.05) (type solid)) (layer "Eco2.User")(uuid "8c2a6103-7821-4cec-83e7-f99c2304180a"))
(fp_line (start -9.7 11.2) (end 9.7 11.2)
(stroke (width 0.05) (type solid)) (layer "Eco2.User")(uuid "77db8cac-b176-46fb-8e07-658498a434b2"))
(stroke (width 0.05) (type solid)) (layer "Eco2.User")(uuid "3b8ffe4a-6551-4c47-a257-203ce0555572"))
(fp_line (start -0.5 -0.001) (end 0.5 -0.001)
(stroke (width 0.05) (type solid)) (layer "Eco2.User")(uuid "93051670-a8f3-4544-ad70-5770f75aa29c"))
(stroke (width 0.05) (type solid)) (layer "Eco2.User")(uuid "886a6591-8f27-42b6-98a3-0245528e1261"))
(fp_line (start 0 0.499) (end 0 -0.501)
(stroke (width 0.05) (type solid)) (layer "Eco2.User")(uuid "be4932e2-42e8-4a91-afd5-8b2672e4dc85"))
(stroke (width 0.05) (type solid)) (layer "Eco2.User")(uuid "140c57d5-c796-4b32-b7a9-0c9f8afc69ae"))
(fp_line (start 9.7 11.2) (end 9.7 -15.2)
(stroke (width 0.05) (type solid)) (layer "Eco2.User")(uuid "a22230da-646c-4c5b-88ba-3fc4f8e38cd5"))
(stroke (width 0.05) (type solid)) (layer "Eco2.User")(uuid "5d90805d-b24d-42dd-9e39-79a2736359c1"))
(fp_line (start -9 -15) (end 9 -15)
(stroke (width 0.1) (type solid)) (layer "B.Fab")(uuid "14b89af9-3886-41e7-81f7-790f1475cc6f"))
(stroke (width 0.1) (type solid)) (layer "B.Fab")(uuid "b11cb1a3-7de6-4a46-9c80-38f6ea31f285"))
(fp_line (start -9 10.5) (end -9 -15)
(stroke (width 0.1) (type solid)) (layer "B.Fab")(uuid "fa541386-c806-4fc4-b7b3-5631071cd1d8"))
(stroke (width 0.1) (type solid)) (layer "B.Fab")(uuid "dfc474f7-1d8e-4a86-9bc6-4064b5e59255"))
(fp_line (start -9 10.5) (end 9 10.5)
(stroke (width 0.1) (type solid)) (layer "B.Fab")(uuid "2d3c548c-d4fd-4999-9b1b-ce3cf77653f8"))
(stroke (width 0.1) (type solid)) (layer "B.Fab")(uuid "e4bdee17-dd3e-4905-925a-54c1554c5c54"))
(fp_line (start 9 10.5) (end 9 -15)
(stroke (width 0.1) (type solid)) (layer "B.Fab")(uuid "742495ee-f970-46f8-8d2e-7e837df25243"))
(stroke (width 0.1) (type solid)) (layer "B.Fab")(uuid "83c47a1b-af42-44c3-b12e-c2dc8f003731"))
(fp_circle (center -7.9 -7.6) (end -7.9 -8.1)
(stroke (width 0.1) (type solid)) (fill none) (layer "B.Fab")(uuid "5bf18964-d0d0-4b33-85ae-21b8d7a38792"))
(pad "" thru_hole circle (at -2.835 -0.9175) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "bd6cfc84-eed1-4c29-a962-6927e8cfc9bb")
)
(pad "" thru_hole circle (at -2.835 0.9175) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "68a85088-9a9e-47ce-94e2-f381f4a07714")
)
(pad "" thru_hole circle (at -1.9175 -1.835) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "1c020f30-66e8-4eda-bdc9-6a92ba465ace")
)
(pad "" thru_hole circle (at -1.9175 0) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "c248bc1b-8b27-4749-9508-f940920db95f")
)
(pad "" thru_hole circle (at -1.9175 1.835) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "ce126843-0c03-4fff-a8d4-eb5b171f7023")
)
(pad "" thru_hole circle (at -1 -0.9175) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "20fa0e63-64ef-4b71-a1fe-3d1b688fc272")
)
(pad "" thru_hole circle (at -1 0.9175) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "7c71a6e2-f6c8-4fc5-9972-fdaa6b0ed183")
)
(pad "" thru_hole circle (at -0.0825 -1.835) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "bfe8372c-0104-45b2-b353-86c4c2fd8e69")
)
(pad "" thru_hole circle (at -0.0825 0) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "90590aa4-d200-4aa3-ae3d-65fca4ddd997")
)
(pad "" thru_hole circle (at -0.0825 1.835) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "6a3bca9f-deda-484a-b4aa-9d2307c847a8")
)
(pad "" thru_hole circle (at 0.835 -0.9175) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "55800dd8-2ca8-463b-bb99-5c932c761b41")
)
(pad "" thru_hole circle (at 0.835 0.9175) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "0ca122ad-16fa-4dca-a9d5-ec9f28de0f66")
)
(stroke (width 0.1) (type solid)) (fill none) (layer "B.Fab")(uuid "e97379b3-1161-4400-a6d3-0a66e2be5354"))
(pad "1" smd roundrect (at -8.5 -7.51) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "08b22d3f-0a6e-460e-8007-ec53f2731e61")
(uuid "f99e4362-5f85-458c-b0b6-2594153a82cb")
)
(pad "2" smd roundrect (at -8.5 -6.24) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "2272b202-c8dd-4092-8d85-b67de448c62c")
(uuid "ee3fbcaf-49b9-435d-9ad3-1b9fff5d8576")
)
(pad "3" smd roundrect (at -8.5 -4.97) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "5ae9181f-a60a-4a34-af39-fb8d53927279")
(uuid "64937670-ff1a-4818-9c7a-aa6ebce42f3d")
)
(pad "4" smd roundrect (at -8.5 -3.7) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "bbcd7a59-6f51-41e5-8610-5ab3cef829b7")
(uuid "17b9021b-75cf-4616-87d6-cb34ade5d27e")
)
(pad "5" smd roundrect (at -8.5 -2.43) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "1e913477-4faf-4989-85b4-d7029d70586e")
(uuid "678ecd60-e2f8-40ed-bddb-5c81316a0417")
)
(pad "6" smd roundrect (at -8.5 -1.16) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "db825d4e-6363-4655-9559-ae00ca64c554")
(uuid "84882a6a-d30e-4a7b-9785-39bfd974e13b")
)
(pad "7" smd roundrect (at -8.5 0.11) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "60b7d8aa-b138-43ea-bd1e-16adcc8d33ad")
(uuid "9138158d-d4d6-46c4-9aaf-66b5ea6370b3")
)
(pad "8" smd roundrect (at -8.5 1.38) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "c9f71d4b-93a6-4852-bb18-cdf4ac8bf641")
(uuid "d981b7a5-883e-45a7-8c70-fbeacbe86360")
)
(pad "9" smd roundrect (at -8.5 2.65) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "1f949961-9a09-4f81-8c03-269f743d2a7b")
(uuid "7b64850b-05b8-41a8-82e4-e53811dc073c")
)
(pad "10" smd roundrect (at -8.5 3.92) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "0d988aeb-fa36-403d-87e2-f6c2ecbb3939")
(uuid "65d9a089-a670-47b8-8581-33aecbbe1cc8")
)
(pad "11" smd roundrect (at -8.5 5.19 180) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "c318ce7c-9f79-4225-a5e2-fc0ef5969e12")
(uuid "f19f9267-31fc-479f-834b-63dce70df920")
)
(pad "12" smd roundrect (at -8.5 6.46 180) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "a631940e-4cf1-46cf-9863-78213fd22aba")
(uuid "b274ec92-f21f-4607-8bb9-b8706cfd34a9")
)
(pad "13" smd roundrect (at -8.5 7.73 180) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "0d5130a2-681c-4940-b4a3-46d65b90f11c")
(uuid "dab42302-674a-4981-874c-5c6329116647")
)
(pad "14" smd roundrect (at -8.5 9 180) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "cb1a6cde-49c4-41d3-b96f-7a1e356d9bc3")
(uuid "70db9bc8-38bc-4f9e-8704-d1e5633bf5e3")
)
(pad "15" smd roundrect (at -5.715 10 270) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "91914b0e-bde1-4de2-98c6-eec4a1b28372")
(uuid "8530e9b8-ccf1-4af1-9c95-867dbd5f3cb2")
)
(pad "16" smd roundrect (at -4.445 10 90) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "17985445-f923-44c5-a38b-b003fdc26921")
(uuid "0ad92815-dcf5-4ada-9d73-3d5c509aedc6")
)
(pad "17" smd roundrect (at -3.175 10 90) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "571fb42b-535a-43e7-a84b-c505467a4dfe")
(uuid "90ce394f-743c-4f8e-98d6-b465adb9f46b")
)
(pad "18" smd roundrect (at -1.905 10 90) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "b982433f-58ba-420b-96da-b40877d56837")
(uuid "7af065a4-9e6b-4cba-bc0b-d16883fe3f1f")
)
(pad "19" smd roundrect (at -0.635 10 90) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "32bfc9c0-6dc4-4f9b-bf0f-1a92d0763c1c")
(uuid "b44f6a1d-e3f0-46c8-a919-2e168a6b9784")
)
(pad "20" smd roundrect (at 0.635 10 90) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "a1bc973c-19a1-41d1-a237-88892065b913")
(uuid "903c19e8-7a26-4db4-a48d-f5ece8811cd6")
)
(pad "21" smd roundrect (at 1.905 10 90) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "c847265b-aad7-447d-93ee-dfa65e1c873c")
(uuid "4626dc20-5baa-47cc-964d-c23f1b175877")
)
(pad "22" smd roundrect (at 3.175 10 90) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "349f767a-8008-41ef-934a-dab97b501fa9")
(uuid "281bc41e-0612-45cb-987b-5dbdb3753486")
)
(pad "23" smd roundrect (at 4.445 10 90) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "542fdc21-09f1-4b4a-be4c-6510b2d2d95b")
(uuid "3ca9ac34-c65d-48f3-a321-c281200db675")
)
(pad "24" smd roundrect (at 5.715 10 90) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "b1cbe2fb-fddb-4e17-967c-fb083174aed6")
(uuid "38cd3a21-a95d-413c-aa86-a15cbfbcf5f7")
)
(pad "25" smd roundrect (at 8.5 9) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "2a9eeacd-6474-4267-beda-833c7149a0bb")
(uuid "e1170e16-4a60-4f2e-8032-be726e1d75c2")
)
(pad "26" smd roundrect (at 8.5 7.73) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "70aec27e-eb81-4ff3-8561-3b4c5b24e5ec")
(uuid "dbf16cd6-5c85-46c7-baf9-2b3bf931a622")
)
(pad "27" smd roundrect (at 8.5 6.46) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "c655475d-1ee7-426c-a402-69ff7a728877")
(uuid "80e16a54-aa17-4664-8c41-357ecebd92f0")
)
(pad "28" smd roundrect (at 8.5 5.19) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "4f47f373-52d7-475c-abff-73cd34ae3686")
(uuid "5ee6db82-b066-4aa8-af96-9a1bedef52ed")
)
(pad "29" smd roundrect (at 8.5 3.92) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "c45041a1-4fa4-42b6-bcd5-f963500b6d3e")
(uuid "c573abb6-48ad-458e-a2b4-42bd0aa7b381")
)
(pad "30" smd roundrect (at 8.5 2.65) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.05)
(solder_mask_margin 0.05)
(uuid "adf0b2ed-3ebf-4df1-b9ed-0721e80ee4b5")
(uuid "5c31c709-7405-4fec-8f20-7838f1730803")
)
(pad "31" smd rect (at 8.5 1.38) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "4e7e1e9a-114b-4106-afa2-dfa31b2f12a4")
(uuid "b028670b-34db-4bc0-9768-3092d98559f7")
)
(pad "32" smd rect (at 8.5 0.11) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "1b9b4f68-90f4-453e-9b43-a95988ea38f9")
(uuid "4ae610e6-d9db-4585-9c85-5dd47400f9bd")
)
(pad "33" smd rect (at 8.5 -1.16) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "2e91def0-0fb4-4beb-b4e4-065be23f743c")
(uuid "8e4ff640-19e0-4c88-9457-bc80caa7282c")
)
(pad "34" smd rect (at 8.5 -2.43) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "847cef85-5fb6-4885-8a0a-77ee0bdeea01")
(uuid "9199e8e2-8371-4589-aecb-0fefd05aef73")
)
(pad "35" smd rect (at 8.5 -3.7) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "f18d349c-e4d0-4a6d-a1b2-536d039f2144")
(uuid "61b3f64c-58a6-41fe-a25e-b357af19bd97")
)
(pad "36" smd rect (at 8.5 -4.97) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "d5990d49-986d-4f84-a69e-03162d9ee421")
(uuid "6eab4fbe-e494-48be-bcb7-7033bdc34e13")
)
(pad "37" smd rect (at 8.5 -6.24) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "63c5963a-f366-4128-acc5-663d0ad8c169")
(uuid "3a7357a7-7e01-4d2c-9ff8-f51c0acef7f9")
)
(pad "38" smd rect (at 8.5 -7.51) (size 2 0.9) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "53498215-ca6d-46ab-907e-b5bf5dfc21c6")
(uuid "3511aaa5-4035-46da-b5aa-a378777c87f9")
)
(pad "39" smd rect (at -2.835 -1.835) (size 1.33 1.33) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "b65c2d8c-02d8-466a-b9fa-d6195265d9ad")
(uuid "33fbc71b-cee0-49df-8a17-5c23951cd06d")
)
(pad "39" thru_hole circle (at -2.835 -0.9175) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "91f24b80-3551-4147-b396-a65fa2b228c6")
)
(pad "39" smd rect (at -2.835 0 90) (size 1.33 1.33) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "c3a96cd8-1aca-4519-a786-e2f992640989")
(uuid "4541feab-e3dd-42f1-98e6-f68d3bc4d2f9")
)
(pad "39" thru_hole circle (at -2.835 0.9175) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "82ed68d5-649e-43b2-ae52-084af4e141d3")
)
(pad "39" smd rect (at -2.835 1.835 180) (size 1.33 1.33) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "0bebd4e2-d364-4325-b4e9-d90e23a46083")
(uuid "0a8d9ed5-c8f5-46fb-8601-a6cb60e77880")
)
(pad "39" thru_hole circle (at -1.9175 -1.835) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "a060a74a-409c-44e2-a812-da2ee7230dbd")
)
(pad "39" thru_hole circle (at -1.9175 0) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "55316ebd-0b01-4e2e-997a-c93e96595335")
)
(pad "39" thru_hole circle (at -1.9175 1.835) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "14619631-75cd-4baa-938a-3b8c14c4b089")
)
(pad "39" smd rect (at -1 -1.835) (size 1.33 1.33) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "a6cc869e-0998-40a6-85c9-cfa613ec10ff")
(uuid "4a031b07-5fe8-4710-94f6-81a3a6b51307")
)
(pad "39" thru_hole circle (at -1 -0.9175) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "12a4f942-4f1a-4c93-985a-51d459fcf0e7")
)
(pad "39" smd rect (at -1 0) (size 1.33 1.33) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "f20a48ff-a576-4d9e-a36c-e860ec5b7178")
(uuid "cdc5900b-6e40-47e1-9131-d89e7a98a22d")
)
(pad "39" smd rect (at -1 0) (size 6 -6) (layers "F.Cu")
(uuid "597e6e56-6aff-40bd-a617-3606896d64a1")
)
(pad "39" smd rect (at -1 0) (size 6 -6) (layers "B.Cu")
(uuid "e1a84642-9b3b-47ee-884d-e09a9e2b8553")
)
(pad "39" thru_hole circle (at -1 0.9175) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "d3be3a9e-7acf-4778-a1e9-0b97b634358c")
)
(pad "39" smd rect (at -1 1.835 180) (size 1.33 1.33) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "9cffc53d-9bad-45ea-9503-c6bf1e6620f6")
(uuid "94019a7f-4ec3-450b-9817-70390ef95172")
)
(pad "39" thru_hole circle (at -0.0825 -1.835) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "6637b83b-a4f1-43ba-b285-4986426c9f93")
)
(pad "39" thru_hole circle (at -0.0825 0) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "11777650-ceb9-4c35-9143-d23c370ccafd")
)
(pad "39" thru_hole circle (at -0.0825 1.835) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "1b551e05-c1f6-4d84-a9e5-a1e00ec3b0ae")
)
(pad "39" smd rect (at 0.835 -1.835) (size 1.33 1.33) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "5da7dec2-3ce0-4c32-b248-c57e1cbaeae5")
(uuid "284967cd-1c5e-498d-8a9c-3f4b1d1bd67b")
)
(pad "39" thru_hole circle (at 0.835 -0.9175) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "f03f9897-611a-4d8b-a3e2-5c842a54c72d")
)
(pad "39" smd rect (at 0.835 0 270) (size 1.33 1.33) (layers "F.Cu" "F.Paste" "F.Mask")
(solder_mask_margin 0.05)
(uuid "7f4f074a-f529-475f-83d1-3b6208ef8c60")
(uuid "9a82cbde-bf24-4f76-bcba-5ebe97c65a0f")
)
(pad "39" thru_hole circle (at 0.835 0.9175) (size 0.6 0.6) (drill 0.3) (layers "*.Cu" "*.Mask")(remove_unused_layers no)
(uuid "b1f952db-dbfa-485d-a45e-4747e199b57c")
)
(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)
(uuid "c91782b9-912e-4085-a63d-548ccf1935b5")
(uuid "9fc18859-4958-4808-bd37-76c1540986ea")
)
(zone (net 0) (net_name "") (layers "*.Cu")(uuid "ef687268-1ef2-4ddb-ac11-af11f3ba3ff4")
(zone (net 0) (net_name "") (layers "*.Cu")(uuid "29f6a6bd-8842-4382-9864-e9399823aab5")
(hatch edge 0.5)
(connect_pads (clearance 0))
(min_thickness 0.25) (filled_areas_thickness no)