From 8832b22952b8a92569736fbf6ede3fd4c57df360 Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Thu, 27 Jun 2024 13:46:16 -0700 Subject: [PATCH] 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 51eb7aa5b5ba13016ccac90a36db0caf996e3be8) --- pcbnew/pcb_io/altium/altium_pcb.cpp | 184 +++++++++++-- .../Espressif ESP32-WROOM-32.kicad_mod | 250 +++++++++--------- 2 files changed, 283 insertions(+), 151 deletions(-) diff --git a/pcbnew/pcb_io/altium/altium_pcb.cpp b/pcbnew/pcb_io/altium/altium_pcb.cpp index ea4badf32a..7d726feea3 100644 --- a/pcbnew/pcb_io/altium/altium_pcb.cpp +++ b/pcbnew/pcb_io/altium/altium_pcb.cpp @@ -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 shape1 = aPad1->GetEffectiveShape( layer ); + std::shared_ptr 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 shape = std::make_unique( aFootprint, SHAPE_T::POLY ); + if( aLayer == F_Cu || aLayer == B_Cu ) + { + std::unique_ptr pad = std::make_unique( 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 shape = std::make_unique( 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 = std::make_unique( 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 fill = + std::make_unique( 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 ); + } } diff --git a/qa/data/pcbnew/plugins/altium/pcblib/Espressif ESP32-WROOM-32.pretty/Espressif ESP32-WROOM-32.kicad_mod b/qa/data/pcbnew/plugins/altium/pcblib/Espressif ESP32-WROOM-32.pretty/Espressif ESP32-WROOM-32.kicad_mod index 6c7bd400b0..636e011425 100644 --- a/qa/data/pcbnew/plugins/altium/pcblib/Espressif ESP32-WROOM-32.pretty/Espressif ESP32-WROOM-32.kicad_mod +++ b/qa/data/pcbnew/plugins/altium/pcblib/Espressif ESP32-WROOM-32.pretty/Espressif ESP32-WROOM-32.kicad_mod @@ -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)