From 7745d37d6c7f27f306c1c4c16bd70a86b8f8f9e4 Mon Sep 17 00:00:00 2001 From: Dick Hollenbeck Date: Wed, 10 Apr 2013 10:08:01 -0500 Subject: [PATCH 01/25] revert to using quotes around variable text which may be blank --- pcbnew/gpcb_plugin.cpp | 2 +- pcbnew/kicad_plugin.cpp | 4 ++-- pcbnew/legacy_plugin.cpp | 2 +- pcbnew/specctra_export.cpp | 7 +++---- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/pcbnew/gpcb_plugin.cpp b/pcbnew/gpcb_plugin.cpp index 230bae94d1..c1fbd51454 100644 --- a/pcbnew/gpcb_plugin.cpp +++ b/pcbnew/gpcb_plugin.cpp @@ -278,7 +278,7 @@ void GPCB_FPL_CACHE::Remove( const wxString& aFootprintName ) if( it == m_modules.end() ) { - THROW_IO_ERROR( wxString::Format( _( "library <%s> has no footprint %s to delete" ), + THROW_IO_ERROR( wxString::Format( _( "library <%s> has no footprint '%s' to delete" ), m_lib_path.GetPath().GetData(), aFootprintName.GetData() ) ); } diff --git a/pcbnew/kicad_plugin.cpp b/pcbnew/kicad_plugin.cpp index 7c145c96ad..0399a8a0a1 100644 --- a/pcbnew/kicad_plugin.cpp +++ b/pcbnew/kicad_plugin.cpp @@ -249,7 +249,7 @@ void FP_CACHE::Remove( const wxString& aFootprintName ) if( it == m_modules.end() ) { - THROW_IO_ERROR( wxString::Format( _( "library <%s> has no footprint %s to delete" ), + THROW_IO_ERROR( wxString::Format( _( "library <%s> has no footprint '%s' to delete" ), m_lib_path.GetPath().GetData(), aFootprintName.GetData() ) ); } @@ -425,7 +425,7 @@ void PCB_IO::format( BOARD* aBoard, int aNestLevel ) const m_out->Print( aNestLevel, "(layers\n" ); // Save only the used copper layers from front to back. - for( LAYER_NUM layer = LAST_COPPER_LAYER; layer >= FIRST_COPPER_LAYER; --layer) + for( LAYER_NUM layer = LAST_COPPER_LAYER; layer >= FIRST_COPPER_LAYER; --layer) { LAYER_MSK mask = GetLayerMask( layer ); if( mask & aBoard->GetEnabledLayers() ) diff --git a/pcbnew/legacy_plugin.cpp b/pcbnew/legacy_plugin.cpp index e39698c58a..a80fe1a35c 100644 --- a/pcbnew/legacy_plugin.cpp +++ b/pcbnew/legacy_plugin.cpp @@ -4322,7 +4322,7 @@ void LEGACY_PLUGIN::FootprintDelete( const wxString& aLibraryPath, const wxStrin if( erasedCount != 1 ) { THROW_IO_ERROR( wxString::Format( - _( "library <%s> has no footprint %s to delete" ), + _( "library <%s> has no footprint '%s' to delete" ), aLibraryPath.GetData(), aFootprintName.GetData() ) ); } diff --git a/pcbnew/specctra_export.cpp b/pcbnew/specctra_export.cpp index 8b751fb538..7acb5cbe74 100644 --- a/pcbnew/specctra_export.cpp +++ b/pcbnew/specctra_export.cpp @@ -549,7 +549,6 @@ IMAGE* SPECCTRA_DB::makeIMAGE( BOARD* aBoard, MODULE* aModule ) TYPE_COLLECTOR moduleItems; wxString padName; - // get all the MODULE's pads. moduleItems.Collect( aModule, scanPADs ); @@ -888,7 +887,7 @@ void SPECCTRA_DB::fillBOUNDARY( BOARD* aBoard, BOUNDARY* boundary ) throw( IO_ER { wxString error; - error.Printf( _("Unsupported DRAWSEGMENT type %s"), + error.Printf( _( "Unsupported DRAWSEGMENT type %s" ), GetChars( BOARD_ITEM::ShowShape( (STROKE_T) graphic->GetShape() ) ) ); ThrowIOError( error ); @@ -964,7 +963,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR ) if( module->GetReference() == wxEmptyString ) { - ThrowIOError( _("Component with value of %s has empty reference id."), + ThrowIOError( _( "Component with value of '%s' has empty reference id." ), GetChars( module->GetValue() ) ); } @@ -972,7 +971,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR ) STRINGSET_PAIR refpair = refs.insert( TO_UTF8( module->GetReference() ) ); if( !refpair.second ) // insert failed { - ThrowIOError( _("Multiple components have identical reference IDs of %s."), + ThrowIOError( _( "Multiple components have identical reference IDs of '%s'." ), GetChars( module->GetReference() ) ); } } From 3289835b53f9104766dae65f55e87238a2f63f94 Mon Sep 17 00:00:00 2001 From: Lorenzo Marcantonio Date: Wed, 10 Apr 2013 21:09:59 +0200 Subject: [PATCH 02/25] Made overbar position independant of pen size for text, to fix graphics glitches with halo text. Slightly retuned for compensating the new position. --- common/drawtxt.cpp | 22 ++++++++++------------ eeschema/sch_text.cpp | 5 ++--- include/drawtxt.h | 6 ++++++ pcbnew/class_pad_draw_functions.cpp | 4 ++-- pcbnew/class_track.cpp | 4 ++-- 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/common/drawtxt.cpp b/common/drawtxt.cpp index a6aa906537..2031e96c69 100644 --- a/common/drawtxt.cpp +++ b/common/drawtxt.cpp @@ -54,11 +54,9 @@ double s_HersheyScaleFactor = HERSHEY_SCALE_FACTOR; -/* Helper function for texts with over bar - */ -int OverbarPositionY( int size_v, int thickness ) +int OverbarPositionY( int size_v ) { - return KiROUND( ( (double) size_v * 1.1 ) + ( (double) thickness * 1.5 ) ); + return KiROUND( size_v * 1.22 ); } @@ -155,7 +153,7 @@ static const char* GetHersheyShapeDescription( int AsciiCode ) AsciiCode = '?'; if( AsciiCode < 32 ) - AsciiCode = 32; /* Clamp control chars */ + AsciiCode = 32; // Clamp control chars AsciiCode -= 32; @@ -391,9 +389,9 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel, /* if a text size is too small, the text cannot be drawn, and it is drawn as a single * graphic line */ - if( std::abs( aSize.x ) < 3 ) + if( aDC && ( aDC->LogicalToDeviceYRel( std::abs( aSize.y ) ) < MIN_TEXT_SIZE )) { - /* draw the text as a line always vertically centered */ + // draw the text as a line always vertically centered wxPoint end( current_char_pos.x + dx, current_char_pos.y ); RotatePoint( ¤t_char_pos, aPos, aOrient ); @@ -417,7 +415,7 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel, if( aItalic ) { - overbar_italic_comp = OverbarPositionY( size_v, aWidth ) / 8; + overbar_italic_comp = OverbarPositionY( size_v ) / 8; if( italic_reverse ) { @@ -450,7 +448,7 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel, // Starting the overbar overbar_pos = current_char_pos; overbar_pos.x += overbar_italic_comp; - overbar_pos.y -= OverbarPositionY( size_v, aWidth ); + overbar_pos.y -= OverbarPositionY( size_v ); RotatePoint( &overbar_pos, aPos, aOrient ); } else @@ -459,7 +457,7 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel, coord[0] = overbar_pos; overbar_pos = current_char_pos; overbar_pos.x += overbar_italic_comp; - overbar_pos.y -= OverbarPositionY( size_v, aWidth ); + overbar_pos.y -= OverbarPositionY( size_v ); RotatePoint( &overbar_pos, aPos, aOrient ); coord[1] = overbar_pos; // Plot the overbar segment @@ -520,7 +518,7 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel, else { wxPoint currpoint; - hc1 -= xsta; hc2 -= 11; // Align the midpoint + hc1 -= xsta; hc2 -= 10; // Align the midpoint hc1 = KiROUND( hc1 * size_h * s_HersheyScaleFactor ); hc2 = KiROUND( hc2 * size_v * s_HersheyScaleFactor ); @@ -551,7 +549,7 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel, // Close the last overbar coord[0] = overbar_pos; overbar_pos = current_char_pos; - overbar_pos.y -= OverbarPositionY( size_v, aWidth ); + overbar_pos.y -= OverbarPositionY( size_v ); RotatePoint( &overbar_pos, aPos, aOrient ); coord[1] = overbar_pos; diff --git a/eeschema/sch_text.cpp b/eeschema/sch_text.cpp index 6eb22f2574..3e0f1baa7e 100644 --- a/eeschema/sch_text.cpp +++ b/eeschema/sch_text.cpp @@ -46,7 +46,6 @@ extern void IncrementLabelMember( wxString& name ); -extern int OverbarPositionY( int size_v, int thickness ); /* Names of sheet label types. */ @@ -1320,11 +1319,11 @@ void SCH_GLOBALLABEL::CreateGraphicShape( std::vector & aPoints, const int x = symb_len + linewidth + 3; // Use negation bar Y position to calculate full vertical size - #define Y_CORRECTION 1.22 + #define Y_CORRECTION 1.3 // Note: this factor is due to the fact the negation bar Y position // does not give exactly the full Y size of text // and is experimentally set to this value - int y = KiROUND( OverbarPositionY( HalfSize, linewidth ) * Y_CORRECTION ); + int y = KiROUND( OverbarPositionY( HalfSize ) * Y_CORRECTION ); // add room for line thickness and space between top of text and graphic shape y += linewidth; diff --git a/include/drawtxt.h b/include/drawtxt.h index cbbd9fadd7..8750f08836 100644 --- a/include/drawtxt.h +++ b/include/drawtxt.h @@ -50,6 +50,12 @@ int ReturnGraphicTextWidth( const wxString& aText, int size_h, bool italic, bool * Return the text length of a negable string, excluding the ~ markers */ int NegableTextLength( const wxString& aText ); +/** + * Helper function for texts with over bar, can be used as strut value + * for multiline text (add interline spacing) + */ +int OverbarPositionY( int size_v ); + /** * Function DrawGraphicText * Draw a graphic text (like module texts) diff --git a/pcbnew/class_pad_draw_functions.cpp b/pcbnew/class_pad_draw_functions.cpp index 5d14ba78b3..5de313758c 100644 --- a/pcbnew/class_pad_draw_functions.cpp +++ b/pcbnew/class_pad_draw_functions.cpp @@ -551,7 +551,7 @@ void D_PAD::DrawShape( EDA_RECT* aClipBox, wxDC* aDC, PAD_DRAWINFO& aDrawInfo ) if( aDC->LogicalToDeviceXRel( tsize ) >= MIN_TEXT_SIZE ) // Not drawable when size too small. { // tsize reserve room for marges and segments thickness - tsize = ( tsize * 8 ) / 10; + tsize = ( tsize * 7 ) / 10; DrawGraphicHaloText( aDrawInfo.m_DrawPanel, aDC, tpos, aDrawInfo.m_Color, BLACK, WHITE, buffer, t_angle, @@ -578,7 +578,7 @@ void D_PAD::DrawShape( EDA_RECT* aClipBox, wxDC* aDC, PAD_DRAWINFO& aDrawInfo ) RotatePoint( &tpos, shape_pos, angle ); // tsize reserve room for marges and segments thickness - tsize = ( tsize * 8 ) / 10; + tsize = ( tsize * 7 ) / 10; DrawGraphicHaloText( aDrawInfo.m_DrawPanel, aDC, tpos, aDrawInfo.m_Color, BLACK, WHITE, m_ShortNetname, t_angle, diff --git a/pcbnew/class_track.cpp b/pcbnew/class_track.cpp index 024ad5aaf7..3d33e346ee 100644 --- a/pcbnew/class_track.cpp +++ b/pcbnew/class_track.cpp @@ -750,7 +750,7 @@ void TRACK::Draw( EDA_DRAW_PANEL* panel, wxDC* aDC, GR_DRAWMODE aDrawMode, if( (aDrawMode & GR_XOR) == 0 ) GRSetDrawMode( aDC, GR_COPY ); - tsize = (tsize * 8) / 10; // small reduction to give a better look + tsize = (tsize * 7) / 10; // small reduction to give a better look DrawGraphicHaloText( panel, aDC, tpos, color, BLACK, WHITE, net->GetShortNetname(), angle, wxSize( tsize, tsize ), @@ -961,7 +961,7 @@ void SEGVIA::Draw( EDA_DRAW_PANEL* panel, wxDC* aDC, GR_DRAWMODE aDrawMode, if( aDC->LogicalToDeviceXRel( tsize ) >= MIN_TEXT_SIZE ) { - tsize = (tsize * 8) / 10; // small reduction to give a better look, inside via + tsize = (tsize * 7) / 10; // small reduction to give a better look, inside via if( (aDrawMode & GR_XOR) == 0 ) GRSetDrawMode( aDC, GR_COPY ); From 3b65c120e88456abb19a6f294da271a00f072e20 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Wed, 10 Apr 2013 21:20:35 +0200 Subject: [PATCH 03/25] Pcbnew: fix Bug #1167364 pcb_calculator: fix bug Bug #1167345 --- .../dialogs/pcb_calculator_frame_base.cpp | 50 +- .../dialogs/pcb_calculator_frame_base.fbp | 588 +----------------- .../dialogs/pcb_calculator_frame_base.h | 8 +- pcbnew/kicad_plugin.cpp | 6 +- 4 files changed, 60 insertions(+), 592 deletions(-) diff --git a/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp b/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp index 63ef5b328f..451d016573 100644 --- a/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp +++ b/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp @@ -1,10 +1,12 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Mar 17 2012) +// C++ code generated with wxFormBuilder (version Oct 8 2012) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! /////////////////////////////////////////////////////////////////////////// +#include "UnitSelector.h" + #include "pcb_calculator_frame_base.h" #include "../bitmaps/arrow_bottom.xpm" @@ -74,7 +76,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow bSizerRegulRight = new wxBoxSizer( wxVERTICAL ); wxFlexGridSizer* fgSizerRegParams; - fgSizerRegParams = new wxFlexGridSizer( 5, 4, 0, 0 ); + fgSizerRegParams = new wxFlexGridSizer( 6, 4, 0, 0 ); fgSizerRegParams->AddGrowableCol( 2 ); fgSizerRegParams->SetFlexibleDirection( wxBOTH ); fgSizerRegParams->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED ); @@ -88,6 +90,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerRegParams->Add( m_labelRegultR1, 0, wxALL, 5 ); m_RegulR1Value = new wxTextCtrl( m_panelRegulators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_RegulR1Value->SetMaxLength( 0 ); fgSizerRegParams->Add( m_RegulR1Value, 0, wxALL|wxEXPAND, 5 ); m_UnitRegultR11 = new wxStaticText( m_panelRegulators, wxID_ANY, _("KOhm"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -102,6 +105,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerRegParams->Add( m_labelRegultR2, 0, wxALL, 5 ); m_RegulR2Value = new wxTextCtrl( m_panelRegulators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_RegulR2Value->SetMaxLength( 0 ); fgSizerRegParams->Add( m_RegulR2Value, 0, wxALL|wxEXPAND, 5 ); m_UnitRegultR1 = new wxStaticText( m_panelRegulators, wxID_ANY, _("KOhm"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -116,6 +120,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerRegParams->Add( m_labelVout, 0, wxALL, 5 ); m_RegulVoutValue = new wxTextCtrl( m_panelRegulators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_RegulVoutValue->SetMaxLength( 0 ); fgSizerRegParams->Add( m_RegulVoutValue, 0, wxALL|wxEXPAND, 5 ); m_unitsVout = new wxStaticText( m_panelRegulators, wxID_ANY, _("V"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -132,6 +137,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerRegParams->Add( m_labelVRef, 0, wxALL, 5 ); m_RegulVrefValue = new wxTextCtrl( m_panelRegulators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_RegulVrefValue->SetMaxLength( 0 ); fgSizerRegParams->Add( m_RegulVrefValue, 0, wxALL|wxEXPAND, 5 ); m_unitsVref = new wxStaticText( m_panelRegulators, wxID_ANY, _("V"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -148,6 +154,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerRegParams->Add( m_RegulIadjTitle, 0, wxALL, 5 ); m_RegulIadjValue = new wxTextCtrl( m_panelRegulators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_RegulIadjValue->SetMaxLength( 0 ); fgSizerRegParams->Add( m_RegulIadjValue, 0, wxALL|wxEXPAND, 5 ); m_IadjUnitLabel = new wxStaticText( m_panelRegulators, wxID_ANY, _("uA"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -196,6 +203,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow bSizerDataFile = new wxBoxSizer( wxHORIZONTAL ); m_regulators_fileNameCtrl = new wxTextCtrl( m_panelRegulators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_regulators_fileNameCtrl->SetMaxLength( 0 ); bSizerDataFile->Add( m_regulators_fileNameCtrl, 1, wxBOTTOM|wxRIGHT|wxLEFT, 5 ); m_buttonDataFile = new wxButton( m_panelRegulators, wxID_ANY, _("Browse"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -264,6 +272,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerTWprms->Add( m_staticTextCurrent, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_TrackCurrentValue = new wxTextCtrl( m_panelTrackWidth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_TrackCurrentValue->SetMaxLength( 0 ); fgSizerTWprms->Add( m_TrackCurrentValue, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); m_staticText62 = new wxStaticText( m_panelTrackWidth, wxID_ANY, _("A"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -275,6 +284,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerTWprms->Add( m_staticText63, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_TrackDeltaTValue = new wxTextCtrl( m_panelTrackWidth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_TrackDeltaTValue->SetMaxLength( 0 ); fgSizerTWprms->Add( m_TrackDeltaTValue, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); m_staticText64 = new wxStaticText( m_panelTrackWidth, wxID_ANY, _("deg C"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -286,6 +296,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerTWprms->Add( m_staticText65, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT|wxLEFT, 5 ); m_TrackThicknessValue = new wxTextCtrl( m_panelTrackWidth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_TrackThicknessValue->SetMaxLength( 0 ); fgSizerTWprms->Add( m_TrackThicknessValue, 0, wxEXPAND|wxTOP|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); wxArrayString m_TW_CuThickness_choiceUnitChoices; @@ -298,6 +309,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerTWprms->Add( m_staticText66, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT|wxLEFT, 5 ); m_TrackLengthValue = new wxTextCtrl( m_panelTrackWidth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_TrackLengthValue->SetMaxLength( 0 ); fgSizerTWprms->Add( m_TrackLengthValue, 0, wxEXPAND|wxALL, 5 ); wxArrayString m_TW_CuLength_choiceUnitChoices; @@ -334,6 +346,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerTW_Results->Add( m_staticTextWidth, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_ExtTrackWidthValue = new wxTextCtrl( m_panelTrackWidth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_ExtTrackWidthValue->SetMaxLength( 0 ); fgSizerTW_Results->Add( m_ExtTrackWidthValue, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); wxArrayString m_TW_ExtTrackWidth_choiceUnitChoices; @@ -346,6 +359,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerTW_Results->Add( m_staticTextArea, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_ExtTrackAreaValue = new wxTextCtrl( m_panelTrackWidth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_ExtTrackAreaValue->SetMaxLength( 0 ); fgSizerTW_Results->Add( m_ExtTrackAreaValue, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); m_ExtTrackAreaUnitLabel = new wxStaticText( m_panelTrackWidth, wxID_ANY, _("mm ^ 2"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -357,6 +371,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerTW_Results->Add( m_staticText651, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT|wxLEFT, 5 ); m_ExtTrackResistValue = new wxTextCtrl( m_panelTrackWidth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_ExtTrackResistValue->SetMaxLength( 0 ); fgSizerTW_Results->Add( m_ExtTrackResistValue, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); m_staticText84 = new wxStaticText( m_panelTrackWidth, wxID_ANY, _("Ohm"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -368,6 +383,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerTW_Results->Add( m_staticText661, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT|wxLEFT, 5 ); m_ExtTrackVDropValue = new wxTextCtrl( m_panelTrackWidth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_ExtTrackVDropValue->SetMaxLength( 0 ); fgSizerTW_Results->Add( m_ExtTrackVDropValue, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); m_staticText83 = new wxStaticText( m_panelTrackWidth, wxID_ANY, _("Volt"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -379,6 +395,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerTW_Results->Add( m_staticText79, 0, wxRIGHT|wxLEFT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); m_ExtTrackLossValue = new wxTextCtrl( m_panelTrackWidth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_ExtTrackLossValue->SetMaxLength( 0 ); fgSizerTW_Results->Add( m_ExtTrackLossValue, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); m_staticText791 = new wxStaticText( m_panelTrackWidth, wxID_ANY, _("Watt"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -405,6 +422,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerTW_Results1->Add( m_staticTextWidth11, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 ); m_IntTrackWidthValue = new wxTextCtrl( m_panelTrackWidth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_IntTrackWidthValue->SetMaxLength( 0 ); fgSizerTW_Results1->Add( m_IntTrackWidthValue, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); wxArrayString m_TW_IntTrackWidth_choiceUnitChoices; @@ -417,6 +435,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerTW_Results1->Add( m_staticTextArea1, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_IntTrackAreaValue = new wxTextCtrl( m_panelTrackWidth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_IntTrackAreaValue->SetMaxLength( 0 ); fgSizerTW_Results1->Add( m_IntTrackAreaValue, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); m_IntTrackAreaUnitLabel = new wxStaticText( m_panelTrackWidth, wxID_ANY, _("mm ^ 2"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -428,6 +447,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerTW_Results1->Add( m_staticText6511, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT|wxLEFT, 5 ); m_IntTrackResistValue = new wxTextCtrl( m_panelTrackWidth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_IntTrackResistValue->SetMaxLength( 0 ); fgSizerTW_Results1->Add( m_IntTrackResistValue, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); m_staticText841 = new wxStaticText( m_panelTrackWidth, wxID_ANY, _("Ohm"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -439,6 +459,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerTW_Results1->Add( m_staticText6611, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT|wxLEFT, 5 ); m_IntTrackVDropValue = new wxTextCtrl( m_panelTrackWidth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_IntTrackVDropValue->SetMaxLength( 0 ); fgSizerTW_Results1->Add( m_IntTrackVDropValue, 0, wxALIGN_CENTER_VERTICAL|wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 ); m_staticText831 = new wxStaticText( m_panelTrackWidth, wxID_ANY, _("Volt"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -450,6 +471,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerTW_Results1->Add( m_staticText792, 0, wxRIGHT|wxLEFT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); m_IntTrackLossValue = new wxTextCtrl( m_panelTrackWidth, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_IntTrackLossValue->SetMaxLength( 0 ); fgSizerTW_Results1->Add( m_IntTrackLossValue, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); m_staticText7911 = new wxStaticText( m_panelTrackWidth, wxID_ANY, _("Watt"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -490,6 +512,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow bLeftSizerElectricalClearance->Add( m_staticText891, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_ElectricalSpacingVoltage = new wxTextCtrl( m_panelElectricalSpacing, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_ElectricalSpacingVoltage->SetMaxLength( 0 ); bLeftSizerElectricalClearance->Add( m_ElectricalSpacingVoltage, 0, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); m_buttonElectSpacingRefresh = new wxButton( m_panelElectricalSpacing, wxID_ANY, _("Update Values"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -602,6 +625,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerSubstPrms->Add( m_EpsilonR_label, 0, wxRIGHT|wxLEFT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); m_Value_EpsilonR = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Value_EpsilonR->SetMaxLength( 0 ); fgSizerSubstPrms->Add( m_Value_EpsilonR, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); m_button_EpsilonR = new wxButton( m_panelTransline, wxID_ANY, _("..."), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); @@ -612,6 +636,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerSubstPrms->Add( m_TanD_label, 0, wxRIGHT|wxLEFT|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); m_Value_TanD = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Value_TanD->SetMaxLength( 0 ); fgSizerSubstPrms->Add( m_Value_TanD, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); m_button_TanD = new wxButton( m_panelTransline, wxID_ANY, _("..."), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); @@ -624,6 +649,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerSubstPrms->Add( m_Rho_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_Value_Rho = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Value_Rho->SetMaxLength( 0 ); fgSizerSubstPrms->Add( m_Value_Rho, 0, wxEXPAND|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); m_button_Rho = new wxButton( m_panelTransline, wxID_ANY, _("..."), wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT ); @@ -634,6 +660,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerSubstPrms->Add( m_substrate_prm4_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_Substrate_prm4_Value = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Substrate_prm4_Value->SetMaxLength( 0 ); fgSizerSubstPrms->Add( m_Substrate_prm4_Value, 0, wxRIGHT|wxLEFT|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); wxArrayString m_SubsPrm4_choiceUnitChoices; @@ -646,6 +673,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerSubstPrms->Add( m_substrate_prm5_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_Substrate_prm5_Value = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Substrate_prm5_Value->SetMaxLength( 0 ); fgSizerSubstPrms->Add( m_Substrate_prm5_Value, 0, wxRIGHT|wxLEFT|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); wxArrayString m_SubsPrm5_choiceUnitChoices; @@ -658,6 +686,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerSubstPrms->Add( m_substrate_prm6_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_Substrate_prm6_Value = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Substrate_prm6_Value->SetMaxLength( 0 ); fgSizerSubstPrms->Add( m_Substrate_prm6_Value, 0, wxRIGHT|wxLEFT|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); wxArrayString m_SubsPrm6_choiceUnitChoices; @@ -670,6 +699,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerSubstPrms->Add( m_substrate_prm7_label, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT|wxLEFT, 5 ); m_Substrate_prm7_Value = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Substrate_prm7_Value->SetMaxLength( 0 ); fgSizerSubstPrms->Add( m_Substrate_prm7_Value, 0, wxRIGHT|wxLEFT|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); wxArrayString m_SubsPrm7_choiceUnitChoices; @@ -682,6 +712,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerSubstPrms->Add( m_substrate_prm8_label, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxRIGHT|wxLEFT, 5 ); m_Substrate_prm8_Value = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Substrate_prm8_Value->SetMaxLength( 0 ); fgSizerSubstPrms->Add( m_Substrate_prm8_Value, 0, wxEXPAND|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); wxArrayString m_SubsPrm8_choiceUnitChoices; @@ -694,6 +725,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerSubstPrms->Add( m_substrate_prm9_label, 0, wxALL|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_Substrate_prm9_Value = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Substrate_prm9_Value->SetMaxLength( 0 ); fgSizerSubstPrms->Add( m_Substrate_prm9_Value, 0, wxEXPAND|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); wxArrayString m_SubsPrm9_choiceUnitChoices; @@ -721,6 +753,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizeCmpPrms->Add( m_Frequency_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_Value_Frequency_Ctrl = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Value_Frequency_Ctrl->SetMaxLength( 0 ); fgSizeCmpPrms->Add( m_Value_Frequency_Ctrl, 0, wxRIGHT|wxLEFT|wxEXPAND|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5 ); wxArrayString m_choiceUnit_FrequencyChoices; @@ -757,6 +790,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerPhysPrms->Add( m_phys_prm1_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_Phys_prm1_Value = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Phys_prm1_Value->SetMaxLength( 0 ); fgSizerPhysPrms->Add( m_Phys_prm1_Value, 0, wxRIGHT|wxLEFT|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); wxArrayString m_choiceUnit_Param1Choices; @@ -772,6 +806,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerPhysPrms->Add( m_phys_prm2_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_Phys_prm2_Value = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Phys_prm2_Value->SetMaxLength( 0 ); fgSizerPhysPrms->Add( m_Phys_prm2_Value, 0, wxRIGHT|wxLEFT|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); wxArrayString m_choiceUnit_Param2Choices; @@ -787,6 +822,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerPhysPrms->Add( m_phys_prm3_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_Phys_prm3_Value = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Phys_prm3_Value->SetMaxLength( 0 ); fgSizerPhysPrms->Add( m_Phys_prm3_Value, 0, wxRIGHT|wxLEFT|wxEXPAND|wxALIGN_CENTER_VERTICAL, 5 ); wxArrayString m_choiceUnit_Param3Choices; @@ -844,6 +880,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerResults->Add( m_elec_prm1_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_Elec_prm1_Value = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Elec_prm1_Value->SetMaxLength( 0 ); fgSizerResults->Add( m_Elec_prm1_Value, 0, wxRIGHT|wxLEFT|wxEXPAND, 5 ); wxArrayString m_choiceUnit_ElecPrm1Choices; @@ -856,6 +893,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerResults->Add( m_elec_prm2_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_Elec_prm2_Value = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Elec_prm2_Value->SetMaxLength( 0 ); fgSizerResults->Add( m_Elec_prm2_Value, 0, wxEXPAND|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxLEFT, 5 ); wxArrayString m_choiceUnit_ElecPrm2Choices; @@ -868,6 +906,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerResults->Add( m_elec_prm3_label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT, 5 ); m_Elec_prm3_Value = new wxTextCtrl( m_panelTransline, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Elec_prm3_Value->SetMaxLength( 0 ); fgSizerResults->Add( m_Elec_prm3_Value, 0, wxEXPAND|wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); wxArrayString m_choiceUnit_ElecPrm3Choices; @@ -996,6 +1035,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerAttPrms->Add( m_attenuationLabel, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); m_AttValueCtrl = new wxTextCtrl( m_panelAttenuators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_AttValueCtrl->SetMaxLength( 0 ); fgSizerAttPrms->Add( m_AttValueCtrl, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_attUnit = new wxStaticText( m_panelAttenuators, wxID_ANY, _("dB"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -1007,6 +1047,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerAttPrms->Add( m_attenuationZinLabel, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); m_ZinValueCtrl = new wxTextCtrl( m_panelAttenuators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_ZinValueCtrl->SetMaxLength( 0 ); fgSizerAttPrms->Add( m_ZinValueCtrl, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_attZinUnit = new wxStaticText( m_panelAttenuators, wxID_ANY, _("Ohms"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -1018,6 +1059,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerAttPrms->Add( m_ZoutLabel, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); m_ZoutValueCtrl = new wxTextCtrl( m_panelAttenuators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_ZoutValueCtrl->SetMaxLength( 0 ); fgSizerAttPrms->Add( m_ZoutValueCtrl, 0, wxALL, 5 ); m_attZoutUnit = new wxStaticText( m_panelAttenuators, wxID_ANY, _("Ohms"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -1056,6 +1098,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerAttResults->Add( m_attenuatorR1Label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); m_Att_R1_Value = new wxTextCtrl( m_panelAttenuators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Att_R1_Value->SetMaxLength( 0 ); fgSizerAttResults->Add( m_Att_R1_Value, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_attR1Unit = new wxStaticText( m_panelAttenuators, wxID_ANY, _("Ohms"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -1067,6 +1110,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerAttResults->Add( m_attenuatorR2Label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); m_Att_R2_Value = new wxTextCtrl( m_panelAttenuators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Att_R2_Value->SetMaxLength( 0 ); fgSizerAttResults->Add( m_Att_R2_Value, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_attR2Unit1 = new wxStaticText( m_panelAttenuators, wxID_ANY, _("Ohms"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -1078,6 +1122,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow fgSizerAttResults->Add( m_attenuatorR3Label, 0, wxRIGHT|wxLEFT|wxALIGN_CENTER_VERTICAL, 5 ); m_Att_R3_Value = new wxTextCtrl( m_panelAttenuators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_Att_R3_Value->SetMaxLength( 0 ); fgSizerAttResults->Add( m_Att_R3_Value, 0, wxALL, 5 ); m_attR3Unit = new wxStaticText( m_panelAttenuators, wxID_ANY, _("Ohms"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -1095,6 +1140,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow bMiddleSizerAtt->Add( m_staticTextAttMsg, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_Attenuator_Messages = new wxTextCtrl( m_panelAttenuators, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE|wxTE_READONLY ); + m_Attenuator_Messages->SetMaxLength( 0 ); bMiddleSizerAtt->Add( m_Attenuator_Messages, 1, wxEXPAND|wxBOTTOM|wxRIGHT|wxLEFT, 5 ); diff --git a/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp b/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp index 3103035ae3..e583f509b3 100644 --- a/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp +++ b/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp @@ -25,62 +25,28 @@ 0 0 - 1 - 1 - 1 - 1 - 0 - - - - + wxAUI_MGR_DEFAULT - - 1 wxBOTH - 0 - 1 1 - 0 - Dock - 0 - Left 1 impl_virtual - 1 - 0 0 wxID_ANY - - 0 - - 0 - 1 PCB_CALCULATOR_FRAME_BASE - 1 - - - 1 - Resizable - 1 670,489 wxDEFAULT_FRAME_STYLE|wxRESIZE_BORDER Pcb Calculator - 0 - - wxFILTER_NONE - wxDefaultValidator - wxFULL_REPAINT_ON_RESIZE|wxTAB_TRAVERSAL @@ -121,59 +87,24 @@ - 1 - 1 - 1 - 1 - - - - - - - 1 - 0 - 1 1 - 0 - Dock - 0 - Left 1 - 1 - 0 0 wxID_ANY MyMenuBar - - 0 - - 0 - 1 m_menubar - 1 - - protected - 1 - Resizable - 1 - 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -202,59 +133,24 @@ - 1 - 1 - 1 - 1 - - - - - - - 1 - 0 - 1 1 - 0 - Dock - 0 - Left 1 1 - 1 - 0 0 wxID_ANY - - 0 - - 0 - 1 m_statusBar - 1 - - protected - 1 - Resizable - 1 wxST_SIZEGRIP - 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -341,10 +237,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -425,10 +317,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - wxTAB_TRAVERSAL @@ -541,10 +429,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -626,10 +510,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -736,10 +616,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -796,7 +672,7 @@ fgSizerRegParams wxFLEX_GROWMODE_SPECIFIED none - 5 + 6 0 5 @@ -940,10 +816,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -1118,10 +990,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -1293,10 +1161,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -1471,10 +1335,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -1646,10 +1506,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -1824,10 +1680,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -1921,10 +1773,6 @@ 0 The internal reference voltage of the regulator. Should not be 0. - - wxFILTER_NONE - wxDefaultValidator - @@ -2099,10 +1947,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -2196,10 +2040,6 @@ 0 For 3 terminal regulators only, the Adjust pin current. - - wxFILTER_NONE - wxDefaultValidator - @@ -2374,10 +2214,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -2471,10 +2307,6 @@ 0 Type of the regulator. There are 2 types: - regulators which have a dedicted sense pin for the voltage regulation. - 3 terminal pins. - - wxFILTER_NONE - wxDefaultValidator - @@ -2846,10 +2678,6 @@ 0 The name of the data file which stores known regulators parameters. - - wxFILTER_NONE - wxDefaultValidator - @@ -3400,10 +3228,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -3490,10 +3314,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - wxTAB_TRAVERSAL @@ -3591,10 +3411,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -3694,10 +3510,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -3872,10 +3684,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -3959,10 +3767,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -4137,10 +3941,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -4224,10 +4024,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -4490,10 +4286,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -4757,10 +4549,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - wxSIMPLE_BORDER @@ -4973,10 +4761,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -5239,10 +5023,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -5417,10 +5197,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -5504,10 +5280,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -5682,10 +5454,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -5769,10 +5537,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -5947,10 +5711,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -6034,10 +5794,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -6212,10 +5968,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -6331,10 +6083,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -6597,10 +6345,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -6775,10 +6519,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -6862,10 +6602,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -7040,10 +6776,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -7127,10 +6859,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -7305,10 +7033,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -7392,10 +7116,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -7570,10 +7290,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -7664,10 +7380,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - wxTAB_TRAVERSAL @@ -7849,10 +7561,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -7935,10 +7643,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -8212,10 +7916,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -8328,10 +8028,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -8446,10 +8142,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -8536,10 +8228,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - wxTAB_TRAVERSAL @@ -8722,10 +8410,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - wxTAB_TRAVERSAL @@ -8809,10 +8493,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -8932,10 +8612,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -9198,10 +8874,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -9464,10 +9136,6 @@ 0 Specific resistance in ohms * meters - - wxFILTER_NONE - wxDefaultValidator - @@ -9730,10 +9398,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -9996,10 +9660,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -10262,10 +9922,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -10528,10 +10184,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -10794,10 +10446,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -11060,10 +10708,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -11358,10 +11002,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -11676,10 +11316,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -12030,10 +11666,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -12384,10 +12016,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -12683,10 +12311,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -12944,10 +12568,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -13062,10 +12682,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -13328,10 +12944,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -13594,10 +13206,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -13892,10 +13500,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -13979,10 +13583,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -14066,10 +13666,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -14153,10 +13749,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -14240,10 +13832,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -14327,10 +13915,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -14414,10 +13998,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -14501,10 +14081,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -14588,10 +14164,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -14675,10 +14247,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -14762,10 +14330,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -14849,10 +14413,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -14936,10 +14496,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -15023,10 +14579,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -15117,10 +14669,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - wxTAB_TRAVERSAL @@ -15306,10 +14854,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - wxSIMPLE_BORDER|wxTAB_TRAVERSAL @@ -15431,10 +14975,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -15609,10 +15149,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -15696,10 +15232,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -15874,10 +15406,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -15961,10 +15489,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -16139,10 +15663,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -16326,10 +15846,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -16442,10 +15958,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -16620,10 +16132,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -16707,10 +16215,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -16885,10 +16389,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -16972,10 +16472,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -17150,10 +16646,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -17241,10 +16733,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -17431,10 +16919,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - wxSIMPLE_BORDER|wxTAB_TRAVERSAL @@ -17520,10 +17004,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - wxTAB_TRAVERSAL @@ -17715,10 +17195,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -17802,10 +17278,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -17889,10 +17361,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -17976,10 +17444,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -18063,10 +17527,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -18150,10 +17610,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -18236,10 +17692,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -18321,10 +17773,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -18406,10 +17854,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -18491,10 +17935,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -18576,10 +18016,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -18661,10 +18097,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -18750,10 +18182,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - wxTAB_TRAVERSAL @@ -18936,10 +18364,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -19052,10 +18476,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - @@ -19168,10 +18588,6 @@ 0 - - wxFILTER_NONE - wxDefaultValidator - wxTAB_TRAVERSAL diff --git a/pcb_calculator/dialogs/pcb_calculator_frame_base.h b/pcb_calculator/dialogs/pcb_calculator_frame_base.h index a4e7f80ae5..370750eb6a 100644 --- a/pcb_calculator/dialogs/pcb_calculator_frame_base.h +++ b/pcb_calculator/dialogs/pcb_calculator_frame_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Mar 17 2012) +// C++ code generated with wxFormBuilder (version Oct 8 2012) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -11,7 +11,11 @@ #include #include #include -#include "UnitSelector.h" +class UNIT_SELECTOR_ANGLE; +class UNIT_SELECTOR_FREQUENCY; +class UNIT_SELECTOR_LEN; +class UNIT_SELECTOR_RESISTOR; + #include #include #include diff --git a/pcbnew/kicad_plugin.cpp b/pcbnew/kicad_plugin.cpp index 0399a8a0a1..c63a6b65bd 100644 --- a/pcbnew/kicad_plugin.cpp +++ b/pcbnew/kicad_plugin.cpp @@ -1087,8 +1087,10 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const m_out->Print( 0, " (rect_delta %s )", FMT_IU( aPad->GetDelta() ).c_str() ); wxSize sz = aPad->GetDrillSize(); + wxPoint shapeoffset = aPad->GetOffset(); - if( (sz.GetWidth() > 0) || (sz.GetHeight() > 0) ) + if( (sz.GetWidth() > 0) || (sz.GetHeight() > 0) || + (shapeoffset.x > 0) || (shapeoffset.y > 0) ) { m_out->Print( 0, " (drill" ); @@ -1101,7 +1103,7 @@ void PCB_IO::format( D_PAD* aPad, int aNestLevel ) const if( sz.GetHeight() > 0 && sz.GetWidth() != sz.GetHeight() ) m_out->Print( 0, " %s", FMT_IU( sz.GetHeight() ).c_str() ); - if( (aPad->GetOffset().x != 0) || (aPad->GetOffset().y != 0) ) + if( (shapeoffset.x != 0) || (shapeoffset.y != 0) ) m_out->Print( 0, " (offset %s)", FMT_IU( aPad->GetOffset() ).c_str() ); m_out->Print( 0, ")" ); From 9c0c64e87b566f36f45a53a213026b0b3159765e Mon Sep 17 00:00:00 2001 From: Dick Hollenbeck Date: Wed, 10 Apr 2013 15:31:40 -0500 Subject: [PATCH 04/25] Make project templates work with KICAD_PTEMPLATES env var. --- kicad/dialogs/dialog_template_selector.cpp | 25 +++++++++++++--------- kicad/prjconfig.cpp | 22 +++++++++++++------ kicad/project_template.h | 2 +- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/kicad/dialogs/dialog_template_selector.cpp b/kicad/dialogs/dialog_template_selector.cpp index 800b36e2c1..ec8ef90c20 100644 --- a/kicad/dialogs/dialog_template_selector.cpp +++ b/kicad/dialogs/dialog_template_selector.cpp @@ -114,7 +114,7 @@ void TEMPLATE_WIDGET::OnMouse( wxMouseEvent& event ) void DIALOG_TEMPLATE_SELECTOR::onNotebookResize(wxSizeEvent& event) { - for ( size_t i=0; i < m_notebook->GetPageCount(); i++ ) + for( size_t i=0; i < m_notebook->GetPageCount(); i++ ) { m_panels[i]->SetSize( m_notebook->GetSize().GetWidth() - 6, 140 ); m_panels[i]->m_SizerBase->FitInside( m_panels[i] ); @@ -190,24 +190,29 @@ void DIALOG_TEMPLATE_SELECTOR::AddPage( const wxString& aTitle, wxFileName& aPat m_panels.push_back( p ); // Get a list of files under the template path to include as choices... - wxArrayString files; - wxDir dir, sub; + wxArrayString files; + wxDir dir; - if ( dir.Open( aPath.GetPath() ) ) + wxString path = aPath.GetFullPath(); // caller ensures this ends with file separator. + + if( dir.Open( path ) ) { - wxString filename; - bool cont = dir.GetFirst( &filename, wxEmptyString, wxDIR_FILES | wxDIR_DIRS ); + wxDir sub_dir; + wxString sub_name; + bool cont = dir.GetFirst( &sub_name, wxEmptyString, wxDIR_DIRS ); while( cont ) { - if( sub.Open( aPath.GetPathWithSep() + filename ) ) + wxString sub_full = path + sub_name; + if( sub_dir.Open( sub_full ) ) { - files.Add( filename ); - PROJECT_TEMPLATE* pt = new PROJECT_TEMPLATE( aPath.GetPathWithSep() + filename ); + files.Add( sub_name ); + + PROJECT_TEMPLATE* pt = new PROJECT_TEMPLATE( sub_full ); AddTemplate( m_notebook->GetPageCount() - 1, pt ); } - cont = dir.GetNext( &filename ); + cont = dir.GetNext( &sub_name ); } } } diff --git a/kicad/prjconfig.cpp b/kicad/prjconfig.cpp index 58ab903e17..b9fcd22dea 100644 --- a/kicad/prjconfig.cpp +++ b/kicad/prjconfig.cpp @@ -78,11 +78,12 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxString aPrjFullFileName, boo { wxString kicadEnv; wxGetEnv( wxT( "KICAD"), &kicadEnv ); - templatePath = kicadEnv + SEP() + wxT("template")+SEP(); + + templatePath = kicadEnv + SEP() + wxT("template") + SEP(); } else { - wxFileName templatePath = wxPathOnly(wxStandardPaths::Get().GetExecutablePath()) + + templatePath = wxPathOnly(wxStandardPaths::Get().GetExecutablePath()) + SEP() + wxT( ".." ) + SEP() + wxT( "share" ) + SEP() + wxT( "template" ) + SEP(); } @@ -97,13 +98,18 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxString aPrjFullFileName, boo // Check to see if a custom template location is available and setup a new selection tab // if there is wxString envStr; - wxGetEnv( wxT("KICAD_PTEMPLATES"), &envStr ); - wxFileName envPath = envStr; + wxGetEnv( wxT( "KICAD_PTEMPLATES" ), &envStr ); - if( envStr != wxEmptyString ) + if( envStr ) { + wxChar sep = SEP(); + + if( !envStr.EndsWith( &sep ) ) + envStr += sep; + wxFileName envPath = envStr; - ps->AddPage( _("Portable Templates"), envPath ); + + ps->AddPage( _( "Portable Templates" ), envPath ); } // Show the project template selector dialog @@ -236,7 +242,7 @@ void KICAD_MANAGER_FRAME::OnLoadProject( wxCommandEvent& event ) if( !m_ProjectFileName.FileExists() && !filename.IsSameAs( nameless_prj ) ) { wxString msg; - msg.Printf( _( "KiCad project file <%s> not found" ), + msg.Printf( _( "KiCad project file <%s> not found" ), GetChars( m_ProjectFileName.GetFullPath() ) ); DisplayError( this, msg ); @@ -256,6 +262,7 @@ void KICAD_MANAGER_FRAME::OnLoadProject( wxCommandEvent& event ) SetTitle( title ); UpdateFileHistory( m_ProjectFileName.GetFullPath() ); m_LeftWin->ReCreateTreePrj(); + #ifdef KICAD_USE_FILES_WATCHER // Rebuild the list of watched paths. // however this is possible only when the main loop event handler is running, @@ -263,6 +270,7 @@ void KICAD_MANAGER_FRAME::OnLoadProject( wxCommandEvent& event ) wxCommandEvent cmd( wxEVT_COMMAND_MENU_SELECTED, ID_INIT_WATCHED_PATHS ); wxPostEvent( this, cmd); #endif + wxString msg; msg.Format( _( "Working dir: <%s>\nProject: <%s>\n" ), GetChars( m_ProjectFileName.GetPath() ), diff --git a/kicad/project_template.h b/kicad/project_template.h index c97ba5e4ad..0014703ba9 100644 --- a/kicad/project_template.h +++ b/kicad/project_template.h @@ -96,7 +96,7 @@ wxStandardPaths::GetExecutableDir()/../share/template/ wxStandardPaths::GetUserDataDir()/templates/ - wxGetEnv(wxT("KICAD_TEMPLATES")) + wxGetEnv(wxT("KICAD_PTEMPLATES")) wxGetEnv(wxT("KICAD"))/template/ */ From 87f9452bbe6d2f31c91651ce5b3a47595f8b490c Mon Sep 17 00:00:00 2001 From: Dick Hollenbeck Date: Wed, 10 Apr 2013 16:06:49 -0500 Subject: [PATCH 05/25] 2.9 wx rat race --- kicad/prjconfig.cpp | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/kicad/prjconfig.cpp b/kicad/prjconfig.cpp index b9fcd22dea..419d8098ec 100644 --- a/kicad/prjconfig.cpp +++ b/kicad/prjconfig.cpp @@ -58,8 +58,9 @@ PARAM_CFG_ARRAY s_KicadManagerParams; void KICAD_MANAGER_FRAME::CreateNewProject( const wxString aPrjFullFileName, bool aTemplateSelector = false ) { - wxString filename; - wxFileName newProjectName = aPrjFullFileName; + wxString filename; + wxFileName newProjectName = aPrjFullFileName; + wxChar sep[2] = { SEP(), 0 }; // nul terminated separator wxChar string. ClearMsg(); @@ -71,40 +72,42 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxString aPrjFullFileName, boo { DIALOG_TEMPLATE_SELECTOR* ps = new DIALOG_TEMPLATE_SELECTOR( this ); - wxFileName templatePath; + wxFileName templatePath; + wxString envStr; + + wxGetEnv( wxT( "KICAD" ), &envStr ); // Add a new tab for system templates - if( ::wxGetEnv( wxT( "KICAD" ), NULL ) ) + if( !envStr.empty() ) { - wxString kicadEnv; - wxGetEnv( wxT( "KICAD"), &kicadEnv ); + // user may or may not have including terminating separator. + if( !envStr.EndsWith( sep ) ) + envStr += sep; - templatePath = kicadEnv + SEP() + wxT("template") + SEP(); + templatePath = envStr + wxT("template") + sep; } else { templatePath = wxPathOnly(wxStandardPaths::Get().GetExecutablePath()) + - SEP() + wxT( ".." ) + SEP() + wxT( "share" ) + SEP() + wxT( "template" ) + SEP(); + sep + wxT( ".." ) + sep + wxT( "share" ) + sep + wxT( "template" ) + sep; } ps->AddPage( _( "System Templates" ), templatePath ); // Add a new tab for user templates wxFileName userPath = wxStandardPaths::Get().GetDocumentsDir() + - SEP() + wxT( "kicad" ) + SEP() + wxT( "template" ) + SEP(); + sep + wxT( "kicad" ) + sep + wxT( "template" ) + sep; ps->AddPage( _( "User Templates" ), userPath ); - // Check to see if a custom template location is available and setup a new selection tab - // if there is - wxString envStr; + // Check to see if a custom template location is available and setup a + // new selection tab if there is. + envStr.clear(); wxGetEnv( wxT( "KICAD_PTEMPLATES" ), &envStr ); - if( envStr ) + if( !envStr.empty() ) { - wxChar sep = SEP(); - - if( !envStr.EndsWith( &sep ) ) + if( !envStr.EndsWith( sep ) ) envStr += sep; wxFileName envPath = envStr; From 27c4956046f4b21cd078c9c0d46f88c00acab1ed Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Thu, 11 Apr 2013 19:40:20 +0200 Subject: [PATCH 06/25] All: fix a minor issue in drawtext.cpp Pcbnew: load footprint from modview: Because modview allows user to choose the footprint library, the selected library is forced when the footprint is loaded. I am not sure this is 100% better, but this new behavior has some advantages, mainly in the footprint editor (you can load a footprint outside the selected library) --- common/drawtxt.cpp | 12 ++++++------ include/drawtxt.h | 13 ++++++++++++- pcbnew/loadcmp.cpp | 25 ++++++++++++++++++------- pcbnew/modview.cpp | 12 +++++++++--- pcbnew/modview_frame.h | 9 +++++---- 5 files changed, 50 insertions(+), 21 deletions(-) diff --git a/common/drawtxt.cpp b/common/drawtxt.cpp index 2031e96c69..26f4f5bbf7 100644 --- a/common/drawtxt.cpp +++ b/common/drawtxt.cpp @@ -389,7 +389,7 @@ void DrawGraphicText( EDA_DRAW_PANEL* aPanel, /* if a text size is too small, the text cannot be drawn, and it is drawn as a single * graphic line */ - if( aDC && ( aDC->LogicalToDeviceYRel( std::abs( aSize.y ) ) < MIN_TEXT_SIZE )) + if( aDC && ( aDC->LogicalToDeviceYRel( std::abs( aSize.y ) ) < MIN_DRAWABLE_TEXT_SIZE )) { // draw the text as a line always vertically centered wxPoint end( current_char_pos.x + dx, current_char_pos.y ); @@ -583,12 +583,12 @@ void DrawGraphicHaloText( EDA_DRAW_PANEL * aPanel, aColor2 = c; } - DrawGraphicText( aPanel, aDC, aPos, aColor1, aText, aOrient, aSize, - aH_justify, aV_justify, aWidth, aItalic, aBold, + DrawGraphicText( aPanel, aDC, aPos, aColor1, aText, aOrient, aSize, + aH_justify, aV_justify, aWidth, aItalic, aBold, aCallback, aPlotter ); - - DrawGraphicText( aPanel, aDC, aPos, aColor2, aText, aOrient, aSize, - aH_justify, aV_justify, aWidth / 4, aItalic, aBold, + + DrawGraphicText( aPanel, aDC, aPos, aColor2, aText, aOrient, aSize, + aH_justify, aV_justify, aWidth / 4, aItalic, aBold, aCallback, aPlotter ); } diff --git a/include/drawtxt.h b/include/drawtxt.h index 8750f08836..7ef8b7198e 100644 --- a/include/drawtxt.h +++ b/include/drawtxt.h @@ -10,9 +10,20 @@ #include #include // EDA_TEXT_HJUSTIFY_T and EDA_TEXT_VJUSTIFY_T -/// Minimum dimension in pixel for drawing text +/* Minimum dimension in pixel for drawing/no drawing a text + * used in Pcbnew to decide to draw (or not) some texts + * ( like net names on pads/tracks ) + * When a text height is smaller than MIN_TEXT_SIZE, + * it is not drawn by Pcbnew + */ #define MIN_TEXT_SIZE 5 +/* Absolute minimum dimension in pixel to draw a text as text or a line + * When a text height is smaller than MIN_DRAWABLE_TEXT_SIZE, + * it is drawn, but like a line by the draw text function +*/ +#define MIN_DRAWABLE_TEXT_SIZE 3 + class EDA_DRAW_PANEL; class PLOTTER; diff --git a/pcbnew/loadcmp.cpp b/pcbnew/loadcmp.cpp index 847d9a70ed..20ac9c0b74 100644 --- a/pcbnew/loadcmp.cpp +++ b/pcbnew/loadcmp.cpp @@ -132,7 +132,12 @@ wxString PCB_BASE_FRAME::SelectFootprintFromLibBrowser( void ) wxMilliSleep( 50 ); } - wxString fpname = viewer->GetSelectedFootprint(); + // Returnd the full fp name, i.e. the lib name and th fp name, + // separated by a '/' + // (/ is now an illegal char in fp names) + wxString fpname = viewer->GetSelectedLibraryFullName(); + fpname << wxT("/") << viewer->GetSelectedFootprint(); + viewer->Destroy(); return fpname; @@ -146,6 +151,7 @@ MODULE* PCB_BASE_FRAME::Load_Module_From_Library( const wxString& aLibrary, MODULE* module; wxPoint curspos = GetScreen()->GetCrossHairPosition(); wxString moduleName, keys; + wxString libName = aLibrary; bool allowWildSeach = true; static wxArrayString HistoryList; @@ -162,7 +168,12 @@ MODULE* PCB_BASE_FRAME::Load_Module_From_Library( const wxString& aLibrary, if( dlg.m_GetExtraFunction ) { - moduleName = SelectFootprintFromLibBrowser(); + // SelectFootprintFromLibBrowser() returns the + // "full" footprint name, i.e. + // / + wxString full_fpname = SelectFootprintFromLibBrowser(); + moduleName = full_fpname.AfterLast( '/' ); + libName = full_fpname.BeforeLast( '/' ); } else { @@ -179,7 +190,7 @@ MODULE* PCB_BASE_FRAME::Load_Module_From_Library( const wxString& aLibrary, { allowWildSeach = false; keys = moduleName; - moduleName = Select_1_Module_From_List( this, aLibrary, wxEmptyString, keys ); + moduleName = Select_1_Module_From_List( this, libName, wxEmptyString, keys ); if( moduleName.IsEmpty() ) // Cancel command { @@ -191,7 +202,7 @@ MODULE* PCB_BASE_FRAME::Load_Module_From_Library( const wxString& aLibrary, || ( moduleName.Contains( wxT( "*" ) ) ) ) // Selection wild card { allowWildSeach = false; - moduleName = Select_1_Module_From_List( this, aLibrary, moduleName, wxEmptyString ); + moduleName = Select_1_Module_From_List( this, libName, moduleName, wxEmptyString ); if( moduleName.IsEmpty() ) { @@ -200,7 +211,7 @@ MODULE* PCB_BASE_FRAME::Load_Module_From_Library( const wxString& aLibrary, } } - module = GetModuleLibrary( aLibrary, moduleName, false ); + module = GetModuleLibrary( libName, moduleName, false ); if( !module && allowWildSeach ) // Search with wild card { @@ -209,7 +220,7 @@ MODULE* PCB_BASE_FRAME::Load_Module_From_Library( const wxString& aLibrary, wxString wildname = wxChar( '*' ) + moduleName + wxChar( '*' ); moduleName = wildname; - moduleName = Select_1_Module_From_List( this, aLibrary, moduleName, wxEmptyString ); + moduleName = Select_1_Module_From_List( this, libName, moduleName, wxEmptyString ); if( moduleName.IsEmpty() ) { @@ -218,7 +229,7 @@ MODULE* PCB_BASE_FRAME::Load_Module_From_Library( const wxString& aLibrary, } else { - module = GetModuleLibrary( aLibrary, moduleName, true ); + module = GetModuleLibrary( libName, moduleName, true ); } } diff --git a/pcbnew/modview.cpp b/pcbnew/modview.cpp index 1f3548c02b..e366493cbc 100644 --- a/pcbnew/modview.cpp +++ b/pcbnew/modview.cpp @@ -87,7 +87,7 @@ void FOOTPRINT_VIEWER_FRAME::SelectCurrentLibrary( wxCommandEvent& event ) wxArrayString headers; headers.Add( wxT("Library") ); std::vector itemsToDisplay; - + // Conversion from wxArrayString to vector of ArrayString for( unsigned i = 0; i < g_LibraryNames.GetCount(); i++ ) { @@ -145,6 +145,13 @@ void FOOTPRINT_VIEWER_FRAME::SelectCurrentFootprint( wxCommandEvent& event ) } +const wxString FOOTPRINT_VIEWER_FRAME::GetSelectedLibraryFullName( void ) +{ + wxString fullname = m_libraryName + wxT(".") + LegacyFootprintLibPathExtension; + return fullname; +} + + /* Routine to view one selected library content. */ void FOOTPRINT_VIEWER_FRAME::SelectAndViewFootprint( int aMode ) { @@ -171,8 +178,7 @@ void FOOTPRINT_VIEWER_FRAME::SelectAndViewFootprint( int aMode ) SetCurItem( NULL ); // Delete the current footprint GetBoard()->m_Modules.DeleteAll(); - GetModuleLibrary( m_libraryName + wxT(".") + LegacyFootprintLibPathExtension, - m_footprintName, true ); + GetModuleLibrary( GetSelectedLibraryFullName(), m_footprintName, true ); Update3D_Frame(); } diff --git a/pcbnew/modview_frame.h b/pcbnew/modview_frame.h index 5704829522..4186a44b7c 100644 --- a/pcbnew/modview_frame.h +++ b/pcbnew/modview_frame.h @@ -58,10 +58,10 @@ private: wxString m_configPath; // subpath for configuration protected: - static wxString m_libraryName; // Current selected libary - static wxString m_footprintName; // Current selected footprint - static wxString m_selectedFootprintName; // When the viewer is used to select a footprint - // the selected footprint is here + static wxString m_libraryName; // Current selected libary + static wxString m_footprintName; // Current selected footprint + static wxString m_selectedFootprintName; // When the viewer is used to select a footprint + // the selected footprint is here public: FOOTPRINT_VIEWER_FRAME( PCB_BASE_FRAME* parent, wxSemaphore* semaphore = NULL, @@ -84,6 +84,7 @@ public: static FOOTPRINT_VIEWER_FRAME* GetActiveFootprintViewer(); wxString& GetSelectedFootprint( void ) const { return m_selectedFootprintName; } + const wxString GetSelectedLibraryFullName( void ); private: From c074c8c9d4672e0617b61e26b504e42040536e61 Mon Sep 17 00:00:00 2001 From: Dick Hollenbeck Date: Thu, 11 Apr 2013 13:00:36 -0500 Subject: [PATCH 07/25] revert text strings for clarity --- pcbnew/pcb_parser.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pcbnew/pcb_parser.cpp b/pcbnew/pcb_parser.cpp index 143d222442..c8a1229152 100644 --- a/pcbnew/pcb_parser.cpp +++ b/pcbnew/pcb_parser.cpp @@ -89,7 +89,7 @@ double PCB_PARSER::parseDouble() throw( IO_ERROR ) if( errno ) { wxString error; - error.Printf( _( "invalid floating point number in file: <%s>\nline: %d, offset: %d" ), + error.Printf( _( "invalid floating point number in\nfile: <%s>\nline: %d\noffset: %d" ), GetChars( CurSource() ), CurLineNumber(), CurOffset() ); THROW_IO_ERROR( error ); @@ -98,7 +98,7 @@ double PCB_PARSER::parseDouble() throw( IO_ERROR ) if( CurText() == tmp ) { wxString error; - error.Printf( _( "missing floating point number in file: <%s>\nline: %d, offset: %d" ), + error.Printf( _( "missing floating point number in\nfile: <%s>\nline: %d\noffset: %d" ), GetChars( CurSource() ), CurLineNumber(), CurOffset() ); THROW_IO_ERROR( error ); @@ -754,7 +754,7 @@ T PCB_PARSER::lookUpLayer( const M& aMap ) throw( PARSE_ERROR, IO_ERROR ) #endif wxString error = wxString::Format( - _( "Layer %s in file <%s> at line %d, position %d, was not defined in the layers section" ), + _( "Layer '%s' in file <%s> at line %d, position %d, was not defined in the layers section" ), GetChars( FROM_UTF8( CurText() ) ), GetChars( CurSource() ), CurLineNumber(), CurOffset() ); From 9422e37c4517ffff2d60e5f13c659a225f795ac2 Mon Sep 17 00:00:00 2001 From: Lorenzo Marcantonio Date: Thu, 11 Apr 2013 20:29:56 +0200 Subject: [PATCH 08/25] Set grid color for module editor and viewer (closes #1167884) Also removed EDA_DRAW_FRAME::OnGrid which was totally dead (empty and unused) --- common/drawframe.cpp | 5 ----- include/wxstruct.h | 1 - pcbnew/modedit.cpp | 7 +++++++ pcbnew/module_editor_frame.h | 2 ++ pcbnew/modview_frame.cpp | 7 +++++++ pcbnew/modview_frame.h | 1 + 6 files changed, 17 insertions(+), 6 deletions(-) diff --git a/common/drawframe.cpp b/common/drawframe.cpp index 9ce99459b2..33e9e038a5 100644 --- a/common/drawframe.cpp +++ b/common/drawframe.cpp @@ -489,11 +489,6 @@ void EDA_DRAW_FRAME::SetToolID( int aId, int aCursor, const wxString& aToolMsg ) } -void EDA_DRAW_FRAME::OnGrid( int grid_type ) -{ -} - - wxPoint EDA_DRAW_FRAME::GetGridPosition( const wxPoint& aPosition ) const { wxPoint pos = aPosition; diff --git a/include/wxstruct.h b/include/wxstruct.h index ad5230d8db..c381445daf 100644 --- a/include/wxstruct.h +++ b/include/wxstruct.h @@ -665,7 +665,6 @@ public: void OnEraseBackground( wxEraseEvent& SizeEvent ); virtual void OnZoom( wxCommandEvent& event ); - void OnGrid( int grid_type ); /** * Function RedrawScreen diff --git a/pcbnew/modedit.cpp b/pcbnew/modedit.cpp index 92c95cd170..91718e5915 100644 --- a/pcbnew/modedit.cpp +++ b/pcbnew/modedit.cpp @@ -30,6 +30,7 @@ #include #include #include +#include // Functions defined in block_module_editor, but used here @@ -877,3 +878,9 @@ void FOOTPRINT_EDIT_FRAME::OnVerticalToolbar( wxCommandEvent& aEvent ) SetToolID( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor(), wxEmptyString ); } } + +EDA_COLOR_T FOOTPRINT_EDIT_FRAME::GetGridColor() const +{ + return g_ColorsSettings.GetItemColor( GRID_VISIBLE ); +} + diff --git a/pcbnew/module_editor_frame.h b/pcbnew/module_editor_frame.h index 870d988e4c..fe51bfe96a 100644 --- a/pcbnew/module_editor_frame.h +++ b/pcbnew/module_editor_frame.h @@ -375,6 +375,8 @@ public: void Select_Active_Library(); + virtual EDA_COLOR_T GetGridColor( void ) const; + DECLARE_EVENT_TABLE() protected: diff --git a/pcbnew/modview_frame.cpp b/pcbnew/modview_frame.cpp index 2fe8229a9e..fe81b080e9 100644 --- a/pcbnew/modview_frame.cpp +++ b/pcbnew/modview_frame.cpp @@ -45,6 +45,7 @@ #include #include +#include /** @@ -697,3 +698,9 @@ void FOOTPRINT_VIEWER_FRAME::Update3D_Frame( bool aForceReloadFootprint ) m_Draw3DFrame->NewDisplay(); } } + +EDA_COLOR_T FOOTPRINT_VIEWER_FRAME::GetGridColor() const +{ + return g_ColorsSettings.GetItemColor( GRID_VISIBLE ); +} + diff --git a/pcbnew/modview_frame.h b/pcbnew/modview_frame.h index 4186a44b7c..b07a9002b7 100644 --- a/pcbnew/modview_frame.h +++ b/pcbnew/modview_frame.h @@ -86,6 +86,7 @@ public: wxString& GetSelectedFootprint( void ) const { return m_selectedFootprintName; } const wxString GetSelectedLibraryFullName( void ); + virtual EDA_COLOR_T GetGridColor( void ) const; private: void OnSize( wxSizeEvent& event ); From 3fa60aaed86d4f86a0a88bb5ec32d5d8c737912e Mon Sep 17 00:00:00 2001 From: Dick Hollenbeck Date: Thu, 11 Apr 2013 14:04:30 -0500 Subject: [PATCH 09/25] use lower case library names in *.pro & *.sch files, to match actual filenames in the template file set. Noticed on linux. --- .../boosterpack40.pro | 80 +++++++++---------- .../boosterpack40.sch | 4 +- .../boosterpack40_min.pro | 6 +- .../boosterpack40_min.sch | 4 +- 4 files changed, 47 insertions(+), 47 deletions(-) diff --git a/template/ti-stellaris-boosterpack40/boosterpack40.pro b/template/ti-stellaris-boosterpack40/boosterpack40.pro index e5acab5eeb..d2bacba234 100644 --- a/template/ti-stellaris-boosterpack40/boosterpack40.pro +++ b/template/ti-stellaris-boosterpack40/boosterpack40.pro @@ -1,6 +1,43 @@ -update=Thu 18 Oct 2012 09:23:23 PM PDT +update=Wed 10 Apr 2013 04:16:40 PM CDT +version=1 +last_client=eeschema +[cvpcb] +version=1 +NetIExt=net +[cvpcb/libraries] +EquName1=devcms +[pcbnew] +version=1 +LastNetListRead=boosterpack20.net +PadDrill=1.016 +PadSizeH=1.524 +PadSizeV=1.524 +PcbTextSizeV=1 +PcbTextSizeH=1 +PcbTextThickness=0.3 +ModuleTextSizeV=1 +ModuleTextSizeH=1 +ModuleTextSizeThickness=0.15 +SolderMaskClearance=0 +DrawSegmentWidth=0.2 +BoardOutlineThickness=0.15 +ModuleOutlineThickness=0.15 +[pcbnew/libraries] +LibDir= +LibName1=boosterpack20 +LibName2=sockets +LibName3=connect +LibName4=discret +LibName5=pin_array +LibName6=divers +LibName7=libcms +LibName8=display +LibName9=led +LibName10=dip_sockets +LibName11=pga_sockets +LibName12=valves +[general] version=1 -last_client=kicad [eeschema] version=1 LibDir= @@ -10,7 +47,7 @@ RptD_Y=100 RptLab=1 LabSize=60 [eeschema/libraries] -LibName1=BoosterPack +LibName1=boosterpack LibName2=power LibName3=device LibName4=transistors @@ -41,40 +78,3 @@ LibName28=opto LibName29=atmel LibName30=contrib LibName31=valves -[cvpcb] -version=1 -NetIExt=net -[cvpcb/libraries] -EquName1=devcms -[pcbnew] -version=1 -LastNetListRead=BoosterPack20.net -PadDrill=1.016 -PadSizeH=1.524 -PadSizeV=1.524 -PcbTextSizeV=1 -PcbTextSizeH=1 -PcbTextThickness=0.3 -ModuleTextSizeV=1 -ModuleTextSizeH=1 -ModuleTextSizeThickness=0.15 -SolderMaskClearance=0 -DrawSegmentWidth=0.2 -BoardOutlineThickness=0.15 -ModuleOutlineThickness=0.15 -[pcbnew/libraries] -LibDir= -LibName1=BoosterPack20 -LibName2=sockets -LibName3=connect -LibName4=discret -LibName5=pin_array -LibName6=divers -LibName7=libcms -LibName8=display -LibName9=led -LibName10=dip_sockets -LibName11=pga_sockets -LibName12=valves -[general] -version=1 diff --git a/template/ti-stellaris-boosterpack40/boosterpack40.sch b/template/ti-stellaris-boosterpack40/boosterpack40.sch index c4d54f665b..fdc14e37bc 100644 --- a/template/ti-stellaris-boosterpack40/boosterpack40.sch +++ b/template/ti-stellaris-boosterpack40/boosterpack40.sch @@ -1,5 +1,5 @@ EESchema Schematic File Version 2 date Thu 18 Oct 2012 10:04:05 PM PDT -LIBS:BoosterPack +LIBS:boosterpack LIBS:power LIBS:device LIBS:transistors @@ -30,7 +30,7 @@ LIBS:opto LIBS:atmel LIBS:contrib LIBS:valves -LIBS:BoosterPack40-cache +LIBS:boosterpack40-cache EELAYER 27 0 EELAYER END $Descr A4 11693 8268 diff --git a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.pro b/template/ti-stellaris-boosterpack40_min/boosterpack40_min.pro index 1800b36895..118f8ba7c0 100644 --- a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.pro +++ b/template/ti-stellaris-boosterpack40_min/boosterpack40_min.pro @@ -10,7 +10,7 @@ RptD_Y=100 RptLab=1 LabSize=60 [eeschema/libraries] -LibName1=BoosterPack +LibName1=boosterpack LibName2=power LibName3=device LibName4=transistors @@ -48,7 +48,7 @@ NetIExt=net EquName1=devcms [pcbnew] version=1 -LastNetListRead=BoosterPack20.net +LastNetListRead=boosterpack20.net PadDrill=1.016 PadSizeH=1.524 PadSizeV=1.524 @@ -64,7 +64,7 @@ BoardOutlineThickness=0.15 ModuleOutlineThickness=0.15 [pcbnew/libraries] LibDir= -LibName1=BoosterPack20 +LibName1=boosterpack20 LibName2=sockets LibName3=connect LibName4=discret diff --git a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.sch b/template/ti-stellaris-boosterpack40_min/boosterpack40_min.sch index 6c74c6cbe1..0877de70c7 100644 --- a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.sch +++ b/template/ti-stellaris-boosterpack40_min/boosterpack40_min.sch @@ -1,5 +1,5 @@ EESchema Schematic File Version 2 date Thu 18 Oct 2012 10:11:13 PM PDT -LIBS:BoosterPack +LIBS:boosterpack LIBS:power LIBS:device LIBS:transistors @@ -30,7 +30,7 @@ LIBS:opto LIBS:atmel LIBS:contrib LIBS:valves -LIBS:BoosterPack40_min-cache +LIBS:boosterpack40_min-cache EELAYER 27 0 EELAYER END $Descr A4 11693 8268 From 89a391d00119f91d308ac076dcb7797e0241bf5d Mon Sep 17 00:00:00 2001 From: Dick Hollenbeck Date: Sat, 13 Apr 2013 16:30:21 -0500 Subject: [PATCH 10/25] move project templates from source tree to library tree --- template/CMakeLists.txt | 14 - template/raspberrypi-gpio/meta/brd.png | Bin 57538 -> 0 bytes template/raspberrypi-gpio/meta/icon.png | Bin 5374 -> 0 bytes template/raspberrypi-gpio/meta/info.html | 25 -- .../raspberrypi-gpio-cache.lib | 76 ---- .../raspberrypi-gpio/raspberrypi-gpio.cmp | 10 - .../raspberrypi-gpio.kicad_pcb | 299 -------------- .../raspberrypi-gpio/raspberrypi-gpio.net | 35 -- .../raspberrypi-gpio/raspberrypi-gpio.pro | 145 ------- .../raspberrypi-gpio/raspberrypi-gpio.sch | 169 -------- .../raspberrypi-gpio/raspberrypi-gpio.stf | 1 - .../meta/board_stm32vl_discovery.png | Bin 283151 -> 0 bytes .../stm32f100-discovery-shield/meta/icon.png | Bin 4052 -> 0 bytes .../stm32f100-discovery-shield/meta/info.html | 21 - .../stm32f100-discovery-shield-cache.lib | 94 ----- .../stm32f100-discovery-shield.cmp | 24 -- .../stm32f100-discovery-shield.dcm | 13 - .../stm32f100-discovery-shield.kicad_pcb | 373 ------------------ .../stm32f100-discovery-shield.lib | 58 --- .../stm32f100-discovery-shield.mod | 276 ------------- .../stm32f100-discovery-shield.net | 80 ---- .../stm32f100-discovery-shield.pro | 81 ---- .../stm32f100-discovery-shield.sch | 368 ----------------- .../boosterpack.dcm | 3 - .../boosterpack.lib | 114 ------ .../boosterpack40-cache.lib | 132 ------- .../boosterpack40.cmp | 38 -- .../boosterpack40.mod | 160 -------- .../boosterpack40.net | 68 ---- .../boosterpack40.pro | 80 ---- .../boosterpack40.sch | 156 -------- .../boosterpack40_min.kicad_pcb | 344 ---------------- .../ti-stellaris-boosterpack40/meta/icon.png | Bin 12485 -> 0 bytes .../ti-stellaris-boosterpack40/meta/info.html | 22 -- .../meta/launchpad_standard40.png | Bin 143031 -> 0 bytes .../boosterpack.dcm | 3 - .../boosterpack.lib | 114 ------ .../boosterpack40_min-cache.lib | 119 ------ .../boosterpack40_min.cmp | 38 -- .../boosterpack40_min.kicad_pcb | 344 ---------------- .../boosterpack40_min.mod | 160 -------- .../boosterpack40_min.net | 58 --- .../boosterpack40_min.pro | 80 ---- .../boosterpack40_min.sch | 120 ------ .../meta/icon.png | Bin 12485 -> 0 bytes .../meta/info.html | 22 -- .../meta/launchpad_standard40.png | Bin 143031 -> 0 bytes 47 files changed, 4337 deletions(-) delete mode 100755 template/raspberrypi-gpio/meta/brd.png delete mode 100755 template/raspberrypi-gpio/meta/icon.png delete mode 100755 template/raspberrypi-gpio/meta/info.html delete mode 100755 template/raspberrypi-gpio/raspberrypi-gpio-cache.lib delete mode 100755 template/raspberrypi-gpio/raspberrypi-gpio.cmp delete mode 100755 template/raspberrypi-gpio/raspberrypi-gpio.kicad_pcb delete mode 100755 template/raspberrypi-gpio/raspberrypi-gpio.net delete mode 100755 template/raspberrypi-gpio/raspberrypi-gpio.pro delete mode 100755 template/raspberrypi-gpio/raspberrypi-gpio.sch delete mode 100755 template/raspberrypi-gpio/raspberrypi-gpio.stf delete mode 100644 template/stm32f100-discovery-shield/meta/board_stm32vl_discovery.png delete mode 100644 template/stm32f100-discovery-shield/meta/icon.png delete mode 100644 template/stm32f100-discovery-shield/meta/info.html delete mode 100644 template/stm32f100-discovery-shield/stm32f100-discovery-shield-cache.lib delete mode 100644 template/stm32f100-discovery-shield/stm32f100-discovery-shield.cmp delete mode 100644 template/stm32f100-discovery-shield/stm32f100-discovery-shield.dcm delete mode 100644 template/stm32f100-discovery-shield/stm32f100-discovery-shield.kicad_pcb delete mode 100644 template/stm32f100-discovery-shield/stm32f100-discovery-shield.lib delete mode 100644 template/stm32f100-discovery-shield/stm32f100-discovery-shield.mod delete mode 100644 template/stm32f100-discovery-shield/stm32f100-discovery-shield.net delete mode 100644 template/stm32f100-discovery-shield/stm32f100-discovery-shield.pro delete mode 100644 template/stm32f100-discovery-shield/stm32f100-discovery-shield.sch delete mode 100644 template/ti-stellaris-boosterpack40/boosterpack.dcm delete mode 100644 template/ti-stellaris-boosterpack40/boosterpack.lib delete mode 100644 template/ti-stellaris-boosterpack40/boosterpack40-cache.lib delete mode 100644 template/ti-stellaris-boosterpack40/boosterpack40.cmp delete mode 100644 template/ti-stellaris-boosterpack40/boosterpack40.mod delete mode 100644 template/ti-stellaris-boosterpack40/boosterpack40.net delete mode 100644 template/ti-stellaris-boosterpack40/boosterpack40.pro delete mode 100644 template/ti-stellaris-boosterpack40/boosterpack40.sch delete mode 100644 template/ti-stellaris-boosterpack40/boosterpack40_min.kicad_pcb delete mode 100644 template/ti-stellaris-boosterpack40/meta/icon.png delete mode 100644 template/ti-stellaris-boosterpack40/meta/info.html delete mode 100644 template/ti-stellaris-boosterpack40/meta/launchpad_standard40.png delete mode 100644 template/ti-stellaris-boosterpack40_min/boosterpack.dcm delete mode 100644 template/ti-stellaris-boosterpack40_min/boosterpack.lib delete mode 100644 template/ti-stellaris-boosterpack40_min/boosterpack40_min-cache.lib delete mode 100644 template/ti-stellaris-boosterpack40_min/boosterpack40_min.cmp delete mode 100644 template/ti-stellaris-boosterpack40_min/boosterpack40_min.kicad_pcb delete mode 100644 template/ti-stellaris-boosterpack40_min/boosterpack40_min.mod delete mode 100644 template/ti-stellaris-boosterpack40_min/boosterpack40_min.net delete mode 100644 template/ti-stellaris-boosterpack40_min/boosterpack40_min.pro delete mode 100644 template/ti-stellaris-boosterpack40_min/boosterpack40_min.sch delete mode 100644 template/ti-stellaris-boosterpack40_min/meta/icon.png delete mode 100644 template/ti-stellaris-boosterpack40_min/meta/info.html delete mode 100644 template/ti-stellaris-boosterpack40_min/meta/launchpad_standard40.png diff --git a/template/CMakeLists.txt b/template/CMakeLists.txt index 8701221d53..3461fe6934 100644 --- a/template/CMakeLists.txt +++ b/template/CMakeLists.txt @@ -2,17 +2,3 @@ install(FILES kicad.pro DESTINATION ${KICAD_TEMPLATE} COMPONENT resources) -# template_lst is a list of all templates. -set( template_lst - raspberrypi-gpio - stm32f100-discovery-shield - ti-stellaris-boosterpack40 - ti-stellaris-boosterpack40_min - ) - -foreach( tpl ${template_lst} ) - install( DIRECTORY ${tpl} - DESTINATION ${KICAD_TEMPLATE} - COMPONENT templates ) -endforeach() - diff --git a/template/raspberrypi-gpio/meta/brd.png b/template/raspberrypi-gpio/meta/brd.png deleted file mode 100755 index a8e140f7eac08de74f0862fef2bddfeb483c3af7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57538 zcma%jby$>J+wViCl+@5jhja-D2uO@HNSD&xB`r!Q9TL)^AT8a4N_U5pl%%vYoW*|Q zeAoHoT;J>q-3;TyGi$B;UcXusp{62#51RrTf}nef3bGmygd7AxNJW_F;2G-BFe&gC z`pakXve50_f7vac6TmZA&I)>N5QKC8?h6S@OD6|UVz?_RKgF2C!6!u%(@;tx08dfd zXz9AkI5{|2IJ$#xAxOs6;)T0~Ih~h{yEUD>qOzJfmjwm{(Lsu`Pqe&ecZ|GrwdAL6 zA6jfulT;$Vd-;Trk{q!>sja2PY1&?b#HfAuDDKta4_ol>RR438gEZ%>tz zeIo@IWkpsZ{@w>}; ztpE8l2vs=ztmTC`>9XmMj*rbD-Ip(Om#^8i3K4SAR6S5dVIiw_p4`37D)#4JDv(gn zc>)6iwTm>ECbOTQ94y@Z9?}7Cl7cf*7gSCd(?DI<7?R9x13j>2pW5B^O8f4lXOMkXow+KNqGmoI4R)5KOPYkn{FNaGFgumYF z`|$94nxLKY;i{tjY&8}h9$uk#DFsBw%8L23)*Qpzp6T4DIIw|^j<+R03!ag|qSCUJm8|`%t%fog=jY}O<*I6HKa7Za z?kF5KH8k{CD}NM98bL-zR=5%M*y^^HkdWX@3k$>OS^V;x12zEW!W8DYw{TrxQK(&P zAwWq<2`iNe!($Ab`D$TNy|iQsD^<^vW0b5x*piw%Xq6eJt~$*()x5>xQFwTGbCM{Q0Qw_*2 z4IRDL`sU__F)#%Ep0Vw<^;B6#q}&OT*%ZE+xk4%JxNdeQE~NEEt0(&;grW*=HkWb| zl4e%e&^-WhM>}o1=tO3-3-){p{MeS`BqP#Dl68i?XL$G|WD5oEFK2U2 zV34znsY|SG?Azddkn2AG)#BMErmkk1kVEgz&W^jad^A;D8H-(13z#|{h*L;NJItg& zqw?u{Qnp%pKE8M)Q?stIt6x}JGXFfEG_;c#yLvuLPj*+NYy@fh&vqcs zt?`IbgF2ONIb!vjj$Dl*+}wxf9K~!wAKNJ(#(V zg^79ftW6)rAI=PF?Sj|qk0CUddDzRJc7MQ!JpH$4wRsWhgO<( z#lM(EeS@s~()sGlg^`*0+s~f{yqPioTwF@AQ=ZoU4GtNXDIy3-n%s%-&HZi;DOcC8 z1h4O2fDnt=-*={eQ%CR;L+x%vz+=fs8!FPGud$nAhWVasG3BY-v_qLqnzUeyl1CCp z>7%F~#pi22(JvZ*f`Wm^c+R0+!U|rLR!IC5>ekXc*`7)sv7IbYJPdpLw#RxlQ*$=_ z-8(*oPWBcfh^IP=&Fu5(7o*b5YMl}IlB?sDWc zG&aUxfzFpS0!GYOKU52wi@m@^Ru;8KwSX#5LrR0K8xnm=le9&cJr=GmMh7qA4ZBCl zoM(fP#f6>Nj3jDAGJ#$&p9bc>*IMg>4XzFUDrk9~y-=#5FAqAx7jE{RSbfRDN~tJV zkcyci=p!l5DONg5XveAY5+_GMlZdAm^rEN=P;;vrHB<#ZpUu(wr*{

k9DNaWNin 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࿿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 diff --git a/template/raspberrypi-gpio/meta/icon.png b/template/raspberrypi-gpio/meta/icon.png deleted file mode 100755 index 5e5707e91e291952beec166168d0da52d529fe41..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5374 zcmVq+FSqt6pKkj zK~#9!-J5xoTveUNKli;?ud2GLyQ=ps-5o+gCm|3a3CLm~A_N=(5fnX)jE7;A0R#jQ zl%sQSJ1{7?A&LScG6)<|7-d+55FinQ%jW=Z|+^b#;14cRJyZ z`JL0JtKM?&{Vn&me1EqDQzISl0j0n!U^#FFuoajKlmY(*n7|vr1|S3U0&7gky&E!iA=lwthLz z9QOh}N|WyRVO<8JhAf{Ql=X{>Wl5bWPr0gE`U08^mKri#>2nSdMjY6$EHE%x=EPy{ z-wk{RffND^za|!4T}w7)b6|apWp_4_>bD6-4T7ZxR>CG&=A-51ULrI6{Qc*x%vx5; z`p4QqAdv{*`@nY!w!{O#E$X|NbxtX|2@5}0P3wj@b1y0<(QOfJ2oUSYkV`p~%?k3| z_1kIuXbHhmgAI>&kcrzMk1_H#r#J3$;1%F=z#jlHYiU%3t9&fEwhk+4qx&>8 zpTNmVgaF5p2u--3ZHXDukq#ugEcUJ*MAHTDKG8vHAm>@sw*cpG0x%A9-vStH%~07K zqOv)NbRe6y5ki1kj1WqW(v_)`byeXnc86bdbq%^-L(`G(KG7)@(~ZELfHvn7Wt?@> z45TBmEs5^a0C2Ldkw}R}! z!&^^4sxQm77kf$dWl{Tn?_{^Y;e5bq0BgvhaY+e=UyP~QaFxkv*VeJ;%>n*;+fEu! zFJbXDwG@^6@(g)FTL2U%%o*>eLIo3VW#{M-i&bhsj#*ap@v(AWl zJqnZ>genXim*oLq_hiH1;VfVq@Cd*=ziy*-Z5+)I9I99;C3evJ){y)DU~7h+9Yf4mQi7&K+ol9>J+Pldcb2nnYT&q!MbUf$+j2%R z?kYiI_%*DAgKbGK5U-nRZhtu11)K)VZruSupJnqOyV&t+|D*1)s8h31oot5;or1;CNJJ`E=5NpU0 zzz3@M+2=(?;6jBZG^#2zeWbQFX?z z6-aZOvW(k+9Y;$5-q!iwLJ-0X>EtXYU%-rxw}K`!%%vp_%=bqyG>rpRl2;OKyp!xE zJ3->6`vrziBa^TTJOR%DUj||YYuW}}tiT%+=vM1|TGcg2ln0DOp9fCOXJSHUPOg{= zUjUz9BO`6LWd`ZYxt4c&Q3W@a&E?#14VJXA)t=Uhs`ygr@$AVac&Mj^X9o9TBZ+Dz z^8yhxFeYVB!WSq>ff3tvHv!*N_byXd#&t@`4<5}ea4qnV5}y2*(&NQt zC5==W0g5#rx)3;0a%ac8{59Un<&j3dUA2&a(DIBQn)ho$Ab}N$c5ZB2%b7)$JW#uY zkY*r(Aty(-o#wSf2S4rkKsv+gzE_ph0KWxpRomcIU^`H)tYoi(=BDig=L0VRnkh6M ztUq0Rsq}cFnn^%25Q@3?G6US-^8sPq$Df;);UIC;z44MKDJ9K;2&KB8CkA%2AP{A? zzXVMPOrcR`_&GgT!Sdod@k0C{8EH!eoPMDG&Qy-jR_nYJI8hZxDWGjSVbG($0+>RR zkJO*Rh2c6Z$H^l>0ZnH|CdO@T>qtwRxeI2hQ+A)Qe z7gAO_oM1+HuIXHAjG*`GAAkzrap1ek<8M@c;yD!>Z<}r&0C0oys`9R?lf`L8l_Z^< zt5pPkP3O&I7uUA_orAd)02@<%tWEV0&?YuCuNVsJKK?woKY#u9_6676(Z~ZH25RP*#p0%lc?5($obgG?+Eg!J zZCgXXlPyfzcqx96d4UMEMlioc#Dc2ebUe9B&p6zbgdQMvx7u zK5;NNB!RGs3hRK^6v+B*)vLH$U7MB@oTI#M?G=$m@%`#ku%$#7f~<7->axMthGTUE5Q0N%S@%7sl`>Z5?itS^2CWa4?i5UfacaC`guJOfeP z1k6 z>yLOrXEE@)>N`wZ0B5NFnvCkEc&Pq#o@h9m+bd7ZKd>-R$|-@eaWVZv$w9Ip5XCRt zX={uiexXmu{D`dte7S5+{@SI*Gnns>@W;k;xTLtj>o+v3(5FpD00Gro3uqwjsX3L8 zhiXYUIgT^KL^K!fJ}p>5so|d#1Nk1fsu!kOh`3fDSr{y%!RPwBI$seEpbNndYEEHs zu-qH+Mish`SOAT{rvNUGG_gEfhpk*qNHYj%IvQ|NFp4APl)P@-$>lqi2`7h*oU{db z4)u(pN;iZlOLC;d5Q1OUpI-R*UDFZ3KYMfDQMrJ0K|*2(4b8=BDcAkTDS2E$Yc@$% zMUS|Xr7M@3v;}!qP-z54^&uT8Db-9ak2HFZe{nhjxDepXqDoP!n8tLnQ-CWJws^xwr>Zm*`ZO-+}ggLLC11|k#WXynb+8y z?x)3yyI6fDHsS=t81Kp>6+kyYTW)BShTC#OWYx6q40ZF)Q1^t|6GBiVbnfr@fZq>{ z-Lu?f#ksX@JsHPFA7?DL6n40;drSV>*32LjI8h-4J$AZ~@%=|CfQ0yXFD;;iVTf^4OAU@@hy=T4uwsiPr$3}kB*D~QkRt`0-gZmlMNpeOM>NOkqkLGmhFC-_!z0^HKnsz zUR*~+H_;HJog7;;F&^&Q&MqrKjS=L`qDnp;Y2ajk8DZU^-_G!MvWHg^ZM>E2WKcP` zkB4fwptz1Y74P3m_w)PyU3BC|!~55lH}mz16Uj)MxRd3hJ71IzQYd`j$|Ds(74SY# zIok~LY|}DIb(3H9w(!I5_a-PU1r39|2mdqfR?^`*BrUX|-kK@j&lQ4xwPCEF7&iYg@pWXjPq1SH*&QehL zwD5qmvV_ajz+#31E}H!jW|?8m30HG|xQ>vfvo_T`YJeNd=W<@S7Hfhsc|?{cC8fGa zOD4viY+}SB@2OeLSIXufl`}@caWl*iuf*Hwu``}RS5MRknQA%wOyQUFifajJ29~tR zN{6&#Q*QXVuB@4RYfc^Y^2Lz`GSZ$>s;eV7IaoU4`u%lF_^0A}vdBDQl+XU8!|9=l zQPBO-5({e?{qO$aV6Y2+(qCyaQxTr;O!ENMaz)rODwT^?!T{BT`9 z{T@r0D*N*$dirPz0M&g35SAP}_xGTy+bZUBZm2qceJa{7tTnuFSf-nNy<+}^aJrX| z6eg=jTL5cuPm8nDiYqi%jxt>-B{q^D)h@|jUzzO0m_oVa!e)|9={^9yRe2H>MqolK z62M+7>3tlSDkwS`0c2E8z?+FqcMBlKbz&h+=Z3Oo03Pbyo)^_*3LRYt4p>Q6BswV8 zd|X!2h;et=#(!)uB5akc6RVOh8apU~KsO>$rN7JTEJ?<-{9 zCp2PCmYdtxx^P!X!-QuBq?GuD#>??GF9LvjFyg2S0N`&xuZ@(C_wOd*V87N$&3rsk?9B-q`P9uT0hq_sp>ZZX6;nOr6DaonYqR+N? zE`ETo9$Z7GJ)G-*Celcg86H#fUS)Vk#|E}!2EDBMF5sPG)foc!puu8b&b>YF%Pu=5 zZmF2>_VEh#sgx2+I(gK_qcualtQlHGy-`GsFMv z8qtMdM<&kOLtTZ(V;rUV3z^1G=8p7~SQ+k5;l2zsF#L<5QFKFDGnYmhm}8c>M`cul z!+Sv}?HXuwgJYKgR_!aOw+@2sGwg3tR@lyq(%R|S!zPy=R%IA%0 zn2v`VdSUdw?k)UoVArAHUf>>syBhZlV1lDS+BDzqQ~3MUKvx0t5|I0>#H13Td`$uL z*%{t+VJ~?IKJi;%9_}fSqr&`D!r#nuijGjzAZJ z7vl%{Ugu`IhI4^m40NHDgCF36!RpOp1&HpA?g)ceI_r18s@dW>mNXKne|5!Q7v3>>qKJaf! cU>_>|AGHKMjjF~$wg3PC07*qoM6N<$g4pILxc~qF diff --git a/template/raspberrypi-gpio/meta/info.html b/template/raspberrypi-gpio/meta/info.html deleted file mode 100755 index f641c66cba..0000000000 --- a/template/raspberrypi-gpio/meta/info.html +++ /dev/null @@ -1,25 +0,0 @@ - - -Raspberry Pi - Expansion Board - - -

Raspberry Pi

-

Expansion Board

- -

This project template is the basis of an expansion board for the -Raspberry Pi $25 ARM -board.

- -

This base project includes a PCB edge defined as the same size as the -Raspberry-Pi PCB with the connectors placed correctly to align the two boards. -All IO present on the Raspberry-Pi board is connected to the project through the -0.1" expansion headers.

- -

The board outline looks like the following:

- -

- -

(c)2012 Brian Sidebotham
-(c)2012 Kicad Developers

- - diff --git a/template/raspberrypi-gpio/raspberrypi-gpio-cache.lib b/template/raspberrypi-gpio/raspberrypi-gpio-cache.lib deleted file mode 100755 index e5e7f0c50d..0000000000 --- a/template/raspberrypi-gpio/raspberrypi-gpio-cache.lib +++ /dev/null @@ -1,76 +0,0 @@ -EESchema-LIBRARY Version 2.3 Date: 15/11/2012 21:22:43 -#encoding utf-8 -# -# +3.3V -# -DEF +3.3V #PWR 0 0 Y Y 1 F P -F0 "#PWR" 0 -40 30 H I C CNN -F1 "+3.3V" 0 110 30 H V C CNN -ALIAS +3,3V -DRAW -X +3.3V 1 0 0 0 U 30 30 0 0 W N -C 0 60 20 0 1 0 N -P 3 0 1 0 0 0 0 40 0 40 N -ENDDRAW -ENDDEF -# -# +5V -# -DEF +5V #PWR 0 40 Y Y 1 F P -F0 "#PWR" 0 90 20 H I C CNN -F1 "+5V" 0 90 30 H V C CNN -DRAW -X +5V 1 0 0 0 U 20 20 0 0 W N -C 0 50 20 0 1 0 N -P 4 0 1 0 0 0 0 30 0 30 0 30 N -ENDDRAW -ENDDEF -# -# CONN_13X2 -# -DEF CONN_13X2 P 0 10 Y N 1 F N -F0 "P" 0 700 60 H V C CNN -F1 "CONN_13X2" 0 0 50 V V C CNN -DRAW -S -100 650 100 -650 0 1 0 N -X P1 1 -400 600 300 R 40 30 1 1 P I -X P2 2 400 600 300 L 40 30 1 1 P I -X P3 3 -400 500 300 R 40 30 1 1 P I -X P4 4 400 500 300 L 40 30 1 1 P I -X P5 5 -400 400 300 R 40 30 1 1 P I -X P6 6 400 400 300 L 40 30 1 1 P I -X P7 7 -400 300 300 R 40 30 1 1 P I -X P8 8 400 300 300 L 40 30 1 1 P I -X P9 9 -400 200 300 R 40 30 1 1 P I -X P10 10 400 200 300 L 40 30 1 1 P I -X P20 20 400 -300 300 L 40 30 1 1 P I -X P11 11 -400 100 300 R 40 30 1 1 P I -X P21 21 -400 -400 300 R 40 30 1 1 P I -X P12 12 400 100 300 L 40 30 1 1 P I -X P22 22 400 -400 300 L 40 30 1 1 P I -X P13 13 -400 0 300 R 40 30 1 1 P I -X P23 23 -400 -500 300 R 40 30 1 1 P I -X P14 14 400 0 300 L 40 30 1 1 P I -X P20 24 400 -500 300 L 40 30 1 1 P I -X P15 15 -400 -100 300 R 40 30 1 1 P I -X P24 25 -400 -600 300 R 40 30 1 1 P I -X P16 16 400 -100 300 L 40 30 1 1 P I -X P22 26 400 -600 300 L 40 30 1 1 P I -X P17 17 -400 -200 300 R 40 30 1 1 P I -X P18 18 400 -200 300 L 40 30 1 1 P I -X P19 19 -400 -300 300 R 40 30 1 1 P I -ENDDRAW -ENDDEF -# -# GND -# -DEF ~GND #PWR 0 0 Y Y 1 F P -F0 "#PWR" 0 0 30 H I C CNN -F1 "GND" 0 -70 30 H I C CNN -DRAW -P 4 0 1 0 -50 0 0 -50 50 0 -50 0 N -X GND 1 0 0 0 U 30 30 1 1 W N -ENDDRAW -ENDDEF -# -#End Library diff --git a/template/raspberrypi-gpio/raspberrypi-gpio.cmp b/template/raspberrypi-gpio/raspberrypi-gpio.cmp deleted file mode 100755 index ade211347a..0000000000 --- a/template/raspberrypi-gpio/raspberrypi-gpio.cmp +++ /dev/null @@ -1,10 +0,0 @@ -Cmp-Mod V01 Created by CvPcb (2012-11-15 BZR 3804)-testing date = 15/11/2012 21:23:25 - -BeginCmp -TimeStamp = /50A55ABA; -Reference = P1; -ValeurCmp = CONN_13X2; -IdModule = pin_array_13x2; -EndCmp - -EndListe diff --git a/template/raspberrypi-gpio/raspberrypi-gpio.kicad_pcb b/template/raspberrypi-gpio/raspberrypi-gpio.kicad_pcb deleted file mode 100755 index ae9499ce13..0000000000 --- a/template/raspberrypi-gpio/raspberrypi-gpio.kicad_pcb +++ /dev/null @@ -1,299 +0,0 @@ -(kicad_pcb (version 3) (host pcbnew "(2012-11-30 BZR 3829)-testing") - - (general - (links 0) - (no_connects 0) - (area 127.606667 112.000001 242.964763 190.8) - (thickness 1.6) - (drawings 41) - (tracks 0) - (zones 0) - (modules 1) - (nets 4) - ) - - (page A3) - (title_block - (date "15 nov 2012") - ) - - (layers - (15 F.Cu signal) - (0 B.Cu signal) - (16 B.Adhes user) - (17 F.Adhes user) - (18 B.Paste user) - (19 F.Paste user) - (20 B.SilkS user) - (21 F.SilkS user) - (22 B.Mask user) - (23 F.Mask user) - (24 Dwgs.User user) - (25 Cmts.User user) - (26 Eco1.User user) - (27 Eco2.User user) - (28 Edge.Cuts user) - ) - - (setup - (last_trace_width 0.2) - (trace_clearance 0.2) - (zone_clearance 0.508) - (zone_45_only no) - (trace_min 0.1524) - (segment_width 0.2) - (edge_width 0.15) - (via_size 0.9) - (via_drill 0.6) - (via_min_size 0.8) - (via_min_drill 0.5) - (uvia_size 0.5) - (uvia_drill 0.1) - (uvias_allowed no) - (uvia_min_size 0.5) - (uvia_min_drill 0.1) - (pcb_text_width 0.3) - (pcb_text_size 1 1) - (mod_edge_width 0.15) - (mod_text_size 1 1) - (mod_text_width 0.15) - (pad_size 1 1) - (pad_drill 0.6) - (pad_to_mask_clearance 0) - (aux_axis_origin 143.5 181) - (visible_elements 7FFFFFFF) - (pcbplotparams - (layerselection 3178497) - (usegerberextensions true) - (excludeedgelayer true) - (linewidth 152400) - (plotframeref false) - (viasonmask false) - (mode 1) - (useauxorigin false) - (hpglpennumber 1) - (hpglpenspeed 20) - (hpglpendiameter 15) - (hpglpenoverlay 2) - (psnegative false) - (psa4output false) - (plotreference true) - (plotvalue true) - (plotothertext true) - (plotinvisibletext false) - (padsonsilk false) - (subtractmaskfromsilk false) - (outputformat 1) - (mirror false) - (drillshape 1) - (scaleselection 1) - (outputdirectory "")) - ) - - (net 0 "") - (net 1 +3.3V) - (net 2 +5V) - (net 3 GND) - - (net_class Default "This is the default net class." - (clearance 0.2) - (trace_width 0.2) - (via_dia 0.9) - (via_drill 0.6) - (uvia_dia 0.5) - (uvia_drill 0.1) - (add_net "") - (add_net +3.3V) - (add_net +5V) - (add_net GND) - ) - - (net_class Power "" - (clearance 0.2) - (trace_width 0.5) - (via_dia 1) - (via_drill 0.7) - (uvia_dia 0.5) - (uvia_drill 0.1) - ) - - (module pin_array_13x2 (layer F.Cu) (tedit 50A55E7A) (tstamp 50A55DA3) - (at 161 129) - (descr "Double rangee de contacts 2 x 12 pins") - (tags CONN) - (path /50A55ABA) - (fp_text reference P1 (at -15.5 4) (layer F.SilkS) - (effects (font (size 1.016 1.016) (thickness 0.2032))) - ) - (fp_text value CONN_13X2 (at 12 4) (layer F.SilkS) - (effects (font (size 1.016 1.016) (thickness 0.2032))) - ) - (fp_line (start -16.51 2.54) (end 16.51 2.54) (layer F.SilkS) (width 0.2032)) - (fp_line (start 16.51 -2.54) (end -16.51 -2.54) (layer F.SilkS) (width 0.2032)) - (fp_line (start -16.51 -2.54) (end -16.51 2.54) (layer F.SilkS) (width 0.2032)) - (fp_line (start 16.51 2.54) (end 16.51 -2.54) (layer F.SilkS) (width 0.2032)) - (pad 1 thru_hole rect (at -15.24 1.27) (size 1.524 1.524) (drill 0.8128) - (layers *.Cu *.Mask F.SilkS) - (net 1 +3.3V) - ) - (pad 2 thru_hole circle (at -15.24 -1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - (net 2 +5V) - ) - (pad 3 thru_hole circle (at -12.7 1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 4 thru_hole circle (at -12.7 -1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 5 thru_hole circle (at -10.16 1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 6 thru_hole circle (at -10.16 -1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - (net 3 GND) - ) - (pad 7 thru_hole circle (at -7.62 1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 8 thru_hole circle (at -7.62 -1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 9 thru_hole circle (at -5.08 1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 10 thru_hole circle (at -5.08 -1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 11 thru_hole circle (at -2.54 1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 12 thru_hole circle (at -2.54 -1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 13 thru_hole circle (at 0 1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 14 thru_hole circle (at 0 -1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 15 thru_hole circle (at 2.54 1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 16 thru_hole circle (at 2.54 -1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 17 thru_hole circle (at 5.08 1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 18 thru_hole circle (at 5.08 -1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 19 thru_hole circle (at 7.62 1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 20 thru_hole circle (at 7.62 -1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 21 thru_hole circle (at 10.16 1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 22 thru_hole circle (at 10.16 -1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 23 thru_hole circle (at 12.7 1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 24 thru_hole circle (at 12.7 -1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 25 thru_hole circle (at 15.24 1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (pad 26 thru_hole circle (at 15.24 -1.27) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask F.SilkS) - ) - (model pin_array/pins_array_13x2.wrl - (at (xyz 0 0 0)) - (scale (xyz 1 1 1)) - (rotate (xyz 0 0 0)) - ) - ) - - (gr_text "RASPBERRY-PI ADDON BOARD\nVIEW FROM TOP\nNOTE: P1 SHOULD BE FITTED ON THE REVERSE OF THE BOARD" (at 144 183.5) (layer Dwgs.User) - (effects (font (size 2 1.7) (thickness 0.12)) (justify left)) - ) - (dimension 56 (width 0.12) (layer Dwgs.User) - (gr_text "56.000 mm" (at 132 153 90) (layer Dwgs.User) - (effects (font (size 1 1) (thickness 0.12))) - ) - (feature1 (pts (xy 143.5 125) (xy 131 125))) - (feature2 (pts (xy 143.5 181) (xy 131 181))) - (crossbar (pts (xy 133 181) (xy 133 125))) - (arrow1a (pts (xy 133 125) (xy 133.58642 126.126503))) - (arrow1b (pts (xy 133 125) (xy 132.41358 126.126503))) - (arrow2a (pts (xy 133 181) (xy 133.58642 179.873497))) - (arrow2b (pts (xy 133 181) (xy 132.41358 179.873497))) - ) - (dimension 85 (width 0.12) (layer Dwgs.User) - (gr_text "85.000 mm" (at 186 113.000001) (layer Dwgs.User) - (effects (font (size 1 1) (thickness 0.12))) - ) - (feature1 (pts (xy 228.5 125) (xy 228.5 112.000001))) - (feature2 (pts (xy 143.5 125) (xy 143.5 112.000001))) - (crossbar (pts (xy 143.5 114.000001) (xy 228.5 114.000001))) - (arrow1a (pts (xy 228.5 114.000001) (xy 227.373497 114.586421))) - (arrow1b (pts (xy 228.5 114.000001) (xy 227.373497 113.413581))) - (arrow2a (pts (xy 143.5 114.000001) (xy 144.626503 114.586421))) - (arrow2b (pts (xy 143.5 114.000001) (xy 144.626503 113.413581))) - ) - (gr_text "RCA\nREMOVE WITH\nSTD HEADERS\n!NO TH ABOVE!" (at 188.5 118) (layer Dwgs.User) - (effects (font (size 1 1) (thickness 0.12))) - ) - (gr_text "1/8\" JACK\nOK WITH STD\nHEADERS\n!NO TH ABOVE!" (at 207.5 118) (layer Dwgs.User) - (effects (font (size 1 1) (thickness 0.12))) - ) - (gr_line (start 228.5 142) (end 228.5 125) (angle 90) (layer Edge.Cuts) (width 0.15)) - (gr_line (start 217.5 142) (end 228.5 142) (angle 90) (layer Edge.Cuts) (width 0.15)) - (gr_line (start 217.5 157) (end 217.5 142) (angle 90) (layer Edge.Cuts) (width 0.15)) - (gr_line (start 228.5 157) (end 217.5 157) (angle 90) (layer Edge.Cuts) (width 0.15)) - (gr_line (start 228.5 181) (end 228.5 157) (angle 90) (layer Edge.Cuts) (width 0.15)) - (gr_text "DOUBLE USB\nCUTOUT FOR ALL\nBOARDS" (at 236.5 149) (layer Dwgs.User) - (effects (font (size 1 1) (thickness 0.12))) - ) - (gr_text "RJ45\nCUTOUT FOR STD\nHEADERS\n!NO TH ABOVE!" (at 236.5 170) (layer Dwgs.User) - (effects (font (size 1 1) (thickness 0.12))) - ) - (gr_line (start 207.5 181) (end 228.5 162) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 207.5 162) (end 228.5 181) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 207.5 162) (end 228.5 162) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 207.5 181) (end 207.5 162) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 228.5 181) (end 207.5 181) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 228.5 162) (end 228.5 181) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 217.5 157) (end 228.5 142) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 217.5 142) (end 228.5 157) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 217.5 142) (end 228.5 142) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 217.5 157) (end 217.5 142) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 228.5 157) (end 217.5 157) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 228.5 142) (end 228.5 157) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 182.5 125) (end 194.5 139) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 182.5 139) (end 194.5 125) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 194.5 139) (end 194.5 138) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 182.5 139) (end 194.5 139) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 182.5 138) (end 182.5 139) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 214.5 125) (end 200.5 138) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 200.5 125) (end 214.5 138) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 200.5 138) (end 200.5 125) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 214.5 138) (end 200.5 138) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 214.5 125) (end 214.5 138) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 200.5 125) (end 214.5 125) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 194.5 125) (end 182.5 125) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 194.5 138) (end 194.5 125) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 182.5 125) (end 182.5 138) (angle 90) (layer Dwgs.User) (width 0.2)) - (gr_line (start 228.5 125) (end 143.5 125) (angle 90) (layer Edge.Cuts) (width 0.15)) - (gr_line (start 143.5 181) (end 228.5 181) (angle 90) (layer Edge.Cuts) (width 0.15)) - (gr_line (start 143.5 125) (end 143.5 181) (angle 90) (layer Edge.Cuts) (width 0.15)) - - - -) diff --git a/template/raspberrypi-gpio/raspberrypi-gpio.net b/template/raspberrypi-gpio/raspberrypi-gpio.net deleted file mode 100755 index ff5df3ec63..0000000000 --- a/template/raspberrypi-gpio/raspberrypi-gpio.net +++ /dev/null @@ -1,35 +0,0 @@ -# EESchema Netlist Version 1.1 created 15/11/2012 21:22:35 -( - ( /50A55ABA $noname P1 CONN_13X2 {Lib=CONN_13X2} - ( 1 +3.3V ) - ( 2 +5V ) - ( 3 ? ) - ( 4 ? ) - ( 5 ? ) - ( 6 GND ) - ( 7 ? ) - ( 8 ? ) - ( 9 ? ) - ( 10 ? ) - ( 11 ? ) - ( 12 ? ) - ( 13 ? ) - ( 14 ? ) - ( 15 ? ) - ( 16 ? ) - ( 17 ? ) - ( 18 ? ) - ( 19 ? ) - ( 20 ? ) - ( 21 ? ) - ( 22 ? ) - ( 23 ? ) - ( 24 ? ) - ( 25 ? ) - ( 26 ? ) - ) -) -* -{ Pin List by Nets -} -#End diff --git a/template/raspberrypi-gpio/raspberrypi-gpio.pro b/template/raspberrypi-gpio/raspberrypi-gpio.pro deleted file mode 100755 index 93c40c4f7d..0000000000 --- a/template/raspberrypi-gpio/raspberrypi-gpio.pro +++ /dev/null @@ -1,145 +0,0 @@ -update=15/11/2012 21:11:59 -version=1 -last_client=kicad -[cvpcb] -version=1 -NetITyp=0 -NetIExt=.net -PkgIExt=.pkg -NetDir= -LibDir= -NetType=0 -[cvpcb/libraries] -EquName1=devcms -[pcbnew] -version=1 -PadDrlX=320 -PadDimH=600 -PadDimV=600 -PadForm=1 -PadMask=14745599 -ViaDiam=450 -ViaDril=250 -Isol=60 -Countlayer=2 -Lpiste=170 -RouteTo=15 -RouteBo=0 -TypeVia=3 -Segm45=1 -Racc45=1 -Unite=0 -SegFill=1 -SegAffG=0 -NewAffG=1 -PadFill=1 -PadAffG=1 -PadSNum=1 -ModAffC=0 -ModAffT=0 -PcbAffT=0 -SgPcb45=1 -TxtPcbV=800 -TxtPcbH=600 -TxtModV=600 -TxtModH=600 -TxtModW=120 -HPGLnum=1 -HPGdiam=15 -HPGLSpd=20 -HPGLrec=2 -HPGLorg=0 -GERBmin=15 -VEgarde=100 -DrawLar=150 -EdgeLar=150 -TxtLar=120 -MSegLar=150 -ForPlot=1 -WpenSer=10 -UserGrX=0,01 -UserGrY=0,01 -UserGrU=1 -DivGrPc=1 -TimeOut=600 -MaxLnkS=3 -ShowRat=0 -ShowMRa=1 -[pcbnew/libraries] -LibDir= -LibName1=sockets -LibName2=connect -LibName3=discret -LibName4=pin_array -LibName5=divers -LibName6=libcms -LibName7=display -LibName8=valves -LibName9=led -LibName10=dip_sockets -[eeschema] -version=1 -LibDir= -NetFmt=1 -HPGLSpd=20 -HPGLDm=15 -HPGLNum=1 -offX_A4=0 -offY_A4=0 -offX_A3=0 -offY_A3=0 -offX_A2=0 -offY_A2=0 -offX_A1=0 -offY_A1=0 -offX_A0=0 -offY_A0=0 -offX_A=0 -offY_A=0 -offX_B=0 -offY_B=0 -offX_C=0 -offY_C=0 -offX_D=0 -offY_D=0 -offX_E=0 -offY_E=0 -RptD_X=0 -RptD_Y=100 -RptLab=1 -SimCmd= -UseNetN=0 -LabSize=60 -[eeschema/libraries] -LibName1=power -LibName2=device -LibName3=transistors -LibName4=conn -LibName5=linear -LibName6=regul -LibName7=74xx -LibName8=cmos4000 -LibName9=adc-dac -LibName10=memory -LibName11=xilinx -LibName12=special -LibName13=microcontrollers -LibName14=dsp -LibName15=microchip -LibName16=analog_switches -LibName17=motorola -LibName18=texas -LibName19=intel -LibName20=audio -LibName21=interface -LibName22=digital-audio -LibName23=philips -LibName24=display -LibName25=cypress -LibName26=siliconi -LibName27=opto -LibName28=atmel -LibName29=contrib -LibName30=valves -[general] -version=1 diff --git a/template/raspberrypi-gpio/raspberrypi-gpio.sch b/template/raspberrypi-gpio/raspberrypi-gpio.sch deleted file mode 100755 index fb626f9543..0000000000 --- a/template/raspberrypi-gpio/raspberrypi-gpio.sch +++ /dev/null @@ -1,169 +0,0 @@ -EESchema Schematic File Version 2 date 15/11/2012 21:22:43 -LIBS:power -LIBS:device -LIBS:transistors -LIBS:conn -LIBS:linear -LIBS:regul -LIBS:74xx -LIBS:cmos4000 -LIBS:adc-dac -LIBS:memory -LIBS:xilinx -LIBS:special -LIBS:microcontrollers -LIBS:dsp -LIBS:microchip -LIBS:analog_switches -LIBS:motorola -LIBS:texas -LIBS:intel -LIBS:audio -LIBS:interface -LIBS:digital-audio -LIBS:philips -LIBS:display -LIBS:cypress -LIBS:siliconi -LIBS:opto -LIBS:atmel -LIBS:contrib -LIBS:valves -LIBS:rpi-cache -EELAYER 27 0 -EELAYER END -$Descr A4 11693 8268 -encoding utf-8 -Sheet 1 1 -Title "" -Date "15 nov 2012" -Rev "" -Comp "" -Comment1 "" -Comment2 "" -Comment3 "" -Comment4 "" -$EndDescr -$Comp -L CONN_13X2 P1 -U 1 1 50A55ABA -P 2400 1800 -F 0 "P1" H 2400 2500 60 0000 C CNN -F 1 "CONN_13X2" V 2400 1800 50 0000 C CNN - 1 2400 1800 - 1 0 0 -1 -$EndComp -$Comp -L +3.3V #PWR01 -U 1 1 50A55B18 -P 1900 1050 -F 0 "#PWR01" H 1900 1010 30 0001 C CNN -F 1 "+3.3V" H 1900 1160 30 0000 C CNN - 1 1900 1050 - 1 0 0 -1 -$EndComp -Wire Wire Line - 1900 1050 1900 1200 -Wire Wire Line - 1900 1200 2000 1200 -$Comp -L +5V #PWR02 -U 1 1 50A55B2E -P 2900 1050 -F 0 "#PWR02" H 2900 1140 20 0001 C CNN -F 1 "+5V" H 2900 1140 30 0000 C CNN - 1 2900 1050 - 1 0 0 -1 -$EndComp -Wire Wire Line - 2900 1050 2900 1200 -Wire Wire Line - 2900 1200 2800 1200 -NoConn ~ 2800 1300 -Wire Wire Line - 2000 1300 1250 1300 -Wire Wire Line - 2000 1400 1250 1400 -Text Label 1250 1300 0 60 ~ 0 -GPIO0(SDA) -Text Label 1250 1400 0 60 ~ 0 -GPIO1(SCL) -Wire Wire Line - 2000 1500 1250 1500 -Text Label 1250 1500 0 60 ~ 0 -GPIO4 -NoConn ~ 2000 1600 -Wire Wire Line - 2000 1700 1250 1700 -Wire Wire Line - 2000 1800 1250 1800 -Wire Wire Line - 2000 1900 1250 1900 -Text Label 1250 1700 0 60 ~ 0 -GPIO17 -Text Label 1250 1800 0 60 ~ 0 -GPIO21 -Text Label 1250 1900 0 60 ~ 0 -GPIO22 -NoConn ~ 2000 2000 -Wire Wire Line - 2000 2100 1250 2100 -Wire Wire Line - 2000 2200 1250 2200 -Wire Wire Line - 2000 2300 1250 2300 -Text Label 1250 2100 0 60 ~ 0 -GPIO10(MOSI) -Text Label 1250 2200 0 60 ~ 0 -GPIO9(MISO) -Text Label 1250 2300 0 60 ~ 0 -GPIO11(SCLK) -NoConn ~ 2000 2400 -$Comp -L GND #PWR03 -U 1 1 50A55C3F -P 2900 2500 -F 0 "#PWR03" H 2900 2500 30 0001 C CNN -F 1 "GND" H 2900 2430 30 0001 C CNN - 1 2900 2500 - 1 0 0 -1 -$EndComp -Wire Wire Line - 2900 2500 2900 1400 -Wire Wire Line - 2900 1400 2800 1400 -Wire Wire Line - 2800 1500 3500 1500 -Wire Wire Line - 2800 1600 3500 1600 -Text Label 3500 1500 2 60 ~ 0 -TXD -Text Label 3500 1600 2 60 ~ 0 -RXD -Wire Wire Line - 2800 1700 3500 1700 -Text Label 3500 1700 2 60 ~ 0 -GPIO18 -NoConn ~ 2800 1800 -Wire Wire Line - 2800 1900 3500 1900 -Wire Wire Line - 2800 2000 3500 2000 -Text Label 3500 1900 2 60 ~ 0 -GPIO23 -Text Label 3500 2000 2 60 ~ 0 -GPIO24 -NoConn ~ 2800 2100 -Wire Wire Line - 2800 2200 3500 2200 -Text Label 3500 2200 2 60 ~ 0 -GPIO25 -Wire Wire Line - 2800 2300 3500 2300 -Wire Wire Line - 2800 2400 3500 2400 -Text Label 3500 2300 2 60 ~ 0 -GPIO8(CE0) -Text Label 3500 2400 2 60 ~ 0 -GPIO7(CE1) -$EndSCHEMATC diff --git a/template/raspberrypi-gpio/raspberrypi-gpio.stf b/template/raspberrypi-gpio/raspberrypi-gpio.stf deleted file mode 100755 index c4a0667d00..0000000000 --- a/template/raspberrypi-gpio/raspberrypi-gpio.stf +++ /dev/null @@ -1 +0,0 @@ -comp = "P1" module = "HE10_26D" diff --git a/template/stm32f100-discovery-shield/meta/board_stm32vl_discovery.png b/template/stm32f100-discovery-shield/meta/board_stm32vl_discovery.png deleted file mode 100644 index 29087b72d723ae7774ec92e8269500f5dffbad63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 283151 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 - -STM32 Discovery - - -

STM32 Value Line Discovery - STM32F100 Cortex-M3™ Microcontroller Board

-

Expansion Board

-This project is a template of an expansion board for the -STM32 Value Line Discovery - board. -

-This project includes a PCB edge defined as the same size as the STM32F100 Discovery -board with the connectors placed correctly to align the two boards. All IO present on the -Discovery board is connected to the project through 0.1" expansion headers. -

-





-

-(c)2012 Kerusey Karyu
- - diff --git a/template/stm32f100-discovery-shield/stm32f100-discovery-shield-cache.lib b/template/stm32f100-discovery-shield/stm32f100-discovery-shield-cache.lib deleted file mode 100644 index 2d2b0dbacc..0000000000 --- a/template/stm32f100-discovery-shield/stm32f100-discovery-shield-cache.lib +++ /dev/null @@ -1,94 +0,0 @@ -EESchema-LIBRARY Version 2.3 Date: 2012-10-20 12:45:55 -#encoding utf-8 -# -# +3.3V -# -DEF +3.3V #PWR 0 0 Y Y 1 F P -F0 "#PWR" 0 -40 30 H I C CNN -F1 "+3.3V" 0 110 30 H V C CNN -ALIAS +3,3V -DRAW -X +3.3V 1 0 0 0 U 30 30 0 0 W N -C 0 60 20 0 1 0 N -P 3 0 1 0 0 0 0 40 0 40 N -ENDDRAW -ENDDEF -# -# +5V -# -DEF +5V #PWR 0 40 Y Y 1 F P -F0 "#PWR" 0 90 20 H I C CNN -F1 "+5V" 0 90 30 H V C CNN -DRAW -X +5V 1 0 0 0 U 20 20 0 0 W N -C 0 50 20 0 1 0 N -P 4 0 1 0 0 0 0 30 0 30 0 30 N -ENDDRAW -ENDDEF -# -# CONN28 -# -DEF CONN28 P 0 40 Y N 1 F N -F0 "P" -50 0 60 V V C CNN -F1 "CONN28" 50 0 60 V V C CNN -DRAW -S -100 -1400 150 1400 0 1 0 f -X P1 1 -350 1350 250 R 50 50 1 1 P I -X P2 2 -350 1250 250 R 50 50 1 1 P I -X P3 3 -350 1150 250 R 50 50 1 1 P I -X P4 4 -350 1050 250 R 50 50 1 1 P I -X P5 5 -350 950 250 R 50 50 1 1 P I -X P6 6 -350 850 250 R 50 50 1 1 P I -X P7 7 -350 750 250 R 50 50 1 1 P I -X P8 8 -350 650 250 R 50 50 1 1 P I -X P9 9 -350 550 250 R 50 50 1 1 P I -X P10 10 -350 450 250 R 50 50 1 1 P I -X P20 20 -350 -550 250 R 50 50 1 1 P I -X P11 11 -350 350 250 R 50 50 1 1 P I -X P21 21 -350 -650 250 R 50 50 1 1 P I -X P12 12 -350 250 250 R 50 50 1 1 P I -X P22 22 -350 -750 250 R 50 50 1 1 P I -X P13 13 -350 150 250 R 50 50 1 1 P I -X P23 23 -350 -850 250 R 50 50 1 1 P I -X P14 14 -350 50 250 R 50 50 1 1 P I -X P24 24 -350 -950 250 R 50 50 1 1 P I -X P15 15 -350 -50 250 R 50 50 1 1 P I -X P25 25 -350 -1050 250 R 50 50 1 1 P I -X P16 16 -350 -150 250 R 50 50 1 1 P I -X P26 26 -350 -1150 250 R 50 50 1 1 P I -X P17 17 -350 -250 250 R 50 50 1 1 P I -X P27 27 -350 -1250 250 R 50 50 1 1 P I -X P18 18 -350 -350 250 R 50 50 1 1 P I -X P28 28 -350 -1350 250 R 50 50 1 1 P I -X P19 19 -350 -450 250 R 50 50 1 1 P I -ENDDRAW -ENDDEF -# -# CONN6 -# -DEF CONN6 P 0 40 Y N 1 F N -F0 "P" -50 0 60 V V C CNN -F1 "CONN6" 50 0 60 V V C CNN -DRAW -S -100 -300 150 300 0 1 0 f -X P1 1 -350 250 250 R 50 50 1 1 P I -X P2 2 -350 150 250 R 50 50 1 1 P I -X P3 3 -350 50 250 R 50 50 1 1 P I -X P4 4 -350 -50 250 R 50 50 1 1 P I -X P5 5 -350 -150 250 R 50 50 1 1 P I -X P6 6 -350 -250 250 R 50 50 1 1 P I -ENDDRAW -ENDDEF -# -# GND -# -DEF ~GND #PWR 0 0 Y Y 1 F P -F0 "#PWR" 0 0 30 H I C CNN -F1 "GND" 0 -70 30 H I C CNN -DRAW -P 4 0 1 0 -50 0 0 -50 50 0 -50 0 N -X GND 1 0 0 0 U 30 30 1 1 W N -ENDDRAW -ENDDEF -# -#End Library diff --git a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.cmp b/template/stm32f100-discovery-shield/stm32f100-discovery-shield.cmp deleted file mode 100644 index 989bb8942f..0000000000 --- a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.cmp +++ /dev/null @@ -1,24 +0,0 @@ -Cmp-Mod V01 Created by CvPcb (2012-10-17 BZR 3773)-testing date = 2012-10-20 12:09:50 - -BeginCmp -TimeStamp = /50827277; -Reference = P1; -ValeurCmp = CONN28; -IdModule = PIN_ARRAY_28X1; -EndCmp - -BeginCmp -TimeStamp = /50827286; -Reference = P2; -ValeurCmp = CONN28; -IdModule = PIN_ARRAY_28X1; -EndCmp - -BeginCmp -TimeStamp = /50827295; -Reference = P3; -ValeurCmp = CONN6; -IdModule = PIN_ARRAY_6X1; -EndCmp - -EndListe diff --git a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.dcm b/template/stm32f100-discovery-shield/stm32f100-discovery-shield.dcm deleted file mode 100644 index 6705e3845f..0000000000 --- a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.dcm +++ /dev/null @@ -1,13 +0,0 @@ -EESchema-DOCLIB Version 2.0 Date: 2012-10-20 11:34:59 -# -$CMP CONN28 -D Symbole general de connexion -K CONN -$ENDCMP -# -$CMP CONN6 -D Symbole general de connexion -K CONN -$ENDCMP -# -#End Doc Library diff --git a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.kicad_pcb b/template/stm32f100-discovery-shield/stm32f100-discovery-shield.kicad_pcb deleted file mode 100644 index 1d42c6b583..0000000000 --- a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.kicad_pcb +++ /dev/null @@ -1,373 +0,0 @@ -(kicad_pcb (version 3) (host pcbnew "(2013-02-23 BZR 3971)-testing") - - (general - (links 3) - (no_connects 3) - (area 32.945069 34.215069 76.274931 118.819931) - (thickness 1.6002) - (drawings 5) - (tracks 0) - (zones 0) - (modules 3) - (nets 4) - ) - - (page A3) - (title_block - (title "STM32 Value Line Discovery - Shiled board") - (rev 1.0) - ) - - (layers - (15 Front signal) - (0 Back signal) - (16 Dessous.Adhes user) - (17 Dessus.Adhes user) - (18 Dessous.Pate user) - (19 Dessus.Pate user) - (20 Dessous.SilkS user) - (21 Dessus.SilkS user) - (22 Dessous.Masque user) - (23 Dessus.Masque user) - (24 Dessin.User user) - (25 Cmts.User user) - (26 Eco1.User user) - (27 Eco2.User user) - (28 Contours.Ci user) - ) - - (setup - (last_trace_width 0.254) - (trace_clearance 0.254) - (zone_clearance 0.508) - (zone_45_only no) - (trace_min 0.254) - (segment_width 0.20066) - (edge_width 0.14986) - (via_size 0.889) - (via_drill 0.635) - (via_min_size 0.889) - (via_min_drill 0.508) - (uvia_size 0.508) - (uvia_drill 0.127) - (uvias_allowed no) - (uvia_min_size 0.508) - (uvia_min_drill 0.127) - (pcb_text_width 0.29972) - (pcb_text_size 1.00076 1.00076) - (mod_edge_width 0.14986) - (mod_text_size 1.00076 1.00076) - (mod_text_width 0.14986) - (pad_size 1.00076 1.00076) - (pad_drill 0.59944) - (pad_to_mask_clearance 0) - (aux_axis_origin 0 0) - (visible_elements 7FFFFFFF) - (pcbplotparams - (layerselection 3178497) - (usegerberextensions true) - (excludeedgelayer true) - (linewidth 60) - (plotframeref false) - (viasonmask false) - (mode 1) - (useauxorigin false) - (hpglpennumber 1) - (hpglpenspeed 20) - (hpglpendiameter 15) - (hpglpenoverlay 2) - (psnegative false) - (psa4output false) - (plotreference true) - (plotvalue true) - (plotothertext true) - (plotinvisibletext false) - (padsonsilk false) - (subtractmaskfromsilk false) - (outputformat 1) - (mirror false) - (drillshape 1) - (scaleselection 1) - (outputdirectory "")) - ) - - (net 0 "") - (net 1 +3.3V) - (net 2 +5V) - (net 3 GND) - - (net_class Default "To jest domyślna klasa połączeń." - (clearance 0.254) - (trace_width 0.254) - (via_dia 0.889) - (via_drill 0.635) - (uvia_dia 0.508) - (uvia_drill 0.127) - (add_net "") - (add_net +3.3V) - (add_net +5V) - (add_net GND) - ) - - (module PIN_ARRAY_6X1 locked (layer Front) (tedit 50827C81) (tstamp 50827C60) - (at 55.88 113.03) - (descr "Single rangee contacts 1 x 6 pins") - (tags CONN) - (path /50827295) - (fp_text reference P3 (at -8.89 0) (layer Dessus.SilkS) - (effects (font (size 0.63246 0.63246) (thickness 0.15748))) - ) - (fp_text value CONN6 (at -8.89 0) (layer Dessus.SilkS) hide - (effects (font (size 0.63246 0.63246) (thickness 0.15748))) - ) - (fp_line (start -7.62 -1.27) (end 7.62 -1.27) (layer Dessus.SilkS) (width 0.14986)) - (fp_line (start 7.62 -1.27) (end 7.62 1.27) (layer Dessus.SilkS) (width 0.14986)) - (fp_line (start 7.62 1.27) (end -7.62 1.27) (layer Dessus.SilkS) (width 0.14986)) - (fp_line (start -7.62 1.27) (end -7.62 -1.27) (layer Dessus.SilkS) (width 0.14986)) - (pad 1 thru_hole rect (at -6.35 0) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 2 thru_hole circle (at -3.81 0) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 4 thru_hole circle (at 1.27 0) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 6 thru_hole circle (at 6.35 0) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 3 thru_hole circle (at -1.27 0) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 5 thru_hole circle (at 3.81 0) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - ) - - (module PIN_ARRAY_28X1 locked (layer Front) (tedit 50827C6F) (tstamp 50827C84) - (at 39.37 73.66 270) - (descr "Single rangee contacts 1 x 28 pins") - (tags CONN) - (path /50827277) - (fp_text reference P1 (at -36.195 0 360) (layer Dessus.SilkS) - (effects (font (size 0.63246 0.63246) (thickness 0.15748))) - ) - (fp_text value CONN28 (at -36.195 0 360) (layer Dessus.SilkS) hide - (effects (font (size 0.63246 0.63246) (thickness 0.15748))) - ) - (fp_line (start -35.56 -1.27) (end 35.56 -1.27) (layer Dessus.SilkS) (width 0.14986)) - (fp_line (start 35.56 -1.27) (end 35.56 1.27) (layer Dessus.SilkS) (width 0.14986)) - (fp_line (start 35.56 1.27) (end -35.56 1.27) (layer Dessus.SilkS) (width 0.14986)) - (fp_line (start -35.56 1.27) (end -35.56 -1.27) (layer Dessus.SilkS) (width 0.14986)) - (pad 1 thru_hole rect (at -34.29 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - (net 3 GND) - ) - (pad 2 thru_hole circle (at -31.75 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 11 thru_hole circle (at -8.89 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 4 thru_hole circle (at -26.67 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 13 thru_hole circle (at -3.81 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 6 thru_hole circle (at -21.59 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 15 thru_hole circle (at 1.27 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 8 thru_hole circle (at -16.51 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 17 thru_hole circle (at 6.35 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 10 thru_hole circle (at -11.43 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 19 thru_hole circle (at 11.43 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 12 thru_hole circle (at -6.35 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 21 thru_hole circle (at 16.51 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 14 thru_hole circle (at -1.27 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 23 thru_hole circle (at 21.59 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 16 thru_hole circle (at 3.81 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 25 thru_hole circle (at 26.67 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 18 thru_hole circle (at 8.89 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 27 thru_hole circle (at 31.75 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 20 thru_hole circle (at 13.97 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 22 thru_hole circle (at 19.05 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 24 thru_hole circle (at 24.13 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 26 thru_hole circle (at 29.21 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 28 thru_hole circle (at 34.29 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - (net 3 GND) - ) - (pad 3 thru_hole circle (at -29.21 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - (net 1 +3.3V) - ) - (pad 5 thru_hole circle (at -24.13 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 7 thru_hole circle (at -19.05 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 9 thru_hole circle (at -13.97 0 270) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - ) - - (module PIN_ARRAY_28X1 locked (layer Front) (tedit 50827C8E) (tstamp 50827CA8) - (at 69.85 73.66 90) - (descr "Single rangee contacts 1 x 28 pins") - (tags CONN) - (path /50827286) - (fp_text reference P2 (at -36.195 0 180) (layer Dessus.SilkS) - (effects (font (size 0.63246 0.63246) (thickness 0.15748))) - ) - (fp_text value CONN28 (at -36.195 0 180) (layer Dessus.SilkS) hide - (effects (font (size 0.63246 0.63246) (thickness 0.15748))) - ) - (fp_line (start -35.56 -1.27) (end 35.56 -1.27) (layer Dessus.SilkS) (width 0.14986)) - (fp_line (start 35.56 -1.27) (end 35.56 1.27) (layer Dessus.SilkS) (width 0.14986)) - (fp_line (start 35.56 1.27) (end -35.56 1.27) (layer Dessus.SilkS) (width 0.14986)) - (fp_line (start -35.56 1.27) (end -35.56 -1.27) (layer Dessus.SilkS) (width 0.14986)) - (pad 1 thru_hole rect (at -34.29 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - (net 3 GND) - ) - (pad 2 thru_hole circle (at -31.75 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 11 thru_hole circle (at -8.89 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 4 thru_hole circle (at -26.67 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 13 thru_hole circle (at -3.81 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 6 thru_hole circle (at -21.59 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 15 thru_hole circle (at 1.27 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 8 thru_hole circle (at -16.51 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 17 thru_hole circle (at 6.35 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 10 thru_hole circle (at -11.43 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 19 thru_hole circle (at 11.43 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 12 thru_hole circle (at -6.35 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 21 thru_hole circle (at 16.51 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 14 thru_hole circle (at -1.27 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 23 thru_hole circle (at 21.59 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 16 thru_hole circle (at 3.81 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 25 thru_hole circle (at 26.67 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 18 thru_hole circle (at 8.89 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 27 thru_hole circle (at 31.75 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 20 thru_hole circle (at 13.97 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 22 thru_hole circle (at 19.05 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 24 thru_hole circle (at 24.13 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 26 thru_hole circle (at 29.21 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - (net 2 +5V) - ) - (pad 28 thru_hole circle (at 34.29 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - (net 3 GND) - ) - (pad 3 thru_hole circle (at -29.21 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 5 thru_hole circle (at -24.13 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 7 thru_hole circle (at -19.05 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 9 thru_hole circle (at -13.97 0 90) (size 1.524 1.524) (drill 1.016) - (layers *.Cu *.Mask Dessus.SilkS) - ) - ) - - (gr_text "STM32 Value Line Discovery - Shield" (at 48.133 117.475) (layer Dessus.SilkS) - (effects (font (size 1.00076 1.00076) (thickness 0.25146))) - ) - (gr_line (start 33.02 34.29) (end 33.02 118.745) (angle 90) (layer Contours.Ci) (width 0.14986)) - (gr_line (start 76.2 118.745) (end 76.2 34.29) (angle 90) (layer Contours.Ci) (width 0.14986)) - (gr_line (start 76.2 118.745) (end 33.02 118.745) (angle 90) (layer Contours.Ci) (width 0.14986)) - (gr_line (start 33.02 34.29) (end 76.2 34.29) (angle 90) (layer Contours.Ci) (width 0.14986)) - - (zone (net 3) (net_name GND) (layer Back) (tstamp 50827DC8) (hatch edge 0.508) - (connect_pads (clearance 0.508)) - (min_thickness 0.254) - (fill (arc_segments 16) (thermal_gap 0.508) (thermal_bridge_width 0.889)) - (polygon - (pts - (xy 76.073 118.618) (xy 33.147 118.618) (xy 33.147 34.417) (xy 76.073 34.417) - ) - ) - ) -) diff --git a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.lib b/template/stm32f100-discovery-shield/stm32f100-discovery-shield.lib deleted file mode 100644 index 9f3e0a012a..0000000000 --- a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.lib +++ /dev/null @@ -1,58 +0,0 @@ -EESchema-LIBRARY Version 2.3 Date: 2012-10-20 11:34:59 -#encoding utf-8 -# -# CONN28 -# -DEF CONN28 P 0 40 Y N 1 F N -F0 "P" -50 0 60 V V C CNN -F1 "CONN28" 50 0 60 V V C CNN -DRAW -S -100 -1400 150 1400 0 1 0 f -X P1 1 -350 1350 250 R 50 50 1 1 P I -X P2 2 -350 1250 250 R 50 50 1 1 P I -X P3 3 -350 1150 250 R 50 50 1 1 P I -X P4 4 -350 1050 250 R 50 50 1 1 P I -X P5 5 -350 950 250 R 50 50 1 1 P I -X P6 6 -350 850 250 R 50 50 1 1 P I -X P7 7 -350 750 250 R 50 50 1 1 P I -X P8 8 -350 650 250 R 50 50 1 1 P I -X P9 9 -350 550 250 R 50 50 1 1 P I -X P10 10 -350 450 250 R 50 50 1 1 P I -X P20 20 -350 -550 250 R 50 50 1 1 P I -X P11 11 -350 350 250 R 50 50 1 1 P I -X P21 21 -350 -650 250 R 50 50 1 1 P I -X P12 12 -350 250 250 R 50 50 1 1 P I -X P22 22 -350 -750 250 R 50 50 1 1 P I -X P13 13 -350 150 250 R 50 50 1 1 P I -X P23 23 -350 -850 250 R 50 50 1 1 P I -X P14 14 -350 50 250 R 50 50 1 1 P I -X P24 24 -350 -950 250 R 50 50 1 1 P I -X P15 15 -350 -50 250 R 50 50 1 1 P I -X P25 25 -350 -1050 250 R 50 50 1 1 P I -X P16 16 -350 -150 250 R 50 50 1 1 P I -X P26 26 -350 -1150 250 R 50 50 1 1 P I -X P17 17 -350 -250 250 R 50 50 1 1 P I -X P27 27 -350 -1250 250 R 50 50 1 1 P I -X P18 18 -350 -350 250 R 50 50 1 1 P I -X P28 28 -350 -1350 250 R 50 50 1 1 P I -X P19 19 -350 -450 250 R 50 50 1 1 P I -ENDDRAW -ENDDEF -# -# CONN6 -# -DEF CONN6 P 0 40 Y N 1 F N -F0 "P" -50 0 60 V V C CNN -F1 "CONN6" 50 0 60 V V C CNN -DRAW -S -100 -300 150 300 0 1 0 f -X P1 1 -350 250 250 R 50 50 1 1 P I -X P2 2 -350 150 250 R 50 50 1 1 P I -X P3 3 -350 50 250 R 50 50 1 1 P I -X P4 4 -350 -50 250 R 50 50 1 1 P I -X P5 5 -350 -150 250 R 50 50 1 1 P I -X P6 6 -350 -250 250 R 50 50 1 1 P I -ENDDRAW -ENDDEF -# -#End Library diff --git a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.mod b/template/stm32f100-discovery-shield/stm32f100-discovery-shield.mod deleted file mode 100644 index f7e8c97ef8..0000000000 --- a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.mod +++ /dev/null @@ -1,276 +0,0 @@ -PCBNEW-LibModule-V1 2012-10-20 12:13:07 -# encoding utf-8 -Units deci-mils -$INDEX -PIN_ARRAY_28X1 -PIN_ARRAY_6X1 -$EndINDEX -$MODULE PIN_ARRAY_28X1 -Po 0 0 0 15 50827920 00000000 ~~ -Li PIN_ARRAY_28X1 -Cd Single rangee contacts 1 x 28 pins -Kw CONN -Sc 0 -AR -Op 0 0 0 -T0 0 -800 249 249 0 62 N V 21 N "PIN_ARRAY_28X1" -T1 0 800 249 249 0 62 N I 21 N "VAL**" -DS -14000 -500 14000 -500 59 21 -DS 14000 -500 14000 500 59 21 -DS 14000 500 -14000 500 59 21 -DS -14000 500 -14000 -500 59 21 -$PAD -Sh "1" R 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -13500 0 -$EndPAD -$PAD -Sh "2" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -12500 0 -$EndPAD -$PAD -Sh "11" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -3500 0 -$EndPAD -$PAD -Sh "4" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -10500 0 -$EndPAD -$PAD -Sh "13" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -1500 0 -$EndPAD -$PAD -Sh "6" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -8500 0 -$EndPAD -$PAD -Sh "15" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 500 0 -$EndPAD -$PAD -Sh "8" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -6500 0 -$EndPAD -$PAD -Sh "17" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 2500 0 -$EndPAD -$PAD -Sh "10" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -4500 0 -$EndPAD -$PAD -Sh "19" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 4500 0 -$EndPAD -$PAD -Sh "12" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -2500 0 -$EndPAD -$PAD -Sh "21" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 6500 0 -$EndPAD -$PAD -Sh "14" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -500 0 -$EndPAD -$PAD -Sh "23" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 8500 0 -$EndPAD -$PAD -Sh "16" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 1500 0 -$EndPAD -$PAD -Sh "25" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 10500 0 -$EndPAD -$PAD -Sh "18" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 3500 0 -$EndPAD -$PAD -Sh "27" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 12500 0 -$EndPAD -$PAD -Sh "20" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 5500 0 -$EndPAD -$PAD -Sh "22" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 7500 0 -$EndPAD -$PAD -Sh "24" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 9500 0 -$EndPAD -$PAD -Sh "26" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 11500 0 -$EndPAD -$PAD -Sh "28" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 13500 0 -$EndPAD -$PAD -Sh "3" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -11500 0 -$EndPAD -$PAD -Sh "5" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -9500 0 -$EndPAD -$PAD -Sh "7" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -7500 0 -$EndPAD -$PAD -Sh "9" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -5500 0 -$EndPAD -$EndMODULE PIN_ARRAY_28X1 -$MODULE PIN_ARRAY_6X1 -Po 0 0 0 15 508278F8 00000000 ~~ -Li PIN_ARRAY_6X1 -Cd Single rangee contacts 1 x 6 pins -Kw CONN -Sc 0 -AR -Op 0 0 0 -T0 0 -700 249 249 0 62 N V 21 N "PIN_ARRAY_6X1" -T1 0 800 249 249 0 62 N I 21 N "VAL**" -DS -3000 -500 3000 -500 59 21 -DS 3000 -500 3000 500 59 21 -DS 3000 500 -3000 500 59 21 -DS -3000 500 -3000 -500 59 21 -$PAD -Sh "1" R 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -2500 0 -$EndPAD -$PAD -Sh "2" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -1500 0 -$EndPAD -$PAD -Sh "4" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 500 0 -$EndPAD -$PAD -Sh "6" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 2500 0 -$EndPAD -$PAD -Sh "3" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po -500 0 -$EndPAD -$PAD -Sh "5" C 600 600 0 0 0 -Dr 400 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 1500 0 -$EndPAD -$EndMODULE PIN_ARRAY_6X1 -$EndLIBRARY diff --git a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.net b/template/stm32f100-discovery-shield/stm32f100-discovery-shield.net deleted file mode 100644 index 44f90069e9..0000000000 --- a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.net +++ /dev/null @@ -1,80 +0,0 @@ -# EESchema Netlist Version 1.1 created 2012-10-20 12:24:05 -( - ( /50827277 $noname P1 CONN28 {Lib=CONN28} - ( 1 GND ) - ( 2 ? ) - ( 3 +3.3V ) - ( 4 ? ) - ( 5 ? ) - ( 6 ? ) - ( 7 ? ) - ( 8 ? ) - ( 9 ? ) - ( 10 ? ) - ( 11 ? ) - ( 12 ? ) - ( 13 ? ) - ( 14 ? ) - ( 15 ? ) - ( 16 ? ) - ( 17 ? ) - ( 18 ? ) - ( 19 ? ) - ( 20 ? ) - ( 21 ? ) - ( 22 ? ) - ( 23 ? ) - ( 24 ? ) - ( 25 ? ) - ( 26 ? ) - ( 27 ? ) - ( 28 GND ) - ) - ( /50827286 $noname P2 CONN28 {Lib=CONN28} - ( 1 GND ) - ( 2 ? ) - ( 3 ? ) - ( 4 ? ) - ( 5 ? ) - ( 6 ? ) - ( 7 ? ) - ( 8 ? ) - ( 9 ? ) - ( 10 ? ) - ( 11 ? ) - ( 12 ? ) - ( 13 ? ) - ( 14 ? ) - ( 15 ? ) - ( 16 ? ) - ( 17 ? ) - ( 18 ? ) - ( 19 ? ) - ( 20 ? ) - ( 21 ? ) - ( 22 ? ) - ( 23 ? ) - ( 24 ? ) - ( 25 ? ) - ( 26 +5V ) - ( 27 ? ) - ( 28 GND ) - ) - ( /50827295 $noname P3 CONN6 {Lib=CONN6} - ( 1 ? ) - ( 2 ? ) - ( 3 ? ) - ( 4 ? ) - ( 5 ? ) - ( 6 ? ) - ) -) -* -{ Pin List by Nets -Net 59 "GND" "GND" - P1 1 - P2 28 - P1 28 - P2 1 -} -#End diff --git a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.pro b/template/stm32f100-discovery-shield/stm32f100-discovery-shield.pro deleted file mode 100644 index ebb404f9fb..0000000000 --- a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.pro +++ /dev/null @@ -1,81 +0,0 @@ -update=2012-10-20 12:46:25 -version=1 -last_client=pcbnew -[general] -version=1 -[cvpcb] -version=1 -NetIExt=net -[cvpcb/libraries] -EquName1=devcms -[eeschema] -version=1 -LibDir= -NetFmtName= -RptD_X=0 -RptD_Y=100 -RptLab=1 -LabSize=40 -[eeschema/libraries] -LibName1=stm32f100-discovery-shield -LibName2=stm32 -LibName3=power -LibName4=device -LibName5=transistors -LibName6=conn -LibName7=linear -LibName8=regul -LibName9=74xx -LibName10=cmos4000 -LibName11=adc-dac -LibName12=memory -LibName13=xilinx -LibName14=special -LibName15=microcontrollers -LibName16=dsp -LibName17=microchip -LibName18=analog_switches -LibName19=motorola -LibName20=texas -LibName21=intel -LibName22=audio -LibName23=interface -LibName24=digital-audio -LibName25=philips -LibName26=display -LibName27=cypress -LibName28=siliconi -LibName29=opto -LibName30=atmel -LibName31=contrib -LibName32=valves -[pcbnew] -version=1 -LastNetListRead= -PadDrill=0.59944 -PadSizeH=1.00076 -PadSizeV=1.00076 -PcbTextSizeV=1.00076 -PcbTextSizeH=1.00076 -PcbTextThickness=0.29972 -ModuleTextSizeV=1.00076 -ModuleTextSizeH=1.00076 -ModuleTextSizeThickness=0.14986 -SolderMaskClearance=0 -DrawSegmentWidth=0.20066 -BoardOutlineThickness=0.14986 -ModuleOutlineThickness=0.14986 -[pcbnew/libraries] -LibDir= -LibName1=stm32f100-discovery-shield -LibName2=sockets -LibName3=connect -LibName4=discret -LibName5=pin_array -LibName6=divers -LibName7=libcms -LibName8=display -LibName9=led -LibName10=dip_sockets -LibName11=pga_sockets -LibName12=valves diff --git a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.sch b/template/stm32f100-discovery-shield/stm32f100-discovery-shield.sch deleted file mode 100644 index fe7e4ca1fb..0000000000 --- a/template/stm32f100-discovery-shield/stm32f100-discovery-shield.sch +++ /dev/null @@ -1,368 +0,0 @@ -EESchema Schematic File Version 2 date 2012-10-20 12:45:55 -LIBS:stm32f100-discovery-shield -LIBS:stm32 -LIBS:power -LIBS:device -LIBS:transistors -LIBS:conn -LIBS:linear -LIBS:regul -LIBS:74xx -LIBS:cmos4000 -LIBS:adc-dac -LIBS:memory -LIBS:xilinx -LIBS:special -LIBS:microcontrollers -LIBS:dsp -LIBS:microchip -LIBS:analog_switches -LIBS:motorola -LIBS:texas -LIBS:intel -LIBS:audio -LIBS:interface -LIBS:digital-audio -LIBS:philips -LIBS:display -LIBS:cypress -LIBS:siliconi -LIBS:opto -LIBS:atmel -LIBS:contrib -LIBS:valves -LIBS:stm32f100-discovery-shield-cache -EELAYER 27 0 -EELAYER END -$Descr A4 11693 8268 -encoding utf-8 -Sheet 1 1 -Title "STM32 Value Line Discovery - Shiled board" -Date "20 oct 2012" -Rev "1.0" -Comp "" -Comment1 "" -Comment2 "" -Comment3 "" -Comment4 "" -$EndDescr -$Comp -L CONN28 P1 -U 1 1 50827277 -P 10950 1950 -F 0 "P1" V 10900 1950 60 0000 C CNN -F 1 "CONN28" V 11000 1950 60 0000 C CNN - 1 10950 1950 - 1 0 0 -1 -$EndComp -$Comp -L CONN28 P2 -U 1 1 50827286 -P 10950 4850 -F 0 "P2" V 10900 4850 60 0000 C CNN -F 1 "CONN28" V 11000 4850 60 0000 C CNN - 1 10950 4850 - 1 0 0 1 -$EndComp -$Comp -L CONN6 P3 -U 1 1 50827295 -P 10950 6650 -F 0 "P3" V 10900 6650 60 0000 C CNN -F 1 "CONN6" V 11000 6650 60 0000 C CNN - 1 10950 6650 - 1 0 0 -1 -$EndComp -Wire Wire Line - 10600 600 10300 600 -Wire Wire Line - 10600 800 10300 800 -Wire Wire Line - 10600 900 10300 900 -Wire Wire Line - 10600 1000 10300 1000 -Wire Wire Line - 10600 1100 10300 1100 -Wire Wire Line - 10600 1200 10300 1200 -Wire Wire Line - 10600 1300 10300 1300 -Wire Wire Line - 10600 1400 10300 1400 -Wire Wire Line - 10600 1500 10300 1500 -Wire Wire Line - 10600 1600 10300 1600 -Wire Wire Line - 10600 1700 10300 1700 -Wire Wire Line - 10600 1800 10300 1800 -Wire Wire Line - 10600 1900 10300 1900 -Wire Wire Line - 10600 2000 10300 2000 -Wire Wire Line - 10600 2100 10300 2100 -Wire Wire Line - 10600 2200 10300 2200 -Wire Wire Line - 10600 2300 10300 2300 -Wire Wire Line - 10600 2400 10300 2400 -Wire Wire Line - 10600 2500 10300 2500 -Wire Wire Line - 10600 2600 10300 2600 -Wire Wire Line - 10600 2700 10300 2700 -Wire Wire Line - 10600 2800 10300 2800 -Wire Wire Line - 10600 2900 10300 2900 -Wire Wire Line - 10600 3000 10300 3000 -Wire Wire Line - 10600 3100 10300 3100 -Wire Wire Line - 10600 3200 10300 3200 -Wire Wire Line - 10600 3300 10300 3300 -Wire Wire Line - 10600 3500 10300 3500 -Wire Wire Line - 10600 3700 10300 3700 -Wire Wire Line - 10600 3800 10300 3800 -Wire Wire Line - 10600 3900 10300 3900 -Wire Wire Line - 10600 4000 10300 4000 -Wire Wire Line - 10600 4100 10300 4100 -Wire Wire Line - 10600 4200 10300 4200 -Wire Wire Line - 10600 4300 10300 4300 -Wire Wire Line - 10600 4400 10300 4400 -Wire Wire Line - 10600 4500 10300 4500 -Wire Wire Line - 10600 4600 10300 4600 -Wire Wire Line - 10600 4700 10300 4700 -Wire Wire Line - 10600 4800 10300 4800 -Wire Wire Line - 10600 4900 10300 4900 -Wire Wire Line - 10600 5000 10300 5000 -Wire Wire Line - 10600 5100 10300 5100 -Wire Wire Line - 10600 5200 10300 5200 -Wire Wire Line - 10600 5300 10300 5300 -Wire Wire Line - 10600 5400 10300 5400 -Wire Wire Line - 10600 5500 10300 5500 -Wire Wire Line - 10600 5600 10300 5600 -Wire Wire Line - 10600 5700 10300 5700 -Wire Wire Line - 10600 5800 10300 5800 -Wire Wire Line - 10600 5900 10300 5900 -Wire Wire Line - 10600 6000 10300 6000 -Wire Wire Line - 10600 6100 10300 6100 -Wire Wire Line - 10600 6200 10300 6200 -Wire Wire Line - 10600 6400 10300 6400 -Wire Wire Line - 10600 6500 10300 6500 -Wire Wire Line - 10600 6600 10300 6600 -Wire Wire Line - 10600 6700 10300 6700 -Wire Wire Line - 10600 6800 10300 6800 -Wire Wire Line - 10600 6900 10300 6900 -Text Label 10350 6400 0 40 ~ 0 -PB10 -Text Label 10350 6500 0 40 ~ 0 -PB11 -Text Label 10350 6600 0 40 ~ 0 -PB12 -Text Label 10350 6700 0 40 ~ 0 -PB13 -Text Label 10350 6800 0 40 ~ 0 -PB14 -Text Label 10350 6900 0 40 ~ 0 -PB15 -NoConn ~ 10600 700 -NoConn ~ 10600 3600 -$Comp -L GND #PWR01 -U 1 1 50827354 -P 10300 650 -F 0 "#PWR01" H 10300 650 30 0001 C CNN -F 1 "GND" H 10300 580 30 0001 C CNN - 1 10300 650 - 1 0 0 -1 -$EndComp -$Comp -L GND #PWR02 -U 1 1 50827361 -P 10300 3350 -F 0 "#PWR02" H 10300 3350 30 0001 C CNN -F 1 "GND" H 10300 3280 30 0001 C CNN - 1 10300 3350 - 1 0 0 -1 -$EndComp -$Comp -L GND #PWR03 -U 1 1 50827367 -P 10300 3550 -F 0 "#PWR03" H 10300 3550 30 0001 C CNN -F 1 "GND" H 10300 3480 30 0001 C CNN - 1 10300 3550 - 1 0 0 -1 -$EndComp -$Comp -L GND #PWR04 -U 1 1 5082736D -P 10300 6250 -F 0 "#PWR04" H 10300 6250 30 0001 C CNN -F 1 "GND" H 10300 6180 30 0001 C CNN - 1 10300 6250 - 1 0 0 -1 -$EndComp -$Comp -L +3.3V #PWR05 -U 1 1 50827375 -P 10300 800 -F 0 "#PWR05" H 10300 760 30 0001 C CNN -F 1 "+3.3V" H 10300 910 30 0000 C CNN - 1 10300 800 - 0 -1 -1 0 -$EndComp -$Comp -L +5V #PWR06 -U 1 1 50827384 -P 10300 3700 -F 0 "#PWR06" H 10300 3790 20 0001 C CNN -F 1 "+5V" H 10300 3790 30 0000 C CNN - 1 10300 3700 - 0 -1 -1 0 -$EndComp -Wire Wire Line - 10300 6200 10300 6250 -Wire Wire Line - 10300 3500 10300 3550 -Wire Wire Line - 10300 3300 10300 3350 -Wire Wire Line - 10300 600 10300 650 -Text Label 10350 900 0 40 ~ 0 -VBAT -Text Label 10350 1000 0 40 ~ 0 -PC13 -Text Label 10350 1100 0 40 ~ 0 -PC14 -Text Label 10350 1200 0 40 ~ 0 -PC15 -Text Label 10350 1300 0 40 ~ 0 -PD0 -Text Label 10350 1400 0 40 ~ 0 -PD1 -Text Label 10350 1500 0 40 ~ 0 -RST -Text Label 10350 1600 0 40 ~ 0 -PC0 -Text Label 10350 1700 0 40 ~ 0 -PC1 -Text Label 10350 1800 0 40 ~ 0 -PC2 -Text Label 10350 1900 0 40 ~ 0 -PC3 -Text Label 10350 2000 0 40 ~ 0 -PA0 -Text Label 10350 2100 0 40 ~ 0 -PA1 -Text Label 10350 2200 0 40 ~ 0 -PA2 -Text Label 10350 2300 0 40 ~ 0 -PA3 -Text Label 10350 2400 0 40 ~ 0 -PA4 -Text Label 10350 2500 0 40 ~ 0 -PA5 -Text Label 10350 2600 0 40 ~ 0 -PA6 -Text Label 10350 2700 0 40 ~ 0 -PA7 -Text Label 10350 2800 0 40 ~ 0 -PC4 -Text Label 10350 2900 0 40 ~ 0 -PC5 -Text Label 10350 3000 0 40 ~ 0 -PB0 -Text Label 10350 3100 0 40 ~ 0 -PB1 -Text Label 10350 3200 0 40 ~ 0 -PB2 -Text Label 10350 3800 0 40 ~ 0 -PB9 -Text Label 10350 3900 0 40 ~ 0 -PB8 -Text Label 10350 4000 0 40 ~ 0 -BOOT -Text Label 10350 4100 0 40 ~ 0 -PB7 -Text Label 10350 4200 0 40 ~ 0 -PB6 -Text Label 10350 4300 0 40 ~ 0 -PB5 -Text Label 10350 4400 0 40 ~ 0 -PB4 -Text Label 10350 4500 0 40 ~ 0 -PB3 -Text Label 10350 4600 0 40 ~ 0 -PD2 -Text Label 10350 4700 0 40 ~ 0 -PC12 -Text Label 10350 4800 0 40 ~ 0 -PC11 -Text Label 10350 4900 0 40 ~ 0 -PC10 -Text Label 10350 5000 0 40 ~ 0 -PA15 -Text Label 10350 5100 0 40 ~ 0 -PA14 -Text Label 10350 5200 0 40 ~ 0 -PA13 -Text Label 10350 5300 0 40 ~ 0 -PA12 -Text Label 10350 5400 0 40 ~ 0 -PA11 -Text Label 10350 5500 0 40 ~ 0 -PA10 -Text Label 10350 5700 0 40 ~ 0 -PA8 -Text Label 10350 5600 0 40 ~ 0 -PA9 -Text Label 10350 5800 0 40 ~ 0 -PC9 -Text Label 10350 5900 0 40 ~ 0 -PC8 -Text Label 10350 6000 0 40 ~ 0 -PC7 -Text Label 10350 6100 0 40 ~ 0 -PC6 -$EndSCHEMATC diff --git a/template/ti-stellaris-boosterpack40/boosterpack.dcm b/template/ti-stellaris-boosterpack40/boosterpack.dcm deleted file mode 100644 index 43700435be..0000000000 --- a/template/ti-stellaris-boosterpack40/boosterpack.dcm +++ /dev/null @@ -1,3 +0,0 @@ -EESchema-DOCLIB Version 2.0 Date: Thu 18 Oct 2012 09:37:56 PM PDT -# -#End Doc Library diff --git a/template/ti-stellaris-boosterpack40/boosterpack.lib b/template/ti-stellaris-boosterpack40/boosterpack.lib deleted file mode 100644 index 24bc6fde0f..0000000000 --- a/template/ti-stellaris-boosterpack40/boosterpack.lib +++ /dev/null @@ -1,114 +0,0 @@ -EESchema-LIBRARY Version 2.3 Date: Thu 18 Oct 2012 09:37:56 PM PDT -#encoding utf-8 -# -# Ti_Booster_40_J1 -# -DEF Ti_Booster_40_J1 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J1" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 1.01/Vcc 1 -600 450 300 R 50 50 1 1 W -X 1.02/PB5 2 -600 350 300 R 50 50 1 1 B -X 1.03/PB0/Rxd 3 -600 250 300 R 50 50 1 1 B -X 1.04/PB1/TxD 4 -600 150 300 R 50 50 1 1 B -X 1.05/PE4 5 -600 50 300 R 50 50 1 1 B -X 1.06/PE5 6 -600 -50 300 R 50 50 1 1 B -X 1.07/PB4 7 -600 -150 300 R 50 50 1 1 B -X 1.08/PA5 8 -600 -250 300 R 50 50 1 1 B -X 1.09/PA6 9 -600 -350 300 R 50 50 1 1 B -X 1.10/PA7 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# Ti_Booster_40_J2 -# -DEF Ti_Booster_40_J2 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J2" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 2.01/GND 1 -600 450 300 R 50 50 1 1 W -X 2.02/PB2 2 -600 350 300 R 50 50 1 1 B -X 2.03/PE0 3 -600 250 300 R 50 50 1 1 B -X 2.04/PF0 4 -600 150 300 R 50 50 1 1 B -X 2.05/RESET 5 -600 50 300 R 50 50 1 1 B -X 2.06/PB7 6 -600 -50 300 R 50 50 1 1 B -X 2.07/PB6 7 -600 -150 300 R 50 50 1 1 B -X 2.08/PA4 8 -600 -250 300 R 50 50 1 1 B -X 2.09/PA3 9 -600 -350 300 R 50 50 1 1 B -X 2.10/PA2 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# Ti_Booster_40_J3 -# -DEF Ti_Booster_40_J3 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J3" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 3.01/+5V 1 -600 450 300 R 50 50 1 1 W -X 3.02/GND 2 -600 350 300 R 50 50 1 1 B -X 3.03/PD0 3 -600 250 300 R 50 50 1 1 B -X 3.04/PD1 4 -600 150 300 R 50 50 1 1 B -X 3.05/PD2 5 -600 50 300 R 50 50 1 1 B -X 3.06/PD3 6 -600 -50 300 R 50 50 1 1 B -X 3.07/PE1 7 -600 -150 300 R 50 50 1 1 B -X 3.08/PE2 8 -600 -250 300 R 50 50 1 1 B -X 3.09/PE3 9 -600 -350 300 R 50 50 1 1 B -X 3.10/PF1 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# Ti_Booster_40_J4 -# -DEF Ti_Booster_40_J4 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J4" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 4.01/PF2 1 -600 450 300 R 50 50 1 1 W -X 4.02/PF3 2 -600 350 300 R 50 50 1 1 B -X 4.03/PB3 3 -600 250 300 R 50 50 1 1 B -X 4.04/PC4 4 -600 150 300 R 50 50 1 1 B -X 4.05/PC5 5 -600 50 300 R 50 50 1 1 B -X 4.06/PC6 6 -600 -50 300 R 50 50 1 1 B -X 4.07/PC7 7 -600 -150 300 R 50 50 1 1 B -X 4.08/PD6 8 -600 -250 300 R 50 50 1 1 B -X 4.09/PD7 9 -600 -350 300 R 50 50 1 1 B -X 4.10/PF4 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# Ti_Booster_J1 -# -DEF Ti_Booster_J1 J 0 40 Y Y 1 F N -F0 "J" -300 1300 60 H V C CNN -F1 "Ti_Booster_J1" -100 -1250 60 H V C CNN -DRAW -S -450 1200 500 -1150 0 1 0 N -X Vcc 1 -750 -950 300 R 50 50 1 1 W -X P1.0/LED1 2 -750 1100 300 R 50 50 1 1 B -X P1.1/Rxd 3 -750 1000 300 R 50 50 1 1 B -X P1.2/TxD 4 -750 900 300 R 50 50 1 1 B -X P1.3/S2 5 -750 800 300 R 50 50 1 1 B -X p1.4 6 -750 700 300 R 50 50 1 1 B -X P1.5 7 -750 600 300 R 50 50 1 1 B -X P2.0 8 -750 200 300 R 50 50 1 1 B -X P2.1 9 -750 100 300 R 50 50 1 1 B -X P2.2 10 -750 0 300 R 50 50 1 1 B -X Gnd 20 -750 -1050 300 R 50 50 1 1 B -X P2.3 11 -750 -100 300 R 50 50 1 1 B -X P2.4 12 -750 -200 300 R 50 50 1 1 B -X P2.5 13 -750 -300 300 R 50 50 1 1 B -X P1.6/Led2 14 -750 500 300 R 50 50 1 1 B -X P1.7 15 -750 400 300 R 50 50 1 1 B -X RST/S1 16 -750 -750 300 R 50 50 1 1 B -X Test 17 -750 -650 300 R 50 50 1 1 B -X P2.7/Xout 18 -750 -550 300 R 50 50 1 1 B -X P2.6/Xin 19 -750 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -#End Library diff --git a/template/ti-stellaris-boosterpack40/boosterpack40-cache.lib b/template/ti-stellaris-boosterpack40/boosterpack40-cache.lib deleted file mode 100644 index ea7c11ddf8..0000000000 --- a/template/ti-stellaris-boosterpack40/boosterpack40-cache.lib +++ /dev/null @@ -1,132 +0,0 @@ -EESchema-LIBRARY Version 2.3 Date: Thu 18 Oct 2012 10:04:05 PM PDT -#encoding utf-8 -# -# +5V -# -DEF +5V #PWR 0 40 Y Y 1 F P -F0 "#PWR" 0 90 20 H I C CNN -F1 "+5V" 0 90 30 H V C CNN -DRAW -X +5V 1 0 0 0 U 20 20 0 0 W N -C 0 50 20 0 1 0 N -P 4 0 1 0 0 0 0 30 0 30 0 30 N -ENDDRAW -ENDDEF -# -# CONN_3 -# -DEF CONN_3 K 0 40 Y N 1 F N -F0 "K" -50 0 50 V V C CNN -F1 "CONN_3" 50 0 40 V V C CNN -DRAW -S -100 150 100 -150 0 1 0 N -X P1 1 -350 100 250 R 60 60 1 1 P I -X PM 2 -350 0 250 R 60 60 1 1 P I -X P3 3 -350 -100 250 R 60 60 1 1 P I -ENDDRAW -ENDDEF -# -# GND -# -DEF ~GND #PWR 0 0 Y Y 1 F P -F0 "#PWR" 0 0 30 H I C CNN -F1 "GND" 0 -70 30 H I C CNN -DRAW -P 4 0 1 0 -50 0 0 -50 50 0 -50 0 N -X GND 1 0 0 0 U 30 30 1 1 W N -ENDDRAW -ENDDEF -# -# Ti_Booster_40_J1 -# -DEF Ti_Booster_40_J1 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J1" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 1.01/Vcc 1 -600 450 300 R 50 50 1 1 W -X 1.02/PB5 2 -600 350 300 R 50 50 1 1 B -X 1.03/PB0/Rxd 3 -600 250 300 R 50 50 1 1 B -X 1.04/PB1/TxD 4 -600 150 300 R 50 50 1 1 B -X 1.05/PE4 5 -600 50 300 R 50 50 1 1 B -X 1.06/PE5 6 -600 -50 300 R 50 50 1 1 B -X 1.07/PB4 7 -600 -150 300 R 50 50 1 1 B -X 1.08/PA5 8 -600 -250 300 R 50 50 1 1 B -X 1.09/PA6 9 -600 -350 300 R 50 50 1 1 B -X 1.10/PA7 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# Ti_Booster_40_J2 -# -DEF Ti_Booster_40_J2 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J2" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 2.01/GND 1 -600 450 300 R 50 50 1 1 W -X 2.02/PB2 2 -600 350 300 R 50 50 1 1 B -X 2.03/PE0 3 -600 250 300 R 50 50 1 1 B -X 2.04/PF0 4 -600 150 300 R 50 50 1 1 B -X 2.05/RESET 5 -600 50 300 R 50 50 1 1 B -X 2.06/PB7 6 -600 -50 300 R 50 50 1 1 B -X 2.07/PB6 7 -600 -150 300 R 50 50 1 1 B -X 2.08/PA4 8 -600 -250 300 R 50 50 1 1 B -X 2.09/PA3 9 -600 -350 300 R 50 50 1 1 B -X 2.10/PA2 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# Ti_Booster_40_J3 -# -DEF Ti_Booster_40_J3 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J3" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 3.01/+5V 1 -600 450 300 R 50 50 1 1 W -X 3.02/GND 2 -600 350 300 R 50 50 1 1 B -X 3.03/PD0 3 -600 250 300 R 50 50 1 1 B -X 3.04/PD1 4 -600 150 300 R 50 50 1 1 B -X 3.05/PD2 5 -600 50 300 R 50 50 1 1 B -X 3.06/PD3 6 -600 -50 300 R 50 50 1 1 B -X 3.07/PE1 7 -600 -150 300 R 50 50 1 1 B -X 3.08/PE2 8 -600 -250 300 R 50 50 1 1 B -X 3.09/PE3 9 -600 -350 300 R 50 50 1 1 B -X 3.10/PF1 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# Ti_Booster_40_J4 -# -DEF Ti_Booster_40_J4 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J4" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 4.01/PF2 1 -600 450 300 R 50 50 1 1 W -X 4.02/PF3 2 -600 350 300 R 50 50 1 1 B -X 4.03/PB3 3 -600 250 300 R 50 50 1 1 B -X 4.04/PC4 4 -600 150 300 R 50 50 1 1 B -X 4.05/PC5 5 -600 50 300 R 50 50 1 1 B -X 4.06/PC6 6 -600 -50 300 R 50 50 1 1 B -X 4.07/PC7 7 -600 -150 300 R 50 50 1 1 B -X 4.08/PD6 8 -600 -250 300 R 50 50 1 1 B -X 4.09/PD7 9 -600 -350 300 R 50 50 1 1 B -X 4.10/PF4 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# VCC -# -DEF VCC #PWR 0 0 Y Y 1 F P -F0 "#PWR" 0 100 30 H I C CNN -F1 "VCC" 0 100 30 H V C CNN -DRAW -X VCC 1 0 0 0 U 20 20 0 0 W N -C 0 50 20 0 1 0 N -P 3 0 1 0 0 0 0 30 0 30 N -ENDDRAW -ENDDEF -# -#End Library diff --git a/template/ti-stellaris-boosterpack40/boosterpack40.cmp b/template/ti-stellaris-boosterpack40/boosterpack40.cmp deleted file mode 100644 index eab4a19bd3..0000000000 --- a/template/ti-stellaris-boosterpack40/boosterpack40.cmp +++ /dev/null @@ -1,38 +0,0 @@ -Cmp-Mod V01 Created by CvPcb (2011-nov-30)-testing date = Thu 18 Oct 2012 09:58:43 PM PDT - -BeginCmp -TimeStamp = /5080DB5C; -Reference = J1; -ValeurCmp = TI_BOOSTER_40_J1; -IdModule = SIL-10; -EndCmp - -BeginCmp -TimeStamp = /5080DBF4; -Reference = J2; -ValeurCmp = TI_BOOSTER_40_J2; -IdModule = SIL-10; -EndCmp - -BeginCmp -TimeStamp = /5080DC03; -Reference = J3; -ValeurCmp = TI_BOOSTER_40_J3; -IdModule = SIL-10; -EndCmp - -BeginCmp -TimeStamp = /5080DC12; -Reference = J4; -ValeurCmp = TI_BOOSTER_40_J4; -IdModule = SIL-10; -EndCmp - -BeginCmp -TimeStamp = /5080A33C; -Reference = J5; -ValeurCmp = CONN_3; -IdModule = SIL-3; -EndCmp - -EndListe diff --git a/template/ti-stellaris-boosterpack40/boosterpack40.mod b/template/ti-stellaris-boosterpack40/boosterpack40.mod deleted file mode 100644 index f0ee628b9e..0000000000 --- a/template/ti-stellaris-boosterpack40/boosterpack40.mod +++ /dev/null @@ -1,160 +0,0 @@ -PCBNEW-LibModule-V1 Thu 18 Oct 2012 07:20:13 PM PDT -# encoding utf-8 -Units mm -$INDEX -BoosterPack_J1_J2 -$EndINDEX -$MODULE BoosterPack_J1_J2 -Po 0 0 0 15 5080B8D5 00000000 ~~ -Li BoosterPack_J1_J2 -Sc 0 -AR /5080AA0E -Op 0 0 0 -T0 0 8.89 1.524 1.524 0 0.3048 N V 21 N "J1" -T1 0 0 1.524 1.524 0 0.3048 N V 21 N "J1-J2" -DS -2.54 -3.81 48.26 -3.81 0.381 21 -DS 48.26 -3.81 48.26 26.67 0.381 21 -DS 48.26 26.67 -2.54 26.67 0.381 21 -DS -2.54 26.67 -2.54 -3.81 0.381 21 -$PAD -Sh "1" R 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 3 "VCC" -Po 0 0 -$EndPAD -$PAD -Sh "2" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 2.54 -$EndPAD -$PAD -Sh "3" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 5.08 -$EndPAD -$PAD -Sh "4" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 7.62 -$EndPAD -$PAD -Sh "5" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 10.16 -$EndPAD -$PAD -Sh "6" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 12.7 -$EndPAD -$PAD -Sh "7" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 2 "N-000002" -Po 0 15.24 -$EndPAD -$PAD -Sh "8" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 17.78 -$EndPAD -$PAD -Sh "9" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 20.32 -$EndPAD -$PAD -Sh "10" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 22.86 -$EndPAD -$PAD -Sh "11" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 22.86 -$EndPAD -$PAD -Sh "12" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 20.32 -$EndPAD -$PAD -Sh "13" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 17.78 -$EndPAD -$PAD -Sh "14" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 15.24 -$EndPAD -$PAD -Sh "15" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 12.7 -$EndPAD -$PAD -Sh "16" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 10.16 -$EndPAD -$PAD -Sh "17" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 7.62 -$EndPAD -$PAD -Sh "18" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 5.08 -$EndPAD -$PAD -Sh "19" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 2.54 -$EndPAD -$PAD -Sh "20" R 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 1 "GND" -Po 45.72 0 -$EndPAD -$EndMODULE BoosterPack_J1_J2 -$EndLIBRARY diff --git a/template/ti-stellaris-boosterpack40/boosterpack40.net b/template/ti-stellaris-boosterpack40/boosterpack40.net deleted file mode 100644 index 933e50d981..0000000000 --- a/template/ti-stellaris-boosterpack40/boosterpack40.net +++ /dev/null @@ -1,68 +0,0 @@ -# EESchema Netlist Version 1.1 created Thu 18 Oct 2012 09:58:06 PM PDT -( - ( /5080A33C $noname J5 CONN_3 {Lib=CONN_3} - ( 1 VCC ) - ( 2 GND ) - ( 3 GND ) - ) - ( /5080DB5C $noname J1 TI_BOOSTER_40_J1 {Lib=TI_BOOSTER_40_J1} - ( 1 VCC ) - ( 2 ? ) - ( 3 ? ) - ( 4 ? ) - ( 5 ? ) - ( 6 ? ) - ( 7 ? ) - ( 8 ? ) - ( 9 ? ) - ( 10 ? ) - ) - ( /5080DBF4 $noname J2 TI_BOOSTER_40_J2 {Lib=TI_BOOSTER_40_J2} - ( 1 GND ) - ( 2 ? ) - ( 3 ? ) - ( 4 ? ) - ( 5 ? ) - ( 6 ? ) - ( 7 ? ) - ( 8 ? ) - ( 9 ? ) - ( 10 ? ) - ) - ( /5080DC03 $noname J3 TI_BOOSTER_40_J3 {Lib=TI_BOOSTER_40_J3} - ( 1 +5V ) - ( 2 GND ) - ( 3 ? ) - ( 4 ? ) - ( 5 ? ) - ( 6 ? ) - ( 7 ? ) - ( 8 ? ) - ( 9 ? ) - ( 10 ? ) - ) - ( /5080DC12 $noname J4 TI_BOOSTER_40_J4 {Lib=TI_BOOSTER_40_J4} - ( 1 ? ) - ( 2 ? ) - ( 3 ? ) - ( 4 ? ) - ( 5 ? ) - ( 6 ? ) - ( 7 ? ) - ( 8 ? ) - ( 9 ? ) - ( 10 ? ) - ) -) -* -{ Pin List by Nets -Net 8 "GND" "GND" - J5 3 - J5 2 - J2 1 - J3 2 -Net 27 "VCC" "VCC" - J5 1 - J1 1 -} -#End diff --git a/template/ti-stellaris-boosterpack40/boosterpack40.pro b/template/ti-stellaris-boosterpack40/boosterpack40.pro deleted file mode 100644 index d2bacba234..0000000000 --- a/template/ti-stellaris-boosterpack40/boosterpack40.pro +++ /dev/null @@ -1,80 +0,0 @@ -update=Wed 10 Apr 2013 04:16:40 PM CDT -version=1 -last_client=eeschema -[cvpcb] -version=1 -NetIExt=net -[cvpcb/libraries] -EquName1=devcms -[pcbnew] -version=1 -LastNetListRead=boosterpack20.net -PadDrill=1.016 -PadSizeH=1.524 -PadSizeV=1.524 -PcbTextSizeV=1 -PcbTextSizeH=1 -PcbTextThickness=0.3 -ModuleTextSizeV=1 -ModuleTextSizeH=1 -ModuleTextSizeThickness=0.15 -SolderMaskClearance=0 -DrawSegmentWidth=0.2 -BoardOutlineThickness=0.15 -ModuleOutlineThickness=0.15 -[pcbnew/libraries] -LibDir= -LibName1=boosterpack20 -LibName2=sockets -LibName3=connect -LibName4=discret -LibName5=pin_array -LibName6=divers -LibName7=libcms -LibName8=display -LibName9=led -LibName10=dip_sockets -LibName11=pga_sockets -LibName12=valves -[general] -version=1 -[eeschema] -version=1 -LibDir= -NetFmtName= -RptD_X=0 -RptD_Y=100 -RptLab=1 -LabSize=60 -[eeschema/libraries] -LibName1=boosterpack -LibName2=power -LibName3=device -LibName4=transistors -LibName5=conn -LibName6=linear -LibName7=regul -LibName8=74xx -LibName9=cmos4000 -LibName10=adc-dac -LibName11=memory -LibName12=xilinx -LibName13=special -LibName14=microcontrollers -LibName15=dsp -LibName16=microchip -LibName17=analog_switches -LibName18=motorola -LibName19=texas -LibName20=intel -LibName21=audio -LibName22=interface -LibName23=digital-audio -LibName24=philips -LibName25=display -LibName26=cypress -LibName27=siliconi -LibName28=opto -LibName29=atmel -LibName30=contrib -LibName31=valves diff --git a/template/ti-stellaris-boosterpack40/boosterpack40.sch b/template/ti-stellaris-boosterpack40/boosterpack40.sch deleted file mode 100644 index fdc14e37bc..0000000000 --- a/template/ti-stellaris-boosterpack40/boosterpack40.sch +++ /dev/null @@ -1,156 +0,0 @@ -EESchema Schematic File Version 2 date Thu 18 Oct 2012 10:04:05 PM PDT -LIBS:boosterpack -LIBS:power -LIBS:device -LIBS:transistors -LIBS:conn -LIBS:linear -LIBS:regul -LIBS:74xx -LIBS:cmos4000 -LIBS:adc-dac -LIBS:memory -LIBS:xilinx -LIBS:special -LIBS:microcontrollers -LIBS:dsp -LIBS:microchip -LIBS:analog_switches -LIBS:motorola -LIBS:texas -LIBS:intel -LIBS:audio -LIBS:interface -LIBS:digital-audio -LIBS:philips -LIBS:display -LIBS:cypress -LIBS:siliconi -LIBS:opto -LIBS:atmel -LIBS:contrib -LIBS:valves -LIBS:boosterpack40-cache -EELAYER 27 0 -EELAYER END -$Descr A4 11693 8268 -encoding utf-8 -Sheet 1 1 -Title "" -Date "19 oct 2012" -Rev "" -Comp "" -Comment1 "" -Comment2 "" -Comment3 "" -Comment4 "" -$EndDescr -$Comp -L CONN_3 J5 -U 1 1 5080A33C -P 7600 6800 -F 0 "J5" V 7550 6800 50 0000 C CNN -F 1 "CONN_3" V 7650 6800 40 0000 C CNN - 1 7600 6800 - 1 0 0 1 -$EndComp -Wire Wire Line - 7250 6700 7000 6700 -Wire Wire Line - 7250 6900 7000 6900 -$Comp -L VCC #PWR01 -U 1 1 5080A56F -P 7000 6900 -F 0 "#PWR01" H 7000 7000 30 0001 C CNN -F 1 "VCC" H 7000 7000 30 0000 C CNN - 1 7000 6900 - 0 -1 -1 0 -$EndComp -$Comp -L GND #PWR02 -U 1 1 5080A57E -P 7000 6700 -F 0 "#PWR02" H 7000 6700 30 0001 C CNN -F 1 "GND" H 7000 6630 30 0001 C CNN - 1 7000 6700 - 0 1 1 0 -$EndComp -Wire Wire Line - 7100 6800 7100 6700 -Connection ~ 7100 6700 -Wire Wire Line - 7250 6800 7100 6800 -$Comp -L GND #PWR03 -U 1 1 5080AA99 -P 9150 2450 -F 0 "#PWR03" H 9150 2450 30 0001 C CNN -F 1 "GND" H 9150 2380 30 0001 C CNN - 1 9150 2450 - 0 1 1 0 -$EndComp -$Comp -L VCC #PWR04 -U 1 1 5080AA9F -P 9150 900 -F 0 "#PWR04" H 9150 1000 30 0001 C CNN -F 1 "VCC" H 9150 1000 30 0000 C CNN - 1 9150 900 - 0 -1 -1 0 -$EndComp -$Comp -L TI_BOOSTER_40_J1 J1 -U 1 1 5080DB5C -P 9750 1350 -F 0 "J1" H 9700 2000 60 0000 C CNN -F 1 "TI_BOOSTER_40_J1" H 9750 700 60 0000 C CNN - 1 9750 1350 - 1 0 0 -1 -$EndComp -$Comp -L TI_BOOSTER_40_J2 J2 -U 1 1 5080DBF4 -P 9750 2900 -F 0 "J2" H 9700 3550 60 0000 C CNN -F 1 "TI_BOOSTER_40_J2" H 9750 2250 60 0000 C CNN - 1 9750 2900 - 1 0 0 -1 -$EndComp -$Comp -L TI_BOOSTER_40_J3 J3 -U 1 1 5080DC03 -P 9750 4450 -F 0 "J3" H 9700 5100 60 0000 C CNN -F 1 "TI_BOOSTER_40_J3" H 9750 3800 60 0000 C CNN - 1 9750 4450 - 1 0 0 -1 -$EndComp -$Comp -L TI_BOOSTER_40_J4 J4 -U 1 1 5080DC12 -P 9750 6000 -F 0 "J4" H 9700 6650 60 0000 C CNN -F 1 "TI_BOOSTER_40_J4" H 9750 5350 60 0000 C CNN - 1 9750 6000 - 1 0 0 -1 -$EndComp -$Comp -L GND #PWR05 -U 1 1 5080DC79 -P 9150 4100 -F 0 "#PWR05" H 9150 4100 30 0001 C CNN -F 1 "GND" H 9150 4030 30 0001 C CNN - 1 9150 4100 - 0 1 1 0 -$EndComp -$Comp -L +5V #PWR06 -U 1 1 5080DC8B -P 9150 4000 -F 0 "#PWR06" H 9150 4090 20 0001 C CNN -F 1 "+5V" H 9150 4090 30 0000 C CNN - 1 9150 4000 - 0 -1 -1 0 -$EndComp -$EndSCHEMATC diff --git a/template/ti-stellaris-boosterpack40/boosterpack40_min.kicad_pcb b/template/ti-stellaris-boosterpack40/boosterpack40_min.kicad_pcb deleted file mode 100644 index 2ad6d40269..0000000000 --- a/template/ti-stellaris-boosterpack40/boosterpack40_min.kicad_pcb +++ /dev/null @@ -1,344 +0,0 @@ -(kicad_pcb (version 3) (host pcbnew "(2013-02-23 BZR 3971)-testing") - - (general - (links 1) - (no_connects 1) - (area 172.984525 104.605002 242.305477 149.137511) - (thickness 1.6) - (drawings 7) - (tracks 0) - (zones 0) - (modules 4) - (nets 4) - ) - - (page A3) - (layers - (15 Front signal) - (0 Back signal) - (16 Dessous.Adhes user) - (17 Dessus.Adhes user) - (18 Dessous.Pate user) - (19 Dessus.Pate user) - (20 Dessous.SilkS user) - (21 Dessus.SilkS user) - (22 Dessous.Masque user) - (23 Dessus.Masque user) - (24 Dessin.User user) - (25 Cmts.User user) - (26 Eco1.User user) - (27 Eco2.User user) - (28 Contours.Ci user) - ) - - (setup - (last_trace_width 0.254) - (trace_clearance 0.254) - (zone_clearance 0.508) - (zone_45_only no) - (trace_min 0.254) - (segment_width 0.20066) - (edge_width 0.14986) - (via_size 0.889) - (via_drill 0.635) - (via_min_size 0.889) - (via_min_drill 0.508) - (uvia_size 0.508) - (uvia_drill 0.127) - (uvias_allowed no) - (uvia_min_size 0.508) - (uvia_min_drill 0.127) - (pcb_text_width 0.3) - (pcb_text_size 1 1) - (mod_edge_width 0.14986) - (mod_text_size 1 1) - (mod_text_width 0.15) - (pad_size 1 1) - (pad_drill 0.6) - (pad_to_mask_clearance 0) - (aux_axis_origin 0 0) - (visible_elements 7FFFFFFF) - (pcbplotparams - (layerselection 3178497) - (usegerberextensions true) - (excludeedgelayer true) - (linewidth 152400) - (plotframeref false) - (viasonmask false) - (mode 1) - (useauxorigin false) - (hpglpennumber 1) - (hpglpenspeed 20) - (hpglpendiameter 15) - (hpglpenoverlay 2) - (psnegative false) - (psa4output false) - (plotreference true) - (plotvalue true) - (plotothertext true) - (plotinvisibletext false) - (padsonsilk false) - (subtractmaskfromsilk false) - (outputformat 1) - (mirror false) - (drillshape 1) - (scaleselection 1) - (outputdirectory "")) - ) - - (net 0 "") - (net 1 +5V) - (net 2 GND) - (net 3 VCC) - - (net_class Default "This is the default net class." - (clearance 0.254) - (trace_width 0.254) - (via_dia 0.889) - (via_drill 0.635) - (uvia_dia 0.508) - (uvia_drill 0.127) - (add_net "") - (add_net +5V) - (add_net GND) - (add_net VCC) - ) - - (module SIL-10 (layer Front) (tedit 5080DEE6) (tstamp 5080DE37) - (at 231.14 133.35 270) - (descr "Connecteur 10 pins") - (tags "CONN DEV") - (path /5080DBF4) - (fp_text reference J2 (at -13.97 0 360) (layer Dessus.SilkS) - (effects (font (size 1.72974 1.08712) (thickness 0.3048))) - ) - (fp_text value TI_BOOSTER_40_J2 (at 6.35 -2.54 270) (layer Dessus.SilkS) - (effects (font (size 1.524 1.016) (thickness 0.3048))) - ) - (fp_line (start -12.7 1.27) (end -12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -12.7 -1.27) (end 12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 -1.27) (end 12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 1.27) (end -12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -10.16 1.27) (end -10.16 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (pad 1 thru_hole rect (at -11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - (net 2 GND) - ) - (pad 2 thru_hole circle (at -8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 3 thru_hole circle (at -6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 4 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 5 thru_hole circle (at -1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 6 thru_hole circle (at 1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 7 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 8 thru_hole circle (at 6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 9 thru_hole circle (at 8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 10 thru_hole circle (at 11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - ) - - (module SIL-10 (layer Front) (tedit 5080DEED) (tstamp 5080DE4A) - (at 228.6 133.35 270) - (descr "Connecteur 10 pins") - (tags "CONN DEV") - (path /5080DC12) - (fp_text reference J4 (at -13.97 0 360) (layer Dessus.SilkS) - (effects (font (size 1.72974 1.08712) (thickness 0.3048))) - ) - (fp_text value TI_BOOSTER_40_J4 (at 6.35 -2.54 270) (layer Dessus.SilkS) - (effects (font (size 1.524 1.016) (thickness 0.3048))) - ) - (fp_line (start -12.7 1.27) (end -12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -12.7 -1.27) (end 12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 -1.27) (end 12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 1.27) (end -12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -10.16 1.27) (end -10.16 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (pad 1 thru_hole rect (at -11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 2 thru_hole circle (at -8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 3 thru_hole circle (at -6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 4 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 5 thru_hole circle (at -1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 6 thru_hole circle (at 1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 7 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 8 thru_hole circle (at 6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 9 thru_hole circle (at 8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 10 thru_hole circle (at 11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - ) - - (module SIL-10 (layer Front) (tedit 5080DEE0) (tstamp 5080AB71) - (at 187.96 133.35 270) - (descr "Connecteur 10 pins") - (tags "CONN DEV") - (path /5080DC03) - (fp_text reference J3 (at -13.97 0 360) (layer Dessus.SilkS) - (effects (font (size 1.72974 1.08712) (thickness 0.3048))) - ) - (fp_text value TI_BOOSTER_40_J3 (at 6.35 -2.54 270) (layer Dessus.SilkS) - (effects (font (size 1.524 1.016) (thickness 0.3048))) - ) - (fp_line (start -12.7 1.27) (end -12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -12.7 -1.27) (end 12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 -1.27) (end 12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 1.27) (end -12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -10.16 1.27) (end -10.16 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (pad 1 thru_hole rect (at -11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - (net 1 +5V) - ) - (pad 2 thru_hole circle (at -8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - (net 2 GND) - ) - (pad 3 thru_hole circle (at -6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 4 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 5 thru_hole circle (at -1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 6 thru_hole circle (at 1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 7 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 8 thru_hole circle (at 6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 9 thru_hole circle (at 8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 10 thru_hole circle (at 11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - ) - - (module SIL-10 (layer Front) (tedit 5080DEDC) (tstamp 5080AB8D) - (at 185.42 133.35 270) - (descr "Connecteur 10 pins") - (tags "CONN DEV") - (path /5080DB5C) - (fp_text reference J1 (at -13.97 0 360) (layer Dessus.SilkS) - (effects (font (size 1.72974 1.08712) (thickness 0.3048))) - ) - (fp_text value TI_BOOSTER_40_J1 (at 6.35 -2.54 270) (layer Dessus.SilkS) - (effects (font (size 1.524 1.016) (thickness 0.3048))) - ) - (fp_line (start -12.7 1.27) (end -12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -12.7 -1.27) (end 12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 -1.27) (end 12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 1.27) (end -12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -10.16 1.27) (end -10.16 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (pad 1 thru_hole rect (at -11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - (net 3 VCC) - ) - (pad 2 thru_hole circle (at -8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 3 thru_hole circle (at -6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 4 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 5 thru_hole circle (at -1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 6 thru_hole circle (at 1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 7 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 8 thru_hole circle (at 6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 9 thru_hole circle (at 8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 10 thru_hole circle (at 11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - ) - - (dimension 34.29 (width 0.25) (layer Dessin.User) - (gr_text "1.3500 in" (at 176.800001 130.175 270) (layer Dessin.User) - (effects (font (size 1 1) (thickness 0.25))) - ) - (feature1 (pts (xy 182.88 147.32) (xy 175.800001 147.32))) - (feature2 (pts (xy 182.88 113.03) (xy 175.800001 113.03))) - (crossbar (pts (xy 177.800001 113.03) (xy 177.800001 147.32))) - (arrow1a (pts (xy 177.800001 147.32) (xy 177.213581 146.193497))) - (arrow1b (pts (xy 177.800001 147.32) (xy 178.386421 146.193497))) - (arrow2a (pts (xy 177.800001 113.03) (xy 177.213581 114.156503))) - (arrow2b (pts (xy 177.800001 113.03) (xy 178.386421 114.156503))) - ) - (dimension 8.89 (width 0.25) (layer Dessin.User) - (gr_text "0.3500 in" (at 238.49 117.475 90) (layer Dessin.User) - (effects (font (size 1 1) (thickness 0.25))) - ) - (feature1 (pts (xy 231.14 113.03) (xy 239.49 113.03))) - (feature2 (pts (xy 231.14 121.92) (xy 239.49 121.92))) - (crossbar (pts (xy 237.49 121.92) (xy 237.49 113.03))) - (arrow1a (pts (xy 237.49 113.03) (xy 238.07642 114.156503))) - (arrow1b (pts (xy 237.49 113.03) (xy 236.90358 114.156503))) - (arrow2a (pts (xy 237.49 121.92) (xy 238.07642 120.793497))) - (arrow2b (pts (xy 237.49 121.92) (xy 236.90358 120.793497))) - ) - (gr_line (start 233.68 147.32) (end 182.88 147.32) (angle 90) (layer Contours.Ci) (width 0.15)) - (dimension 50.8 (width 0.25) (layer Dessin.User) - (gr_text "2.0000 in" (at 208.28 105.680002) (layer Dessin.User) - (effects (font (size 1 1) (thickness 0.25))) - ) - (feature1 (pts (xy 233.68 113.03) (xy 233.68 104.680002))) - (feature2 (pts (xy 182.88 113.03) (xy 182.88 104.680002))) - (crossbar (pts (xy 182.88 106.680002) (xy 233.68 106.680002))) - (arrow1a (pts (xy 233.68 106.680002) (xy 232.553497 107.266422))) - (arrow1b (pts (xy 233.68 106.680002) (xy 232.553497 106.093582))) - (arrow2a (pts (xy 182.88 106.680002) (xy 184.006503 107.266422))) - (arrow2b (pts (xy 182.88 106.680002) (xy 184.006503 106.093582))) - ) - (gr_line (start 182.88 147.32) (end 182.88 113.03) (angle 90) (layer Contours.Ci) (width 0.14986)) - (gr_line (start 233.68 113.03) (end 233.68 147.32) (angle 90) (layer Contours.Ci) (width 0.14986)) - (gr_line (start 182.88 113.03) (end 233.68 113.03) (angle 90) (layer Contours.Ci) (width 0.15)) - -) diff --git a/template/ti-stellaris-boosterpack40/meta/icon.png b/template/ti-stellaris-boosterpack40/meta/icon.png deleted file mode 100644 index d0bafd18c4308d51ebef62910f56cd4fce095bc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12485 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 L!4oH3@{9igq!C>7 diff --git a/template/ti-stellaris-boosterpack40/meta/info.html b/template/ti-stellaris-boosterpack40/meta/info.html deleted file mode 100644 index 25c107b711..0000000000 --- a/template/ti-stellaris-boosterpack40/meta/info.html +++ /dev/null @@ -1,22 +0,0 @@ - - -Ti Launchpad XL - Expansion Board - - -

Launchpad XL

-

Expansion Board

-This project template is the basis of an expansion board for the -TI Launchpad -board. -

-This Board conforms to the 40 pin Launchpad Standard at the maximum size and includes the optional J5 connector. -

-The board outline looks like the following: -
-40 Pin Launchpad -
-(c)2012 Brian Sidebotham
-(c)2012 Henry von Tresckow
-(c)2012 Kicad Developers
- - diff --git a/template/ti-stellaris-boosterpack40/meta/launchpad_standard40.png b/template/ti-stellaris-boosterpack40/meta/launchpad_standard40.png deleted file mode 100644 index c91907351ed74068b58928d51f9af9fe4726f978..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143031 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%0A6OrTV z>ur=<(+9^dw|&Te{S0?7Bb5|ESba6%*tpcmIJpj4m=OSQH5t^Si)0z zpV7kG2}ag{(>P`E1`0#lEn5&<2y5jd1X3T~F+fX3X5wjSM(B8=1LPx)|i)W@8K8Y80;(OH`g4Rc% z!c+#6exvKRifuT%x!%FB+># zh9${sLy|traQf9>CBq(jtYoyvgC&op zS#cy2N@*;zJmMczWpFmy?Z3qjcX^CjmaJ`j_r1dSF++6E;WAbhL)r@&<44BB5&9?R zl#+cMk8e}FrQLpipvq;D<-$Yq8tk6|$404qiW8=ul=`LiZ8U zKm#dV#bVyavL+2Y_tNA}l#lJzmdF#$o79=M3h}YxF1!_7stxoczr3tIWF7wjc?`0B~C>aaVC_c3UQNbb9dbEn5k4()9IjrVFnd1 zPS?jhV`F@ukM1>3f9)Yso#-sQ|MKNn@#Bn^5R%Lo7$7u!y80|Z=o9Mb%X;So-IKicHNPBqdfZ`+`k||84^d*7P`jYJe6dl^f5M=z+ffF4_kT>QB8 zTN}kw$oz+d2TRS)=aknV2~GU3NuyM5Wj@1yf|tcRB?EDLI@>MoZq>o^c3|D`j_tfI za4*0rt?e!k1c$083w+!S=G1tj4%5)r*H0GQ-G;qTj=xm`7P!n=(bvD7^Ns>1;-ob4A>tqT{ks2)2V=!`*{R#wH~sdGgVZR_ms zS#1|O5RDOo`C$D|Cv5;(d2$ufq^lg{n5w{eU8hK+k8iK$cvchq+mLdfXk{50ppiBQ z8FM#x_wtOVEo>gpnC$E9E~d>vMX4^!fq)TQoji90MLM7=iPD`r9q=?a&p_ITLd2zQ zd>k}Ww^bJ2QrKS)2Z^+kAEr!h+nvu~u^*zD&H-n24ZPO&w?2^WZfS3S1dzb-^S+kQ zmCERfFf~^C@kl45X!N-HC|J4(VmO)EaDy-|z>U391S@bk{4cbIxe@o$%fGY)QW-tO zGoIK=6pJy+x9^jPscSWT7rcfqc#SRyM9_A=K#rSG(9wR@ z6voQS$uT=WyQ!?)1w>U5q2;dtwd{|5ufk%W_eWKPP9aUu`P7%Ypwy1e%Gk(gtmbVG zs0b?sQ&)%#CKC`55hEgw+p3p*#z7e;N*rv^#=`ggvC!4s@$NRYn}q6E2mKUoaV)zL z#5(~qznRWRchC>U0Em@5mg^ysD)auhLO0p0I(F>W$3xd^eERD`2)ur z8Rr-uZB<-Q^U0jZ}n^1ie3vKW4ye%6w}-yv1+gcGIjl`oS5NEX2rV;4OCA7l&y z65+^K1|YwA0mR`Vaf-OCJ5>jM^3M0+1s9jG8_3lCj5;oA`)tg6<(!%MhSEuI{n6w7 zfqCFpb(qC?WGYua{x{E-+}S+zD`NUjXe6BQD)o0r@bgI+IiSwHfNf!u2bp3%!;5e3 zcRUq1V8&AOX+qxFXp;%)!; zXUsZoK4oD zwBbLQ+S~H43API@8-{)$T`C~Dyr|jh=whz!<)UJ&U0#=hLCi034cLX&9LQmQMp75z zb`Z3KvH^Gj5IpM({e5%(JoZJ92oHjOs^Bj&%zt9z-{AU(m!02Kakw)dj62`+QG zs7Ls{F&7*0_v~Gi-TZ&g1-zKbxjq^Y8}N|uB9;56bRai9otuVcVC=#F4)TAn7$zEm zTTRZUEC?^N0Yy*$KJK4T{vxsGu`CbIhrpv%cqaExitEqOzbKA6&V=&-@Zu$SLiGP_ d5qr;(`5t|JZ1EbY0Reo;-cyqLAZh6He*kT!50C%= diff --git a/template/ti-stellaris-boosterpack40_min/boosterpack.dcm b/template/ti-stellaris-boosterpack40_min/boosterpack.dcm deleted file mode 100644 index 43700435be..0000000000 --- a/template/ti-stellaris-boosterpack40_min/boosterpack.dcm +++ /dev/null @@ -1,3 +0,0 @@ -EESchema-DOCLIB Version 2.0 Date: Thu 18 Oct 2012 09:37:56 PM PDT -# -#End Doc Library diff --git a/template/ti-stellaris-boosterpack40_min/boosterpack.lib b/template/ti-stellaris-boosterpack40_min/boosterpack.lib deleted file mode 100644 index 24bc6fde0f..0000000000 --- a/template/ti-stellaris-boosterpack40_min/boosterpack.lib +++ /dev/null @@ -1,114 +0,0 @@ -EESchema-LIBRARY Version 2.3 Date: Thu 18 Oct 2012 09:37:56 PM PDT -#encoding utf-8 -# -# Ti_Booster_40_J1 -# -DEF Ti_Booster_40_J1 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J1" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 1.01/Vcc 1 -600 450 300 R 50 50 1 1 W -X 1.02/PB5 2 -600 350 300 R 50 50 1 1 B -X 1.03/PB0/Rxd 3 -600 250 300 R 50 50 1 1 B -X 1.04/PB1/TxD 4 -600 150 300 R 50 50 1 1 B -X 1.05/PE4 5 -600 50 300 R 50 50 1 1 B -X 1.06/PE5 6 -600 -50 300 R 50 50 1 1 B -X 1.07/PB4 7 -600 -150 300 R 50 50 1 1 B -X 1.08/PA5 8 -600 -250 300 R 50 50 1 1 B -X 1.09/PA6 9 -600 -350 300 R 50 50 1 1 B -X 1.10/PA7 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# Ti_Booster_40_J2 -# -DEF Ti_Booster_40_J2 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J2" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 2.01/GND 1 -600 450 300 R 50 50 1 1 W -X 2.02/PB2 2 -600 350 300 R 50 50 1 1 B -X 2.03/PE0 3 -600 250 300 R 50 50 1 1 B -X 2.04/PF0 4 -600 150 300 R 50 50 1 1 B -X 2.05/RESET 5 -600 50 300 R 50 50 1 1 B -X 2.06/PB7 6 -600 -50 300 R 50 50 1 1 B -X 2.07/PB6 7 -600 -150 300 R 50 50 1 1 B -X 2.08/PA4 8 -600 -250 300 R 50 50 1 1 B -X 2.09/PA3 9 -600 -350 300 R 50 50 1 1 B -X 2.10/PA2 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# Ti_Booster_40_J3 -# -DEF Ti_Booster_40_J3 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J3" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 3.01/+5V 1 -600 450 300 R 50 50 1 1 W -X 3.02/GND 2 -600 350 300 R 50 50 1 1 B -X 3.03/PD0 3 -600 250 300 R 50 50 1 1 B -X 3.04/PD1 4 -600 150 300 R 50 50 1 1 B -X 3.05/PD2 5 -600 50 300 R 50 50 1 1 B -X 3.06/PD3 6 -600 -50 300 R 50 50 1 1 B -X 3.07/PE1 7 -600 -150 300 R 50 50 1 1 B -X 3.08/PE2 8 -600 -250 300 R 50 50 1 1 B -X 3.09/PE3 9 -600 -350 300 R 50 50 1 1 B -X 3.10/PF1 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# Ti_Booster_40_J4 -# -DEF Ti_Booster_40_J4 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J4" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 4.01/PF2 1 -600 450 300 R 50 50 1 1 W -X 4.02/PF3 2 -600 350 300 R 50 50 1 1 B -X 4.03/PB3 3 -600 250 300 R 50 50 1 1 B -X 4.04/PC4 4 -600 150 300 R 50 50 1 1 B -X 4.05/PC5 5 -600 50 300 R 50 50 1 1 B -X 4.06/PC6 6 -600 -50 300 R 50 50 1 1 B -X 4.07/PC7 7 -600 -150 300 R 50 50 1 1 B -X 4.08/PD6 8 -600 -250 300 R 50 50 1 1 B -X 4.09/PD7 9 -600 -350 300 R 50 50 1 1 B -X 4.10/PF4 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# Ti_Booster_J1 -# -DEF Ti_Booster_J1 J 0 40 Y Y 1 F N -F0 "J" -300 1300 60 H V C CNN -F1 "Ti_Booster_J1" -100 -1250 60 H V C CNN -DRAW -S -450 1200 500 -1150 0 1 0 N -X Vcc 1 -750 -950 300 R 50 50 1 1 W -X P1.0/LED1 2 -750 1100 300 R 50 50 1 1 B -X P1.1/Rxd 3 -750 1000 300 R 50 50 1 1 B -X P1.2/TxD 4 -750 900 300 R 50 50 1 1 B -X P1.3/S2 5 -750 800 300 R 50 50 1 1 B -X p1.4 6 -750 700 300 R 50 50 1 1 B -X P1.5 7 -750 600 300 R 50 50 1 1 B -X P2.0 8 -750 200 300 R 50 50 1 1 B -X P2.1 9 -750 100 300 R 50 50 1 1 B -X P2.2 10 -750 0 300 R 50 50 1 1 B -X Gnd 20 -750 -1050 300 R 50 50 1 1 B -X P2.3 11 -750 -100 300 R 50 50 1 1 B -X P2.4 12 -750 -200 300 R 50 50 1 1 B -X P2.5 13 -750 -300 300 R 50 50 1 1 B -X P1.6/Led2 14 -750 500 300 R 50 50 1 1 B -X P1.7 15 -750 400 300 R 50 50 1 1 B -X RST/S1 16 -750 -750 300 R 50 50 1 1 B -X Test 17 -750 -650 300 R 50 50 1 1 B -X P2.7/Xout 18 -750 -550 300 R 50 50 1 1 B -X P2.6/Xin 19 -750 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -#End Library diff --git a/template/ti-stellaris-boosterpack40_min/boosterpack40_min-cache.lib b/template/ti-stellaris-boosterpack40_min/boosterpack40_min-cache.lib deleted file mode 100644 index 3c9da8d784..0000000000 --- a/template/ti-stellaris-boosterpack40_min/boosterpack40_min-cache.lib +++ /dev/null @@ -1,119 +0,0 @@ -EESchema-LIBRARY Version 2.3 Date: Thu 18 Oct 2012 10:11:13 PM PDT -#encoding utf-8 -# -# +5V -# -DEF +5V #PWR 0 40 Y Y 1 F P -F0 "#PWR" 0 90 20 H I C CNN -F1 "+5V" 0 90 30 H V C CNN -DRAW -X +5V 1 0 0 0 U 20 20 0 0 W N -C 0 50 20 0 1 0 N -P 4 0 1 0 0 0 0 30 0 30 0 30 N -ENDDRAW -ENDDEF -# -# GND -# -DEF ~GND #PWR 0 0 Y Y 1 F P -F0 "#PWR" 0 0 30 H I C CNN -F1 "GND" 0 -70 30 H I C CNN -DRAW -P 4 0 1 0 -50 0 0 -50 50 0 -50 0 N -X GND 1 0 0 0 U 30 30 1 1 W N -ENDDRAW -ENDDEF -# -# Ti_Booster_40_J1 -# -DEF Ti_Booster_40_J1 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J1" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 1.01/Vcc 1 -600 450 300 R 50 50 1 1 W -X 1.02/PB5 2 -600 350 300 R 50 50 1 1 B -X 1.03/PB0/Rxd 3 -600 250 300 R 50 50 1 1 B -X 1.04/PB1/TxD 4 -600 150 300 R 50 50 1 1 B -X 1.05/PE4 5 -600 50 300 R 50 50 1 1 B -X 1.06/PE5 6 -600 -50 300 R 50 50 1 1 B -X 1.07/PB4 7 -600 -150 300 R 50 50 1 1 B -X 1.08/PA5 8 -600 -250 300 R 50 50 1 1 B -X 1.09/PA6 9 -600 -350 300 R 50 50 1 1 B -X 1.10/PA7 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# Ti_Booster_40_J2 -# -DEF Ti_Booster_40_J2 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J2" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 2.01/GND 1 -600 450 300 R 50 50 1 1 W -X 2.02/PB2 2 -600 350 300 R 50 50 1 1 B -X 2.03/PE0 3 -600 250 300 R 50 50 1 1 B -X 2.04/PF0 4 -600 150 300 R 50 50 1 1 B -X 2.05/RESET 5 -600 50 300 R 50 50 1 1 B -X 2.06/PB7 6 -600 -50 300 R 50 50 1 1 B -X 2.07/PB6 7 -600 -150 300 R 50 50 1 1 B -X 2.08/PA4 8 -600 -250 300 R 50 50 1 1 B -X 2.09/PA3 9 -600 -350 300 R 50 50 1 1 B -X 2.10/PA2 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# Ti_Booster_40_J3 -# -DEF Ti_Booster_40_J3 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J3" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 3.01/+5V 1 -600 450 300 R 50 50 1 1 W -X 3.02/GND 2 -600 350 300 R 50 50 1 1 B -X 3.03/PD0 3 -600 250 300 R 50 50 1 1 B -X 3.04/PD1 4 -600 150 300 R 50 50 1 1 B -X 3.05/PD2 5 -600 50 300 R 50 50 1 1 B -X 3.06/PD3 6 -600 -50 300 R 50 50 1 1 B -X 3.07/PE1 7 -600 -150 300 R 50 50 1 1 B -X 3.08/PE2 8 -600 -250 300 R 50 50 1 1 B -X 3.09/PE3 9 -600 -350 300 R 50 50 1 1 B -X 3.10/PF1 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# Ti_Booster_40_J4 -# -DEF Ti_Booster_40_J4 J 0 40 Y Y 1 F N -F0 "J" -50 650 60 H V C CNN -F1 "Ti_Booster_40_J4" 0 -650 60 H V C CNN -DRAW -S -300 550 400 -550 0 1 0 N -X 4.01/PF2 1 -600 450 300 R 50 50 1 1 W -X 4.02/PF3 2 -600 350 300 R 50 50 1 1 B -X 4.03/PB3 3 -600 250 300 R 50 50 1 1 B -X 4.04/PC4 4 -600 150 300 R 50 50 1 1 B -X 4.05/PC5 5 -600 50 300 R 50 50 1 1 B -X 4.06/PC6 6 -600 -50 300 R 50 50 1 1 B -X 4.07/PC7 7 -600 -150 300 R 50 50 1 1 B -X 4.08/PD6 8 -600 -250 300 R 50 50 1 1 B -X 4.09/PD7 9 -600 -350 300 R 50 50 1 1 B -X 4.10/PF4 10 -600 -450 300 R 50 50 1 1 B -ENDDRAW -ENDDEF -# -# VCC -# -DEF VCC #PWR 0 0 Y Y 1 F P -F0 "#PWR" 0 100 30 H I C CNN -F1 "VCC" 0 100 30 H V C CNN -DRAW -X VCC 1 0 0 0 U 20 20 0 0 W N -C 0 50 20 0 1 0 N -P 3 0 1 0 0 0 0 30 0 30 N -ENDDRAW -ENDDEF -# -#End Library diff --git a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.cmp b/template/ti-stellaris-boosterpack40_min/boosterpack40_min.cmp deleted file mode 100644 index eab4a19bd3..0000000000 --- a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.cmp +++ /dev/null @@ -1,38 +0,0 @@ -Cmp-Mod V01 Created by CvPcb (2011-nov-30)-testing date = Thu 18 Oct 2012 09:58:43 PM PDT - -BeginCmp -TimeStamp = /5080DB5C; -Reference = J1; -ValeurCmp = TI_BOOSTER_40_J1; -IdModule = SIL-10; -EndCmp - -BeginCmp -TimeStamp = /5080DBF4; -Reference = J2; -ValeurCmp = TI_BOOSTER_40_J2; -IdModule = SIL-10; -EndCmp - -BeginCmp -TimeStamp = /5080DC03; -Reference = J3; -ValeurCmp = TI_BOOSTER_40_J3; -IdModule = SIL-10; -EndCmp - -BeginCmp -TimeStamp = /5080DC12; -Reference = J4; -ValeurCmp = TI_BOOSTER_40_J4; -IdModule = SIL-10; -EndCmp - -BeginCmp -TimeStamp = /5080A33C; -Reference = J5; -ValeurCmp = CONN_3; -IdModule = SIL-3; -EndCmp - -EndListe diff --git a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.kicad_pcb b/template/ti-stellaris-boosterpack40_min/boosterpack40_min.kicad_pcb deleted file mode 100644 index 2ad6d40269..0000000000 --- a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.kicad_pcb +++ /dev/null @@ -1,344 +0,0 @@ -(kicad_pcb (version 3) (host pcbnew "(2013-02-23 BZR 3971)-testing") - - (general - (links 1) - (no_connects 1) - (area 172.984525 104.605002 242.305477 149.137511) - (thickness 1.6) - (drawings 7) - (tracks 0) - (zones 0) - (modules 4) - (nets 4) - ) - - (page A3) - (layers - (15 Front signal) - (0 Back signal) - (16 Dessous.Adhes user) - (17 Dessus.Adhes user) - (18 Dessous.Pate user) - (19 Dessus.Pate user) - (20 Dessous.SilkS user) - (21 Dessus.SilkS user) - (22 Dessous.Masque user) - (23 Dessus.Masque user) - (24 Dessin.User user) - (25 Cmts.User user) - (26 Eco1.User user) - (27 Eco2.User user) - (28 Contours.Ci user) - ) - - (setup - (last_trace_width 0.254) - (trace_clearance 0.254) - (zone_clearance 0.508) - (zone_45_only no) - (trace_min 0.254) - (segment_width 0.20066) - (edge_width 0.14986) - (via_size 0.889) - (via_drill 0.635) - (via_min_size 0.889) - (via_min_drill 0.508) - (uvia_size 0.508) - (uvia_drill 0.127) - (uvias_allowed no) - (uvia_min_size 0.508) - (uvia_min_drill 0.127) - (pcb_text_width 0.3) - (pcb_text_size 1 1) - (mod_edge_width 0.14986) - (mod_text_size 1 1) - (mod_text_width 0.15) - (pad_size 1 1) - (pad_drill 0.6) - (pad_to_mask_clearance 0) - (aux_axis_origin 0 0) - (visible_elements 7FFFFFFF) - (pcbplotparams - (layerselection 3178497) - (usegerberextensions true) - (excludeedgelayer true) - (linewidth 152400) - (plotframeref false) - (viasonmask false) - (mode 1) - (useauxorigin false) - (hpglpennumber 1) - (hpglpenspeed 20) - (hpglpendiameter 15) - (hpglpenoverlay 2) - (psnegative false) - (psa4output false) - (plotreference true) - (plotvalue true) - (plotothertext true) - (plotinvisibletext false) - (padsonsilk false) - (subtractmaskfromsilk false) - (outputformat 1) - (mirror false) - (drillshape 1) - (scaleselection 1) - (outputdirectory "")) - ) - - (net 0 "") - (net 1 +5V) - (net 2 GND) - (net 3 VCC) - - (net_class Default "This is the default net class." - (clearance 0.254) - (trace_width 0.254) - (via_dia 0.889) - (via_drill 0.635) - (uvia_dia 0.508) - (uvia_drill 0.127) - (add_net "") - (add_net +5V) - (add_net GND) - (add_net VCC) - ) - - (module SIL-10 (layer Front) (tedit 5080DEE6) (tstamp 5080DE37) - (at 231.14 133.35 270) - (descr "Connecteur 10 pins") - (tags "CONN DEV") - (path /5080DBF4) - (fp_text reference J2 (at -13.97 0 360) (layer Dessus.SilkS) - (effects (font (size 1.72974 1.08712) (thickness 0.3048))) - ) - (fp_text value TI_BOOSTER_40_J2 (at 6.35 -2.54 270) (layer Dessus.SilkS) - (effects (font (size 1.524 1.016) (thickness 0.3048))) - ) - (fp_line (start -12.7 1.27) (end -12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -12.7 -1.27) (end 12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 -1.27) (end 12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 1.27) (end -12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -10.16 1.27) (end -10.16 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (pad 1 thru_hole rect (at -11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - (net 2 GND) - ) - (pad 2 thru_hole circle (at -8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 3 thru_hole circle (at -6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 4 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 5 thru_hole circle (at -1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 6 thru_hole circle (at 1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 7 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 8 thru_hole circle (at 6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 9 thru_hole circle (at 8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 10 thru_hole circle (at 11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - ) - - (module SIL-10 (layer Front) (tedit 5080DEED) (tstamp 5080DE4A) - (at 228.6 133.35 270) - (descr "Connecteur 10 pins") - (tags "CONN DEV") - (path /5080DC12) - (fp_text reference J4 (at -13.97 0 360) (layer Dessus.SilkS) - (effects (font (size 1.72974 1.08712) (thickness 0.3048))) - ) - (fp_text value TI_BOOSTER_40_J4 (at 6.35 -2.54 270) (layer Dessus.SilkS) - (effects (font (size 1.524 1.016) (thickness 0.3048))) - ) - (fp_line (start -12.7 1.27) (end -12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -12.7 -1.27) (end 12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 -1.27) (end 12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 1.27) (end -12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -10.16 1.27) (end -10.16 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (pad 1 thru_hole rect (at -11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 2 thru_hole circle (at -8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 3 thru_hole circle (at -6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 4 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 5 thru_hole circle (at -1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 6 thru_hole circle (at 1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 7 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 8 thru_hole circle (at 6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 9 thru_hole circle (at 8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 10 thru_hole circle (at 11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - ) - - (module SIL-10 (layer Front) (tedit 5080DEE0) (tstamp 5080AB71) - (at 187.96 133.35 270) - (descr "Connecteur 10 pins") - (tags "CONN DEV") - (path /5080DC03) - (fp_text reference J3 (at -13.97 0 360) (layer Dessus.SilkS) - (effects (font (size 1.72974 1.08712) (thickness 0.3048))) - ) - (fp_text value TI_BOOSTER_40_J3 (at 6.35 -2.54 270) (layer Dessus.SilkS) - (effects (font (size 1.524 1.016) (thickness 0.3048))) - ) - (fp_line (start -12.7 1.27) (end -12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -12.7 -1.27) (end 12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 -1.27) (end 12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 1.27) (end -12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -10.16 1.27) (end -10.16 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (pad 1 thru_hole rect (at -11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - (net 1 +5V) - ) - (pad 2 thru_hole circle (at -8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - (net 2 GND) - ) - (pad 3 thru_hole circle (at -6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 4 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 5 thru_hole circle (at -1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 6 thru_hole circle (at 1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 7 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 8 thru_hole circle (at 6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 9 thru_hole circle (at 8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 10 thru_hole circle (at 11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - ) - - (module SIL-10 (layer Front) (tedit 5080DEDC) (tstamp 5080AB8D) - (at 185.42 133.35 270) - (descr "Connecteur 10 pins") - (tags "CONN DEV") - (path /5080DB5C) - (fp_text reference J1 (at -13.97 0 360) (layer Dessus.SilkS) - (effects (font (size 1.72974 1.08712) (thickness 0.3048))) - ) - (fp_text value TI_BOOSTER_40_J1 (at 6.35 -2.54 270) (layer Dessus.SilkS) - (effects (font (size 1.524 1.016) (thickness 0.3048))) - ) - (fp_line (start -12.7 1.27) (end -12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -12.7 -1.27) (end 12.7 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 -1.27) (end 12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start 12.7 1.27) (end -12.7 1.27) (layer Dessus.SilkS) (width 0.3048)) - (fp_line (start -10.16 1.27) (end -10.16 -1.27) (layer Dessus.SilkS) (width 0.3048)) - (pad 1 thru_hole rect (at -11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - (net 3 VCC) - ) - (pad 2 thru_hole circle (at -8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 3 thru_hole circle (at -6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 4 thru_hole circle (at -3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 5 thru_hole circle (at -1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 6 thru_hole circle (at 1.27 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 7 thru_hole circle (at 3.81 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 8 thru_hole circle (at 6.35 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 9 thru_hole circle (at 8.89 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - (pad 10 thru_hole circle (at 11.43 0 270) (size 1.397 1.397) (drill 0.8128) - (layers *.Cu *.Mask Dessus.SilkS) - ) - ) - - (dimension 34.29 (width 0.25) (layer Dessin.User) - (gr_text "1.3500 in" (at 176.800001 130.175 270) (layer Dessin.User) - (effects (font (size 1 1) (thickness 0.25))) - ) - (feature1 (pts (xy 182.88 147.32) (xy 175.800001 147.32))) - (feature2 (pts (xy 182.88 113.03) (xy 175.800001 113.03))) - (crossbar (pts (xy 177.800001 113.03) (xy 177.800001 147.32))) - (arrow1a (pts (xy 177.800001 147.32) (xy 177.213581 146.193497))) - (arrow1b (pts (xy 177.800001 147.32) (xy 178.386421 146.193497))) - (arrow2a (pts (xy 177.800001 113.03) (xy 177.213581 114.156503))) - (arrow2b (pts (xy 177.800001 113.03) (xy 178.386421 114.156503))) - ) - (dimension 8.89 (width 0.25) (layer Dessin.User) - (gr_text "0.3500 in" (at 238.49 117.475 90) (layer Dessin.User) - (effects (font (size 1 1) (thickness 0.25))) - ) - (feature1 (pts (xy 231.14 113.03) (xy 239.49 113.03))) - (feature2 (pts (xy 231.14 121.92) (xy 239.49 121.92))) - (crossbar (pts (xy 237.49 121.92) (xy 237.49 113.03))) - (arrow1a (pts (xy 237.49 113.03) (xy 238.07642 114.156503))) - (arrow1b (pts (xy 237.49 113.03) (xy 236.90358 114.156503))) - (arrow2a (pts (xy 237.49 121.92) (xy 238.07642 120.793497))) - (arrow2b (pts (xy 237.49 121.92) (xy 236.90358 120.793497))) - ) - (gr_line (start 233.68 147.32) (end 182.88 147.32) (angle 90) (layer Contours.Ci) (width 0.15)) - (dimension 50.8 (width 0.25) (layer Dessin.User) - (gr_text "2.0000 in" (at 208.28 105.680002) (layer Dessin.User) - (effects (font (size 1 1) (thickness 0.25))) - ) - (feature1 (pts (xy 233.68 113.03) (xy 233.68 104.680002))) - (feature2 (pts (xy 182.88 113.03) (xy 182.88 104.680002))) - (crossbar (pts (xy 182.88 106.680002) (xy 233.68 106.680002))) - (arrow1a (pts (xy 233.68 106.680002) (xy 232.553497 107.266422))) - (arrow1b (pts (xy 233.68 106.680002) (xy 232.553497 106.093582))) - (arrow2a (pts (xy 182.88 106.680002) (xy 184.006503 107.266422))) - (arrow2b (pts (xy 182.88 106.680002) (xy 184.006503 106.093582))) - ) - (gr_line (start 182.88 147.32) (end 182.88 113.03) (angle 90) (layer Contours.Ci) (width 0.14986)) - (gr_line (start 233.68 113.03) (end 233.68 147.32) (angle 90) (layer Contours.Ci) (width 0.14986)) - (gr_line (start 182.88 113.03) (end 233.68 113.03) (angle 90) (layer Contours.Ci) (width 0.15)) - -) diff --git a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.mod b/template/ti-stellaris-boosterpack40_min/boosterpack40_min.mod deleted file mode 100644 index f0ee628b9e..0000000000 --- a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.mod +++ /dev/null @@ -1,160 +0,0 @@ -PCBNEW-LibModule-V1 Thu 18 Oct 2012 07:20:13 PM PDT -# encoding utf-8 -Units mm -$INDEX -BoosterPack_J1_J2 -$EndINDEX -$MODULE BoosterPack_J1_J2 -Po 0 0 0 15 5080B8D5 00000000 ~~ -Li BoosterPack_J1_J2 -Sc 0 -AR /5080AA0E -Op 0 0 0 -T0 0 8.89 1.524 1.524 0 0.3048 N V 21 N "J1" -T1 0 0 1.524 1.524 0 0.3048 N V 21 N "J1-J2" -DS -2.54 -3.81 48.26 -3.81 0.381 21 -DS 48.26 -3.81 48.26 26.67 0.381 21 -DS 48.26 26.67 -2.54 26.67 0.381 21 -DS -2.54 26.67 -2.54 -3.81 0.381 21 -$PAD -Sh "1" R 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 3 "VCC" -Po 0 0 -$EndPAD -$PAD -Sh "2" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 2.54 -$EndPAD -$PAD -Sh "3" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 5.08 -$EndPAD -$PAD -Sh "4" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 7.62 -$EndPAD -$PAD -Sh "5" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 10.16 -$EndPAD -$PAD -Sh "6" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 12.7 -$EndPAD -$PAD -Sh "7" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 2 "N-000002" -Po 0 15.24 -$EndPAD -$PAD -Sh "8" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 17.78 -$EndPAD -$PAD -Sh "9" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 20.32 -$EndPAD -$PAD -Sh "10" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 0 22.86 -$EndPAD -$PAD -Sh "11" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 22.86 -$EndPAD -$PAD -Sh "12" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 20.32 -$EndPAD -$PAD -Sh "13" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 17.78 -$EndPAD -$PAD -Sh "14" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 15.24 -$EndPAD -$PAD -Sh "15" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 12.7 -$EndPAD -$PAD -Sh "16" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 10.16 -$EndPAD -$PAD -Sh "17" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 7.62 -$EndPAD -$PAD -Sh "18" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 5.08 -$EndPAD -$PAD -Sh "19" C 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 0 "" -Po 45.72 2.54 -$EndPAD -$PAD -Sh "20" R 1.524 1.524 0 0 0 -Dr 1.016 0 0 -At STD N 00E0FFFF -Ne 1 "GND" -Po 45.72 0 -$EndPAD -$EndMODULE BoosterPack_J1_J2 -$EndLIBRARY diff --git a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.net b/template/ti-stellaris-boosterpack40_min/boosterpack40_min.net deleted file mode 100644 index cdd85cc3b9..0000000000 --- a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.net +++ /dev/null @@ -1,58 +0,0 @@ -# EESchema Netlist Version 1.1 created Thu 18 Oct 2012 10:10:38 PM PDT -( - ( /5080DB5C $noname J1 TI_BOOSTER_40_J1 {Lib=TI_BOOSTER_40_J1} - ( 1 VCC ) - ( 2 ? ) - ( 3 ? ) - ( 4 ? ) - ( 5 ? ) - ( 6 ? ) - ( 7 ? ) - ( 8 ? ) - ( 9 ? ) - ( 10 ? ) - ) - ( /5080DBF4 $noname J2 TI_BOOSTER_40_J2 {Lib=TI_BOOSTER_40_J2} - ( 1 GND ) - ( 2 ? ) - ( 3 ? ) - ( 4 ? ) - ( 5 ? ) - ( 6 ? ) - ( 7 ? ) - ( 8 ? ) - ( 9 ? ) - ( 10 ? ) - ) - ( /5080DC03 $noname J3 TI_BOOSTER_40_J3 {Lib=TI_BOOSTER_40_J3} - ( 1 +5V ) - ( 2 GND ) - ( 3 ? ) - ( 4 ? ) - ( 5 ? ) - ( 6 ? ) - ( 7 ? ) - ( 8 ? ) - ( 9 ? ) - ( 10 ? ) - ) - ( /5080DC12 $noname J4 TI_BOOSTER_40_J4 {Lib=TI_BOOSTER_40_J4} - ( 1 ? ) - ( 2 ? ) - ( 3 ? ) - ( 4 ? ) - ( 5 ? ) - ( 6 ? ) - ( 7 ? ) - ( 8 ? ) - ( 9 ? ) - ( 10 ? ) - ) -) -* -{ Pin List by Nets -Net 2 "GND" "GND" - J3 2 - J2 1 -} -#End diff --git a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.pro b/template/ti-stellaris-boosterpack40_min/boosterpack40_min.pro deleted file mode 100644 index 118f8ba7c0..0000000000 --- a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.pro +++ /dev/null @@ -1,80 +0,0 @@ -update=Thu 18 Oct 2012 10:08:50 PM PDT -version=1 -last_client=kicad -[eeschema] -version=1 -LibDir= -NetFmtName= -RptD_X=0 -RptD_Y=100 -RptLab=1 -LabSize=60 -[eeschema/libraries] -LibName1=boosterpack -LibName2=power -LibName3=device -LibName4=transistors -LibName5=conn -LibName6=linear -LibName7=regul -LibName8=74xx -LibName9=cmos4000 -LibName10=adc-dac -LibName11=memory -LibName12=xilinx -LibName13=special -LibName14=microcontrollers -LibName15=dsp -LibName16=microchip -LibName17=analog_switches -LibName18=motorola -LibName19=texas -LibName20=intel -LibName21=audio -LibName22=interface -LibName23=digital-audio -LibName24=philips -LibName25=display -LibName26=cypress -LibName27=siliconi -LibName28=opto -LibName29=atmel -LibName30=contrib -LibName31=valves -[cvpcb] -version=1 -NetIExt=net -[cvpcb/libraries] -EquName1=devcms -[pcbnew] -version=1 -LastNetListRead=boosterpack20.net -PadDrill=1.016 -PadSizeH=1.524 -PadSizeV=1.524 -PcbTextSizeV=1 -PcbTextSizeH=1 -PcbTextThickness=0.3 -ModuleTextSizeV=1 -ModuleTextSizeH=1 -ModuleTextSizeThickness=0.15 -SolderMaskClearance=0 -DrawSegmentWidth=0.2 -BoardOutlineThickness=0.15 -ModuleOutlineThickness=0.15 -[pcbnew/libraries] -LibDir= -LibName1=boosterpack20 -LibName2=sockets -LibName3=connect -LibName4=discret -LibName5=pin_array -LibName6=divers -LibName7=libcms -LibName8=display -LibName9=led -LibName10=dip_sockets -LibName11=pga_sockets -LibName12=valves -[general] -version=1 diff --git a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.sch b/template/ti-stellaris-boosterpack40_min/boosterpack40_min.sch deleted file mode 100644 index 0877de70c7..0000000000 --- a/template/ti-stellaris-boosterpack40_min/boosterpack40_min.sch +++ /dev/null @@ -1,120 +0,0 @@ -EESchema Schematic File Version 2 date Thu 18 Oct 2012 10:11:13 PM PDT -LIBS:boosterpack -LIBS:power -LIBS:device -LIBS:transistors -LIBS:conn -LIBS:linear -LIBS:regul -LIBS:74xx -LIBS:cmos4000 -LIBS:adc-dac -LIBS:memory -LIBS:xilinx -LIBS:special -LIBS:microcontrollers -LIBS:dsp -LIBS:microchip -LIBS:analog_switches -LIBS:motorola -LIBS:texas -LIBS:intel -LIBS:audio -LIBS:interface -LIBS:digital-audio -LIBS:philips -LIBS:display -LIBS:cypress -LIBS:siliconi -LIBS:opto -LIBS:atmel -LIBS:contrib -LIBS:valves -LIBS:boosterpack40_min-cache -EELAYER 27 0 -EELAYER END -$Descr A4 11693 8268 -encoding utf-8 -Sheet 1 1 -Title "" -Date "19 oct 2012" -Rev "" -Comp "" -Comment1 "" -Comment2 "" -Comment3 "" -Comment4 "" -$EndDescr -$Comp -L GND #PWR01 -U 1 1 5080AA99 -P 9150 2450 -F 0 "#PWR01" H 9150 2450 30 0001 C CNN -F 1 "GND" H 9150 2380 30 0001 C CNN - 1 9150 2450 - 0 1 1 0 -$EndComp -$Comp -L VCC #PWR02 -U 1 1 5080AA9F -P 9150 900 -F 0 "#PWR02" H 9150 1000 30 0001 C CNN -F 1 "VCC" H 9150 1000 30 0000 C CNN - 1 9150 900 - 0 -1 -1 0 -$EndComp -$Comp -L TI_BOOSTER_40_J1 J1 -U 1 1 5080DB5C -P 9750 1350 -F 0 "J1" H 9700 2000 60 0000 C CNN -F 1 "TI_BOOSTER_40_J1" H 9750 700 60 0000 C CNN - 1 9750 1350 - 1 0 0 -1 -$EndComp -$Comp -L TI_BOOSTER_40_J2 J2 -U 1 1 5080DBF4 -P 9750 2900 -F 0 "J2" H 9700 3550 60 0000 C CNN -F 1 "TI_BOOSTER_40_J2" H 9750 2250 60 0000 C CNN - 1 9750 2900 - 1 0 0 -1 -$EndComp -$Comp -L TI_BOOSTER_40_J3 J3 -U 1 1 5080DC03 -P 9750 4450 -F 0 "J3" H 9700 5100 60 0000 C CNN -F 1 "TI_BOOSTER_40_J3" H 9750 3800 60 0000 C CNN - 1 9750 4450 - 1 0 0 -1 -$EndComp -$Comp -L TI_BOOSTER_40_J4 J4 -U 1 1 5080DC12 -P 9750 6000 -F 0 "J4" H 9700 6650 60 0000 C CNN -F 1 "TI_BOOSTER_40_J4" H 9750 5350 60 0000 C CNN - 1 9750 6000 - 1 0 0 -1 -$EndComp -$Comp -L GND #PWR03 -U 1 1 5080DC79 -P 9150 4100 -F 0 "#PWR03" H 9150 4100 30 0001 C CNN -F 1 "GND" H 9150 4030 30 0001 C CNN - 1 9150 4100 - 0 1 1 0 -$EndComp -$Comp -L +5V #PWR04 -U 1 1 5080DC8B -P 9150 4000 -F 0 "#PWR04" H 9150 4090 20 0001 C CNN -F 1 "+5V" H 9150 4090 30 0000 C CNN - 1 9150 4000 - 0 -1 -1 0 -$EndComp -$EndSCHEMATC diff --git a/template/ti-stellaris-boosterpack40_min/meta/icon.png b/template/ti-stellaris-boosterpack40_min/meta/icon.png deleted file mode 100644 index d0bafd18c4308d51ebef62910f56cd4fce095bc9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12485 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 L!4oH3@{9igq!C>7 diff --git a/template/ti-stellaris-boosterpack40_min/meta/info.html b/template/ti-stellaris-boosterpack40_min/meta/info.html deleted file mode 100644 index a7e860cf3e..0000000000 --- a/template/ti-stellaris-boosterpack40_min/meta/info.html +++ /dev/null @@ -1,22 +0,0 @@ - - -Ti Launchpad XL - Expansion Board - - -

Launchpad XL

-

Expansion Board

-This project template is the basis of an expansion board for the -TI Launchpad -board. -

-This Board conforms to the 40 pin Launchpad Standard, using the minimum size. -

-The board outline looks like the following: -
-40 Pin Launchpad -
-(c)2012 Brian Sidebotham
-(c)2012 Henry von Tresckow
-(c)2012 Kicad Developers
- - diff --git a/template/ti-stellaris-boosterpack40_min/meta/launchpad_standard40.png b/template/ti-stellaris-boosterpack40_min/meta/launchpad_standard40.png deleted file mode 100644 index c91907351ed74068b58928d51f9af9fe4726f978..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 143031 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%0A6OrTV z>ur=<(+9^dw|&Te{S0?7Bb5|ESba6%*tpcmIJpj4m=OSQH5t^Si)0z zpV7kG2}ag{(>P`E1`0#lEn5&<2y5jd1X3T~F+fX3X5wjSM(B8=1LPx)|i)W@8K8Y80;(OH`g4Rc% z!c+#6exvKRifuT%x!%FB+># zh9${sLy|traQf9>CBq(jtYoyvgC&op zS#cy2N@*;zJmMczWpFmy?Z3qjcX^CjmaJ`j_r1dSF++6E;WAbhL)r@&<44BB5&9?R zl#+cMk8e}FrQLpipvq;D<-$Yq8tk6|$404qiW8=ul=`LiZ8U zKm#dV#bVyavL+2Y_tNA}l#lJzmdF#$o79=M3h}YxF1!_7stxoczr3tIWF7wjc?`0B~C>aaVC_c3UQNbb9dbEn5k4()9IjrVFnd1 zPS?jhV`F@ukM1>3f9)Yso#-sQ|MKNn@#Bn^5R%Lo7$7u!y80|Z=o9Mb%X;So-IKicHNPBqdfZ`+`k||84^d*7P`jYJe6dl^f5M=z+ffF4_kT>QB8 zTN}kw$oz+d2TRS)=aknV2~GU3NuyM5Wj@1yf|tcRB?EDLI@>MoZq>o^c3|D`j_tfI za4*0rt?e!k1c$083w+!S=G1tj4%5)r*H0GQ-G;qTj=xm`7P!n=(bvD7^Ns>1;-ob4A>tqT{ks2)2V=!`*{R#wH~sdGgVZR_ms zS#1|O5RDOo`C$D|Cv5;(d2$ufq^lg{n5w{eU8hK+k8iK$cvchq+mLdfXk{50ppiBQ z8FM#x_wtOVEo>gpnC$E9E~d>vMX4^!fq)TQoji90MLM7=iPD`r9q=?a&p_ITLd2zQ zd>k}Ww^bJ2QrKS)2Z^+kAEr!h+nvu~u^*zD&H-n24ZPO&w?2^WZfS3S1dzb-^S+kQ zmCERfFf~^C@kl45X!N-HC|J4(VmO)EaDy-|z>U391S@bk{4cbIxe@o$%fGY)QW-tO zGoIK=6pJy+x9^jPscSWT7rcfqc#SRyM9_A=K#rSG(9wR@ z6voQS$uT=WyQ!?)1w>U5q2;dtwd{|5ufk%W_eWKPP9aUu`P7%Ypwy1e%Gk(gtmbVG zs0b?sQ&)%#CKC`55hEgw+p3p*#z7e;N*rv^#=`ggvC!4s@$NRYn}q6E2mKUoaV)zL z#5(~qznRWRchC>U0Em@5mg^ysD)auhLO0p0I(F>W$3xd^eERD`2)ur z8Rr-uZB<-Q^U0jZ}n^1ie3vKW4ye%6w}-yv1+gcGIjl`oS5NEX2rV;4OCA7l&y z65+^K1|YwA0mR`Vaf-OCJ5>jM^3M0+1s9jG8_3lCj5;oA`)tg6<(!%MhSEuI{n6w7 zfqCFpb(qC?WGYua{x{E-+}S+zD`NUjXe6BQD)o0r@bgI+IiSwHfNf!u2bp3%!;5e3 zcRUq1V8&AOX+qxFXp;%)!; zXUsZoK4oD zwBbLQ+S~H43API@8-{)$T`C~Dyr|jh=whz!<)UJ&U0#=hLCi034cLX&9LQmQMp75z zb`Z3KvH^Gj5IpM({e5%(JoZJ92oHjOs^Bj&%zt9z-{AU(m!02Kakw)dj62`+QG zs7Ls{F&7*0_v~Gi-TZ&g1-zKbxjq^Y8}N|uB9;56bRai9otuVcVC=#F4)TAn7$zEm zTTRZUEC?^N0Yy*$KJK4T{vxsGu`CbIhrpv%cqaExitEqOzbKA6&V=&-@Zu$SLiGP_ d5qr;(`5t|JZ1EbY0Reo;-cyqLAZh6He*kT!50C%= From c10bb66b12954cc0cd72e65f662adef32d3922d1 Mon Sep 17 00:00:00 2001 From: Matthew Beckler Date: Sat, 13 Apr 2013 23:07:04 -0500 Subject: [PATCH 11/25] Match 'new char[]' with proper delete[] char* rather than delete char*. --- common/hotkeys_basic.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/hotkeys_basic.cpp b/common/hotkeys_basic.cpp index 46cea5969e..dc5c9ffba8 100644 --- a/common/hotkeys_basic.cpp +++ b/common/hotkeys_basic.cpp @@ -563,7 +563,7 @@ int EDA_BASE_FRAME::ReadHotkeyConfigFile( const wxString& aFilename, ParseHotkeyConfig( data, aDescList ); /* cleanup */ - delete buffer; + delete[] buffer; cfgfile.Close(); return 1; } From 76b558c83175610f913703c565105bf035e5e089 Mon Sep 17 00:00:00 2001 From: Lorenzo Marcantonio Date: Sun, 14 Apr 2013 10:26:42 +0200 Subject: [PATCH 12/25] Closes bug 1168753. Depending on build options seems that wx uses different types for size() so the Format string was not always correct. Put a fat warning in a comment too. --- eeschema/netlist.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/eeschema/netlist.cpp b/eeschema/netlist.cpp index d6c0471a8e..17437b1138 100644 --- a/eeschema/netlist.cpp +++ b/eeschema/netlist.cpp @@ -146,7 +146,11 @@ void SCH_EDIT_FRAME::BuildNetListBase() if( g_NetObjectslist.size() == 0 ) return; // no objects - activity += wxString::Format( _( " net count = %u" ), g_NetObjectslist.size() ); + /* Here wx gives its best... depending on the build option size can + be unsigned int or unsigned long (probably even size_t, but it doesn't + support the %z specifier). So the cast is for platform compability */ + activity += wxString::Format( _( " net count = %lu" ), + (unsigned long)( g_NetObjectslist.size() ) ); SetStatusText( activity ); /* Sort objects by Sheet */ From 0dbf3ef30a6cf43b01d9adea814814f433f15fef Mon Sep 17 00:00:00 2001 From: Lorenzo Marcantonio Date: Sun, 14 Apr 2013 13:02:19 +0200 Subject: [PATCH 13/25] Changed format specifiers of some printf involved with size_t values to %zu to avoid runtime assertions. --- cvpcb/class_footprints_listbox.cpp | 6 +++--- eeschema/netlist.cpp | 9 ++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/cvpcb/class_footprints_listbox.cpp b/cvpcb/class_footprints_listbox.cpp index 605ed6f944..a80c69c115 100644 --- a/cvpcb/class_footprints_listbox.cpp +++ b/cvpcb/class_footprints_listbox.cpp @@ -119,7 +119,7 @@ void FOOTPRINTS_LISTBOX::SetFootprintFullList( FOOTPRINT_LIST& list ) for( unsigned ii = 0; ii < list.GetCount(); ii++ ) { FOOTPRINT_INFO & footprint = list.GetItem(ii); - msg.Printf( wxT( "%3d %s" ), (int) m_FullFootprintList.GetCount() + 1, + msg.Printf( wxT( "%3zu %s" ), m_FullFootprintList.GetCount() + 1, GetChars(footprint.m_Module) ); m_FullFootprintList.Add( msg ); } @@ -154,7 +154,7 @@ void FOOTPRINTS_LISTBOX::SetFootprintFilteredList( COMPONENT_INFO* Component, candidate = Component->m_FootprintFilter[jj].Upper(); if( !module.Matches( candidate ) ) continue; - msg.Printf( wxT( "%3d %s" ), m_FilteredFootprintList.GetCount() + 1, + msg.Printf( wxT( "%3zu %s" ), m_FilteredFootprintList.GetCount() + 1, footprint.m_Module.GetData() ); m_FilteredFootprintList.Add( msg ); hasItem = true; @@ -186,7 +186,7 @@ void FOOTPRINTS_LISTBOX::SetFootprintFilteredByPinCount( COMPONENT_INFO* Compone if( Component->m_pinCount == footprint.m_padCount ) { - msg.Printf( wxT( "%3d %s" ), m_FilteredFootprintList.GetCount() + 1, + msg.Printf( wxT( "%3zu %s" ), m_FilteredFootprintList.GetCount() + 1, footprint.m_Module.GetData() ); m_FilteredFootprintList.Add( msg ); hasItem = true; diff --git a/eeschema/netlist.cpp b/eeschema/netlist.cpp index 17437b1138..9ca38ee584 100644 --- a/eeschema/netlist.cpp +++ b/eeschema/netlist.cpp @@ -146,11 +146,10 @@ void SCH_EDIT_FRAME::BuildNetListBase() if( g_NetObjectslist.size() == 0 ) return; // no objects - /* Here wx gives its best... depending on the build option size can - be unsigned int or unsigned long (probably even size_t, but it doesn't - support the %z specifier). So the cast is for platform compability */ - activity += wxString::Format( _( " net count = %lu" ), - (unsigned long)( g_NetObjectslist.size() ) ); + /* The new %zu specification is needed to properly format a size_t + * value (returned by size(), here) */ + activity += wxString::Format( _( " net count = %zu" ), + g_NetObjectslist.size() ); SetStatusText( activity ); /* Sort objects by Sheet */ From be7de02a1d40c103fd67a5bac37553f6a2093cca Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Tue, 16 Apr 2013 12:53:23 +0200 Subject: [PATCH 14/25] Eeschema: fix bug #1168116. Netlist generation: remove dead code and fully outdated option pspice "use net number" Pcbnew: layer manager: display tooltips using translated form (where internationalized, but always shown in English). --- eeschema/dialogs/dialog_netlist.cpp | 26 ---- eeschema/dialogs/dialog_netlist.h | 3 - eeschema/events_called_functions_for_edit.cpp | 14 +-- eeschema/netform.cpp | 119 +----------------- eeschema/schedit.cpp | 6 +- pcbnew/class_pcb_layer_widget.cpp | 12 +- 6 files changed, 24 insertions(+), 156 deletions(-) diff --git a/eeschema/dialogs/dialog_netlist.cpp b/eeschema/dialogs/dialog_netlist.cpp index 3914a3c3aa..0964609497 100644 --- a/eeschema/dialogs/dialog_netlist.cpp +++ b/eeschema/dialogs/dialog_netlist.cpp @@ -188,9 +188,6 @@ NETLIST_DIALOG::NETLIST_DIALOG( SCH_EDIT_FRAME* parent ) : long tmp; m_config->Read( NETLIST_USE_DEFAULT_NETNAME, &tmp, 0l ); m_cbUseDefaultNetlistName->SetValue( tmp ); - m_config->Read( NETLIST_PSPICE_USE_NETNAME, &m_spiceNetlistUseNames, true ); - - m_NetFmtName = m_Parent->GetNetListFormatName(); for( int ii = 0; ii < PANELCUSTOMBASE + CUSTOMPANEL_COUNTMAX; ii++ ) @@ -268,18 +265,6 @@ void NETLIST_DIALOG::InstallPageSpice() page->m_AddSubPrefix->SetValue( m_Parent->GetAddReferencePrefix() ); page->m_LeftBoxSizer->Add( page->m_AddSubPrefix, 0, wxGROW | wxALL, 5 ); - - wxString netlist_opt[2] = { _( "Use Net Names" ), _( "Use Net Numbers" ) }; - page->m_NetOption = new wxRadioBox( page, -1, _( "Netlist Options:" ), - wxDefaultPosition, wxDefaultSize, - 2, netlist_opt, 1, - wxRA_SPECIFY_COLS ); - - if( !m_spiceNetlistUseNames ) - page->m_NetOption->SetSelection( 1 ); - - page->m_LeftBoxSizer->Add( page->m_NetOption, 0, wxGROW | wxALL, 5 ); - page->m_LowBoxSizer->Add( new wxStaticText( page, -1, _( "Simulator command:" ) ), 0, wxGROW | wxLEFT | wxRIGHT | wxTOP, 5 ); @@ -438,11 +423,6 @@ void NETLIST_DIALOG::NetlistUpdateOpt() if( m_PanelNetType[ii]->m_IsCurrentFormat->GetValue() == true ) m_Parent->SetNetListFormatName( m_PanelNetType[ii]->GetPageNetFmtName() ); } - - m_spiceNetlistUseNames = true; // Used for pspice, gnucap - - if( m_PanelNetType[PANELSPICE]->m_NetOption->GetSelection() == 1 ) - m_spiceNetlistUseNames = false; } @@ -475,8 +455,6 @@ void NETLIST_DIALOG::GenNetlist( wxCommandEvent& event ) { case NET_TYPE_SPICE: // Set spice netlist options: - if( m_spiceNetlistUseNames ) - netlist_opt |= NET_USE_NETNAMES; if( currPage->m_AddSubPrefix->GetValue() ) netlist_opt |= NET_USE_X_PREFIX; break; @@ -647,13 +625,10 @@ void NETLIST_DIALOG::RunSimulator( wxCommandEvent& event ) NETLIST_PAGE_DIALOG* currPage; currPage = (NETLIST_PAGE_DIALOG*) m_NoteBook->GetCurrentPage(); - m_spiceNetlistUseNames = currPage->m_NetOption->GetSelection() == 0; // Set spice netlist options: unsigned netlist_opt = 0; - if( m_spiceNetlistUseNames ) - netlist_opt |= NET_USE_NETNAMES; if( currPage->m_AddSubPrefix && currPage->m_AddSubPrefix->GetValue() ) netlist_opt |= NET_USE_X_PREFIX; @@ -676,7 +651,6 @@ void NETLIST_DIALOG::WriteCurrentNetlistSetup( void ) NetlistUpdateOpt(); m_config->Write( NETLIST_USE_DEFAULT_NETNAME, GetUseDefaultNetlistName() ); - m_config->Write( NETLIST_PSPICE_USE_NETNAME, m_spiceNetlistUseNames ); // Update the new titles for( int ii = 0; ii < CUSTOMPANEL_COUNTMAX; ii++ ) diff --git a/eeschema/dialogs/dialog_netlist.h b/eeschema/dialogs/dialog_netlist.h index 686cbceef5..33311e4750 100644 --- a/eeschema/dialogs/dialog_netlist.h +++ b/eeschema/dialogs/dialog_netlist.h @@ -110,7 +110,6 @@ public: // Options for Spice netlist generation (OR'ed bits enum netlistOptions { - NET_USE_NETNAMES = 1, // for Spice netlist : use netnames instead of numbers NET_USE_X_PREFIX = 2, // for Spice netlist : change "U" and "IC" reference prefix to "X" NET_PCBNEW_USE_NEW_FORMAT = 1, // For Pcbnew use the new format (S expression and SWEET) }; @@ -125,8 +124,6 @@ public: private: wxConfig* m_config; - bool m_spiceNetlistUseNames; /* true to use names rather than net - * numbers (PSPICE netlist only) */ public: diff --git a/eeschema/events_called_functions_for_edit.cpp b/eeschema/events_called_functions_for_edit.cpp index dda4c0e193..2939d28da8 100644 --- a/eeschema/events_called_functions_for_edit.cpp +++ b/eeschema/events_called_functions_for_edit.cpp @@ -32,10 +32,9 @@ void SCH_EDIT_FRAME::OnCopySchematicItemRequest( wxCommandEvent& event ) newitem->SetTimeStamp( GetNewTimeStamp() ); newitem->ClearAnnotation( NULL ); newitem->SetFlags( IS_NEW ); - MoveItem( (SCH_ITEM*) newitem, &dc ); - - // Redraw the original part, because StartMovePart() erased it from screen. - curr_item->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode ); + // Draw the new part, MoveItem() expects it to be already on screen. + newitem->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode ); + MoveItem( newitem, &dc ); } break; @@ -46,10 +45,9 @@ void SCH_EDIT_FRAME::OnCopySchematicItemRequest( wxCommandEvent& event ) { SCH_TEXT* newitem = (SCH_TEXT*) curr_item->Clone(); newitem->SetFlags( IS_NEW ); - MoveItem( (SCH_ITEM*) newitem, &dc ); - - /* Redraw the original part in XOR mode */ - curr_item->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode ); + // Draw the new item, MoveItem() expects it to be already on screen. + newitem->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode ); + MoveItem( newitem, &dc ); } break; diff --git a/eeschema/netform.cpp b/eeschema/netform.cpp index 9a39af7109..1d5e1ae7b8 100644 --- a/eeschema/netform.cpp +++ b/eeschema/netform.cpp @@ -298,12 +298,10 @@ public: * .-PSpice or .-gnucap put at beginning of the netlist * .+PSpice or .-genucap are put at end of the netList * @param f = the file to write to - * @param use_netnames = true, to use netnames in netlist, - * false to use net number. * @param aUsePrefix = true, adds an 'X' prefix to any reference designator starting with "U" or "IC", * false to leave reference designator unchanged. */ - bool WriteNetListPspice( FILE* f, bool use_netnames, bool aUsePrefix ); + bool WriteNetListPspice( FILE* f, bool aUsePrefix ); /** * Function MakeCommandLine @@ -360,8 +358,6 @@ wxString NETLIST_EXPORT_TOOL::MakeCommandLine( const wxString& aFormatString, * param aFullFileName = full netlist file name * param aNetlistOptions = netlist options using OR'ed bits. * For SPICE netlist only: - * if NET_USE_NETNAMES is set, use net names from labels in schematic - * else use net numbers (net codes) * if NET_USE_X_PREFIX is set : change "U" and "IC" refernce prefix to "X" * return true if success. */ @@ -381,7 +377,7 @@ bool SCH_EDIT_FRAME::WriteNetListFile( int aFormat, const wxString& aFullFileNam if( ( f = wxFopen( aFullFileName, wxT( "wt" ) ) ) == NULL ) { wxString msg; - msg.Printf( _( "Failed to create file <%s>" ), + msg.Printf( _( "Failed to create file <%s>" ), GetChars( aFullFileName ) ); DisplayError( this, msg ); return false; @@ -413,9 +409,7 @@ bool SCH_EDIT_FRAME::WriteNetListFile( int aFormat, const wxString& aFullFileNam break; case NET_TYPE_SPICE: - ret = helper.WriteNetListPspice( f, - aNetlistOptions & NET_USE_NETNAMES, - aNetlistOptions & NET_USE_X_PREFIX ); + ret = helper.WriteNetListPspice( f, aNetlistOptions & NET_USE_X_PREFIX ); fclose( f ); break; @@ -1086,110 +1080,16 @@ bool NETLIST_EXPORT_TOOL::WriteGENERICNetList( const wxString& aOutFileName ) for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ ) g_NetObjectslist[ii]->m_Flag = 0; -#if 1 // output the XML format netlist. wxXmlDocument xdoc; xdoc.SetRoot( makeGenericRoot() ); return xdoc.Save( aOutFileName, 2 /* indent bug, today was ignored by wxXml lib */ ); - -#else // output the well established/old generic net list format which was not XML. - - wxString field; - wxString footprint; - wxString netname; - FILE* out; - int ret = 0; // OR on each call, test sign bit at very end. - - if( ( out = wxFopen( aOutFileName, wxT( "wt" ) ) ) == NULL ) - { - wxString msg; - msg.Printf( _( "Failed to create file <%s>" ), GetChars( aOutFileName ) ); - DisplayError( NULL, msg ); - return false; - } - - m_ReferencesAlreadyFound.Clear(); - - ret |= fprintf( out, "$BeginNetlist\n" ); - - // Create netlist module section - ret |= fprintf( out, "$BeginComponentList\n" ); - - SCH_SHEET_LIST sheetList; - - for( SCH_SHEET_PATH* path = sheetList.GetFirst(); path; path = sheetList.GetNext() ) - { - for( EDA_ITEM* schItem = path->LastDrawList(); schItem; schItem = schItem->Next() ) - { - SCH_COMPONENT* comp = findNextComponentAndCreatePinList( schItem, path ); - if( !comp ) - break; // No component left - - schItem = comp; - - footprint.Empty(); - if( !comp->GetField( FOOTPRINT )->IsVoid() ) - { - footprint = comp->GetField( FOOTPRINT )->m_Text; - footprint.Replace( wxT( " " ), wxT( "_" ) ); - } - - ret |= fprintf( out, "\n$BeginComponent\n" ); - ret |= fprintf( out, "TimeStamp=%8.8lX\n", comp->m_TimeStamp ); - ret |= fprintf( out, "Footprint=%s\n", TO_UTF8( footprint ) ); - - field = wxT( "Reference=" ) + comp->GetRef( path ) + wxT( "\n" ); - field.Replace( wxT( " " ), wxT( "_" ) ); - ret |= fputs( TO_UTF8( field ), out ); - - field = comp->GetField( VALUE )->m_Text; - field.Replace( wxT( " " ), wxT( "_" ) ); - ret |= fprintf( out, "Value=%s\n", TO_UTF8( field ) ); - - field = comp->GetLibName(); - field.Replace( wxT( " " ), wxT( "_" ) ); - ret |= fprintf( out, "Libref=%s\n", TO_UTF8( field ) ); - - // Write pin list: - ret |= fprintf( out, "$BeginPinList\n" ); - for( unsigned ii = 0; ii < m_SortedComponentPinList.size(); ii++ ) - { - NETLIST_OBJECT* Pin = m_SortedComponentPinList[ii]; - if( !Pin ) - continue; - - sprintPinNetName( &netname, wxT( "$-%.6d" ), Pin ); - if( netname.IsEmpty() ) - netname = wxT( "?" ); - - ret |= fprintf( out, "%.4s=%s\n", (char*) &Pin->m_PinNum, TO_UTF8( netname ) ); - } - - ret |= fprintf( out, "$EndPinList\n" ); - ret |= fprintf( out, "$EndComponent\n" ); - } - } - - ret |= fprintf( out, "$EndComponentList\n" ); - - ret |= fprintf( out, "\n$BeginNets\n" ); - - if( !writeGENERICListOfNets( out, g_NetObjectslist ) ) - ret = -1; - - ret |= fprintf( out, "$EndNets\n" ); - - ret |= fprintf( out, "\n$EndNetlist\n" ); - ret |= fclose( out ); - - return ret >= 0; -#endif } -bool NETLIST_EXPORT_TOOL::WriteNetListPspice( FILE* f, bool use_netnames, bool aUsePrefix ) +bool NETLIST_EXPORT_TOOL::WriteNetListPspice( FILE* f, bool aUsePrefix ) { int ret = 0; int nbitems; @@ -1406,17 +1306,8 @@ bool NETLIST_EXPORT_TOOL::WriteNetListPspice( FILE* f, bool use_netnames, bool a if( netName.IsEmpty() ) netName = wxT( "?" ); - if( use_netnames ) - ret |= fprintf( f, " %s", TO_UTF8( netName ) ); + ret |= fprintf( f, " %s", TO_UTF8( netName ) ); - else // Use number for net names (net number = 0 for "GND") - { - // NetName = "0" is "GND" net for Spice - if( netName == wxT( "0" ) || netName == wxT( "GND" ) ) - ret |= fprintf( f, " 0" ); - else - ret |= fprintf( f, " %d", pin->GetNet() ); - } } // Get Component Value Name: diff --git a/eeschema/schedit.cpp b/eeschema/schedit.cpp index 605c28cbfc..3f509a6b55 100644 --- a/eeschema/schedit.cpp +++ b/eeschema/schedit.cpp @@ -1,9 +1,9 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 2004 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com - * Copyright (C) 2008-2011 Wayne Stambaugh - * Copyright (C) 2004-2011 KiCad Developers, see change_log.txt for contributors. + * Copyright (C) 2013 Jean-Pierre Charras, jp.charras at wanadoo.fr + * Copyright (C) 2008-2013 Wayne Stambaugh + * Copyright (C) 2004-2013 KiCad Developers, see change_log.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 diff --git a/pcbnew/class_pcb_layer_widget.cpp b/pcbnew/class_pcb_layer_widget.cpp index e60e8129ba..a4dc99df80 100644 --- a/pcbnew/class_pcb_layer_widget.cpp +++ b/pcbnew/class_pcb_layer_widget.cpp @@ -209,9 +209,14 @@ void PCB_LAYER_WIDGET::ReFillRender() ClearRenderRows(); // Add "Render" tab rows to LAYER_WIDGET, after setting color and checkbox state. + // Because s_render_rows is created static, we must explicitely call + // wxGetTranslation for texts which are internationalized (tool tips + // and item names) for( unsigned row=0; rowGetLayerName( layer ), layer, brd->GetLayerColor( layer ), dsc, true ) ); + brd->GetLayerName( layer ), layer, brd->GetLayerColor( layer ), + dsc, true ) ); } } // technical layers are shown in this order: + // Because they are static, wxGetTranslation must be explicitely + // called for tooltips. static const struct { LAYER_NUM layerId; wxString tooltip; @@ -322,7 +330,7 @@ void PCB_LAYER_WIDGET::ReFill() AppendLayerRow( LAYER_WIDGET::ROW( brd->GetLayerName( layer ), layer, brd->GetLayerColor( layer ), - techLayerSeq[i].tooltip, true ) ); + wxGetTranslation( techLayerSeq[i].tooltip ), true ) ); } installRightLayerClickHandler(); From 20e7d431a6dc62cd1231a262d70656e4a6ab935b Mon Sep 17 00:00:00 2001 From: Stefan Helmert Date: Wed, 17 Apr 2013 09:57:47 -0500 Subject: [PATCH 15/25] The internal BOM generator has bugs. I designed an XSL script, which converts the generated XML Partlist into a CSV file for Libre Office or Open Office. It is very easy to use. You can specify it as a plugin for Eeshema netlist generator. It searches for all field names, generates the table headings accounting for all fields found in any part. Then stuffs all the parts rows according to proper fields. --- eeschema/plugins/CMakeLists.txt | 30 +++++++----- eeschema/plugins/bom2csv.xsl | 85 +++++++++++++++++++++++++++++++++ 2 files changed, 102 insertions(+), 13 deletions(-) create mode 100644 eeschema/plugins/bom2csv.xsl diff --git a/eeschema/plugins/CMakeLists.txt b/eeschema/plugins/CMakeLists.txt index 1dfbf6ebcd..ebc2aed1b4 100644 --- a/eeschema/plugins/CMakeLists.txt +++ b/eeschema/plugins/CMakeLists.txt @@ -1,14 +1,18 @@ -if(UNIX) - add_definitions(-D__UNIX__) -endif(UNIX) - -# add_executable(netlist_form_pads-pcb netlist_form_pads-pcb.cpp) -# install(TARGETS netlist_form_pads-pcb DESTINATION ${KICAD_PLUGINS} COMPONENT binary) - -# install the *.xsl file(s), user will need to install 'xsltproc' and setup +# Install the *.xsl file(s), user will need to install 'xsltproc' and setup # EESCHEMA's netlist plugins -install( FILES - netlist_form_pads-pcb.xsl - DESTINATION ${KICAD_PLUGINS} - COMPONENT binary - ) +# See chapter 14 of eeschema.pdf + + +set( xsl_lst + bom2csv.xsl + bom_cvs.xsl + netlist_form_cadstar-RINF.xsl + netlist_form_cadstar.xsl + netlist_form_OrcadPcb2.xsl + netlist_form_pads-pcb.xsl + ) + +install( FILES ${xsl_lst} + DESTINATION ${KICAD_PLUGINS} + COMPONENT binary + ) diff --git a/eeschema/plugins/bom2csv.xsl b/eeschema/plugins/bom2csv.xsl new file mode 100644 index 0000000000..3140609928 --- /dev/null +++ b/eeschema/plugins/bom2csv.xsl @@ -0,0 +1,85 @@ + + + +]> + + + + + + + + + + + Reference, Value, Footprint, Datasheet + + + + , + + + &nl; + + + + + + + + , + , + , + + + &nl; + + + + + + + + + + + + , + + + + + + + + + + + + + + + From 6001254160f00e6766681554f8d82260a9c0a62a Mon Sep 17 00:00:00 2001 From: Dick Hollenbeck Date: Thu, 18 Apr 2013 12:03:25 -0500 Subject: [PATCH 16/25] fix Lorenzo's bug introduced in rev. 4082 --- common/dialogs/dialog_page_settings.cpp | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/common/dialogs/dialog_page_settings.cpp b/common/dialogs/dialog_page_settings.cpp index 20aca80eb9..18fe9c7366 100644 --- a/common/dialogs/dialog_page_settings.cpp +++ b/common/dialogs/dialog_page_settings.cpp @@ -63,11 +63,10 @@ const wxString pageFmts[] = _("C 17x22in"), _("D 22x34in"), _("E 34x44in"), - _("US Letter 8.5x11in"), - _("US Legal 8.5x14in"), - _("US Ledger 11x17in"), + _("USLetter 8.5x11in"), // USLetter without space is correct + _("USLegal 8.5x14in"), // USLegal without space is correct + _("USLedger 11x17in"), // USLedger without space is correct _("User (Custom)"), - wxT("") // end of list }; void EDA_DRAW_FRAME::Process_PageSettings( wxCommandEvent& event ) @@ -115,11 +114,8 @@ void DIALOG_PAGES_SETTINGS::initDialog() // The first shows translated strings, the second contains not translated strings m_paperSizeComboBox->Clear(); - for( unsigned ii = 0; ; ii++ ) + for( unsigned ii = 0; iiAppend( wxGetTranslation( pageFmts[ii] ) ); } From df9502dd06775e91355a0a9d7c39972987cd169c Mon Sep 17 00:00:00 2001 From: Dick Hollenbeck Date: Thu, 18 Apr 2013 12:03:47 -0500 Subject: [PATCH 17/25] fix some compiler warnings --- gerbview/rs274x.cpp | 3 +++ pcbnew/class_drawsegment.cpp | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gerbview/rs274x.cpp b/gerbview/rs274x.cpp index 893698a0ed..d65cc3bafa 100644 --- a/gerbview/rs274x.cpp +++ b/gerbview/rs274x.cpp @@ -758,6 +758,8 @@ bool GERBER_IMAGE::ExecuteRS274XCommand( int command, break; } + (void) seq_len; // quiet g++, or delete the unused variable. + ok = GetEndOfBlock( buff, text, m_Current_File ); return ok; @@ -788,6 +790,7 @@ bool GetEndOfBlock( char buff[GERBER_BUFZ], char*& text, FILE* gerber_file ) return false; } + /** * Function GetNextLine * test for an end of line diff --git a/pcbnew/class_drawsegment.cpp b/pcbnew/class_drawsegment.cpp index 1ecd428739..82b37f41f7 100644 --- a/pcbnew/class_drawsegment.cpp +++ b/pcbnew/class_drawsegment.cpp @@ -320,8 +320,7 @@ void DRAWSEGMENT::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ) wxString msg; wxString coords; - BOARD* board = (BOARD*) m_Parent; - wxASSERT( board ); + wxASSERT( m_Parent ); msg = wxT( "DRAWING" ); From ed484deec6ec8ad6a8e45ad513358831636e5afc Mon Sep 17 00:00:00 2001 From: Dick Hollenbeck Date: Thu, 18 Apr 2013 13:54:03 -0500 Subject: [PATCH 18/25] hide pageFmts[] since it is no longer NULL terminated and not global --- common/dialogs/dialog_page_settings.cpp | 2 +- pcbnew/class_pcb_text.cpp | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/common/dialogs/dialog_page_settings.cpp b/common/dialogs/dialog_page_settings.cpp index 18fe9c7366..dc1f93da08 100644 --- a/common/dialogs/dialog_page_settings.cpp +++ b/common/dialogs/dialog_page_settings.cpp @@ -51,7 +51,7 @@ // the translated and the not translated version. // when displayed in dialog we should explicitely call wxGetTranslation() // to show the translated version. -const wxString pageFmts[] = +static const wxString pageFmts[] = { _("A4 210x297mm"), _("A3 297x420mm"), diff --git a/pcbnew/class_pcb_text.cpp b/pcbnew/class_pcb_text.cpp index c5fc88bb37..89cbfed473 100644 --- a/pcbnew/class_pcb_text.cpp +++ b/pcbnew/class_pcb_text.cpp @@ -111,17 +111,18 @@ void TEXTE_PCB::Draw( EDA_DRAW_PANEL* panel, wxDC* DC, void TEXTE_PCB::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ) { wxString msg; - BOARD* board; - BOARD_ITEM* parent = (BOARD_ITEM*) m_Parent; +#if defined(DEBUG) + BOARD_ITEM* parent = (BOARD_ITEM*) m_Parent; wxASSERT( parent ); + BOARD* board; if( parent->Type() == PCB_DIMENSION_T ) board = (BOARD*) parent->GetParent(); else board = (BOARD*) parent; - wxASSERT( board ); +#endif if( m_Parent && m_Parent->Type() == PCB_DIMENSION_T ) aList.push_back( MSG_PANEL_ITEM( _( "Dimension" ), m_Text, DARKGREEN ) ); From d53d9d88fb6348b3f2364e5a01efbae819d92340 Mon Sep 17 00:00:00 2001 From: Miguel Angel Ajo Date: Thu, 18 Apr 2013 23:21:26 +0200 Subject: [PATCH 19/25] Support to enable color from PLOT_CONTROLLER into plotters that start in B/W --- pcbnew/pcbplot.cpp | 16 ++++++++++++++++ pcbnew/plotcontroller.h | 4 ++++ 2 files changed, 20 insertions(+) diff --git a/pcbnew/pcbplot.cpp b/pcbnew/pcbplot.cpp index 17004e252c..38d3e86201 100644 --- a/pcbnew/pcbplot.cpp +++ b/pcbnew/pcbplot.cpp @@ -384,3 +384,19 @@ bool PLOT_CONTROLLER::PlotLayer( LAYER_NUM aLayer )/*{{{*/ return true; }/*}}}*/ +void PLOT_CONTROLLER::SetColorMode( bool aColorMode ) +{ + if( !m_plotter ) + return; + + m_plotter->SetColorMode( aColorMode ); +} + +bool PLOT_CONTROLLER::GetColorMode() +{ + if( !m_plotter ) + return false; + + return m_plotter->GetColorMode(); +} + diff --git a/pcbnew/plotcontroller.h b/pcbnew/plotcontroller.h index 89e0028d0b..1716866122 100644 --- a/pcbnew/plotcontroller.h +++ b/pcbnew/plotcontroller.h @@ -25,7 +25,11 @@ public: void ClosePlot(); bool OpenPlotfile( const wxString &aSuffix, PlotFormat aFormat, const wxString &aSheetDesc ); + bool PlotLayer( LAYER_NUM layer ); + + void SetColorMode( bool aColorMode ); + bool GetColorMode(); private: /// Option bank From e469d9d1f904c576afddb391917b738c5502c148 Mon Sep 17 00:00:00 2001 From: Matthew Beckler Date: Thu, 18 Apr 2013 23:23:11 +0200 Subject: [PATCH 20/25] Fixes to scripting after refactoring & interface cleanups, --- pcbnew/scripting/examples/createFPC40.py | 4 ++-- pcbnew/scripting/examples/createPcb.py | 6 +++--- pcbnew/scripting/examples/hidePcbValuesShowReferences.py | 6 +++--- pcbnew/scripting/examples/listPcb.py | 4 ++-- pcbnew/scripting/examples/listPcbLibrary.py | 4 ++-- pcbnew/scripting/module.i | 9 ++------- 6 files changed, 14 insertions(+), 19 deletions(-) diff --git a/pcbnew/scripting/examples/createFPC40.py b/pcbnew/scripting/examples/createFPC40.py index 8afeec117f..95f4678e7c 100755 --- a/pcbnew/scripting/examples/createFPC40.py +++ b/pcbnew/scripting/examples/createFPC40.py @@ -13,7 +13,7 @@ pcb.m_NetClasses.GetDefault().SetClearance(FromMM(0.1)) # create a new module, it's parent is our previously created pcb module = MODULE(pcb) module.SetReference("FPC"+str(pads)) # give it a reference name -module.m_Reference.SetPos0(wxPointMM(-1,-1)) +module.Reference().SetPos0(wxPointMM(-1,-1)) pcb.Add(module) # add it to our pcb m_pos = wxPointMM(50,50) module.SetPosition(m_pos) @@ -52,7 +52,7 @@ module.Add(e) # save the PCB to disk module.SetLibRef("FPC"+str(pads)) try: - FootprintLibCreate("fpc.mod") + FootprintLibCreate("fpc40.mod") except: pass # we try to create, but may be it exists already FootprintSave("fpc40.mod",module) diff --git a/pcbnew/scripting/examples/createPcb.py b/pcbnew/scripting/examples/createPcb.py index 70cdef9da6..b3c977d24e 100755 --- a/pcbnew/scripting/examples/createPcb.py +++ b/pcbnew/scripting/examples/createPcb.py @@ -12,7 +12,7 @@ pcb.m_NetClasses.GetDefault().SetClearance(FromMM(0.1)) # create a new module, it's parent is our previously created pcb module = MODULE(pcb) module.SetReference("M1") # give it a reference name -module.m_Reference.SetPos0(wxPointMM(-10,-10)) +module.Reference().SetPos0(wxPointMM(-10,-10)) pcb.Add(module) # add it to our pcb m_pos = wxPointMM(50,50) module.SetPosition(m_pos) @@ -41,8 +41,8 @@ pcb = LoadBoard("/tmp/my2.brd") print map( lambda x: x.GetReference() , list(pcb.GetModules())) for m in pcb.GetModules(): - for p in m.GetPads(): - print p.GetPadName(),p.GetPosition(), p.GetOffset() + for p in m.Pads(): + print p.GetPadName(), p.GetPosition(), p.GetOffset() # pcb.GetDesignSettings() diff --git a/pcbnew/scripting/examples/hidePcbValuesShowReferences.py b/pcbnew/scripting/examples/hidePcbValuesShowReferences.py index 2d878d15b9..6b37842df3 100644 --- a/pcbnew/scripting/examples/hidePcbValuesShowReferences.py +++ b/pcbnew/scripting/examples/hidePcbValuesShowReferences.py @@ -8,7 +8,7 @@ pcb = LoadBoard(filename) for module in pcb.GetModules(): print "* Module: %s"%module.GetReference() - module.GetValueObj().SetVisible(False) # set Value as Hidden - module.GetReferenceObj().SetVisible(True) # set Reference as Visible + module.Value().SetVisible(False) # set Value as Hidden + module.Reference().SetVisible(True) # set Reference as Visible -pcb.Save("mod_"+filename) \ No newline at end of file +pcb.Save("mod_"+filename) diff --git a/pcbnew/scripting/examples/listPcb.py b/pcbnew/scripting/examples/listPcb.py index 2e76f20629..92ab11a892 100755 --- a/pcbnew/scripting/examples/listPcb.py +++ b/pcbnew/scripting/examples/listPcb.py @@ -37,7 +37,7 @@ print "LISTING DRAWINGS:" for item in pcb.GetDrawings(): if type(item) is TEXTE_PCB: - print "* Text: '%s' at %s"%(item.GetText(),item.GetPosition()) + print "* Text: '%s' at %s"%(item.GetText(), item.GetPosition()) elif type(item) is DRAWSEGMENT: print "* Drawing: %s"%item.GetShapeStr() # dir(item) else: @@ -60,4 +60,4 @@ print "" print "RATSNEST:",len(pcb.GetFullRatsnest()) print dir(pcb.GetNetClasses()) - \ No newline at end of file + diff --git a/pcbnew/scripting/examples/listPcbLibrary.py b/pcbnew/scripting/examples/listPcbLibrary.py index c8a6325f82..928b3e0191 100755 --- a/pcbnew/scripting/examples/listPcbLibrary.py +++ b/pcbnew/scripting/examples/listPcbLibrary.py @@ -4,6 +4,6 @@ lst = FootprintEnumerate("/usr/share/kicad/modules/sockets.mod") for name in lst: m = FootprintLoad("/usr/share/kicad/modules/sockets.mod",name) print name,"->",m.GetLibRef(), m.GetReference() - for p in m.GetPads(): + for p in m.Pads(): print "\t",p.GetPadName(),p.GetPosition(),p.GetPos0(), p.GetOffset() - \ No newline at end of file + diff --git a/pcbnew/scripting/module.i b/pcbnew/scripting/module.i index f9f90407ef..54369486aa 100644 --- a/pcbnew/scripting/module.i +++ b/pcbnew/scripting/module.i @@ -33,11 +33,6 @@ %pythoncode { - def GetPads(self): return self.m_Pads - def GetDrawings(self): return self.m_Drawings - def GetReferenceObj(self): return self.m_Reference - def GetValueObj(self): return self.m_Value - #def SaveToLibrary(self,filename): # return SaveModuleToLibrary(filename,self) @@ -52,10 +47,10 @@ if type(itemC) is D_PAD: item.thisown=0 - self.m_Pads.PushBack(itemC) + self.Pads().PushBack(itemC) elif type(itemC) in [ TEXTE_PCB, DIMENSION, TEXTE_MODULE, DRAWSEGMENT,EDGE_MODULE]: item.thisown = 0 - self.m_Drawings.PushBack(item) + self.GraphicalItems().PushBack(item) } } From 4b42ec3218d5d14513190b11e5860eccc1cd3c0a Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Fri, 19 Apr 2013 09:14:27 +0200 Subject: [PATCH 21/25] Pcbnew: fix bug in pcb_parser: incorrect pad local solder paste margin ratio value read when not 0. ( This also fixes bug 1170535 ) --- pcbnew/netlist_reader_common.cpp | 6 ++++++ pcbnew/pcb_parser.cpp | 3 ++- pcbnew/xchgmod.cpp | 1 - 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/pcbnew/netlist_reader_common.cpp b/pcbnew/netlist_reader_common.cpp index f0cc2c58bc..87acf9bf8c 100644 --- a/pcbnew/netlist_reader_common.cpp +++ b/pcbnew/netlist_reader_common.cpp @@ -250,6 +250,12 @@ void NETLIST_READER::TestFootprintsMatchingAndExchange() if( newModule ) { + wxString msg; + msg.Printf( _( "Module ref %s, change footprint %s to %s\n" ), + GetChars( module->GetReference() ), + GetChars( module->GetLibRef() ), + GetChars( cmp_info->m_Footprint ) ); + m_messageWindow->AppendText( msg ); // Change old module to the new module (and delete the old one) m_pcbframe->Exchange_Module( module, newModule, NULL ); } diff --git a/pcbnew/pcb_parser.cpp b/pcbnew/pcb_parser.cpp index c8a1229152..607da461e7 100644 --- a/pcbnew/pcb_parser.cpp +++ b/pcbnew/pcb_parser.cpp @@ -2182,7 +2182,8 @@ D_PAD* PCB_PARSER::parseD_PAD() throw( IO_ERROR, PARSE_ERROR ) break; case T_solder_paste_margin_ratio: - pad->SetLocalSolderPasteMarginRatio( parseBoardUnits( T_solder_paste_margin_ratio ) ); + pad->SetLocalSolderPasteMarginRatio( + parseDouble( "pad local solder paste margin ratio value" ) ); NeedRIGHT(); break; diff --git a/pcbnew/xchgmod.cpp b/pcbnew/xchgmod.cpp index f0290bec13..dafa481d23 100644 --- a/pcbnew/xchgmod.cpp +++ b/pcbnew/xchgmod.cpp @@ -177,7 +177,6 @@ int DIALOG_EXCHANGE_MODULE::Maj_ListeCmp( const wxString& reference, FILE* FichCmp, * NewFile; char line[1024]; wxString msg; -// char* quiet_gcc_4_4_3; if( old_name == new_name ) return 0; From 49045cf08c6fc2e348392dba33d746cd0d91be63 Mon Sep 17 00:00:00 2001 From: Wayne Stambaugh Date: Sun, 21 Apr 2013 15:44:57 -0400 Subject: [PATCH 22/25] Fix KiCad crash when no template is selected on new project from template. (fixes lp:1170973) --- kicad/prjconfig.cpp | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/kicad/prjconfig.cpp b/kicad/prjconfig.cpp index 419d8098ec..c33e59f76d 100644 --- a/kicad/prjconfig.cpp +++ b/kicad/prjconfig.cpp @@ -56,7 +56,8 @@ static const wxString GeneralGroupName( wxT( "/general" ) ); PARAM_CFG_ARRAY s_KicadManagerParams; -void KICAD_MANAGER_FRAME::CreateNewProject( const wxString aPrjFullFileName, bool aTemplateSelector = false ) +void KICAD_MANAGER_FRAME::CreateNewProject( const wxString aPrjFullFileName, + bool aTemplateSelector = false ) { wxString filename; wxFileName newProjectName = aPrjFullFileName; @@ -118,12 +119,16 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxString aPrjFullFileName, boo // Show the project template selector dialog int result = ps->ShowModal(); - if( result != wxID_OK ) + if( (result != wxID_OK) || (ps->GetWidget() == NULL) ) { - wxMessageBox( _( "Did not generate new project from template" ), - _( "Cancelled new project from template" ), - wxOK | wxICON_EXCLAMATION, - this ); + if( ps->GetWidget() == NULL ) + { + wxMessageBox( _( "No project template was selected. Cannot generate new " + "project." ), + _( "Error" ), + wxOK | wxICON_ERROR, + this ); + } } else { @@ -132,7 +137,7 @@ void KICAD_MANAGER_FRAME::CreateNewProject( const wxString aPrjFullFileName, boo if( !ps->GetWidget()->GetTemplate()->CreateProject( newProjectName ) ) { wxMessageBox( _( "Problem whilst creating new project from template!" ), - _( "Could not generate new project" ), + _( "Template Error" ), wxOK | wxICON_ERROR, this ); } @@ -205,17 +210,19 @@ void KICAD_MANAGER_FRAME::OnLoadProject( wxCommandEvent& event ) // Check if the project directory is empty wxDir directory ( m_ProjectFileName.GetPath() ); + if( directory.HasFiles() ) { - wxString msg = _( "The selected directory is not empty. " - "We recommend you create projects in their own clean directory.\n\n" - "Do you want to create a new empty directory for the project?" ); + wxString msg = _( "The selected directory is not empty. We recommend you " + "create projects in their own clean directory.\n\nDo you " + "want to create a new empty directory for the project?" ); if( IsOK( this, msg ) ) { // Append a new directory with the same name of the project file // and try to create it m_ProjectFileName.AppendDir( m_ProjectFileName.GetName() ); + if( !wxMkdir( m_ProjectFileName.GetPath() ) ) // There was a problem, undo m_ProjectFileName.RemoveLastDir(); From 6a429facb61167ca1c2df86c6f2a02cf78e60f4f Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Thu, 25 Apr 2013 09:05:33 +0200 Subject: [PATCH 23/25] Pcbnew, dialog SVG export: Fix Pcbnew crash when opening the dialog. --- 3d-viewer/3d_draw_basic_functions.cpp | 2 +- pcbnew/dialogs/dialog_SVG_print.cpp | 10 +++++----- pcbnew/dialogs/dialog_SVG_print_base.cpp | 5 ++++- pcbnew/dialogs/dialog_SVG_print_base.h | 4 +++- pcbnew/hotkeys_board_editor.cpp | 14 ++++++++------ 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/3d-viewer/3d_draw_basic_functions.cpp b/3d-viewer/3d_draw_basic_functions.cpp index 854866213f..635d3c66e1 100644 --- a/3d-viewer/3d_draw_basic_functions.cpp +++ b/3d-viewer/3d_draw_basic_functions.cpp @@ -217,7 +217,7 @@ void Draw3D_SolidHorizontalPolyPolygons( const std::vector& aPolysList, /* draw the solid polygon found in aPolysList - * The first polygonj is the main polygon, others are holes + * The first polygon is the main polygon, others are holes * See Draw3D_SolidHorizontalPolyPolygons for more info */ void Draw3D_SolidHorizontalPolygonWithHoles( const std::vector& aPolysList, diff --git a/pcbnew/dialogs/dialog_SVG_print.cpp b/pcbnew/dialogs/dialog_SVG_print.cpp index 39eab85e9d..0a962d35c5 100644 --- a/pcbnew/dialogs/dialog_SVG_print.cpp +++ b/pcbnew/dialogs/dialog_SVG_print.cpp @@ -118,11 +118,11 @@ void DIALOG_SVG_PRINT::initDialog() // (Front or Top to Back or Bottom) DECLARE_LAYERS_ORDER_LIST( layersOrder ); - for( LAYER_NUM layer_idx = FIRST_LAYER; layer_idx < NB_LAYERS; ++layer_idx ) + for( LAYER_NUM layer_idx = FIRST_LAYER; layer_idx < NB_PCB_LAYERS; ++layer_idx ) { layer = layersOrder[layer_idx]; - wxASSERT( layer < NB_LAYERS ); + wxASSERT( layer < NB_PCB_LAYERS ); if( m_boxSelectLayer[layer] == NULL ) continue; @@ -148,7 +148,7 @@ void DIALOG_SVG_PRINT::initDialog() { wxString layerKey; - for( LAYER_NUM layer = FIRST_LAYER; layer < NB_LAYERS; ++layer ) + for( LAYER_NUM layer = FIRST_LAYER; layer < NB_PCB_LAYERS; ++layer ) { bool option; @@ -237,7 +237,7 @@ void DIALOG_SVG_PRINT::ExportSVGFile( bool aOnlyOneFile ) // Build layers mask LAYER_MSK printMaskLayer = NO_LAYERS; - for( LAYER_NUM layer = FIRST_LAYER; layer < NB_LAYERS; ++layer ) + for( LAYER_NUM layer = FIRST_LAYER; layer < NB_PCB_LAYERS; ++layer ) { if( m_boxSelectLayer[layer] && m_boxSelectLayer[layer]->GetValue() ) printMaskLayer |= GetLayerMask( layer ); @@ -363,7 +363,7 @@ void DIALOG_SVG_PRINT::OnCloseWindow( wxCloseEvent& event ) wxString layerKey; - for( LAYER_NUM layer = FIRST_LAYER; layerSetMaxLength( 0 ); m_outputDirectoryName->SetToolTip( _("Enter a filename if you do not want to use default file names\nCan be used only when printing the current sheet") ); m_outputDirectoryName->SetMinSize( wxSize( 450,-1 ) ); @@ -64,6 +65,7 @@ DIALOG_SVG_PRINT_base::DIALOG_SVG_PRINT_base( wxWindow* parent, wxWindowID id, c sbOptionsSizer->Add( m_TextPenWidth, 0, wxRIGHT|wxLEFT, 5 ); m_DialogDefaultPenSize = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_DialogDefaultPenSize->SetMaxLength( 0 ); sbOptionsSizer->Add( m_DialogDefaultPenSize, 0, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); wxString m_ModeColorOptionChoices[] = { _("Color"), _("Black and white") }; @@ -118,6 +120,7 @@ DIALOG_SVG_PRINT_base::DIALOG_SVG_PRINT_base( wxWindow* parent, wxWindowID id, c bMainSizer->Add( m_staticText2, 0, wxTOP|wxRIGHT|wxLEFT, 5 ); m_messagesBox = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); + m_messagesBox->SetMaxLength( 0 ); m_messagesBox->SetMinSize( wxSize( -1,100 ) ); bMainSizer->Add( m_messagesBox, 1, wxBOTTOM|wxRIGHT|wxLEFT|wxEXPAND, 5 ); diff --git a/pcbnew/dialogs/dialog_SVG_print_base.h b/pcbnew/dialogs/dialog_SVG_print_base.h index bc56d76fb2..aa3e893d69 100644 --- a/pcbnew/dialogs/dialog_SVG_print_base.h +++ b/pcbnew/dialogs/dialog_SVG_print_base.h @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////// -// C++ code generated with wxFormBuilder (version Apr 10 2012) +// C++ code generated with wxFormBuilder (version Oct 8 2012) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! @@ -11,6 +11,8 @@ #include #include #include +class DIALOG_SHIM; + #include "dialog_shim.h" #include #include diff --git a/pcbnew/hotkeys_board_editor.cpp b/pcbnew/hotkeys_board_editor.cpp index f1ef2fa000..0a155643f4 100644 --- a/pcbnew/hotkeys_board_editor.cpp +++ b/pcbnew/hotkeys_board_editor.cpp @@ -170,8 +170,10 @@ void PCB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosit if( GetCanvas()->IsMouseCaptured() ) GetCanvas()->CallMouseCapture( aDC, wxDefaultPosition, false ); - GetBoard()->SetTrackWidthIndex( ( GetBoard()->GetTrackWidthIndex() + 1 ) % - GetBoard()->m_TrackWidthList.size() ); + if( GetBoard()->GetTrackWidthIndex() < GetBoard()->m_TrackWidthList.size() - 1) + GetBoard()->SetTrackWidthIndex( GetBoard()->GetTrackWidthIndex() + 1 ); + else + GetBoard()->SetTrackWidthIndex( 0 ); if( GetCanvas()->IsMouseCaptured() ) GetCanvas()->CallMouseCapture( aDC, wxDefaultPosition, false ); @@ -182,10 +184,10 @@ void PCB_EDIT_FRAME::OnHotKey( wxDC* aDC, int aHotkeyCode, const wxPoint& aPosit if( GetCanvas()->IsMouseCaptured() ) GetCanvas()->CallMouseCapture( aDC, wxDefaultPosition, false ); - if( GetBoard()->GetTrackWidthIndex() == 0 ) - GetBoard()->SetTrackWidthIndex( GetBoard()->m_TrackWidthList.size() ); - - GetBoard()->SetTrackWidthIndex( GetBoard()->GetTrackWidthIndex() - 1 ); + if( GetBoard()->GetTrackWidthIndex() <= 0 ) + GetBoard()->SetTrackWidthIndex( GetBoard()->m_TrackWidthList.size() -1 ); + else + GetBoard()->SetTrackWidthIndex( GetBoard()->GetTrackWidthIndex() - 1 ); if( GetCanvas()->IsMouseCaptured() ) GetCanvas()->CallMouseCapture( aDC, wxDefaultPosition, false ); From 113325673f1aea5b5f39cfa922c968e1b03e6eee Mon Sep 17 00:00:00 2001 From: Dick Hollenbeck Date: Thu, 25 Apr 2013 07:25:47 -0500 Subject: [PATCH 24/25] pcb_parser failed on (fill yes (arc_segments 16) (thermal_gap 1.99898) (thermal_bridge_width 1.99898)) See http://tech.groups.yahoo.com/group/kicad-users/message/15105 --- pcbnew/pcb_parser.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/pcbnew/pcb_parser.cpp b/pcbnew/pcb_parser.cpp index 607da461e7..5934d1ed0b 100644 --- a/pcbnew/pcb_parser.cpp +++ b/pcbnew/pcb_parser.cpp @@ -2488,18 +2488,22 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR ) // @todo Create an enum for fill modes. zone->SetFillMode( token == T_polygon ? 0 : 1 ); + NeedRIGHT(); break; case T_arc_segments: zone->SetArcSegmentCount( parseInt( "arc segment count" ) ); + NeedRIGHT(); break; case T_thermal_gap: zone->SetThermalReliefGap( parseBoardUnits( T_thermal_gap ) ); + NeedRIGHT(); break; case T_thermal_bridge_width: zone->SetThermalReliefCopperBridge( parseBoardUnits( T_thermal_bridge_width ) ); + NeedRIGHT(); break; case T_smoothing: @@ -2520,21 +2524,19 @@ ZONE_CONTAINER* PCB_PARSER::parseZONE_CONTAINER() throw( IO_ERROR, PARSE_ERROR ) default: Expecting( "none, chamfer, or fillet" ); } - + NeedRIGHT(); break; case T_radius: zone->SetCornerRadius( parseBoardUnits( "corner radius" ) ); + NeedRIGHT(); break; default: Expecting( "mode, arc_segments, thermal_gap, thermal_bridge_width, " "smoothing, or radius" ); } - - NeedRIGHT(); } - break; case T_keepout: From 324c39931c932e16060951b58e0a436bf2f47e89 Mon Sep 17 00:00:00 2001 From: Wayne Stambaugh Date: Thu, 25 Apr 2013 12:29:35 -0400 Subject: [PATCH 25/25] Pcbnew NETLIST_READER improvements. * Create separate NETLIST object to hold contents of netlist files. * Read entire netlist and footprint link files before making applying changes to board. * Add BOARD::ReplaceNetlist() function to eliminate the calls between the NETLIST_READER, PCB_EDIT_FRAME, and BOARD objects. * Change placement of new components below the center of the current board or in the center of the page if the BOARD is empty. * Add dry run option to netlist dialog to print changes to message control without making changes. * Add button to netlist dialog to allow saving contents of message control to a file. * Eliminate the need to compile netlist_reader_*.cpp in both CvPcb and Pcbnew. * Add netlist_reader_*.cpp to the pcbcommon library. * Remove redundant load component link file code from CvPcb. * Modify CvPcb new to work with the new NETLIST_READER object. * Add compare() function and < and == operators to FPID object. * Add REPORTER class to hide an underlying string writing implementation for use in low level objects. Thank you Dick for the idea. * Lots of minor coding policy, Doxygen comment, and missing license fixes. --- 3d-viewer/modelparsers.h | 3 +- TODO.txt | 9 +- common/CMakeLists.txt | 4 + common/fpid.cpp | 20 + common/reporter.cpp | 46 + common/wildcards_and_files_ext.cpp | 3 +- cvpcb/CMakeLists.txt | 3 - cvpcb/autosel.cpp | 76 +- cvpcb/class_footprints_listbox.cpp | 85 +- cvpcb/cvframe.cpp | 39 +- cvpcb/cvpcb.h | 4 - cvpcb/cvpcb_mainframe.h | 65 +- cvpcb/cvstruct.h | 63 +- cvpcb/listboxes.cpp | 41 +- cvpcb/loadcmp.cpp | 10 +- cvpcb/read_write_cmpfile.cpp | 108 +-- cvpcb/readschematicnetlist.cpp | 92 +- cvpcb/readwrite_dlgs.cpp | 95 +-- eeschema/class_library.cpp | 2 +- include/appl_wxstruct.h | 4 +- include/dialog_helpers.h | 25 + include/fpid.h | 23 + include/reporter.h | 89 ++ include/wildcards_and_files_ext.h | 1 + include/wxBasePcbFrame.h | 13 + include/wxPcbStruct.h | 77 +- pcbnew/CMakeLists.txt | 3 - pcbnew/class_board.cpp | 267 ++++++ pcbnew/class_board.h | 77 +- pcbnew/class_module.cpp | 59 +- pcbnew/class_module.h | 31 +- pcbnew/class_netinfo.h | 31 + pcbnew/class_netinfo_item.cpp | 7 - pcbnew/class_pad.cpp | 50 +- pcbnew/class_pad.h | 12 + pcbnew/dialogs/dialog_edit_module_text.cpp | 4 +- pcbnew/dialogs/dialog_netlist.cpp | 235 ++++- pcbnew/dialogs/dialog_netlist.h | 51 +- pcbnew/dialogs/dialog_netlist_fbp.cpp | 36 +- pcbnew/dialogs/dialog_netlist_fbp.fbp | 207 ++++- pcbnew/dialogs/dialog_netlist_fbp.h | 6 + pcbnew/dialogs/dialog_orient_footprints.cpp | 43 +- pcbnew/dialogs/dialog_pad_properties.cpp | 4 +- pcbnew/loadcmp.cpp | 53 +- pcbnew/muonde.cpp | 56 +- pcbnew/netlist.cpp | 311 +++---- pcbnew/netlist_reader.h | 900 +++++++++++++------- pcbnew/netlist_reader_common.cpp | 779 +++++++---------- pcbnew/netlist_reader_firstformat.cpp | 370 +++----- pcbnew/netlist_reader_kicad.cpp | 448 ++++------ 50 files changed, 2888 insertions(+), 2152 deletions(-) create mode 100644 common/reporter.cpp create mode 100644 include/reporter.h diff --git a/3d-viewer/modelparsers.h b/3d-viewer/modelparsers.h index 7153c21ba2..147a0fda16 100644 --- a/3d-viewer/modelparsers.h +++ b/3d-viewer/modelparsers.h @@ -112,7 +112,8 @@ public: * Function GetNodeProperties * Collects all node properties to map. * - * @param aProps contains map of found properties + * @param aNode is an XML node. + * @param aProps contains map of found properties. */ static void GetNodeProperties( wxXmlNode* aNode, PROPERTY_MAP& aProps ); diff --git a/TODO.txt b/TODO.txt index 2dce8bed09..7a7a30ec34 100644 --- a/TODO.txt +++ b/TODO.txt @@ -10,7 +10,7 @@ WXMAC Platform Common ------ * Grep for @TODO or TODO for sourcecode tasks -* Use doxygen compatible comments on member functions (.h files) +* Use Doxygen compatible comments on member functions (.h files) * Add tooltip text to all non-obvious controls in every dialog window. Use wxFormBuilder. * Component and module search displays in which library the @@ -113,9 +113,9 @@ const wxString FP_LIB_TABLE::ExpandSubtitutions( const wxString aString ) -EESchema +Eeschema -------- -* Drag and drop between two EESchema windows. +* Drag and drop between two Eeschema windows. Wayne: E3) Hook up perform last library search hot key to replace search libraries for @@ -159,5 +159,6 @@ PCBNew of PLUGIN::Footprint*() functions. At least LEGACY and KICAD are both needed concurrently. - +*) Add a hot key to toggle the 45 degree constraint on and off so that it can be + changed when drawing a trace. diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index b0d61ebd8c..ffc0279f08 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -72,6 +72,7 @@ set(COMMON_SRCS newstroke_font.cpp projet_config.cpp ptree.cpp + reporter.cpp richio.cpp selcolor.cpp string.cpp @@ -116,6 +117,9 @@ set(PCB_COMMON_SRCS ../pcbnew/class_zone_settings.cpp ../pcbnew/classpcb.cpp ../pcbnew/collectors.cpp + ../pcbnew/netlist_reader_common.cpp + ../pcbnew/netlist_reader_firstformat.cpp + ../pcbnew/netlist_reader_kicad.cpp ../pcbnew/sel_layer.cpp ../pcbnew/pcb_plot_params.cpp ../pcbnew/io_mgr.cpp diff --git a/common/fpid.cpp b/common/fpid.cpp index 48433985cd..984604d3cc 100644 --- a/common/fpid.cpp +++ b/common/fpid.cpp @@ -310,6 +310,26 @@ std::string FPID::Format( const std::string& aLogicalLib, const std::string& aFo } +int FPID::compare( const FPID& aFPID ) const +{ + // Don't bother comparing the same object. + if( this == &aFPID ) + return 0; + + int retv = nickname.compare( aFPID.nickname ); + + if( retv != 0 ) + return retv; + + retv = footprint.compare( aFPID.footprint ); + + if( retv != 0 ) + return retv; + + return revision.compare( aFPID.revision ); +} + + #if 0 && defined(DEBUG) // build this with Debug CMAKE_BUILD_TYPE diff --git a/common/reporter.cpp b/common/reporter.cpp new file mode 100644 index 0000000000..8402d0c2b8 --- /dev/null +++ b/common/reporter.cpp @@ -0,0 +1,46 @@ +/** + * @file reporter.h + */ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Wayne Stambaugh + * Copyright (C) 1992-2013 KiCad Developers, see change_log.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 + + +REPORTER& REPORTER::Report( const char *aText ) +{ + Report( FROM_UTF8( aText ) ); + return *this; +} + + +REPORTER& WX_TEXT_CTRL_REPORTER::Report( const wxString& aText ) +{ + wxCHECK_MSG( m_textCtrl != NULL, *this, + wxT( "No wxTextCtrl object defined in WX_TEXT_CTRL_REPORTER." ) ); + + m_textCtrl->AppendText( aText ); + return *this; +} diff --git a/common/wildcards_and_files_ext.cpp b/common/wildcards_and_files_ext.cpp index 2a09e046fb..9149ae229c 100644 --- a/common/wildcards_and_files_ext.cpp +++ b/common/wildcards_and_files_ext.cpp @@ -1,7 +1,7 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 20012 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com + * Copyright (C) 2012 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com * Copyright (C) 2008-2012 Wayne Stambaugh * Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors. * @@ -96,3 +96,4 @@ const wxString PSFileWildcard( _( "PostScript files (.ps)|*.ps" ) ); const wxString ReportFileWildcard = _( "Report files (*.rpt)|*.rpt" ); const wxString FootprintPlaceFileWildcard = _( "Footprint place files (*.pos)|*.pos" ); const wxString Shapes3DFileWildcard( _( "Vrml and x3d files (*.wrl *.x3d)|*.wrl;*.x3d" ) ); +const wxString TextWildcard( _( "Text files (*.txt)|*.txt" ) ); diff --git a/cvpcb/CMakeLists.txt b/cvpcb/CMakeLists.txt index f154c169d4..ad48351d46 100644 --- a/cvpcb/CMakeLists.txt +++ b/cvpcb/CMakeLists.txt @@ -27,9 +27,6 @@ set(CVPCB_DIALOGS set(CVPCB_SRCS ../common/base_units.cpp - ../pcbnew/netlist_reader_common.cpp - ../pcbnew/netlist_reader_kicad.cpp - ../pcbnew/netlist_reader_firstformat.cpp ../pcbnew/class_drc_item.cpp autosel.cpp cfg.cpp diff --git a/cvpcb/autosel.cpp b/cvpcb/autosel.cpp index fd9fc906c4..0e96048b06 100644 --- a/cvpcb/autosel.cpp +++ b/cvpcb/autosel.cpp @@ -1,3 +1,26 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2012 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 + */ + /** * @file autosel.cpp */ @@ -39,10 +62,16 @@ typedef boost::ptr_vector< FOOTPRINT_ALIAS > FOOTPRINT_ALIAS_LIST; wxString GetQuotedText( wxString & text ) { int i = text.Find( QUOTE ); - if( wxNOT_FOUND == i ) return wxT( "" ); + + if( wxNOT_FOUND == i ) + return wxT( "" ); + wxString shrt = text.Mid( i + 1 ); i = shrt.Find( QUOTE ); - if( wxNOT_FOUND == i ) return wxT( "" ); + + if( wxNOT_FOUND == i ) + return wxT( "" ); + text = shrt.Mid( i + 1 ); return shrt.Mid( 0, i ); } @@ -52,13 +81,14 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event ) { FOOTPRINT_ALIAS_LIST aliases; FOOTPRINT_ALIAS* alias; + COMPONENT* component; wxFileName fn; wxString msg, tmp; char Line[1024]; FILE* file; size_t ii; - if( m_components.empty() ) + if( m_netlist.IsEmpty() ) return; /* Find equivalents in all available files. */ @@ -79,8 +109,8 @@ void CVPCB_MAINFRAME::AssocieModule( wxCommandEvent& event ) if( !tmp ) { - msg.Printf( _( "Footprint alias library file <%s> could not be \ -found in the default search paths." ), + msg.Printf( _( "Footprint alias library file <%s> could not be found in the " + "default search paths." ), GetChars( fn.GetFullName() ) ); wxMessageBox( msg, titleLibLoadError, wxOK | wxICON_ERROR ); continue; @@ -127,18 +157,21 @@ found in the default search paths." ), m_skipComponentSelect = true; ii = 0; - BOOST_FOREACH( COMPONENT_INFO& component, m_components ) + + for( unsigned kk = 0; kk < m_netlist.GetCount(); kk++ ) { + component = m_netlist.GetComponent( kk ); + bool found = false; m_ListCmp->SetSelection( ii++, true ); - if( !component.m_Footprint.IsEmpty() ) + if( !component->GetFootprintLibName().IsEmpty() ) continue; BOOST_FOREACH( FOOTPRINT_ALIAS& alias, aliases ) { - if( alias.m_Name.CmpNoCase( component.m_Value ) != 0 ) + if( alias.m_Name.CmpNoCase( component->GetValue() ) != 0 ) continue; /* filter alias so one can use multiple aliases (for polar and nonpolar caps for @@ -147,23 +180,23 @@ found in the default search paths." ), if( module ) { - size_t filtercount = component.m_FootprintFilter.GetCount(); + size_t filtercount = component->GetFootprintFilters().GetCount(); found = ( 0 == filtercount ); // if no entries, do not filter for( size_t jj = 0; jj < filtercount && !found; jj++ ) { - found = module->m_Module.Matches( component.m_FootprintFilter[jj] ); + found = module->m_Module.Matches( component->GetFootprintFilters()[jj] ); } } else { - msg.Printf( _( "Component %s: footprint %s not found in \ -any of the project footprint libraries." ), - GetChars( component.m_Reference ), + msg.Printf( _( "Component %s: footprint %s not found in any of the project " + "footprint libraries." ), + GetChars( component->GetReference() ), GetChars( alias.m_FootprintName ) ); - wxMessageBox( msg, _( "CvPcb Error" ), wxOK | wxICON_ERROR, - this ); + wxMessageBox( msg, _( "CvPcb Error" ), wxOK | wxICON_ERROR, this ); } + if( found ) { SetNewPkg( alias.m_FootprintName ); @@ -171,15 +204,20 @@ any of the project footprint libraries." ), } } + /* obviously the last chance: there's only one filter matching one footprint */ - if( !found && 1 == component.m_FootprintFilter.GetCount() ) { + if( !found && 1 == component->GetFootprintFilters().GetCount() ) + { /* we do not need to analyse wildcards: single footprint do not contain them */ /* and if there are wildcards it just will not match any */ - FOOTPRINT_INFO *module = m_footprints.GetModuleInfo( component.m_FootprintFilter[0] ); - if( module ) { - SetNewPkg( component.m_FootprintFilter[0] ); + FOOTPRINT_INFO *module = m_footprints.GetModuleInfo( component->GetFootprintFilters()[0] ); + + if( module ) + { + SetNewPkg( component->GetFootprintFilters()[0] ); } } } + m_skipComponentSelect = false; } diff --git a/cvpcb/class_footprints_listbox.cpp b/cvpcb/class_footprints_listbox.cpp index a80c69c115..38421a34f7 100644 --- a/cvpcb/class_footprints_listbox.cpp +++ b/cvpcb/class_footprints_listbox.cpp @@ -1,6 +1,30 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com + * Copyright (C) 1992-2012 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 + */ + /** * @file class_footprints_listbox.cpp - * class to display the list fo available footprints + * class to display the list of available footprints */ #include @@ -132,7 +156,7 @@ void FOOTPRINTS_LISTBOX::SetFootprintFullList( FOOTPRINT_LIST& list ) } -void FOOTPRINTS_LISTBOX::SetFootprintFilteredList( COMPONENT_INFO* Component, +void FOOTPRINTS_LISTBOX::SetFootprintFilteredList( COMPONENT* aComponent, FOOTPRINT_LIST& list ) { wxString msg; @@ -149,13 +173,16 @@ void FOOTPRINTS_LISTBOX::SetFootprintFilteredList( COMPONENT_INFO* Component, // The search is case insensitive wxString module = footprint.m_Module.Upper(); wxString candidate; - for( jj = 0; jj < Component->m_FootprintFilter.GetCount(); jj++ ) + + for( jj = 0; jj < aComponent->GetFootprintFilters().GetCount(); jj++ ) { - candidate = Component->m_FootprintFilter[jj].Upper(); + candidate = aComponent->GetFootprintFilters()[jj].Upper(); + if( !module.Matches( candidate ) ) continue; + msg.Printf( wxT( "%3zu %s" ), m_FilteredFootprintList.GetCount() + 1, - footprint.m_Module.GetData() ); + footprint.m_Module.GetData() ); m_FilteredFootprintList.Add( msg ); hasItem = true; } @@ -172,8 +199,10 @@ void FOOTPRINTS_LISTBOX::SetFootprintFilteredList( COMPONENT_INFO* Component, Refresh(); } -void FOOTPRINTS_LISTBOX::SetFootprintFilteredByPinCount( COMPONENT_INFO* Component, - FOOTPRINT_LIST& list ) { + +void FOOTPRINTS_LISTBOX::SetFootprintFilteredByPinCount( COMPONENT* aComponent, + FOOTPRINT_LIST& list ) +{ wxString msg; int oldSelection = GetSelection(); bool hasItem = false; @@ -184,10 +213,10 @@ void FOOTPRINTS_LISTBOX::SetFootprintFilteredByPinCount( COMPONENT_INFO* Compone { FOOTPRINT_INFO& footprint = list.GetItem(ii); - if( Component->m_pinCount == footprint.m_padCount ) + if( aComponent->GetNetCount() == footprint.m_padCount ) { msg.Printf( wxT( "%3zu %s" ), m_FilteredFootprintList.GetCount() + 1, - footprint.m_Module.GetData() ); + footprint.m_Module.GetData() ); m_FilteredFootprintList.Add( msg ); hasItem = true; } @@ -204,13 +233,7 @@ void FOOTPRINTS_LISTBOX::SetFootprintFilteredByPinCount( COMPONENT_INFO* Compone Refresh(); } -/** Set the footprint list. We can have 2 footprint list: - * The full footprint list - * The filtered footprint list (if the current selected component has a - * filter for footprints) - * @param FullList true = full footprint list, false = filtered footprint list - * @param Redraw = true to redraw the window - */ + void FOOTPRINTS_LISTBOX::SetActiveFootprintList( bool FullList, bool Redraw ) { bool old_selection = m_UseFootprintFullList; @@ -226,10 +249,12 @@ void FOOTPRINTS_LISTBOX::SetActiveFootprintList( bool FullList, bool Redraw ) if( m_ActiveFootprintList ) { bool new_selection; + if( FullList ) new_selection = true; else new_selection = false; + if( new_selection != old_selection ) SetSelection( 0, true ); } @@ -264,14 +289,12 @@ void FOOTPRINTS_LISTBOX::SetActiveFootprintList( bool FullList, bool Redraw ) /**************************************/ BEGIN_EVENT_TABLE( FOOTPRINTS_LISTBOX, ITEMS_LISTBOX_BASE ) -EVT_SIZE( ITEMS_LISTBOX_BASE::OnSize ) -EVT_CHAR( FOOTPRINTS_LISTBOX::OnChar ) + EVT_SIZE( ITEMS_LISTBOX_BASE::OnSize ) + EVT_CHAR( FOOTPRINTS_LISTBOX::OnChar ) END_EVENT_TABLE() -/********************************************************/ void FOOTPRINTS_LISTBOX::OnLeftClick( wxListEvent& event ) -/********************************************************/ { FOOTPRINT_INFO* Module; wxString footprintName = GetSelectedFootprint(); @@ -297,9 +320,7 @@ void FOOTPRINTS_LISTBOX::OnLeftClick( wxListEvent& event ) } -/******************************************************/ void FOOTPRINTS_LISTBOX::OnLeftDClick( wxListEvent& event ) -/******************************************************/ { wxString footprintName = GetSelectedFootprint(); @@ -307,21 +328,10 @@ void FOOTPRINTS_LISTBOX::OnLeftDClick( wxListEvent& event ) } -/** - * Function OnChar - * called on a key pressed - * Call default handler for some special keys, - * and for "ascii" keys, select the first footprint - * that the name starts by the letter. - * This is the defaut behaviour of a listbox, but because we use - * virtual lists, the listbox does not know anything to what is displayed, - * we must handle this behaviour here. - * Furthermore the footprint name is not at the beginning of - * displayed lines (the first word is the line number) - */ void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event ) { int key = event.GetKeyCode(); + switch( key ) { case WXK_LEFT: @@ -343,16 +353,20 @@ void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event ) default: break; } + // Search for an item name starting by the key code: key = toupper(key); + for( unsigned ii = 0; ii < m_ActiveFootprintList->GetCount(); ii++ ) { wxString text = m_ActiveFootprintList->Item(ii); + /* search for the start char of the footprint name. * we must skip the line number - */ + */ text.Trim(false); // Remove leading spaces in line unsigned jj = 0; + for( ; jj < text.Len(); jj++ ) { // skip line number @@ -367,6 +381,7 @@ void FOOTPRINTS_LISTBOX::OnChar( wxKeyEvent& event ) } int start_char = toupper( text[jj] ); + if( key == start_char ) { Focus( ii ); diff --git a/cvpcb/cvframe.cpp b/cvpcb/cvframe.cpp index c3c271c318..4098dc44f7 100644 --- a/cvpcb/cvframe.cpp +++ b/cvpcb/cvframe.cpp @@ -334,7 +334,7 @@ void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event ) int ii = 0; int selection; - if( m_components.empty() ) + if( m_netlist.IsEmpty() ) return; selection = m_ListCmp->GetSelection(); @@ -342,9 +342,9 @@ void CVPCB_MAINFRAME::ToFirstNA( wxCommandEvent& event ) if( selection < 0 ) selection = 0; - BOOST_FOREACH( COMPONENT_INFO & component, m_components ) + for( unsigned jj = 0; jj < m_netlist.GetCount(); jj++ ) { - if( component.m_Footprint.IsEmpty() && ii > selection ) + if( m_netlist.GetComponent( jj )->GetFootprintLibName().IsEmpty() && ii > selection ) { m_ListCmp->SetSelection( ii ); SendMessageToEESCHEMA(); @@ -363,7 +363,7 @@ void CVPCB_MAINFRAME::ToPreviousNA( wxCommandEvent& event ) int ii; int selection; - if( m_components.empty() ) + if( m_netlist.IsEmpty() ) return; ii = m_ListCmp->GetCount() - 1; @@ -372,9 +372,9 @@ void CVPCB_MAINFRAME::ToPreviousNA( wxCommandEvent& event ) if( selection < 0 ) selection = m_ListCmp->GetCount() - 1; - BOOST_REVERSE_FOREACH( COMPONENT_INFO & component, m_components ) + for( unsigned kk = m_netlist.GetCount() - 1; kk >= 0; kk-- ) { - if( component.m_Footprint.IsEmpty() && ii < selection ) + if( m_netlist.GetComponent( kk )->GetFootprintLibName().IsEmpty() && ii < selection ) { m_ListCmp->SetSelection( ii ); SendMessageToEESCHEMA(); @@ -412,15 +412,15 @@ void CVPCB_MAINFRAME::DelAssociations( wxCommandEvent& event ) m_skipComponentSelect = true; m_ListCmp->SetSelection( 0 ); - BOOST_FOREACH( COMPONENT_INFO & component, m_components ) + for( unsigned i = 0; i < m_netlist.GetCount(); i++ ) { - component.m_Footprint.Empty(); + m_netlist.GetComponent( i )->SetFootprintLibName( wxEmptyString ); SetNewPkg( wxEmptyString ); } m_skipComponentSelect = false; m_ListCmp->SetSelection( 0 ); - m_undefinedComponentCnt = m_components.size(); + m_undefinedComponentCnt = m_netlist.GetCount(); } DisplayStatus(); @@ -538,18 +538,18 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event ) else { - if( &m_components[ selection ] == NULL ) + if( m_netlist.GetComponent( selection ) == NULL ) m_FootprintList->SetActiveFootprintList( SELECT_FULL_LIST, REDRAW_LIST ); else { if( m_mainToolBar->GetToolToggled( ID_CVPCB_FOOTPRINT_DISPLAY_PIN_FILTERED_LIST ) ) { - m_FootprintList->SetFootprintFilteredByPinCount( &m_components[ selection ], + m_FootprintList->SetFootprintFilteredByPinCount( m_netlist.GetComponent( selection ), m_footprints ); } else { - m_FootprintList->SetFootprintFilteredList( &m_components[ selection ], + m_FootprintList->SetFootprintFilteredList( m_netlist.GetComponent( selection ), m_footprints ); } } @@ -568,7 +568,7 @@ void CVPCB_MAINFRAME::OnSelectComponent( wxListEvent& event ) if( FindFocus() == m_ListCmp ) { - wxString module = *(&m_components[ selection ].m_Footprint); + wxString module = m_netlist.GetComponent( selection )->GetFootprintLibName(); bool found = false; for( int ii = 0; ii < m_FootprintList->GetCount(); ii++ ) @@ -642,7 +642,8 @@ void CVPCB_MAINFRAME::DisplayStatus() { wxString msg; - msg.Printf( _( "Components: %d (free: %d)" ), (int) m_components.size(), m_undefinedComponentCnt ); + msg.Printf( _( "Components: %d (free: %d)" ), (int) m_netlist.GetCount(), + m_undefinedComponentCnt ); SetStatusText( msg, 0 ); SetStatusText( wxEmptyString, 1 ); @@ -733,9 +734,9 @@ void CVPCB_MAINFRAME::SendMessageToEESCHEMA() { char cmd[1024]; int selection; - COMPONENT_INFO* Component; + COMPONENT* Component; - if( m_components.empty() ) + if( m_netlist.IsEmpty() ) return; selection = m_ListCmp->GetSelection(); @@ -743,12 +744,12 @@ void CVPCB_MAINFRAME::SendMessageToEESCHEMA() if ( selection < 0 ) selection = 0; - if( &m_components[ selection ] == NULL ) + if( m_netlist.GetComponent( selection ) == NULL ) return; - Component = &m_components[ selection ]; + Component = m_netlist.GetComponent( selection ); - sprintf( cmd, "$PART: \"%s\"", TO_UTF8( Component->m_Reference ) ); + sprintf( cmd, "$PART: \"%s\"", TO_UTF8( Component->GetReference() ) ); SendCommand( MSG_TO_SCH, cmd ); diff --git a/cvpcb/cvpcb.h b/cvpcb/cvpcb.h index 08b8b6e209..c506ea41df 100644 --- a/cvpcb/cvpcb.h +++ b/cvpcb/cvpcb.h @@ -21,10 +21,6 @@ #define LISTB_STYLE (wxSUNKEN_BORDER | wxLC_NO_HEADER | wxLC_REPORT | wxLC_VIRTUAL) -#include - -typedef boost::ptr_vector< COMPONENT_INFO > COMPONENT_LIST; - extern const wxString FootprintAliasFileExtension; extern const wxString RetroFileExtension; diff --git a/cvpcb/cvpcb_mainframe.h b/cvpcb/cvpcb_mainframe.h index 7e3a665fd8..49d8fe0ac3 100644 --- a/cvpcb/cvpcb_mainframe.h +++ b/cvpcb/cvpcb_mainframe.h @@ -1,3 +1,27 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2011 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com + * Copyright (C) 1992-2012 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 + */ + /** * @file cvpcb_mainframe.h */ @@ -7,6 +31,7 @@ #include #include +#include #include #include @@ -28,19 +53,19 @@ class CVPCB_MAINFRAME : public EDA_BASE_FRAME { public: - bool m_KeepCvpcbOpen; + bool m_KeepCvpcbOpen; FOOTPRINTS_LISTBOX* m_FootprintList; COMPONENTS_LISTBOX* m_ListCmp; DISPLAY_FOOTPRINTS_FRAME* m_DisplayFootprintFrame; - wxAuiToolBar* m_mainToolBar; - wxFileName m_NetlistFileName; + wxAuiToolBar* m_mainToolBar; + wxFileName m_NetlistFileName; wxArrayString m_ModuleLibNames; wxArrayString m_AliasLibNames; - wxString m_UserLibraryPath; - wxString m_NetlistFileExtension; - wxString m_DocModulesFileName; - FOOTPRINT_LIST m_footprints; - COMPONENT_LIST m_components; + wxString m_UserLibraryPath; + wxString m_NetlistFileExtension; + wxString m_DocModulesFileName; + FOOTPRINT_LIST m_footprints; + NETLIST m_netlist; protected: int m_undefinedComponentCnt; @@ -60,7 +85,7 @@ public: /** * Function OnSelectComponent * Called when clicking on a component in component list window - * * Updates the filtered foorprint list, if the filtered list option is selected + * * Updates the filtered footprint list, if the filtered list option is selected * * Updates the current selected footprint in footprint list * * Updates the footprint shown in footprint display window (if opened) */ @@ -141,22 +166,12 @@ public: * file name of the netlist or cmp file. * If aFullFileName is empty, a file name will be asked to the user * @return 0 if an error occurred saving the link file to \a aFullFileName. - * -1 if cancelled + * -1 if canceled * 1 if OK */ int SaveCmpLinkFile( const wxString& aFullFileName ); - /** - * Function LoadComponentFile - * loads the .cmp link file \a aCmpFileName which stores - * the component/footprint association. - * - * @param aFileName The full filename of .cmp file to load - * If empty, a filename will be asked to the user - */ - bool LoadComponentLinkFile( const wxString& aFileName ); - /** * Function WriteComponentLinkFile * Writes the component footprint link file \a aFullFileName on disk. @@ -166,16 +181,6 @@ public: */ bool WriteComponentLinkFile( const wxString& aFullFileName ); - /** - * Function ReadComponentLinkFile - * Reads the component footprint link file \a aFullFileName. - * - * @param aFile = the opened the opened file to read. - * ReadComponentLinkFile will close the file - * @return true if OK, false if error. - */ - bool ReadComponentLinkFile( FILE * aFile ); - /** * Function ReadNetList * reads the netlist (.net) file defined by #m_NetlistFileName. diff --git a/cvpcb/cvstruct.h b/cvpcb/cvstruct.h index 5d7ed48187..6bfbf3c445 100644 --- a/cvpcb/cvstruct.h +++ b/cvpcb/cvstruct.h @@ -1,6 +1,29 @@ -/*********************************************************/ -/* cvstruct.h */ -/*********************************************************/ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2012 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 + */ + +/** + * @file cvstruct.h + */ #ifndef CVSTRUCT_H #define CVSTRUCT_H @@ -10,6 +33,8 @@ /* Forward declarations of all top-level window classes. */ class CVPCB_MAINFRAME; +class COMPONENT; + /*********************************************************************/ /* ListBox (base class) to display lists of components or footprints */ @@ -53,10 +78,19 @@ public: void SetString( unsigned linecount, const wxString& text ); void AppendLine( const wxString& text ); void SetFootprintFullList( FOOTPRINT_LIST& list ); - void SetFootprintFilteredList( COMPONENT_INFO* Component, - FOOTPRINT_LIST& list ); - void SetFootprintFilteredByPinCount( COMPONENT_INFO* Component, - FOOTPRINT_LIST& list ); + void SetFootprintFilteredList( COMPONENT* aComponent, + FOOTPRINT_LIST& aList ); + void SetFootprintFilteredByPinCount( COMPONENT* aComponent, + FOOTPRINT_LIST& aList ); + + /** + * Set the footprint list. We can have 2 footprint list: + * The full footprint list + * The filtered footprint list (if the current selected component has a + * filter for footprints) + * @param FullList true = full footprint list, false = filtered footprint list + * @param Redraw = true to redraw the window + */ void SetActiveFootprintList( bool FullList, bool Redraw = false ); wxString GetSelectedFootprint(); @@ -65,6 +99,19 @@ public: // Events functions: void OnLeftClick( wxListEvent& event ); void OnLeftDClick( wxListEvent& event ); + + /** + * Function OnChar + * called on a key pressed + * Call default handler for some special keys, + * and for "ascii" keys, select the first footprint + * that the name starts by the letter. + * This is the default behavior of a listbox, but because we use + * virtual lists, the listbox does not know anything to what is displayed, + * we must handle this behavior here. + * Furthermore the footprint name is not at the beginning of + * displayed lines (the first word is the line number) + */ void OnChar( wxKeyEvent& event ); DECLARE_EVENT_TABLE() @@ -78,7 +125,7 @@ class COMPONENTS_LISTBOX : public ITEMS_LISTBOX_BASE { public: wxArrayString m_ComponentList; - CVPCB_MAINFRAME* m_Parent; + CVPCB_MAINFRAME* m_Parent; public: diff --git a/cvpcb/listboxes.cpp b/cvpcb/listboxes.cpp index c1e68a5910..b1fd0627b1 100644 --- a/cvpcb/listboxes.cpp +++ b/cvpcb/listboxes.cpp @@ -1,3 +1,26 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 1992-2012 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 + */ + /** * @file listboxes.cpp * @brief Implementation of class for displaying footprint list and component lists. @@ -67,9 +90,10 @@ CVPCB_MAINFRAME* ITEMS_LISTBOX_BASE::GetParent() */ void CVPCB_MAINFRAME::BuildCmpListBox() { - wxString msg; - wxSize size( 10, 10 ); - wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ); + COMPONENT* component; + wxString msg; + wxSize size( 10, 10 ); + wxFont guiFont = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT ); if( m_ListCmp == NULL ) { @@ -86,11 +110,14 @@ void CVPCB_MAINFRAME::BuildCmpListBox() m_ListCmp->m_ComponentList.Clear(); - BOOST_FOREACH( COMPONENT_INFO & component, m_components ) { + for( unsigned i = 0; i < m_netlist.GetCount(); i++ ) + { + component = m_netlist.GetComponent( i ); + msg.Printf( CMP_FORMAT, m_ListCmp->GetCount() + 1, - GetChars(component.m_Reference), - GetChars(component.m_Value), - GetChars(component.m_Footprint) ); + GetChars( component->GetReference() ), + GetChars( component->GetValue() ), + GetChars( component->GetFootprintLibName() ) ); m_ListCmp->m_ComponentList.Add( msg ); } diff --git a/cvpcb/loadcmp.cpp b/cvpcb/loadcmp.cpp index d01699a8be..21cc0cc961 100644 --- a/cvpcb/loadcmp.cpp +++ b/cvpcb/loadcmp.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include @@ -45,9 +46,9 @@ MODULE* DISPLAY_FOOTPRINTS_FRAME::Get_Module( const wxString& aFootprintName ) if( !libPath ) { - wxString msg = wxString::Format( - _("PCB foot print library file <%s> could not be found in the default search paths." ), - fn.GetFullName().GetData() ); + wxString msg = wxString::Format( _( "PCB footprint library file <%s> could not " + "be found in the default search paths." ), + fn.GetFullName().GetData() ); // @todo we should not be using wxMessageBox directly. wxMessageBox( msg, titleLibLoadError, wxOK | wxICON_ERROR, this ); @@ -58,7 +59,7 @@ MODULE* DISPLAY_FOOTPRINTS_FRAME::Get_Module( const wxString& aFootprintName ) if( footprint ) { - footprint->SetParent( GetBoard() ); + footprint->SetParent( (EDA_ITEM*) GetBoard() ); footprint->SetPosition( wxPoint( 0, 0 ) ); return footprint; } @@ -74,4 +75,3 @@ MODULE* DISPLAY_FOOTPRINTS_FRAME::Get_Module( const wxString& aFootprintName ) DisplayError( this, msg ); return NULL; } - diff --git a/cvpcb/read_write_cmpfile.cpp b/cvpcb/read_write_cmpfile.cpp index c527b09f51..fc0a0bc23f 100644 --- a/cvpcb/read_write_cmpfile.cpp +++ b/cvpcb/read_write_cmpfile.cpp @@ -54,6 +54,7 @@ static char HeaderLinkFile[] = { "Cmp-Mod V01" }; bool CVPCB_MAINFRAME::WriteComponentLinkFile( const wxString& aFullFileName ) { + COMPONENT* component; FILE* outputFile; wxFileName fn( aFullFileName ); wxString Title = wxGetApp().GetTitle() + wxT( " " ) + GetBuildVersion(); @@ -69,13 +70,15 @@ bool CVPCB_MAINFRAME::WriteComponentLinkFile( const wxString& aFullFileName ) retval |= fprintf( outputFile, " Created by %s", TO_UTF8( Title ) ); retval |= fprintf( outputFile, " date = %s\n", TO_UTF8( DateAndTime() ) ); - BOOST_FOREACH( COMPONENT_INFO& component, m_components ) + for( unsigned i = 0; i < m_netlist.GetCount(); i++ ) { + component = m_netlist.GetComponent( i ); retval |= fprintf( outputFile, "\nBeginCmp\n" ); - retval |= fprintf( outputFile, "TimeStamp = %s;\n", TO_UTF8( component.m_TimeStamp ) ); - retval |= fprintf( outputFile, "Reference = %s;\n", TO_UTF8( component.m_Reference ) ); - retval |= fprintf( outputFile, "ValeurCmp = %s;\n", TO_UTF8( component.m_Value ) ); - retval |= fprintf( outputFile, "IdModule = %s;\n", TO_UTF8( component.m_Footprint ) ); + retval |= fprintf( outputFile, "TimeStamp = %s;\n", TO_UTF8( component->GetTimeStamp() ) ); + retval |= fprintf( outputFile, "Reference = %s;\n", TO_UTF8( component->GetReference() ) ); + retval |= fprintf( outputFile, "ValeurCmp = %s;\n", TO_UTF8( component->GetValue() ) ); + retval |= fprintf( outputFile, "IdModule = %s;\n", + TO_UTF8( component->GetFootprintLibName() ) ); retval |= fprintf( outputFile, "EndCmp\n" ); } @@ -83,98 +86,3 @@ bool CVPCB_MAINFRAME::WriteComponentLinkFile( const wxString& aFullFileName ) fclose( outputFile ); return retval >= 0; } - -bool CVPCB_MAINFRAME::ReadComponentLinkFile( FILE * aFile ) -{ - wxString timestamp, valeur, ilib, namecmp, msg; - bool read_cmp_data = false, eof = false; - char Line[1024], * ident, * data; - - // Identification of the type of link file - if( fgets( Line, sizeof(Line), aFile ) == 0 || - strnicmp( Line, HeaderLinkFile, 11 ) != 0 ) - { - fclose( aFile ); - return false; - } - - while( !eof && fgets( Line, sizeof(Line), aFile ) != 0 ) - { - if( strnicmp( Line, "EndListe", 8 ) == 0 ) - break; - - /* Search the beginning of the component description. */ - if( strnicmp( Line, "BeginCmp", 8 ) != 0 ) - continue; - - timestamp.Empty(); - valeur.Empty(); - ilib.Empty(); - namecmp.Empty(); - read_cmp_data = true; - - while( !eof && read_cmp_data ) - { - if( fgets( Line, 1024, aFile ) == 0 ) - { - eof = true; - break; - } - - if( strnicmp( Line, "EndCmp", 6 ) == 0 ) - { - read_cmp_data = true; - break; - } - - ident = strtok( Line, "=;\n\r" ); - data = strtok( NULL, ";\n\r" ); - - if( strnicmp( ident, "TimeStamp", 9 ) == 0 ) - { - timestamp = FROM_UTF8( data ); - timestamp.Trim( true ); - timestamp.Trim( false ); - continue; - } - - if( strnicmp( ident, "Reference", 9 ) == 0 ) - { - namecmp = FROM_UTF8( data ); - namecmp.Trim( true ); - namecmp.Trim( false ); - continue; - } - - if( strnicmp( ident, "ValeurCmp", 9 ) == 0 ) - { - valeur = FROM_UTF8( data ); - valeur.Trim( true ); - valeur.Trim( false ); - continue; - } - - if( strnicmp( ident, "IdModule", 8 ) == 0 ) - { - ilib = FROM_UTF8( data ); - ilib.Trim( true ); - ilib.Trim( false ); - continue; - } - } // End reading one component link block. - - // Search corresponding component info in list and update its parameters. - BOOST_FOREACH( COMPONENT_INFO& component, m_components ) - { - if( namecmp != component.m_Reference ) - continue; - - /* Copy the name of the corresponding module. */ - component.m_Footprint = ilib; - } - } - - fclose( aFile ); - return true; -} - diff --git a/cvpcb/readschematicnetlist.cpp b/cvpcb/readschematicnetlist.cpp index 06e0a36bbf..402443bb98 100644 --- a/cvpcb/readschematicnetlist.cpp +++ b/cvpcb/readschematicnetlist.cpp @@ -26,7 +26,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -/* Read a nelist type Eeschema (New and Old format) +/* Read a netlist type Eeschema (New and Old format) * or OrcadPCB2 and build the component list */ @@ -35,82 +35,56 @@ #include #include #include +#include #include #include - #include -// COMPONENT_INFO object list sort function: -bool operator < ( const COMPONENT_INFO& item1, const COMPONENT_INFO& item2 ) -{ - return StrNumCmp( item1.m_Reference, item2.m_Reference, INT_MAX, true ) < 0; -} - int CVPCB_MAINFRAME::ReadSchematicNetlist() { - FILE* netfile = wxFopen( m_NetlistFileName.GetFullPath(), wxT( "rt" ) ); + wxBusyCursor dummy; // Shows an hourglass while loading. + NETLIST_READER* netlistReader; + wxString msg; + wxString compFootprintLinkFileName; + wxFileName fn = m_NetlistFileName; - if( netfile == NULL ) + // Load the footprint association file if it has already been created. + fn.SetExt( ComponentFileExtension ); + + if( fn.FileExists() && fn.IsFileReadable() ) + compFootprintLinkFileName = fn.GetFullPath(); + + m_netlist.Clear(); + + try { - wxString msg; - msg.Printf( _( "Could not open file <%>" ), - GetChars( m_NetlistFileName.GetFullPath() ) ); - wxMessageBox( msg ); - return -1; + netlistReader = NETLIST_READER::GetNetlistReader( &m_netlist, + m_NetlistFileName.GetFullPath(), + compFootprintLinkFileName ); + std::auto_ptr< NETLIST_READER > nlr( netlistReader ); + netlistReader->LoadNetlist(); + } + catch( IO_ERROR& ioe ) + { + msg = wxString::Format( _( "Error loading netlist.\n%s" ), ioe.errorText.GetData() ); + wxMessageBox( msg, _( "Netlist Load Error" ), wxOK | wxICON_ERROR ); + return 1; } - NETLIST_READER netList_Reader( NULL, NULL ); - netList_Reader.m_UseTimeStamp = false; - netList_Reader.m_ChangeFootprints = false; - netList_Reader.m_UseCmpFile = false; - netList_Reader.SetFilesnames( m_NetlistFileName.GetFullPath(), wxEmptyString ); - // True to read footprint filters section: true for CvPcb, false for Pcbnew - netList_Reader.ReadLibpartSectionSetOpt( true ); - - // on OSX otherwise reloading a file you will see duplicates - m_components.clear(); - - bool success = netList_Reader.ReadNetList( netfile ); - if( !success ) + // We also remove footprint name if it is "$noname" because this is a dummy name, + // not the actual name of the footprint. + for( unsigned ii = 0; ii < m_netlist.GetCount(); ii++ ) { - wxMessageBox( _("Netlist read error") ); - return false; + if( m_netlist.GetComponent( ii )->GetFootprintLibName() == wxT( "$noname" ) ) + m_netlist.GetComponent( ii )->SetFootprintLibName( wxEmptyString ); } - // Now copy footprints info into Cvpcb list: - // We also remove footprint name if it is "$noname" - // because this is a dummy name,, not an actual name - COMPONENT_INFO_LIST& cmpInfo = netList_Reader.GetComponentInfoList(); - for( unsigned ii = 0; ii < cmpInfo.size(); ii++ ) - { - m_components.push_back( cmpInfo[ii] ); - if( cmpInfo[ii]->m_Footprint == wxT( "$noname" ) ) - cmpInfo[ii]->m_Footprint.Empty(); - } - cmpInfo.clear(); // cmpInfo is no more owner of the list. - // Sort components by reference: - sort( m_components.begin(), m_components.end() ); - - // Now copy filters in m_components, if netlist type is KICAD - // ( when the format is the "old" PCBNEW format, filters are already in - // m_component list - if( NETLIST_TYPE_KICAD == netList_Reader.GetNetlistType() ) - { - for( unsigned ii = 0; ii < m_components.size(); ii++ ) - { - LIPBART_INFO* libpart = netList_Reader.GetLibpart(m_components[ii].m_Libpart); - if( libpart == NULL ) - continue; - - // now copy filter list - m_components[ii].m_FootprintFilter = libpart->m_FootprintFilter; - } - } + m_netlist.SortByReference(); return 0; } diff --git a/cvpcb/readwrite_dlgs.cpp b/cvpcb/readwrite_dlgs.cpp index 881b0fbef3..4027980809 100644 --- a/cvpcb/readwrite_dlgs.cpp +++ b/cvpcb/readwrite_dlgs.cpp @@ -41,17 +41,17 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName ) { - COMPONENT_INFO* component; + COMPONENT* component; bool hasFootprint = false; int componentIndex; wxString description; - if( m_components.empty() ) + if( m_netlist.IsEmpty() ) return; - // if no component is selected, select the first one + // If no component is selected, select the first one - if(m_ListCmp->GetFirstSelected() < 0) + if( m_ListCmp->GetFirstSelected() < 0 ) { componentIndex = 0; m_ListCmp->SetSelection( componentIndex, true ); @@ -61,28 +61,28 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName ) while( m_ListCmp->GetFirstSelected() != -1) { - // get the component for the current iteration + // Get the component for the current iteration componentIndex = m_ListCmp->GetFirstSelected(); - component = &m_components[componentIndex]; + component = m_netlist.GetComponent( componentIndex ); if( component == NULL ) return; - // check to see if the component has allready a footprint set. + // Check to see if the component has already a footprint set. - hasFootprint = !(component->m_Footprint.IsEmpty()); + hasFootprint = !(component->GetFootprintLibName().IsEmpty()); - component->m_Footprint = aFootprintName; + component->SetFootprintLibName( aFootprintName ); // create the new component description description.Printf( CMP_FORMAT, componentIndex + 1, - GetChars( component->m_Reference ), - GetChars( component->m_Value ), - GetChars( component->m_Footprint ) ); + GetChars( component->GetReference() ), + GetChars( component->GetValue() ), + GetChars( component->GetFootprintLibName() ) ); - // if the component hasn't had a footprint associated with it + // If the component hasn't had a footprint associated with it // it now has, so we decrement the count of components without // a footprint assigned. @@ -92,12 +92,12 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName ) m_undefinedComponentCnt -= 1; } - // set the new description and deselect the processed component + // Set the new description and deselect the processed component m_ListCmp->SetString( componentIndex, description ); m_ListCmp->SetSelection( componentIndex, false ); } - // mark this "session" as modified + // Mark this "session" as modified m_modified = true; // select the next component, if there is one @@ -113,22 +113,10 @@ void CVPCB_MAINFRAME::SetNewPkg( const wxString& aFootprintName ) bool CVPCB_MAINFRAME::ReadNetListAndLinkFiles() { + COMPONENT* component; wxString msg; - int error_level; - error_level = ReadSchematicNetlist(); - - if( error_level < 0 ) - { - msg.Printf( _( "File <%s> does not appear to be a valid KiCad net list file." ), - GetChars( m_NetlistFileName.GetFullPath() ) ); - wxMessageBox( msg, _( "File Error" ), wxOK | wxICON_ERROR, this ); - m_NetlistFileName.Clear(); - UpdateTitle(); - return false; - } - - LoadComponentLinkFile( m_NetlistFileName.GetFullPath() ); + ReadSchematicNetlist(); if( m_ListCmp == NULL ) return false; @@ -140,19 +128,21 @@ bool CVPCB_MAINFRAME::ReadNetListAndLinkFiles() m_ListCmp->Clear(); m_undefinedComponentCnt = 0; - BOOST_FOREACH( COMPONENT_INFO& component, m_components ) + for( unsigned i = 0; i < m_netlist.GetCount(); i++ ) { + component = m_netlist.GetComponent( i ); + msg.Printf( CMP_FORMAT, m_ListCmp->GetCount() + 1, - GetChars( component.m_Reference ), - GetChars( component.m_Value ), - GetChars( component.m_Footprint ) ); + GetChars( component->GetReference() ), + GetChars( component->GetValue() ), + GetChars( component->GetFootprintLibName() ) ); m_ListCmp->AppendLine( msg ); - if( component.m_Footprint.IsEmpty() ) + if( component->GetFootprintLibName().IsEmpty() ) m_undefinedComponentCnt += 1; } - if( !m_components.empty() ) + if( !m_netlist.IsEmpty() ) m_ListCmp->SetSelection( 0, true ); DisplayStatus(); @@ -165,37 +155,6 @@ bool CVPCB_MAINFRAME::ReadNetListAndLinkFiles() } -bool CVPCB_MAINFRAME::LoadComponentLinkFile( const wxString& aFileName ) -{ - FILE* linkfile; - wxFileName fn = aFileName; - - fn.SetExt( ComponentFileExtension ); - - linkfile = wxFopen( fn.GetFullPath(), wxT( "rt" ) ); - if( linkfile == NULL ) - { - wxString msg; - msg.Printf( _( "Cannot open CvPcb component file <%s>." ), - GetChars( fn.GetFullPath() ) ); - msg << wxT( "\n" ) << _( "This is normal if you are opening a new netlist file" ); - wxMessageBox( msg, titleComponentLibErr, wxOK | wxICON_ERROR ); - return false; - } - - // read and close the file - if( ! ReadComponentLinkFile( linkfile ) ) - { - wxString msg; - msg.Printf( _( " <%s> does not appear to be a valid KiCad component link file." ), - GetChars( fn.GetFullPath() ) ); - wxMessageBox( msg, titleComponentLibErr, wxOK | wxICON_ERROR ); - return false; - } - - return true; -} - int CVPCB_MAINFRAME::SaveCmpLinkFile( const wxString& aFullFileName ) { wxFileName fn; @@ -207,7 +166,7 @@ int CVPCB_MAINFRAME::SaveCmpLinkFile( const wxString& aFullFileName ) } else { - wxFileDialog dlg( this, _( "Save Component/Footprint Link File" ), wxGetCwd(), + wxFileDialog dlg( this, _( "Save Component Footprint Link File" ), wxGetCwd(), wxEmptyString, ComponentFileWildcard, wxFD_SAVE ); if( dlg.ShowModal() == wxID_CANCEL ) @@ -224,7 +183,7 @@ int CVPCB_MAINFRAME::SaveCmpLinkFile( const wxString& aFullFileName ) if( WriteComponentLinkFile( fn.GetFullPath() ) == 0 ) { - DisplayError( this, _( "Unable to create component file (.cmp)" ) ); + DisplayError( this, _( "Unable to create component footprint link file (.cmp)" ) ); return 0; } diff --git a/eeschema/class_library.cpp b/eeschema/class_library.cpp index d5ef45001a..53e69728d7 100644 --- a/eeschema/class_library.cpp +++ b/eeschema/class_library.cpp @@ -148,7 +148,7 @@ void CMP_LIBRARY::GetEntryNames( wxArrayString& aNames, bool aSort, bool aMakeUp * simple function used as comparator to sort a std::vector&. * * @param aItem1 is the first comparison parameter. - * @param aItem1 is the second. + * @param aItem2 is the second. * @return bool - which item should be put first in the sorted list. */ bool sortFunction( wxArrayString aItem1, wxArrayString aItem2 ) diff --git a/include/appl_wxstruct.h b/include/appl_wxstruct.h index e793795dd3..014de9a7e1 100644 --- a/include/appl_wxstruct.h +++ b/include/appl_wxstruct.h @@ -259,7 +259,7 @@ public: * true. * @param aList = array of PARAM_CFG_BASE pointers */ - void SaveCurrentSetupValues( const PARAM_CFG_ARRAY& List ); + void SaveCurrentSetupValues( const PARAM_CFG_ARRAY& aList ); /** * Function ReadCurrentSetupValues @@ -268,7 +268,7 @@ public: * true. * @param aList = array of PARAM_CFG_BASE pointers */ - void ReadCurrentSetupValues( const PARAM_CFG_ARRAY& List ); + void ReadCurrentSetupValues( const PARAM_CFG_ARRAY& aList ); /** * Function ReadProjectConfig diff --git a/include/dialog_helpers.h b/include/dialog_helpers.h index 9f5bb90cd1..45e3ecfb13 100644 --- a/include/dialog_helpers.h +++ b/include/dialog_helpers.h @@ -1,3 +1,27 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2010 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com + * Copyright (C) 1992-2012 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 + */ + /** * @file dialog_helpers.h * @brief Helper dialog and control classes. @@ -38,6 +62,7 @@ public: * Constructor: * @param aParent Pointer to the parent window. * @param aTitle = The title shown on top. + * @param aItemHeaders is an array containing the column header names for the dialog. * @param aItemList = A wxArrayString of the list of elements. * @param aRefText = An item name if an item must be preselected. * @param aCallBackFunction = callback function to display comments diff --git a/include/fpid.h b/include/fpid.h index 221e9c6a1a..657a6a7101 100644 --- a/include/fpid.h +++ b/include/fpid.h @@ -133,8 +133,31 @@ public: const std::string& aRevision ) throw( PARSE_ERROR ); + /** + * Function clear + * clears the contents of the library nickname, footprint name, and revision strings. + */ void clear(); + /** + * Function empty + * @return a boolean true value if the FPID is empty. Otherwise return false. + */ + bool empty() const { return nickname.empty() && footprint.empty() && revision.empty(); } + + /** + * Function Compare + * compares the contents of FPID objects by performing a std::string comparison of the + * library nickname, footprint name, and revision strings respectively. + * + * @param aFPID is the FPID to compare against. + * @return -1 if less than \a aFPID, 1 if greater than \a aFPID, and 0 if equal to \a aFPID. + */ + int compare( const FPID& aFPID ) const; + + bool operator <( const FPID& aFPID ) const { return this->compare( aFPID ) < 0; } + bool operator ==( const FPID& aFPID ) const { return this->compare( aFPID ) == 0; } + #if defined(DEBUG) static void Test(); #endif diff --git a/include/reporter.h b/include/reporter.h new file mode 100644 index 0000000000..9f2081a8a6 --- /dev/null +++ b/include/reporter.h @@ -0,0 +1,89 @@ +#ifndef _REPORTER_H_ +#define _REPORTER_H_ + +/** + * @file reporter.h + * @author Wayne Stambaugh + * @note A special thanks to Dick Hollenbeck who came up with the idea that inspired + * me to write this. + */ + +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 Wayne Stambaugh + * Copyright (C) 1992-2013 KiCad Developers, see change_log.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 + */ + + +class wxString; +class wxTextCtrl; + + +/** + * Class REPORTER + * is a pure virtual class used to derive REPORTOR objects from. + * + * The purpose of the REPORTER object is to hide an object that take a string as an input + * from other objects. This prevents objects such as wxWidgets UI control internals from + * being exposed to low level KiCad objects dervice from #BOARD_ITEM and #SCH_ITEM. + */ +class REPORTER +{ +public: + /** + * Function Report + * is a pure virtual function to override in the derived object. + * + * @param aText is the string to report. + */ + virtual REPORTER& Report( const wxString& aText ) = 0; + + REPORTER& Report( const char *aText ); + + REPORTER& operator <<( const wxString& aText ) { return Report( aText ); } + + REPORTER& operator <<( const wxChar* aText ) { return Report( wxString( aText ) ); } + + REPORTER& operator <<( wxChar aChar ) { return Report( wxString( aChar ) ); } + + REPORTER& operator <<( const char* aText ) { return Report( aText ); } +}; + + +/** + * Class WX_TEXT_CTRL_REPORTER + * is wrapper for reporting to a wxTextCtrl object. + */ +class WX_TEXT_CTRL_REPORTER : public REPORTER +{ + wxTextCtrl* m_textCtrl; + +public: + WX_TEXT_CTRL_REPORTER( wxTextCtrl* aTextCtrl ) : + REPORTER(), + m_textCtrl( aTextCtrl ) + { + } + + REPORTER& Report( const wxString& aText ); +}; + +#endif // _REPORTER_H_ diff --git a/include/wildcards_and_files_ext.h b/include/wildcards_and_files_ext.h index 9f1368eabb..39dc4f5165 100644 --- a/include/wildcards_and_files_ext.h +++ b/include/wildcards_and_files_ext.h @@ -98,6 +98,7 @@ extern const wxString KiCadFootprintLibFileWildcard; extern const wxString KiCadFootprintLibPathWildcard; extern const wxString GedaPcbFootprintLibFileWildcard; extern const wxString EagleFootprintLibPathWildcard; +extern const wxString TextWildcard; #endif // INCLUDE_WILDCARDS_AND_FILES_EXT_H_ diff --git a/include/wxBasePcbFrame.h b/include/wxBasePcbFrame.h index cdc7b19cf7..964b4163d4 100644 --- a/include/wxBasePcbFrame.h +++ b/include/wxBasePcbFrame.h @@ -91,6 +91,19 @@ protected: void updateZoomSelectBox(); virtual void unitsChangeRefresh(); + /** + * Function loadFootprint + * attempts to load \a aFootprintName from the list of libraries. + * + * @param aFootprintName is the name of component footprint to load. + * @return the #MODULE if found or NULL if \a aFootprintName not found in any of the + * libraries. + * @throw IO_ERROR if an I/O error occurs or a #PARSE_ERROR if a file parsing error + * occurs while reading footprint library files. + */ + MODULE* loadFootprint( const wxString& aFootprintName ) + throw( IO_ERROR, PARSE_ERROR ); + public: PCB_BASE_FRAME( wxWindow* aParent, ID_DRAWFRAME_TYPE aFrameType, const wxString& aTitle, diff --git a/include/wxPcbStruct.h b/include/wxPcbStruct.h index 5ba16dc3e6..8a87869d7b 100644 --- a/include/wxPcbStruct.h +++ b/include/wxPcbStruct.h @@ -59,6 +59,10 @@ class PCB_LAYER_WIDGET; class MARKER_PCB; class BOARD_ITEM; class PCB_LAYER_BOX_SELECTOR; +class NETLIST; +class REPORTER; +class PARSE_ERROR; +class IO_ERROR; /** @@ -80,6 +84,18 @@ class PCB_EDIT_FRAME : public PCB_BASE_FRAME /// The auxiliary right vertical tool bar used to access the microwave tools. wxAuiToolBar* m_microWaveToolBar; + /** + * Function loadFootprints + * loads the footprints for each #COMPONENT in \a aNetlist from the list of libraries. + * + * @param aNetlist is the netlist of components to load the footprints into. + * @param aReporter is the #REPORTER object to report to. + * @throw IO_ERROR if an I/O error occurs or a #PARSE_ERROR if a file parsing error + * occurs while reading footprint library files. + */ + void loadFootprints( NETLIST& aNetlist, REPORTER* aReporter ) + throw( IO_ERROR, PARSE_ERROR ); + protected: #ifdef KICAD_SCRIPTING_WXPYTHON @@ -414,27 +430,6 @@ public: m_useCmpFileForFpNames = aUseCmpfile; } - /** - * Function Test_Duplicate_Missing_And_Extra_Footprints - * Build a list of duplicate, missing and extra footprints - * from the current board and a netlist netlist : - * Shows 3 lists: - * 1 - duplicate footprints on board - * 2 - missing footprints (found in netlist but not on board) - * 3 - footprints not in netlist but on board - * @param aFilename = the full filename netlist - * @param aDuplicate = the list of duplicate modules to populate - * @param aMissing = the list of missing module references and values - * to populate. For each missing item, the first string is the ref, - * the second is the value. - * @param aNotInNetlist = the list of not-in-netlist modules to populate - * @return true if the netlist was read, or false - */ - bool Test_Duplicate_Missing_And_Extra_Footprints( const wxString& aFilename, - std::vector & aDuplicate, - wxArrayString& aMissing, - std::vector & aNotInNetlist ); - /** * Function OnHotKey. * ** Commands are case insensitive ** @@ -960,6 +955,11 @@ public: */ void Access_to_External_Tool( wxCommandEvent& event ); + /** + * Function ListAndSelectModuleName + * builds and shows a list of existing modules on board that the user can select. + * @return a pointer to the selected module or NULL. + */ MODULE* ListAndSelectModuleName(); /** @@ -1421,29 +1421,31 @@ public: /** * Function ReadPcbNetlist - * Update footprints (load missing footprints and delete on demand extra - * footprints) + * reads \a aNetlistFileName and ppdates the footprints (load missing footprints and + * delete on demand extra footprints) on the board. * Update connectivity info, references, values and "TIME STAMP" - * @param aNetlistFullFilename = netlist file name (*.net) - * @param aCmpFullFileName = cmp/footprint link file name (*.cmp). - * if not found or empty, only the netlist will be used - * @param aMessageWindow = a reference to a wxTextCtrl where to display messages. - * can be NULL + * + * @param aNetlistFileName = netlist file name (*.net) + * @param aCmpFileName = cmp/footprint link file name (*.cmp). + * if not found or empty, only the netlist will be used + * @param aReporter is a pointer to a #REPORTER object to write display messages. + * can be NULL. * @param aChangeFootprint if true, footprints that have changed in netlist will be changed * @param aDeleteBadTracks if true, erroneous tracks will be deleted * @param aDeleteExtraFootprints if true, remove unlocked footprints that are not in netlist - * @param aSelect_By_Timestamp if true, use timestamp instead of reference to identify - * footprints from components (use after reannotation of the - * schematic) - * @return true if Ok + * @param aSelectByTimestamp if true, use timestamp instead of reference to identify + * footprints from components (use after reannotation of the + * schematic) + * @param aIsDryRun performs a dry run without making any changes if true. */ - bool ReadPcbNetlist( const wxString& aNetlistFullFilename, - const wxString& aCmpFullFileName, - wxTextCtrl* aMessageWindow, + void ReadPcbNetlist( const wxString& aNetlistFileName, + const wxString& aCmpFileName, + REPORTER* aReporter, bool aChangeFootprint, bool aDeleteBadTracks, bool aDeleteExtraFootprints, - bool aSelect_By_Timestamp ); + bool aSelectByTimestamp, + bool aIsDryRun ); /** * Function RemoveMisConnectedTracks @@ -1480,8 +1482,7 @@ public: * @param include_fixe = true to orient locked footprints * @return true if some footprints modified, false if no change */ - bool ReOrientModules( const wxString& ModuleMask, int Orient, - bool include_fixe ); + bool ReOrientModules( const wxString& ModuleMask, int Orient, bool include_fixe ); void LockModule( MODULE* aModule, bool aLocked ); void AutoMoveModulesOnPcb( bool PlaceModulesHorsPcb ); diff --git a/pcbnew/CMakeLists.txt b/pcbnew/CMakeLists.txt index ba68add0c8..1c6bf153e4 100644 --- a/pcbnew/CMakeLists.txt +++ b/pcbnew/CMakeLists.txt @@ -181,9 +181,6 @@ set(PCBNEW_CLASS_SRCS muonde.cpp muwave_command.cpp netlist.cpp - netlist_reader_common.cpp - netlist_reader_firstformat.cpp - netlist_reader_kicad.cpp onleftclick.cpp onrightclick.cpp pad_edition_functions.cpp diff --git a/pcbnew/class_board.cpp b/pcbnew/class_board.cpp index eb7c6d540b..6d9fbd1d25 100644 --- a/pcbnew/class_board.cpp +++ b/pcbnew/class_board.cpp @@ -39,6 +39,8 @@ #include #include #include +#include +#include #include #include @@ -1411,6 +1413,26 @@ MODULE* BOARD::FindModuleByReference( const wxString& aReference ) const } +MODULE* BOARD::FindModule( const wxString& aRefOrTimeStamp, bool aSearchByTimeStamp ) +{ + for( MODULE* module = m_Modules; module != NULL; module = module->Next() ) + { + if( aSearchByTimeStamp ) + { + if( aRefOrTimeStamp.CmpNoCase( module->GetPath() ) == 0 ) + return module; + } + else + { + if( aRefOrTimeStamp.CmpNoCase( module->GetReference() ) == 0 ) + return module; + } + } + + return NULL; +} + + // Sort nets by decreasing pad count static bool s_SortByNodes( const NETINFO_ITEM* a, const NETINFO_ITEM* b ) { @@ -2310,6 +2332,251 @@ bool BOARD::NormalizeAreaPolygon( PICKED_ITEMS_LIST * aNewZonesList, ZONE_CONTAI } +void BOARD::ReplaceNetlist( NETLIST& aNetlist, REPORTER* aReporter ) +{ + unsigned i; + wxPoint bestPosition; + wxString msg; + D_PAD* pad; + MODULE* footprint; + COMPONENT* component; + COMPONENT_NET net; + + if( !IsEmpty() ) + { + // Position new components below any existing board features. + EDA_RECT bbbox = ComputeBoundingBox( true ); + + if( bbbox.GetWidth() || bbbox.GetHeight() ) + { + bestPosition.x = bbbox.Centre().x; + bestPosition.y = bbbox.GetBottom() + DMils2iu( 5000 ); + } + } + else + { + // Position new components in the center of the page when the board is empty. + wxSize pageSize = m_paper.GetSizeIU(); + + bestPosition.x = pageSize.GetWidth() / 2; + bestPosition.y = pageSize.GetHeight() / 2; + } + + m_Status_Pcb = 0; + + for( i = 0; i < aNetlist.GetCount(); i++ ) + { + component = aNetlist.GetComponent( i ); + + if( aReporter ) + { + msg.Printf( _( "Checking netlist component footprint \"%s:%s:%s\".\n" ), + GetChars( component->GetReference() ), + GetChars( component->GetTimeStamp() ), + GetChars( component->GetFootprintLibName() ) ); + aReporter->Report( msg ); + } + + if( aNetlist.IsFindByTimeStamp() ) + footprint = FindModule( aNetlist.GetComponent( i )->GetTimeStamp(), true ); + else + footprint = FindModule( aNetlist.GetComponent( i )->GetReference() ); + + if( footprint == NULL ) // A new footprint. + { + if( aReporter ) + { + msg.Printf( _( "Adding new component \"%s:%s\" footprint \"%s\".\n" ), + GetChars( component->GetReference() ), + GetChars( component->GetTimeStamp() ), + GetChars( component->GetFootprintLibName() ) ); + aReporter->Report( msg ); + } + + // Owned by NETLIST, can only copy and read it. + footprint = component->GetModule(); + + wxCHECK2_MSG( footprint != NULL, continue, + wxString::Format( wxT( "No footprint loaded for component \"%s\"." ), + GetChars( component->GetReference() ) ) ); + + if( !aNetlist.IsDryRun() ) + { + footprint = new MODULE( *footprint ); + footprint->SetParent( this ); + footprint->SetPosition( bestPosition ); + footprint->SetTimeStamp( GetNewTimeStamp() ); + Add( footprint, ADD_APPEND ); + } + } + else // An existing footprint. + { + // Test for footprint change. + if( !component->GetFootprintLibName().IsEmpty() && + footprint->GetLibRef() != component->GetFootprintLibName() ) + { + if( aNetlist.GetReplaceFootprints() ) + { + if( aReporter ) + { + msg.Printf( _( "Replacing component \"%s:%s\" footprint \"%s\" with \"%s\".\n" ), + GetChars( footprint->GetReference() ), + GetChars( footprint->GetPath() ), + GetChars( footprint->GetLibRef() ), + GetChars( component->GetFootprintLibName() ) ); + aReporter->Report( msg ); + } + + if( !aNetlist.IsDryRun() ) + { + wxASSERT( footprint != NULL ); + MODULE* newFootprint = new MODULE( *component->GetModule() ); + + if( aNetlist.IsFindByTimeStamp() ) + newFootprint->SetReference( footprint->GetReference() ); + else + newFootprint->SetPath( footprint->GetPath() ); + + footprint->CopyNetlistSettings( newFootprint ); + Remove( footprint ); + Add( newFootprint, ADD_APPEND ); + footprint = newFootprint; + } + } + } + + // Test for reference designator field change. + if( footprint->GetReference() != component->GetReference() ) + { + if( aReporter ) + { + msg.Printf( _( "Changing footprint \"%s:%s\" reference to \"%s\".\n" ), + GetChars( footprint->GetReference() ), + GetChars( footprint->GetPath() ), + GetChars( component->GetReference() ) ); + aReporter->Report( msg ); + } + + if( !aNetlist.IsDryRun() ) + footprint->SetReference( component->GetReference() ); + } + + // Test for value field change. + if( footprint->GetValue() != component->GetValue() ) + { + if( aReporter ) + { + msg.Printf( _( "Changing footprint \"%s:%s\" value from \"%s\" to \"%s\".\n" ), + GetChars( footprint->GetReference() ), + GetChars( footprint->GetPath() ), + GetChars( footprint->GetValue() ), + GetChars( component->GetValue() ) ); + aReporter->Report( msg ); + } + + if( !aNetlist.IsDryRun() ) + footprint->SetValue( component->GetValue() ); + } + + // Test for time stamp change. + if( footprint->GetPath() != component->GetTimeStamp() ) + { + if( aReporter ) + { + msg.Printf( _( "Changing footprint path \"%s:%s\" to \"%s\".\n" ), + GetChars( footprint->GetReference() ), + GetChars( footprint->GetPath() ), + GetChars( component->GetTimeStamp() ) ); + aReporter->Report( msg ); + } + + if( !aNetlist.IsDryRun() ) + footprint->SetPath( component->GetTimeStamp() ); + } + } + + wxASSERT( component != NULL ); + + // At this point, the component footprint is updated. Now update the nets. + for( pad = footprint->Pads(); pad; pad = pad->Next() ) + { + net = component->GetNet( pad->GetPadName() ); + + if( !net.IsValid() ) // Footprint pad had no net. + { + if( !pad->GetNetname().IsEmpty() ) + { + if( aReporter ) + { + msg.Printf( _( "Clearing component \"%s:%s\" pin \"%s\" net name.\n" ), + GetChars( footprint->GetReference() ), + GetChars( footprint->GetPath() ), + GetChars( pad->GetPadName() ) ); + aReporter->Report( msg ); + } + + if( !aNetlist.IsDryRun() ) + pad->SetNetname( wxEmptyString ); + } + } + else // Footprint pad has a net. + { + if( net.GetNetName() != pad->GetNetname() ) + { + if( aReporter ) + { + msg.Printf( _( "Changing component \"%s:%s\" pin \"%s\" net name from " + "\"%s\" to \"%s\".\n" ), + GetChars( footprint->GetReference() ), + GetChars( footprint->GetPath() ), + GetChars( pad->GetPadName() ), + GetChars( pad->GetNetname() ), + GetChars( net.GetNetName() ) ); + aReporter->Report( msg ); + } + + if( !aNetlist.IsDryRun() ) + pad->SetNetname( net.GetNetName() ); + } + } + } + } + + // Remove all components not in the netlist. + if( aNetlist.GetDeleteExtraFootprints() ) + { + MODULE* nextModule; + + for( MODULE* module = m_Modules; module != NULL; module = nextModule ) + { + nextModule = module->Next(); + + if( module->IsLocked() ) + continue; + + if( aNetlist.IsFindByTimeStamp() ) + component = aNetlist.GetComponentByTimeStamp( module->GetPath() ); + else + component = aNetlist.GetComponentByReference( module->GetReference() ); + + if( component == NULL ) + { + if( aReporter ) + { + msg.Printf( _( "Removing footprint \"%s:%s\".\n" ), + GetChars( module->GetReference() ), + GetChars( module->GetPath() ) ); + aReporter->Report( msg ); + } + + if( !aNetlist.IsDryRun() ) + module->DeleteStructure(); + } + } + } +} + + #if defined(DEBUG) void BOARD::Show( int nestLevel, std::ostream& os ) const diff --git a/pcbnew/class_board.h b/pcbnew/class_board.h index bd0b33ea4e..6e28cb9028 100644 --- a/pcbnew/class_board.h +++ b/pcbnew/class_board.h @@ -1,3 +1,27 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2007 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com + * Copyright (C) 1992-2012 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 + */ + /** * @file class_board.h * @brief Class BOARD to handle a board. @@ -30,6 +54,8 @@ class TRACK; class D_PAD; class MARKER_PCB; class MSG_PANEL_ITEM; +class NETLIST; +class REPORTER; // non-owning container of item candidates when searching for items on the same track. @@ -282,6 +308,12 @@ public: BOARD(); ~BOARD(); + bool IsEmpty() const + { + return m_Drawings.GetCount() == 0 && m_Modules.GetCount() == 0 && + m_Track.GetCount() == 0 && m_Zone.GetCount() == 0; + } + void Move( const wxPoint& aMoveVector ); // overload void SetFileFormatVersionAtLoad( int aVersion ) { m_fileFormatVersionAtLoad = aVersion; } @@ -849,6 +881,47 @@ public: */ MODULE* FindModuleByReference( const wxString& aReference ) const; + /** + * Function FindModule + * searches for a module matching \a aRefOrTimeStamp depending on the state of + * \a aSearchByTimeStamp. + * @param aRefOrTimeStamp is the search string. + * @param aSearchByTimeStamp searches by the module time stamp value if true. Otherwise + * search by reference designator. + * @return the module found or NULL if not module is found that meets the search criteria. + */ + MODULE* FindModule( const wxString& aRefOrTimeStamp, bool aSearchByTimeStamp = false ); + + /** + * Function ReplaceNetlist + * updates the #BOARD according to \a aNetlist. + * + * The changes are made to the board are as follows they are not disabled in the status + * settings in the #NETLIST: + * - If a new component is found in the #NETLIST and not in the #BOARD, it is added + * to the #BOARD. + * - If a the component in the #NETLIST is already on the #BOARD, then one or more of the + * following actions can occur: + * + If the footprint name in the #NETLIST does not match the footprint name on the + * #BOARD, the footprint on the #BOARD is replaced with the footprint specified in + * the #NETLIST and the proper parameters are copied from the existing footprint. + * + If the reference designator in the #NETLIST does not match the reference designator + * on the #BOARD, the reference designator is updated from the #NETLIST. + * + If the value field in the #NETLIST does not match the value field on the #BOARD, + * the value field is updated from the #NETLIST. + * + If the time stamp in the #NETLIST does not match the time stamp on the #BOARD, + * the time stamp is updated from the #NETLIST. + * - After each footprint is added or update as described above, each footprint pad net + * name is compared and updated to the value defined in the #NETLIST. + * - After all of the footprints have been added, updated, and net names properly set, + * any extra unlock footprints are removed from the #BOARD. + * + * @param aNetlist is the new netlist to revise the contents of the #BOARD with. + * @param aReporter is a #REPORTER object to report the changes \a aNetlist makes to + * the #BOARD. If NULL, no change reporting occurs. + */ + void ReplaceNetlist( NETLIST& aNetlist, REPORTER* aReporter = NULL ); + /** * Function ReturnSortedNetnamesList * @param aNames An array string to fill with net names. @@ -1229,12 +1302,12 @@ public: /** * Function GetPadFast - * return pad found at \a aPosition on \a aLayer using the fast search method. + * return pad found at \a aPosition on \a aLayerMask using the fast search method. *

* The fast search method only works if the pad list has already been built. *

* @param aPosition A wxPoint object containing the position to hit test. - * @param aLayer A layer or layers to mask the hit test. + * @param aLayerMask A layer or layers to mask the hit test. * @return A pointer to a D_PAD object if found or NULL if not found. */ D_PAD* GetPadFast( const wxPoint& aPosition, LAYER_MSK aLayerMask ); diff --git a/pcbnew/class_module.cpp b/pcbnew/class_module.cpp index b000a609ca..3324585d52 100644 --- a/pcbnew/class_module.cpp +++ b/pcbnew/class_module.cpp @@ -290,15 +290,45 @@ void MODULE::Copy( MODULE* aModule ) } -/** - * Function Draw - * Draws the footprint to the current Device Context - * @param aPanel = draw panel, Used to know the clip box - * @param aDC = Current Device Context - * @param aDrawMode = GR_OR, GR_XOR.. - * @param aOffset = draw offset (usually wxPoint(0,0) - */ -void MODULE::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode, const wxPoint& aOffset ) +void MODULE::CopyNetlistSettings( MODULE* aModule ) +{ + // Don't do anything foolish like trying to copy to yourself. + wxCHECK_RET( aModule != NULL && aModule != this, wxT( "Cannot copy to NULL or yourself." ) ); + + // Not sure what to do with the value field. Use netlist for now. + aModule->SetPosition( GetPosition() ); + + if( aModule->GetLayer() != GetLayer() ) + aModule->Flip( aModule->GetPosition() ); + + if( aModule->GetOrientation() != GetOrientation() ) + aModule->Rotate( aModule->GetPosition(), GetOrientation() ); + + aModule->SetLocalSolderMaskMargin( GetLocalSolderMaskMargin() ); + aModule->SetLocalClearance( GetLocalClearance() ); + aModule->SetLocalSolderPasteMargin( GetLocalSolderPasteMargin() ); + aModule->SetLocalSolderPasteMarginRatio( GetLocalSolderPasteMarginRatio() ); + aModule->SetZoneConnection( GetZoneConnection() ); + aModule->SetThermalWidth( GetThermalWidth() ); + aModule->SetThermalGap( GetThermalGap() ); + + for( D_PAD* pad = Pads(); pad; pad = pad->Next() ) + { + D_PAD* newPad = aModule->FindPadByName( pad->GetPadName() ); + + if( newPad ) + pad->CopyNetlistSettings( newPad ); + } + + // Not sure about copying description, keywords, 3D models or any other + // local user changes to footprint. Stick with the new footprint settings + // called out in the footprint loaded in the netlist. + aModule->CalculateBoundingBox(); +} + + +void MODULE::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode, + const wxPoint& aOffset ) { if( (m_Flags & DO_NOT_DRAW) || (IsMoving()) ) return; @@ -354,14 +384,6 @@ void MODULE::Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode, con } -/** - * Function DrawEdgesOnly - * Draws the footprint edges only to the current Device Context - * @param panel = The active Draw Panel (used to know the clip box) - * @param DC = current Device Context - * @param offset = draw offset (usually wxPoint(0,0) - * @param draw_mode = GR_OR, GR_XOR, GR_AND - */ void MODULE::DrawEdgesOnly( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& offset, GR_DRAWMODE draw_mode ) { @@ -687,6 +709,7 @@ EDA_ITEM* MODULE::Clone() const return new MODULE( *this ); } + /* Test for validity of the name in a library of the footprint * ( no spaces, dir separators ... ) * return true if the given name is valid @@ -874,6 +897,7 @@ void MODULE::SetPosition( const wxPoint& newpos ) CalculateBoundingBox(); } + void MODULE::MoveAnchorPosition( const wxPoint& aMoveVector ) { /* Move the reference point of the footprint @@ -932,6 +956,7 @@ void MODULE::MoveAnchorPosition( const wxPoint& aMoveVector ) CalculateBoundingBox(); } + void MODULE::SetOrientation( double newangle ) { double angleChange = newangle - m_Orient; // change in rotation diff --git a/pcbnew/class_module.h b/pcbnew/class_module.h index 507d38e0b1..a8239fcb05 100644 --- a/pcbnew/class_module.h +++ b/pcbnew/class_module.h @@ -229,6 +229,14 @@ public: /* drawing functions */ + /** + * Function Draw + * draws the footprint to the \a aDC. + * @param aPanel = draw panel, Used to know the clip box + * @param aDC = Current Device Context + * @param aDrawMode = GR_OR, GR_XOR.. + * @param aOffset = draw offset (usually wxPoint(0,0) + */ void Draw( EDA_DRAW_PANEL* aPanel, wxDC* aDC, GR_DRAWMODE aDrawMode, @@ -236,6 +244,14 @@ public: void Draw3D( EDA_3D_CANVAS* glcanvas ); + /** + * Function DrawEdgesOnly + * Draws the footprint edges only to the current Device Context + * @param panel = The active Draw Panel (used to know the clip box) + * @param DC = current Device Context + * @param offset = draw offset (usually wxPoint(0,0) + * @param draw_mode = GR_OR, GR_XOR, GR_AND + */ void DrawEdgesOnly( EDA_DRAW_PANEL* panel, wxDC* DC, const wxPoint& offset, GR_DRAWMODE draw_mode ); @@ -306,7 +322,7 @@ public: /** * Function GetPad - * get a pad at \a aPosition on \a aLayer in the footprint. + * get a pad at \a aPosition on \a aLayerMask in the footprint. * * @param aPosition A wxPoint object containing the position to hit test. * @param aLayerMask A layer or layers to mask the hit test. @@ -361,6 +377,19 @@ public: EDA_ITEM* Clone() const; + /** + * Function CopyNetlistSettings + * copies the netlist settings to \a aModule. + * + * The netlist settings are all of the #MODULE settings not define by a #MODULE in + * a netlist. These setting include position, orientation, local clearances, ets. + * The reference designator, value, path, and physical geometry settings are not + * copied. + * + * @param aModule is the #MODULE to copy the settings to. + */ + void CopyNetlistSettings( MODULE* aModule ); + /** * static function IsLibNameValid * Test for validity of a name of a footprint to be used in a footprint library diff --git a/pcbnew/class_netinfo.h b/pcbnew/class_netinfo.h index 1080ddcbe1..926d5c1c56 100644 --- a/pcbnew/class_netinfo.h +++ b/pcbnew/class_netinfo.h @@ -1,3 +1,27 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2009 Jean-Pierre Charras, jaen-pierre.charras@gipsa-lab.inpg.com + * Copyright (C) 1992-2012 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 + */ + /** * @file class_netinfo.h */ @@ -384,6 +408,13 @@ public: */ void SetNetname( const wxString& aNetname ); + /** + * Function GetMsgPanelInfo + * returns the information about the #NETINFO_ITEM in \a aList to display in the + * message panel. + * + * @param aList is the list in which to place the status information. + */ void GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ); }; diff --git a/pcbnew/class_netinfo_item.cpp b/pcbnew/class_netinfo_item.cpp index cb3622ef62..f96132dfc1 100644 --- a/pcbnew/class_netinfo_item.cpp +++ b/pcbnew/class_netinfo_item.cpp @@ -99,13 +99,6 @@ void NETINFO_ITEM::Draw( EDA_DRAW_PANEL* panel, } -/** - * Function DisplayInfo - * has knowledge about the frame and how and where to put status information - * about this object into the frame's message panel. - * Is virtual from EDA_ITEM. - * @param frame A EDA_DRAW_FRAME in which to print status information. - */ void NETINFO_ITEM::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM >& aList ) { int count; diff --git a/pcbnew/class_pad.cpp b/pcbnew/class_pad.cpp index ed5e4cf1b3..700ceb841b 100644 --- a/pcbnew/class_pad.cpp +++ b/pcbnew/class_pad.cpp @@ -301,10 +301,6 @@ void D_PAD::SetPadName( const wxString& name ) } -/** - * Function SetNetname - * @param aNetname: the new netname - */ void D_PAD::SetNetname( const wxString& aNetname ) { m_Netname = aNetname; @@ -348,14 +344,23 @@ void D_PAD::Copy( D_PAD* source ) } -/** - * Function GetClearance (virtual) - * returns the clearance in internal units. If \a aItem is not NULL then the - * returned clearance is the greater of this object's clearance and - * aItem's clearance. If \a aItem is NULL, then this object clearance is returned. - * @param aItem is another BOARD_CONNECTED_ITEM or NULL - * @return int - the clearance in internal units. - */ +void D_PAD::CopyNetlistSettings( D_PAD* aPad ) +{ + // Don't do anything foolish like trying to copy to yourself. + wxCHECK_RET( aPad != NULL && aPad != this, wxT( "Cannot copy to NULL or yourself." ) ); + + aPad->SetNetname( GetNetname() ); + + aPad->SetLocalClearance( m_LocalClearance ); + aPad->SetLocalSolderMaskMargin( m_LocalSolderMaskMargin ); + aPad->SetLocalSolderPasteMargin( m_LocalSolderPasteMargin ); + aPad->SetLocalSolderPasteMarginRatio( m_LocalSolderPasteMarginRatio ); + aPad->SetZoneConnection( m_ZoneConnection ); + aPad->SetThermalWidth( m_ThermalWidth ); + aPad->SetThermalGap( m_ThermalGap ); +} + + int D_PAD::GetClearance( BOARD_CONNECTED_ITEM* aItem ) const { // A pad can have specific clearance parameters that @@ -387,15 +392,6 @@ int D_PAD::GetClearance( BOARD_CONNECTED_ITEM* aItem ) const // Mask margins handling: -/** - * Function GetSolderMaskMargin - * @return the margin for the solder mask layer - * usually > 0 (mask shape bigger than pad - * value is - * 1 - the local value - * 2 - if null, the parent footprint value - * 1 - if null, the global value - */ int D_PAD::GetSolderMaskMargin() { int margin = m_LocalSolderMaskMargin; @@ -429,15 +425,6 @@ int D_PAD::GetSolderMaskMargin() } -/** - * Function GetSolderPasteMargin - * @return the margin for the solder mask layer - * usually < 0 (mask shape smaller than pad - * value is - * 1 - the local value - * 2 - if null, the parent footprint value - * 3 - if null, the global value - */ wxSize D_PAD::GetSolderPasteMargin() { int margin = m_LocalSolderPasteMargin; @@ -538,7 +525,7 @@ void D_PAD::GetMsgPanelInfo( std::vector< MSG_PANEL_ITEM>& aList ) board = GetBoard(); - aList.push_back( MSG_PANEL_ITEM( _( "Layer" ), + aList.push_back( MSG_PANEL_ITEM( _( "Layer" ), LayerMaskDescribe( board, m_layerMask ), DARKGREEN ) ); aList.push_back( MSG_PANEL_ITEM( ShowPadShape(), ShowPadAttr(), DARKGREEN ) ); @@ -754,6 +741,7 @@ wxString D_PAD::GetSelectMenuText() const return text; } + EDA_ITEM* D_PAD::Clone() const { return new D_PAD( *this ); diff --git a/pcbnew/class_pad.h b/pcbnew/class_pad.h index 55387f4378..1c5de49642 100644 --- a/pcbnew/class_pad.h +++ b/pcbnew/class_pad.h @@ -395,6 +395,18 @@ public: EDA_ITEM* Clone() const; + /** + * Function CopyNetlistSettings + * copies the netlist settings to \a aPad. + * + * The netlist settings are all of the #D_PAD settings not define by a #D_PAD in + * a netlist. These setting include local clearances, net names, etc. The pad + * physical geometry settings are not copied. + * + * @param aPad is the #D_PAD to copy the settings to. + */ + void CopyNetlistSettings( D_PAD* aPad ); + #if defined(DEBUG) void Show( int nestLevel, std::ostream& os ) const; // overload #endif diff --git a/pcbnew/dialogs/dialog_edit_module_text.cpp b/pcbnew/dialogs/dialog_edit_module_text.cpp index c4630694f6..317f823b7d 100644 --- a/pcbnew/dialogs/dialog_edit_module_text.cpp +++ b/pcbnew/dialogs/dialog_edit_module_text.cpp @@ -1,6 +1,6 @@ /** - * @file dialog_edit_module_text.cpp. - * @brief dialog editor for texts (fields) in footprints + * @file dialog_edit_module_text.cpp + * @brief dialog editor for texts (fields) in footprints. */ /* diff --git a/pcbnew/dialogs/dialog_netlist.cpp b/pcbnew/dialogs/dialog_netlist.cpp index a9ad301876..55b4966004 100644 --- a/pcbnew/dialogs/dialog_netlist.cpp +++ b/pcbnew/dialogs/dialog_netlist.cpp @@ -33,6 +33,8 @@ #include #include #include +#include +#include #include #include @@ -65,20 +67,20 @@ void PCB_EDIT_FRAME::InstallNetlistFrame( wxDC* DC ) // Save project settings if needed. // Project settings are saved in the corresponding .pro file bool configChanged = lastNetlistName != GetLastNetListRead(); + if( dlg.UseCmpFileForFpNames() != GetUseCmpFileForFpNames() ) { SetUseCmpFileForFpNames( dlg.UseCmpFileForFpNames() ); configChanged = true; } - if( configChanged && - !GetBoard()->GetFileName().IsEmpty() && - IsOK(NULL, _("Project config has changed. Save it ?") ) ) + if( configChanged + && !GetBoard()->GetFileName().IsEmpty() + && IsOK( NULL, _( "The project configuration has changed. Do you want to save it?" ) ) ) { wxFileName fn = GetBoard()->GetFileName(); fn.SetExt( ProjectFileExtension ); - wxGetApp().WriteProjectConfig( fn.GetFullPath(), GROUP, - GetProjectFileParameters() ); + wxGetApp().WriteProjectConfig( fn.GetFullPath(), GROUP, GetProjectFileParameters() ); } } @@ -126,20 +128,50 @@ void DIALOG_NETLIST::OnOpenNetlistClick( wxCommandEvent& event ) void DIALOG_NETLIST::OnReadNetlistFileClick( wxCommandEvent& event ) { - wxString fullNetfileName = m_NetlistFilenameCtrl->GetValue(); - wxString cmpFilename; + wxString msg; + wxString netlistFileName = m_NetlistFilenameCtrl->GetValue(); + wxString cmpFileName; + if( UseCmpFileForFpNames() ) { wxFileName fn = m_NetlistFilenameCtrl->GetValue(); fn.SetExt( ComponentFileExtension ); - cmpFilename = fn.GetFullPath(); + cmpFileName = fn.GetFullPath(); } - m_parent->ReadPcbNetlist( fullNetfileName, cmpFilename, m_MessageWindow, - m_ChangeExistingFootprintCtrl->GetSelection() == 1 ? true : false, - m_DeleteBadTracks->GetSelection() == 1 ? true : false, - m_RemoveExtraFootprintsCtrl->GetSelection() == 1 ? true : false, - m_Select_By_Timestamp->GetSelection() == 1 ? true : false ); + // Give the user a chance to bail out when making changes from a netlist. + if( !m_parent->GetBoard()->IsEmpty() + && !IsOK( NULL, _( "The changes made by reading the netlist cannot be undone. Are you " + "sure you want to read the netlist?" ) ) ) + return; + + wxBusyCursor busy(); + m_MessageWindow->Clear(); + + msg.Printf( _( "Reading netlist file \"%s\".\n" ), GetChars( netlistFileName ) ); + m_MessageWindow->AppendText( msg ); + + if( !cmpFileName.IsEmpty() ) + { + msg.Printf( _( "Using component footprint link file \"%s\".\n" ), GetChars( cmpFileName ) ); + m_MessageWindow->AppendText( msg ); + } + + if( m_Select_By_Timestamp->GetSelection() == 1 ) + { + msg.Printf( _( "Using time stamps to select footprints in file \"%s\".\n" ), + GetChars( cmpFileName ) ); + m_MessageWindow->AppendText( msg ); + } + + WX_TEXT_CTRL_REPORTER reporter( m_MessageWindow ); + + m_parent->ReadPcbNetlist( netlistFileName, cmpFileName, &reporter, + m_ChangeExistingFootprintCtrl->GetSelection() == 1, + m_DeleteBadTracks->GetSelection() == 1, + m_RemoveExtraFootprintsCtrl->GetSelection() == 1, + m_Select_By_Timestamp->GetSelection() == 1, + m_checkDryRun->GetValue() ); } @@ -156,14 +188,18 @@ void DIALOG_NETLIST::OnTestFootprintsClick( wxCommandEvent& event ) wxArrayString missing; std::vector notInNetlist; wxString netlistFilename = m_NetlistFilenameCtrl->GetValue(); + wxString cmpFilename; - if( ! m_parent->Test_Duplicate_Missing_And_Extra_Footprints( - netlistFilename, duplicate, missing, notInNetlist ) ) + if( UseCmpFileForFpNames() ) { - wxMessageBox( _("Netlist file not found!") ); - return; + wxFileName fn = m_NetlistFilenameCtrl->GetValue(); + fn.SetExt( ComponentFileExtension ); + cmpFilename = fn.GetFullPath(); } + if( !verifyFootprints( netlistFilename, cmpFilename, duplicate, missing, notInNetlist ) ) + return; + #define ERR_CNT_MAX 100 // Max number of errors to output in dialog // to avoid a too long message list @@ -221,24 +257,24 @@ void DIALOG_NETLIST::OnTestFootprintsClick( wxCommandEvent& event ) // Search for modules found on board but not in net list. if( notInNetlist.size() == 0 ) - list << wxT("

") << _( "No extra modules." ) << wxT("

"); + list << wxT( "

" ) << _( "No extra modules." ) << wxT( "

" ); else { - list << wxT("

") << _( "Not in Netlist:" ) << wxT("

"); + list << wxT( "

" ) << _( "Not in Netlist:" ) << wxT( "

" ); for( unsigned ii = 0; ii < notInNetlist.size(); ii++ ) { MODULE* module = notInNetlist[ii]; if( module->GetReference().IsEmpty() ) - list << wxT("
") << wxT("[noref)"); + list << wxT( "
" ) << wxT( "[noref)" ); else - list << wxT("
") << module->GetReference() ; + list << wxT( "
" ) << module->GetReference() ; - list << wxT(" (") << module->GetValue() << wxT(")"); - list << wxT(" @ "); + list << wxT( " (" ) << module->GetValue() << wxT( ")" ); + list << wxT( " @ " ); list << CoordinateToString( module->GetPosition().x ), - list << wxT(", ") << CoordinateToString( module->GetPosition().y ), + list << wxT( ", " ) << CoordinateToString( module->GetPosition().y ), err_cnt++; if( ERR_CNT_MAX < err_cnt ) @@ -248,13 +284,13 @@ void DIALOG_NETLIST::OnTestFootprintsClick( wxCommandEvent& event ) if( ERR_CNT_MAX < err_cnt ) { - list << wxT("

") + list << wxT( "

" ) << _( "Too many errors: some are skipped" ) - << wxT("

"); + << wxT( "

" ); } HTML_MESSAGE_BOX dlg( this, _( "Check Modules" ) ); - dlg.AddHTML_Text(list); + dlg.AddHTML_Text( list ); dlg.ShowModal(); } @@ -277,3 +313,148 @@ void DIALOG_NETLIST::OnCancelClick( wxCommandEvent& event ) { EndModal( wxID_CANCEL ); } + + +void DIALOG_NETLIST::OnSaveMessagesToFile( wxCommandEvent& aEvent ) +{ + wxFileName fn; + + if( !m_parent->GetLastNetListRead().IsEmpty() ) + { + fn = m_parent->GetLastNetListRead(); + fn.SetExt( wxT( "txt" ) ); + } + else + { + fn.SetPath( wxFileName::GetCwd() ); + } + + wxFileDialog dlg( this, _( "Save contents of message window" ), fn.GetPath(), fn.GetName(), + TextWildcard, wxFD_SAVE | wxFD_OVERWRITE_PROMPT ); + + if( dlg.ShowModal() != wxID_OK ) + return; + + fn = dlg.GetPath(); + + if( fn.GetExt().IsEmpty() ) + fn.SetExt( wxT( "txt" ) ); + + wxFile f( fn.GetFullPath(), wxFile::write ); + + if( !f.IsOpened() ) + { + wxString msg; + + msg.Printf( _( "Cannot write message contents to file \"%s\"." ), + GetChars( fn.GetFullPath() ) ); + wxMessageBox( msg, _( "File Write Error" ), wxOK | wxICON_ERROR, this ); + return; + } + + f.Write( m_MessageWindow->GetValue() ); +} + + +void DIALOG_NETLIST::OnUpdateUISaveMessagesToFile( wxUpdateUIEvent& aEvent ) +{ + aEvent.Enable( !m_MessageWindow->IsEmpty() ); +} + + +void DIALOG_NETLIST::OnUpdateUIValidNetlistFile( wxUpdateUIEvent& aEvent ) +{ + aEvent.Enable( !m_NetlistFilenameCtrl->GetValue().IsEmpty() ); +} + + +bool DIALOG_NETLIST::verifyFootprints( const wxString& aNetlistFilename, + const wxString & aCmpFilename, + std::vector< MODULE* >& aDuplicates, + wxArrayString& aMissing, + std::vector< MODULE* >& aNotInNetlist ) +{ + wxString msg; + MODULE* module; + MODULE* nextModule; + NETLIST netlist; + wxBusyCursor dummy; // Shows an hourglass while calculating. + NETLIST_READER* netlistReader; + COMPONENT* component; + + try + { + netlistReader = NETLIST_READER::GetNetlistReader( &netlist, aNetlistFilename, + aCmpFilename ); + + if( netlistReader == NULL ) + { + msg.Printf( _( "Cannot open netlist file \"%s\"." ), GetChars( aNetlistFilename ) ); + wxMessageBox( msg, _( "Netlist Load Error." ), wxOK | wxICON_ERROR ); + return false; + } + + std::auto_ptr< NETLIST_READER > nlr( netlistReader ); + netlistReader->LoadNetlist(); + } + catch( IO_ERROR& ioe ) + { + msg.Printf( _( "Error loading netlist file:\n%s" ), ioe.errorText.GetData() ); + wxMessageBox( msg, _( "Netlist Load Error" ), wxOK | wxICON_ERROR ); + return false; + } + + +#if defined( DEBUG ) + m_MessageWindow->Clear(); + WX_TEXT_CTRL_REPORTER rpt( m_MessageWindow ); + netlist.Show( 0, rpt ); +#endif + + BOARD* pcb = m_parent->GetBoard(); + + // Search for duplicate footprints. + module = pcb->m_Modules; + + for( ; module != NULL; module = module->Next() ) + { + nextModule = module->Next(); + + for( ; nextModule != NULL; nextModule = nextModule->Next() ) + { + if( module->GetReference().CmpNoCase( nextModule->GetReference() ) == 0 ) + { + aDuplicates.push_back( module ); + break; + } + } + } + + // Search for component footprints in the netlist but not on the board. + for( unsigned ii = 0; ii < netlist.GetCount(); ii++ ) + { + component = netlist.GetComponent( ii ); + + module = pcb->FindModuleByReference( component->GetReference() ); + + if( module == NULL ) + { + aMissing.Add( component->GetReference() ); + aMissing.Add( component->GetValue() ); + } + } + + // Search for component footprints found on board but not in netlist. + module = pcb->m_Modules; + + for( ; module != NULL; module = module->Next() ) + { + + component = netlist.GetComponentByReference( module->GetReference() ); + + if( component == NULL ) + aNotInNetlist.push_back( module ); + } + + return true; +} diff --git a/pcbnew/dialogs/dialog_netlist.h b/pcbnew/dialogs/dialog_netlist.h index dce8c83ef5..332403c57f 100644 --- a/pcbnew/dialogs/dialog_netlist.h +++ b/pcbnew/dialogs/dialog_netlist.h @@ -31,31 +31,68 @@ #include +class MODULE; +class NETLIST; + + class DIALOG_NETLIST : public DIALOG_NETLIST_FBP { private: - PCB_EDIT_FRAME * m_parent; - wxDC * m_dc; + PCB_EDIT_FRAME* m_parent; + wxDC* m_dc; public: - DIALOG_NETLIST( PCB_EDIT_FRAME* aParent, wxDC * aDC, - const wxString & aNetlistFullFilename ); + DIALOG_NETLIST( PCB_EDIT_FRAME* aParent, wxDC* aDC, const wxString & aNetlistFullFilename ); ~DIALOG_NETLIST() {}; - // return true if the user choice is tu use the .cmp file - // created by CvPcb to know footprin names associated to components - // and false tu use the netlist only + + // return true if the user choice is to use the .cmp file + // created by CvPcb to know footprint names associated to components + // and false to use the netlist only bool UseCmpFileForFpNames() { return m_cmpNameSourceOpt->GetSelection() == 1; } private: + /** + * Function verifyFootprints + * compares the netlist to the board and builds a list of duplicate, missing, and + * extra footprints. + * + * @param aNetlistFilename the netlist filename. + * @param aCmpFilename the component link filename. + * @param aDuplicate the list of duplicate modules to populate + * @param aMissing the list of missing module references and values to populate. For + * each missing item, the first string is the reference designator and + * the second is the value. + * @param aNotInNetlist is the list of component footprint found in the netlist but not on + * the board. + * @return true if no errors occurred while reading the netlist. Otherwise false. + */ + bool verifyFootprints( const wxString& aNetlistFilename, + const wxString& aCmpFilename, + std::vector< MODULE* >& aDuplicate, + wxArrayString& aMissing, + std::vector< MODULE* >& aNotInNetlist ); + + /** + * Function loadFootprints + * loads the footprints for each #COMPONENT in \a aNetlist from the list of libraries. + * + * @param aNetlist is the netlist of components to load the footprints into. + */ + void loadFootprints( NETLIST& aNetlist ); + // Virtual event handlers: void OnOpenNetlistClick( wxCommandEvent& event ); void OnReadNetlistFileClick( wxCommandEvent& event ); void OnTestFootprintsClick( wxCommandEvent& event ); void OnCompileRatsnestClick( wxCommandEvent& event ); void OnCancelClick( wxCommandEvent& event ); + void OnSaveMessagesToFile( wxCommandEvent& aEvent ); + + void OnUpdateUISaveMessagesToFile( wxUpdateUIEvent& aEvent ); + void OnUpdateUIValidNetlistFile( wxUpdateUIEvent& aEvent ); }; diff --git a/pcbnew/dialogs/dialog_netlist_fbp.cpp b/pcbnew/dialogs/dialog_netlist_fbp.cpp index 8b84a06fb8..c6f1d115a5 100644 --- a/pcbnew/dialogs/dialog_netlist_fbp.cpp +++ b/pcbnew/dialogs/dialog_netlist_fbp.cpp @@ -24,7 +24,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w wxString m_Select_By_TimestampChoices[] = { _("Reference"), _("Timestamp") }; int m_Select_By_TimestampNChoices = sizeof( m_Select_By_TimestampChoices ) / sizeof( wxString ); - m_Select_By_Timestamp = new wxRadioBox( this, wxID_ANY, _("Module Selection:"), wxDefaultPosition, wxDefaultSize, m_Select_By_TimestampNChoices, m_Select_By_TimestampChoices, 1, wxRA_SPECIFY_COLS ); + m_Select_By_Timestamp = new wxRadioBox( this, wxID_ANY, _("Module Selection"), wxDefaultPosition, wxDefaultSize, m_Select_By_TimestampNChoices, m_Select_By_TimestampChoices, 1, wxRA_SPECIFY_COLS ); m_Select_By_Timestamp->SetSelection( 0 ); m_Select_By_Timestamp->SetToolTip( _("Select how footprints are recognized:\nby their reference (U1, R3...) (normal setting)\nor their time stamp (special setting after a full schematic reannotation)") ); @@ -32,7 +32,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w wxString m_cmpNameSourceOptChoices[] = { _("From netlist"), _("From separate .cmp file") }; int m_cmpNameSourceOptNChoices = sizeof( m_cmpNameSourceOptChoices ) / sizeof( wxString ); - m_cmpNameSourceOpt = new wxRadioBox( this, wxID_ANY, _("Module Name Source:"), wxDefaultPosition, wxDefaultSize, m_cmpNameSourceOptNChoices, m_cmpNameSourceOptChoices, 1, wxRA_SPECIFY_COLS ); + m_cmpNameSourceOpt = new wxRadioBox( this, wxID_ANY, _("Module Name Source"), wxDefaultPosition, wxDefaultSize, m_cmpNameSourceOptNChoices, m_cmpNameSourceOptChoices, 1, wxRA_SPECIFY_COLS ); m_cmpNameSourceOpt->SetSelection( 0 ); m_cmpNameSourceOpt->SetToolTip( _("Source of footprints names for component:\n- the netlist (if you have filled the footprint field of each component in schematic)\n- the .cmp file created by CvPcb") ); @@ -40,7 +40,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w wxString m_ChangeExistingFootprintCtrlChoices[] = { _("Keep"), _("Change") }; int m_ChangeExistingFootprintCtrlNChoices = sizeof( m_ChangeExistingFootprintCtrlChoices ) / sizeof( wxString ); - m_ChangeExistingFootprintCtrl = new wxRadioBox( this, wxID_ANY, _("Exchange Module:"), wxDefaultPosition, wxDefaultSize, m_ChangeExistingFootprintCtrlNChoices, m_ChangeExistingFootprintCtrlChoices, 1, wxRA_SPECIFY_COLS ); + m_ChangeExistingFootprintCtrl = new wxRadioBox( this, wxID_ANY, _("Exchange Module"), wxDefaultPosition, wxDefaultSize, m_ChangeExistingFootprintCtrlNChoices, m_ChangeExistingFootprintCtrlChoices, 1, wxRA_SPECIFY_COLS ); m_ChangeExistingFootprintCtrl->SetSelection( 0 ); m_ChangeExistingFootprintCtrl->SetToolTip( _("Keep or change an existing footprint when the netlist gives a different footprint") ); @@ -54,7 +54,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w wxString m_DeleteBadTracksChoices[] = { _("Keep"), _("Delete") }; int m_DeleteBadTracksNChoices = sizeof( m_DeleteBadTracksChoices ) / sizeof( wxString ); - m_DeleteBadTracks = new wxRadioBox( this, wxID_ANY, _("Bad Tracks Deletion:"), wxDefaultPosition, wxDefaultSize, m_DeleteBadTracksNChoices, m_DeleteBadTracksChoices, 1, wxRA_SPECIFY_COLS ); + m_DeleteBadTracks = new wxRadioBox( this, wxID_ANY, _("Unconnected Tracks"), wxDefaultPosition, wxDefaultSize, m_DeleteBadTracksNChoices, m_DeleteBadTracksChoices, 1, wxRA_SPECIFY_COLS ); m_DeleteBadTracks->SetSelection( 0 ); m_DeleteBadTracks->SetToolTip( _("Keep or delete bad tracks after a netlist change") ); @@ -74,7 +74,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w wxBoxSizer* bRightSizerButtons; bRightSizerButtons = new wxBoxSizer( wxVERTICAL ); - m_buttonBrowse = new wxButton( this, ID_OPEN_NELIST, _("Browse Netlist Files"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonBrowse = new wxButton( this, ID_OPEN_NELIST, _("Open Netlist File"), wxDefaultPosition, wxDefaultSize, 0 ); bRightSizerButtons->Add( m_buttonBrowse, 0, wxEXPAND|wxALL, 5 ); m_buttonRead = new wxButton( this, ID_READ_NETLIST_FILE, _("Read Current Netlist"), wxDefaultPosition, wxDefaultSize, 0 ); @@ -83,7 +83,7 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w bRightSizerButtons->Add( m_buttonRead, 0, wxEXPAND|wxALL, 5 ); - m_buttonFPTest = new wxButton( this, ID_TEST_NETLIST, _("Footprints Test"), wxDefaultPosition, wxDefaultSize, 0 ); + m_buttonFPTest = new wxButton( this, ID_TEST_NETLIST, _("Test Footprints"), wxDefaultPosition, wxDefaultSize, 0 ); m_buttonFPTest->SetToolTip( _("Read the current neltist file and list missing and extra footprints") ); bRightSizerButtons->Add( m_buttonFPTest, 0, wxEXPAND|wxALL, 5 ); @@ -93,15 +93,27 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w bRightSizerButtons->Add( m_buttonRebild, 0, wxEXPAND|wxALL, 5 ); + m_buttonSaveMessages = new wxButton( this, wxID_ANY, _("Save Messages to File"), wxDefaultPosition, wxDefaultSize, 0 ); + bRightSizerButtons->Add( m_buttonSaveMessages, 0, wxALL|wxEXPAND, 5 ); + m_buttonClose = new wxButton( this, wxID_CANCEL, _("Close"), wxDefaultPosition, wxDefaultSize, 0 ); bRightSizerButtons->Add( m_buttonClose, 0, wxALL|wxEXPAND, 5 ); - bUpperSizer->Add( bRightSizerButtons, 0, wxALIGN_CENTER_VERTICAL, 5 ); + bUpperSizer->Add( bRightSizerButtons, 0, wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP, 5 ); bMainSizer->Add( bUpperSizer, 0, wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 ); + wxBoxSizer* bCenterSizer; + bCenterSizer = new wxBoxSizer( wxVERTICAL ); + + m_checkDryRun = new wxCheckBox( this, wxID_ANY, _("Only report changes in message panel"), wxDefaultPosition, wxDefaultSize, 0 ); + bCenterSizer->Add( m_checkDryRun, 0, wxALL, 5 ); + + + bMainSizer->Add( bCenterSizer, 0, wxALL|wxEXPAND, 5 ); + m_staticline1 = new wxStaticLine( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL ); bMainSizer->Add( m_staticline1, 0, wxEXPAND | wxALL, 5 ); @@ -137,8 +149,13 @@ DIALOG_NETLIST_FBP::DIALOG_NETLIST_FBP( wxWindow* parent, wxWindowID id, const w // Connect Events m_buttonBrowse->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnOpenNetlistClick ), NULL, this ); m_buttonRead->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnReadNetlistFileClick ), NULL, this ); + m_buttonRead->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUIValidNetlistFile ), NULL, this ); m_buttonFPTest->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnTestFootprintsClick ), NULL, this ); + m_buttonFPTest->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUIValidNetlistFile ), NULL, this ); m_buttonRebild->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnCompileRatsnestClick ), NULL, this ); + m_buttonRebild->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUIValidNetlistFile ), NULL, this ); + m_buttonSaveMessages->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnSaveMessagesToFile ), NULL, this ); + m_buttonSaveMessages->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUISaveMessagesToFile ), NULL, this ); m_buttonClose->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnCancelClick ), NULL, this ); } @@ -147,8 +164,13 @@ DIALOG_NETLIST_FBP::~DIALOG_NETLIST_FBP() // Disconnect Events m_buttonBrowse->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnOpenNetlistClick ), NULL, this ); m_buttonRead->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnReadNetlistFileClick ), NULL, this ); + m_buttonRead->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUIValidNetlistFile ), NULL, this ); m_buttonFPTest->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnTestFootprintsClick ), NULL, this ); + m_buttonFPTest->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUIValidNetlistFile ), NULL, this ); m_buttonRebild->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnCompileRatsnestClick ), NULL, this ); + m_buttonRebild->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUIValidNetlistFile ), NULL, this ); + m_buttonSaveMessages->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnSaveMessagesToFile ), NULL, this ); + m_buttonSaveMessages->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( DIALOG_NETLIST_FBP::OnUpdateUISaveMessagesToFile ), NULL, this ); m_buttonClose->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_NETLIST_FBP::OnCancelClick ), NULL, this ); } diff --git a/pcbnew/dialogs/dialog_netlist_fbp.fbp b/pcbnew/dialogs/dialog_netlist_fbp.fbp index d4dee8a418..2336b347e7 100644 --- a/pcbnew/dialogs/dialog_netlist_fbp.fbp +++ b/pcbnew/dialogs/dialog_netlist_fbp.fbp @@ -142,7 +142,7 @@ 0 0 wxID_ANY - Module Selection: + Module Selection 1 0 @@ -232,7 +232,7 @@ 0 0 wxID_ANY - Module Name Source: + Module Name Source 1 0 @@ -322,7 +322,7 @@ 0 0 wxID_ANY - Exchange Module: + Exchange Module 1 0 @@ -423,7 +423,7 @@ 0 0 wxID_ANY - Bad Tracks Deletion: + Unconnected Tracks 1 0 @@ -574,7 +574,7 @@
5 - wxALIGN_CENTER_VERTICAL + wxALIGN_CENTER_VERTICAL|wxBOTTOM|wxTOP 0 @@ -614,7 +614,7 @@ 0 0 ID_OPEN_NELIST - Browse Netlist Files + Open Netlist File 0 @@ -754,7 +754,7 @@ - + OnUpdateUIValidNetlistFile @@ -790,7 +790,7 @@ 0 0 ID_TEST_NETLIST - Footprints Test + Test Footprints 0 @@ -842,7 +842,7 @@ - + OnUpdateUIValidNetlistFile
@@ -930,7 +930,95 @@ - + OnUpdateUIValidNetlistFile + +
+ + 5 + wxALL|wxEXPAND + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Save Messages to File + + 0 + + + 0 + + 1 + m_buttonSaveMessages + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + OnSaveMessagesToFile + + + + + + + + + + + + + + + + + + + + + + + OnUpdateUISaveMessagesToFile @@ -1025,6 +1113,105 @@ + + 5 + wxALL|wxEXPAND + 0 + + + bCenterSizer + wxVERTICAL + none + + 5 + wxALL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Only report changes in message panel + + 0 + + + 0 + + 1 + m_checkDryRun + 1 + + + protected + 1 + + Resizable + 1 + + + + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 5 wxEXPAND | wxALL diff --git a/pcbnew/dialogs/dialog_netlist_fbp.h b/pcbnew/dialogs/dialog_netlist_fbp.h index acf63e437f..271709b822 100644 --- a/pcbnew/dialogs/dialog_netlist_fbp.h +++ b/pcbnew/dialogs/dialog_netlist_fbp.h @@ -22,6 +22,7 @@ class DIALOG_SHIM; #include #include #include +#include #include #include #include @@ -54,7 +55,9 @@ class DIALOG_NETLIST_FBP : public DIALOG_SHIM wxButton* m_buttonRead; wxButton* m_buttonFPTest; wxButton* m_buttonRebild; + wxButton* m_buttonSaveMessages; wxButton* m_buttonClose; + wxCheckBox* m_checkDryRun; wxStaticLine* m_staticline1; wxStaticText* m_staticTextNetfilename; wxTextCtrl* m_NetlistFilenameCtrl; @@ -64,8 +67,11 @@ class DIALOG_NETLIST_FBP : public DIALOG_SHIM // Virtual event handlers, overide them in your derived class virtual void OnOpenNetlistClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnReadNetlistFileClick( wxCommandEvent& event ) { event.Skip(); } + virtual void OnUpdateUIValidNetlistFile( wxUpdateUIEvent& event ) { event.Skip(); } virtual void OnTestFootprintsClick( wxCommandEvent& event ) { event.Skip(); } virtual void OnCompileRatsnestClick( wxCommandEvent& event ) { event.Skip(); } + virtual void OnSaveMessagesToFile( wxCommandEvent& event ) { event.Skip(); } + virtual void OnUpdateUISaveMessagesToFile( wxUpdateUIEvent& event ) { event.Skip(); } virtual void OnCancelClick( wxCommandEvent& event ) { event.Skip(); } diff --git a/pcbnew/dialogs/dialog_orient_footprints.cpp b/pcbnew/dialogs/dialog_orient_footprints.cpp index 01cae40e27..bffc487ee8 100644 --- a/pcbnew/dialogs/dialog_orient_footprints.cpp +++ b/pcbnew/dialogs/dialog_orient_footprints.cpp @@ -1,5 +1,5 @@ /** - * @file DIALOG_ORIENT_FOOTPRINTS.cpp + * @file dialog_orient_footprints.cpp */ /* * This program source code file is part of KiCad, a free EDA CAD application. @@ -58,10 +58,12 @@ public: { return m_ApplyToLocked->IsChecked(); } + int GetOrientation() { return newOrientation; } + wxString GetFilter() { return m_FilterPattern->GetValue(); @@ -73,6 +75,8 @@ private: void OnOkClick( wxCommandEvent& event ); void OnCancelClick( wxCommandEvent& event ); }; + + int DIALOG_ORIENT_FOOTPRINTS::newOrientation = 0; @@ -81,23 +85,18 @@ DIALOG_ORIENT_FOOTPRINTS::DIALOG_ORIENT_FOOTPRINTS( PCB_EDIT_FRAME* parent ) { m_Parent = parent; wxString txt; - txt.Printf(wxT("%g"), (double) newOrientation/10); - m_OrientationCtrl->SetValue(txt); - SetFocus( ); - GetSizer()->SetSizeHints(this); + txt.Printf( wxT( "%g" ), (double) newOrientation/10 ); + m_OrientationCtrl->SetValue( txt ); + SetFocus(); + GetSizer()->SetSizeHints( this ); Centre(); } -/****************************************************************/ void PCB_EDIT_FRAME::OnOrientFootprints( wxCommandEvent& event ) -/****************************************************************/ -/** - * Function OnOrientFootprints - * install the dialog box for the comman Orient Footprints - */ { - DIALOG_ORIENT_FOOTPRINTS dlg(this); + DIALOG_ORIENT_FOOTPRINTS dlg( this ); + if( dlg.ShowModal() != wxID_OK ) return; @@ -111,23 +110,13 @@ void PCB_EDIT_FRAME::OnOrientFootprints( wxCommandEvent& event ) } -/*******************************************************************/ -bool PCB_EDIT_FRAME::ReOrientModules( const wxString& ModuleMask, - int Orient, bool include_fixe ) -/*******************************************************************/ -/** - * Function ReOrientModules - * Set the orientation of footprints - * @param ModuleMask = mask (wildcard allowed) selection - * @param Orient = new orientation - * @param include_fixe = true to orient locked footprints - * @return true if some footprints modified, false if no change - */ +bool PCB_EDIT_FRAME::ReOrientModules( const wxString& ModuleMask, int Orient, bool include_fixe ) { wxString line; bool modified = false; line.Printf( _( "OK to set footprints orientation to %.1f degrees ?" ), (double)Orient / 10 ); + if( !IsOK( this, line ) ) return false; @@ -155,13 +144,13 @@ void DIALOG_ORIENT_FOOTPRINTS::OnOkClick( wxCommandEvent& event ) double d_orient; wxString text = m_OrientationCtrl->GetValue(); - if ( ! text.ToDouble(&d_orient) ) + if ( ! text.ToDouble( &d_orient ) ) { - DisplayError(this, _("Bad value for footprints orientation")); + DisplayError( this, _( "Bad value for footprints orientation" ) ); return; } - newOrientation = KiROUND(d_orient * 10); + newOrientation = KiROUND( d_orient * 10 ); NORMALIZE_ANGLE_180( newOrientation ); EndModal( wxID_OK ); } diff --git a/pcbnew/dialogs/dialog_pad_properties.cpp b/pcbnew/dialogs/dialog_pad_properties.cpp index 6cecfca528..4046ee200f 100644 --- a/pcbnew/dialogs/dialog_pad_properties.cpp +++ b/pcbnew/dialogs/dialog_pad_properties.cpp @@ -1,6 +1,6 @@ /** - * @file dialog_pad_properties.cpp. - * @brief Pad editing functions and dialog pad editor + * @file dialog_pad_properties.cpp + * @brief Pad editing functions and dialog pad editor. */ /* diff --git a/pcbnew/loadcmp.cpp b/pcbnew/loadcmp.cpp index 20ac9c0b74..f4d4070605 100644 --- a/pcbnew/loadcmp.cpp +++ b/pcbnew/loadcmp.cpp @@ -132,7 +132,7 @@ wxString PCB_BASE_FRAME::SelectFootprintFromLibBrowser( void ) wxMilliSleep( 50 ); } - // Returnd the full fp name, i.e. the lib name and th fp name, + // Returns the full fp name, i.e. the lib name and th fp name, // separated by a '/' // (/ is now an illegal char in fp names) wxString fpname = viewer->GetSelectedLibraryFullName(); @@ -269,15 +269,6 @@ MODULE* PCB_BASE_FRAME::Load_Module_From_Library( const wxString& aLibrary, } -/* scans active libraries to find and load aFootprintName. - * If found the module is added to the BOARD, just for good measure. - * aLibraryPath is the full/short name of the library. - * if empty, search in all libraries - * aFootprintName is the footprint to load - * aDisplayError = true to display an error message if any. - * - * return a pointer to the new module, or NULL - */ MODULE* PCB_BASE_FRAME::GetModuleLibrary( const wxString& aLibraryPath, const wxString& aFootprintName, bool aDisplayError ) @@ -289,12 +280,6 @@ MODULE* PCB_BASE_FRAME::GetModuleLibrary( const wxString& aLibraryPath, } -/* loads aFootprintName from aLibraryPath. - * If found the module is added to the BOARD, just for good measure. - * - * aLibraryPath - the full filename or the short name of the library to read. - * if it is a short name, the file is searched in all library valid paths - */ MODULE* PCB_BASE_FRAME::loadFootprintFromLibrary( const wxString& aLibraryPath, const wxString& aFootprintName, bool aDisplayError, @@ -337,10 +322,6 @@ MODULE* PCB_BASE_FRAME::loadFootprintFromLibrary( const wxString& aLibraryPath, } -/* Explore the libraries list and - * loads aFootprintName from the first library it is found - * If found add the module is also added to the BOARD, just for good measure. - */ MODULE* PCB_BASE_FRAME::loadFootprintFromLibraries( const wxString& aFootprintName, bool aDisplayError ) { @@ -399,6 +380,35 @@ MODULE* PCB_BASE_FRAME::loadFootprintFromLibraries( { DisplayError( this, ioe.errorText ); } + + return NULL; +} + + +MODULE* PCB_BASE_FRAME::loadFootprint( const wxString& aFootprintName ) + throw( IO_ERROR, PARSE_ERROR ) +{ + wxString libPath; + wxFileName fn; + MODULE* footprint; + + PLUGIN::RELEASER pi( IO_MGR::PluginFind( IO_MGR::LEGACY ) ); + + for( unsigned ii = 0; ii < g_LibraryNames.GetCount(); ii++ ) + { + fn = wxFileName( wxEmptyString, g_LibraryNames[ii], LegacyFootprintLibPathExtension ); + + libPath = wxGetApp().FindLibraryPath( fn ); + + if( !libPath ) + continue; + + footprint = pi->FootprintLoad( libPath, aFootprintName ); + + if( footprint ) + return footprint; + } + return NULL; } @@ -486,9 +496,6 @@ wxString PCB_BASE_FRAME::Select_1_Module_From_List( EDA_DRAW_FRAME* aWindow, } -/* Find and display the doc Component Name - * The list of doc is pointed to by mlist. - */ static void DisplayCmpDoc( wxString& Name ) { FOOTPRINT_INFO* module_info = MList.GetModuleInfo( Name ); diff --git a/pcbnew/muonde.cpp b/pcbnew/muonde.cpp index 9092563ab2..42a6bd3f3b 100644 --- a/pcbnew/muonde.cpp +++ b/pcbnew/muonde.cpp @@ -688,40 +688,40 @@ MODULE* PCB_EDIT_FRAME::Create_MuWaveComponent( int shape_type ) break; case 2: // Arc Stub created by a polygonal approach: + { + EDGE_MODULE* edge = new EDGE_MODULE( module ); + module->GraphicalItems().PushFront( edge ); + + edge->SetShape( S_POLYGON ); + edge->SetLayer( LAYER_N_FRONT ); + + int numPoints = angle / 50 + 3; // Note: angles are in 0.1 degrees + std::vector polyPoints = edge->GetPolyPoints(); + polyPoints.reserve( numPoints ); + + edge->m_Start0.y = -pad->GetSize().y / 2; + + polyPoints.push_back( wxPoint( 0, 0 ) ); + + int theta = -angle / 2; + + for( int ii = 1; iiGraphicalItems().PushFront( edge ); + wxPoint pt( 0, -gap_size ); - edge->SetShape( S_POLYGON ); - edge->SetLayer( LAYER_N_FRONT ); + RotatePoint( &pt.x, &pt.y, theta ); - int numPoints = angle / 50 + 3; // Note: angles are in 0.1 degrees - std::vector polyPoints = edge->GetPolyPoints(); - polyPoints.reserve( numPoints ); + polyPoints.push_back( pt ); - edge->m_Start0.y = -pad->GetSize().y / 2; + theta += 50; - polyPoints.push_back( wxPoint( 0, 0 ) ); - - int theta = -angle / 2; - - for( int ii = 1; ii angle / 2 ) - theta = angle / 2; - } - - // Close the polygon: - polyPoints.push_back( polyPoints[0] ); + if( theta > angle / 2 ) + theta = angle / 2; } + + // Close the polygon: + polyPoints.push_back( polyPoints[0] ); + } break; default: diff --git a/pcbnew/netlist.cpp b/pcbnew/netlist.cpp index 590905e98e..978cabd23c 100644 --- a/pcbnew/netlist.cpp +++ b/pcbnew/netlist.cpp @@ -25,184 +25,96 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ -/* - * Functions to read a netlist: - * - Load new footprints and initialize net info - * - Test for missing or extra footprints - * - Recalculate full connectivity info - * - * Important remark: - * When reading a netlist, Pcbnew must identify existing footprints (link - * between existing footprints an components in netlist) - * This identification can be made from 2 fields: - * - The reference (U2, R5 ..): this is the normal mode - * - The Time Stamp : useful after a full schematic - * reannotation because references can be changed for the component linked to its footprint. - * So when reading a netlist, ReadPcbNetlist() can use references or time stamps - * to identify footprints on board and the corresponding component in schematic. - * If we want to fully reannotate a schematic this sequence must be used - * 1 - SAVE your board !!! - * 2 - Create and read the netlist (to ensure all info is correct, mainly - * references and time stamp) - * 3 - Reannotate the schematic (references will be changed, but not time stamps ) - * 4 - Recreate and read the new netlist using the Time Stamp identification - * (that reinit the new references) - */ - - - #include +#include #include #include #include #include +#include +#include +#include +#include + #include #include #include -#include -#include +#include #include -/** - * Function OpenNetlistFile - * used to open a netlist file - */ -static FILE* OpenNetlistFile( const wxString& aFullFileName ) -{ - if( aFullFileName.IsEmpty() ) - return NULL; // No filename: exit - FILE* file = wxFopen( aFullFileName, wxT( "rt" ) ); - - if( file == NULL ) - { - wxString msg; - msg.Printf( _( "Netlist file <%s> not found" ), GetChars( aFullFileName ) ); - wxMessageBox( msg ); - } - - return file; -} - - - -/* Update footprints (load missing footprints and delete on request extra footprints) - * Update connectivity info ( Net Name list ) - * Update Reference, value and "TIME STAMP" - * param aNetlistFullFilename = netlist file name (*.net) - * param aCmpFullFileName = cmp/footprint list file name (*.cmp) if not found, - * param aMessageWindow = a wxTextCtrl to print messages (can be NULL). - * param aChangeFootprint = true to change existing footprints - * when the netlist gives a different footprint. - * false to keep existing footprints - * param aDeleteBadTracks - true to erase erroneous tracks after updating connectivity info. - * param aDeleteExtraFootprints - true to remove unlocked footprints found on board but not - * in netlist. - * param aSelect_By_Timestamp - true to use schematic timestamps instead of schematic references - * to identify footprints on board - * (Must be used after a full reannotation in schematic). - * param aUseCmpFileForFootprintsNames = false to use only the netlist to know the - * fontprint names of each component. - * = true to use the .cmp file created by CvPcb - * return true if Ok - */ -bool PCB_EDIT_FRAME::ReadPcbNetlist( const wxString& aNetlistFullFilename, - const wxString& aCmpFullFileName, - wxTextCtrl* aMessageWindow, - bool aChangeFootprint, - bool aDeleteBadTracks, +void PCB_EDIT_FRAME::ReadPcbNetlist( const wxString& aNetlistFileName, + const wxString& aCmpFileName, + REPORTER* aReporter, + bool aChangeFootprints, + bool aDeleteUnconnectedTracks, bool aDeleteExtraFootprints, - bool aSelect_By_Timestamp ) + bool aSelectByTimeStamp, + bool aIsDryRun ) { - FILE* netfile = OpenNetlistFile( aNetlistFullFilename ); + wxString msg; + NETLIST netlist; + NETLIST_READER* netlistReader; - if( !netfile ) - return false; - - SetLastNetListRead( aNetlistFullFilename ); - bool useCmpfile = !aCmpFullFileName.IsEmpty() && wxFileExists( aCmpFullFileName ); - - if( aMessageWindow ) + try { - wxString msg; - msg.Printf( _( "Reading Netlist <%s>" ), GetChars( aNetlistFullFilename ) ); - aMessageWindow->AppendText( msg + wxT( "\n" ) ); + netlistReader = NETLIST_READER::GetNetlistReader( &netlist, aNetlistFileName, + aCmpFileName ); - if( useCmpfile ) + if( netlistReader == NULL ) { - msg.Printf( _( "Using component/footprint link file <%s>" ), - GetChars( aCmpFullFileName ) ); - aMessageWindow->AppendText( msg + wxT( "\n" ) ); + msg.Printf( _( "Cannot open netlist file \"%s\"." ), GetChars( aNetlistFileName ) ); + wxMessageBox( msg, _( "Netlist Load Error." ), wxOK | wxICON_ERROR, this ); + return; } - if( aSelect_By_Timestamp ) - { - msg.Printf( _( "Using time stamp selection" ), - GetChars( aCmpFullFileName ) ); - aMessageWindow->AppendText( msg + wxT( "\n" ) ); - } + std::auto_ptr< NETLIST_READER > nlr( netlistReader ); + SetLastNetListRead( aNetlistFileName ); + netlistReader->LoadNetlist(); + loadFootprints( netlist, aReporter ); } + catch( IO_ERROR& ioe ) + { + msg = wxString::Format( _( "Error loading netlist.\n%s" ), ioe.errorText.GetData() ); + wxMessageBox( msg, _( "Netlist Load Error" ), wxOK | wxICON_ERROR ); + return; + } + + netlist.SetIsDryRun( aIsDryRun ); + netlist.SetFindByTimeStamp( aSelectByTimeStamp ); + netlist.SetDeleteExtraFootprints( aDeleteExtraFootprints ); + netlist.SetReplaceFootprints( aChangeFootprints ); // Clear undo and redo lists to avoid inconsistencies between lists - GetScreen()->ClearUndoRedoList(); + if( !netlist.IsDryRun() ) + GetScreen()->ClearUndoRedoList(); + + netlist.SortByReference(); + GetBoard()->ReplaceNetlist( netlist, aReporter ); + + // If it was a dry run, nothing has changed so we're done. + if( netlist.IsDryRun() ) + return; OnModify(); - // Clear flags and pointers to avoid inconsistencies - GetBoard()->m_Status_Pcb = 0; SetCurItem( NULL ); - wxBusyCursor dummy; // Shows an hourglass while calculating - - NETLIST_READER netList_Reader( this, aMessageWindow ); - netList_Reader.m_UseTimeStamp = aSelect_By_Timestamp; - netList_Reader.m_ChangeFootprints = aChangeFootprint; - netList_Reader.m_UseCmpFile = useCmpfile; - netList_Reader.SetFilesnames( aNetlistFullFilename, aCmpFullFileName ); - - // True to read footprint filters section: true for CvPcb, false for Pcbnew - netList_Reader.ReadLibpartSectionSetOpt( false ); - - bool success = netList_Reader.ReadNetList( netfile ); - - if( !success ) + if( aDeleteUnconnectedTracks && GetBoard()->m_Track ) { - wxMessageBox( _("Netlist read error") ); - return false; - } - - // Delete footprints not found in netlist: - if( aDeleteExtraFootprints ) - { - if( IsOK( NULL, - _( "OK to delete not locked footprints not found in netlist?" ) ) ) - netList_Reader.RemoveExtraFootprints(); + // Remove erroneous tracks. This should probably pushed down to the #BOARD object. + RemoveMisConnectedTracks(); } // Rebuild the board connectivity: Compile_Ratsnest( NULL, true ); - - if( aDeleteBadTracks && GetBoard()->m_Track ) - { - // Remove erroneous tracks - if( RemoveMisConnectedTracks() ) - Compile_Ratsnest( NULL, true ); - } - SetMsgPanel( GetBoard() ); m_canvas->Refresh(); - - return true; } -/** - * build and shows a list of existing modules on board - * The user can select a module from this list - * @return a pointer to the selected module or NULL - */ -MODULE* PCB_EDIT_FRAME::ListAndSelectModuleName( void ) +MODULE* PCB_EDIT_FRAME::ListAndSelectModuleName() { MODULE* Module; @@ -219,9 +131,9 @@ MODULE* PCB_EDIT_FRAME::ListAndSelectModuleName( void ) listnames.Add( Module->GetReference() ); wxArrayString headers; - headers.Add( wxT("Module") ); + headers.Add( wxT( "Module" ) ); std::vector itemsToDisplay; - + // Conversion from wxArrayString to vector of ArrayString for( unsigned i = 0; i < listnames.GetCount(); i++ ) { @@ -229,6 +141,7 @@ MODULE* PCB_EDIT_FRAME::ListAndSelectModuleName( void ) item.Add( listnames[i] ); itemsToDisplay.push_back( item ); } + EDA_LIST_DIALOG dlg( this, _( "Components" ), headers, itemsToDisplay, wxEmptyString ); if( dlg.ShowModal() != wxID_OK ) @@ -247,84 +160,70 @@ MODULE* PCB_EDIT_FRAME::ListAndSelectModuleName( void ) } -/* - * Function Test_Duplicate_Missing_And_Extra_Footprints - * Build a list of duplicate, missing and extra footprints - * from the current board and a netlist netlist : - * Shows 3 lists: - * 1 - duplicate footprints on board - * 2 - missing footprints (found in netlist but not on board) - * 3 - footprints not in netlist but on board - * param aFilename = the full filename netlist - * param aDuplicate = the list of duplicate modules to populate - * param aMissing = the list of missing module references and values - * to populate. For each missing item, the first string is the ref, - * the second is the value. - * param aNotInNetlist = the list of not-in-netlist modules to populate - */ -bool PCB_EDIT_FRAME::Test_Duplicate_Missing_And_Extra_Footprints( - const wxString& aFilename, - std::vector & aDuplicate, - wxArrayString& aMissing, - std::vector & aNotInNetlist ) +void PCB_EDIT_FRAME::loadFootprints( NETLIST& aNetlist, REPORTER* aReporter ) + throw( IO_ERROR, PARSE_ERROR ) { - FILE* netfile = OpenNetlistFile( aFilename ); - if( !netfile ) - return false; + wxString msg; + wxString lastFootprintLibName; + COMPONENT* component; + MODULE* module; - // Build the list of references of the net list modules. - NETLIST_READER netList_Reader( this ); - netList_Reader.SetFilesnames( aFilename, wxEmptyString ); - netList_Reader.BuildModuleListOnlySetOpt( true ); - if( ! netList_Reader.ReadNetList( netfile ) ) - return false; // error + if( aNetlist.IsEmpty() ) + return; - COMPONENT_INFO_LIST& moduleInfoList = netList_Reader.GetComponentInfoList(); + aNetlist.SortByFootprintLibName(); - // Search for duplicate footprints. - MODULE* module = GetBoard()->m_Modules; + wxString libPath; + wxFileName fn; - for( ; module != NULL; module = module->Next() ) + PLUGIN::RELEASER pi( IO_MGR::PluginFind( IO_MGR::LEGACY ) ); + + for( unsigned ii = 0; ii < aNetlist.GetCount(); ii++ ) { - MODULE* altmodule = module->Next(); + component = aNetlist.GetComponent( ii ); - for( ; altmodule != NULL; altmodule = altmodule->Next() ) + if( ii == 0 || component->GetFootprintLibName() != lastFootprintLibName ) { - if( module->GetReference().CmpNoCase( altmodule->GetReference() ) == 0 ) + module = NULL; + + for( unsigned ii = 0; ii < g_LibraryNames.GetCount(); ii++ ) { - aDuplicate.push_back( module ); - break; + fn = wxFileName( wxEmptyString, g_LibraryNames[ii], + LegacyFootprintLibPathExtension ); + + libPath = wxGetApp().FindLibraryPath( fn ); + + if( !libPath ) + continue; + + module = pi->FootprintLoad( libPath, component->GetFootprintLibName() ); + + if( module ) + { + lastFootprintLibName = component->GetFootprintLibName(); + break; + } + } + + if( module == NULL ) + { + wxString msg; + msg.Printf( _( "Component `%s` footprint <%s> was not found in any libraries." ), + GetChars( component->GetReference() ), + GetChars( component->GetFootprintLibName() ) ); + THROW_IO_ERROR( msg ); } } - } - - // Search for missing modules on board. - for( unsigned ii = 0; ii < moduleInfoList.size(); ii++ ) - { - COMPONENT_INFO* cmp_info = moduleInfoList[ii]; - module = GetBoard()->FindModuleByReference( cmp_info->m_Reference ); - if( module == NULL ) // Module missing, not found in board + else { - aMissing.Add( cmp_info->m_Reference ); - aMissing.Add( cmp_info->m_Value ); - } - } + // Footprint already loaded from a library, duplicate it (faster) + if( module == NULL ) + continue; // Module does not exist in any library. - // Search for modules found on board but not in net list. - module = GetBoard()->m_Modules; - for( ; module != NULL; module = module->Next() ) - { - unsigned ii; - for( ii = 0; ii < moduleInfoList.size(); ii++ ) - { - COMPONENT_INFO* cmp_info = moduleInfoList[ii]; - if( module->GetReference().CmpNoCase( cmp_info->m_Reference ) == 0 ) - break; // Module is in net list. + module = new MODULE( *module ); } - if( ii == moduleInfoList.size() ) // Module not found in netlist - aNotInNetlist.push_back( module ); + wxASSERT( module != NULL ); + component->SetModule( module ); } - - return true; } diff --git a/pcbnew/netlist_reader.h b/pcbnew/netlist_reader.h index dabf7b8a95..c307648ade 100644 --- a/pcbnew/netlist_reader.h +++ b/pcbnew/netlist_reader.h @@ -1,5 +1,5 @@ #ifndef NETLIST_READER_H -#define NETLIST_READER_H +#define NETLIST_READER_H /** * @file netlist_reader.h @@ -9,6 +9,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2012 Jean-Pierre Charras. + * Copyright (C) 2013 Wayne Stambaugh . * Copyright (C) 2012 KiCad Developers, see CHANGELOG.TXT for contributors. * * This program is free software; you can redistribute it and/or @@ -33,304 +34,472 @@ #include #include -#include -#include -#include #include -#include -#include -#include +#include // netlist_lexer is common to Eeschema and Pcbnew -/* - * Helper class, to store for a footprint the footprint filter info, - * found in new format KiCad netlist. - * For CvPcb only - * Note: features for CvPcb are for a temporary use. - * They could be removed when CvPcb is modified - * (perhaps when it does not use anumore a netlist to build the component to footprint link) + +using namespace NL_T; + + +class MODULE; +class LINE_READER; +class REPORTER; + + +/** + * Class COMPONENT_NET + * is used to store the component pin name to net name associations stored in a netlist. */ -class LIPBART_INFO +class COMPONENT_NET { -public: - wxString m_Libpart; // the libpart name. - wxArrayString m_FootprintFilter; // an array of footprint filters found in netlist, - // for this footprint + wxString m_pinName; + wxString m_netNumber; + wxString m_netName; public: + COMPONENT_NET() {} - LIPBART_INFO( const wxString& aLibpart ) + COMPONENT_NET( const wxString& aPinName, const wxString& aNetName ) { - m_Libpart = aLibpart; + m_pinName = aPinName; + m_netName = aNetName; } + + const wxString& GetPinName() const { return m_pinName; } + + const wxString& GetNetName() const { return m_netName; } + + bool IsValid() const { return !m_pinName.IsEmpty(); } + + bool operator <( const COMPONENT_NET& aNet ) const + { + return m_pinName < aNet.m_pinName; + } + +#if defined(DEBUG) + /** + * Function Show + * is used to output the object tree, currently for debugging only. + * @param aNestLevel An aid to prettier tree indenting, and is the level + * of nesting of this object within the overall tree. + * @param aReporter A reference to a #REPORTER object to output to. + */ + virtual void Show( int aNestLevel, REPORTER& aReporter ); +#endif }; -typedef std::vector LIPBART_INFO_LIST; + +typedef std::vector< COMPONENT_NET > COMPONENT_NETS; -/* - * Helper class, to store components and footprints info found in netlist. - * (component reference and time stamp, footprint name ... +/** + * Class COMPONENT + * is used to store components and all of their related information found in a netlist. */ -class COMPONENT_INFO +class COMPONENT { -public: - wxString m_Footprint; // the footprint name found in netlist, the in .cmp file - wxString m_Reference; // the schematic reference found in netlist - wxString m_Value; // the schematic value found in netlist + COMPONENT_NETS m_nets; + wxArrayString m_footprintFilters; ///< Footprint filters found in netlist. + wxString m_reference; ///< The component reference designator found in netlist. + wxString m_value; ///< The component value found in netlist. + // ZZZ This timestamp is string, not time_t - wxString m_TimeStamp; // the schematic full time stamp found in netlist - wxString m_Libpart; // the schematic libpart found in netlist - wxArrayString m_FootprintFilter; // a footprint filters list found in old format netlist - int m_pinCount; // the number of pins found in the netlist + wxString m_timeStamp; ///< The component full time stamp found in netlist. + wxString m_name; ///< The name of the component found in the netlist. -public: COMPONENT_INFO( const wxString& libname, - const wxString& cmpname, - const wxString& value, - const wxString& timestamp ) + /// The name of the footprint in the library assigned to the component. + wxString m_footprintLibName; + + /// The lib part name used to look up the component library part information. This only has + /// meaning in the new s-expression netlist file format. + wxString m_libraryName; + wxString m_libraryPartName; + + /// The footprint loaded from the library for this component. + std::auto_ptr< MODULE > m_footprint; + + static COMPONENT_NET m_emptyNet; + +public: + COMPONENT( const wxString& aName, + const wxString& aReference, + const wxString& aValue, + const wxString& aTimeStamp ) { - m_Footprint = libname; - m_Reference = cmpname; - m_Value = value; - m_TimeStamp = timestamp; - m_pinCount = 0; + m_name = aName; + m_reference = aReference; + m_value = aValue; + m_timeStamp = aTimeStamp; } - ~COMPONENT_INFO() { }; + virtual ~COMPONENT() { }; + + void AddNet( const wxString& aPinName, const wxString& aNetName ) + { + m_nets.push_back( COMPONENT_NET( aPinName, aNetName ) ); + } + + unsigned GetNetCount() const { return m_nets.size(); } + + const COMPONENT_NET& GetNet( unsigned aIndex ) const { return m_nets[aIndex]; } + + const COMPONENT_NET& GetNet( const wxString& aPinName ); + + void SortPins() { sort( m_nets.begin(), m_nets.end() ); } + + const wxString& GetReference() const { return m_reference; } + + const wxString& GetValue() const { return m_value; } + + void SetFootprintLibName( const wxString& aFootprintLibName ) + { + m_footprintLibName = aFootprintLibName; + } + + const wxString& GetFootprintLibName() const { return m_footprintLibName; } + + const wxString& GetTimeStamp() const { return m_timeStamp; } + + const wxString& GetLibName() const { return m_name; } + + void SetLibrarySource( const wxString& aLibName, const wxString& aCompName ) + { + m_libraryName = aLibName; + m_libraryPartName = aCompName; + } + + void SetFootprintFilters( const wxArrayString& aFilterList ) + { + m_footprintFilters = aFilterList; + } + + const wxArrayString& GetFootprintFilters() const { return m_footprintFilters; } + + MODULE* GetModule( bool aRelease = false ) + { + return ( aRelease ) ? m_footprint.release() : m_footprint.get(); + } + + void SetModule( MODULE* aModule ); + + bool IsLibSource( const wxString& aLibName, const wxString& aCompName ) const + { + return aLibName == m_libraryName && aCompName == m_libraryPartName; + } + +#if defined(DEBUG) + /** + * Function Show + * is used to output the object tree, currently for debugging only. + * @param aNestLevel An aid to prettier tree indenting, and is the level + * of nesting of this object within the overall tree. + * @param aReporter A reference to a #REPORTER object to output to. + */ + virtual void Show( int aNestLevel, REPORTER& aReporter ); +#endif }; -enum typenetlist + +typedef boost::ptr_vector< COMPONENT > COMPONENTS; +typedef COMPONENTS::iterator COMPONENTS_ITER; +typedef COMPONENTS::const_iterator COMPONENTS_CITER; + + +/** + * Class NETLIST + * stores all of information read from a netlist along with the flags used to update + * the NETLIST in the #BOARD. + */ +class NETLIST { - NETLIST_TYPE_UNSPECIFIED = 0, - NETLIST_TYPE_ORCADPCB2, // the basic format used by pcbnew - NETLIST_TYPE_PCBNEW, // the format used by pcbnew, basic format + more info - NETLIST_TYPE_KICAD // new format using common S expression + COMPONENTS m_components; ///< Components found in the netlist. + + /// Remove footprints from #BOARD not found in netlist when true. + bool m_deleteExtraFootprints; + + /// Do not actually make any changes. Only report changes to #BOARD from netlist + /// when true. + bool m_isDryRun; + + /// Find component by time stamp if true or reference designator if false. + bool m_findByTimeStamp; + + /// Replace component footprints when they differ from the netlist if true. + bool m_replaceFootprints; + +public: + NETLIST() : + m_deleteExtraFootprints( false ), + m_isDryRun( false ), + m_findByTimeStamp( false ), + m_replaceFootprints( false ) + { + } + + /** + * Function IsEmpty() + * @return true if there are no components in the netlist. + */ + bool IsEmpty() const { return m_components.empty(); } + + /** + * Function Clear + * removes all components from the netlist. + */ + void Clear() { m_components.clear(); } + + /** + * Function GetCount + * @return the number of components in the netlist. + */ + unsigned GetCount() const { return m_components.size(); } + + /** + * Function GetComponent + * returns the #COMPONENT at \a aIndex. + * + * @param aIndex the index in #m_components to fetch. + * @return a pointer to the #COMPONENT at \a Index. + */ + COMPONENT* GetComponent( unsigned aIndex ) { return &m_components[ aIndex ]; } + + /** + * Function AddComponent + * adds \a aComponent to the NETLIST. + * + * @note If \a aComponent already exists in the NETLIST, \a aComponent is deleted + * to prevent memory leaks. An assertion is raised in debug builds. + * + * @param aComponent is the COMPONENT to save to the NETLIST. + */ + void AddComponent( COMPONENT* aComponent ); + + /* + * Function GetComponentByReference + * returns a #COMPONENT by \a aReference. + * + * @param aReference is the reference designator the #COMPONENT. + * @return a pointer to the #COMPONENT that matches \a aReference if found. Otherwise NULL. + */ + COMPONENT* GetComponentByReference( const wxString& aReference ); + + /* + * Function GetComponentByTimeStamp + * returns a #COMPONENT by \a aTimeStamp. + * + * @param aTimeStamp is the time stamp the #COMPONENT. + * @return a pointer to the #COMPONENT that matches \a aTimeStamp if found. Otherwise NULL. + */ + COMPONENT* GetComponentByTimeStamp( const wxString& aTimeStamp ); + + /* + * Function GetComponentByLibName + * returns a #COMPONENT by \a aLibName. + * + * @param aLibName is the component library name of the #COMPONENT. + * @return a pointer to the #COMPONENT that matches \a aLibName if found. Otherwise NULL. + */ + COMPONENT* GetComponentByLibName( const wxString& aLibName ); + + void SortByFootprintLibName(); + + void SortByReference(); + + void SetDeleteExtraFootprints( bool aDeleteExtraFootprints ) + { + m_deleteExtraFootprints = aDeleteExtraFootprints; + } + + bool GetDeleteExtraFootprints() const { return m_deleteExtraFootprints; } + + void SetIsDryRun( bool aIsDryRun ) { m_isDryRun = aIsDryRun; } + + bool IsDryRun() const { return m_isDryRun; } + + void SetFindByTimeStamp( bool aFindByTimeStamp ) { m_findByTimeStamp = aFindByTimeStamp; } + + bool IsFindByTimeStamp() const { return m_findByTimeStamp; } + + void SetReplaceFootprints( bool aReplaceFootprints ) + { + m_replaceFootprints = aReplaceFootprints; + } + + bool GetReplaceFootprints() const { return m_replaceFootprints; } + +#if defined(DEBUG) + /** + * Function Show + * is used to output the object tree, currently for debugging only. + * @param aNestLevel An aid to prettier tree indenting, and is the level + * of nesting of this object within the overall tree. + * @param aReporter A reference to a #REPORTER object to output to. + */ + virtual void Show( int aNestLevel, REPORTER& aReporter ); +#endif }; -typedef std::vector COMPONENT_INFO_LIST; -/* - * Helper class, to read a netlist. +/** + * Class CMP_READER + * reads a component footprint link file (*.cmp) format. + */ +class CMP_READER +{ + LINE_READER* m_lineReader; ///< The line reader to read. + +public: + CMP_READER( LINE_READER* aLineReader ) + { + m_lineReader = aLineReader; + } + + /** + * Function Load + * read the *.cmp file format contains the component footprint assignments created by CvPcb + * into \a aNetlist. + * + * @param aNetlist is the #NETLIST to read into. + * + * @todo At some point in the future, use the footprint field in the new s-expression + * netlist file to assign a footprint to a component instead of using a secondary + * (*.cmp) file. + * + * Sample file footprint assignment entry: + * + * Cmp-Mod V01 Genere by CvPcb 29/10/2003-13: 11:6 * + * BeginCmp + * TimeStamp = /32307DE2/AA450F67; + * Reference = C1; + * ValeurCmp = 47uF; + * IdModule = CP6; + * EndCmp + * + * @throw IO_ERROR if a the #LINE_READER IO error occurs. + * @throw PARSE_ERROR if an error occurs while parsing the file. + */ + void Load( NETLIST* aNetlist ) throw( IO_ERROR, PARSE_ERROR ); +}; + + +/** + * Class NETLIST_READER + * is a pure virtual class to derive a specific type of netlist reader from. */ class NETLIST_READER { -private: - PCB_EDIT_FRAME* m_pcbframe; // the main Pcbnew frame (or NULL for CvPcb) - wxTextCtrl* m_messageWindow; // a textctrl to show messages (can be NULL) - wxString m_netlistFullName; // The full netlist filename - wxString m_cmplistFullName; // The full component/footprint association filename - MODULE* m_currModule; // The footprint currently being read in netlist - COMPONENT_INFO_LIST m_componentsInNetlist; // The list of footprints, found in netlist - // (must be loaded from libraries) - COMPONENT_INFO_LIST m_newModulesList; // The list of new footprints, - // found in netlist, but not on board - // (must be loaded from libraries) - LIPBART_INFO_LIST m_libpartList; // For Kicad new netlist format: - // list of libpart found in netlist - // A libpart contains the footprint filters for CvPcb - bool m_buildModuleListOnly; // if true read netlist, populates m_componentsInNetlist - // but do not read and change nets and modules on board - bool m_readLibpartSection; // if true read Libparts section, - // and therefore the footprints filters - enum typenetlist m_typeNetlist; // type opt the netlist currently read +protected: + NETLIST* m_netlist; ///< The net list to read the file(s) into. + bool m_loadFootprintFilters; ///< Load the component footprint filters section if true. + bool m_loadNets; ///< Load the nets section of the netlist file if true. + LINE_READER* m_lineReader; ///< The line reader of the netlist. -public: - bool m_UseCmpFile; // true to use .cmp files as component/footprint file link - // false to use netlist only to know component/footprint link - bool m_UseTimeStamp; // Set to true to identify footprints by time stamp - // false to use schematic reference - bool m_ChangeFootprints; // Set to true to change existing footprints to new ones - // when netlist gives a different footprint name + /// The reader used to load the footprint links. If NULL, footprint links are not read. + CMP_READER* m_footprintReader; public: - NETLIST_READER( PCB_EDIT_FRAME* aFrame, wxTextCtrl* aMessageWindow = NULL ) + enum NETLIST_FILE_T { - m_pcbframe = aFrame; - m_messageWindow = aMessageWindow; - m_UseTimeStamp = false; - m_ChangeFootprints = false; - m_UseCmpFile = true; - m_buildModuleListOnly = false; - m_readLibpartSection = false; - m_typeNetlist = NETLIST_TYPE_UNSPECIFIED; + UNKNOWN = -1, + ORCAD, + LEGACY, + KICAD, + + // Add new types here. Don't forget to create the appropriate class derived from + // NETCLASS_READER and add the entry to the NETLIST_READER::GetNetlistReader() + // function. + }; + + NETLIST_READER( LINE_READER* aLineReader, + NETLIST* aNetlist, + CMP_READER* aFootprintLinkReader = NULL ) + { + wxASSERT( aLineReader != NULL ); + + m_lineReader = aLineReader; + m_footprintReader = aFootprintLinkReader; + m_netlist = aNetlist; + m_loadFootprintFilters = true; + m_loadNets = true; } - ~NETLIST_READER() - { - // Free modules info list: - for( unsigned ii = 0; ii < m_newModulesList.size(); ii++ ) - delete m_componentsInNetlist[ii]; - - m_componentsInNetlist.clear(); - m_newModulesList.clear(); - - // Free libpart info list: - for( unsigned ii = 0; ii < m_libpartList.size(); ii++ ) - delete m_libpartList[ii]; - m_libpartList.clear(); - } + virtual ~NETLIST_READER(); /** - * Function GetNetlistType - * @return the type of netlist read: - * NETLIST_TYPE_UNSPECIFIED: Unknown format - * NETLIST_TYPE_ORCADPCB2: the basic format used by pcbnew - * NETLIST_TYPE_PCBNEW: the format used by pcbnew, basic format + more info - * NETLIST_TYPE_KICAD: the new format + * Function GuessNetlistFileType + * looks at \a aFileHeaderLine to see if it matches any of the netlist file types it + * knows about. + * + * @param aLineReader is the #LINE_READER object containing lines from the netlist to test. + * @return the #NETLIST_FILE_T of \a aLineReader. */ - int GetNetlistType() - { - return m_typeNetlist; - } + static NETLIST_FILE_T GuessNetlistFileType( LINE_READER* aLineReader ); /** - * Function GetComponentInfoList - * @return the component info list built from the netlist + * Function GetNetlistReader + * attempts to determine the net list file type of \a aNetlistFileName and return the + * appropriate NETLIST_READER type. + * + * @param aNetlist is the netlist to load \a aNetlistFileName into. + * @param aNetlistFileName is the full path and file name of the net list to read. + * @param aCompFootprintFileName is the full path and file name of the component footprint + * associations to read. Set to wxEmptyString if loading the + * footprint association file is not required. + * @return the appropriate NETLIST_READER if \a aNetlistFileName is a valid netlist or + * NULL if \a aNetlistFileName is not a valid netlist files. */ - COMPONENT_INFO_LIST& GetComponentInfoList() - { - return m_componentsInNetlist; - } + static NETLIST_READER* GetNetlistReader( NETLIST* aNetlist, + const wxString& aNetlistFileName, + const wxString& aCompFootprintFileName = wxEmptyString ) + throw( IO_ERROR ); /** - * Function GetComponentInfoList - * @return a reference to the libpart info corresponding to a given part - * @param aPartname = the name of the libpart + * Function LoadNetlist + * loads the contents of the netlist file into \a aNetlist. + * + * @throw IO_ERROR if a file IO error occurs. + * @throw PARSE_ERROR if an error occurs while parsing the file. */ - LIPBART_INFO* GetLibpart(const wxString & aPartname); + virtual void LoadNetlist() throw ( IO_ERROR, PARSE_ERROR ) = 0; /** - * Function IsCvPcbMode - * @return true if the netlist is read by CvPcb - * In cvpcb mode, nets are stored in module info, - * and the footprint filters list is read. - * There is also no board in CvPcb + * Function GetLineReader() + * @return the #LINE_READER associated with the #NETLIST_READER. */ - bool IsCvPcbMode() { return m_pcbframe == 0; } + LINE_READER* GetLineReader(); +}; + +/** + * Class LEGACY_NETLIST_READER + * reads the KiCad legacy and the old Orcad netlist formats. + * + * The KiCad legacy netlist format was derived directly from an old Orcad netlist format. The + * primary difference is the header was changed so this reader can read both formats. + */ +class LEGACY_NETLIST_READER : public NETLIST_READER +{ /** - * Function AddModuleInfo - * Add a new module info to the main list of modules ifo - * @param aModInfo = a reference to the item to add + * Function loadComponent + * read the \a aLine containing the description of a component from a legacy format + * netlist and add it to the netlist. + * + * Analyze the first line of a component description in netlist: + * ( /40C08647 $noname R20 4.7K {Lib=R} + * + * @param aText contains the first line of description + * @return the new component created by parsing \a aLine + * @throw PARSE_ERROR when \a aLine is not a valid component description. */ - void AddModuleInfo( COMPONENT_INFO* aModInfo ) - { - m_componentsInNetlist.push_back( aModInfo ); - } + COMPONENT* loadComponent( char* aText ) throw( PARSE_ERROR ); /** - * Function AddLibpartInfo - * LIPBART_INFO items (and therefore footprint filter strings) are stored in - * m_libpartList - * @param aPartInfo = a refernce to the LIPBART_INFO to add in list - */ - void AddLibpartInfo( LIPBART_INFO * aPartInfo ) - { - m_libpartList.push_back( aPartInfo ); - } - - /** - * Function ReadLibpartSectionSetOpt - * Set to true or false the read Partlists section. - * footprint filters are found in this section - * When this option is false, the Partlists section is ignored - * When this option is true, the Partlists section is read, - * Libpart items (and therefore footprint filter strings) are stored in - * m_libpartList - * @param aOpt = the value of option - */ - void ReadLibpartSectionSetOpt( bool aOpt ) - { - m_readLibpartSection = aOpt; - } - - /** - * Function ReadLibpartSectionOpt - * @return the readPartlist option - */ - bool ReadLibpartSectionOpt() { return m_readLibpartSection; } - - /** - * Function BuildModuleListOnlySetOpt - * Set to true or false the Build Module List Only option - * When this option is false, a full netlist read is made, - * and modules are added/modified - * When this option is true, a partial netlist read is made - * and only the list of modules found in netlist is built - * @param aOpt = the value of option - */ - void BuildModuleListOnlySetOpt( bool aOpt ) - { - m_buildModuleListOnly = aOpt; - } - - /** - * Function BuildModuleListOnlyOpt - * Get the Build Module List Only option state - * @return the state of option (true/false) - */ - bool BuildModuleListOnlyOpt() - { - return m_buildModuleListOnly; - } - - /** - * Function InitializeModules - * Called when reading a netlist and after the module info list is populated - * Load new module and clear pads netnames - * return true if all modules are loaded, false if some are missing - */ - bool InitializeModules(); - - /** - * Function TestFootprintsMatchingAndExchange - * Called when reading a netlist, after the module info list is populated - * module reference updated (after a call to InitializeModules) - * Test, for each module, if the current footprint matches the footprint - * given by the netlist (or the cmp file, if used) - * print a list of mismatches od exchange footprints i - * m_ChangeFootprints == true - */ - void TestFootprintsMatchingAndExchange(); - - - /** - * Function SetFilesnames - * initialize filenames - * @param aNetlistFileName = full filename of netlist - * @param aCmplistFileName = full filename of components file (can be empty) - * and the components file will be non used - */ - void SetFilesnames( const wxString& aNetlistFileName, - const wxString& aCmplistFileName ) - { - m_netlistFullName = aNetlistFileName; - m_cmplistFullName = aCmplistFileName; - } - - /** - * Function ReadNetList - * The main function to detect a netlist format, read the netlist, - * and update the board - * depending on the detected format, calls ReadOldFmtdNetList or ReadKicadNetList - * @param aFile = the already opened file (will be closed by the netlist reader) - * @return true if success - */ - bool ReadNetList( FILE* aFile ); - - /** - * Function ReadOldFmtdNetList - * The main function to read a netlist (old netlist format), - * and update the board - * @param aFile = the already opened file (will be closed by ReadOldFmtdNetList) - * @return true if success - */ - bool ReadOldFmtdNetList( FILE* aFile ); - - /** - * Function ReadOldFmtFootprintFilterList - * Read the section "Allowed footprints" like: + * Function loadFootprintFilters + * loads the footprint filter section of netlist file. + * + * Sample legacy footprint filter section: * { Allowed footprints by component: * $component R11 * R? @@ -342,99 +511,168 @@ public: * $endfootprintlist * } * - * And add the strings giving the footprint filter to m_FootprintFilter + * @throw IO_ERROR if a file IO error occurs. + * @throw PARSE_ERROR if an error occurs while parsing the file. + */ + void loadFootprintFilters() throw( IO_ERROR, PARSE_ERROR ); + + /** + * Function loadNet + * read a component net description from \a aText. + * + * @param aText is current line read from the netlist. + * @param aComponent is the component to add the net to. + * @throw PARSE_ERROR if a error occurs reading \a aText. + */ + void loadNet( char* aText, COMPONENT* aComponent ) throw( PARSE_ERROR ); + +public: + + LEGACY_NETLIST_READER( LINE_READER* aLineReader, + NETLIST* aNetlist, + CMP_READER* aFootprintLinkReader = NULL ) : + NETLIST_READER( aLineReader, aNetlist, aFootprintLinkReader ) + { + } + + /** + * Function LoadNetlist + * read the netlist file in the legacy format into \a aNetlist. + * + * The legacy netlist format is: + * \# EESchema Netlist Version 1.0 generee le 18/5/2005-12:30:22 + * ( + * ( 40C08647 $noname R20 4,7K {Lib=R} + * ( 1 VCC ) + * ( 2 MODB_1 ) + * ) + * ( 40C0863F $noname R18 4,7_k {Lib=R} + * ( 1 VCC ) + * ( 2 MODA_1 ) + * ) + * } + * \#End + * + * @throw IO_ERROR if a file IO error occurs. + * @throw PARSE_ERROR if an error occurs while parsing the file. + */ + virtual void LoadNetlist() throw ( IO_ERROR, PARSE_ERROR ); +}; + + +/** + * Class KICAD_NETLIST_PARSER + * is the parser for reading the KiCad s-expression netlist format. + */ +class KICAD_NETLIST_PARSER : public NETLIST_LEXER +{ +private: + T token; + LINE_READER* m_lineReader; ///< The line reader used to parse the netlist. Not owned. + NETLIST* m_netlist; ///< The netlist to parse into. Not owned. + + /** + * Function skipCurrent + * Skip the current token level, i.e + * search for the RIGHT parenthesis which closes the current description + */ + void skipCurrent() throw( IO_ERROR, PARSE_ERROR ); + + /** + * Function parseComponent + * parse a component description: + * (comp (ref P1) + * (value DB25FEMELLE) + * (footprint DB25FC) + * (libsource (lib conn) (part DB25)) + * (sheetpath (names /) (tstamps /)) + * (tstamp 3256759C)) + */ + void parseComponent() throw( IO_ERROR, PARSE_ERROR ); + + /** + * Function parseNet + * Parses a section like + * (net (code 20) (name /PC-A0) + * (node (ref BUS1) (pin 62)) + * (node (ref U3) (pin 3)) + * (node (ref U9) (pin M6))) + * + * and set the corresponding pads netnames + */ + void parseNet() throw( IO_ERROR, PARSE_ERROR ); + + /** + * Function parseLibPartList + * reads the section "libparts" in the netlist: + * (libparts + * (libpart (lib device) (part C) + * (description "Condensateur non polarise") + * (footprints + * (fp SM*) + * (fp C?) + * (fp C1-1)) + * (fields + * (field (name Reference) C) + * (field (name Value) C)) + * (pins + * (pin (num 1) (name ~) (type passive)) + * (pin (num 2) (name ~) (type passive)))) + * + * And add the strings giving the footprint filter (subsection footprints) * of the corresponding module info *

This section is used by CvPcb, and is not useful in Pcbnew, * therefore it it not always read

*/ - bool ReadOldFmtFootprintFilterList( FILE_LINE_READER& aNetlistReader ); + void parseLibPartList() throw( IO_ERROR, PARSE_ERROR ); + + +public: + KICAD_NETLIST_PARSER( LINE_READER* aReader, NETLIST* aNetlist ); + + void SetLineReader( LINE_READER* aLineReader ); + + void SetNetlist( NETLIST* aNetlist ) { m_netlist = aNetlist; } /** - * Function ReadKicadNetList - * The main function to read a netlist (new netlist format, using S expressions), - * and update the board - * @param aFile = the already opened file (will be closed by ReadKicadNetList) - * @return true if success + * Function Parse + * parse the full netlist */ - bool ReadKicadNetList( FILE* aFile ); + void Parse() throw( IO_ERROR, PARSE_ERROR ); - /** - * function RemoveExtraFootprints - * Remove (delete) not locked footprints found on board, but not in netlist - * The netlist is expected to be read, and the main module list info up to date - */ - void RemoveExtraFootprints( ); - - /** - * Function SetPadsNetName - * Update pads netnames for a given module. - * Because a pad name can be found more than once in this module, - * all pads matching the pad name are updated - * @param aModule = module reference - * @param aPadname = pad name (pad num) - * @param aNetname = new net name of the pad - * @param aPadList = a std::vector& buffer where the updated pads can be stored - * @return the pad count - */ - int SetPadsNetName( const wxString & aModule, const wxString & aPadname, - const wxString & aNetname, std::vector & aPadList ); - -private: - - /** - * Function FindModule - * search for a module id the modules existing in the current BOARD. - * @param aId = the key to identify the module to find: - * The reference or the full time stamp, according to m_UseTimeStamp - * @return the module found, or NULL. - */ - MODULE* FindModule( const wxString& aId ); - - /** - * Function SetPadNetName - * Update a pad netname using the current footprint - * from the netlist (line format: ( \ \ ) ) - * @param aText = current line read from netlist - */ - bool SetPadNetName( char* aText ); - - /** - * Function ReadOldFmtNetlistModuleDescr - * Read the full description of a footprint, from the netlist - * and update the corresponding module. - * @param aBuildList bool to switch between 2 modes: - * aBuildList = true: - * add module info added to m_newModulesList - * aBuildList = false: - * The module is searched in the board modules list - * @param aText contains the first line of description - * This function uses m_useFichCmp as a flag to know the footprint name: - * If true: component file *.cmp is used - * If false: the netlist only is used - * This flag is reset to false if the .cmp file is not found - * @return if aBuildList = true, a reference to the COMPONENT_INFO - * if aBuildList = false, a reference to the corresponding MODULE on board (NULL if not found) - */ - void* ReadOldFmtNetlistModuleDescr( char* aText, bool aBuildList ); - - /** - * Function loadNewModules - * Load from libraries new modules found in netlist and add them to the current Board. - * modules to load come from m_newModulesList - * @return false if a footprint is not found, true if all footprints are loaded - */ - bool loadNewModules(); - - /** - * function readModuleComponentLinkfile - * read the *.cmp file ( filename in m_cmplistFullName ) - * and initialize the m_Footprint member of each item in m_componentsInNetlist, - * when it is found in file, and with a non empty footprint value - * giving the equivalence between footprint names and components - * to find the footprint name corresponding to aCmpIdent - * @return true and the file can be read - */ - bool readModuleComponentLinkfile(); + // Useful for debug only: + const char* getTokenName( T aTok ) + { + return NETLIST_LEXER::TokenName( aTok ); + } }; -#endif // NETLIST_READER_H + +/** + * Class KICAD_NETLIST_READER + * read the new s-expression based KiCad netlist format. + */ +class KICAD_NETLIST_READER : public NETLIST_READER +{ + KICAD_NETLIST_PARSER* m_parser; ///< The s-expression format parser. + +public: + KICAD_NETLIST_READER( LINE_READER* aLineReader, + NETLIST* aNetlist, + CMP_READER* aFootprintLinkReader = NULL ) : + NETLIST_READER( aLineReader, aNetlist, aFootprintLinkReader ), + m_parser( new KICAD_NETLIST_PARSER( aLineReader, aNetlist ) ) + { + } + + virtual ~KICAD_NETLIST_READER() + { + if( m_parser ) + delete m_parser; + } + + virtual void LoadNetlist() throw ( IO_ERROR, PARSE_ERROR ); +}; + + +#endif // NETLIST_READER_H diff --git a/pcbnew/netlist_reader_common.cpp b/pcbnew/netlist_reader_common.cpp index 87acf9bf8c..7c563d4562 100644 --- a/pcbnew/netlist_reader_common.cpp +++ b/pcbnew/netlist_reader_common.cpp @@ -5,6 +5,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 1992-2011 Jean-Pierre Charras. + * Copyright (C) 2013 Wayne Stambaugh . * Copyright (C) 1992-2011 KiCad Developers, see change_log.txt for contributors. * * This program is free software; you can redistribute it and/or @@ -27,584 +28,392 @@ -#include -#include #include -#include - -#include -#include -#include +#include +#include #include +#include -#include +#include -/* - * Function ReadNetList - * The main function to detect the netlist format,and run the right netlist reader - * aFile = the already opened file (will be closed by the netlist reader) - */ -bool NETLIST_READER::ReadNetList( FILE* aFile ) -{ - // Try to determine the netlist type: - // Beginning of the first line of known formats, without spaces - #define HEADERS_COUNT 3 - #define HEADER_ORCADPCB "({EESchemaNetlist" - #define HEADER_PCBNEW "#EESchemaNetlist" - #define HEADER_KICAD_NETFMT "(export" - const std::string headers[HEADERS_COUNT] = - { - HEADER_ORCADPCB, HEADER_PCBNEW, HEADER_KICAD_NETFMT - }; - - int format = -1; - for ( int jj = 0; jj < HEADERS_COUNT; jj++ ) - { - int imax = headers[jj].size(); - int ii = 0; - for( ; ii < imax; ii++ ) - { - int data; - // Read header, and skip blanks to avoid errors if an header changes - do - { - data = fgetc( aFile ); - } while ( ( data == ' ' ) &&( EOF != data ) ) ; - - if( (int)headers[jj][ii] == data ) - continue; - break; - } - if( ii == imax ) // header found - { - format = jj; - break; - } - rewind( aFile ); - } - - rewind( aFile ); - bool success = false; - switch( format ) - { - case 0: - m_typeNetlist = NETLIST_TYPE_ORCADPCB2; - success = ReadOldFmtdNetList( aFile ); - break; - - case 1: - m_typeNetlist = NETLIST_TYPE_PCBNEW; - success = ReadOldFmtdNetList( aFile ); - break; - - case 2: - m_typeNetlist = NETLIST_TYPE_KICAD; - success = ReadKicadNetList( aFile ); - break; - - default: // Unrecognized format: - break; - - } - - return success; -} /** - * Function GetComponentInfoList - * @return a reference to the libpart info corresponding to a given part - * @param aPartname = the name of the libpart - */ -LIPBART_INFO* NETLIST_READER::GetLibpart(const wxString & aPartname) + * Function NestedSpace + * outputs nested space for pretty indenting. + * @param aNestLevel The nest count + * @param aReporter A reference to a #REPORTER object where to output. + * @return REPORTER& for continuation. + **/ +static REPORTER& NestedSpace( int aNestLevel, REPORTER& aReporter ) { - for( unsigned ii = 0; ii < m_libpartList.size(); ii++ ) - { - if( m_libpartList[ii]->m_Libpart == aPartname ) - return m_libpartList[ii]; - } + for( int i = 0; i < aNestLevel; ++i ) + aReporter.Report( wxT( " " ) ); - return NULL; + return aReporter; } -bool NETLIST_READER::InitializeModules() +#if defined(DEBUG) +void COMPONENT_NET::Show( int aNestLevel, REPORTER& aReporter ) { - if( m_UseCmpFile ) // Try to get footprint name from .cmp file - { - readModuleComponentLinkfile(); - } - - if( m_pcbframe == NULL ) - return true; - - for( unsigned ii = 0; ii < m_componentsInNetlist.size(); ii++ ) - { - COMPONENT_INFO* currcmp_info = m_componentsInNetlist[ii]; - // Test if module is already loaded. - wxString * idMod = m_UseTimeStamp? - &currcmp_info->m_TimeStamp : &currcmp_info->m_Reference; - - MODULE* module = FindModule( *idMod ); - if( module == NULL ) // not existing, load it - { - m_newModulesList.push_back( currcmp_info ); - } - } - - bool success = loadNewModules(); - - // Update modules fields - for( unsigned ii = 0; ii < m_componentsInNetlist.size(); ii++ ) - { - COMPONENT_INFO* currcmp_info = m_componentsInNetlist[ii]; - // Test if module is already loaded. - wxString * idMod = m_UseTimeStamp? - &currcmp_info->m_TimeStamp : &currcmp_info->m_Reference; - - MODULE* module = FindModule( *idMod ); - if( module ) - { - // Update current module ( reference, value and "Time Stamp") - module->SetReference( currcmp_info->m_Reference ); - module->SetValue(currcmp_info->m_Value ); - module->SetPath( currcmp_info->m_TimeStamp ); - } - else // not existing - { - } - } - - // clear pads netnames -#if 1 - // Clear only footprints found in netlist: - // This allow to have some footprints added by hand to the board - // left initialized - for( unsigned ii = 0; ii < m_componentsInNetlist.size(); ii++ ) - { - COMPONENT_INFO* currcmp_info = m_componentsInNetlist[ii]; - // We can used the reference to find the footprint, because - // it is now updated - wxString * idMod = &currcmp_info->m_Reference; - - MODULE* module = FindModule( *idMod ); - if( module ) - { - for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() ) - pad->SetNetname( wxEmptyString ); - } - } - -#else - // Clear all footprints - for( MODULE* module = m_pcbframe->GetBoard()->m_Modules; module; module = module->Next() ) - { - for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() ) - pad->SetNetname( wxEmptyString ); - } + NestedSpace( aNestLevel, aReporter ); + aReporter.Report( wxString::Format( wxT( "\n" ), + GetChars( m_pinName ), GetChars( m_netName ) ) ); +} #endif - return success; + +void COMPONENT::SetModule( MODULE* aModule ) +{ + m_footprint.reset( aModule ); + + if( aModule == NULL ) + return; + + aModule->SetReference( m_reference ); + aModule->SetValue( m_value ); + aModule->SetLibRef( m_footprintLibName ); + aModule->SetPath( m_timeStamp ); } -void NETLIST_READER::TestFootprintsMatchingAndExchange() + +COMPONENT_NET COMPONENT::m_emptyNet; + + +const COMPONENT_NET& COMPONENT::GetNet( const wxString& aPinName ) { -#ifdef PCBNEW - - // If a module is "exchanged", the new module is added to the end of - // module list. - - // Calculates the module count - int moduleCount = m_pcbframe->GetBoard()->m_Modules.GetCount(); - - MODULE* nextmodule; - MODULE *module = m_pcbframe->GetBoard()->m_Modules; - for( ; module && moduleCount; module = nextmodule, moduleCount-- ) + for( unsigned i = 0; i < m_nets.size(); i++ ) { - // Module can be deleted if exchanged, so store the next module. - nextmodule = module->Next(); + if( m_nets[i].GetPinName() == aPinName ) + return m_nets[i]; + } - // Search for the corresponding module info - COMPONENT_INFO * cmp_info = NULL; - for( unsigned ii = 0; ii < m_componentsInNetlist.size(); ii++ ) + return m_emptyNet; +} + + +#if defined(DEBUG) +void COMPONENT::Show( int aNestLevel, REPORTER& aReporter ) +{ + NestedSpace( aNestLevel, aReporter ); + aReporter.Report( wxT( "\n" ) ); + NestedSpace( aNestLevel+1, aReporter ); + aReporter.Report( wxString::Format( wxT( "\n" ), + GetChars( m_reference ), GetChars( m_value ), + GetChars( m_name ), GetChars( m_footprintLibName ), + GetChars( m_timeStamp ) ) ); + + if( !m_footprintFilters.IsEmpty() ) + { + NestedSpace( aNestLevel+1, aReporter ); + aReporter.Report( wxT( "\n" ) ); + + for( unsigned i = 0; i < m_footprintFilters.GetCount(); i++ ) { - COMPONENT_INFO * candidate = m_componentsInNetlist[ii]; - // Test if cmp_info matches the current module: - if( candidate->m_Reference.CmpNoCase( module->GetReference() ) == 0 ) - { - cmp_info = candidate; - break; - } + NestedSpace( aNestLevel+2, aReporter ); + aReporter.Report( wxString::Format( wxT( "<%s>\n" ), + GetChars( m_footprintFilters[i] ) ) ); } - if( cmp_info == NULL ) // not found in netlist - continue; + NestedSpace( aNestLevel+1, aReporter ); + aReporter.Report( wxT( "\n" ) ); + } - if( module->GetLibRef().CmpNoCase( cmp_info->m_Footprint ) != 0 ) + if( !m_nets.empty() ) + { + NestedSpace( aNestLevel+1, aReporter ); + aReporter.Report( wxT( "\n" ) ); + + for( unsigned i = 0; i < m_nets.size(); i++ ) + m_nets[i].Show( aNestLevel+3, aReporter ); + + NestedSpace( aNestLevel+1, aReporter ); + aReporter.Report( "\n" ); + } + + NestedSpace( aNestLevel, aReporter ); + aReporter.Report( "\n" ); +} +#endif + + +void NETLIST::AddComponent( COMPONENT* aComponent ) +{ + m_components.push_back( aComponent ); +} + + +COMPONENT* NETLIST::GetComponentByReference( const wxString& aReference ) +{ + COMPONENT* component = NULL; + + for( unsigned i = 0; i < m_components.size(); i++ ) + { + if( m_components[i].GetReference() == aReference ) { - if( m_ChangeFootprints ) // footprint exchange allowed. - { - MODULE* newModule = m_pcbframe->GetModuleLibrary( wxEmptyString, - cmp_info->m_Footprint, - false ); - - if( newModule ) - { - wxString msg; - msg.Printf( _( "Module ref %s, change footprint %s to %s\n" ), - GetChars( module->GetReference() ), - GetChars( module->GetLibRef() ), - GetChars( cmp_info->m_Footprint ) ); - m_messageWindow->AppendText( msg ); - // Change old module to the new module (and delete the old one) - m_pcbframe->Exchange_Module( module, newModule, NULL ); - } - else if( m_messageWindow ) - { - wxString msg; - msg.Printf( _( "Component %s: module %s not found\n" ), - GetChars( cmp_info->m_Reference ), - GetChars( cmp_info->m_Footprint ) ); - - m_messageWindow->AppendText( msg ); - } - } - else if( m_messageWindow ) - { - wxString msg; - msg.Printf( _( "Component %s: Mismatch! module is %s and netlist said %s\n" ), - GetChars( cmp_info->m_Reference ), - GetChars( module->GetLibRef() ), - GetChars( cmp_info->m_Footprint ) ); - - m_messageWindow->AppendText( msg ); - } + component = &m_components[i]; + break; } } -#endif + + return component; } + +COMPONENT* NETLIST::GetComponentByTimeStamp( const wxString& aTimeStamp ) +{ + COMPONENT* component = NULL; + + for( unsigned i = 0; i < m_components.size(); i++ ) + { + if( m_components[i].GetTimeStamp() == aTimeStamp ) + { + component = &m_components[i]; + break; + } + } + + return component; +} + + +COMPONENT* NETLIST::GetComponentByLibName( const wxString& aLibName ) +{ + COMPONENT* component = NULL; + + for( unsigned i = 0; i < m_components.size(); i++ ) + { + if( m_components[i].GetLibName() == aLibName ) + { + component = &m_components[i]; + break; + } + } + + return component; +} + + /** - * Function SetPadsNetName - * Update pads netnames for a given module. - * Because a pad name can be found more than once in this module, - * all pads matching the pad name are updated - * @param aModule = module reference - * @param aPadname = pad name (pad num) - * @param aNetname = new net name of the pad - * @param aPadList = a std::vector& buffer where the updated pads can be stored - * @return the pad count + * Function SortByLibName + * is a helper function used to sort the component list used by loadNewModules. */ -int NETLIST_READER::SetPadsNetName( const wxString & aModule, const wxString & aPadname, - const wxString & aNetname, std::vector & aPadList ) +static bool SortByLibName( const COMPONENT& ref, const COMPONENT& cmp ) { - if( m_pcbframe == NULL ) - return 0; - - int padcount = 0; - MODULE* module = m_pcbframe->GetBoard()->FindModuleByReference( aModule ); - - if( module ) - { - D_PAD * pad = module->FindPadByName( aPadname ); - - if( pad ) - { - padcount++; - aPadList.push_back( pad ); - pad->SetNetname( aNetname ); - // Search for other pads having the same pad name/num - for( D_PAD* curr_pad = pad->Next(); curr_pad; curr_pad = curr_pad->Next() ) - { - if( pad->PadNameEqual( curr_pad ) ) - { - padcount++; - aPadList.push_back( curr_pad ); - curr_pad->SetNetname( aNetname ); - } - } - return padcount; - } - - if( m_messageWindow ) - { - wxString msg; - msg.Printf( _( "Module %s: Pad %s not found" ), - GetChars( aModule ), GetChars( aPadname ) ); - m_messageWindow->AppendText( msg + wxT( "\n" ) ); - } - } - - return 0; + return ref.GetFootprintLibName().CmpNoCase( cmp.GetFootprintLibName() ) > 0; } -/* function RemoveExtraFootprints - * Remove (delete) not locked footprints found on board, but not in netlist - */ -void NETLIST_READER::RemoveExtraFootprints() +void NETLIST::SortByFootprintLibName() { - MODULE* nextModule; - MODULE* module = m_pcbframe->GetBoard()->m_Modules; + sort( m_components.begin(), m_components.end(), SortByLibName ); +} - for( ; module != NULL; module = nextModule ) + +/** + * Operator < + * compares two #COMPONENT objects by reference designator. + */ +bool operator < ( const COMPONENT& item1, const COMPONENT& item2 ) +{ + return StrNumCmp( item1.GetReference(), item2.GetReference(), INT_MAX, true ) < 0; +} + + +void NETLIST::SortByReference() +{ + sort( m_components.begin(), m_components.end() ); +} + + +#if defined( DEBUG ) +void NETLIST::Show( int aNestLevel, REPORTER& aReporter ) +{ + NestedSpace( aNestLevel, aReporter ); + aReporter.Report( "\n" ); + + if( !m_components.empty() ) { - unsigned ii; - nextModule = module->Next(); + NestedSpace( aNestLevel+1, aReporter ); + aReporter.Report( "\n" ); - if( module->IsLocked() ) - continue; - - for( ii = 0; ii < m_componentsInNetlist.size(); ii++ ) + for( unsigned i = 0; i < m_components.size(); i++ ) { - COMPONENT_INFO* cmp_info = m_componentsInNetlist[ii]; - - if( module->GetReference().CmpNoCase( cmp_info->m_Reference ) == 0 ) - break; // Module is found in net list. + m_components[i].Show( aNestLevel+2, aReporter ); } - if( ii == m_componentsInNetlist.size() ) // Module not found in netlist. - module->DeleteStructure(); + NestedSpace( aNestLevel+1, aReporter ); + + aReporter.Report( "\n" ); + } + + NestedSpace( aNestLevel, aReporter ); + aReporter.Report( "\n" ); +} +#endif + + +NETLIST_READER::~NETLIST_READER() +{ + if( m_lineReader ) + { + delete m_lineReader; + m_lineReader = NULL; + } + + if( m_footprintReader ) + { + delete m_footprintReader; + m_footprintReader = NULL; } } -/* Search for a module id the modules existing in the current BOARD. - * aId is a key to identify the module to find: - * The reference or the full time stamp, according to m_UseTimeStamp - * Returns the module is found, NULL otherwise. - */ -MODULE* NETLIST_READER::FindModule( const wxString& aId ) + +NETLIST_READER::NETLIST_FILE_T NETLIST_READER::GuessNetlistFileType( LINE_READER* aLineReader ) { - MODULE* module = m_pcbframe->GetBoard()->m_Modules; - for( ; module != NULL; module = module->Next() ) + wxRegEx reOrcad( wxT( "(?i)[ ]*\\({EESchema[ \t]+Netlist[ \t]+" ), wxRE_ADVANCED ); + wxASSERT( reOrcad.IsValid() ); + wxRegEx reLegacy( wxT( "(?i)#[ \t]+EESchema[ \t]+Netlist[ \t]+" ), wxRE_ADVANCED ); + wxASSERT( reLegacy.IsValid() ); + wxRegEx reKicad( wxT( "[ ]*\\(export[ ]+" ), wxRE_ADVANCED ); + wxASSERT( reKicad.IsValid() ); + + wxString line; + + while( aLineReader->ReadLine() ) { - if( m_UseTimeStamp ) // identification by time stamp - { - if( aId.CmpNoCase( module->GetPath() ) == 0 ) - return module; - } - else // identification by Reference - { - if( aId.CmpNoCase( module->GetReference() ) == 0 ) - return module; - } + line = FROM_UTF8( aLineReader->Line() ); + + if( reOrcad.Matches( line ) ) + return ORCAD; + else if( reLegacy.Matches( line ) ) + return LEGACY; + else if( reKicad.Matches( line ) ) + return KICAD; } - return NULL; + return UNKNOWN; } -/* - * function readModuleComponentLinkfile - * read the *.cmp file ( filename in m_cmplistFullName ) - * giving the equivalence Footprint_names / components - * to find the footprint name corresponding to aCmpIdent - * return true if the file can be read - * - * Sample file: - * - * Cmp-Mod V01 Genere by CvPcb 29/10/2003-13: 11:6 * - * BeginCmp - * TimeStamp = /32307DE2/AA450F67; - * Reference = C1; - * ValeurCmp = 47uF; - * IdModule = CP6; - * EndCmp - * - */ - -bool NETLIST_READER::readModuleComponentLinkfile() +NETLIST_READER* NETLIST_READER::GetNetlistReader( NETLIST* aNetlist, + const wxString& aNetlistFileName, + const wxString& aCompFootprintFileName ) + throw( IO_ERROR ) { - wxString refcurrcmp; // Stores value read from line like Reference = BUS1; - wxString timestamp; // Stores value read from line like TimeStamp = /32307DE2/AA450F67; - wxString footprint; // Stores value read from line like IdModule = CP6; + wxASSERT( aNetlist != NULL ); - FILE* cmpFile = wxFopen( m_cmplistFullName, wxT( "rt" ) ); + FILE* file = wxFopen( aNetlistFileName, wxT( "rt" ) ); - if( cmpFile == NULL ) + if( file == NULL ) { wxString msg; - msg.Printf( _( "File <%s> not found, use Netlist for footprints selection" ), - GetChars( m_cmplistFullName ) ); - - if( m_messageWindow ) - m_messageWindow->AppendText( msg ); - return false; + msg.Printf( _( "Cannot open file %s for reading." ), GetChars( aNetlistFileName ) ); + THROW_IO_ERROR( msg ); } - // netlineReader dtor will close cmpFile - FILE_LINE_READER netlineReader( cmpFile, m_cmplistFullName ); + FILE_LINE_READER* reader = new FILE_LINE_READER( file, aNetlistFileName ); + std::auto_ptr< FILE_LINE_READER > r( reader ); + + NETLIST_FILE_T type = GuessNetlistFileType( reader ); + reader->Rewind(); + + // The component footprint link reader is NULL if no file name was specified. + CMP_READER* cmpFileReader = NULL; + + if( !aCompFootprintFileName.IsEmpty() ) + { + cmpFileReader = new CMP_READER( new FILE_LINE_READER( aCompFootprintFileName ) ); + } + + switch( type ) + { + case LEGACY: + case ORCAD: + return new LEGACY_NETLIST_READER( r.release(), aNetlist, cmpFileReader ); + + case KICAD: + return new KICAD_NETLIST_READER( r.release(), aNetlist, cmpFileReader ); + + default: // Unrecognized format: + break; + + } + + return NULL; +} + + +void CMP_READER::Load( NETLIST* aNetlist ) throw( IO_ERROR, PARSE_ERROR ) +{ + wxCHECK_RET( aNetlist != NULL, wxT( "No netlist passed to CMP_READER::Load()" ) ); + + wxString reference; // Stores value read from line like Reference = BUS1; + wxString timestamp; // Stores value read from line like TimeStamp = /32307DE2/AA450F67; + wxString footprint; // Stores value read from line like IdModule = CP6; wxString buffer; wxString value; - while( netlineReader.ReadLine() ) - { - buffer = FROM_UTF8( netlineReader.Line() ); - if( ! buffer.StartsWith( wxT("BeginCmp") ) ) + while( m_lineReader->ReadLine() ) + { + buffer = FROM_UTF8( m_lineReader->Line() ); + + if( !buffer.StartsWith( wxT( "BeginCmp" ) ) ) continue; // Begin component description. - refcurrcmp.Empty(); + reference.Empty(); footprint.Empty(); timestamp.Empty(); - while( netlineReader.ReadLine() ) + while( m_lineReader->ReadLine() ) { - buffer = FROM_UTF8( netlineReader.Line() ); + buffer = FROM_UTF8( m_lineReader->Line() ); - if( buffer.StartsWith( wxT("EndCmp") ) ) + if( buffer.StartsWith( wxT( "EndCmp" ) ) ) break; // store string value, stored between '=' and ';' delimiters. value = buffer.AfterFirst( '=' ); - value = value.BeforeLast( ';'); - value.Trim(true); - value.Trim(false); + value = value.BeforeLast( ';' ); + value.Trim( true ); + value.Trim( false ); - if( buffer.StartsWith( wxT("Reference") ) ) + if( buffer.StartsWith( wxT( "Reference" ) ) ) { - refcurrcmp = value; + reference = value; continue; } - if( buffer.StartsWith( wxT("IdModule =" ) ) ) + if( buffer.StartsWith( wxT( "IdModule =" ) ) ) { footprint = value; continue; } - if( buffer.StartsWith( wxT("TimeStamp =" ) ) ) + if( buffer.StartsWith( wxT( "TimeStamp =" ) ) ) { timestamp = value; continue; } } - // Find the corresponding item in module info list: - for( unsigned ii = 0; ii < m_componentsInNetlist.size(); ii++ ) + // Find the corresponding item in component list: + COMPONENT* component = aNetlist->GetComponentByReference( reference ); + + // This cannot happen with a valid file. + if( component == NULL ) { - COMPONENT_INFO * cmp_info = m_componentsInNetlist[ii]; - if( m_UseTimeStamp ) // Use schematic timestamp to locate the footprint - { - if( cmp_info->m_TimeStamp.CmpNoCase( timestamp ) == 0 && - !timestamp.IsEmpty() ) - { // Found - if( !footprint.IsEmpty() ) - cmp_info->m_Footprint = footprint; - break; - } - } - else // Use schematic reference to locate the footprint - { - if( cmp_info->m_Reference.CmpNoCase( refcurrcmp ) == 0 ) // Found! - { - if( !footprint.IsEmpty() ) - cmp_info->m_Footprint = footprint; - break; - } - } + wxString msg; + msg.Printf( _( "Cannot find component \'%s\' in footprint assignment file." ), + GetChars( reference ) ); + THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), m_lineReader->Line(), + m_lineReader->LineNumber(), m_lineReader->Length() ); } + + component->SetFootprintLibName( footprint ); } - - return true; -} - - -/* Function to sort the footprint list, used by loadNewModules. - * the given list is sorted by name - */ -#ifdef PCBNEW -static bool SortByLibName( COMPONENT_INFO* ref, COMPONENT_INFO* cmp ) -{ - int ii = ref->m_Footprint.CmpNoCase( cmp->m_Footprint ); - return ii > 0; -} -#endif - -/* Load new modules from library. - * If a new module is already loaded it is duplicated, which avoid multiple - * unnecessary disk or net access to read libraries. - * return false if a footprint is not found, true if OK - */ -bool NETLIST_READER::loadNewModules() -{ - bool success = true; -#ifdef PCBNEW - COMPONENT_INFO* ref_info, * cmp_info; - MODULE* Module = NULL; - wxPoint ModuleBestPosition; - BOARD* pcb = m_pcbframe->GetBoard(); - - if( m_newModulesList.size() == 0 ) - return true; - - sort( m_newModulesList.begin(), m_newModulesList.end(), SortByLibName ); - - // Calculate the footprint "best" position: - EDA_RECT bbbox = pcb->ComputeBoundingBox( true ); - - if( bbbox.GetWidth() || bbbox.GetHeight() ) - { - ModuleBestPosition = bbbox.GetEnd(); - ModuleBestPosition.y += 5000; - } - - ref_info = cmp_info = m_newModulesList[0]; - - for( unsigned ii = 0; ii < m_newModulesList.size(); ii++ ) - { - cmp_info = m_newModulesList[ii]; - - if( (ii == 0) || ( ref_info->m_Footprint != cmp_info->m_Footprint) ) - { - // New footprint : must be loaded from a library - Module = m_pcbframe->GetModuleLibrary( wxEmptyString, - cmp_info->m_Footprint, false ); - ref_info = cmp_info; - - if( Module == NULL ) - { - success = false; - if( m_messageWindow ) - { - wxString msg; - msg.Printf( _( "Component %s: footprint %s not found" ), - GetChars( cmp_info->m_Reference ), - GetChars( cmp_info->m_Footprint ) ); - - msg += wxT("\n"); - m_messageWindow->AppendText( msg ); - } - continue; - } - - Module->SetPosition( ModuleBestPosition ); - - /* Update schematic links : reference "Time Stamp" and schematic - * hierarchical path */ - Module->SetReference( cmp_info->m_Reference ); - Module->SetTimeStamp( GetNewTimeStamp() ); - Module->SetPath( cmp_info->m_TimeStamp ); - } - else - { - // Footprint already loaded from a library, duplicate it (faster) - if( Module == NULL ) - continue; // Module does not exist in library. - - MODULE* newmodule = new MODULE( *Module ); - newmodule->SetParent( pcb ); - - pcb->Add( newmodule, ADD_APPEND ); - - Module = newmodule; - Module->SetReference( cmp_info->m_Reference ); - Module->SetTimeStamp( GetNewTimeStamp() ); - Module->SetPath( cmp_info->m_TimeStamp ); - } - } -#endif - return success; } diff --git a/pcbnew/netlist_reader_firstformat.cpp b/pcbnew/netlist_reader_firstformat.cpp index c98b1eb122..57a7ec7e75 100644 --- a/pcbnew/netlist_reader_firstformat.cpp +++ b/pcbnew/netlist_reader_firstformat.cpp @@ -6,6 +6,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 1992-2011 Jean-Pierre Charras. + * Copyright (C) 2013 Wayne Stambaugh . * Copyright (C) 1992-2011 KiCad Developers, see change_log.txt for contributors. * * This program is free software; you can redistribute it and/or @@ -26,67 +27,23 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ - -/* - * Netlist reader using the first format of pcbnew netlist. - * This netlist reader build the list of modules found in netlist - * (list in m_componentsInNetlist) - * and update pads netnames - */ - #include -#include -#include #include - -#include -#include -#include +#include #include -#include - -// constants used by ReadOldFmtNetlistModuleDescr(): -#define BUILDLIST true -#define READMODULE false -/* - * Function ReadOldFmtdNetList - * Update footprints (load missing footprints and delete on request extra - * footprints) - * Update References, values, "TIME STAMP" and connectivity data - * return true if Ok - * - * the format of the netlist is something like: - * # EESchema Netlist Version 1.0 generee le 18/5/2005-12:30:22 - * ( - * ( 40C08647 $noname R20 4,7K {Lib=R} - * ( 1 VCC ) - * ( 2 MODB_1 ) - * ) - * ( 40C0863F $noname R18 4,7_k {Lib=R} - * ( 1 VCC ) - * ( 2 MODA_1 ) - * ) - * } - * #End - */ -bool NETLIST_READER::ReadOldFmtdNetList( FILE* aFile ) + +void LEGACY_NETLIST_READER::LoadNetlist() throw ( IO_ERROR, PARSE_ERROR ) { - int state = 0; - bool is_comment = false; + int state = 0; + bool is_comment = false; + COMPONENT* component = NULL; - /* First, read the netlist: Build the list of footprints found in netlist - */ - - // netlineReader dtor will close aFile - FILE_LINE_READER netlineReader( aFile, m_netlistFullName ); - COMPONENT_INFO* curComponent = NULL; - - while( netlineReader.ReadLine() ) + while( m_lineReader->ReadLine() ) { - char* line = StrPurge( netlineReader.Line() ); + char* line = StrPurge( m_lineReader->Line() ); if( is_comment ) // Comments in progress { @@ -96,92 +53,17 @@ bool NETLIST_READER::ReadOldFmtdNetList( FILE* aFile ) is_comment = false; } + if( *line == '{' ) // Start Comment or Pcbnew info section { is_comment = true; - if( ReadLibpartSectionOpt() && state == 0 && - (strnicmp( line, "{ Allowed footprints", 20 ) == 0) ) + + if( m_loadFootprintFilters && state == 0 + && (strnicmp( line, "{ Allowed footprints", 20 ) == 0) ) { - ReadOldFmtFootprintFilterList( netlineReader ); + loadFootprintFilters(); continue; } - if( ( line = strchr( line, '}' ) ) == NULL ) - continue; - } - - if( *line == '(' ) - state++; - - if( *line == ')' ) - state--; - - if( state == 2 ) - { - curComponent = (COMPONENT_INFO*) ReadOldFmtNetlistModuleDescr( line, BUILDLIST ); - continue; - } - - if( state >= 3 ) // First pass: pad descriptions are not read here. - { - if( curComponent ) - curComponent->m_pinCount++; - - state--; - } - } - - if( IsCvPcbMode() ) - { - for( ; ; ) - { - /* Search the beginning of Allowed footprints section */ - - if( netlineReader.ReadLine( ) == 0 ) - break; - char* line = StrPurge( netlineReader.Line() ); - if( strnicmp( line, "{ Allowed footprints", 20 ) == 0 ) - { - ReadOldFmtFootprintFilterList( netlineReader ); - return true; - } - } - return true; - } - - if( BuildModuleListOnlyOpt() ) - return true; // at this point, the module list is read and built. - - // Load new footprints - bool success = InitializeModules(); - - if( !success ) - wxMessageBox( _( "Some footprints are not found in libraries" ) ); - - TestFootprintsMatchingAndExchange(); - - /* Second read , All footprints are on board. - * Update the schematic info (pad netnames) - */ - netlineReader.Rewind(); - m_currModule = NULL; - state = 0; - is_comment = false; - - while( netlineReader.ReadLine() ) - { - char* line = StrPurge( netlineReader.Line() ); - - if( is_comment ) // we are reading a comment - { - // Test for end of the current comment - if( ( line = strchr( line, '}' ) ) == NULL ) - continue; - is_comment = false; - } - - if( *line == '{' ) // this is the beginning of a comment - { - is_comment = true; if( ( line = strchr( line, '}' ) ) == NULL ) continue; @@ -195,190 +77,142 @@ bool NETLIST_READER::ReadOldFmtdNetList( FILE* aFile ) if( state == 2 ) { - m_currModule = (MODULE*) ReadOldFmtNetlistModuleDescr( line, READMODULE ); + component = loadComponent( line ); continue; } - if( state >= 3 ) + if( state >= 3 ) // Pad descriptions are read here. { - if( m_currModule ) - SetPadNetName( line ); + wxASSERT( component != NULL ); + + loadNet( line, component ); state--; } } - return true; + if( m_footprintReader ) + { + m_footprintReader->Load( m_netlist ); + } } -/* Function ReadOldFmtNetlistModuleDescr - * Read the beginning of a footprint description, from the netlist - * and add a module info to m_componentsInNetlist - * Analyze the first line of a component description in netlist like: - * ( /40C08647 $noname R20 4.7K {Lib=R} - * (1 VCC) - * (2 MODB_1) - * ) - */ -void* NETLIST_READER::ReadOldFmtNetlistModuleDescr( char* aText, bool aBuildList ) +COMPONENT* LEGACY_NETLIST_READER::loadComponent( char* aText ) throw( PARSE_ERROR ) { char* text; - wxString timeStampPath; // the full time stamp read from netlist - wxString footprintName; // the footprint name read from netlist - wxString cmpValue; // the component value read from netlist - wxString cmpReference; // the component schematic reference read from netlist - bool error = false; + wxString msg; + wxString timeStamp; // the full time stamp read from netlist + wxString name; // the component name read from netlist + wxString value; // the component value read from netlist + wxString reference; // the component schematic reference designator read from netlist char line[1024]; strcpy( line, aText ); - cmpValue = wxT( "~" ); + value = wxT( "~" ); - // Read descr line like /40C08647 $noname R20 4.7K {Lib=R} + // Sample component line: /40C08647 $noname R20 4.7K {Lib=R} // Read time stamp (first word) if( ( text = strtok( line, " ()\t\n" ) ) == NULL ) - error = true; - else - timeStampPath = FROM_UTF8( text ); + { + msg = _( "Cannot parse time stamp in component section of netlist." ); + THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), line, m_lineReader->LineNumber(), + m_lineReader->Length() ); + } + + timeStamp = FROM_UTF8( text ); // Read footprint name (second word) if( ( text = strtok( NULL, " ()\t\n" ) ) == NULL ) - error = true; - else - footprintName = FROM_UTF8( text ); + { + msg = _( "Cannot parse name in component section of netlist." ); + THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), aText, m_lineReader->LineNumber(), + m_lineReader->Length() ); + } - // Read schematic reference (third word) + name = FROM_UTF8( text ); + + // Read schematic reference designator (third word) if( ( text = strtok( NULL, " ()\t\n" ) ) == NULL ) - error = true; - else - cmpReference = FROM_UTF8( text ); + { + msg = _( "Cannot parse reference designator in component section of netlist." ); + THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), aText, m_lineReader->LineNumber(), + m_lineReader->Length() ); + } + + reference = FROM_UTF8( text ); // Read schematic value (forth word) if( ( text = strtok( NULL, " ()\t\n" ) ) == NULL ) - error = true; - else - cmpValue = FROM_UTF8( text ); - - if( error ) - return NULL; - - if( aBuildList ) { - COMPONENT_INFO* cmp_info = new COMPONENT_INFO( footprintName, cmpReference, - cmpValue, timeStampPath ); - AddModuleInfo( cmp_info ); - return cmp_info; + msg = _( "Cannot parse value in component section of netlist." ); + THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), aText, m_lineReader->LineNumber(), + m_lineReader->Length() ); } - // search the module loaded on board - // reference and time stamps are already updated so we can use search by reference only - MODULE* module = m_pcbframe->GetBoard()->FindModuleByReference( cmpReference ); - if( module == NULL ) - { - if( m_messageWindow ) - { - wxString msg; - msg.Printf( _( "Component %s not found" ), GetChars( cmpReference ) ); - m_messageWindow->AppendText( msg + wxT( "\n" ) ); - } - } + value = FROM_UTF8( text ); - return module; + COMPONENT* component = new COMPONENT( name, reference, value, timeStamp ); + m_netlist->AddComponent( component ); + return component; } -/* - * Function SetPadNetName - * Update a pad netname using the current footprint - * Line format: ( = ) - * Param aText = current line read from netlist - */ -bool NETLIST_READER::SetPadNetName( char* aText ) +void LEGACY_NETLIST_READER::loadNet( char* aText, COMPONENT* aComponent ) throw( PARSE_ERROR ) { - char* p; - char line[256]; + wxString msg; + char* p; + char line[256]; - if( m_currModule == NULL ) - return false; - - strncpy( line, aText, sizeof(line) ); + strncpy( line, aText, sizeof( line ) ); if( ( p = strtok( line, " ()\t\n" ) ) == NULL ) - return false; + { + msg = _( "Cannot parse pin name in component net section of netlist." ); + THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), line, m_lineReader->LineNumber(), + m_lineReader->Length() ); + } wxString pinName = FROM_UTF8( p ); if( ( p = strtok( NULL, " ()\t\n" ) ) == NULL ) - return false; + { + msg = _( "Cannot parse net name in component net section of netlist." ); + THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), line, m_lineReader->LineNumber(), + m_lineReader->Length() ); + } wxString netName = FROM_UTF8( p ); - bool found = false; - for( D_PAD* pad = m_currModule->Pads(); pad; pad = pad->Next() ) - { - wxString padName = pad->GetPadName(); + if( (char) netName[0] == '?' ) // ? indicates no net connected to pin. + netName = wxEmptyString; - if( padName == pinName ) - { - found = true; - if( (char) netName[0] != '?' ) - pad->SetNetname( netName ); - else - pad->SetNetname( wxEmptyString ); - } - } - - if( !found ) - { - if( m_messageWindow ) - { - wxString msg; - msg.Printf( _( "Module %s: Pad %s not found" ), - GetChars( m_currModule->GetReference() ), - GetChars( pinName ) ); - m_messageWindow->AppendText( msg + wxT( "\n" ) ); - } - } - - return found; + aComponent->AddNet( pinName, netName ); } -/* - * Read the section "Allowed footprints" like: - * { Allowed footprints by component: - * $component R11 - * R? - * SM0603 - * SM0805 - * R?-* - * SM1206 - * $endlist - * $endfootprintlist - * } - * - * And add the strings giving the footprint filter to m_FootprintFilter - * of the corresponding module info - * This section is used by CvPcb, and is not useful in Pcbnew, - * therefore it it not always read - */ -bool NETLIST_READER::ReadOldFmtFootprintFilterList( FILE_LINE_READER& aNetlistReader ) +void LEGACY_NETLIST_READER::loadFootprintFilters() throw( IO_ERROR, PARSE_ERROR ) { - wxString cmpRef; - COMPONENT_INFO* cmp_info = NULL; - char* line; + wxArrayString filters; + wxString cmpRef; + char* line; + COMPONENT* component; - while( ( line = aNetlistReader.ReadLine() ) != NULL ) + while( ( line = m_lineReader->ReadLine() ) != NULL ) { - if( strnicmp( line, "$endlist", 8 ) == 0 ) // end of list for the current component + if( strnicmp( line, "$endlist", 8 ) == 0 ) // end of list for the current component { - cmp_info = NULL; + wxASSERT( component != NULL ); + component->SetFootprintFilters( filters ); + component = NULL; + filters.Clear(); continue; } + if( strnicmp( line, "$endfootprintlist", 4 ) == 0 ) // End of this section - return 0; + return; if( strnicmp( line, "$component", 10 ) == 0 ) // New component reference found { @@ -386,25 +220,25 @@ bool NETLIST_READER::ReadOldFmtFootprintFilterList( FILE_LINE_READER& aNetlistR cmpRef.Trim( true ); cmpRef.Trim( false ); - // Search the current component in module info list: - BOOST_FOREACH( COMPONENT_INFO * &component, m_componentsInNetlist ) + component = m_netlist->GetComponentByReference( cmpRef ); + + // Cannot happen if the netlist is valid. + if( component == NULL ) { - if( component->m_Reference == cmpRef ) - { - cmp_info = component; - break; - } + wxString msg; + msg.Printf( _( "Cannot find component \'%s\' in footprint filter section " + "of netlist." ), GetChars( cmpRef ) ); + THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), line, m_lineReader->LineNumber(), + m_lineReader->Length() ); } } - else if( cmp_info ) + else { // Add new filter to list wxString fp = FROM_UTF8( line + 1 ); fp.Trim( false ); fp.Trim( true ); - cmp_info->m_FootprintFilter.Add( fp ); + filters.Add( fp ); } } - - return true; } diff --git a/pcbnew/netlist_reader_kicad.cpp b/pcbnew/netlist_reader_kicad.cpp index 6b7de75230..424d7cb963 100644 --- a/pcbnew/netlist_reader_kicad.cpp +++ b/pcbnew/netlist_reader_kicad.cpp @@ -27,142 +27,50 @@ #include #include // netlist_lexer is common to Eeschema and Pcbnew +#include #include using namespace NL_T; -/** - * Class PCB_PLOT_PARAMS_PARSER - * is the parser class for PCB_PLOT_PARAMS. - */ -class NETLIST_READER_KICAD_PARSER : public NETLIST_LEXER + +void KICAD_NETLIST_READER::LoadNetlist() throw ( IO_ERROR, PARSE_ERROR ) { -private: - T token; - NETLIST_READER * netlist_reader; + m_parser->Parse(); -public: - NETLIST_READER_KICAD_PARSER( FILE_LINE_READER* aReader, NETLIST_READER *aNetlistReader ); - - /** - * Function Parse - * parse the full netlist - */ - void Parse( BOARD * aBrd ) throw( IO_ERROR, PARSE_ERROR ); - - /** - * Function ParseComp - * parse the comp description like - * (comp (ref P1) - * (value DB25FEMELLE) - * (footprint DB25FC) - * (libsource (lib conn) (part DB25)) - * (sheetpath (names /) (tstamps /)) - * (tstamp 3256759C)) - */ - COMPONENT_INFO* ParseComp() throw( IO_ERROR, PARSE_ERROR ); - - - /** - * Function ParseKicadLibpartList - * Read the section "libparts" like: - * (libparts - * (libpart (lib device) (part C) - * (description "Condensateur non polarise") - * (footprints - * (fp SM*) - * (fp C?) - * (fp C1-1)) - * (fields - * (field (name Reference) C) - * (field (name Value) C)) - * (pins - * (pin (num 1) (name ~) (type passive)) - * (pin (num 2) (name ~) (type passive)))) - * - * And add the strings giving the footprint filter (subsection footprints) - * of the corresponding module info - *

This section is used by CvPcb, and is not useful in Pcbnew, - * therefore it it not always read

- */ - void ParseKicadLibpartList() throw( IO_ERROR, PARSE_ERROR ); - - /** - * Function ParseNet - * Parses a section like - * (net (code 20) (name /PC-A0) - * (node (ref BUS1) (pin 62)) - * (node (ref U3) (pin 3)) - * (node (ref U9) (pin M6))) - * - * and set the corresponfings pads netnames - */ - void ParseNet( BOARD * aBrd ) throw( IO_ERROR, PARSE_ERROR ); - - /** - * Function SkipCurrent - * Skip the current token level, i.e - * search for the RIGHT parenthesis which closes the current description - */ - void SkipCurrent() throw( IO_ERROR, PARSE_ERROR ); - - // Useful for debug only: - const char* getTokenName( T aTok ) + if( m_footprintReader ) { - return NETLIST_LEXER::TokenName( aTok ); + m_footprintReader->Load( m_netlist ); + + // Sort the component pins so they are in the same order as the legacy format. This + // is useful for comparing legacy and s-expression netlist dumps. + for( unsigned i = 0; i < m_netlist->GetCount(); i++ ) + m_netlist->GetComponent( i )->SortPins(); } -}; - - -bool NETLIST_READER::ReadKicadNetList( FILE* aFile ) -{ - BOARD * brd = m_pcbframe ? m_pcbframe->GetBoard() : NULL; - - // netlineReader dtor will close aFile - FILE_LINE_READER netlineReader( aFile, m_netlistFullName ); - NETLIST_READER_KICAD_PARSER netlist_parser( &netlineReader, this ); - - try - { - netlist_parser.Parse( brd ); - } - catch( IO_ERROR& ioe ) - { - ioe.errorText += '\n'; - ioe.errorText += _("Netlist error."); - - wxMessageBox( ioe.errorText ); - return false; - } - - return true; } - -// NETLIST_READER_KICAD_PARSER -NETLIST_READER_KICAD_PARSER::NETLIST_READER_KICAD_PARSER( FILE_LINE_READER* aReader, - NETLIST_READER *aNetlistReader ) : +// KICAD_NETLIST_PARSER +KICAD_NETLIST_PARSER::KICAD_NETLIST_PARSER( LINE_READER* aReader, NETLIST* aNetlist ) : NETLIST_LEXER( aReader ) { - netlist_reader = aNetlistReader; + m_lineReader = aReader; + m_netlist = aNetlist; } -/** - * Function SkipCurrent - * Skip the current token level, i.e - * search for the RIGHT parenthesis which closes the current description - */ -void NETLIST_READER_KICAD_PARSER::SkipCurrent() throw( IO_ERROR, PARSE_ERROR ) + +void KICAD_NETLIST_PARSER::skipCurrent() throw( IO_ERROR, PARSE_ERROR ) { int curr_level = 0; + while( ( token = NextTok() ) != T_EOF ) { if( token == T_LEFT ) curr_level--; + if( token == T_RIGHT ) { curr_level++; + if( curr_level > 0 ) return; } @@ -170,9 +78,10 @@ void NETLIST_READER_KICAD_PARSER::SkipCurrent() throw( IO_ERROR, PARSE_ERROR ) } -void NETLIST_READER_KICAD_PARSER::Parse( BOARD * aBrd ) - throw( IO_ERROR, PARSE_ERROR ) +void KICAD_NETLIST_PARSER::Parse() throw( IO_ERROR, PARSE_ERROR ) { + wxString text; + int plevel = 0; // the count of ')' to read and end of file, // after parsing all sections @@ -183,98 +92,91 @@ void NETLIST_READER_KICAD_PARSER::Parse( BOARD * aBrd ) switch( token ) { - case T_export: // The netlist starts here. - // nothing to do here, - // just increment the count of ')' to read and end of file - plevel++; - break; + case T_export: // The netlist starts here. + // nothing to do here, + // just increment the count of ')' to read and end of file + plevel++; + break; - case T_version: // The netlist starts here. - // version id not yet used: read it but does not use it - NextTok(); - NeedRIGHT(); - break; + case T_version: // The netlist starts here. + // version id not yet used: read it but does not use it + NextTok(); + NeedRIGHT(); + break; - case T_components: // The section comp starts here. - while( ( token = NextTok() ) != T_RIGHT ) + case T_components: // The section comp starts here. + while( ( token = NextTok() ) != T_RIGHT ) + { + if( token == T_LEFT ) + token = NextTok(); + + if( token == T_comp ) // A component section found. Read it + parseComponent(); + } + + break; + + case T_nets: // The section nets starts here. + while( ( token = NextTok() ) != T_RIGHT ) + { + if( token == T_LEFT ) + token = NextTok(); + + if( token == T_net ) { - if( token == T_LEFT ) - token = NextTok(); - if( token == T_comp ) // A comp section if found. Read it - { - COMPONENT_INFO* cmp_info = ParseComp(); - netlist_reader->AddModuleInfo( cmp_info ); - } + // A net section if found. Read it + parseNet(); } - if( netlist_reader->BuildModuleListOnlyOpt() ) - return; // at this point, the module list is read and built. - // Load new footprints - netlist_reader->InitializeModules(); - netlist_reader->TestFootprintsMatchingAndExchange(); - break; + } - case T_nets: // The section nets starts here. - while( ( token = NextTok() ) != T_RIGHT ) + break; + + case T_libparts: // The section libparts starts here. + while( ( token = NextTok() ) != T_RIGHT ) + { + if( token == T_LEFT ) + token = NextTok(); + + if( token == T_libpart ) { - if( token == T_LEFT ) - token = NextTok(); - if( token == T_net ) - { - // A net section if found. Read it - ParseNet( aBrd ); - } + // A libpart section if found. Read it + parseLibPartList(); } - break; + } - case T_libparts: // The section libparts starts here. - if( netlist_reader->ReadLibpartSectionOpt() ) - { - while( ( token = NextTok() ) != T_RIGHT ) - { - if( token == T_LEFT ) - token = NextTok(); - if( token == T_libpart ) - { - // A libpart section if found. Read it - ParseKicadLibpartList(); - } - } - } - else - SkipCurrent(); - break; + break; - case T_libraries: // The section libraries starts here. - // List of libraries in use. - // Not used here, just skip it - SkipCurrent(); - break; + case T_libraries: // The section libraries starts here. + // List of libraries in use. + // Not used here, just skip it + skipCurrent(); + break; - case T_design: // The section design starts here. - // Not used (mainly thet are comments), just skip it - SkipCurrent(); - break; + case T_design: // The section design starts here. + // Not used (mainly they are comments), just skip it + skipCurrent(); + break; - case T_RIGHT: // The closing parenthesis of the file. - // Not used (mainly thet are comments), just skip it - plevel--; - break; + case T_RIGHT: // The closing parenthesis of the file. + // Not used (mainly they are comments), just skip it + plevel--; + break; - default: - SkipCurrent(); - break; + default: + skipCurrent(); + break; } } if( plevel != 0 ) { - wxLogDebug(wxT("NETLIST_READER_KICAD_PARSER::Parse(): bad parenthesis count (count = %d"), + wxLogDebug( wxT( "KICAD_NETLIST_PARSER::Parse(): bad parenthesis count (count = %d"), plevel ); } } -void NETLIST_READER_KICAD_PARSER::ParseNet( BOARD * aBrd ) - throw( IO_ERROR, PARSE_ERROR ) + +void KICAD_NETLIST_PARSER::parseNet() throw( IO_ERROR, PARSE_ERROR ) { /* Parses a section like * (net (code 20) (name /PC-A0) @@ -283,32 +185,35 @@ void NETLIST_READER_KICAD_PARSER::ParseNet( BOARD * aBrd ) * (node (ref U9) (pin M6))) */ - wxString code; - wxString name; - wxString cmpref; - wxString pin; - int nodecount = 0; - std::vector padList; + COMPONENT* component = NULL; + wxString code; + wxString name; + wxString reference; + wxString pin; + int nodecount = 0; // The token net was read, so the next data is (code ) while( (token = NextTok()) != T_RIGHT ) { if( token == T_LEFT ) token = NextTok(); + switch( token ) { case T_code: NeedSYMBOLorNUMBER(); code = FROM_UTF8( CurText() ); NeedRIGHT(); - break; + break; case T_name: NeedSYMBOLorNUMBER(); name = FROM_UTF8( CurText() ); NeedRIGHT(); + if( name.IsEmpty() ) // Give a dummy net name like N-000109 name = wxT("N-00000") + code; + break; case T_node: @@ -316,11 +221,12 @@ void NETLIST_READER_KICAD_PARSER::ParseNet( BOARD * aBrd ) { if( token == T_LEFT ) token = NextTok(); + switch( token ) { case T_ref: NeedSYMBOLorNUMBER(); - cmpref = FROM_UTF8( CurText() ); + reference = FROM_UTF8( CurText() ); NeedRIGHT(); break; @@ -331,31 +237,37 @@ void NETLIST_READER_KICAD_PARSER::ParseNet( BOARD * aBrd ) break; default: - SkipCurrent(); + skipCurrent(); break; } } - netlist_reader->SetPadsNetName( cmpref, pin, name, padList ); + + + component = m_netlist->GetComponentByReference( reference ); + + // Cannot happen if the netlist is valid. + if( component == NULL ) + { + wxString msg; + msg.Printf( _( "Cannot find component with reference \"%s\" in netlist." ), + GetChars( reference ) ); + THROW_PARSE_ERROR( msg, m_lineReader->GetSource(), m_lineReader->Line(), + m_lineReader->LineNumber(), m_lineReader->Length() ); + } + + component->AddNet( pin, name ); nodecount++; break; default: - SkipCurrent(); + skipCurrent(); break; } } - - // When there is only one item in net, clear pad netname - // Remember one can have more than one pad in list, because a footprint - // can have many pads with the same pad name - if( nodecount < 2 ) - for( unsigned ii = 0; ii < padList.size(); ii++ ) - padList[ii]->SetNetname( wxEmptyString ); } -COMPONENT_INFO* NETLIST_READER_KICAD_PARSER::ParseComp() - throw( IO_ERROR, PARSE_ERROR ) +void KICAD_NETLIST_PARSER::parseComponent() throw( IO_ERROR, PARSE_ERROR ) { /* Parses a section like * (comp (ref P1) @@ -366,13 +278,14 @@ COMPONENT_INFO* NETLIST_READER_KICAD_PARSER::ParseComp() * (tstamp 3256759C)) * * other fields (unused) are skipped - * A component need a reference, value, foorprint name and a full time stamp + * A component need a reference, value, footprint name and a full time stamp * The full time stamp is the sheetpath time stamp + the component time stamp */ wxString ref; wxString value; - wxString footprint; - wxString libpart; + wxString componentName; + wxString libPartName; + wxString libName; wxString pathtimestamp, timestamp; // The token comp was read, so the next data is (ref P1) @@ -380,6 +293,7 @@ COMPONENT_INFO* NETLIST_READER_KICAD_PARSER::ParseComp() { if( token == T_LEFT ) token = NextTok(); + switch( token ) { case T_ref: @@ -396,7 +310,7 @@ COMPONENT_INFO* NETLIST_READER_KICAD_PARSER::ParseComp() case T_footprint: NeedSYMBOLorNUMBER(); - footprint = FROM_UTF8( CurText() ); + componentName = FROM_UTF8( CurText() ); NeedRIGHT(); break; @@ -406,14 +320,23 @@ COMPONENT_INFO* NETLIST_READER_KICAD_PARSER::ParseComp() { if( token == T_LEFT ) token = NextTok(); - if( token == T_part ) + + if( token == T_lib ) { NeedSYMBOLorNUMBER(); - libpart = FROM_UTF8( CurText() ); + libName = FROM_UTF8( CurText() ); + NeedRIGHT(); + } + else if( token == T_part ) + { + NeedSYMBOLorNUMBER(); + libPartName = FROM_UTF8( CurText() ); NeedRIGHT(); } else - SkipCurrent(); + { + Expecting( "part or lib" ); + } } break; @@ -433,95 +356,92 @@ COMPONENT_INFO* NETLIST_READER_KICAD_PARSER::ParseComp() default: // Skip not used data (i.e all other tokens) - SkipCurrent(); + skipCurrent(); break; } } - pathtimestamp += timestamp; - COMPONENT_INFO* cmp_info = new COMPONENT_INFO( footprint, ref, value, pathtimestamp ); - cmp_info->m_Libpart = libpart; - return cmp_info; + pathtimestamp += timestamp; + COMPONENT* component = new COMPONENT( componentName, ref, value, pathtimestamp ); + component->SetLibrarySource( libName, libPartName ); + m_netlist->AddComponent( component ); } -/* Read the section "libparts" like: - * (libparts - * (libpart (lib device) (part C) - * (description "Condensateur non polarise") - * (footprints - * (fp SM*) - * (fp C?) - * (fp C1-1)) - * (fields - * (field (name Reference) C) - * (field (name Value) C)) - * (pins - * (pin (num 1) (name ~) (type passive)) - * (pin (num 2) (name ~) (type passive)))) - * - * And add the strings giving the footprint filter (subsection footprints) - * of the corresponding module info - */ -void NETLIST_READER_KICAD_PARSER::ParseKicadLibpartList() throw( IO_ERROR, PARSE_ERROR ) + +void KICAD_NETLIST_PARSER::parseLibPartList() throw( IO_ERROR, PARSE_ERROR ) { /* Parses a section like - * (libpart (lib device) (part C) - * (description "Condensateur non polarise") - * (footprints - * (fp SM*) - * (fp C?) - * (fp C1-1)) - * (fields - * (field (name Reference) C) - * (field (name Value) C)) - * (pins - * (pin (num 1) (name ~) (type passive)) - * (pin (num 2) (name ~) (type passive)))) - * - * Currently footprints section/fp are read and data stored - * other fields (unused) are skipped - */ - wxString device; - wxString filter; - LIPBART_INFO* libpart_info = NULL; + * (libpart (lib device) (part C) + * (description "Condensateur non polarise") + * (footprints + * (fp SM*) + * (fp C?) + * (fp C1-1)) + * (fields + * (field (name Reference) C) + * (field (name Value) C)) + * (pins + * (pin (num 1) (name ~) (type passive)) + * (pin (num 2) (name ~) (type passive)))) + * + * Currently footprints section/fp are read and data stored + * other fields (unused) are skipped + */ + COMPONENT* component = NULL; + wxString libName; + wxString libPartName; + wxArrayString footprintFilters; // The last token read was libpart, so read the next token while( (token = NextTok()) != T_RIGHT ) { if( token == T_LEFT ) token = NextTok(); + switch( token ) { + case T_lib: + NeedSYMBOLorNUMBER(); + libName = FROM_UTF8( CurText() ); + NeedRIGHT(); + break; + case T_part: NeedSYMBOLorNUMBER(); - device = FROM_UTF8( CurText() ); + libPartName = FROM_UTF8( CurText() ); NeedRIGHT(); - libpart_info = new LIPBART_INFO( device ); - netlist_reader->AddLibpartInfo( libpart_info ); break; case T_footprints: - // Ensure "(part C)" was already read - if( libpart_info == NULL ) - Expecting( T_part ); // Read all fp elements (footprint filter item) while( (token = NextTok()) != T_RIGHT ) { if( token == T_LEFT ) token = NextTok(); + if( token != T_fp ) Expecting( T_fp ); + NeedSYMBOLorNUMBER(); - filter = FROM_UTF8( CurText() ); + footprintFilters.Add( FROM_UTF8( CurText() ) ); NeedRIGHT(); - libpart_info->m_FootprintFilter.Add( filter ); } + break; default: // Skip not used data (i.e all other tokens) - SkipCurrent(); + skipCurrent(); break; } } + + // Find all of the components that reference this component library part definition. + for( unsigned i = 0; i < m_netlist->GetCount(); i++ ) + { + component = m_netlist->GetComponent( i ); + + if( component->IsLibSource( libName, libPartName ) ) + component->SetFootprintFilters( footprintFilters ); + } }