Commit 7d788109 authored by Maciej Suminski's avatar Maciej Suminski

Merged upstream

parents 07a5774a ab36d235
......@@ -459,11 +459,6 @@ add_custom_target( uninstall
# Installation
#================================================
add_custom_target( install_user_configuration_files
"${CMAKE_COMMAND}" -E copy "${PROJECT_SOURCE_DIR}/template/fp-lib-table" ${KICAD_USER_CONFIG_DIR}/
COMMENT "Install template fp-lib-table into your home directory."
)
install( FILES INSTALL.txt
DESTINATION ${KICAD_DOCS}
COMPONENT resources )
......@@ -534,10 +529,6 @@ if( UNIX AND NOT APPLE )
#set( CPACK_PACKAGE_CONTACT Firstname Lastname <email@company.com> )
set( CPACK_PACKAGE_DESCRIPTION_SUMMARY "KiCad built by CMake build system." )
# Tell debian CPack about all files which are configuration files
add_conffiles() # clear file
add_conffiles( ${KICAD_USER_CONFIG_DIR}/fp-lib-table ) # append to it
include( CPack )
endif()
/*
* 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) 2007 Jean-Pierre Charras, jp.charras at wanadoo.fr
* Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
* Copyright (C) 1992-2013 KiCad Developers, see AUTHORS.txt for contributors.
*
* This program is free software; you can redistribute it and/or
......@@ -201,9 +202,9 @@ void EDA_LIST_DIALOG::InsertItems( const std::vector< wxArrayString >& itemList,
{
wxASSERT( (int) itemList[row].GetCount() == m_listBox->GetColumnCount() );
long itemIndex = 0;
for( unsigned col = 0; col < itemList[row].GetCount(); col++ )
{
long itemIndex = 0;
if( col == 0 )
{
......
......@@ -265,8 +265,38 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset,
{
if( m_MultilineAllowed )
{
std::vector<wxPoint> positions;
wxArrayString* list = wxStringSplit( m_Text, '\n' );
positions.reserve( list->Count() );
GetPositionsOfLinesOfMultilineText(positions, list->Count() );
for( unsigned ii = 0; ii < list->Count(); ii++ )
{
wxString& txt = list->Item( ii );
drawOneLineOfText( aClipBox, aDC, aOffset, aColor,
aDrawMode, aFillMode, txt, positions[ii] );
}
delete (list);
}
else
drawOneLineOfText( aClipBox, aDC, aOffset, aColor,
aDrawMode, aFillMode, m_Text, m_Pos );
// Draw text anchor, if requested
if( aAnchor_color != UNSPECIFIED_COLOR )
{
GRDrawAnchor( aClipBox, aDC,
m_Pos.x + aOffset.x, m_Pos.y + aOffset.y,
DIM_ANCRE_TEXTE, aAnchor_color );
}
}
void EDA_TEXT::GetPositionsOfLinesOfMultilineText(
std::vector<wxPoint>& aPositions, int aLineCount )
{
wxPoint pos = m_Pos; // Position of first line of the
// multiline text according to
// the center of the multiline text block
......@@ -276,7 +306,7 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset,
offset.y = GetInterline();
#ifdef FIX_MULTILINE_VERT_JUSTIF
if( list->Count() > 1 )
if( aLineCount > 1 )
{
switch( m_VJustify )
{
......@@ -284,11 +314,11 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset,
break;
case GR_TEXT_VJUSTIFY_CENTER:
pos.y -= ( list->Count() - 1 ) * offset.y / 2;
pos.y -= ( aLineCount - 1 ) * offset.y / 2;
break;
case GR_TEXT_VJUSTIFY_BOTTOM:
pos.y -= ( list->Count() - 1 ) * offset.y;
pos.y -= ( aLineCount - 1 ) * offset.y;
break;
}
}
......@@ -300,30 +330,13 @@ void EDA_TEXT::Draw( EDA_RECT* aClipBox, wxDC* aDC, const wxPoint& aOffset,
// Rotate the offset lines to increase happened in the right direction
RotatePoint( &offset, m_Orient );
for( unsigned i = 0; i<list->Count(); i++ )
for( int ii = 0; ii < aLineCount; ii++ )
{
wxString txt = list->Item( i );
drawOneLineOfText( aClipBox, aDC, aOffset, aColor,
aDrawMode, aFillMode, txt, pos );
aPositions.push_back( pos );
pos += offset;
}
delete (list);
}
else
drawOneLineOfText( aClipBox, aDC, aOffset, aColor,
aDrawMode, aFillMode, m_Text, m_Pos );
// Draw text anchor, if requested
if( aAnchor_color != UNSPECIFIED_COLOR )
{
GRDrawAnchor( aClipBox, aDC,
m_Pos.x + aOffset.x, m_Pos.y + aOffset.y,
DIM_ANCRE_TEXTE, aAnchor_color );
}
}
void EDA_TEXT::drawOneLineOfText( EDA_RECT* aClipBox, wxDC* aDC,
const wxPoint& aOffset, EDA_COLOR_T aColor,
GR_DRAWMODE aDrawMode, EDA_DRAW_MODE_T aFillMode,
......
......@@ -189,7 +189,7 @@ void GPU_CACHED_MANAGER::uploadToGpu()
{
#ifdef __WXDEBUG__
prof_counter totalTime;
prof_start( &totalTime, false );
prof_start( &totalTime );
#endif /* __WXDEBUG__ */
if( !m_buffersInitialized )
......@@ -214,8 +214,7 @@ void GPU_CACHED_MANAGER::uploadToGpu()
#ifdef __WXDEBUG__
prof_end( &totalTime );
wxLogDebug( wxT( "Uploading %d vertices to GPU / %.1f ms" ),
bufferSize, (double) totalTime.value / 1000.0 );
wxLogDebug( wxT( "Uploading %d vertices to GPU / %.1f ms" ), bufferSize, totalTime.msecs() );
#endif /* __WXDEBUG__ */
}
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 CERN
* @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
*
* 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 profile.h:
* @brief Simple profiling functions for measuring code execution time.
*/
#ifndef __TPROFILE_H
#define __TPROFILE_H
#include <sys/time.h>
#include <stdint.h>
/**
* Function rdtsc
* Returns processor's time-stamp counter. Main purpose is precise time measuring of code
* execution time.
* @return unsigned long long - Value of time-stamp counter.
*/
#if defined(__i386__)
static __inline__ unsigned long long rdtsc()
{
unsigned long long int x;
__asm__ volatile ( ".byte 0x0f, 0x31" : "=A" ( x ) );
return x;
}
#elif defined(__x86_64__)
static __inline__ unsigned long long rdtsc()
{
unsigned hi, lo;
__asm__ __volatile__ ( "rdtsc" : "=a" ( lo ), "=d" ( hi ) );
return ( (unsigned long long) lo ) | ( ( (unsigned long long) hi ) << 32 );
}
#elif defined(__powerpc__)
static __inline__ unsigned long long rdtsc()
{
unsigned long long int result = 0;
unsigned long int upper, lower, tmp;
__asm__ volatile (
"0: \n"
"\tmftbu %0 \n"
"\tmftb %1 \n"
"\tmftbu %2 \n"
"\tcmpw %2,%0 \n"
"\tbne 0b \n"
: "=r" ( upper ), "=r" ( lower ), "=r" ( tmp )
);
result = upper;
result = result << 32;
result = result | lower;
return result;
}
#endif /* __powerpc__ */
// Fixme: OS X version
/**
* Function get_tics
* Returns the number of microseconds that have elapsed since the system was started.
* @return uint64_t Number of microseconds.
*/
static inline uint64_t get_tics()
{
struct timeval tv;
gettimeofday( &tv, NULL );
return (uint64_t) tv.tv_sec * 1000000ULL + (uint64_t) tv.tv_usec;
}
/**
* Structure for storing data related to profiling counters.
*/
struct prof_counter
{
uint64_t value; /// Stored timer value
bool use_rdtsc; /// Method of time measuring (rdtsc or tics)
};
/**
* Function prof_start
* Begins code execution time counting for a given profiling counter.
* @param cnt is the counter which should be started.
* @param use_rdtsc tells if processor's time-stamp counter should be used for time counting.
* Otherwise is system tics method will be used. IMPORTANT: time-stamp counter should not
* be used on multicore machines executing threaded code.
*/
static inline void prof_start( prof_counter* cnt, bool use_rdtsc )
{
cnt->use_rdtsc = use_rdtsc;
if( use_rdtsc )
{
cnt->value = rdtsc();
}
else
{
cnt->value = get_tics();
}
}
/**
* Function prof_stop
* Ends code execution time counting for a given profiling counter.
* @param cnt is the counter which should be stopped.
*/
static inline void prof_end( prof_counter* cnt )
{
if( cnt->use_rdtsc )
cnt->value = rdtsc() - cnt->value;
else
cnt->value = get_tics() - cnt->value;
}
#endif
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 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
*/
/**
* @file string.cpp
* @brief Some useful functions to handle strings.
......@@ -5,9 +28,18 @@
#include <fctsys.h>
#include <macros.h>
#include <richio.h> // StrPrintf
#include <kicad_string.h>
/**
* Illegal file name characters used to insure file names will be valid on all supported
* platforms. This is the list of illegal file name characters for Windows which includes
* the illegal file name characters for Linux and OSX.
*/
static const char illegalFileNameChars[] = "\\/:\"<>|";
int ReadDelimitedText( wxString* aDest, const char* aSource )
{
std::string utf8; // utf8 but without escapes and quotes.
......@@ -414,3 +446,34 @@ int SplitString( wxString strToSplit,
return 0;
}
wxString GetIllegalFileNameWxChars()
{
return FROM_UTF8( illegalFileNameChars );
}
bool ReplaceIllegalFileNameChars( std::string* aName )
{
bool changed = false;
std::string result;
for( std::string::iterator it = aName->begin(); it != aName->end(); ++it )
{
if( strchr( illegalFileNameChars, *it ) )
{
StrPrintf( &result, "%%%02x", *it );
changed = true;
}
else
{
result += *it;
}
}
if( changed )
*aName = result;
return changed;
}
......@@ -33,6 +33,10 @@
#include "jump_x86_64_sysv_elf_gas.S"
#include "make_x86_64_sysv_elf_gas.S"
#elif __arm__
#include "jump_arm_aapcs_elf_gas.S"
#include "make_arm_aapcs_elf_gas.S"
#else
#error "Missing make_fcontext & jump_fcontext routines for this architecture"
#endif
......
/*
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
*/
/*******************************************************************
* *
* ------------------------------------------------------------- *
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | *
* ------------------------------------------------------------- *
* | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| 0x20| 0x24| *
* ------------------------------------------------------------- *
* | v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 | sp | lr | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 10 | | *
* ------------------------------------------------------------- *
* | 0x28| | *
* ------------------------------------------------------------- *
* | pc | | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 11 | 12 | | *
* ------------------------------------------------------------- *
* | 0x2c| 0x30| | *
* ------------------------------------------------------------- *
* | sp | size| | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | *
* ------------------------------------------------------------- *
* | 0x34| 0x38|0x3c| 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58 | *
* ------------------------------------------------------------- *
* | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 | s24 | s25 | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 23 | 24 | 25 | 26 | 27 | 28 | | *
* ------------------------------------------------------------- *
* | 0x5c| 0x60| 0x64| 0x68| 0x6c| 0x70| | *
* ------------------------------------------------------------- *
* | s26 | s27 | s28 | s29 | s30 | s31 | | *
* ------------------------------------------------------------- *
* *
* *****************************************************************/
.text
.globl jump_fcontext
.align 2
.type jump_fcontext,%function
jump_fcontext:
stmia a1, {v1-v8,sp-lr} @ save V1-V8,SP-LR
str lr, [a1,#40] @ save LR as PC
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
cmp a4, #0 @ test if fpu env should be preserved
beq 1f
mov a4, a1
add a4, #52
vstmia a4, {d8-d15} @ save S16-S31
mov a4, a2
add a4, #52
vldmia a4, {d8-d15} @ restore S16-S31
1:
#endif
mov a1, a3 @ use third arg as return value after jump
@ and as first arg in context function
ldmia a2, {v1-v8,sp-pc} @ restore v1-V8,SP-PC
.size jump_fcontext,.-jump_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
/*
Copyright Oliver Kowalke 2009.
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENSE_1_0.txt or copy at
http://www.boost.org/LICENSE_1_0.txt)
*/
/*******************************************************************
* *
* ------------------------------------------------------------- *
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | *
* ------------------------------------------------------------- *
* | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| 0x20| 0x24| *
* ------------------------------------------------------------- *
* | v1 | v2 | v3 | v4 | v5 | v6 | v7 | v8 | sp | lr | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 10 | | *
* ------------------------------------------------------------- *
* | 0x28| | *
* ------------------------------------------------------------- *
* | pc | | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 11 | 12 | | *
* ------------------------------------------------------------- *
* | 0x2c| 0x30| | *
* ------------------------------------------------------------- *
* | sp | size| | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | *
* ------------------------------------------------------------- *
* | 0x34| 0x38|0x3c| 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58 | *
* ------------------------------------------------------------- *
* | s16 | s17 | s18 | s19 | s20 | s21 | s22 | s23 | s24 | s25 | *
* ------------------------------------------------------------- *
* ------------------------------------------------------------- *
* | 23 | 24 | 25 | 26 | 27 | 28 | | *
* ------------------------------------------------------------- *
* | 0x5c| 0x60| 0x64| 0x68| 0x6c| 0x70| | *
* ------------------------------------------------------------- *
* | s26 | s27 | s28 | s29 | s30 | s31 | | *
* ------------------------------------------------------------- *
* *
* *****************************************************************/
.text
.globl make_fcontext
.align 2
.type make_fcontext,%function
make_fcontext:
mov a4, a1 @ save address of context stack (base) A4
sub a1, a1, #116 @ reserve space for fcontext_t at top of context stack
@ shift address in A1 to lower 16 byte boundary
@ == pointer to fcontext_t and address of context stack
bic a1, a1, #15
str a4, [a1,#44] @ save address of context stack (base) in fcontext_t
str a2, [a1,#48] @ save context stack size in fcontext_t
str a3, [a1,#40] @ save address of context function in fcontext_t
str a1, [a1,#32] @ save address in A4 as stack pointer for context function
adr a2, finish @ compute abs address of label finish
str a2, [a1,#36] @ save address of finish as return address for context function
@ entered after context function returns
bx lr
finish:
@ SP points to same addras SP on entry of context function
mov a1, #0 @ exit code is zero
bl _exit@PLT @ exit application
.size make_fcontext,.-make_fcontext
/* Mark that we don't need executable stack. */
.section .note.GNU-stack,"",%progbits
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@verizon.net>
* 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
* 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 validators.cpp
* @brief Custom text control validator implementations.
*/
#include <kicad_string.h>
#include <validators.h>
FOOTPRINT_NAME_VALIDATOR::FOOTPRINT_NAME_VALIDATOR( wxString* aValue ) :
wxTextValidator( wxFILTER_EXCLUDE_CHAR_LIST, aValue )
{
// The Windows (DOS) file system forbidden characters already include the forbidden
// file name characters for both Posix and OSX systems. The characters \/*?|"<> are
// illegal and filtered by the validator.
wxString illegalChars = GetIllegalFileNameWxChars();
wxTextValidator nameValidator( wxFILTER_EXCLUDE_CHAR_LIST );
wxArrayString illegalCharList;
for( unsigned i = 0; i < illegalChars.size(); i++ )
illegalCharList.Add( wxString( illegalChars[i] ) );
SetExcludes( illegalCharList );
}
......@@ -971,7 +971,7 @@ void VIEW::RecacheAllItems( bool aImmediately )
#ifdef __WXDEBUG__
prof_counter totalRealTime;
prof_start( &totalRealTime, false );
prof_start( &totalRealTime );
#endif /* __WXDEBUG__ */
for( LAYER_MAP_ITER i = m_layers.begin(); i != m_layers.end(); ++i )
......@@ -992,7 +992,7 @@ void VIEW::RecacheAllItems( bool aImmediately )
prof_end( &totalRealTime );
wxLogDebug( wxT( "RecacheAllItems::immediately: %u %.1f ms" ),
aImmediately, (double) totalRealTime.value / 1000.0 );
aImmediately, totalRealTime.msecs() );
#endif /* __WXDEBUG__ */
}
......
......@@ -673,20 +673,17 @@ void SCH_TEXT::Plot( PLOTTER* aPlotter )
if( m_MultilineAllowed )
{
wxPoint pos = textpos;
std::vector<wxPoint> positions;
wxArrayString* list = wxStringSplit( m_Text, '\n' );
wxPoint offset;
positions.reserve( list->Count() );
offset.y = GetInterline();
GetPositionsOfLinesOfMultilineText(positions, list->Count() );
RotatePoint( &offset, m_Orient );
for( unsigned i = 0; i<list->Count(); i++ )
for( unsigned ii = 0; ii < list->Count(); ii++ )
{
wxString txt = list->Item( i );
aPlotter->Text( pos, color, txt, m_Orient, m_Size, m_HJustify,
wxString& txt = list->Item( ii );
aPlotter->Text( positions[ii], color, txt, m_Orient, m_Size, m_HJustify,
m_VJustify, thickness, m_Italic, m_Bold );
pos += offset;
}
delete (list);
......
......@@ -265,6 +265,17 @@ public:
void SetHorizJustify( EDA_TEXT_HJUSTIFY_T aType ) { m_HJustify = aType; };
void SetVertJustify( EDA_TEXT_VJUSTIFY_T aType ) { m_VJustify = aType; };
/**
* Function GetPositionsOfLinesOfMultilineText
* Populates aPositions with the position of each line of
* a multiline text, according to the vertical justification and the
* rotation of the whole text
* @param aPositions is the list to populate by the wxPoint positions
* @param aLineCount is the number of lines (not recalculated here
* for efficiency reasons
*/
void GetPositionsOfLinesOfMultilineText(
std::vector<wxPoint>& aPositions, int aLineCount );
/**
* Function Format
* outputs the object to \a aFormatter in s-expression form.
......
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2004 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
*/
/**
* This file is part of the common library \n
* Custom string manipulation routines.
* @file kicad_string.h
* @see common.h, string.cpp
*/
......@@ -10,6 +31,7 @@
#define KICAD_STRING_H_
#include <wx/string.h>
#include <wx/filename.h>
/**
......@@ -57,7 +79,7 @@ std::string EscapedUTF8( const wxString& aString );
char* GetLine( FILE* aFile, char* Line, int* LineNum = NULL, int SizeLine = 255 );
/**
* Funxtion StrPurge
* Function StrPurge
* removes leading and training spaces, tabs and end of line chars in \a text
* return a pointer on the first n char in text
*/
......@@ -79,7 +101,7 @@ wxString DateAndTime();
*
* @param aString1 A wxChar pointer to the reference string.
* @param aString2 A wxChar pointer to the comparison string.
* @param aLength The numbere of characters to compare. Set to -1 to compare
* @param aLength The number of characters to compare. Set to -1 to compare
* the entire string.
* @param aIgnoreCase Use true to make the comparison case insensitive.
* @return An integer value of -1 if \a aString1 is less than \a aString2, 0 if
......@@ -121,4 +143,25 @@ int SplitString( wxString strToSplit,
wxString* strDigits,
wxString* strEnd );
/**
* Function GetIllegalFileNameWxChars
* @return a wString object containing the illegal file name characters for all platforms.
*/
wxString GetIllegalFileNameWxChars();
/**
* Function ReplaceIllegalFileNameChars
* checks \a aName for illegal file name characters.
*
* The Windows (DOS) file system forbidden characters already include the forbidden file
* name characters for both Posix and OSX systems. The characters \/?*|"\<\> are illegal
* and are replaced with %xx where xx the hexadecimal equivalent of the replaced character.
* This replacement may not be as elegant as using an underscore ('_') or hyphen ('-') but
* it guarentees that there will be no naming conflicts when fixing footprint library names.
*
* @param aName is a point to a std::string object containing the footprint name to verify.
* @return true if any characters have been replaced in \a aName.
*/
bool ReplaceIllegalFileNameChars( std::string* aName );
#endif // KICAD_STRING_H_
......@@ -31,60 +31,9 @@
#define __TPROFILE_H
#include <sys/time.h>
#include <string>
#include <stdint.h>
/**
* Function rdtsc
* Returns processor's time-stamp counter. Main purpose is precise time measuring of code
* execution time.
* @return unsigned long long - Value of time-stamp counter.
*/
#if defined(__i386__)
static __inline__ unsigned long long rdtsc()
{
unsigned long long int x;
__asm__ volatile ( ".byte 0x0f, 0x31" : "=A" ( x ) );
return x;
}
#elif defined(__x86_64__)
static __inline__ unsigned long long rdtsc()
{
unsigned hi, lo;
__asm__ __volatile__ ( "rdtsc" : "=a" ( lo ), "=d" ( hi ) );
return ( (unsigned long long) lo ) | ( ( (unsigned long long) hi ) << 32 );
}
#elif defined(__powerpc__)
static __inline__ unsigned long long rdtsc()
{
unsigned long long int result = 0;
unsigned long int upper, lower, tmp;
__asm__ volatile (
"0: \n"
"\tmftbu %0 \n"
"\tmftb %1 \n"
"\tmftbu %2 \n"
"\tcmpw %2,%0 \n"
"\tbne 0b \n"
: "=r" ( upper ), "=r" ( lower ), "=r" ( tmp )
);
result = upper;
result = result << 32;
result = result | lower;
return result;
}
#endif /* __powerpc__ */
// Fixme: OS X version
/**
* Function get_tics
* Returns the number of microseconds that have elapsed since the system was started.
......@@ -98,14 +47,22 @@ static inline uint64_t get_tics()
return (uint64_t) tv.tv_sec * 1000000ULL + (uint64_t) tv.tv_usec;
}
/**
* Structure for storing data related to profiling counters.
*/
struct prof_counter
{
uint64_t value; /// Stored timer value
bool use_rdtsc; /// Method of time measuring (rdtsc or tics)
uint64_t start, end; // Stored timer value
uint64_t usecs() const
{
return end - start;
}
float msecs() const
{
return ( end - start ) / 1000.0;
}
};
/**
......@@ -116,32 +73,19 @@ struct prof_counter
* Otherwise is system tics method will be used. IMPORTANT: time-stamp counter should not
* be used on multicore machines executing threaded code.
*/
static inline void prof_start( prof_counter* cnt, bool use_rdtsc )
static inline void prof_start( prof_counter* aCnt )
{
cnt->use_rdtsc = use_rdtsc;
if( use_rdtsc )
{
cnt->value = rdtsc();
}
else
{
cnt->value = get_tics();
}
aCnt->start = get_tics();
}
/**
* Function prof_stop
* Ends code execution time counting for a given profiling counter.
* @param cnt is the counter which should be stopped.
*/
static inline void prof_end( prof_counter* cnt )
static inline void prof_end( prof_counter* aCnt )
{
if( cnt->use_rdtsc )
cnt->value = rdtsc() - cnt->value;
else
cnt->value = get_tics() - cnt->value;
aCnt->end = get_tics();
}
#endif
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2013 Wayne Stambaugh <stambaughw@verizon.net>
* 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
* 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 validators.h
* @brief Custom text control validator definitions.
*/
#include <wx/valtext.h>
/**
* Class FOOTPRINT_NAME_VALIDATOR
*
* This class provides a custom wxValidator object for limiting the allowable characters when
* defining footprint names. Since the introduction of the PRETTY footprint library format,
* footprint names cannot have any characters that would prevent file creation on any platform.
*/
class FOOTPRINT_NAME_VALIDATOR : public wxTextValidator
{
public:
FOOTPRINT_NAME_VALIDATOR( wxString* aValue = NULL ) :
wxTextValidator( wxFILTER_EXCLUDE_CHAR_LIST, aValue )
{
// The Windows (DOS) file system forbidden characters already include the forbidden
// file name characters for both Posix and OSX systems. The characters \/*?|"<> are
// illegal and filtered by the validator.
wxString illegalChars = wxFileName::GetForbiddenChars( wxPATH_DOS );
wxTextValidator nameValidator( wxFILTER_EXCLUDE_CHAR_LIST );
wxArrayString illegalCharList;
for( unsigned i = 0; i < illegalChars.size(); i++ )
illegalCharList.Add( wxString( illegalChars[i] ) );
SetExcludes( illegalCharList );
}
};
......@@ -608,10 +608,10 @@ void PCB_BASE_FRAME::UseGalCanvas( bool aEnable )
{
EDA_DRAW_FRAME::UseGalCanvas( aEnable );
ViewReloadBoard( m_Pcb );
m_toolManager->SetEnvironment( m_Pcb, m_galCanvas->GetView(),
m_galCanvas->GetViewControls(), this );
ViewReloadBoard( m_Pcb );
}
......
......@@ -42,6 +42,8 @@
#include <wxPcbStruct.h>
#include <base_units.h>
#include <macros.h>
#include <validators.h>
#include <kicad_string.h>
#include <class_module.h>
#include <class_text_mod.h>
......@@ -62,6 +64,7 @@ DIALOG_MODULE_MODULE_EDITOR::DIALOG_MODULE_MODULE_EDITOR( FOOTPRINT_EDIT_FRAME*
icon.CopyFromBitmap( KiBitmap( icon_modedit_xpm ) );
SetIcon( icon );
m_FootprintNameCtrl->SetValidator( FOOTPRINT_NAME_VALIDATOR() );
initModeditProperties();
m_sdbSizerStdButtonsOK->SetDefault();
GetSizer()->SetSizeHints( this );
......@@ -100,15 +103,15 @@ void DIALOG_MODULE_MODULE_EDITOR::initModeditProperties()
S3D_MASTER* draw3DCopy = new S3D_MASTER(NULL);
draw3DCopy->Copy( draw3D );
m_shapes3D_list.push_back( draw3DCopy );
m_3D_ShapeNameListBox->Append(draw3DCopy->m_Shape3DName);
m_3D_ShapeNameListBox->Append( draw3DCopy->m_Shape3DName );
}
draw3D = (S3D_MASTER*) draw3D->Next();
}
m_DocCtrl->SetValue( m_currentModule->GetDescription() );
m_KeywordCtrl->SetValue( m_currentModule->GetKeywords() );
m_referenceCopy = new TEXTE_MODULE(NULL);
m_valueCopy = new TEXTE_MODULE(NULL);
m_referenceCopy = new TEXTE_MODULE( NULL );
m_valueCopy = new TEXTE_MODULE( NULL );
m_referenceCopy->Copy( &m_currentModule->Reference() );
m_valueCopy->Copy( &m_currentModule->Value() );
m_ReferenceCtrl->SetValue( m_referenceCopy->GetText() );
......@@ -147,7 +150,6 @@ void DIALOG_MODULE_MODULE_EDITOR::initModeditProperties()
m_AutoPlaceCtrl->SetItemToolTip( 1, _( "Disable hotkey move commands and Auto Placement" ) );
m_CostRot90Ctrl->SetValue( m_currentModule->GetPlacementCost90() );
m_CostRot180Ctrl->SetValue( m_currentModule->GetPlacementCost180() );
// Initialize 3D parameters
......@@ -168,7 +170,7 @@ void DIALOG_MODULE_MODULE_EDITOR::initModeditProperties()
PutValueInLocalUnits( *m_SolderPasteMarginCtrl, m_currentModule->GetLocalSolderPasteMargin() );
if( m_currentModule->GetLocalSolderPasteMargin() == 0 )
m_SolderPasteMarginCtrl->SetValue( wxT("-") + m_SolderPasteMarginCtrl->GetValue() );
m_SolderPasteMarginCtrl->SetValue( wxT( "-" ) + m_SolderPasteMarginCtrl->GetValue() );
if( m_currentModule->GetLocalSolderPasteMarginRatio() == 0.0 )
msg.Printf( wxT( "-%f" ), m_currentModule->GetLocalSolderPasteMarginRatio() * 100.0 );
......@@ -179,12 +181,11 @@ void DIALOG_MODULE_MODULE_EDITOR::initModeditProperties()
// Add solder paste margin ration in per cent
// for the usual default value 0.0, display -0.0 (or -0,0 in some countries)
msg.Printf( wxT( "%f" ),
m_currentModule->GetLocalSolderPasteMarginRatio() * 100.0 );
msg.Printf( wxT( "%f" ), m_currentModule->GetLocalSolderPasteMarginRatio() * 100.0 );
if( m_currentModule->GetLocalSolderPasteMarginRatio() == 0.0 &&
msg[0] == '0') // Sometimes Printf adds a sign if the value is very small (0.0)
m_SolderPasteMarginRatioCtrl->SetValue( wxT("-") + msg );
m_SolderPasteMarginRatioCtrl->SetValue( wxT( "-" ) + msg );
else
m_SolderPasteMarginRatioCtrl->SetValue( msg );
......@@ -208,9 +209,7 @@ void DIALOG_MODULE_MODULE_EDITOR::Transfert3DValuesToDisplay( S3D_MASTER * aStru
if( aStruct3DSource )
{
m_3D_Scale->SetValue( aStruct3DSource->m_MatScale );
m_3D_Offset->SetValue( aStruct3DSource->m_MatPosition );
m_3D_Rotation->SetValue( aStruct3DSource->m_MatRotation );
}
else
......@@ -221,6 +220,7 @@ void DIALOG_MODULE_MODULE_EDITOR::Transfert3DValuesToDisplay( S3D_MASTER * aStru
}
}
/** Copy 3D info displayed in dialog box to values in a item in m_shapes3D_list
* @param aIndexSelection = item index in m_shapes3D_list
*/
......@@ -240,6 +240,7 @@ void DIALOG_MODULE_MODULE_EDITOR::On3DShapeNameSelected(wxCommandEvent& event)
{
if( m_lastSelected3DShapeIndex >= 0 )
TransfertDisplayTo3DValues( m_lastSelected3DShapeIndex );
m_lastSelected3DShapeIndex = m_3D_ShapeNameListBox->GetSelection();
if( m_lastSelected3DShapeIndex < 0 ) // happens under wxGTK when deleting an item in m_3D_ShapeNameListBox wxListBox
......@@ -247,10 +248,11 @@ void DIALOG_MODULE_MODULE_EDITOR::On3DShapeNameSelected(wxCommandEvent& event)
if( m_lastSelected3DShapeIndex >= (int)m_shapes3D_list.size() )
{
wxMessageBox(wxT("On3DShapeNameSelected() error"));
wxMessageBox( wxT( "On3DShapeNameSelected() error" ) );
m_lastSelected3DShapeIndex = -1;
return;
}
Transfert3DValuesToDisplay( m_shapes3D_list[m_lastSelected3DShapeIndex] );
}
......@@ -261,18 +263,19 @@ void DIALOG_MODULE_MODULE_EDITOR::Remove3DShape(wxCommandEvent& event)
TransfertDisplayTo3DValues( m_lastSelected3DShapeIndex );
int ii = m_3D_ShapeNameListBox->GetSelection();
if( ii < 0 )
return;
m_shapes3D_list.erase(m_shapes3D_list.begin() + ii );
m_3D_ShapeNameListBox->Delete(ii);
m_shapes3D_list.erase( m_shapes3D_list.begin() + ii );
m_3D_ShapeNameListBox->Delete( ii );
if( m_3D_ShapeNameListBox->GetCount() == 0)
Transfert3DValuesToDisplay( NULL );
else
{
m_lastSelected3DShapeIndex = 0;
m_3D_ShapeNameListBox->SetSelection(m_lastSelected3DShapeIndex);
m_3D_ShapeNameListBox->SetSelection( m_lastSelected3DShapeIndex );
Transfert3DValuesToDisplay( m_shapes3D_list[m_lastSelected3DShapeIndex] );
}
}
......@@ -284,6 +287,7 @@ void DIALOG_MODULE_MODULE_EDITOR::BrowseAndAdd3DLib( wxCommandEvent& event )
wxString fullpath;
fullpath = wxGetApp().ReturnLastVisitedLibraryPath( LIB3D_PATH );
#ifdef __WINDOWS__
fullpath.Replace( wxT( "/" ), wxT( "\\" ) );
#endif
......@@ -313,6 +317,7 @@ void DIALOG_MODULE_MODULE_EDITOR::BrowseAndAdd3DLib( wxCommandEvent& event )
shortfilename = wxGetApp().ReturnFilenameWithRelativePathInLibPath( fullfilename );
wxFileName aux = shortfilename;
if( aux.IsAbsolute() )
{ // Absolute path, ask if the user wants a relative one
int diag = wxMessageBox(
......@@ -322,12 +327,13 @@ void DIALOG_MODULE_MODULE_EDITOR::BrowseAndAdd3DLib( wxCommandEvent& event )
if( diag == wxYES )
{ // Make it relative
aux.MakeRelativeTo( wxT(".") );
aux.MakeRelativeTo( wxT( "." ) );
shortfilename = aux.GetPathWithSep() + aux.GetFullName();
}
}
S3D_MASTER* new3DShape = new S3D_MASTER(NULL);
#ifdef __WINDOWS__
// Store filename in Unix notation
shortfilename.Replace( wxT( "\\" ), wxT( "/" ) );
......@@ -341,7 +347,7 @@ void DIALOG_MODULE_MODULE_EDITOR::BrowseAndAdd3DLib( wxCommandEvent& event )
TransfertDisplayTo3DValues( m_lastSelected3DShapeIndex );
m_lastSelected3DShapeIndex = m_3D_ShapeNameListBox->GetCount() - 1;
m_3D_ShapeNameListBox->SetSelection(m_lastSelected3DShapeIndex);
m_3D_ShapeNameListBox->SetSelection( m_lastSelected3DShapeIndex );
Transfert3DValuesToDisplay( m_shapes3D_list[m_lastSelected3DShapeIndex] );
}
......@@ -357,12 +363,13 @@ void DIALOG_MODULE_MODULE_EDITOR::OnOkClick( wxCommandEvent& event )
{
// First, test for invalid chars in module name
wxString footprintName = m_FootprintNameCtrl->GetValue();
if( ! footprintName.IsEmpty() )
{
if( ! MODULE::IsLibNameValid( footprintName ) )
{
wxString msg;
msg.Printf( _("Error:\none of invalid chars <%s> found\nin <%s>" ),
msg.Printf( _( "Error:\none of invalid chars <%s> found\nin <%s>" ),
MODULE::ReturnStringLibNameInvalidChars( true ),
GetChars( footprintName ) );
......@@ -404,9 +411,7 @@ void DIALOG_MODULE_MODULE_EDITOR::OnOkClick( wxCommandEvent& event )
// Initialize masks clearances
m_currentModule->SetLocalClearance( ReturnValueFromTextCtrl( *m_NetClearanceValueCtrl ) );
m_currentModule->SetLocalSolderMaskMargin( ReturnValueFromTextCtrl( *m_SolderMaskMarginCtrl ) );
m_currentModule->SetLocalSolderPasteMargin( ReturnValueFromTextCtrl( *m_SolderPasteMarginCtrl ) );
double dtmp;
wxString msg = m_SolderPasteMarginRatioCtrl->GetValue();
......@@ -415,6 +420,7 @@ void DIALOG_MODULE_MODULE_EDITOR::OnOkClick( wxCommandEvent& event )
// A -50% margin ratio means no paste on a pad, the ratio must be >= -50 %
if( dtmp < -50.0 )
dtmp = -50.0;
// A margin ratio is always <= 0
if( dtmp > 0.0 )
dtmp = 0.0;
......@@ -423,14 +429,19 @@ void DIALOG_MODULE_MODULE_EDITOR::OnOkClick( wxCommandEvent& event )
// Update 3D shape list
int ii = m_3D_ShapeNameListBox->GetSelection();
if ( ii >= 0 )
TransfertDisplayTo3DValues( ii );
S3D_MASTER* draw3D = m_currentModule->Models();
for( unsigned ii = 0; ii < m_shapes3D_list.size(); ii++ )
{
S3D_MASTER* draw3DCopy = m_shapes3D_list[ii];
if( draw3DCopy->m_Shape3DName.IsEmpty() )
continue;
if( draw3D == NULL )
{
draw3D = new S3D_MASTER( draw3D );
......@@ -447,6 +458,7 @@ void DIALOG_MODULE_MODULE_EDITOR::OnOkClick( wxCommandEvent& event )
// Remove old extra 3D shapes
S3D_MASTER* nextdraw3D;
for( ; draw3D != NULL; draw3D = nextdraw3D )
{
nextdraw3D = (S3D_MASTER*) draw3D->Next();
......@@ -484,4 +496,3 @@ void DIALOG_MODULE_MODULE_EDITOR::OnEditValue(wxCommandEvent& event)
m_parent->SetCrossHairPosition( tmp );
m_ValueCtrl->SetValue( m_valueCopy->GetText() );
}
......@@ -66,6 +66,7 @@ Load() TODO's
#include <fctsys.h>
#include <trigo.h>
#include <macros.h>
#include <kicad_string.h>
#include <wx/filename.h>
#include <class_board.h>
......@@ -94,34 +95,6 @@ typedef boost::optional<bool> opt_bool;
const wxChar* traceEaglePlugin = wxT( "KicadEaglePlugin" );
/// Test footprint name for kicad legality, fix if needed and return true if fixing was required.
static bool fix_eagle_package_name( string* aName )
{
string result;
bool changed = false;
for( string::iterator it = aName->begin(); it != aName->end(); ++it )
{
switch( *it )
{
case ':':
case '/':
// replace *it with %xx, as in URL encoding
StrPrintf( &result, "%%%02x", *it );
changed = true;
break;
default:
result += *it;
}
}
if( changed )
*aName = result;
return changed;
}
/// segment (element) of our XPATH into the Eagle XML document tree in PTREE form.
struct TRIPLET
......@@ -939,7 +912,7 @@ EELEMENT::EELEMENT( CPTREE& aElement )
value = attribs.get<string>( "value" );
package = attribs.get<string>( "package" );
fix_eagle_package_name( &package );
ReplaceIllegalFileNameChars( &package );
x = attribs.get<double>( "x" );
y = attribs.get<double>( "y" );
......@@ -1617,7 +1590,7 @@ void EAGLE_PLUGIN::loadLibrary( CPTREE& aLib, const string* aLibName )
string pack_name( pack_ref );
fix_eagle_package_name( &pack_name );
ReplaceIllegalFileNameChars( &pack_name );
#if 0 && defined(DEBUG)
if( pack_name == "TO220H" )
......
......@@ -32,20 +32,28 @@ struct GH_CACHE;
/**
Class GITHUB_PLUGIN
implements a portion of pcbnew PLUGIN to provide read only access to a github
repo consisting of pretty footprints. It could have used version 3 of the
github.com API documented here:
implements a portion of pcbnew's PLUGIN interface to provide read only access
to a github repo consisting of pretty footprints, and optionally provides "Copy On Write"
support of edited footprints.
<p>It could have used version 3 of the github.com API documented here:
<pre>
http://developer.github.com
https://help.github.com/articles/creating-an-access-token-for-command-line-use
</pre>
but it does not. Rather it simply reads in a zip file of the repo and unzips
it from RAM as needed. <b>Therefore this "Github" plugin type is read only
for accessing remote pretty libraries at https://github.com.</b> The "Library
Path" in the fp-lib-table row for a Github library should be set to the full
https:// URL. For example:
but it does not, since a better technique was discovered. Cleverly this
plugin simply reads in a zip file of the repo and unzips it from RAM as
needed. Therefore this "Github" plugin is <b>read only for accessing remote
pretty libraries at https://github.com.</b>
<p>The fp-lib-table dialog is entered via menu choice "Preferences | Library
Tables". For easy options editing in the current row, click on the "Edit
Options" button. The "Library Path" in the fp-lib-table row for a Github
library should be set to the full https:// URL.
<p>For example:
<pre>
https://github.com/liftoff-sr/pretty_footprints
......@@ -58,52 +66,79 @@ struct GH_CACHE;
</pre>
<p>
This PLUGIN also supports "Copy On Write", a.k.a. "COW". Thus a Github
library defined in either fp-lib-table (project or global) will take an
optional option called <b>allow_pretty_writing_to_this_dir</b>. This option
is essentially the "Library Path" for a local "KiCad" (pretty) type library
which is combined to make up the Github library found in the same
fp-lib-table row. If the option is missing, then the Github library is read
only as always. If the option is present for a Github library, then any
writes to this hybrid library will go to the local *.pretty directory. Note
that the github.com resident portion of this hybrid COW library is always
read only, meaning you cannot delete anything or modify any footprint at
github directly. The aggregate library "Type" remains "Github", but it
consists of a local R/W portion and a remote R/O portion.
<p>
Any footprint loads will always give precedence to the local footprints found
in the pretty dir given by option <b>allow_pretty_writing_to_this_dir</b>. So
once you have written to the COW library's local directory by doing a
footprint save, no github updates will be seen when loading a footprint by
the same name as one for which you've written locally.
<p>
Always keep a separate local *.pretty directory for each Github library,
The "Plugin Type" should be set to "Github".
<p>This plugin also supports "Copy On Write", a.k.a. "COW". Thus a Github
library may take an optional option called
<b>allow_pretty_writing_to_this_dir</b>. This option is essentially the
"Library Path" for a local "KiCad" (pretty) type library which is combined to
make up the Github library found in the same fp-lib-table row. If the option
is missing, then the Github library is read only as always. If the option is
present for a Github library, then any writes to this hybrid library will go
to the local *.pretty directory. Note that the github.com resident portion of
this hybrid COW library is always read only, meaning you cannot delete
anything or modify any footprint at github directly. The aggregate library
type remains "Github" in your discussions, but it consists of a local R/W
portion and a remote R/O portion.
<p>Below is an fp-lib-table entry for the case without option
<b>allow_pretty_writing_to_this_dir</b>:
<table>
<tr>
<th>Nickname</th><th>Library Path</th><th>Plugin Type</th><th>Options</th><th>Description</th>
</tr>
<tr>
<td>github</td><td>https://github.com/liftoff-sr/pretty_footprints</td><td>Github</td>
<td></td><td>Liftoff's GH footprints</td>
</tr>
</table>
Below is an fp-lib-table entry with the COW option given. Note the use of the environment variable
${HOME}, as an example only. The github.pretty directory is based in ${HOME}/pretty/. Anytime you
use option allow_pretty_writing_to_this_dir, you will create that directory manually and it must
end in extension <b>.pretty</b>.
<table>
<tr>
<th>Nickname</th><th>Library Path</th><th>Plugin Type</th><th>Options</th><th>Description</th>
</tr>
<tr>
<td>github</td><td>https://github.com/liftoff-sr/pretty_footprints</td><td>Github</td>
<td>allow_pretty_writing_to_this_dir=${HOME}/pretty/github.pretty</td>
<td>Liftoff's GH footprints</td>
</tr>
</table>
<p>Any footprint loads will always give precedence to the local footprints
found in the pretty dir given by option
<b>allow_pretty_writing_to_this_dir</b>. So once you have written to the COW
library's local directory by doing a footprint save, no github updates will
be seen when loading a footprint by the same name as one for which you've
written locally.
<p>Always keep a separate local *.pretty directory for each Github library,
never combine them by referring to the same directory more than once. Also,
do not also use the same COW (*.pretty) directory in a "Kicad" fp-lib-table
do not also use the same COW (*.pretty) directory in a "KiCad" fp-lib-table
entry. This would likely create a mess. The COW directory should be manually
created in advance, and the directory name must end with ".pretty". The value
of the option <b>allow_pretty_writing_to_this_dir</b> will be path
substituted with any environment variable strings embedded, just like the
"Library Path" is.
<p>
What's the point of COW? It is to turbo-charge the sharing of footprints. If
you periodically email your COW pretty footprint modifications to the Github
repo maintainer, you can help update the Github copy. Simply email the
individual *.kicad_mod file you find in your COW directories. After you've
<p>What's the point of COW? It is to turbo-charge the sharing of footprints.
If you periodically email your COW pretty footprint modifications to the
Github repo maintainer, you can help update the Github copy. Simply email the
individual *.kicad_mod files you find in your COW directories. After you've
received confirmation that your changes have been committed up at github.com,
you can safely delete your COW file(s) and those from github.com will flow
down. Your goal should be to keep the COW file set as small as possible by
contributing frequently to the shared master copies at https://github.com.
<p>
Note that if you use the module editor to delete a footprint and it is
<p>Note that if you use the module editor to delete a footprint and it is
present in the COW local dir, it will get deleted from there. However, it may
not be deleted from the library as a whole if the footprint of the same name
also exists in the github repo. In this case deleting the local copy will
......@@ -112,6 +147,14 @@ struct GH_CACHE;
remember you cannot modify the github copy except by emailing a COW
modification to the repo maintainer.
<p>If you happen to be the repo maintainer, then the obvious solution for you
is to make your COW directory <b>be</b> your working copy directory. From
there you can push to github. And you can receive *.kicad_mod files by email
and put them into your local working copy directory also and do diffs,
reverting or denying when appropriate, editing when appropriate before
pushing or denying the change. Ultimately you would owe the sender either a
note of acceptance or denial by email.
@author Dick Hollenbeck
@date Original date: 10-Sep-2013
......
......@@ -286,11 +286,11 @@ public:
* Function FootprintEnumerate
* returns a list of footprint names contained within the library at @a aLibraryPath.
*
* @param aLibraryPath is a locator for the "library", usually a directory
* or file containing several footprints.
* @param aLibraryPath is a locator for the "library", usually a directory, file,
* or URL containing several footprints.
*
* @param aProperties is an associative array that can be used to tell the
* plugin how to access the library.
* plugin anything needed about how to perform with respect to @a aLibraryPath.
* The caller continues to own this object (plugin may not delete it), and
* plugins should expect it to be optionally NULL.
*
......@@ -307,8 +307,8 @@ public:
* loads a footprint having @a aFootprintName from the @a aLibraryPath containing
* a library format that this PLUGIN knows about.
*
* @param aLibraryPath is a locator for the "library", usually a directory
* or file containing several footprints.
* @param aLibraryPath is a locator for the "library", usually a directory, file,
* or URL containing several footprints.
*
* @param aFootprintName is the name of the footprint to load.
*
......@@ -331,9 +331,8 @@ public:
* will write @a aModule to an existing library located at @a aLibraryPath.
* If a footprint by the same name already exists, it is replaced.
*
* @param aLibraryPath is a locator for the "library", usually a directory
* or file containing several footprints. This is where the footprint is
* to be stored.
* @param aLibraryPath is a locator for the "library", usually a directory, file,
* or URL containing several footprints.
*
* @param aFootprint is what to store in the library. The caller continues
* to own the footprint after this call.
......@@ -351,15 +350,15 @@ public:
/**
* Function FootprintDelete
* deletes the @a aFootprintName from the library at @a aLibraryPath.
* deletes @a aFootprintName from the library at @a aLibraryPath.
*
* @param aLibraryPath is a locator for the "library", usually a directory
* or file containing several footprints.
* @param aLibraryPath is a locator for the "library", usually a directory, file,
* or URL containing several footprints.
*
* @param aFootprintName is the name of a footprint to delete from the specified library.
*
* @param aProperties is an associative array that can be used to tell the
* library create function anything special, because it can take any number of
* library delete function anything special, because it can take any number of
* additional named tuning arguments that the plugin is known to support.
* The caller continues to own this object (plugin may not delete it), and
* plugins should expect it to be optionally NULL.
......@@ -375,8 +374,8 @@ public:
* error to attempt to create an existing library or to attempt to create
* on a "read only" location.
*
* @param aLibraryPath is a locator for the "library", usually a directory
* or file which will contain footprints.
* @param aLibraryPath is a locator for the "library", usually a directory, file,
* or URL containing several footprints.
*
* @param aProperties is an associative array that can be used to tell the
* library create function anything special, because it can take any number of
......@@ -414,6 +413,9 @@ public:
* returns true iff the library at @a aLibraryPath is writable. (Often
* system libraries are read only because of where they are installed.)
*
* @param aLibraryPath is a locator for the "library", usually a directory, file,
* or URL containing several footprints.
*
* @throw IO_ERROR if no library at aLibraryPath exists.
*/
virtual bool IsFootprintLibWritable( const wxString& aLibraryPath );
......
......@@ -970,12 +970,15 @@ void PCB_IO::format( MODULE* aModule, int aNestLevel ) const
else
m_out->Print( 0, "\n" );
if( !( m_ctl & CTL_OMIT_AT ) )
{
m_out->Print( aNestLevel+1, "(at %s", FMT_IU( aModule->GetPosition() ).c_str() );
if( aModule->GetOrientation() != 0.0 )
m_out->Print( 0, " %s", FMT_ANGLE( aModule->GetOrientation() ).c_str() );
m_out->Print( 0, ")\n" );
}
if( !aModule->GetDescription().IsEmpty() )
m_out->Print( aNestLevel+1, "(descr %s)\n",
......
......@@ -43,6 +43,8 @@ class PCB_PARSER;
#define CTL_OMIT_TSTAMPS (1 << 2)
#define CTL_OMIT_INITIAL_COMMENTS (1 << 3) ///< omit MODULE initial comments
#define CTL_OMIT_PATH (1 << 4)
#define CTL_OMIT_AT (1 << 5)
// common combinations of the above:
......@@ -50,7 +52,7 @@ class PCB_PARSER;
#define CTL_FOR_CLIPBOARD (CTL_STD_LAYER_NAMES|CTL_OMIT_NETS)
/// Format output for a footprint library instead of clipboard or BOARD
#define CTL_FOR_LIBRARY (CTL_STD_LAYER_NAMES|CTL_OMIT_NETS|CTL_OMIT_TSTAMPS|CTL_OMIT_PATH)
#define CTL_FOR_LIBRARY (CTL_STD_LAYER_NAMES|CTL_OMIT_NETS|CTL_OMIT_TSTAMPS|CTL_OMIT_PATH|CTL_OMIT_AT)
/// The zero arg constructor when PCB_IO is used for PLUGIN::Load() and PLUGIN::Save()ing
/// a BOARD file underneath IO_MGR.
......
......@@ -281,6 +281,10 @@ void LEGACY_PLUGIN::loadAllSections( bool doAppend )
FPID fpid;
std::string fpName = StrPurge( line + SZ( "$MODULE" ) );
// The footprint names in legacy libraries can contain the '/' and ':'
// characters which will cause the FPID parser to choke.
ReplaceIllegalFileNameChars( &fpName );
if( !fpName.empty() )
fpid = FPID( fpName );
......@@ -4031,6 +4035,10 @@ void LP_CACHE::LoadModules( LINE_READER* aReader )
std::string footprintName = StrPurge( line + SZ( "$MODULE" ) );
// The footprint names in legacy libraries can contain the '/' and ':'
// characters which will cause the FPID parser to choke.
ReplaceIllegalFileNameChars( &footprintName );
// set the footprint name first thing, so exceptions can use name.
module->SetFPID( FPID( footprintName ) );
......
......@@ -40,6 +40,7 @@
#include <pcbcommon.h>
#include <macros.h>
#include <fp_lib_table.h>
#include <validators.h>
#include <class_board.h>
#include <class_module.h>
......@@ -377,7 +378,7 @@ wxString FOOTPRINT_EDIT_FRAME::CreateNewLibrary()
wxString wildcard;
wildcard << wxGetTranslation( LegacyFootprintLibPathWildcard ) << wxChar('|')
wildcard << wxGetTranslation( LegacyFootprintLibPathWildcard ) << wxChar( '|' )
<< wxGetTranslation( KiCadFootprintLibPathWildcard );
// prompt user for libPath and PLUGIN (library) type
......@@ -845,6 +846,7 @@ MODULE* PCB_BASE_FRAME::Create_1_Module( const wxString& aModuleName )
if( moduleName.IsEmpty() )
{
wxTextEntryDialog dlg( this, FMT_MOD_REF, FMT_MOD_CREATE, moduleName );
dlg.SetTextValidator( FOOTPRINT_NAME_VALIDATOR() );
if( dlg.ShowModal() != wxID_OK )
return NULL; //Aborted by user
......
......@@ -30,10 +30,17 @@ void FOOTPRINT_EDIT_FRAME::SaveCopyInUndoList( BOARD_ITEM* aItem,
lastcmd->PushItem( wrapper );
GetScreen()->PushCommandToUndoList( lastcmd );
/* Clear current flags (which can be temporary set by a current edit command) */
for( item = CopyItem->GraphicalItems(); item != NULL; item = item->Next() )
item->ClearFlags();
for( D_PAD* pad = CopyItem->Pads(); pad; pad = pad->Next() )
pad->ClearFlags();
CopyItem->Reference().ClearFlags();
CopyItem->Value().ClearFlags();
/* Clear redo list, because after new save there is no redo to do */
GetScreen()->ClearUndoORRedoList( GetScreen()->m_RedoList );
}
......
......@@ -477,20 +477,18 @@ void BRDITEMS_PLOTTER::PlotTextePcb( TEXTE_PCB* pt_texte )
if( pt_texte->IsMultilineAllowed() )
{
std::vector<wxPoint> positions;
wxArrayString* list = wxStringSplit( pt_texte->GetText(), '\n' );
wxPoint offset;
positions.reserve( list->Count() );
offset.y = pt_texte->GetInterline();
pt_texte->GetPositionsOfLinesOfMultilineText( positions, list->Count() );
RotatePoint( &offset, orient );
for( unsigned i = 0; i < list->Count(); i++ )
for( unsigned ii = 0; ii < list->Count(); ii++ )
{
wxString txt = list->Item( i );
m_plotter->Text( pos, UNSPECIFIED_COLOR, txt, orient, size,
wxString& txt = list->Item( ii );
m_plotter->Text( positions[ii], UNSPECIFIED_COLOR, txt, orient, size,
pt_texte->GetHorizJustify(), pt_texte->GetVertJustify(),
thickness, pt_texte->IsItalic(), allow_bold );
pos += offset;
}
delete list;
......
......@@ -343,11 +343,11 @@ PNS_SHOVE::ShoveStatus PNS_SHOVE::ShoveLines( PNS_LINE* aCurrentHead )
PNS_LINE* currentLine = lineStack.top();
prof_start( &totalRealTime, false );
prof_start( &totalRealTime );
nearest = node->NearestObstacle( currentLine, PNS_ITEM::ANY );
prof_end( &totalRealTime );
TRACE( 2, "t-nearestObstacle %lld us", (totalRealTime.value ) );
TRACE( 2, "t-nearestObstacle %lld us", totalRealTime.usecs() );
if( !nearest )
{
......@@ -362,7 +362,7 @@ PNS_SHOVE::ShoveStatus PNS_SHOVE::ShoveLines( PNS_LINE* aCurrentHead )
TRACE( 1, "Iter %d optimize-line [range %d-%d, total %d]",
iter % r_start % r_end % original->GetCLine().PointCount() );
// lastWalkSolid = NULL;
prof_start( &totalRealTime, false );
prof_start( &totalRealTime );
if( optimizer.Optimize( original, &optimized ) )
{
......@@ -376,7 +376,7 @@ PNS_SHOVE::ShoveStatus PNS_SHOVE::ShoveLines( PNS_LINE* aCurrentHead )
prof_end( &totalRealTime );
TRACE( 2, "t-optimizeObstacle %lld us", (totalRealTime.value ) );
TRACE( 2, "t-optimizeObstacle %lld us", totalRealTime.usecs() );
}
lineStack.pop();
......@@ -393,12 +393,12 @@ PNS_SHOVE::ShoveStatus PNS_SHOVE::ShoveLines( PNS_LINE* aCurrentHead )
PNS_LINE* collidingLine = node->AssembleLine( pseg );
PNS_LINE* shovedLine = collidingLine->CloneProperties();
prof_start( &totalRealTime, false );
prof_start( &totalRealTime );
ShoveStatus st = shoveSingleLine( node, currentLine, collidingLine,
*pseg, shovedLine );
prof_end( &totalRealTime );
TRACE( 2, "t-shoveSingle %lld us", (totalRealTime.value ) );
TRACE( 2, "t-shoveSingle %lld us", totalRealTime.usecs() );
if( st == SH_OK )
{
......@@ -441,11 +441,11 @@ PNS_SHOVE::ShoveStatus PNS_SHOVE::ShoveLines( PNS_LINE* aCurrentHead )
walkaround.SetSolidsOnly( true );
walkaround.SetSingleDirection( true );
prof_start( &totalRealTime, false );
prof_start( &totalRealTime );
walkaround.Route( *currentLine, *walkaroundLine, false );
prof_end( &totalRealTime );
TRACE( 2, "t-walkSolid %lld us", (totalRealTime.value ) );
TRACE( 2, "t-walkSolid %lld us", totalRealTime.usecs() );
node->Replace( currentLine, walkaroundLine );
......
......@@ -66,9 +66,6 @@ SELECTION_TOOL::~SELECTION_TOOL()
void SELECTION_TOOL::Reset()
{
m_selection.group->Clear();
m_selection.items.clear();
// Reinsert the VIEW_GROUP, in case it was removed from the VIEW
getView()->Remove( m_selection.group );
getView()->Add( m_selection.group );
......
......@@ -4,8 +4,25 @@
# -> a Red Hat
# compatible linux system.
#
# The "install_prerequisites" step is the only "distro dependent" one. Could modify
# that step for other linux distros.
# The "install_prerequisites" step is the only "distro dependent" one. That step could be modified
# for other linux distros.
#
# There are 3 package groups in a KiCad install:
# 1) Compiled source code in the form of executable programs.
# 2) User manuals and other documentation typically as *.pdf files.
# 3) a) Schematic parts, b) layout footprints, and c) 3D models for footprints.
#
# To achieve 1) source is checked out from its repo and compiled by this script then executables
# are installed using CMake.
# To achieve 2) documentation is checked out from its repo and installed using CMake.
# TO achieve 3a) and 3c) they are checked out from their repos and installed using CMake.
# To achieve 3b) a global fp-lib-table is put into your home directory which points to
# http://github.com/KiCad. No actual footprints are installed locally, internet access is used
# during program operation to fetch footprints from github as if it was a remote drive in the cloud.
# If you want to install those same KiCad footprints locally, you may run a separate script
# named library-repos-install.sh found in this same directory. That script requires that "git" be on
# your system whereas this script does not. The footprints require some means to download them and
# bzr-git seems not up to the task. wget or curl would also work.
# Set where the 3 source trees will go, use a full path
......@@ -19,6 +36,8 @@ OPTS="$OPTS -DBUILD_GITHUB_PLUGIN=ON"
# Python scripting, uncomment to enable
#OPTS="$OPTS -DKICAD_SCRIPTING=ON -DKICAD_SCRIPTING_MODULES=ON -DKICAD_SCRIPTING_WXPYTHON=ON"
LIB_REPO=~kicad-testing-committers/kicad/library
usage()
{
......@@ -30,6 +49,7 @@ usage()
echo " --install-or-update (does full installation or update.)"
echo " --remove-sources (removes source trees for another attempt.)"
echo " --uninstall-libraries (removes KiCad supplied libraries.)"
echo " --uninstall-kicad (uninstalls all of KiCad but leaves source trees.)"
echo ""
echo "example:"
echo ' $ ./kicad-install.sh --install-or-update'
......@@ -109,8 +129,6 @@ cmake_uninstall()
elif [ ! -e install_manifest.txt ]; then
echo
echo "Missing file $dir/install_manifest.txt."
echo "Libraries may have already been uinstalled, or were not"
echo 'originally installed with an "uninstall" knowledgable CMakeLists.txt file.'
else
echo "uninstalling from $dir"
sudo make uninstall
......@@ -145,10 +163,8 @@ install_or_update()
cd ../
fi
echo "step 4) checking out the libraries from launchpad repo..."
if [ ! -d "$WORKING_TREES/kicad-lib.bzr" ]; then
bzr checkout lp:~kicad-lib-committers/kicad/library kicad-lib.bzr
bzr checkout "lp:$LIB_REPO" kicad-lib.bzr
echo ' kicad-lib checked out.'
else
cd kicad-lib.bzr
......@@ -176,7 +192,6 @@ install_or_update()
cmake $OPTS ../
else
cd build
# Although a "make clean" is sometimes needed, more often than not it slows down the update
# more than it is worth. Do it manually if you need to in this directory.
# make clean
......@@ -190,13 +205,7 @@ install_or_update()
echo " kicad program files installed."
echo "step 8) as non-root, install user configuration files..."
# install ~/fp-lib-table [and friends]
make install_user_configuration_files
echo " kicad user-configuration files installed."
echo "step 9) installing libraries..."
echo "step 8) installing libraries..."
cd ../../kicad-lib.bzr
rm_build_dir build
mkdir build && cd build
......@@ -205,6 +214,12 @@ install_or_update()
echo " kicad-lib installed."
echo "step 9) as non-root, install user configuration files..."
# install ~/fp-lib-table
make install_github_fp-lib-table
echo " kicad user-configuration files installed."
echo "step 10) installing documentation..."
cd ../../kicad-doc.bzr
rm_build_dir build
......@@ -240,4 +255,20 @@ if [ $# -eq 1 -a "$1" == "--uninstall-libraries" ]; then
exit
fi
if [ $# -eq 1 -a "$1" == "--uninstall-kicad" ]; then
cd "$WORKING_TREES/kicad.bzr/build"
cmake_uninstall "$WORKING_TREES/kicad.bzr/build"
cd "$WORKING_TREES/kicad-lib.bzr/build"
cmake_uninstall "$WORKING_TREES/kicad-lib.bzr/build"
# this may fail since "uninstall" support is a recent feature of this repo:
cd "$WORKING_TREES/kicad-doc.bzr/build"
cmake_uninstall "$WORKING_TREES/kicad-doc.bzr/build"
exit
fi
usage
#!/bin/bash
# Git KiCad library repos:
#
# The "install_prerequisites" step is the only "distro dependent" one. Could modify
# that step for other linux distros.
# This script requires "git". The package bzr-git is not up to the task.
# The first time you run with option --install-or-update that is the slowest, because
# git clone from github.com is slow.
# After that updates should run faster.
# There are two reasons why you might want to run this script:
#
# 1) You want to contribute to the KiCad library team maintained libraries and have yet to
# discover or have chosen not to use the COW feature in the Github "Plugin Type".
#
# 2) You want to run with local pretty footprint libraries and not those remotely located
# on https://github.com using Github plugin. After running this script you should be able to
# a) $ cp ~/kicad_sources/library-repos/kicad-library/template/fp-lib-table.for-pretty ~/fp-lib-table
# and then
# b) set your environment variable KISYSMOD to "~/kicad_sources/library-repos"
# before starting pcbnew. This will use the KiCad plugin against the *.pretty dirs in that base dir.
# Set where the library repos will go, use a full path
WORKING_TREES=~/kicad_sources
usage()
{
echo ""
echo " usage:"
echo ""
echo "./library-sources-install.sh <cmd>"
echo " where <cmd> is one of:"
echo " --install-or-update (of the library sources.)"
echo " --remove-all-sources (remove all source trees.)"
echo " --install-prerequisites (install command tools needed here, run once first.)"
# echo " --uninstall-libraries (remove KiCad supplied libraries which have been installed.)"
echo ""
echo "example:"
echo ' $ ./library-sources-install.sh --install-or-update'
}
install_prerequisites()
{
# Find a package manager, PM
PM=$( command -v yum || command -v apt-get )
# assume all these Debian, Mint, Ubuntu systems have same prerequisites
if [ "$(expr match "$PM" '.*\(apt-get\)')" == "apt-get" ]; then
#echo "debian compatible system"
sudo apt-get install \
git \
curl \
sed
# assume all yum systems have same prerequisites
elif [ "$(expr match "$PM" '.*\(yum\)')" == "yum" ]; then
#echo "red hat compatible system"
# Note: if you find this list not to be accurate, please submit a patch:
sudo yum install \
git \
curl \
sed
else
echo
echo "Incompatible System. Neither 'yum' nor 'apt-get' found. Not possible to continue."
echo
exit 1
fi
}
rm_build_dir()
{
local dir="$1"
# this file is often created as root, so remove as root
sudo rm "$dir/install_manifest.txt" 2> /dev/null
rm -rf "$dir"
}
cmake_uninstall()
{
# assume caller set the CWD, and is only telling us about it in $1
local dir="$1"
cwd=`pwd`
if [ "$cwd" != "$dir" ]; then
echo "missing dir $dir"
elif [ ! -e install_manifest.txt ]; then
echo
echo "Missing file $dir/install_manifest.txt."
else
echo "uninstalling from $dir"
sudo make uninstall
sudo rm install_manifest.txt
fi
}
detect_pretty_repos()
{
# Use github API to list repos for org KiCad, then subset the JSON reply for only
# *.pretty repos
PRETTY_REPOS=`curl https://api.github.com/orgs/KiCad/repos?per_page=2000 2> /dev/null \
| grep full_name | grep pretty \
| sed -r 's:.+ "KiCad/(.+)",:\1:'`
#echo "PRETTY_REPOS:$PRETTY_REPOS"
}
checkout_or_update_libraries()
{
if [ ! -d "$WORKING_TREES" ]; then
sudo mkdir -p "$WORKING_TREES"
echo " mark $WORKING_TREES as owned by me"
sudo chown -R `whoami` "$WORKING_TREES"
fi
cd $WORKING_TREES
detect_pretty_repos
if [ ! -e "$WORKING_TREES/library-repos" ]; then
mkdir -p "$WORKING_TREES/library-repos"
fi
for repo in kicad-library $PRETTY_REPOS; do
# echo "repo:$repo"
if [ ! -e "$WORKING_TREES/library-repos/$repo" ]; then
# Be _sure_ and preserve the directory name, we want extension .pretty not .pretty.git.
# That way those repos can serve as pretty libraries directly if need be.
echo "installing $WORKING_TREES/library-repos/$repo"
git clone "https://github.com/KiCad/$repo" "$WORKING_TREES/library-repos/$repo"
else
echo "updating $WORKING_TREES/library-repos/$repo"
cd "$WORKING_TREES/library-repos/$repo"
git pull
fi
done
}
if [ $# -eq 1 -a "$1" == "--install-or-update" ]; then
checkout_or_update_libraries
exit
fi
if [ $# -eq 1 -a "$1" == "--remove-all-sources" ]; then
rm -rf "$WORKING_TREES/library-repos"
exit
fi
if [ $# -eq 1 -a "$1" == "--install-prerequisites" ]; then
install_prerequisites
exit
fi
usage
#!/bin/sh
# Generate a footprint library table which can serve as a sensible initial
# personal/global table assuming you have all the footprint libraries installed
# from the bazaar library repo.
# Copyright (C) 2007-2011 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
# License GPLv2
# This program makes the table either in s-expression or CSV format.
# The CSV format can be loaded into a spreadsheet and then from there rows
# can be copied into either of the fp_table_dialog's table editors:
# a) personal/global or b) project
# Usage:
# $ make_global_table.sh [--csv] > outputfile
# Library Type: Legacy for now, Kicad in future
libtype="Legacy"
# Get a list of modules currently in the launchpad repo:
mods=`bzr ls -d lp:~kicad-lib-committers/kicad/library modules 2>/dev/null`
#echo "$mods"
mods=`echo "$mods" | egrep '\.mod$' | sort`
#echo "$mods"
csv=0
if [ $# -gt 0 -a "$1" == "--csv" ]; then
csv=1
fi
today=`date --rfc-3339=date`
if [ $csv -eq 1 ]; then
echo "NICKNAME,TYPE,URI,OPTIONS,DESCR,,FP LIB TABLE: made from KiCad's Bazaar 'library' repository on $today"
echo
echo "$mods" | while read mod;
do
# base filename w/o extension
bfn=`basename $mod .mod`
printf '%s,%s,${KISYSMOD}/%s,"",""\n' \
"$bfn" \
"$libtype" \
"$bfn.mod"
done
else
echo "# FP LIB TABLE: made from KiCad's Bazaar 'library' repository on $today"
echo "(fp_lib_table"
echo "$mods" | while read mod;
do
# base filename w/o extension
bfn=`basename $mod .mod`
printf ' (lib (name %s)(type %s)(uri ${KISYSMOD}/%s)(options "")(descr ""))\n' \
"$bfn" \
"$libtype" \
"$bfn.mod"
done
echo ")"
fi
install( FILES
kicad.pro
fp-lib-table
fp-lib-table.csv
fp-lib-table.for-github
fp-lib-table.for-eagle-6.4.0
gost_landscape.kicad_wks
gost_portrait.kicad_wks
pagelayout_default.kicad_wks
......
(fp_lib_table
(lib (name Air_Coils_SML_NEOSID)(type Legacy)(uri ${KISYSMOD}/Air_Coils_SML_NEOSID.mod)(options "")(descr HAMxx31A_HDMxx31A))
(lib (name Capacitors_Elko_ThroughHole)(type Legacy)(uri ${KISYSMOD}/Capacitors_Elko_ThroughHole.mod)(options "")(descr "The way you like them."))
(lib (name Capacitors_SMD)(type Legacy)(uri ${KISYSMOD}/Capacitors_SMD.mod)(options "")(descr "The way you like them."))
(lib (name Capacitors)(type Legacy)(uri ${KISYSMOD}/Capacitors.mod)(options "")(descr "The way you like them."))
(lib (name Connectors_Serial_MOLEX)(type Legacy)(uri ${KISYSMOD}/Connectors_Serial_MOLEX.mod)(options "")(descr 53047-A123))
(lib (name Connect)(type Legacy)(uri ${KISYSMOD}/Connect.mod)(options "")(descr "The way you like them."))
(lib (name Converters_DCDC_ACDC)(type Legacy)(uri ${KISYSMOD}/Converters_DCDC_ACDC.mod)(options "")(descr "The way you like them."))
(lib (name Crystals_Oscillators_SMD)(type Legacy)(uri ${KISYSMOD}/Crystals_Oscillators_SMD.mod)(options "")(descr "The way you like them."))
(lib (name Crystals)(type Legacy)(uri ${KISYSMOD}/Crystals.mod)(options "")(descr "The way you like them."))
(lib (name Diodes_SMD)(type Legacy)(uri ${KISYSMOD}/Diodes_SMD.mod)(options "")(descr "The way you like them."))
(lib (name Diodes_ThroughHole)(type Legacy)(uri ${KISYSMOD}/Diodes_ThroughHole.mod)(options "")(descr "The way you like them."))
(lib (name Discret)(type Legacy)(uri ${KISYSMOD}/Discret.mod)(options "")(descr "The way you like them."))
(lib (name Display)(type Legacy)(uri ${KISYSMOD}/Display.mod)(options "")(descr "The way you like them."))
(lib (name Divers)(type Legacy)(uri ${KISYSMOD}/Divers.mod)(options "")(descr "The way you like them."))
(lib (name EuroBoard_Outline)(type Legacy)(uri ${KISYSMOD}/EuroBoard_Outline.mod)(options "")(descr "The way you like them."))
(lib (name Fiducials)(type Legacy)(uri ${KISYSMOD}/Fiducials.mod)(options "")(descr "The way you like them."))
(lib (name Filters_HF_Coils_NEOSID)(type Legacy)(uri ${KISYSMOD}/Filters_HF_Coils_NEOSID.mod)(options "")(descr "The way you like them."))
(lib (name Footprint_Symbols)(type Legacy)(uri ${KISYSMOD}/Footprint_Symbols.mod)(options "")(descr "The way you like them."))
(lib (name Fuse_Holders_and_Fuses)(type Legacy)(uri ${KISYSMOD}/Fuse_Holders_and_Fuses.mod)(options "")(descr "The way you like them."))
(lib (name Heatsinks)(type Legacy)(uri ${KISYSMOD}/Heatsinks.mod)(options "")(descr "The way you like them."))
(lib (name Housings_ROHM)(type Legacy)(uri ${KISYSMOD}/Housings_ROHM.mod)(options "")(descr VML0806))
(lib (name Housings_SIP9)(type Legacy)(uri ${KISYSMOD}/Housings_SIP9.mod)(options "")(descr "The way you like them."))
(lib (name Housings_SOT-23_SOT-143_TSOT-6)(type Legacy)(uri ${KISYSMOD}/Housings_SOT-23_SOT-143_TSOT-6.mod)(options "")(descr "The way you like them."))
(lib (name Housings_SOT-89)(type Legacy)(uri ${KISYSMOD}/Housings_SOT-89.mod)(options "")(descr "The way you like them."))
(lib (name Housings_SOT)(type Legacy)(uri ${KISYSMOD}/Housings_SOT.mod)(options "")(descr "SOT126, SOT32"))
(lib (name Housings_TO-50)(type Legacy)(uri ${KISYSMOD}/Housings_TO-50.mod)(options "")(descr "The way you like them."))
(lib (name Housings_TO-78)(type Legacy)(uri ${KISYSMOD}/Housings_TO-78.mod)(options "")(descr "The way you like them."))
(lib (name Housings_TO-92)(type Legacy)(uri ${KISYSMOD}/Housings_TO-92.mod)(options "")(descr "The way you like them."))
(lib (name Inductors_NEOSID)(type Legacy)(uri ${KISYSMOD}/Inductors_NEOSID.mod)(options "")(descr "The way you like them."))
(lib (name Inductors)(type Legacy)(uri ${KISYSMOD}/Inductors.mod)(options "")(descr "The way you like them."))
(lib (name IR-DirectFETs)(type Legacy)(uri ${KISYSMOD}/IR-DirectFETs.mod)(options "")(descr "The way you like them."))
(lib (name Iut)(type Legacy)(uri ${KISYSMOD}/Iut.mod)(options "")(descr "The way you like them."))
(lib (name Labels)(type Legacy)(uri ${KISYSMOD}/Labels.mod)(options "")(descr "The way you like them."))
(lib (name LEDs)(type Legacy)(uri ${KISYSMOD}/LEDs.mod)(options "")(descr "The way you like them."))
(lib (name Measurement_Points)(type Legacy)(uri ${KISYSMOD}/Measurement_Points.mod)(options "")(descr "The way you like them."))
(lib (name Measurement_Scales)(type Legacy)(uri ${KISYSMOD}/Measurement_Scales.mod)(options "")(descr "The way you like them."))
(lib (name Mechanical_Sockets)(type Legacy)(uri ${KISYSMOD}/Mechanical_Sockets.mod)(options "")(descr DIN41612))
(lib (name Mounting_Holes)(type Legacy)(uri ${KISYSMOD}/Mounting_Holes.mod)(options "")(descr "The way you like them."))
(lib (name Muonde)(type Legacy)(uri ${KISYSMOD}/Muonde.mod)(options "")(descr "The way you like them."))
(lib (name NF-Transformers_ETAL)(type Legacy)(uri ${KISYSMOD}/NF-Transformers_ETAL.mod)(options "")(descr "The way you like them."))
(lib (name Oddities)(type Legacy)(uri ${KISYSMOD}/Oddities.mod)(options "")(descr "The way you like them."))
(lib (name Opto-Devices)(type Legacy)(uri ${KISYSMOD}/Opto-Devices.mod)(options "")(descr "The way you like them."))
(lib (name Oscillator-Modules)(type Legacy)(uri ${KISYSMOD}/Oscillator-Modules.mod)(options "")(descr "The way you like them."))
(lib (name Oscillators)(type Legacy)(uri ${KISYSMOD}/Oscillators.mod)(options "")(descr "SI570, SI571"))
(lib (name Pentawatts)(type Legacy)(uri ${KISYSMOD}/Pentawatts.mod)(options "")(descr "The way you like them."))
(lib (name PFF_PSF_PSS_Leadforms)(type Legacy)(uri ${KISYSMOD}/PFF_PSF_PSS_Leadforms.mod)(options "")(descr Allegro_ACS754_ACS755_ACS756_HallCurrentSensor))
(lib (name Pin_Arrays)(type Legacy)(uri ${KISYSMOD}/Pin_Arrays.mod)(options "")(descr "The way you like them."))
(lib (name Potentiometers)(type Legacy)(uri ${KISYSMOD}/Potentiometers.mod)(options "")(descr "The way you like them."))
(lib (name Power_Integrations)(type Legacy)(uri ${KISYSMOD}/Power_Integrations.mod)(options "")(descr "The way you like them."))
(lib (name Printtrafo_CHK)(type Legacy)(uri ${KISYSMOD}/Printtrafo_CHK.mod)(options "")(descr "The way you like them."))
(lib (name Relays_ThroughHole)(type Legacy)(uri ${KISYSMOD}/Relays_ThroughHole.mod)(options "")(descr "The way you like them."))
(lib (name Resistors_SMD)(type Legacy)(uri ${KISYSMOD}/Resistors_SMD.mod)(options "")(descr "The way you like them."))
(lib (name Resistors_ThroughHole)(type Legacy)(uri ${KISYSMOD}/Resistors_ThroughHole.mod)(options "")(descr "The way you like them."))
(lib (name Resistors_Universal)(type Legacy)(uri ${KISYSMOD}/Resistors_Universal.mod)(options "")(descr Experimental))
(lib (name SMD_Packages)(type Legacy)(uri ${KISYSMOD}/SMD_Packages.mod)(options "")(descr "The way you like them."))
(lib (name Sockets_DIP)(type Legacy)(uri ${KISYSMOD}/Sockets_DIP.mod)(options "")(descr "The way you like them."))
(lib (name Sockets_Mini-Universal)(type Legacy)(uri ${KISYSMOD}/Sockets_Mini-Universal.mod)(options "")(descr Mate-N-Lok))
(lib (name Sockets_MOLEX_KK-System)(type Legacy)(uri ${KISYSMOD}/Sockets_MOLEX_KK-System.mod)(options "")(descr "The way you like them."))
(lib (name Sockets_PGA)(type Legacy)(uri ${KISYSMOD}/Sockets_PGA.mod)(options "")(descr "The way you like them."))
(lib (name Sockets)(type Legacy)(uri ${KISYSMOD}/Sockets.mod)(options "")(descr "The way you like them."))
(lib (name Sockets_WAGO734)(type Legacy)(uri ${KISYSMOD}/Sockets_WAGO734.mod)(options "")(descr "The way you like them."))
(lib (name SOIC_Packages)(type Legacy)(uri ${KISYSMOD}/SOIC_Packages.mod)(options "")(descr "The way you like them."))
(lib (name SSOP_Packages)(type Legacy)(uri ${KISYSMOD}/SSOP_Packages.mod)(options "")(descr "The way you like them."))
(lib (name Terminal_Blocks)(type Legacy)(uri ${KISYSMOD}/Terminal_Blocks.mod)(options "")(descr WAGO236-RM5mm))
(lib (name Transformers_SMPS_ThroughHole)(type Legacy)(uri ${KISYSMOD}/Transformers_SMPS_ThroughHole.mod)(options "")(descr "The way you like them."))
(lib (name Transistors_SMD)(type Legacy)(uri ${KISYSMOD}/Transistors_SMD.mod)(options "")(descr "The way you like them."))
(lib (name Transistors_TO-220)(type Legacy)(uri ${KISYSMOD}/Transistors_TO-220.mod)(options "")(descr "The way you like them."))
(lib (name Transistors_TO-247)(type Legacy)(uri ${KISYSMOD}/Transistors_TO-247.mod)(options "")(descr "The way you like them."))
(lib (name Valves)(type Legacy)(uri ${KISYSMOD}/Valves.mod)(options "")(descr "The way you like them."))
(lib (name Wire_Connections_Bridges)(type Legacy)(uri ${KISYSMOD}/Wire_Connections_Bridges.mod)(options "")(descr "The way you like them."))
(lib (name Wire_Pads)(type Legacy)(uri ${KISYSMOD}/Wire_Pads.mod)(options "")(descr "The way you like them."))
)
NICKNAME,TYPE,URI,OPTIONS,DESCR,,FP LIB TABLE: made from KiCad's Bazaar 'library' repository on 2013-06-25
Allegro_ACS754_ACS755_ACS756_HallCurrentSensor_RevA,Legacy,${KISYSMOD}/Allegro_ACS754_ACS755_ACS756_HallCurrentSensor_RevA.mod,"",""
capacitors,Legacy,${KISYSMOD}/capacitors.mod,"",""
Capacitors_SMD_RevA,Legacy,${KISYSMOD}/Capacitors_SMD_RevA.mod,"",""
connect,Legacy,${KISYSMOD}/connect.mod,"",""
connectors_molex_serial_53047-A123,Legacy,${KISYSMOD}/connectors_molex_serial_53047-A123.mod,"",""
Crystals_RevB_20Apr2013,Legacy,${KISYSMOD}/Crystals_RevB_20Apr2013.mod,"",""
DCDC-ACDC-Converter_RevC_20Jul2012,Legacy,${KISYSMOD}/DCDC-ACDC-Converter_RevC_20Jul2012.mod,"",""
Dioden_SMD_RevA_31May2013,Legacy,${KISYSMOD}/Dioden_SMD_RevA_31May2013.mod,"",""
Dioden_ThroughHole_RevC,Legacy,${KISYSMOD}/Dioden_ThroughHole_RevC.mod,"",""
dip_sockets,Legacy,${KISYSMOD}/dip_sockets.mod,"",""
discret,Legacy,${KISYSMOD}/discret.mod,"",""
display,Legacy,${KISYSMOD}/display.mod,"",""
divers,Legacy,${KISYSMOD}/divers.mod,"",""
Elko_ThroughHole_RevB-3_30Dec2011,Legacy,${KISYSMOD}/Elko_ThroughHole_RevB-3_30Dec2011.mod,"",""
EuroBoardoutline_RevC,Legacy,${KISYSMOD}/EuroBoardoutline_RevC.mod,"",""
Fiducials_RevC_04Aug2012,Legacy,${KISYSMOD}/Fiducials_RevC_04Aug2012.mod,"",""
Footprint-Symbols_RevD_28Aug2012,Legacy,${KISYSMOD}/Footprint-Symbols_RevD_28Aug2012.mod,"",""
FuseholderAndFuses_RevD_28Aug2012,Legacy,${KISYSMOD}/FuseholderAndFuses_RevD_28Aug2012.mod,"",""
Heatsinks_RevC,Legacy,${KISYSMOD}/Heatsinks_RevC.mod,"",""
inductors,Legacy,${KISYSMOD}/inductors.mod,"",""
IR-directFET_Packages_RevB,Legacy,${KISYSMOD}/IR-directFET_Packages_RevB.mod,"",""
iut,Legacy,${KISYSMOD}/iut.mod,"",""
Label_RevA_21Mar2011,Legacy,${KISYSMOD}/Label_RevA_21Mar2011.mod,"",""
led,Legacy,${KISYSMOD}/led.mod,"",""
libcms,Legacy,${KISYSMOD}/libcms.mod,"",""
Measurement_Point_RevA,Legacy,${KISYSMOD}/Measurement_Point_RevA.mod,"",""
Measurement-Scala_RevA,Legacy,${KISYSMOD}/Measurement-Scala_RevA.mod,"",""
Mechanical_Socket-Plug_DIN41612-Stuff_RevA,Legacy,${KISYSMOD}/Mechanical_Socket-Plug_DIN41612-Stuff_RevA.mod,"",""
MiniUniversalMate-N-LokSockets_13Aug2012,Legacy,${KISYSMOD}/MiniUniversalMate-N-LokSockets_13Aug2012.mod,"",""
MountingHole_RevA,Legacy,${KISYSMOD}/MountingHole_RevA.mod,"",""
muonde,Legacy,${KISYSMOD}/muonde.mod,"",""
Neosid_Air-Coil_SML_HAMxx31A_HDMxx31A_RevA_25Apr2012,Legacy,${KISYSMOD}/Neosid_Air-Coil_SML_HAMxx31A_HDMxx31A_RevA_25Apr2012.mod,"",""
Neosid_Filter_HF-Coil_25Apr2012,Legacy,${KISYSMOD}/Neosid_Filter_HF-Coil_25Apr2012.mod,"",""
Neosid_Inductor_21Apr2012,Legacy,${KISYSMOD}/Neosid_Inductor_21Apr2012.mod,"",""
NF-Transformer_ETAL_RevA_28Aug2012,Legacy,${KISYSMOD}/NF-Transformer_ETAL_RevA_28Aug2012.mod,"",""
Oddities_RevA_10Mar2011,Legacy,${KISYSMOD}/Oddities_RevA_10Mar2011.mod,"",""
Opto-Devices_RevC_03Oct2012,Legacy,${KISYSMOD}/Opto-Devices_RevC_03Oct2012.mod,"",""
Oscillator-Modul_RevA,Legacy,${KISYSMOD}/Oscillator-Modul_RevA.mod,"",""
Pentawatt_RevB_30Apr2011,Legacy,${KISYSMOD}/Pentawatt_RevB_30Apr2011.mod,"",""
pga_sockets,Legacy,${KISYSMOD}/pga_sockets.mod,"",""
pin_array,Legacy,${KISYSMOD}/pin_array.mod,"",""
Potentiometer_RevB_02Aug2010,Legacy,${KISYSMOD}/Potentiometer_RevB_02Aug2010.mod,"",""
powerint,Legacy,${KISYSMOD}/powerint.mod,"",""
Printtrafo_CHK_RevA_04Aug2010,Legacy,${KISYSMOD}/Printtrafo_CHK_RevA_04Aug2010.mod,"",""
Relay_ThroughHole_RevB,Legacy,${KISYSMOD}/Relay_ThroughHole_RevB.mod,"",""
Resistor_SMD_RevA,Legacy,${KISYSMOD}/Resistor_SMD_RevA.mod,"",""
Resistor_ThroughHole_RevB_22Apr2011,Legacy,${KISYSMOD}/Resistor_ThroughHole_RevB_22Apr2011.mod,"",""
Resistor_Universal-Experimental_RevA,Legacy,${KISYSMOD}/Resistor_Universal-Experimental_RevA.mod,"",""
SI570_SI571_Oscillator_RevA_11Jun2012,Legacy,${KISYSMOD}/SI570_SI571_Oscillator_RevA_11Jun2012.mod,"",""
SIP9_Housing_14Jun2013,Legacy,${KISYSMOD}/SIP9_Housing_14Jun2013.mod,"",""
smd_capacitors,Legacy,${KISYSMOD}/smd_capacitors.mod,"",""
smd_crystal_and_oscillator,Legacy,${KISYSMOD}/smd_crystal_and_oscillator.mod,"",""
smd_resistors,Legacy,${KISYSMOD}/smd_resistors.mod,"",""
smd_soic_packages,Legacy,${KISYSMOD}/smd_soic_packages.mod,"",""
smd_ssop_packages,Legacy,${KISYSMOD}/smd_ssop_packages.mod,"",""
smd_transistors,Legacy,${KISYSMOD}/smd_transistors.mod,"",""
Socket_MOLEX-KK-System,Legacy,${KISYSMOD}/Socket_MOLEX-KK-System.mod,"",""
sockets,Legacy,${KISYSMOD}/sockets.mod,"",""
Socket_WAGO734_RevA,Legacy,${KISYSMOD}/Socket_WAGO734_RevA.mod,"",""
SOT126_SOT32_Housings_RevA_22Oct2012,Legacy,${KISYSMOD}/SOT126_SOT32_Housings_RevA_22Oct2012.mod,"",""
SOT23_SOT143_SOT143R_TSOT6_MK06A_SC70-6_Housing_26Jul2012,Legacy,${KISYSMOD}/SOT23_SOT143_SOT143R_TSOT6_MK06A_SC70-6_Housing_26Jul2012.mod,"",""
SOT89-3_SOT89-5_Housing_RevA_02Sep2012,Legacy,${KISYSMOD}/SOT89-3_SOT89-5_Housing_RevA_02Sep2012.mod,"",""
TerminalBlock_WAGO236-RM5mm_RevA2-cache,Legacy,${KISYSMOD}/TerminalBlock_WAGO236-RM5mm_RevA2-cache.mod,"",""
TO-50_Housings_RevA_21Apr2013,Legacy,${KISYSMOD}/TO-50_Housings_RevA_21Apr2013.mod,"",""
TO-78_Housing_RevA_04Jun2013,Legacy,${KISYSMOD}/TO-78_Housing_RevA_04Jun2013.mod,"",""
TO-92_Housings_06Jun2013,Legacy,${KISYSMOD}/TO-92_Housings_06Jun2013.mod,"",""
TransformerSMPS_ThroughHole_RevA,Legacy,${KISYSMOD}/TransformerSMPS_ThroughHole_RevA.mod,"",""
Transistor_TO-220_RevB_03Sep2012,Legacy,${KISYSMOD}/Transistor_TO-220_RevB_03Sep2012.mod,"",""
Transistor_TO-247_RevC,Legacy,${KISYSMOD}/Transistor_TO-247_RevC.mod,"",""
valves,Legacy,${KISYSMOD}/valves.mod,"",""
VML0806_Housing_Rohm_RevA_26Oct2012,Legacy,${KISYSMOD}/VML0806_Housing_Rohm_RevA_26Oct2012.mod,"",""
WireConnections-Bridges_RevA,Legacy,${KISYSMOD}/WireConnections-Bridges_RevA.mod,"",""
WirePads_RevA_15Jun2010,Legacy,${KISYSMOD}/WirePads_RevA_15Jun2010.mod,"",""
This diff is collapsed.
# Set GH environment variable to "https://github.com/CarlPoirier"
# before starting KiCad to use this fp table.
(fp_lib_table
(lib (name 7Segment_16Sep2013)(type Github)(uri ${GH}/7Segment_16Sep2013)(options "")(descr ""))
(lib (name Allegro_HallCurrentSensor)(type Github)(uri ${GH}/Allegro_ACS754_ACS755_ACS756_HallCurrentSensor_RevA)(options "")(descr ""))
(lib (name BNC-Sockets_RevA)(type Github)(uri ${GH}/BNC-Sockets_RevA)(options "")(descr ""))
(lib (name Buzzer_Beeper_RevA_25Oct2010)(type Github)(uri ${GH}/Buzzer_Beeper_RevA_25Oct2010)(options "")(descr ""))
(lib (name capacitors)(type Github)(uri ${GH}/capacitors)(options "")(descr ""))
(lib (name Capacitors_SMD) (type Github)(uri ${GH}/Capacitors_SMD_RevA)(options "")(descr ""))
(lib (name Capacitors_ThroughHole) (type Github)(uri ${GH}/Capacitors_ThroughHole_RevA)(options "")(descr ""))
(lib (name Choke_Axial_ThroughHole) (type Github)(uri ${GH}/Choke_Axial_ThroughHole_RevB)(options "")(descr ""))
(lib (name Choke_Radial_ThroughHole) (type Github)(uri ${GH}/Choke_Radial_ThroughHole_CD_Bobin_RevA)(options "")(descr ""))
(lib (name Choke_SMD_RevB_28Dez2012) (type Github)(uri ${GH}/Choke_SMD_RevB_28Dez2012)(options "")(descr ""))
(lib (name Choke_Toroid_ThroughHole)(type Github)(uri ${GH}/Choke_Toroid_ThroughHole_RevC_06Aug2010)(options "")(descr ""))
(lib (name CommonModeChoke_Wuerth)(type Github)(uri ${GH}/CommonModeChoke_Wuerth_Type-WE-CMB_RevA_24Oct2010)(options "")(descr ""))
(lib (name connect)(type Github)(uri ${GH}/connect)(options "")(descr ""))
(lib (name connectors_molex_serial)(type Github)(uri ${GH}/connectors_molex_serial_53047-A123)(options "")(descr ""))
(lib (name Crystals)(type Github)(uri ${GH}/Crystals_RevB_20Apr2013)(options "")(descr ""))
(lib (name DCDC-ACDC-Converter)(type Github)(uri ${GH}/DCDC-ACDC-Converter_RevC_20Jul2012)(options "")(descr ""))
(lib (name Dioden_SMD)(type Github)(uri ${GH}/Dioden_SMD_RevA_31May2013)(options "")(descr ""))
(lib (name Dioden_ThroughHole)(type Github)(uri ${GH}/Dioden_ThroughHole_RevC)(options "")(descr ""))
(lib (name dip_sockets)(type Github)(uri ${GH}/dip_sockets)(options "")(descr ""))
(lib (name discret)(type Github)(uri ${GH}/discret)(options "")(descr ""))
(lib (name display)(type Github)(uri ${GH}/display)(options "")(descr ""))
(lib (name divers)(type Github)(uri ${GH}/divers)(options "")(descr ""))
(lib (name Elko_ThroughHole)(type Github)(uri ${GH}/Elko_ThroughHole_RevB-3_30Dec2011)(options "")(descr ""))
(lib (name EuroBoardoutline)(type Github)(uri ${GH}/EuroBoardoutline_RevC)(options "")(descr ""))
(lib (name Fiducials)(type Github)(uri ${GH}/Fiducials_RevC_04Aug2012)(options "")(descr ""))
(lib (name Footprint-Symbols)(type Github)(uri ${GH}/Footprint-Symbols_RevD_28Aug2012)(options "")(descr ""))
(lib (name FuseholderAndFuses)(type Github)(uri ${GH}/FuseholderAndFuses_RevD_28Aug2012)(options "")(descr ""))
(lib (name Heatsinks)(type Github)(uri ${GH}/Heatsinks_RevC)(options "")(descr ""))
(lib (name inductors)(type Github)(uri ${GH}/inductors)(options "")(descr ""))
(lib (name IR-directFET)(type Github)(uri ${GH}/IR-directFET_Packages_RevB)(options "")(descr ""))
(lib (name iut)(type Github)(uri ${GH}/iut)(options "")(descr ""))
(lib (name Label)(type Github)(uri ${GH}/Label_RevA_21Mar2011)(options "")(descr ""))
(lib (name led)(type Github)(uri ${GH}/led)(options "")(descr ""))
(lib (name libcms)(type Github)(uri ${GH}/libcms)(options "")(descr ""))
(lib (name Measurement_Point)(type Github)(uri ${GH}/Measurement_Point_RevA)(options "")(descr ""))
(lib (name Measurement-Scala)(type Github)(uri ${GH}/Measurement-Scala_RevA)(options "")(descr ""))
(lib (name Mechanical_Socket-Plug_DIN41612)(type Github)(uri ${GH}/Mechanical_Socket-Plug_DIN41612-Stuff_RevA)(options "")(descr ""))
(lib (name MiniUniversalMate-N-LokSockets)(type Github)(uri ${GH}/MiniUniversalMate-N-LokSockets_13Aug2012)(options "")(descr ""))
(lib (name MountingHole)(type Github)(uri ${GH}/MountingHole_RevA)(options "")(descr ""))
(lib (name muonde)(type Github)(uri ${GH}/muonde)(options "")(descr ""))
(lib (name Neosid_Air-Coil)(type Github)(uri ${GH}/Neosid_Air-Coil_SML_HAMxx31A_HDMxx31A_RevA_25Apr2012)(options "")(descr ""))
(lib (name Neosid_Filter_HF-Coil)(type Github)(uri ${GH}/Neosid_Filter_HF-Coil_25Apr2012)(options "")(descr ""))
(lib (name Neosid_Inductor)(type Github)(uri ${GH}/Neosid_Inductor_21Apr2012)(options "")(descr ""))
(lib (name NF-Transformer_ETAL)(type Github)(uri ${GH}/NF-Transformer_ETAL_RevA_28Aug2012)(options "")(descr ""))
(lib (name Oddities)(type Github)(uri ${GH}/Oddities_RevA_10Mar2011)(options "")(descr ""))
(lib (name OldSowjetAera_Transistor)(type Github)(uri ${GH}/OldSowjetAera_Transistor_RevA)(options "")(descr ""))
(lib (name Opto-Devices)(type Github)(uri ${GH}/Opto-Devices_RevC_03Oct2012)(options "")(descr ""))
(lib (name Oscillator)(type Github)(uri ${GH}/Oscillator-Modul_RevA)(options "")(descr ""))
(lib (name Pentawatt)(type Github)(uri ${GH}/Pentawatt_RevB_30Apr2011)(options "")(descr ""))
(lib (name pga_sockets)(type Github)(uri ${GH}/pga_sockets)(options "")(descr ""))
(lib (name pin_array)(type Github)(uri ${GH}/pin_array)(options "")(descr ""))
(lib (name Potentiometer)(type Github)(uri ${GH}/Potentiometer_RevB_02Aug2010)(options "")(descr ""))
(lib (name powerint)(type Github)(uri ${GH}/powerint)(options "")(descr ""))
(lib (name Printtrafo)(type Github)(uri ${GH}/Printtrafo_CHK_RevA_04Aug2010)(options "")(descr ""))
(lib (name Relay_ThroughHole)(type Github)(uri ${GH}/Relay_ThroughHole_RevB)(options "")(descr ""))
(lib (name Resistor_SMD)(type Github)(uri ${GH}/Resistor_SMD_RevA)(options "")(descr ""))
(lib (name Resistor_ThroughHole)(type Github)(uri ${GH}/Resistor_ThroughHole_RevB_22Apr2011)(options "")(descr ""))
(lib (name Resistor_Universal)(type Github)(uri ${GH}/Resistor_Universal-Experimental_RevA)(options "")(descr ""))
(lib (name SI570_SI571_Oscillator)(type Github)(uri ${GH}/SI570_SI571_Oscillator_RevA_11Jun2012)(options "")(descr ""))
(lib (name SIP9_Housing)(type Github)(uri ${GH}/SIP9_Housing_14Jun2013)(options "")(descr ""))
(lib (name smd_capacitors)(type Github)(uri ${GH}/smd_capacitors)(options "")(descr ""))
(lib (name smd_crystal_and_oscillator)(type Github)(uri ${GH}/smd_crystal_and_oscillator)(options "")(descr ""))
(lib (name smd_lqfp)(type Github)(uri ${GH}/smd_lqfp)(options "")(descr ""))
(lib (name smd_resistors)(type Github)(uri ${GH}/smd_resistors)(options "")(descr ""))
(lib (name smd_soic_packages)(type Github)(uri ${GH}/smd_soic_packages)(options "")(descr ""))
(lib (name smd_ssop_packages)(type Github)(uri ${GH}/smd_ssop_packages)(options "")(descr ""))
(lib (name smd_transistors)(type Github)(uri ${GH}/smd_transistors)(options "")(descr ""))
(lib (name Socket_MOLEX-KK-System)(type Github)(uri ${GH}/Socket_MOLEX-KK-System)(options "")(descr ""))
(lib (name sockets)(type Github)(uri ${GH}/sockets)(options "")(descr ""))
(lib (name Socket_WAGO734)(type Github)(uri ${GH}/Socket_WAGO734_RevA)(options "")(descr ""))
(lib (name SOT126_SOT32)(type Github)(uri ${GH}/SOT126_SOT32_Housings_RevA_22Oct2012)(options "")(descr ""))
(lib (name SOT23_SOT143_SOT143R_TSOT6_MK06A_SC70)(type Github)(uri ${GH}/SOT23_SOT143_SOT143R_TSOT6_MK06A_SC70-6_Housing_26Jul2012)(options "")(descr ""))
(lib (name SOT89-3_SOT89-5)(type Github)(uri ${GH}/SOT89-3_SOT89-5_Housing_RevA_02Sep2012)(options "")(descr ""))
(lib (name TantalCapacitors_SMD)(type Github)(uri ${GH}/TantalCapacitors_SMD_RevA_28Aug2012)(options "")(descr ""))
(lib (name TerminalBlock_WAGO236-RM5mm)(type Github)(uri ${GH}/TerminalBlock_WAGO236-RM5mm_RevA2)(options "")(descr ""))
(lib (name TO-50)(type Github)(uri ${GH}/TO-50_Housings_RevA_21Apr2013)(options "")(descr ""))
(lib (name TO-78)(type Github)(uri ${GH}/TO-78_Housing_RevA_04Jun2013)(options "")(descr ""))
(lib (name TO-92)(type Github)(uri ${GH}/TO-92_Housings_06Jun2013)(options "")(descr ""))
(lib (name TransformerSMPS_ThroughHole)(type Github)(uri ${GH}/TransformerSMPS_ThroughHole_RevA)(options "")(descr ""))
(lib (name Transistor_TO-220)(type Github)(uri ${GH}/Transistor_TO-220_RevB_03Sep2012)(options "")(descr ""))
(lib (name Transistor_TO-247)(type Github)(uri ${GH}/Transistor_TO-247_RevC)(options "")(descr ""))
(lib (name valves)(type Github)(uri ${GH}/valves)(options "")(descr ""))
(lib (name VML0806_Housing_Rohm)(type Github)(uri ${GH}/VML0806_Housing_Rohm_RevA_26Oct2012)(options "")(descr ""))
(lib (name WireConnections-Bridges)(type Github)(uri ${GH}/WireConnections-Bridges_RevA)(options "")(descr ""))
(lib (name WirePads)(type Github)(uri ${GH}/WirePads_RevA_15Jun2010)(options "")(descr ""))
)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment