diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 86ba09d8cd..947909576b 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -117,6 +117,8 @@ set( KICOMMON_SRCS string_utils.cpp trace_helpers.cpp wx_filename.cpp + + plugins/kicad/kicad_plugin_utils.cpp # needed by richio ) add_library( kicommon SHARED @@ -492,7 +494,6 @@ set( COMMON_SRCS page_info.cpp plugin_file_desc.cpp plugins/plugin_utils.cpp - plugins/kicad/kicad_plugin_utils.cpp printout.cpp project.cpp ptree.cpp diff --git a/common/plugins/kicad/kicad_plugin_utils.cpp b/common/plugins/kicad/kicad_plugin_utils.cpp index cf847a6295..78965e95ad 100644 --- a/common/plugins/kicad/kicad_plugin_utils.cpp +++ b/common/plugins/kicad/kicad_plugin_utils.cpp @@ -17,6 +17,8 @@ * with this program. If not, see . */ +#include + #include #include #include @@ -37,6 +39,184 @@ void FormatUuid( OUTPUTFORMATTER* aOut, const KIID& aUuid, char aSuffix ) aOut->Print( 0, "(uuid \"%s\")%c", TO_UTF8( aUuid.AsString() ), aSuffix ); else aOut->Print( 0, "(uuid \"%s\")", TO_UTF8( aUuid.AsString() ) ); + +} + +/* + * Formatting rules: + * - All extra (non-indentation) whitespace is trimmed + * - Indentation is one tab + * - Starting a new list (open paren) starts a new line with one deeper indentation + * - Lists with no inner lists go on a single line + * - End of multi-line lists (close paren) goes on a single line at same indentation as its start + * + * For example: + * (first + * (second + * (third list) + * (another list) + * ) + * (fifth) + * (sixth thing with lots of tokens + * (and a sub list) + * ) + * ) + */ +void Prettify( std::string& aSource, char aQuoteChar ) +{ + // Configuration + const char indentChar = '\t'; + const int indentSize = 1; + + // In order to visually compress PCB files, it is helpful to special-case long lists of (xy ...) + // lists, which we allow to exist on a single line until we reach column 99. + const int xySpecialCaseColumnLimit = 99; + + // If whitespace occurs inside a list after this threshold, it will be converted into a newline + // and the indentation will be increased. This is mainly used for image and group objects, + // which contain potentially long sets of string tokens within a single list. + const int consecutiveTokenWrapThreshold = 72; + + std::string formatted; + formatted.reserve( aSource.length() ); + + auto cursor = aSource.begin(); + auto seek = cursor; + + int listDepth = 0; + char lastNonWhitespace = 0; + bool inQuote = false; + bool hasInsertedSpace = false; + bool inMultiLineList = false; + int column = 0; + + auto isWhitespace = []( const char aChar ) + { + return ( aChar == ' ' || aChar == '\t' || aChar == '\n' || aChar == '\r' ); + }; + + auto nextNonWhitespace = + [&]( std::string::iterator aIt ) + { + seek = aIt; + + while( seek != aSource.end() && isWhitespace( *seek ) ) + seek++; + + return *seek; + }; + + auto isXY = + [&]( std::string::iterator aIt ) + { + seek = aIt; + + if( ++seek == aSource.end() || *seek != 'x' ) + return false; + + if( ++seek == aSource.end() || *seek != 'y' ) + return false; + + if( ++seek == aSource.end() || *seek != ' ' ) + return false; + + return true; + }; + + while( cursor != aSource.end() ) + { + char next = nextNonWhitespace( cursor ); + + if( isWhitespace( *cursor ) && !inQuote ) + { + if( !hasInsertedSpace // Only permit one space between chars + && listDepth > 0 // Do not permit spaces in outer list + && lastNonWhitespace != '(' // Remove extra space after start of list + && next != ')' // Remove extra space before end of list + && next != '(' ) // Remove extra space before newline + { + if( column < consecutiveTokenWrapThreshold ) + { + // Note that we only insert spaces here, no matter what kind of whitespace is in + // the input. Newlines will be inserted as needed by the logic below. + formatted.push_back( ' ' ); + column++; + } + else + { + formatted += fmt::format( "\n{}", + std::string( listDepth * indentSize, indentChar ) ); + column = listDepth * indentSize; + inMultiLineList = true; + } + + hasInsertedSpace = true; + } + } + else + { + hasInsertedSpace = false; + + if( *cursor == '(' && !inQuote ) + { + if( listDepth == 0 ) + { + formatted.push_back( '(' ); + column++; + } + else if( isXY( cursor ) && column < xySpecialCaseColumnLimit ) + { + // List-of-points special case + formatted += " ("; + column += 2; + } + else + { + formatted += fmt::format( "\n{}(", + std::string( listDepth * indentSize, indentChar ) ); + column = listDepth * indentSize + 1; + } + + listDepth++; + } + else if( *cursor == ')' && !inQuote ) + { + if( listDepth > 0 ) + listDepth--; + + if( lastNonWhitespace == ')' || inMultiLineList ) + { + formatted += fmt::format( "\n{})", + std::string( listDepth * indentSize, indentChar ) ); + column = listDepth * indentSize + 1; + inMultiLineList = false; + } + else + { + formatted.push_back( ')' ); + column++; + } + } + else + { + // The output formatter escapes double-quotes + if( *cursor == aQuoteChar + && ( cursor == aSource.begin() || *( cursor - 1 ) != '\\' ) ) + { + inQuote = !inQuote; + } + + formatted.push_back( *cursor ); + column++; + } + + lastNonWhitespace = *cursor; + } + + ++cursor; + } + + aSource = formatted; } } // namespace KICAD_FORMAT diff --git a/common/richio.cpp b/common/richio.cpp index 3768ce3276..02f42b4e2e 100644 --- a/common/richio.cpp +++ b/common/richio.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include @@ -582,20 +583,47 @@ void FILE_OUTPUTFORMATTER::write( const char* aOutBuf, int aCount ) } -void STREAM_OUTPUTFORMATTER::write( const char* aOutBuf, int aCount ) +PRETTIFIED_FILE_OUTPUTFORMATTER::PRETTIFIED_FILE_OUTPUTFORMATTER( const wxString& aFileName, + const wxChar* aMode, + char aQuoteChar ) : + OUTPUTFORMATTER( OUTPUTFMTBUFZ, aQuoteChar ) { - int lastWrite; + m_fp = wxFopen( aFileName, aMode ); - // This might delay awhile if you were writing to say a socket, but for - // a file it should only go through the loop once. - for( int total = 0; total m_buffer; char quoteChar[2]; @@ -490,28 +496,27 @@ protected: }; -/** - * Implement an #OUTPUTFORMATTER to a wxWidgets wxOutputStream. - * - * The stream is neither opened nor closed by this class. - */ -class KICOMMON_API STREAM_OUTPUTFORMATTER : public OUTPUTFORMATTER +class KICOMMON_API PRETTIFIED_FILE_OUTPUTFORMATTER : public OUTPUTFORMATTER { - wxOutputStream& m_os; - public: + PRETTIFIED_FILE_OUTPUTFORMATTER( const wxString& aFileName, const wxChar* aMode = wxT( "wt" ), + char aQuoteChar = '"' ); + + ~PRETTIFIED_FILE_OUTPUTFORMATTER(); + /** - * This can take any number of wxOutputStream derivations, so it can write to a file, - * socket, or zip file. + * Performs prettification and writes the stored buffer to the file. + * @return true if the write succeeded. */ - STREAM_OUTPUTFORMATTER( wxOutputStream& aStream, char aQuoteChar = '"' ) : - OUTPUTFORMATTER( OUTPUTFMTBUFZ, aQuoteChar ), - m_os( aStream ) - { - } + bool Finish() override; protected: void write( const char* aOutBuf, int aCount ) override; + +private: + FILE* m_fp; + std::string m_buf; }; + #endif // RICHIO_H_ diff --git a/pcbnew/plugins/kicad/pcb_plugin.cpp b/pcbnew/plugins/kicad/pcb_plugin.cpp index 8406791417..c9140c3ac4 100644 --- a/pcbnew/plugins/kicad/pcb_plugin.cpp +++ b/pcbnew/plugins/kicad/pcb_plugin.cpp @@ -119,7 +119,7 @@ void FP_CACHE::Save( FOOTPRINT* aFootprint ) wxLogTrace( traceKicadPcbPlugin, wxT( "Creating temporary library file '%s'." ), tempFileName ); - FILE_OUTPUTFORMATTER formatter( tempFileName ); + PRETTIFIED_FILE_OUTPUTFORMATTER formatter( tempFileName ); m_owner->SetOutputFormatter( &formatter ); m_owner->Format( (BOARD_ITEM*) it->second->GetFootprint() ); @@ -319,7 +319,7 @@ void PCB_PLUGIN::SaveBoard( const wxString& aFileName, BOARD* aBoard, // Prepare net mapping that assures that net codes saved in a file are consecutive integers m_mapping->SetBoard( aBoard ); - FILE_OUTPUTFORMATTER formatter( aFileName ); + PRETTIFIED_FILE_OUTPUTFORMATTER formatter( aFileName ); m_out = &formatter; // no ownership @@ -328,6 +328,7 @@ void PCB_PLUGIN::SaveBoard( const wxString& aFileName, BOARD* aBoard, Format( aBoard, 1 ); m_out->Print( 0, ")\n" ); + m_out->Finish(); m_out = nullptr; } diff --git a/qa/data/pcbnew/prettifier/Reverb_BTDR-1V.kicad_mod b/qa/data/pcbnew/prettifier/Reverb_BTDR-1V.kicad_mod new file mode 100644 index 0000000000..09de50064a --- /dev/null +++ b/qa/data/pcbnew/prettifier/Reverb_BTDR-1V.kicad_mod @@ -0,0 +1,94 @@ +(footprint "Reverb_BTDR-1V" (version 20231007) (generator pcbnew) + (layer "F.Cu") + (descr "Digital Reverberation Unit, http://www.belton.co.kr/inc/downfile.php?seq=17&file=pdf (footprint from http://www.uk-electronic.de/PDF/BTDR-1.pdf)") + (tags "audio belton reverb") + (property "Reference" "REF**" (at -11.5 0 180) (layer "F.SilkS") (tstamp 23fd8612-0682-410f-bf8d-c4874ad45f3d) + (effects (font (size 1 1) (thickness 0.15))) + ) + (property "Value" "Reverb_BTDR-1V" (at 27.62 -2.75 180) (layer "F.Fab") (tstamp 84aa1724-7810-4bd1-982b-bc3da110a2d1) + (effects (font (size 1 1) (thickness 0.15))) + ) + (property "Footprint" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 8ed64581-2b83-4ebe-8edd-cfd9b8d4cf5e) + (effects (font (size 1.27 1.27))) + ) + (property "Datasheet" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp b2b0cf58-a054-47f5-a1a7-d365c87f1a14) + (effects (font (size 1.27 1.27))) + ) + (property "Description" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp a92072d5-74bf-49b6-8a42-08692319d2f4) + (effects (font (size 1.27 1.27))) + ) + (attr through_hole) + (fp_line (start -13.88 1.3) (end 69.12 1.3) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 81a7dfa1-c278-425c-a935-a8b9a29946a6)) + (fp_line (start -13.88 4.3) (end -13.88 1.3) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp bda1223a-e7ea-4c51-9249-a21d389f3710)) + (fp_line (start -6.38 4.3) (end -13.88 4.3) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 690bfa6b-b0f9-4317-ad57-06b3802ac7b0)) + (fp_line (start -6.38 11.1) (end -6.38 4.3) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 97cadbec-a55e-41ed-92d5-eb3214b34afd)) + (fp_line (start 61.62 4.3) (end 61.62 11.1) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c5e6a983-b7b3-4b12-9d4a-dd295e782cfe)) + (fp_line (start 61.62 11.1) (end -6.38 11.1) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 2d8f87c0-9dd2-41d3-b1cd-9d71e4644960)) + (fp_line (start 69.12 1.3) (end 69.12 4.3) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp be83e42e-9ffb-493c-ad07-45c77841473d)) + (fp_line (start 69.12 4.3) (end 61.62 4.3) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp f4ce1fd3-d6c1-4abb-b989-ae90ad642a07)) + (fp_line (start -14.13 -1.25) (end 69.37 -1.25) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 712967cb-b7b3-4f31-95b5-a3ae7821d1b9)) + (fp_line (start -14.13 11.35) (end -14.13 -1.25) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 0662dc2c-544d-47e4-b9a9-078d346b7b8b)) + (fp_line (start -6.63 11.35) (end -14.13 11.35) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 6b2036dd-604c-4667-9cd8-889990119aba)) + (fp_line (start 61.62 11.35) (end -6.63 11.35) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 48f58059-e5ec-4db5-97c0-741c62b975e6)) + (fp_line (start 69.37 -1.25) (end 69.37 11.35) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 12d7a82e-b0c6-40b8-a78c-2d112ffab686)) + (fp_line (start 69.37 11.35) (end 61.62 11.35) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 665f55d3-1930-4c50-8ac6-a50812f0ebb7)) + (fp_line (start -13.88 1.3) (end 69.12 1.3) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 40e6edcf-2dca-4414-8c68-54b5cb516af0)) + (fp_line (start -13.88 4.3) (end -13.88 1.3) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 69e81b15-c24f-4180-a1e2-ddeb5ca6447d)) + (fp_line (start -6.38 4.3) (end -13.88 4.3) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp f4d1a664-c87b-4415-947e-80bf18cfb575)) + (fp_line (start -6.38 11.1) (end -6.38 4.3) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp e0811244-7b68-4fcc-9992-3c461271d12c)) + (fp_line (start 61.62 4.3) (end 61.62 11.1) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 1c90e511-a13d-4a19-bb0c-341a540211ff)) + (fp_line (start 61.62 11.1) (end -6.38 11.1) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp b8985526-ec53-47c3-9430-ddff43dd0717)) + (fp_line (start 69.12 1.3) (end 69.12 4.3) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 422ec1ee-934d-458a-a428-dae9f64f0e7c)) + (fp_line (start 69.12 4.3) (end 61.62 4.3) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp c32cd034-9d5f-4f99-a118-06e174e115a6)) + (fp_text user "${REFERENCE}" (at 27.62 6.2 180) (layer "F.Fab") (tstamp 2c2c1e88-d6ac-4cc4-8e09-80f372bca783) + (effects (font (size 1 1) (thickness 0.15))) + ) + (pad "1" thru_hole rect (at 0 0) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask") + (tstamp 6b54a4cf-1c47-48bd-9076-9d2c1ed1dc0b) + ) + (pad "2" thru_hole circle (at 2.54 0) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask") + (tstamp 1b5d7c94-aaa1-488b-9352-7b5770314a42) + ) + (pad "3" thru_hole circle (at 5.08 0) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask") + (tstamp 254b0c32-5f01-4308-b5dd-0a4bc380a715) + ) + (pad "4" thru_hole circle (at 7.62 0) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask") + (tstamp bc6a6a8f-3b8f-413f-88e7-4957bd99351b) + ) + (pad "5" thru_hole circle (at 50.62 0) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask") + (tstamp 35698302-6de0-4184-aefe-e2cbdd76c272) + ) + (pad "6" thru_hole circle (at 53.16 0) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask") + (tstamp c86ea0ec-de68-4d29-839c-dfca7c7d64b3) + ) + (pad "7" thru_hole circle (at 55.7 0) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask") + (tstamp 5fc56d94-ca72-44e4-babd-0986bd43161c) + ) + (model "${KICAD6_3DMODEL_DIR}/Audio_Module.3dshapes/Reverb_BTDR-1V.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) diff --git a/qa/data/pcbnew/prettifier/Reverb_BTDR-1V_formatted.kicad_mod b/qa/data/pcbnew/prettifier/Reverb_BTDR-1V_formatted.kicad_mod new file mode 100644 index 0000000000..9b8e03ca1e --- /dev/null +++ b/qa/data/pcbnew/prettifier/Reverb_BTDR-1V_formatted.kicad_mod @@ -0,0 +1,364 @@ +(footprint "Reverb_BTDR-1V" + (version 20231014) + (generator pcbnew) + (layer "F.Cu") + (descr "Digital Reverberation Unit, http://www.belton.co.kr/inc/downfile.php?seq=17&file=pdf (footprint from http://www.uk-electronic.de/PDF/BTDR-1.pdf)") + (tags "audio belton reverb") + (property "Reference" "REF**" + (at -11.5 0 180) + (layer "F.SilkS") + (uuid "23fd8612-0682-410f-bf8d-c4874ad45f3d") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "Reverb_BTDR-1V" + (at 27.62 -2.75 180) + (layer "F.Fab") + (uuid "84aa1724-7810-4bd1-982b-bc3da110a2d1") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "8ed64581-2b83-4ebe-8edd-cfd9b8d4cf5e") + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "b2b0cf58-a054-47f5-a1a7-d365c87f1a14") + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "a92072d5-74bf-49b6-8a42-08692319d2f4") + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (attr through_hole) + (fp_line + (start -13.88 1.3) + (end 69.12 1.3) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "81a7dfa1-c278-425c-a935-a8b9a29946a6") + ) + (fp_line + (start -13.88 4.3) + (end -13.88 1.3) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "bda1223a-e7ea-4c51-9249-a21d389f3710") + ) + (fp_line + (start -6.38 4.3) + (end -13.88 4.3) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "690bfa6b-b0f9-4317-ad57-06b3802ac7b0") + ) + (fp_line + (start -6.38 11.1) + (end -6.38 4.3) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "97cadbec-a55e-41ed-92d5-eb3214b34afd") + ) + (fp_line + (start 61.62 4.3) + (end 61.62 11.1) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "c5e6a983-b7b3-4b12-9d4a-dd295e782cfe") + ) + (fp_line + (start 61.62 11.1) + (end -6.38 11.1) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "2d8f87c0-9dd2-41d3-b1cd-9d71e4644960") + ) + (fp_line + (start 69.12 1.3) + (end 69.12 4.3) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "be83e42e-9ffb-493c-ad07-45c77841473d") + ) + (fp_line + (start 69.12 4.3) + (end 61.62 4.3) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "f4ce1fd3-d6c1-4abb-b989-ae90ad642a07") + ) + (fp_line + (start -14.13 -1.25) + (end 69.37 -1.25) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "712967cb-b7b3-4f31-95b5-a3ae7821d1b9") + ) + (fp_line + (start -14.13 11.35) + (end -14.13 -1.25) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "0662dc2c-544d-47e4-b9a9-078d346b7b8b") + ) + (fp_line + (start -6.63 11.35) + (end -14.13 11.35) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "6b2036dd-604c-4667-9cd8-889990119aba") + ) + (fp_line + (start 61.62 11.35) + (end -6.63 11.35) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "48f58059-e5ec-4db5-97c0-741c62b975e6") + ) + (fp_line + (start 69.37 -1.25) + (end 69.37 11.35) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "12d7a82e-b0c6-40b8-a78c-2d112ffab686") + ) + (fp_line + (start 69.37 11.35) + (end 61.62 11.35) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "665f55d3-1930-4c50-8ac6-a50812f0ebb7") + ) + (fp_line + (start -13.88 1.3) + (end 69.12 1.3) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "40e6edcf-2dca-4414-8c68-54b5cb516af0") + ) + (fp_line + (start -13.88 4.3) + (end -13.88 1.3) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "69e81b15-c24f-4180-a1e2-ddeb5ca6447d") + ) + (fp_line + (start -6.38 4.3) + (end -13.88 4.3) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "f4d1a664-c87b-4415-947e-80bf18cfb575") + ) + (fp_line + (start -6.38 11.1) + (end -6.38 4.3) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "e0811244-7b68-4fcc-9992-3c461271d12c") + ) + (fp_line + (start 61.62 4.3) + (end 61.62 11.1) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "1c90e511-a13d-4a19-bb0c-341a540211ff") + ) + (fp_line + (start 61.62 11.1) + (end -6.38 11.1) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "b8985526-ec53-47c3-9430-ddff43dd0717") + ) + (fp_line + (start 69.12 1.3) + (end 69.12 4.3) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "422ec1ee-934d-458a-a428-dae9f64f0e7c") + ) + (fp_line + (start 69.12 4.3) + (end 61.62 4.3) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "c32cd034-9d5f-4f99-a118-06e174e115a6") + ) + (fp_text user "${REFERENCE}" + (at 27.62 6.2 180) + (layer "F.Fab") + (uuid "2c2c1e88-d6ac-4cc4-8e09-80f372bca783") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" thru_hole rect + (at 0 0) + (size 2 2) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "6b54a4cf-1c47-48bd-9076-9d2c1ed1dc0b") + ) + (pad "2" thru_hole circle + (at 2.54 0) + (size 2 2) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "1b5d7c94-aaa1-488b-9352-7b5770314a42") + ) + (pad "3" thru_hole circle + (at 5.08 0) + (size 2 2) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "254b0c32-5f01-4308-b5dd-0a4bc380a715") + ) + (pad "4" thru_hole circle + (at 7.62 0) + (size 2 2) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "bc6a6a8f-3b8f-413f-88e7-4957bd99351b") + ) + (pad "5" thru_hole circle + (at 50.62 0) + (size 2 2) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "35698302-6de0-4184-aefe-e2cbdd76c272") + ) + (pad "6" thru_hole circle + (at 53.16 0) + (size 2 2) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "c86ea0ec-de68-4d29-839c-dfca7c7d64b3") + ) + (pad "7" thru_hole circle + (at 55.7 0) + (size 2 2) + (drill 1) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "5fc56d94-ca72-44e4-babd-0986bd43161c") + ) + (model "${KICAD6_3DMODEL_DIR}/Audio_Module.3dshapes/Reverb_BTDR-1V.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) +) \ No newline at end of file diff --git a/qa/data/pcbnew/prettifier/Samtec_HLE-133-02-xx-DV-PE-LC_2x33_P2.54mm_Horizontal.kicad_mod b/qa/data/pcbnew/prettifier/Samtec_HLE-133-02-xx-DV-PE-LC_2x33_P2.54mm_Horizontal.kicad_mod new file mode 100644 index 0000000000..e6a3190192 --- /dev/null +++ b/qa/data/pcbnew/prettifier/Samtec_HLE-133-02-xx-DV-PE-LC_2x33_P2.54mm_Horizontal.kicad_mod @@ -0,0 +1,459 @@ +(footprint "Samtec_HLE-133-02-xx-DV-PE-LC_2x33_P2.54mm_Horizontal" (version 20231007) (generator pcbnew) + (layer "F.Cu") + (descr "Samtec HLE .100\" Tiger Beam Cost-effective Single Beam Socket Strip, HLE-133-02-xx-DV-PE-LC, 33 Pins per row (http://suddendocs.samtec.com/prints/hle-1xx-02-xx-dv-xe-xx-mkt.pdf, http://suddendocs.samtec.com/prints/hle-thru.pdf), generated with kicad-footprint-generator") + (tags "connector Samtec HLE top entry") + (property "Reference" "REF**" (at 40.64 -1.86 0) (layer "F.SilkS") (tstamp d7d96772-e03a-4426-a0a8-985d2f05395c) + (effects (font (size 1 1) (thickness 0.15))) + ) + (property "Value" "Samtec_HLE-133-02-xx-DV-PE-LC_2x33_P2.54mm_Horizontal" (at 40.64 9.48 0) (layer "F.Fab") (tstamp 49601f37-d091-46da-baa9-d689daff8c35) + (effects (font (size 1 1) (thickness 0.15))) + ) + (property "Footprint" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp ff94169b-f250-42d4-930f-7219680349ee) + (effects (font (size 1.27 1.27))) + ) + (property "Datasheet" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp acd21faa-5721-4ade-85d5-942cb34c84ed) + (effects (font (size 1.27 1.27))) + ) + (property "Description" "" (at 0 0 0 unlocked) (layer "F.Fab") hide (tstamp 6148024c-f26b-4a66-bcac-2beade119a8f) + (effects (font (size 1.27 1.27))) + ) + (attr through_hole) + (fp_line (start -1.38 1.16) (end 82.66 1.16) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7c52bc78-22a8-4160-a603-33cc9d686e57)) + (fp_line (start -1.38 6.46) (end -1.38 1.16) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp fbef2b56-80f7-4605-99f5-a37b8da50187)) + (fp_line (start 82.66 1.16) (end 82.66 6.46) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp dd12b657-377e-4b89-bee8-e58271582db2)) + (fp_line (start 82.66 6.46) (end -1.38 6.46) + (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp fbd9cf3d-8f1f-459c-abb5-e3d3de1c39a3)) + (fp_line (start -1.77 -1.16) (end 83.05 -1.16) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 12290ceb-f967-4d28-9567-065b15276b3a)) + (fp_line (start -1.77 8.78) (end -1.77 -1.16) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp f82c492d-353a-47ba-9fd1-5c0b783ec3cb)) + (fp_line (start 83.05 -1.16) (end 83.05 8.78) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 3c1ab95e-f889-4fd4-863c-e1296f32e502)) + (fp_line (start 83.05 8.78) (end -1.77 8.78) + (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 54384746-dd3a-4635-857e-0377998f000e)) + (fp_line (start -1.27 1.27) (end 82.55 1.27) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 14bee1a7-a2f2-4279-a1bf-e9802a7f7909)) + (fp_line (start -1.27 6.35) (end -1.27 1.27) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 95ddeebf-9bab-407a-b5b9-6eb6a4364fc5)) + (fp_line (start -0.5 1.27) (end 0 1.977107) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp a000f61b-ed9a-436e-aa02-b24dd3a256e9)) + (fp_line (start 0 1.977107) (end 0.5 1.27) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 3554cb0a-6e1e-4950-9160-ff8ba06fda09)) + (fp_line (start 82.55 1.27) (end 82.55 6.35) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp cc5e1b5c-5b92-411e-a937-319a3cf22a06)) + (fp_line (start 82.55 6.35) (end -1.27 6.35) + (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 065f55ce-844c-4408-9024-73db5bc819b2)) + (fp_text user "${REFERENCE}" (at 40.64 5.65 0) (layer "F.Fab") (tstamp e5e30624-f8f1-4b8a-98e8-30f283a79f6d) + (effects (font (size 1 1) (thickness 0.15))) + ) + (pad "" np_thru_hole circle (at 0 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 8f16bc69-7845-49c0-88e9-d7c2e263e0c7) + ) + (pad "" np_thru_hole circle (at 0 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp d5042c78-66bd-404a-be0d-7f7fa9b05add) + ) + (pad "" np_thru_hole circle (at 1.27 3.81) (size 1.19 1.19) (drill 1.19) (layers "*.Cu" "*.Mask") + (tstamp afe9b455-c277-432a-84d8-ea417f498c0b) + ) + (pad "" np_thru_hole circle (at 2.54 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp bb1d5ee5-121e-4207-8709-3f80bd03f00e) + ) + (pad "" np_thru_hole circle (at 2.54 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp d88b3e8b-5e63-45e1-a81d-6d3d0c1f3620) + ) + (pad "" np_thru_hole circle (at 5.08 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 6f20b1ed-9b05-436c-8742-b48b3543e65a) + ) + (pad "" np_thru_hole circle (at 5.08 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 6321709d-d5dd-44bc-8336-016ddfddecf7) + ) + (pad "" np_thru_hole circle (at 7.62 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 296066e0-062b-4ac0-945d-6e66f97b36f6) + ) + (pad "" np_thru_hole circle (at 7.62 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 31b9876d-b6ea-44e2-aae9-b607534c1621) + ) + (pad "" np_thru_hole circle (at 10.16 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp cd21dd18-1295-47be-b86d-90db42597662) + ) + (pad "" np_thru_hole circle (at 10.16 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 2b639b25-69d0-4d30-b969-867f6d773dd5) + ) + (pad "" np_thru_hole circle (at 12.7 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp a80fa169-ac58-4655-8615-10acddacb88a) + ) + (pad "" np_thru_hole circle (at 12.7 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 9297ad19-a021-431e-b112-df6739784200) + ) + (pad "" np_thru_hole circle (at 15.24 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp ba2c4e03-466a-4ea3-a42a-d3cdd279e348) + ) + (pad "" np_thru_hole circle (at 15.24 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 43bea87a-eb6c-4819-b09e-fecc6a333344) + ) + (pad "" np_thru_hole circle (at 17.78 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 9808d94d-ec13-4ae8-93cd-50febc47747d) + ) + (pad "" np_thru_hole circle (at 17.78 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 5bba70ac-5b67-4a67-b3b0-bf3801d4d68a) + ) + (pad "" np_thru_hole circle (at 20.32 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 59757ede-45bd-4464-a0d3-47fe600311a7) + ) + (pad "" np_thru_hole circle (at 20.32 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 14c8ee3b-8b76-4b9f-b3a4-d318aefbe7ac) + ) + (pad "" np_thru_hole circle (at 22.86 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp dd72446b-c34d-480e-b8f6-ca347f075610) + ) + (pad "" np_thru_hole circle (at 22.86 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp e3201589-6a0d-4066-8df3-263da096020d) + ) + (pad "" np_thru_hole circle (at 25.4 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp c67b8aad-dbc5-4fcf-918e-cb7c31b08d6a) + ) + (pad "" np_thru_hole circle (at 25.4 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 34ca49ce-5601-4de2-99c4-b63dfd5022db) + ) + (pad "" np_thru_hole circle (at 27.94 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 7ac7a742-6b0d-4d9c-8800-1665c8ccef9d) + ) + (pad "" np_thru_hole circle (at 27.94 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp a031bed1-9fee-4bb6-b413-cc01734ec2d5) + ) + (pad "" np_thru_hole circle (at 30.48 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 50a2792a-4354-4554-ab66-6df638449c77) + ) + (pad "" np_thru_hole circle (at 30.48 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp bef71df3-6ec9-443a-b1e4-db0db1223402) + ) + (pad "" np_thru_hole circle (at 33.02 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 4f7cb693-9d03-430d-bba4-95971682c7ca) + ) + (pad "" np_thru_hole circle (at 33.02 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 8990046c-26cd-43be-b225-589180054b77) + ) + (pad "" np_thru_hole circle (at 35.56 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 1fa2347a-1391-4070-a3df-7c1f3da58db4) + ) + (pad "" np_thru_hole circle (at 35.56 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 8dc6af26-eb38-4834-bbb6-17ae16c19282) + ) + (pad "" np_thru_hole circle (at 38.1 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp dad259c0-d67f-4b90-8a05-c51f7eba2251) + ) + (pad "" np_thru_hole circle (at 38.1 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp c766b845-282f-4b7b-9acb-d6510994724f) + ) + (pad "" np_thru_hole circle (at 40.64 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 133cff93-d897-4ef2-a02d-ef4db90a5ef1) + ) + (pad "" np_thru_hole circle (at 40.64 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp bc05f5f6-bfff-4fb2-ba92-80d19028c8bc) + ) + (pad "" np_thru_hole circle (at 43.18 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp f80160ce-cb2a-454a-adc5-7816abaa9108) + ) + (pad "" np_thru_hole circle (at 43.18 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 0fbf22c8-ec1f-4482-9674-0257dd15a5e0) + ) + (pad "" np_thru_hole circle (at 45.72 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp aeb9ab33-9f38-4848-912f-c3ee3f1ffa1c) + ) + (pad "" np_thru_hole circle (at 45.72 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp cf373623-2971-4096-a381-a6509dd4bc7f) + ) + (pad "" np_thru_hole circle (at 48.26 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp daabd1db-aff2-4ec5-a3a5-81960ceeb397) + ) + (pad "" np_thru_hole circle (at 48.26 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp c55b878d-f23d-4193-8c81-c1245f24c824) + ) + (pad "" np_thru_hole circle (at 50.8 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp aa865054-8d40-4751-8325-0d42cdb03dbe) + ) + (pad "" np_thru_hole circle (at 50.8 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 34c859e3-5398-4108-a80e-343896292e92) + ) + (pad "" np_thru_hole circle (at 53.34 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 2f847875-79bd-4c89-844a-cdb66b8ff290) + ) + (pad "" np_thru_hole circle (at 53.34 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 2c424d71-1f4a-445c-a1a0-d00037fa2bad) + ) + (pad "" np_thru_hole circle (at 55.88 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp ac96b551-2930-4655-8dec-1e6211fa854d) + ) + (pad "" np_thru_hole circle (at 55.88 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 967327f1-ae84-47a8-bdfc-e8927af9e06d) + ) + (pad "" np_thru_hole circle (at 58.42 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp c813aa2e-9df4-43ac-8f42-3a579310ccd1) + ) + (pad "" np_thru_hole circle (at 58.42 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 1b7f66e0-3db9-48a7-af48-b304fb572015) + ) + (pad "" np_thru_hole circle (at 60.96 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp a16842ee-545a-4260-b242-896eb09f9536) + ) + (pad "" np_thru_hole circle (at 60.96 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp a8bf5f7f-19f0-4b93-ae9d-7bb67945db2b) + ) + (pad "" np_thru_hole circle (at 63.5 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 0d96cc9d-bc64-4e7e-8986-c22215d8ebb9) + ) + (pad "" np_thru_hole circle (at 63.5 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 224ebe9d-5bd1-4bfa-bcb7-f4d52cfe96f6) + ) + (pad "" np_thru_hole circle (at 66.04 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp ba7f5023-b307-4cbf-974b-e1261c8da38b) + ) + (pad "" np_thru_hole circle (at 66.04 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp e3429a31-5b89-4a55-b6ff-1bed45701683) + ) + (pad "" np_thru_hole circle (at 68.58 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 11759f81-e03f-40ae-afb9-bc2e0ed0834d) + ) + (pad "" np_thru_hole circle (at 68.58 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 19e19364-6dc7-4f25-8fe9-add9e652c494) + ) + (pad "" np_thru_hole circle (at 71.12 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 6011d677-5074-4b9f-830a-d6a51f84b5db) + ) + (pad "" np_thru_hole circle (at 71.12 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 354270ad-a714-487b-ad47-49db09e3b026) + ) + (pad "" np_thru_hole circle (at 73.66 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 0d7c6bc2-e2fb-4733-8969-438c5e923c9d) + ) + (pad "" np_thru_hole circle (at 73.66 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 6b37256e-9923-42ad-a47c-08daef08b341) + ) + (pad "" np_thru_hole circle (at 76.2 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp a522f41e-5f7a-4bb1-9ab9-c1ce30e48132) + ) + (pad "" np_thru_hole circle (at 76.2 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp f49577f8-e6eb-4dd7-ad28-2e8b5a3c67e5) + ) + (pad "" np_thru_hole circle (at 78.74 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp dfd0d2c0-0c92-46c1-9c37-945111e1dbf6) + ) + (pad "" np_thru_hole circle (at 78.74 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 9cd36a56-e7fe-4314-9b0c-41f789aae5bc) + ) + (pad "" np_thru_hole circle (at 80.01 3.81) (size 1.19 1.19) (drill 1.19) (layers "*.Cu" "*.Mask") + (tstamp 533817fa-41cd-44f4-9f2d-4dc00136c466) + ) + (pad "" np_thru_hole circle (at 81.28 2.54) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 7e81ff61-e3bd-422a-aa1b-03c38a1d40fe) + ) + (pad "" np_thru_hole circle (at 81.28 5.08) (size 1.4 1.4) (drill 1.4) (layers "*.Cu" "*.Mask") + (tstamp 73107856-1c13-4696-aa6e-2294bb4379e4) + ) + (pad "1" thru_hole roundrect (at 0 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") (roundrect_rratio 0.19084) + (tstamp eb905d9b-fb23-417e-aed1-5e77d65a8f0a) + ) + (pad "2" thru_hole circle (at 0 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp a8783e7c-fbdd-458b-ac0f-55a43947e706) + ) + (pad "3" thru_hole circle (at 2.54 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp d3bcec23-1169-4547-a92d-fe13b7038017) + ) + (pad "4" thru_hole circle (at 2.54 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 86912d70-ff38-40c6-bd6e-96ddb80e8ebf) + ) + (pad "5" thru_hole circle (at 5.08 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 7debb537-09ec-473d-a3a6-87595821e326) + ) + (pad "6" thru_hole circle (at 5.08 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 11266bac-2d64-4bda-8a4e-190a5f23e934) + ) + (pad "7" thru_hole circle (at 7.62 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 4ba10efc-419f-4c6f-bd53-7211c19fb882) + ) + (pad "8" thru_hole circle (at 7.62 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp fffb81dd-f81f-4466-866d-74737568d8c8) + ) + (pad "9" thru_hole circle (at 10.16 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp cbb84cfa-afee-46dd-9cf0-2f6225968284) + ) + (pad "10" thru_hole circle (at 10.16 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 9f990f67-b097-4a20-8060-6190da035240) + ) + (pad "11" thru_hole circle (at 12.7 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 4798d74b-24e7-437d-868c-12d2da2c4bf8) + ) + (pad "12" thru_hole circle (at 12.7 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 0d5bc052-c507-4b41-9875-83aa97581dc6) + ) + (pad "13" thru_hole circle (at 15.24 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp a8218fa1-cfe3-44e4-8d58-4b14445a2213) + ) + (pad "14" thru_hole circle (at 15.24 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp cf1bf178-839d-4c1e-a104-d1d7a3406f23) + ) + (pad "15" thru_hole circle (at 17.78 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp dbdf99b3-6e39-4792-aa64-192a0e6fe497) + ) + (pad "16" thru_hole circle (at 17.78 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 98532ba0-346e-4475-ab07-50c04a090b3b) + ) + (pad "17" thru_hole circle (at 20.32 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 2cc1974f-34a9-4967-8d50-d2a9c1d92145) + ) + (pad "18" thru_hole circle (at 20.32 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 64d472bd-bc46-4958-9853-ecb2eb82bf42) + ) + (pad "19" thru_hole circle (at 22.86 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 273647c2-b84e-4567-8e45-28a07ea63e52) + ) + (pad "20" thru_hole circle (at 22.86 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 3923c84d-6735-4282-9f6c-0b0b997468b2) + ) + (pad "21" thru_hole circle (at 25.4 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp f36a27ef-5d16-444c-b350-b9492737c564) + ) + (pad "22" thru_hole circle (at 25.4 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp f3746ab3-2b45-499f-872a-403dbef0f687) + ) + (pad "23" thru_hole circle (at 27.94 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 52d08f1e-a367-4689-85f6-ea7b6fd80d40) + ) + (pad "24" thru_hole circle (at 27.94 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 84a85a9c-f421-44c4-ab6b-f2489af764d9) + ) + (pad "25" thru_hole circle (at 30.48 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp e0e7bac2-a62b-4536-822d-5d01b414350b) + ) + (pad "26" thru_hole circle (at 30.48 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp deb0aa25-cb90-425a-be8a-608541affcc6) + ) + (pad "27" thru_hole circle (at 33.02 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 3bddffb9-73d5-440d-a509-1f351d64db51) + ) + (pad "28" thru_hole circle (at 33.02 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp b20fd0a3-3dac-47f1-842b-9a26faa7d0b2) + ) + (pad "29" thru_hole circle (at 35.56 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 2622f88e-12e2-4b21-b5a3-9ed1b4ffab6f) + ) + (pad "30" thru_hole circle (at 35.56 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 6fec8402-de11-4446-b3f5-ec6f0f743514) + ) + (pad "31" thru_hole circle (at 38.1 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp cb2d7fbb-d78e-4ed9-9f49-3811197dca46) + ) + (pad "32" thru_hole circle (at 38.1 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp e9fc89a7-6eb1-441c-836f-8b8c7c6f0c1e) + ) + (pad "33" thru_hole circle (at 40.64 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp e6b99459-642c-49a5-b36a-e5d52d3ac9b8) + ) + (pad "34" thru_hole circle (at 40.64 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 83a82a75-b42b-4db7-a29a-ec47be89a6f9) + ) + (pad "35" thru_hole circle (at 43.18 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 49e1aeac-00a3-4eb6-bceb-85ec76d2a3ec) + ) + (pad "36" thru_hole circle (at 43.18 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 741643bf-ad6d-4153-8ef4-b975e915fc09) + ) + (pad "37" thru_hole circle (at 45.72 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 2fca8d4e-8855-4758-add0-d8a7f0b26d50) + ) + (pad "38" thru_hole circle (at 45.72 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp cebb3f2b-6ebf-4c26-a020-6367fee52480) + ) + (pad "39" thru_hole circle (at 48.26 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp cc48fa87-f248-4387-bb2d-2ab04371f595) + ) + (pad "40" thru_hole circle (at 48.26 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp dadbcb8f-536c-4805-8d07-d6221e24e317) + ) + (pad "41" thru_hole circle (at 50.8 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp d2a654eb-1ab9-4b7e-80ed-1784a54ffbe1) + ) + (pad "42" thru_hole circle (at 50.8 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 4ca9961b-c1d2-49c9-a2ec-efa362b9ce5c) + ) + (pad "43" thru_hole circle (at 53.34 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp eaaacd5a-73b9-4c11-a363-375329e539ba) + ) + (pad "44" thru_hole circle (at 53.34 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp cbb5eaf3-5bae-4a39-ab5d-d249f37b45ae) + ) + (pad "45" thru_hole circle (at 55.88 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 44d1ad55-c706-420b-b385-672ccdc51c38) + ) + (pad "46" thru_hole circle (at 55.88 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 828c5215-437d-45c0-a046-cad5a64a4b31) + ) + (pad "47" thru_hole circle (at 58.42 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 603d3811-4c3f-41f8-966e-a50a5ddb9b4c) + ) + (pad "48" thru_hole circle (at 58.42 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 25ff1673-d9d2-4399-829d-1ecb1cb69e82) + ) + (pad "49" thru_hole circle (at 60.96 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 24da4615-cb69-46de-abab-7f0f9ef08181) + ) + (pad "50" thru_hole circle (at 60.96 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 109823aa-8839-4313-9c11-aded6fb82440) + ) + (pad "51" thru_hole circle (at 63.5 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp ba799056-ddcb-4b87-b1df-3ebe638b804a) + ) + (pad "52" thru_hole circle (at 63.5 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp b327cb51-6b79-488f-8159-b66b9e0cb07a) + ) + (pad "53" thru_hole circle (at 66.04 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp b6c1e9bf-2b18-454f-915c-22b25985fcfc) + ) + (pad "54" thru_hole circle (at 66.04 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 1a392732-5bce-4038-914d-478dd68d82b7) + ) + (pad "55" thru_hole circle (at 68.58 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 6557e87a-934e-4195-a150-ec48a5ec8cb8) + ) + (pad "56" thru_hole circle (at 68.58 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp f28bb049-1af4-4001-97df-44fdc3dc5506) + ) + (pad "57" thru_hole circle (at 71.12 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 721130f8-4af1-4c16-9727-4d700bcccdb6) + ) + (pad "58" thru_hole circle (at 71.12 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 6299857f-ec44-4502-af24-07a9d1f48e78) + ) + (pad "59" thru_hole circle (at 73.66 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp dfd398b7-ea21-4f59-8bf6-0acb12f6079a) + ) + (pad "60" thru_hole circle (at 73.66 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 10a92803-d161-41aa-82ac-0f14dd5fafbb) + ) + (pad "61" thru_hole circle (at 76.2 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 6b272580-3134-4c41-9f0b-315497112a3e) + ) + (pad "62" thru_hole circle (at 76.2 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 92b5e425-082b-4278-84ce-18c74f78d407) + ) + (pad "63" thru_hole circle (at 78.74 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 6cc1f4ac-970f-4ae4-b4a1-e0a88eb3246c) + ) + (pad "64" thru_hole circle (at 78.74 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp 5c072520-7c05-4fc4-87b6-0871c0cae2e0) + ) + (pad "65" thru_hole circle (at 81.28 0) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp e5a40f41-921f-40a5-804f-48fb8e6f7bd4) + ) + (pad "66" thru_hole circle (at 81.28 7.62) (size 1.31 1.31) (drill 0.71) (layers "*.Cu" "*.Mask") + (tstamp e4bfc510-e523-44f8-a3a3-25f0724b565c) + ) + (model "${KICAD6_3DMODEL_DIR}/Connector_Samtec_HLE_THT.3dshapes/Samtec_HLE-133-02-xx-DV-PE-LC_2x33_P2.54mm_Horizontal.wrl" + (offset (xyz 0 0 0)) + (scale (xyz 1 1 1)) + (rotate (xyz 0 0 0)) + ) +) \ No newline at end of file diff --git a/qa/data/pcbnew/prettifier/Samtec_HLE-133-02-xx-DV-PE-LC_2x33_P2.54mm_Horizontal_formatted.kicad_mod b/qa/data/pcbnew/prettifier/Samtec_HLE-133-02-xx-DV-PE-LC_2x33_P2.54mm_Horizontal_formatted.kicad_mod new file mode 100644 index 0000000000..10fde80339 --- /dev/null +++ b/qa/data/pcbnew/prettifier/Samtec_HLE-133-02-xx-DV-PE-LC_2x33_P2.54mm_Horizontal_formatted.kicad_mod @@ -0,0 +1,1233 @@ +(footprint "Samtec_HLE-133-02-xx-DV-PE-LC_2x33_P2.54mm_Horizontal" + (version 20231014) + (generator pcbnew) + (layer "F.Cu") + (descr "Samtec HLE .100\" Tiger Beam Cost-effective Single Beam Socket Strip, HLE-133-02-xx-DV-PE-LC, 33 Pins per row (http://suddendocs.samtec.com/prints/hle-1xx-02-xx-dv-xe-xx-mkt.pdf, http://suddendocs.samtec.com/prints/hle-thru.pdf), generated with kicad-footprint-generator") + (tags "connector Samtec HLE top entry") + (property "Reference" "REF**" + (at 40.64 -1.86 0) + (layer "F.SilkS") + (uuid "d7d96772-e03a-4426-a0a8-985d2f05395c") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "Samtec_HLE-133-02-xx-DV-PE-LC_2x33_P2.54mm_Horizontal" + (at 40.64 9.48 0) + (layer "F.Fab") + (uuid "49601f37-d091-46da-baa9-d689daff8c35") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "ff94169b-f250-42d4-930f-7219680349ee") + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "acd21faa-5721-4ade-85d5-942cb34c84ed") + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (unlocked yes) + (layer "F.Fab") + (hide yes) + (uuid "6148024c-f26b-4a66-bcac-2beade119a8f") + (effects + (font + (size 1.27 1.27) + ) + ) + ) + (attr through_hole) + (fp_line + (start -1.38 1.16) + (end 82.66 1.16) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "7c52bc78-22a8-4160-a603-33cc9d686e57") + ) + (fp_line + (start -1.38 6.46) + (end -1.38 1.16) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "fbef2b56-80f7-4605-99f5-a37b8da50187") + ) + (fp_line + (start 82.66 1.16) + (end 82.66 6.46) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "dd12b657-377e-4b89-bee8-e58271582db2") + ) + (fp_line + (start 82.66 6.46) + (end -1.38 6.46) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "fbd9cf3d-8f1f-459c-abb5-e3d3de1c39a3") + ) + (fp_line + (start -1.77 -1.16) + (end 83.05 -1.16) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "12290ceb-f967-4d28-9567-065b15276b3a") + ) + (fp_line + (start -1.77 8.78) + (end -1.77 -1.16) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "f82c492d-353a-47ba-9fd1-5c0b783ec3cb") + ) + (fp_line + (start 83.05 -1.16) + (end 83.05 8.78) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "3c1ab95e-f889-4fd4-863c-e1296f32e502") + ) + (fp_line + (start 83.05 8.78) + (end -1.77 8.78) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "54384746-dd3a-4635-857e-0377998f000e") + ) + (fp_line + (start -1.27 1.27) + (end 82.55 1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "14bee1a7-a2f2-4279-a1bf-e9802a7f7909") + ) + (fp_line + (start -1.27 6.35) + (end -1.27 1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "95ddeebf-9bab-407a-b5b9-6eb6a4364fc5") + ) + (fp_line + (start -0.5 1.27) + (end 0 1.977107) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "a000f61b-ed9a-436e-aa02-b24dd3a256e9") + ) + (fp_line + (start 0 1.977107) + (end 0.5 1.27) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "3554cb0a-6e1e-4950-9160-ff8ba06fda09") + ) + (fp_line + (start 82.55 1.27) + (end 82.55 6.35) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "cc5e1b5c-5b92-411e-a937-319a3cf22a06") + ) + (fp_line + (start 82.55 6.35) + (end -1.27 6.35) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "065f55ce-844c-4408-9024-73db5bc819b2") + ) + (fp_text user "${REFERENCE}" + (at 40.64 5.65 0) + (layer "F.Fab") + (uuid "e5e30624-f8f1-4b8a-98e8-30f283a79f6d") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "" np_thru_hole circle + (at 0 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "8f16bc69-7845-49c0-88e9-d7c2e263e0c7") + ) + (pad "" np_thru_hole circle + (at 0 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "d5042c78-66bd-404a-be0d-7f7fa9b05add") + ) + (pad "" np_thru_hole circle + (at 1.27 3.81) + (size 1.19 1.19) + (drill 1.19) + (layers "*.Cu" "*.Mask") + (uuid "afe9b455-c277-432a-84d8-ea417f498c0b") + ) + (pad "" np_thru_hole circle + (at 2.54 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "bb1d5ee5-121e-4207-8709-3f80bd03f00e") + ) + (pad "" np_thru_hole circle + (at 2.54 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "d88b3e8b-5e63-45e1-a81d-6d3d0c1f3620") + ) + (pad "" np_thru_hole circle + (at 5.08 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "6f20b1ed-9b05-436c-8742-b48b3543e65a") + ) + (pad "" np_thru_hole circle + (at 5.08 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "6321709d-d5dd-44bc-8336-016ddfddecf7") + ) + (pad "" np_thru_hole circle + (at 7.62 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "296066e0-062b-4ac0-945d-6e66f97b36f6") + ) + (pad "" np_thru_hole circle + (at 7.62 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "31b9876d-b6ea-44e2-aae9-b607534c1621") + ) + (pad "" np_thru_hole circle + (at 10.16 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "cd21dd18-1295-47be-b86d-90db42597662") + ) + (pad "" np_thru_hole circle + (at 10.16 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "2b639b25-69d0-4d30-b969-867f6d773dd5") + ) + (pad "" np_thru_hole circle + (at 12.7 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "a80fa169-ac58-4655-8615-10acddacb88a") + ) + (pad "" np_thru_hole circle + (at 12.7 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "9297ad19-a021-431e-b112-df6739784200") + ) + (pad "" np_thru_hole circle + (at 15.24 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "ba2c4e03-466a-4ea3-a42a-d3cdd279e348") + ) + (pad "" np_thru_hole circle + (at 15.24 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "43bea87a-eb6c-4819-b09e-fecc6a333344") + ) + (pad "" np_thru_hole circle + (at 17.78 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "9808d94d-ec13-4ae8-93cd-50febc47747d") + ) + (pad "" np_thru_hole circle + (at 17.78 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "5bba70ac-5b67-4a67-b3b0-bf3801d4d68a") + ) + (pad "" np_thru_hole circle + (at 20.32 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "59757ede-45bd-4464-a0d3-47fe600311a7") + ) + (pad "" np_thru_hole circle + (at 20.32 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "14c8ee3b-8b76-4b9f-b3a4-d318aefbe7ac") + ) + (pad "" np_thru_hole circle + (at 22.86 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "dd72446b-c34d-480e-b8f6-ca347f075610") + ) + (pad "" np_thru_hole circle + (at 22.86 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "e3201589-6a0d-4066-8df3-263da096020d") + ) + (pad "" np_thru_hole circle + (at 25.4 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "c67b8aad-dbc5-4fcf-918e-cb7c31b08d6a") + ) + (pad "" np_thru_hole circle + (at 25.4 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "34ca49ce-5601-4de2-99c4-b63dfd5022db") + ) + (pad "" np_thru_hole circle + (at 27.94 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "7ac7a742-6b0d-4d9c-8800-1665c8ccef9d") + ) + (pad "" np_thru_hole circle + (at 27.94 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "a031bed1-9fee-4bb6-b413-cc01734ec2d5") + ) + (pad "" np_thru_hole circle + (at 30.48 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "50a2792a-4354-4554-ab66-6df638449c77") + ) + (pad "" np_thru_hole circle + (at 30.48 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "bef71df3-6ec9-443a-b1e4-db0db1223402") + ) + (pad "" np_thru_hole circle + (at 33.02 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "4f7cb693-9d03-430d-bba4-95971682c7ca") + ) + (pad "" np_thru_hole circle + (at 33.02 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "8990046c-26cd-43be-b225-589180054b77") + ) + (pad "" np_thru_hole circle + (at 35.56 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "1fa2347a-1391-4070-a3df-7c1f3da58db4") + ) + (pad "" np_thru_hole circle + (at 35.56 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "8dc6af26-eb38-4834-bbb6-17ae16c19282") + ) + (pad "" np_thru_hole circle + (at 38.1 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "dad259c0-d67f-4b90-8a05-c51f7eba2251") + ) + (pad "" np_thru_hole circle + (at 38.1 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "c766b845-282f-4b7b-9acb-d6510994724f") + ) + (pad "" np_thru_hole circle + (at 40.64 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "133cff93-d897-4ef2-a02d-ef4db90a5ef1") + ) + (pad "" np_thru_hole circle + (at 40.64 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "bc05f5f6-bfff-4fb2-ba92-80d19028c8bc") + ) + (pad "" np_thru_hole circle + (at 43.18 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "f80160ce-cb2a-454a-adc5-7816abaa9108") + ) + (pad "" np_thru_hole circle + (at 43.18 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "0fbf22c8-ec1f-4482-9674-0257dd15a5e0") + ) + (pad "" np_thru_hole circle + (at 45.72 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "aeb9ab33-9f38-4848-912f-c3ee3f1ffa1c") + ) + (pad "" np_thru_hole circle + (at 45.72 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "cf373623-2971-4096-a381-a6509dd4bc7f") + ) + (pad "" np_thru_hole circle + (at 48.26 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "daabd1db-aff2-4ec5-a3a5-81960ceeb397") + ) + (pad "" np_thru_hole circle + (at 48.26 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "c55b878d-f23d-4193-8c81-c1245f24c824") + ) + (pad "" np_thru_hole circle + (at 50.8 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "aa865054-8d40-4751-8325-0d42cdb03dbe") + ) + (pad "" np_thru_hole circle + (at 50.8 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "34c859e3-5398-4108-a80e-343896292e92") + ) + (pad "" np_thru_hole circle + (at 53.34 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "2f847875-79bd-4c89-844a-cdb66b8ff290") + ) + (pad "" np_thru_hole circle + (at 53.34 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "2c424d71-1f4a-445c-a1a0-d00037fa2bad") + ) + (pad "" np_thru_hole circle + (at 55.88 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "ac96b551-2930-4655-8dec-1e6211fa854d") + ) + (pad "" np_thru_hole circle + (at 55.88 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "967327f1-ae84-47a8-bdfc-e8927af9e06d") + ) + (pad "" np_thru_hole circle + (at 58.42 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "c813aa2e-9df4-43ac-8f42-3a579310ccd1") + ) + (pad "" np_thru_hole circle + (at 58.42 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "1b7f66e0-3db9-48a7-af48-b304fb572015") + ) + (pad "" np_thru_hole circle + (at 60.96 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "a16842ee-545a-4260-b242-896eb09f9536") + ) + (pad "" np_thru_hole circle + (at 60.96 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "a8bf5f7f-19f0-4b93-ae9d-7bb67945db2b") + ) + (pad "" np_thru_hole circle + (at 63.5 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "0d96cc9d-bc64-4e7e-8986-c22215d8ebb9") + ) + (pad "" np_thru_hole circle + (at 63.5 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "224ebe9d-5bd1-4bfa-bcb7-f4d52cfe96f6") + ) + (pad "" np_thru_hole circle + (at 66.04 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "ba7f5023-b307-4cbf-974b-e1261c8da38b") + ) + (pad "" np_thru_hole circle + (at 66.04 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "e3429a31-5b89-4a55-b6ff-1bed45701683") + ) + (pad "" np_thru_hole circle + (at 68.58 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "11759f81-e03f-40ae-afb9-bc2e0ed0834d") + ) + (pad "" np_thru_hole circle + (at 68.58 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "19e19364-6dc7-4f25-8fe9-add9e652c494") + ) + (pad "" np_thru_hole circle + (at 71.12 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "6011d677-5074-4b9f-830a-d6a51f84b5db") + ) + (pad "" np_thru_hole circle + (at 71.12 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "354270ad-a714-487b-ad47-49db09e3b026") + ) + (pad "" np_thru_hole circle + (at 73.66 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "0d7c6bc2-e2fb-4733-8969-438c5e923c9d") + ) + (pad "" np_thru_hole circle + (at 73.66 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "6b37256e-9923-42ad-a47c-08daef08b341") + ) + (pad "" np_thru_hole circle + (at 76.2 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "a522f41e-5f7a-4bb1-9ab9-c1ce30e48132") + ) + (pad "" np_thru_hole circle + (at 76.2 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "f49577f8-e6eb-4dd7-ad28-2e8b5a3c67e5") + ) + (pad "" np_thru_hole circle + (at 78.74 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "dfd0d2c0-0c92-46c1-9c37-945111e1dbf6") + ) + (pad "" np_thru_hole circle + (at 78.74 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "9cd36a56-e7fe-4314-9b0c-41f789aae5bc") + ) + (pad "" np_thru_hole circle + (at 80.01 3.81) + (size 1.19 1.19) + (drill 1.19) + (layers "*.Cu" "*.Mask") + (uuid "533817fa-41cd-44f4-9f2d-4dc00136c466") + ) + (pad "" np_thru_hole circle + (at 81.28 2.54) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "7e81ff61-e3bd-422a-aa1b-03c38a1d40fe") + ) + (pad "" np_thru_hole circle + (at 81.28 5.08) + (size 1.4 1.4) + (drill 1.4) + (layers "*.Cu" "*.Mask") + (uuid "73107856-1c13-4696-aa6e-2294bb4379e4") + ) + (pad "1" thru_hole roundrect + (at 0 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (roundrect_rratio 0.19084) + (uuid "eb905d9b-fb23-417e-aed1-5e77d65a8f0a") + ) + (pad "2" thru_hole circle + (at 0 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "a8783e7c-fbdd-458b-ac0f-55a43947e706") + ) + (pad "3" thru_hole circle + (at 2.54 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "d3bcec23-1169-4547-a92d-fe13b7038017") + ) + (pad "4" thru_hole circle + (at 2.54 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "86912d70-ff38-40c6-bd6e-96ddb80e8ebf") + ) + (pad "5" thru_hole circle + (at 5.08 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "7debb537-09ec-473d-a3a6-87595821e326") + ) + (pad "6" thru_hole circle + (at 5.08 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "11266bac-2d64-4bda-8a4e-190a5f23e934") + ) + (pad "7" thru_hole circle + (at 7.62 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "4ba10efc-419f-4c6f-bd53-7211c19fb882") + ) + (pad "8" thru_hole circle + (at 7.62 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "fffb81dd-f81f-4466-866d-74737568d8c8") + ) + (pad "9" thru_hole circle + (at 10.16 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "cbb84cfa-afee-46dd-9cf0-2f6225968284") + ) + (pad "10" thru_hole circle + (at 10.16 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "9f990f67-b097-4a20-8060-6190da035240") + ) + (pad "11" thru_hole circle + (at 12.7 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "4798d74b-24e7-437d-868c-12d2da2c4bf8") + ) + (pad "12" thru_hole circle + (at 12.7 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "0d5bc052-c507-4b41-9875-83aa97581dc6") + ) + (pad "13" thru_hole circle + (at 15.24 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "a8218fa1-cfe3-44e4-8d58-4b14445a2213") + ) + (pad "14" thru_hole circle + (at 15.24 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "cf1bf178-839d-4c1e-a104-d1d7a3406f23") + ) + (pad "15" thru_hole circle + (at 17.78 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "dbdf99b3-6e39-4792-aa64-192a0e6fe497") + ) + (pad "16" thru_hole circle + (at 17.78 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "98532ba0-346e-4475-ab07-50c04a090b3b") + ) + (pad "17" thru_hole circle + (at 20.32 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "2cc1974f-34a9-4967-8d50-d2a9c1d92145") + ) + (pad "18" thru_hole circle + (at 20.32 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "64d472bd-bc46-4958-9853-ecb2eb82bf42") + ) + (pad "19" thru_hole circle + (at 22.86 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "273647c2-b84e-4567-8e45-28a07ea63e52") + ) + (pad "20" thru_hole circle + (at 22.86 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "3923c84d-6735-4282-9f6c-0b0b997468b2") + ) + (pad "21" thru_hole circle + (at 25.4 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "f36a27ef-5d16-444c-b350-b9492737c564") + ) + (pad "22" thru_hole circle + (at 25.4 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "f3746ab3-2b45-499f-872a-403dbef0f687") + ) + (pad "23" thru_hole circle + (at 27.94 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "52d08f1e-a367-4689-85f6-ea7b6fd80d40") + ) + (pad "24" thru_hole circle + (at 27.94 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "84a85a9c-f421-44c4-ab6b-f2489af764d9") + ) + (pad "25" thru_hole circle + (at 30.48 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "e0e7bac2-a62b-4536-822d-5d01b414350b") + ) + (pad "26" thru_hole circle + (at 30.48 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "deb0aa25-cb90-425a-be8a-608541affcc6") + ) + (pad "27" thru_hole circle + (at 33.02 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "3bddffb9-73d5-440d-a509-1f351d64db51") + ) + (pad "28" thru_hole circle + (at 33.02 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "b20fd0a3-3dac-47f1-842b-9a26faa7d0b2") + ) + (pad "29" thru_hole circle + (at 35.56 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "2622f88e-12e2-4b21-b5a3-9ed1b4ffab6f") + ) + (pad "30" thru_hole circle + (at 35.56 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "6fec8402-de11-4446-b3f5-ec6f0f743514") + ) + (pad "31" thru_hole circle + (at 38.1 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "cb2d7fbb-d78e-4ed9-9f49-3811197dca46") + ) + (pad "32" thru_hole circle + (at 38.1 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "e9fc89a7-6eb1-441c-836f-8b8c7c6f0c1e") + ) + (pad "33" thru_hole circle + (at 40.64 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "e6b99459-642c-49a5-b36a-e5d52d3ac9b8") + ) + (pad "34" thru_hole circle + (at 40.64 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "83a82a75-b42b-4db7-a29a-ec47be89a6f9") + ) + (pad "35" thru_hole circle + (at 43.18 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "49e1aeac-00a3-4eb6-bceb-85ec76d2a3ec") + ) + (pad "36" thru_hole circle + (at 43.18 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "741643bf-ad6d-4153-8ef4-b975e915fc09") + ) + (pad "37" thru_hole circle + (at 45.72 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "2fca8d4e-8855-4758-add0-d8a7f0b26d50") + ) + (pad "38" thru_hole circle + (at 45.72 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "cebb3f2b-6ebf-4c26-a020-6367fee52480") + ) + (pad "39" thru_hole circle + (at 48.26 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "cc48fa87-f248-4387-bb2d-2ab04371f595") + ) + (pad "40" thru_hole circle + (at 48.26 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "dadbcb8f-536c-4805-8d07-d6221e24e317") + ) + (pad "41" thru_hole circle + (at 50.8 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "d2a654eb-1ab9-4b7e-80ed-1784a54ffbe1") + ) + (pad "42" thru_hole circle + (at 50.8 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "4ca9961b-c1d2-49c9-a2ec-efa362b9ce5c") + ) + (pad "43" thru_hole circle + (at 53.34 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "eaaacd5a-73b9-4c11-a363-375329e539ba") + ) + (pad "44" thru_hole circle + (at 53.34 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "cbb5eaf3-5bae-4a39-ab5d-d249f37b45ae") + ) + (pad "45" thru_hole circle + (at 55.88 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "44d1ad55-c706-420b-b385-672ccdc51c38") + ) + (pad "46" thru_hole circle + (at 55.88 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "828c5215-437d-45c0-a046-cad5a64a4b31") + ) + (pad "47" thru_hole circle + (at 58.42 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "603d3811-4c3f-41f8-966e-a50a5ddb9b4c") + ) + (pad "48" thru_hole circle + (at 58.42 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "25ff1673-d9d2-4399-829d-1ecb1cb69e82") + ) + (pad "49" thru_hole circle + (at 60.96 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "24da4615-cb69-46de-abab-7f0f9ef08181") + ) + (pad "50" thru_hole circle + (at 60.96 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "109823aa-8839-4313-9c11-aded6fb82440") + ) + (pad "51" thru_hole circle + (at 63.5 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "ba799056-ddcb-4b87-b1df-3ebe638b804a") + ) + (pad "52" thru_hole circle + (at 63.5 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "b327cb51-6b79-488f-8159-b66b9e0cb07a") + ) + (pad "53" thru_hole circle + (at 66.04 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "b6c1e9bf-2b18-454f-915c-22b25985fcfc") + ) + (pad "54" thru_hole circle + (at 66.04 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "1a392732-5bce-4038-914d-478dd68d82b7") + ) + (pad "55" thru_hole circle + (at 68.58 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "6557e87a-934e-4195-a150-ec48a5ec8cb8") + ) + (pad "56" thru_hole circle + (at 68.58 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "f28bb049-1af4-4001-97df-44fdc3dc5506") + ) + (pad "57" thru_hole circle + (at 71.12 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "721130f8-4af1-4c16-9727-4d700bcccdb6") + ) + (pad "58" thru_hole circle + (at 71.12 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "6299857f-ec44-4502-af24-07a9d1f48e78") + ) + (pad "59" thru_hole circle + (at 73.66 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "dfd398b7-ea21-4f59-8bf6-0acb12f6079a") + ) + (pad "60" thru_hole circle + (at 73.66 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "10a92803-d161-41aa-82ac-0f14dd5fafbb") + ) + (pad "61" thru_hole circle + (at 76.2 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "6b272580-3134-4c41-9f0b-315497112a3e") + ) + (pad "62" thru_hole circle + (at 76.2 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "92b5e425-082b-4278-84ce-18c74f78d407") + ) + (pad "63" thru_hole circle + (at 78.74 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "6cc1f4ac-970f-4ae4-b4a1-e0a88eb3246c") + ) + (pad "64" thru_hole circle + (at 78.74 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "5c072520-7c05-4fc4-87b6-0871c0cae2e0") + ) + (pad "65" thru_hole circle + (at 81.28 0) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "e5a40f41-921f-40a5-804f-48fb8e6f7bd4") + ) + (pad "66" thru_hole circle + (at 81.28 7.62) + (size 1.31 1.31) + (drill 0.71) + (layers "*.Cu" "*.Mask") + (remove_unused_layers no) + (uuid "e4bfc510-e523-44f8-a3a3-25f0724b565c") + ) + (model "${KICAD6_3DMODEL_DIR}/Connector_Samtec_HLE_THT.3dshapes/Samtec_HLE-133-02-xx-DV-PE-LC_2x33_P2.54mm_Horizontal.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) +) \ No newline at end of file diff --git a/qa/data/pcbnew/prettifier/group_and_image.kicad_pcb b/qa/data/pcbnew/prettifier/group_and_image.kicad_pcb new file mode 100644 index 0000000000..f7270b80d8 --- /dev/null +++ b/qa/data/pcbnew/prettifier/group_and_image.kicad_pcb @@ -0,0 +1,169 @@ +(kicad_pcb (version 20231007) (generator pcbnew) + + (general + (thickness 1.6) + ) + + (paper "A4") + (layers + (0 "F.Cu" signal) + (31 "B.Cu" signal) + (32 "B.Adhes" user "B.Adhesive") + (33 "F.Adhes" user "F.Adhesive") + (34 "B.Paste" user) + (35 "F.Paste" user) + (36 "B.SilkS" user "B.Silkscreen") + (37 "F.SilkS" user "F.Silkscreen") + (38 "B.Mask" user) + (39 "F.Mask" user) + (40 "Dwgs.User" user "User.Drawings") + (41 "Cmts.User" user "User.Comments") + (42 "Eco1.User" user "User.Eco1") + (43 "Eco2.User" user "User.Eco2") + (44 "Edge.Cuts" user) + (45 "Margin" user) + (46 "B.CrtYd" user "B.Courtyard") + (47 "F.CrtYd" user "F.Courtyard") + (48 "B.Fab" user) + (49 "F.Fab" user) + (50 "User.1" user) + (51 "User.2" user) + (52 "User.3" user) + (53 "User.4" user) + (54 "User.5" user) + (55 "User.6" user) + (56 "User.7" user) + (57 "User.8" user) + (58 "User.9" user) + ) + + (setup + (pad_to_mask_clearance 0) + (pcbplotparams + (layerselection 0x00010fc_ffffffff) + (plot_on_all_layers_selection 0x0000000_00000000) + (disableapertmacros false) + (usegerberextensions false) + (usegerberattributes true) + (usegerberadvancedattributes true) + (creategerberjobfile true) + (dashed_line_dash_ratio 12.000000) + (dashed_line_gap_ratio 3.000000) + (svgprecision 4) + (plotframeref false) + (viasonmask false) + (mode 1) + (useauxorigin false) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15.000000) + (pdf_front_fp_property_popups true) + (pdf_back_fp_property_popups true) + (dxfpolygonmode true) + (dxfimperialunits true) + (dxfusepcbnewfont true) + (psnegative false) + (psa4output false) + (plotreference true) + (plotvalue true) + (plotfptext true) + (plotinvisibletext false) + (sketchpadsonfab false) + (subtractmaskfromsilk false) + (outputformat 1) + (mirror false) + (drillshape 1) + (scaleselection 1) + (outputdirectory "") + ) + ) + + (net 0 "") + + (gr_rect (start 142.24 88.9) (end 143.51 90.17) + (stroke (width 0.05) (type default)) (fill none) (layer "Edge.Cuts") (tstamp 16baef1d-04a3-4f4a-8880-8a0675489673)) + (gr_rect (start 140.97 87.63) (end 156.21 99.06) + (stroke (width 0.05) (type default)) (fill none) (layer "Edge.Cuts") (tstamp 4cacc7e6-4a75-4a10-b7af-5b754b440395)) + (gr_rect (start 142.24 96.52) (end 143.51 97.79) + (stroke (width 0.05) (type default)) (fill none) (layer "Edge.Cuts") (tstamp 6de1afbb-ac41-4ea5-8cc4-b054a5e5fb0d)) + (gr_rect (start 142.24 91.44) (end 143.51 92.71) + (stroke (width 0.05) (type default)) (fill none) (layer "Edge.Cuts") (tstamp 7ee0cdbc-c1c4-4512-a0d5-989b2eabf959)) + (gr_rect (start 153.67 93.98) (end 154.94 95.25) + (stroke (width 0.05) (type default)) (fill none) (layer "Edge.Cuts") (tstamp 85402e04-a27f-4b2f-8d1c-bb7286ec8e18)) + (gr_rect (start 153.67 96.52) (end 154.94 97.79) + (stroke (width 0.05) (type default)) (fill none) (layer "Edge.Cuts") (tstamp c8bfbb9e-f4f5-4989-a83e-83f54ffaac3d)) + (gr_rect (start 153.67 91.44) (end 154.94 92.71) + (stroke (width 0.05) (type default)) (fill none) (layer "Edge.Cuts") (tstamp d26b4361-04bf-4822-9118-fae9bb6dcbe6)) + (gr_rect (start 153.67 88.9) (end 154.94 90.17) + (stroke (width 0.05) (type default)) (fill none) (layer "Edge.Cuts") (tstamp e2573c52-72ff-4e6d-b78d-9c4aeb0876a0)) + (gr_rect (start 142.24 93.98) (end 143.51 95.25) + (stroke (width 0.05) (type default)) (fill none) (layer "Edge.Cuts") (tstamp f8376e5d-27d2-43e8-ba5c-b3a8e26409b2)) + (image (at 148.59 93.345) (layer "F.Cu") + (data + iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAI1ElEQVRo3t1ae4xVxR3+fjPn7kPo + Liu4sChSHyDsIlTbBhueCi0PJdBWkGAtLdaEuliqUoVYCqVpQUsb5A+DCalNFRJJSyopu7S8XP2j + NLX1yapbuytSRcobFvZ1Zn79Y86ZM3PuvdxLShroSSYzZ86Zme/7fo8z554LXOYHne/i8PE76ing + +ynAMJYohSABEBgiGmqGs52GCkzLXk3eOYOgTb9iZuZuCrmVQ/FCc9OUNQDpogkMH9c4V5RiA0pQ + yRYoRUCFA5o80OydIy8JShEBtNcXE4n7qZs70ENL32matr4ggbrxDeu4nBaTgFU6Ae6A5DTgXAQo + BdQlwP45cepaTMTUzAA69I7mpjun5SVQO77x59QLS2LAvuLCAZ7q81wpnxtxHgu4ijOIdIpIbB1T + 8zlsa26aNjOLwLCxDTPEFbQNwlXbqZlyWATOfa4V8hPIVl+n3CjqI98CMRkwQ3RicexO8coQJbSx + OPAiso4AQ0ZFgBE454VK4MwjvTnNGhLMwhSnHxAAEXQGT2L2bGkJDP3SH2dRBtXgyEU4Aq0FoONz + AWaZquO29Nrm3C9JfxDNF1/LNTfZ+aF9TGABSCobfmjBMksgCPRDbMETwDDgXTJpchaEvzhHIBOw + btsH7M6RPTdgBbVCku0XkuclLiR5JNy0yG6KpMR8qXM/O0nTlyLhg5fWbdw5BIAnR2/Dn8ctxr7x + i7Fx8ksozcBbj9N4JK63kVZ7x45OSFEKkPW7xCcToHn7WeQgJLw06gaizSqkQVDYM+YRDDq+xwv5 + 0wNGY2zTWnRrRGO1H9xac/PuqYIAoG5SY8hCSj9gDdAl9w9EnwoDhojA2sDpDoGuLsYL28/hwMfs + BThI4LEFvaO0mE2CiPF2Sw8aXmnHwhu2Y0nJ0pyPvD1XL8eDu77iZCPlZCeN5p1TpCFwe2PIUkpj + AWnBMAQenDcAd000IISQkFJASgkhBI6eJMyqP5Zlof79AjQ8W2WSGgBmBrNJkVozXn+3B99ffQKd + nRq/G/1DjGr/fU4CR2omYdzulaBYfTBAOiGwa4oUXppmAMy2Tcx4afdJEBGEEBH4AFIGCIIAHxww + eZmiccQMYo35s65AJpCQMilBICGExPttjPofn0BnBwPMCDmTd9OhKOPgSjC5jxKBNANyRwCHDncB + SIC7oD49qj3/JCjU3hhg3l2f8e4zJcCRE8BDPzkKpdiOef6jO/IS2Nv5ZW9rAW+bwQ4BR3nDkG3N + WkcEhAdICIkzZzXAGsQaxAq9yoBfLKtGaYmAEH7p6CLUr/w3Tp0OQaxAbMY2HBqNvWXfzgLfMmAO + Vr3yRQdLBNT1EtcC5NvJC7oEeOL/Qggwm70LkQKgseax/rjumlIQkXU7IUwCWLHuMFoPdJhAhAKR + ivY9Ggtf+y4WHnoGr5bNw196zcUTZ57GzF2L/OxF2gnmZHPoxYBRha06cVtIASIBIWQUC6aG5khN + hfpv9MXkMRXmsRIRjols2HQMf2o6YZUnaDsuXuvlo5/DA39dhPn7FmHrh7c4ONhaOelLYsBkoQmN + IQgy4RLl8ii/79w8HGWlJgaEEAgCUz/93CE89+Jh3Pb5Smz46Y3IZIweSeoEdr56At9b0ZZjY2fK + 1AmVGHFTeRJLlMTH1sbjaP2ow9mh+u80+1+e6mQhb4+tkwcNKQgRW0BEbbLpccBVAZ5a9llkMsIq + HpcPDnRi6ZpWIHYbhFFRthw+0oW5M67E3dOr8NUpfTBjUgWmT+yNyWPKccO1JXnB+y6UI9BNSlQA + awhKgMc1ESEjgfWrhqBvVYkHnJlx+kyIRU+8j45zPY67xCW07Tf3nwJAnjixWNGmzHcbP0lCFH5p + 1l5QxuoLIfDNu2tQN7S35zIAoDXw8Mr3cPDjdk/txBK+NXpCZK1BRMbnvbe5C7CAZ414QvjtqspM + Vh8RYe2GVux77Vhe1ZGyiMlmlBKCUBBbsQTSgZn2dff4w85P8fyWNhB6ItChaVvFQ8caOqqz57Tz + FkWgkBtRNgmzt4H1+bh98lRX4jYUmuK4UVLipzfnECdZs9BRlAWYc5FKMpEL4N6vD8btY6oLW/U8 + FjYpvLhxInqfLhgDWb/uOKzcNhGw6vERuOrK0gsiwJz66YUuhEDBg3O6zrHjXTnvrupTgtXLR0KI + Iv0A/rab81j9v3KhZE+ftDf/9iD+8c8zWQAA4LYv9MWCedcVZQGttTc3kMxzUSzgTuou1N2j8YOV + b6GjQ6VcwFxf9J0huHVkVVE/0Sbqs6M+F2kBFFZIa04tYt7DWtvO4pfPtHjuFddSAqt/dDMqemWK + igFmHb216ahNF+c5wMwRCW3bNr0y8OLWg9i193AWQWbGwAHlWPF4bYE1tL3fCGXWguaL40Iu8GQh + 7WWn5T/bj399cs4DH4+dPLEas2ddk39+ZiiloDVniXRRgjhRX0cLRQohUejs2RBLV7yDrm6V0xKP + 1A/BkOt7nyeINbRWUdEJgYsTxNrGganNIuks+XbzKfx604dWQZdsSQZYs6IOmUx2atWO+kpphKEq + OvUWtIAUBCJjYqVCu4jWGtX9SrLuf/ZXbWg70O6pH5O4dlAZVi0bnjVGiHh+5QQwUJIRxVogf7AM + HlSGMOyx4GP1lVIYWJNNQIWMzVsOWtBuUUph4rgqPDB/sL2/vExa11RKQ6kweSBWBsURYKaefCZa + cF9/MDPCUEUlRBiGUEph2NByXD2wPGvMey3tVlG3xCTunVONOV+rAQDcd08NtDbWDUMfxoSxvc+3 + OWCAtHknvrXxCAT6XU5fJ5nR1fy3aWUi2sv9/bL7vMpocXajav0FbX8viUKbvA9Ztbc0fkKEmsvD + f3B2/+tTKwDSInna8reK2TxdAr4P1ng0/vDtf2YdtX01Cbn0UibCTFua35h6T94P3bWjGtZC0KN0 + CSoP1jua3zzPh+74uOnm7TOloI1E1O8SAd/OrB9+9607N17Qnz3qRjbOZ2AhgBFEKGdA0v9AafMh + izoYaCHBv9n/xvR1+H89/gO9Jf8AdgrwhQAAAABJRU5ErkJggg== + ) + ) + + (group "" (id 341a7559-d258-493a-87dc-f6c4b095509d) + (members + 85402e04-a27f-4b2f-8d1c-bb7286ec8e18 + c8bfbb9e-f4f5-4989-a83e-83f54ffaac3d + d26b4361-04bf-4822-9118-fae9bb6dcbe6 + e2573c52-72ff-4e6d-b78d-9c4aeb0876a0 + ) + ) + (group "" (id b2069c54-f5f7-4dc5-9f12-98f292c334e3) + (members + 341a7559-d258-493a-87dc-f6c4b095509d + bcad4640-c8e1-4ef4-96ca-ca8cc3e1742d + ) + ) + (group "" (id bcad4640-c8e1-4ef4-96ca-ca8cc3e1742d) + (members + 16baef1d-04a3-4f4a-8880-8a0675489673 + 6de1afbb-ac41-4ea5-8cc4-b054a5e5fb0d + 7ee0cdbc-c1c4-4512-a0d5-989b2eabf959 + f8376e5d-27d2-43e8-ba5c-b3a8e26409b2 + ) + ) +) diff --git a/qa/data/pcbnew/prettifier/group_and_image_formatted.kicad_pcb b/qa/data/pcbnew/prettifier/group_and_image_formatted.kicad_pcb new file mode 100644 index 0000000000..8514a3847b --- /dev/null +++ b/qa/data/pcbnew/prettifier/group_and_image_formatted.kicad_pcb @@ -0,0 +1,243 @@ +(kicad_pcb + (version 20231014) + (generator pcbnew) + (general + (thickness 1.6) + (legacy_teardrops no) + ) + (paper "A4") + (layers + (0 "F.Cu" signal) + (31 "B.Cu" signal) + (32 "B.Adhes" user "B.Adhesive") + (33 "F.Adhes" user "F.Adhesive") + (34 "B.Paste" user) + (35 "F.Paste" user) + (36 "B.SilkS" user "B.Silkscreen") + (37 "F.SilkS" user "F.Silkscreen") + (38 "B.Mask" user) + (39 "F.Mask" user) + (40 "Dwgs.User" user "User.Drawings") + (41 "Cmts.User" user "User.Comments") + (42 "Eco1.User" user "User.Eco1") + (43 "Eco2.User" user "User.Eco2") + (44 "Edge.Cuts" user) + (45 "Margin" user) + (46 "B.CrtYd" user "B.Courtyard") + (47 "F.CrtYd" user "F.Courtyard") + (48 "B.Fab" user) + (49 "F.Fab" user) + (50 "User.1" user) + (51 "User.2" user) + (52 "User.3" user) + (53 "User.4" user) + (54 "User.5" user) + (55 "User.6" user) + (56 "User.7" user) + (57 "User.8" user) + (58 "User.9" user) + ) + (setup + (pad_to_mask_clearance 0) + (allow_soldermask_bridges_in_footprints no) + (pcbplotparams + (layerselection 0x00010fc_ffffffff) + (plot_on_all_layers_selection 0x0000000_00000000) + (disableapertmacros no) + (usegerberextensions no) + (usegerberattributes yes) + (usegerberadvancedattributes yes) + (creategerberjobfile yes) + (dashed_line_dash_ratio 12.000000) + (dashed_line_gap_ratio 3.000000) + (svgprecision 4) + (plotframeref no) + (viasonmask no) + (mode 1) + (useauxorigin no) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15.000000) + (pdf_front_fp_property_popups yes) + (pdf_back_fp_property_popups yes) + (dxfpolygonmode yes) + (dxfimperialunits yes) + (dxfusepcbnewfont yes) + (psnegative no) + (psa4output no) + (plotreference yes) + (plotvalue yes) + (plotfptext yes) + (plotinvisibletext no) + (sketchpadsonfab no) + (subtractmaskfromsilk no) + (outputformat 1) + (mirror no) + (drillshape 1) + (scaleselection 1) + (outputdirectory "") + ) + ) + (net 0 "") + (gr_rect + (start 142.24 88.9) + (end 143.51 90.17) + (stroke + (width 0.05) + (type default) + ) + (fill none) + (layer "Edge.Cuts") + (uuid "16baef1d-04a3-4f4a-8880-8a0675489673") + ) + (gr_rect + (start 140.97 87.63) + (end 156.21 99.06) + (stroke + (width 0.05) + (type default) + ) + (fill none) + (layer "Edge.Cuts") + (uuid "4cacc7e6-4a75-4a10-b7af-5b754b440395") + ) + (gr_rect + (start 142.24 96.52) + (end 143.51 97.79) + (stroke + (width 0.05) + (type default) + ) + (fill none) + (layer "Edge.Cuts") + (uuid "6de1afbb-ac41-4ea5-8cc4-b054a5e5fb0d") + ) + (gr_rect + (start 142.24 91.44) + (end 143.51 92.71) + (stroke + (width 0.05) + (type default) + ) + (fill none) + (layer "Edge.Cuts") + (uuid "7ee0cdbc-c1c4-4512-a0d5-989b2eabf959") + ) + (gr_rect + (start 153.67 93.98) + (end 154.94 95.25) + (stroke + (width 0.05) + (type default) + ) + (fill none) + (layer "Edge.Cuts") + (uuid "85402e04-a27f-4b2f-8d1c-bb7286ec8e18") + ) + (gr_rect + (start 153.67 96.52) + (end 154.94 97.79) + (stroke + (width 0.05) + (type default) + ) + (fill none) + (layer "Edge.Cuts") + (uuid "c8bfbb9e-f4f5-4989-a83e-83f54ffaac3d") + ) + (gr_rect + (start 153.67 91.44) + (end 154.94 92.71) + (stroke + (width 0.05) + (type default) + ) + (fill none) + (layer "Edge.Cuts") + (uuid "d26b4361-04bf-4822-9118-fae9bb6dcbe6") + ) + (gr_rect + (start 153.67 88.9) + (end 154.94 90.17) + (stroke + (width 0.05) + (type default) + ) + (fill none) + (layer "Edge.Cuts") + (uuid "e2573c52-72ff-4e6d-b78d-9c4aeb0876a0") + ) + (gr_rect + (start 142.24 93.98) + (end 143.51 95.25) + (stroke + (width 0.05) + (type default) + ) + (fill none) + (layer "Edge.Cuts") + (uuid "f8376e5d-27d2-43e8-ba5c-b3a8e26409b2") + ) + (image + (at 148.59 93.345) + (layer "F.Cu") + (data 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 + ) + ) + (group "" + (id "341a7559-d258-493a-87dc-f6c4b095509d") + (members "85402e04-a27f-4b2f-8d1c-bb7286ec8e18" "c8bfbb9e-f4f5-4989-a83e-83f54ffaac3d" + "d26b4361-04bf-4822-9118-fae9bb6dcbe6" "e2573c52-72ff-4e6d-b78d-9c4aeb0876a0" + ) + ) + (group "" + (id "b2069c54-f5f7-4dc5-9f12-98f292c334e3") + (members "341a7559-d258-493a-87dc-f6c4b095509d" "bcad4640-c8e1-4ef4-96ca-ca8cc3e1742d") + ) + (group "" + (id "bcad4640-c8e1-4ef4-96ca-ca8cc3e1742d") + (members "16baef1d-04a3-4f4a-8880-8a0675489673" "6de1afbb-ac41-4ea5-8cc4-b054a5e5fb0d" + "7ee0cdbc-c1c4-4512-a0d5-989b2eabf959" "f8376e5d-27d2-43e8-ba5c-b3a8e26409b2" + ) + ) +) \ No newline at end of file diff --git a/qa/pcbnew_utils/board_file_utils.cpp b/qa/pcbnew_utils/board_file_utils.cpp index 5017e69858..f25abdef4d 100644 --- a/qa/pcbnew_utils/board_file_utils.cpp +++ b/qa/pcbnew_utils/board_file_utils.cpp @@ -29,6 +29,7 @@ #include #include +#include #include @@ -82,8 +83,9 @@ std::unique_ptr ReadBoardItemFromStream( std::istream& aStream ) { board.reset( parser.Parse() ); } - catch( const IO_ERROR& ) + catch( const IO_ERROR& e ) { + throw e; } return board; @@ -91,7 +93,7 @@ std::unique_ptr ReadBoardItemFromStream( std::istream& aStream ) std::unique_ptr ReadBoardFromFileOrStream( const std::string& aFilename, - std::istream& aFallback ) + std::istream& aFallback ) { std::istream* in_stream = nullptr; std::ifstream file_stream; @@ -111,5 +113,26 @@ std::unique_ptr ReadBoardFromFileOrStream( const std::string& aFilename, } +std::unique_ptr ReadFootprintFromFileOrStream( const std::string& aFilename, + std::istream& aFallback ) +{ + std::istream* in_stream = nullptr; + std::ifstream file_stream; + + if( aFilename.empty() ) + { + // no file, read stdin + in_stream = &aFallback; + } + else + { + file_stream.open( aFilename ); + in_stream = &file_stream; + } + + return ReadItemFromStream( *in_stream ); +} + + } // namespace KI_TEST diff --git a/qa/pcbnew_utils/include/pcbnew_utils/board_file_utils.h b/qa/pcbnew_utils/include/pcbnew_utils/board_file_utils.h index c6658b2566..84fbf1e264 100644 --- a/qa/pcbnew_utils/include/pcbnew_utils/board_file_utils.h +++ b/qa/pcbnew_utils/include/pcbnew_utils/board_file_utils.h @@ -31,6 +31,7 @@ class BOARD; class BOARD_ITEM; +class FOOTPRINT; /** * @file board_file_utils.h @@ -100,6 +101,9 @@ template std::unique_ptr ReadItemFromStream( std::istream& std::unique_ptr ReadBoardFromFileOrStream( const std::string& aFilename, std::istream& aFallback = std::cin ); +std::unique_ptr ReadFootprintFromFileOrStream( const std::string& aFilename, + std::istream& aFallback = std::cin ); + } // namespace KI_TEST -#endif // QA_PCBNEW_UTILS_BOARD_FILE_UTILS__H \ No newline at end of file +#endif // QA_PCBNEW_UTILS_BOARD_FILE_UTILS__H diff --git a/qa/tests/pcbnew/CMakeLists.txt b/qa/tests/pcbnew/CMakeLists.txt index 6023500835..03ca6a45b1 100644 --- a/qa/tests/pcbnew/CMakeLists.txt +++ b/qa/tests/pcbnew/CMakeLists.txt @@ -38,6 +38,7 @@ set( QA_PCBNEW_SRCS test_lset.cpp test_pns_basics.cpp test_pad_numbering.cpp + test_prettifier.cpp test_libeval_compiler.cpp test_save_load.cpp test_tracks_cleaner.cpp diff --git a/qa/tests/pcbnew/test_prettifier.cpp b/qa/tests/pcbnew/test_prettifier.cpp new file mode 100644 index 0000000000..9e80bfe5f1 --- /dev/null +++ b/qa/tests/pcbnew/test_prettifier.cpp @@ -0,0 +1,112 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2023 KiCad Developers, see AUTHORS.txt for contributors. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + + +struct PRETTIFIER_TEST_FIXTURE +{ + PRETTIFIER_TEST_FIXTURE() : + m_settingsManager( true /* headless */ ) + { } + + SETTINGS_MANAGER m_settingsManager; +}; + + +BOOST_FIXTURE_TEST_CASE( FootprintPrettifier, PRETTIFIER_TEST_FIXTURE ) +{ + std::vector footprints = { + "Reverb_BTDR-1V", + "Samtec_HLE-133-02-xx-DV-PE-LC_2x33_P2.54mm_Horizontal" + }; + + std::unique_ptr original, converted; + PCB_PLUGIN plugin; + + std::string tempLibPath = fmt::format( "{}/prettifier.pretty", + std::filesystem::temp_directory_path().c_str() ); + std::filesystem::remove_all( tempLibPath ); + std::filesystem::create_directory( tempLibPath ); + + for( const wxString& footprint : footprints ) + { + BOOST_TEST_CONTEXT( footprint.ToStdString() ) + { + std::string inPath = fmt::format( "{}prettifier/{}.kicad_mod", + KI_TEST::GetPcbnewTestDataDir(), + footprint.ToStdString() ); + + BOOST_CHECK_NO_THROW( original = KI_TEST::ReadFootprintFromFileOrStream( inPath ) ); + BOOST_REQUIRE( original.get() ); + + BOOST_CHECK_NO_THROW( plugin.FootprintSave( tempLibPath, original.get() ) ); + + std::string newPath = fmt::format( "{}/{}.kicad_mod", tempLibPath, + original->GetFPIDAsString().ToStdString() ); + + BOOST_CHECK_NO_THROW( converted = KI_TEST::ReadFootprintFromFileOrStream( newPath ) ); + BOOST_REQUIRE( converted.get() ); + + // Hack around the fact that PAD::operator== compares footprint UUIDs, even though + // these UUIDs cannot be preserved through a round-trip + const_cast( converted->m_Uuid ) = original->m_Uuid; + + // File should parse the same way + BOOST_REQUIRE( *original == *converted ); + + // And the formatting should match + std::string goldenPath = fmt::format( "{}prettifier/{}_formatted.kicad_mod", + KI_TEST::GetPcbnewTestDataDir(), + footprint.ToStdString() ); + + std::ifstream test( newPath ); + std::ifstream golden( goldenPath ); + + BOOST_REQUIRE( !test.fail() && !golden.fail() ); + BOOST_REQUIRE_MESSAGE( test.tellg() == golden.tellg(), "File sizes didn't match!" ); + + test.seekg( 0, std::ifstream::beg ); + golden.seekg( 0, std::ifstream::beg ); + + BOOST_REQUIRE_MESSAGE( std::equal( std::istreambuf_iterator( test.rdbuf() ), + std::istreambuf_iterator(), + std::istreambuf_iterator( golden.rdbuf() ) ), + "Formatted footprints do not match!" ); + + std::filesystem::remove( newPath ); + } + } +} +