Automatic whitespace and indentation prettification for sexpr formats

This commit is contained in:
Jon Evans 2023-09-24 14:58:19 -04:00
parent 55ba667bcb
commit f1f8981395
17 changed files with 2957 additions and 38 deletions

View File

@ -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

View File

@ -17,6 +17,8 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <fmt/format.h>
#include <kiid.h>
#include <plugins/kicad/kicad_plugin_utils.h>
#include <richio.h>
@ -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

View File

@ -30,6 +30,7 @@
#include <core/ignore.h>
#include <richio.h>
#include <errno.h>
#include <plugins/kicad/kicad_plugin_utils.h>
#include <wx/file.h>
#include <wx/translation.h>
@ -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<aCount; total += lastWrite )
{
lastWrite = m_os.Write( aOutBuf, aCount ).LastWrite();
if( !m_os.IsOk() )
{
THROW_IO_ERROR( _( "OUTPUTSTREAM_OUTPUTFORMATTER write error" ) );
}
}
if( !m_fp )
THROW_IO_ERROR( strerror( errno ) );
}
PRETTIFIED_FILE_OUTPUTFORMATTER::~PRETTIFIED_FILE_OUTPUTFORMATTER()
{
try
{
PRETTIFIED_FILE_OUTPUTFORMATTER::Finish();
}
catch( ... )
{}
}
bool PRETTIFIED_FILE_OUTPUTFORMATTER::Finish()
{
if( !m_fp )
return false;
KICAD_FORMAT::Prettify( m_buf );
if( fwrite( m_buf.c_str(), m_buf.length(), 1, m_fp ) != 1 )
THROW_IO_ERROR( strerror( errno ) );
fclose( m_fp );
m_fp = nullptr;
return true;
}
void PRETTIFIED_FILE_OUTPUTFORMATTER::write( const char* aOutBuf, int aCount )
{
m_buf.append( aOutBuf, aCount );
}

View File

@ -346,7 +346,7 @@ void SCH_SEXPR_PLUGIN::SaveSchematicFile( const wxString& aFileName, SCH_SHEET*
// works properly.
wxASSERT( fn.IsAbsolute() );
FILE_OUTPUTFORMATTER formatter( fn.GetFullPath() );
PRETTIFIED_FILE_OUTPUTFORMATTER formatter( fn.GetFullPath() );
m_out = &formatter; // no ownership

View File

@ -36,10 +36,12 @@ namespace KICAD_FORMAT {
* @param aValue is the value to write
* @param aSuffix is the character to format after the end of the boolean (after the close paren)
*/
void FormatBool( OUTPUTFORMATTER* aOut, int aNestLevel, const wxString& aKey, bool aValue,
char aSuffix = '\n' );
KICOMMON_API void FormatBool( OUTPUTFORMATTER* aOut, int aNestLevel, const wxString& aKey,
bool aValue, char aSuffix = '\n' );
void FormatUuid( OUTPUTFORMATTER* aOut, const KIID& aUuid, char aSuffix = '\n' );
KICOMMON_API void FormatUuid( OUTPUTFORMATTER* aOut, const KIID& aUuid, char aSuffix = '\n' );
KICOMMON_API void Prettify( std::string& aSource, char aQuoteChar = '"' );
} // namespace KICAD_FORMAT

View File

@ -408,6 +408,12 @@ public:
std::string Quotew( const wxString& aWrapee ) const;
/**
* Performs any cleanup needed at the end of a write.
* @return true if all is well
*/
virtual bool Finish() { return true; }
private:
std::vector<char> 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_

View File

@ -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;
}

View File

@ -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))
)
)

View File

@ -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)
)
)
)

View File

@ -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))
)
)

View File

@ -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
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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
)
)
)

View File

@ -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"
)
)
)

View File

@ -29,6 +29,7 @@
#include <richio.h>
#include <board.h>
#include <footprint.h>
#include <qa_utils/stdstream_line_reader.h>
@ -82,8 +83,9 @@ std::unique_ptr<BOARD_ITEM> 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<BOARD_ITEM> ReadBoardItemFromStream( std::istream& aStream )
std::unique_ptr<BOARD> 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<BOARD> ReadBoardFromFileOrStream( const std::string& aFilename,
}
std::unique_ptr<FOOTPRINT> 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<FOOTPRINT>( *in_stream );
}
} // namespace KI_TEST

View File

@ -31,6 +31,7 @@
class BOARD;
class BOARD_ITEM;
class FOOTPRINT;
/**
* @file board_file_utils.h
@ -100,6 +101,9 @@ template <typename ITEM> std::unique_ptr<ITEM> ReadItemFromStream( std::istream&
std::unique_ptr<BOARD> ReadBoardFromFileOrStream( const std::string& aFilename,
std::istream& aFallback = std::cin );
std::unique_ptr<FOOTPRINT> ReadFootprintFromFileOrStream( const std::string& aFilename,
std::istream& aFallback = std::cin );
} // namespace KI_TEST
#endif // QA_PCBNEW_UTILS_BOARD_FILE_UTILS__H
#endif // QA_PCBNEW_UTILS_BOARD_FILE_UTILS__H

View File

@ -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

View File

@ -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 <algorithm>
#include <filesystem>
#include <fstream>
#include <fmt/format.h>
#include <qa_utils/wx_utils/unit_test_utils.h>
#include <pcbnew_utils/board_test_utils.h>
#include <pcbnew_utils/board_file_utils.h>
#include <plugins/kicad/pcb_plugin.h>
#include <board.h>
#include <footprint.h>
#include <settings/settings_manager.h>
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<wxString> footprints = {
"Reverb_BTDR-1V",
"Samtec_HLE-133-02-xx-DV-PE-LC_2x33_P2.54mm_Horizontal"
};
std::unique_ptr<FOOTPRINT> 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<KIID&>( 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<char>( test.rdbuf() ),
std::istreambuf_iterator<char>(),
std::istreambuf_iterator<char>( golden.rdbuf() ) ),
"Formatted footprints do not match!" );
std::filesystem::remove( newPath );
}
}
}