begin working on Distributed Library for EESCHEMA

This commit is contained in:
Dick Hollenbeck 2010-12-18 09:19:15 -06:00
parent 5694818d2d
commit 2e45c1a180
6 changed files with 1387 additions and 92 deletions

View File

@ -297,7 +297,7 @@ SYMBOL_CACHE_SIZE = 0
# Private class members and static file members will be hidden unless
# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
EXTRACT_ALL = YES
EXTRACT_ALL = NO
# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
# will be included in the documentation.
@ -336,7 +336,7 @@ EXTRACT_ANON_NSPACES = NO
# various overviews, but no documentation section is generated.
# This option has no effect if EXTRACT_ALL is enabled.
HIDE_UNDOC_MEMBERS = NO
HIDE_UNDOC_MEMBERS = YES
# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
# undocumented classes that are normally visible in the class hierarchy.
@ -357,7 +357,7 @@ HIDE_FRIEND_COMPOUNDS = NO
# If set to NO (the default) these blocks will be appended to the
# function's detailed documentation block.
HIDE_IN_BODY_DOCS = NO
HIDE_IN_BODY_DOCS = YES
# The INTERNAL_DOCS tag determines if documentation
# that is typed after a \internal command is included. If the tag is set
@ -402,7 +402,7 @@ INLINE_INFO = YES
# alphabetically by member name. If set to NO the members will appear in
# declaration order.
SORT_MEMBER_DOCS = YES
SORT_MEMBER_DOCS = NO
# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
# brief documentation of file, namespace and class members alphabetically
@ -1390,7 +1390,7 @@ HIDE_UNDOC_RELATIONS = YES
# toolkit from AT&T and Lucent Bell Labs. The other options in this section
# have no effect if this option is set to NO (the default)
HAVE_DOT = NO
HAVE_DOT = YES
# By default doxygen will write a font called FreeSans.ttf to the output
# directory and reference it in all dot files that doxygen generates. This

View File

@ -1,4 +1,5 @@
namespace SCH {
/** @mainpage
@ -45,7 +46,7 @@ can be library specializations or niches.
<p> Often a found part is close to what is needed but not exactly what is
needed. This Distributed Library System design incorporates the concept of part
inheritance using a part description language called <b>(Sweet)</b>. Sweet is
inheritance using a part description language called <b>Sweet</b>. Sweet is
based on s-expression syntax. Inheritance is the ability to incrementally change
an existing part without completely re-designing it. It is sometimes easier to
modify an existing part than it is to create the new part entirely from scratch.
@ -75,16 +76,21 @@ nest within grammars. So once you are inside a grammatical element, it will have
its own set of rules as to which nested elements it may hold, and once you enter
one of those nested elements, then that nested element's grammar pertains,
etc.<p> In the case of the grammar for a part, the grammar itself is being given
the name "Sweet". The name does not extend to the grammar for the schematic,
the name Sweet. The name does not extend to the grammar for the schematic,
only the part grammar.</dd>
<dt>Schematic</dt><dd>This consists of one or more sheets and will be different
in three ways from existing schematics. <ul> <li>All sheets will be in one file,
thus the entire schematic is in one file. <li>The schematic file will have its
own s-expression grammar. <li> There will be a (parts_list) within the
schematic, and within the parts_list will be all the parts for the schematic,
yes <b>all</b> of them, every last one of them.</ul> Within the sheets of the
schematic will be components.</dd>
in three ways from existing schematics. <ul>
<li>All sheets will be in one file, thus the entire schematic is in one file.
<li>The schematic file will have its own s-expression grammar.
<li> There will be a <b>parts list</b> within the schematic, and within the
parts list will be <b>all</b> the parts for the schematic. yes <b>all</b> of
them. See class PARTS_LIST.</ul>
Within the sheets of the schematic will be components.</dd>
<dt>Component</dt><dd>A component is an instantiated part. The keyword for
component is (comp). A component does not have any of its own properties other
@ -98,7 +104,7 @@ BOM can be made simply from the parts_list.</dd>
<dt>Component, again for good measure.</dt><dd>A component is an instantiation
of a part. A component exists within a schematic which has a parts list
containing the part from which the component is instantiated. A component has a
unique reference designator, component ref, its own location, orientation,
unique reference designator, part ref, its own location, orientation,
stuff/DNS, and text attributes but <b>not</b> its own text fields/strings (other
than reference designator). The part which is instantiated must exist in the
parts list of the same schematic.</dd>
@ -137,6 +143,42 @@ a library source and a library sink is that a source is a readable entity.</dd>
written to for future reading. The difference between a library source and a
library sink is that a library sink is a writable entity.</dd>
<dt>Symbol</dt><dd>The term "symbol" is not used in a specific way in this
document. There is no symbol in any of the grammars, so use of it on the
developers list will not be understood without explanation. Of course it is
possible to have multiple parts all extend a common base part, and you can think
of the base part as having most if not all the graphical lines for any
derivatives. But we do not need to use the term symbol to describe that
relationship, the term "part" is sufficient.</dd>
<dt>LPID</dt><dd>This stand for "Logical Part ID", and is a reference to any
part within any known library. The term "logical" is used because the contained
library name is logical, not a full library name. The LPID consists of 3 main
portions: logical library name, part name, and revision number.</dd>
<dt>Library Table</dt><dd>This is a lookup table that maps a logical library
name (i.e. a short name) into a fully specified library name and library type.
An applicable library table consists of rows from (at least) two sources:<ol>
<li>A schematic resident library table.
<li>A personal library table.
</ol>
These rows from the two sources are conceptually concatonated (although they may
not be physically concatonated in the implementation, TBD). The schematic
resident rows take presedence over the personal library table if there are
logical library names duplicately defined. (Or we will simply ask that any remote
(i.e. public) libraries use uppercase first letters in logical names, TBD.)
<p> Eventually there will be an external publicly available internet based
logical library table also, but this will need to be glued down at a hard coded
URL that we have control over. The internet based library table allows us to
advertise remote libraries without having to issue an update to Kicad.</dd>
<dt>Query Language</dt><dd>This is a means of searching for something that is
contained within a container. Since some library sources are remote, it is
important to be able to ask the library source for a part that matches some
criteria, for performance reasons.</dd>
</dl>
@ -154,14 +196,14 @@ Here are some of the changes required: <ul>
file. The multiple sheet support will still exist, but all the sheets for a
single schematic are all in a single file.
<li> A "library" is a collection of "parts". The term "symbol" is not used. The
unit of retrieval from a library is a part as a textual string in the Sweet
language. Sweet is a particular "grammar" expressed in s-expression form, and
can be used to fully describe parts. Because EESCHEMA does not actually see a
"library file", (remember, EESCHEMA can only ask for a part), the actual file
format for a library is no longer pertinent nor visible to the core of EESCHEMA.
The unit of retrieval from the API is the part, so EESCHEMA gets an entire part
s-expression and must then parse it as a RAM resident Sweet string.
<li> A "library" is a collection of "parts". The unit of retrieval from a
library is a part as a textual string in the Sweet language. Sweet is a
particular "grammar" expressed in s-expression form, and can be used to fully
describe parts. Because EESCHEMA does not actually see a "library file",
(remember, EESCHEMA can only ask for a part), the actual file format for a
library is no longer pertinent nor visible to the core of EESCHEMA. The unit of
retrieval from the API is the part, so EESCHEMA gets an entire part s-expression
and must then parse it as a RAM resident Sweet string.
<li>EESCHEMA knows of no library files, instead there is a library API which
abstracts the actual part storage strategy used within any library
@ -233,12 +275,15 @@ will also omit the logical library name from the LPID, and it must omit it. Why?
Well because it makes renaming the library easier, for one. Two, the logical
library name is only a lookup key into a "library table". The library table maps
the logical library name into an actual library source [and sink, iff writable].
See LIB_SOURCE and LIB_SINK.
<p> In the case of the component referencing the part that it "is", there is no
revision number allowed in the LPID. This is because that reference is to the
part in the parts list, and the parts list only holds a single revision of any
part (where "revision" is what you understand from version control systems).
<li> There needs to be a new query language designed and each library source
needs to support it. See LIB_SOURCE::FindParts() for a brief description of one.
</ul>
@ -276,7 +321,7 @@ resolvable.
http://msdn.microsoft.com/en-us/library/ms364057%28VS.80%29.aspx
Even with NRVO provided by most C++ compilers, I don't see it being as lean as
having class LIB keep expanded members STRING fetch and STRINGS vfetched for the
having class LIB keep expanded members STRING fetch and STRINGS vfetch for the
aResults values. But at the topmost API, client convenience is worth a minor
sacrifice in speed, so the topmost API does return these complex string objects
for convenience. So there is a different strategy underneath the hood than what
@ -294,14 +339,14 @@ library in the new design is LIB.
<p>
Show architecture here.
<a href="../drawing.svg" > Click here to see an architectural drawing.</a>
<a href="../drawing.png" > Click here to see an architectural drawing.</a>
*/
/**
* \defgroup STRING Types
* \defgroup string_types STRING Types
* Provide some string types for use within the API.
* @{
*/
@ -324,10 +369,29 @@ typedef std::dequeue<STRING> STRING_TOKS;
typedef std::dequeue<STRING> STRINGS;
//typedef std::vector<wxString> WSTRINGS;
const STRING StrEmpty = "";
/** @} STRING Types */
/** @} string_types STRING Types */
/**
* \defgroup exception_types Exception Types
* Provide some exception types for use within the API.
* @{
*/
/**
* Class PARSE_ERROR
* contains a filename or source description, a line number, a character offset,
* and an error message.
*/
struct PARSE_ERROR : public IO_ERROR
{
};
/** @} exception_types Exception Types */
/**
@ -348,11 +412,13 @@ class PART
friend class LIB;
/// a private constructor, only a LIB can instantiate one.
/// a private constructor, only a LIB can instantiate a PART.
PART() {}
protected: // not likely to have descendants, but protected none-the-less.
protected: // not likely to have C++ descendants, but protected none-the-less.
bool parsed; ///< true if the body as been parsed already.
LIB* owner; ///< which LIB am I a part of (pun if you want)
STRING extends; ///< LPID of base part
@ -363,7 +429,21 @@ protected: // not likely to have descendants, but protected none-the-less.
/// actually becomes cached in RAM.
STRING body;
// lots of other stuff.
// 3 separate lists for speed:
/// A property list.
PROPERTIES properties;
/// A drawing list for graphics
DRAWINGS drawings;
/// A pin list
PINS pins;
/// Alternate body forms.
ALTERNATES alternates;
// lots of other stuff, like the mandatory properties.
public:
@ -371,16 +451,25 @@ public:
/**
* Function Inherit
* is a specialized assignment function that copies a specific subset, enough
* to fulfill the requirements of the sweet s-expression language.
* to fulfill the requirements of the Sweet s-expression language.
*/
void Inherit( const PART& aBasePart );
/**
* Function Owner
* returns the LIB* owner of this part.
*/
LIB Owner() { return owner; }
/**
* Function Parse
* translates the \a body string into a binary form that is represented
* by the normal fields of this class. Parse is expected to call Inherit()
* if this part extends any other.
*/
void Parse( DSN_LEXER* aLexer ) throw( PARSE_EXCEPTION );
};
@ -388,7 +477,7 @@ public:
* Class LPID (aka GUID)
* is a Logical Part ID and consists of various portions much like a URI. It
* relies heavily on a logical library name to hide where actual physical library
* sources reside. Its static functions serve as managers of the library table to
* sources reside. Its static functions serve as managers of the "library table" to
* map logical library names to actual library sources.
* <p>
* Example LPID string:
@ -403,12 +492,12 @@ public:
* </ul>
* <p>
* This class owns the <b>library table</b>, which is like fstab in concept and maps logical
* library name to library URI, type, and password. It has the following columns:
* library name to library URI, type, and options. It has the following columns:
* <ul>
* <li> Logical Library Name
* <li> Library Type
* <li> Library URI
* <li> Password
* <li> Library URI. The full URI to the library source, form dependent on Type.
* <li> Options, used for access, such as password
* </ul>
* <p>
* For now, the Library Type can be one of:
@ -429,19 +518,26 @@ public:
* <li> "http://kicad.org/partlib"
* </ul>
* <p>
* The library table is built up from several sources, and is a concatenation
* of those sources.
* The applicable library table is built up from several additive rows (table fragments),
* and the final table is a merging of the table fragments. Two anticipated sources of
* the rows are a personal table, and a schematic resident table. The schematic
* resident table rows are considered a higher priority in the final dynamically
* assembled library table. A row in the schematic contribution to the library table
* will take precedence over the personal table if there is a collision on logical
* library name, otherwise the rows simply combine without issue to make up the
* applicable library table.
*/
class LPID // aka GUID
{
public:
/**
* Constructor LPID
* takes aLPID string and parses it. A typical LPID string uses a logical
* library name followed by a part name.
* e.g.: "kicad:passives/R/rev2", or
* e.g.: "me:R33"
* e.g.: "mylib:R33"
*/
LPID( const STRING& aLPID = StrEmpty ) throw( PARSE_ERROR );
LPID( const STRING& aLPID ) throw( PARSE_ERROR );
/**
* Function GetLogLib
@ -491,26 +587,40 @@ class LPID // aka GUID
* Function GetLogicalLibraries
* returns the logical library names, all of them that are in the
* library table.
* @param aSchematic provides access to the full library table inclusive
* of the schematic contribution, or may be NULL to exclude the schematic rows.
*/
static STRINGS GetLogicalLibraries();
static STRINGS GetLogicalLibraries( SCHEMATIC* aSchematic=NULL );
/**
* Function GetLibraryURI
* returns the full library path from a logical library name.
* @param aLogicalLibraryName is the short name for the library of interest.
* @param aSchematic provides access to the full library table inclusive
* of the schematic contribution, or may be NULL to exclude the schematic rows.
*/
static STRING GetLibraryURI( const STRING& aLogicalLibraryName ) const;
static STRING GetLibraryURI( const STRING& aLogicalLibraryName,
SCHEMATIC* aSchematic=NULL ) const;
/**
* Function GetLibraryType
* returns the type of a logical library.
* @param aLogicalLibraryName is the short name for the library of interest.
* @param aSchematic provides access to the full library table inclusive
* of the schematic contribution, or may be NULL to exclude the schematic rows.
*/
static STRING GetLibraryType( const STRING& aLogicalLibraryName ) const;
static STRING GetLibraryType( const STRING& aLogicalLibraryName,
SCHEMATIC* aSchematic=NULL ) const;
/**
* Function GetPassword
* returns the password for this type of a logical library.
* Function GetOptions
* returns the options string for \a aLogicalLibraryName.
* @param aLogicalLibraryName is the short name for the library of interest.
* @param aSchematic provides access to the full library table inclusive
* of the schematic contribution, or may be NULL to exclude the schematic rows.
*/
static STRING GetPassword( const STRING& aLogicalLibraryName ) const;
static STRING GetPassword( const STRING& aLogicalLibraryName,
SCHEMATIC* aSchematic=NULL ) const;
};
@ -584,9 +694,10 @@ protected: ///< derived classes must implement
* the actual library data is remotely located, otherwise it will be too slow
* to honor this portion of the API contract.
*
* @param aQuery is a string holding a domain specific language expression. One candidate
* here is an s-expression that uses (and ..) and (or ..) operators. For example
* "(and (footprint 0805)(value 33ohm)(category passives))"
* @param aQuery is a string holding a domain specific query language expression. One candidate
* here is an s-expression that uses (and ..) and (or ..) operators and uses them as RPN. For example
* "(and (footprint 0805)(value 33ohm)(category passives))".
* The UI can shield the user from this if it wants.
*
* @param aResults is a place to put the fetched part names, one part per STRING.
*/
@ -599,28 +710,6 @@ protected:
};
/**
* Class DIR_LIB_SOURCE
* implements a LIB_SOURCE in a file system directory.
*/
class DIR_LIB_SOURCE : public LIB_SOURCE
{
friend class LIBS; ///< LIBS::GetLib() can construct one.
protected:
/**
* Constructor DIR_LIB_SOURCE( const STRING& aDirectoryPath )
* sets up a LIB_SOURCE using aDirectoryPath in a file system.
* @see LIBS::GetLibrary().
*
* @param aDirectoryPath is a full pathname of a directory which contains
* the library source of part files. Examples might be "C:\kicad_data\mylib" or
* "/home/designer/mylibdir".
*/
DIR_LIB_SOURCE( const STRING& aDirectoryPath ) throws( IO_ERROR );
};
/**
* Class SVN_LIB_SOURCE
@ -646,17 +735,18 @@ protected:
/**
* Class PARTS_LIST_LIB_SOURCE
* implements a LIB_SOURCE in a schematic file.
* Class SCHEMATIC_LIB_SOURCE
* implements a LIB_SOURCE in by reading a parts list from schematic file
* unrelated to the schematic currently being edited.
*/
class PARTS_LIST_LIB_SOURCE : public LIB_SOURCE
class SCHEMATIC_LIB_SOURCE : public LIB_SOURCE
{
friend class LIBS; ///< constructor the LIB uses these functions.
protected:
/**
* Constructor PARTS_LIST_LIB_SOURCE( const STRING& aSchematicFile )
* Constructor SCHEMATIC_LIB_SOURCE( const STRING& aSchematicFile )
* sets up a LIB_SOURCE using aSchematicFile which is a full path and filename
* for a schematic not related to the schematic being editing in
* this EESCHEMA session.
@ -665,7 +755,7 @@ protected:
* @param aSchematicFile is a full path and filename. Example:
* "/home/user/kicadproject/design.sch"
*/
PARTS_LIST_LIB_SOURCE( const STRING& aSchematicFile ) throws( IO_ERROR );
SCHEMATIC_LIB_SOURCE( const STRING& aSchematicFile ) throws( IO_ERROR );
};
@ -688,8 +778,10 @@ protected: ///< derived classes must implement
* portion present. If it is not present, and a overwrite of an existhing
* part is done, then LIB::ReloadPart() must be called on this same part
* and all parts that inherit it must be reparsed.
* @return STRING - if the LIB_SINK support revision numbering, then return a
* evision name that was next in the sequence, e.g. "rev22", else StrEmpty.
*/
virtual void WritePart( const STRING& aPartName,
virtual STRING WritePart( const STRING& aPartName,
const STRING& aSExpression ) throw( IO_ERROR ) = 0;
@ -795,7 +887,7 @@ public:
* returns true if this library has write/save capability. Most LIBs
* are read only.
*/
bool HasSave() { return sink != NULL; }
bool HasSink() { return sink != NULL; }
/**
* Function LogicalName
@ -841,17 +933,10 @@ public:
/**
* Function WritePart
* saves the part to non-volatile storage. @a aPartName may have the revision
* portion present. If it is not present, and a overwrite of an existing
* part is done, then all parts that inherit it must be re-parsed.
* This is why most library sources are read only. An exception is the PARTS_LIST,
* not to be confused with a LIB based on a parts list in another schematic.
* The PARTS_LIST is in the the schematic being edited and is by definition the
* last to inherit, so editing in the current schematic's PARTS_LIST should be harmless.
* There can be some self referential issues that mean all the parts in the PARTS_LIST
* have to re-parsed.
* saves the part to non-volatile storage and returns the next new revision
* name in the sequence established by the LIB_SINK.
*/
virtual void WritePart( PART* aPart ) throw( IO_ERROR );
virtual STRING WritePart( PART* aPart ) throw( IO_ERROR );
virtual void SetPartBody( PART* aPart, const STRING& aSExpression ) throw( IO_ERROR );
@ -884,8 +969,8 @@ public:
private:
STRING fetch; ///< scratch, used to fetch things, grows to worst case size.
STRINGS vfetch; ///< scratch, used to fetch things.
STRING fetch; // scratch, used to fetch things, grows to worst case size.
STRINGS vfetch; // scratch, used to fetch things.
LIB_SOURCE* source;
LIB_SINK* sink;
@ -896,11 +981,120 @@ private:
STRINGS categories;
typedef boost::ptr_vector<PART> PARTS;
PARTS parts;
std::vector<PART*> orderByName;
};
/**
* Class PARTS_LIST
* is a LIB which resides in a SCHEMATIC, and it is a table model for a
* spread sheet both. When columns are added or removed to/from the spreadsheet,
* this is adding or removing fields/properties to/from ALL the contained PARTS.
*/
class PARTS_LIST : public LIB
{
public:
/**
* Function GetModel
* returns a spreadsheet table model that allows both reading and writing to
* rows in a spreadsheet. The UI holds the actual screen widgets, but
* this is the table model, i.e. the PARTS_LIST is.
*/
SPREADSHEET_TABLE_MODEL* GetModel();
};
/**
* Class LIB_TABLE_ROW
* holds a record identifying a LIB in the LIB_TABLE.
*/
class LIB_TABLE_ROW
{
protected:
/**
* Function SetLogicalName
* changes the logical name of this library, useful for an editor.
*/
void SetLogicalName( const STRING& aLogicalName );
/**
* Function SetType
* changes the type represented by this record.
*/
void SetType( const STRING& aType );
/**
* Function SetFullURI
* changes the full URI for the library, useful from a library table editor.
*/
void SetFullURI( const STRING& aFullURI );
/**
* Function SetOptions
* changes the options string for this record, and is useful from
* the library table editor.
*/
void SetOptions( const STRING& aOptions );
public:
/**
* Function GetLogicalName
* returns the logical name of this library table entry.
*/
const STRING& GetLogicalName();
/**
* Function GetType
* returns the type of LIB represented by this record.
*/
const STRING& GetType();
/**
* Function GetFullURI
* returns the full location specifying URI for the LIB.
*/
const STRING& GetFullURI();
/**
* Function GetOptions
* returns the options string, which may hold a password or anything else needed to
* instantiate the underlying LIB_SOURCE.
*/
const STRING& GetOptions();
};
/**
* Class LIB_TABLE
* holds LIB_TABLE_ROW records, and can be searched in a very high speed way based on
* logical library name.
*/
class LIB_TABLE
{
public:
/**
* Constructor LIB_TABLE
* builds a library table from an s-expression form of the library table.
* @param aLibraryTable is an s-expression form of all the rows in a library
* table fragment. These rows take presedence over rows in @a aFallBackTable.
* @param aFallBackTable is another LIB_TABLE which is searched only when
* a record is not found in this table.
*/
LIB_TABLE( const STRING& aLibraryTable, LIB_TABLE* aFallBackTable = NULL )
{
// s-expression is chosen so we can read a table fragment from either
// a schematic or a disk file, for schematic resident or
// personal table, respectively.
}
};
} // namespace SCH
// EOF

BIN
new/drawing.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

964
new/drawing.svg Normal file
View File

@ -0,0 +1,964 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1012.09"
height="754.09998"
id="svg2"
version="1.1"
inkscape:version="0.47 r22583"
sodipodi:docname="drawing.svg"
inkscape:export-filename="/svn/kicad/new_design/new/drawing.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4">
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow2Lend"
style="overflow:visible;">
<path
id="path3674"
style="font-size:12.0;fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z "
transform="scale(1.1) rotate(180) translate(1,0)" />
</marker>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective10" />
<inkscape:perspective
id="perspective2852"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective2885"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective2932"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective2965"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective4115"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<marker
inkscape:stockid="Arrow2Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow2Lend-9"
style="overflow:visible">
<path
id="path3674-3"
style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
transform="matrix(-1.1,0,0,-1.1,-1.1,0)" />
</marker>
<inkscape:perspective
id="perspective4352"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
<inkscape:perspective
id="perspective4990"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.4"
inkscape:cx="575.26689"
inkscape:cy="1269.5904"
inkscape:document-units="px"
inkscape:current-layer="svg2"
showgrid="false"
inkscape:window-width="1920"
inkscape:window-height="1119"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
units="in"
inkscape:snap-global="false"
objecttolerance="10000"
inkscape:snap-midpoints="true"
inkscape:snap-bbox="false">
<inkscape:grid
type="xygrid"
id="grid2955"
empspacing="10"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="10px"
spacingy="10px"
dotted="true" />
</sodipodi:namedview>
<metadata
id="metadata7">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<rect
style="fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1.10099995;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect3942"
width="168.57143"
height="41.42857"
x="556.42859"
y="688.38568" />
<rect
style="fill:#00bad5;fill-opacity:0.9605735;stroke:#000000;stroke-width:0.95887607;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect4976"
width="234.49751"
height="98.013084"
x="755.58539"
y="508.26596" />
<rect
style="fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1.29770339;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect5805"
width="188.37473"
height="93.374725"
x="793.24127"
y="650.91266" />
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-298.25658)" />
<rect
style="fill:#cccccc;fill-rule:evenodd;stroke:#000000;stroke-width:1.6983366px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
id="rect2816"
width="872.59253"
height="273.89703"
x="95.277359"
y="22.688547"
sodipodi:insensitive="true" />
<text
xml:space="preserve"
style="font-size:44.65415192px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
x="329.44296"
y="69.284828"
id="text2818"
transform="scale(1.086331,0.92052975)"
sodipodi:insensitive="true"><tspan
sodipodi:role="line"
x="329.44296"
y="69.284828"
id="tspan2828">schematic</tspan></text>
<rect
style="fill:#00bad5;fill-rule:evenodd;stroke:#000000;stroke-width:1.41801190000000021px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:0.96057349"
id="rect2826"
width="452.43915"
height="129.58199"
x="90.923286"
y="508.6037" />
<text
xml:space="preserve"
style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="175.85715"
y="657.25031"
id="text2828"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan2830"
x="175.85715"
y="657.25031">HTTP_LIB_SOURCE</tspan></text>
<g
id="g3856">
<g
transform="translate(18,0)"
id="g3851">
<rect
style="fill:#ff8080;stroke:#000000;stroke-width:0.76680511;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect2833"
width="67.913422"
height="40.639297"
x="130.19307"
y="73.140556" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="138.37057"
y="97.500824"
id="text2835"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
x="138.37057"
y="97.500824"
id="tspan2839">comp</tspan></text>
</g>
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="big blocks" />
<g
id="g3790"
transform="translate(60,-0.71428569)"
sodipodi:insensitive="true">
<rect
y="204.09998"
x="77.85714"
height="75"
width="801.42859"
id="rect2988"
style="fill:#f4d7d7;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<text
sodipodi:linespacing="125%"
id="text3786"
y="221.24283"
x="440"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="221.24283"
x="440"
id="tspan3788"
sodipodi:role="line">parts_list</tspan></text>
</g>
<g
id="g3822">
<g
transform="translate(-12.857147,6.4285736)"
id="g3801">
<rect
style="fill:#999999;stroke:#000000;stroke-width:0.78319448;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect3795"
width="56.64537"
height="39.502518"
x="164.8916"
y="222.563" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="172.85715"
y="247.6714"
id="text3797"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3799"
x="172.85715"
y="247.6714">part</tspan></text>
</g>
</g>
<g
id="g3828"
transform="translate(133.32018,-0.3941193)">
<g
id="g3830"
transform="translate(-12.857147,6.4285736)">
<rect
y="222.563"
x="164.8916"
height="39.502518"
width="56.64537"
id="rect3832"
style="fill:#999999;stroke:#000000;stroke-width:0.78319448;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<text
sodipodi:linespacing="125%"
id="text3834"
y="247.6714"
x="172.85715"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="247.6714"
x="172.85715"
id="tspan3836"
sodipodi:role="line">part</tspan></text>
</g>
</g>
<g
transform="translate(259.32018,-0.3941193)"
id="g3838">
<g
transform="translate(-12.857147,6.4285736)"
id="g3840">
<rect
style="fill:#999999;stroke:#000000;stroke-width:0.78319448;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect3842"
width="56.64537"
height="39.502518"
x="164.8916"
y="222.563" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="172.85715"
y="247.6714"
id="text3844"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3846"
x="172.85715"
y="247.6714">part</tspan></text>
</g>
</g>
<g
id="g3862"
transform="translate(130,0)">
<g
id="g3864"
transform="translate(18,0)">
<rect
y="73.140556"
x="130.19307"
height="40.639297"
width="67.913422"
id="rect3866"
style="fill:#ff8080;stroke:#000000;stroke-width:0.76680511;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<text
sodipodi:linespacing="125%"
id="text3868"
y="97.500824"
x="138.37057"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
id="tspan3870"
y="97.500824"
x="138.37057"
sodipodi:role="line">comp</tspan></text>
</g>
</g>
<g
transform="translate(256,0)"
id="g3872">
<g
transform="translate(18,0)"
id="g3874">
<rect
style="fill:#ff8080;stroke:#000000;stroke-width:0.76680511;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect3876"
width="67.913422"
height="40.639297"
x="130.19307"
y="73.140556" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="138.37057"
y="97.500824"
id="text3878"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
x="138.37057"
y="97.500824"
id="tspan3880">comp</tspan></text>
</g>
</g>
<g
id="g3882"
transform="translate(471.32018,-0.3941193)">
<g
id="g3884"
transform="translate(-12.857147,6.4285736)">
<rect
y="222.563"
x="164.8916"
height="39.502518"
width="56.64537"
id="rect3886"
style="fill:#999999;stroke:#000000;stroke-width:0.78319448;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<text
sodipodi:linespacing="125%"
id="text3888"
y="247.6714"
x="172.85715"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="247.6714"
x="172.85715"
id="tspan3890"
sodipodi:role="line">part</tspan></text>
</g>
</g>
<rect
style="fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1.11650062;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect3894"
width="473.64505"
height="82.716003"
x="493.0127"
y="368.03632" />
<text
xml:space="preserve"
style="font-size:20px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="684.51794"
y="389.21155"
id="text3896"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan3898"
x="684.51794"
y="389.21155">LIBS manager</tspan></text>
<g
id="g4102">
<path
id="path2876"
d="M 179.80715,116.16834 180,226.09998"
style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Lend)" />
<text
sodipodi:linespacing="125%"
id="text4098"
y="157.6049"
x="181.70563"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="157.6049"
x="181.70563"
id="tspan4100"
sodipodi:role="line">is</tspan></text>
</g>
<g
transform="translate(134,-4e-6)"
id="g4102-9">
<path
id="path2876-0"
d="M 179.80715,116.16834 180,226.09998"
style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Lend)" />
<text
sodipodi:linespacing="125%"
id="text4098-8"
y="157.6049"
x="181.70563"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="157.6049"
x="181.70563"
id="tspan4100-8"
sodipodi:role="line">is</tspan></text>
</g>
<g
id="g4144"
transform="translate(260,-4e-6)">
<path
style="fill:none;stroke:#000000;stroke-width:0.69999999;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow2Lend)"
d="M 179.80715,116.16834 180,226.09998"
id="path4146" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="181.70563"
y="157.6049"
id="text4148"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4150"
x="181.70563"
y="157.6049">is</tspan></text>
</g>
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-9)"
d="m 439.67732,268.09998 0.32268,46 210,0 0,-40"
id="path4152" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="520.22858"
y="330.28006"
id="text4340"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4342"
x="520.22858"
y="330.28006">extends</tspan></text>
<g
id="g3828-4"
transform="translate(133.32018,329.60589)">
<g
id="g3830-8"
transform="translate(-12.857147,6.4285736)">
<rect
y="222.563"
x="164.8916"
height="39.502518"
width="56.64537"
id="rect3832-1"
style="fill:#999999;stroke:#000000;stroke-width:0.78319448;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<text
sodipodi:linespacing="125%"
id="text3834-0"
y="247.6714"
x="172.85715"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="247.6714"
x="172.85715"
id="tspan3836-3"
sodipodi:role="line">part</tspan></text>
</g>
</g>
<g
transform="translate(-2.67982,329.60589)"
id="g4378">
<g
transform="translate(-12.857147,6.4285736)"
id="g4380">
<rect
style="fill:#999999;stroke:#000000;stroke-width:0.78319448;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect4382"
width="56.64537"
height="39.502518"
x="164.8916"
y="222.563" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="172.85715"
y="247.6714"
id="text4384"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4386"
x="172.85715"
y="247.6714">part</tspan></text>
</g>
</g>
<g
transform="translate(267.32018,329.60589)"
id="g4388">
<g
transform="translate(-12.857147,6.4285736)"
id="g4390">
<rect
style="fill:#999999;stroke:#000000;stroke-width:0.78319448;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect4392"
width="56.64537"
height="39.502518"
x="164.8916"
y="222.563" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="172.85715"
y="247.6714"
id="text4394"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4396"
x="172.85715"
y="247.6714">part</tspan></text>
</g>
</g>
<path
style="fill:none;stroke:#000000;stroke-width:1.101;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;marker-end:url(#Arrow2Lend-9)"
d="M 180.35714,268.49409 180,554.09998"
id="path4398" />
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-9)"
d="m 313.67732,268.09998 0,290.49749"
id="path4400" />
<text
sodipodi:linespacing="125%"
id="text4774"
y="354.28006"
x="184.22858"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="354.28006"
x="184.22858"
id="tspan4776"
sodipodi:role="line">extends</tspan></text>
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="316.22858"
y="354.28006"
id="text4778"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4780"
x="316.22858"
y="354.28006">extends</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-9)"
d="m 313.9049,598.53648 0,48.73986 137.63329,0.25254 0.25254,-48.73986"
id="path4782" />
<text
sodipodi:linespacing="125%"
id="text4970"
y="664.28003"
x="348.22858"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="664.28003"
x="348.22858"
id="tspan4972"
sodipodi:role="line">extends</tspan></text>
<rect
style="fill:#00bad5;fill-opacity:0.9605735;stroke:#000000;stroke-width:1.10099995;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect4974"
width="145.46196"
height="128.28937"
x="564.67529"
y="508.6329" />
<text
sodipodi:linespacing="125%"
id="text4978"
y="661.25031"
x="581.85718"
style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="661.25031"
x="581.85718"
id="tspan4980"
sodipodi:role="line">DIR_LIB_SOURCE</tspan></text>
<text
sodipodi:linespacing="125%"
id="text4978-6"
y="631.6189"
x="792.89563"
style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="631.6189"
x="792.89563"
id="tspan4980-2"
sodipodi:role="line">SCHEMATIC_LIB_SOURCE</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-9)"
d="m 512.14734,451.05421 -0.50507,55.05331"
id="path5007" />
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-9)"
d="m 637.91133,451.55929 -0.50507,55.05331"
id="path5009" />
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-9)"
d="m 849.03322,450.54913 0,55.55839"
id="path5011" />
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-9)"
d="m 740,298.38569 0,67.14286"
id="path5571" />
<g
id="g5759"
transform="translate(457.32018,329.60589)">
<g
id="g5761"
transform="translate(-12.857147,6.4285736)">
<rect
y="222.563"
x="164.8916"
height="39.502518"
width="56.64537"
id="rect5763"
style="fill:#999999;stroke:#000000;stroke-width:0.78319448;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<text
sodipodi:linespacing="125%"
id="text5765"
y="247.6714"
x="172.85715"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="247.6714"
x="172.85715"
id="tspan5767"
sodipodi:role="line">part</tspan></text>
</g>
</g>
<g
transform="translate(447.32018,339.60589)"
id="g5779">
<g
transform="translate(-12.857147,6.4285736)"
id="g5781">
<rect
style="fill:#999999;stroke:#000000;stroke-width:0.78319448;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect5783"
width="56.64537"
height="39.502518"
x="164.8916"
y="222.563" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="172.85715"
y="247.6714"
id="text5785"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan5787"
x="172.85715"
y="247.6714">part</tspan></text>
</g>
</g>
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="567.28571"
y="139.38568"
id="text5799"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan5801"
x="567.28571"
y="139.38568">All sheets are in one schematic object</tspan></text>
<rect
style="fill:#f4d7d7;fill-opacity:1;stroke:#000000;stroke-width:1.10099995;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect5803"
width="123.57143"
height="63.57143"
x="814.57141"
y="673.95709" />
<g
transform="translate(703.32018,451.60589)"
id="g5769">
<g
transform="translate(-12.857147,6.4285736)"
id="g5771">
<rect
style="fill:#999999;stroke:#000000;stroke-width:0.78319448;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect5773"
width="56.64537"
height="39.502518"
x="164.8916"
y="222.563" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="172.85715"
y="247.6714"
id="text5775"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan5777"
x="172.85715"
y="247.6714">part</tspan></text>
</g>
</g>
<g
id="g5789"
transform="translate(693.32018,461.60589)">
<g
id="g5791"
transform="translate(-12.857147,6.4285736)">
<rect
y="222.563"
x="164.8916"
height="39.502518"
width="56.64537"
id="rect5793"
style="fill:#999999;stroke:#000000;stroke-width:0.78319448;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<text
sodipodi:linespacing="125%"
id="text5795"
y="247.6714"
x="172.85715"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="247.6714"
x="172.85715"
id="tspan5797"
sodipodi:role="line">part</tspan></text>
</g>
</g>
<text
xml:space="preserve"
style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:100%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="826.71429"
y="663.95709"
id="text5807"
sodipodi:linespacing="100%"><tspan
sodipodi:role="line"
id="tspan5809"
x="826.71429"
y="663.95709">other schematic</tspan></text>
<rect
style="fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1.10099995;stroke-linecap:square;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect5811"
width="154.28572"
height="57.142857"
x="167.85715"
y="676.24286" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="202.85715"
y="711.24286"
id="text5813"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan5815"
x="202.85715"
y="711.24286">Internet</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-9)"
d="m 245,638.38569 -0.71428,37.14286"
id="path5817" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="495.57144"
y="527.95709"
id="text2962"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan2964"
x="495.57144"
y="527.95709">LIB</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-9)"
d="m 638.57143,638.38569 -0.71429,47.14286"
id="path2966" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="566"
y="712.95709"
id="text3938"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3940"
x="566"
y="712.95709">part files in a dir</tspan></text>
<text
sodipodi:linespacing="125%"
id="text3944"
y="527.95709"
x="669.57141"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="527.95709"
x="669.57141"
id="tspan3946"
sodipodi:role="line">LIB</tspan></text>
<flowRoot
xml:space="preserve"
id="flowRoot3948"
style="fill:black;stroke:none;stroke-opacity:1;stroke-width:1px;stroke-linejoin:miter;stroke-linecap:butt;fill-opacity:1;font-family:Bitstream Vera Sans;font-style:normal;font-weight:normal;font-size:18px;-inkscape-font-specification:Bitstream Vera Sans;font-stretch:normal;font-variant:normal;text-anchor:start;text-align:start;writing-mode:lr;line-height:125%"><flowRegion
id="flowRegion3950"><rect
id="rect3952"
width="240.71428"
height="148.57143"
x="740"
y="508.38568" /></flowRegion><flowPara
id="flowPara3954" /></flowRoot> <text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="953.57141"
y="527.95709"
id="text3956"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3958"
x="953.57141"
y="527.95709">LIB</tspan></text>
<g
transform="translate(695.32018,305.60589)"
id="g3960">
<g
transform="translate(-12.857147,6.4285736)"
id="g3962">
<rect
style="fill:#999999;stroke:#000000;stroke-width:0.78319448;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect3964"
width="56.64537"
height="39.502518"
x="164.8916"
y="222.563" />
<text
xml:space="preserve"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="172.85715"
y="247.6714"
id="text3966"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3968"
x="172.85715"
y="247.6714">part</tspan></text>
</g>
</g>
<g
id="g3970"
transform="translate(685.32018,315.60589)">
<g
id="g3972"
transform="translate(-12.857147,6.4285736)">
<rect
y="222.563"
x="164.8916"
height="39.502518"
width="56.64537"
id="rect3974"
style="fill:#999999;stroke:#000000;stroke-width:0.78319448;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
<text
sodipodi:linespacing="125%"
id="text3976"
y="247.6714"
x="172.85715"
style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
xml:space="preserve"><tspan
y="247.6714"
x="172.85715"
id="tspan3978"
sodipodi:role="line">part</tspan></text>
</g>
</g>
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-9)"
d="m 877.85714,607.6714 0,41.42858"
id="path3980" />
<text
xml:space="preserve"
style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"
x="840.89563"
y="219.6189"
id="text4168"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan4170"
x="840.89563"
y="219.6189">LIB</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:1.26530874px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#Arrow2Lend-9)"
d="M 851.17116,365.3959 850.285,225.65964"
id="path4172" />
</svg>

After

Width:  |  Height:  |  Size: 39 KiB

3
new/make-html.sh Executable file
View File

@ -0,0 +1,3 @@
# run this from the <kicad>/new directory
doxygen

134
new/sch_dir_lib_source.cpp Normal file
View File

@ -0,0 +1,134 @@
/*
* This program source code file is part of KICAD, a free EDA CAD application.
*
* Copyright (C) 2010 SoftPLC Corporation, <dick@softplc.com>
* Copyright (C) 2010 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
*/
#ifndef DIR_LIB_SOURCE_H_
#define DIR_LIB_SOURCE_H_
/* Note: this LIB_SOURCE implementation relies on the posix specified opendir() and
related functions. Mingw and unix, linux, & osx will all have these posix functions.
MS Visual Studio may need the posix compatible opendir() functions brought in
http://www.softagalleria.net/dirent.php
wx has these but they are based on wxString and wx should not be introduced
at a level this low.
*/
namespace SCH {
/**
* Class DIR_LIB_SOURCE
* implements a LIB_SOURCE in a file system directory.
*
* @author Dick Hollenbeck
*/
class DIR_LIB_SOURCE : public LIB_SOURCE
{
friend class LIBS; ///< LIBS::GetLib() can construct one.
STRING path; ///< base directory path of LIB_SOURCE
protected:
/**
* Constructor DIR_LIB_SOURCE( const STRING& aDirectoryPath )
* sets up a LIB_SOURCE using aDirectoryPath in a file system.
* @see LIBS::GetLibrary().
*
* @param aDirectoryPath is a full pathname of a directory which contains
* the library source of part files. Examples might be "C:\kicad_data\mylib" or
* "/home/designer/mylibdir".
*/
DIR_LIB_SOURCE( const STRING& aDirectoryPath ) throws( IO_ERROR, PARSE_ERROR );
};
} // namespace SCH
#endif // DIR_LIB_SOURCE_H_
#include <dirent.h>
#include <cstring>
#include <ki_exceptions.h>
#include <sys/types.h>
/**
* Class DIR_WRAP
* provides a destructor which may be invoked if an exception is thrown,
* thereby closing the DIR.
*/
class DIR_WRAP
{
DIR* dir;
public:
DIR_WRAP( DIR* aDir ) : dir( aDir ) {}
~DIR_WRAP()
{
if( dir )
closedir( dir );
}
DIR* operator->() { return dir; }
};
DIR_LIB_SOURCE::DIR_LIB_SOURCE( const STRING& aDirectoryPath ) throws( IO_ERROR, PARSE_ERROR )
{
DIR_WRAP* dir = opendir( aDirectoryPath.c_str() );
if( !dir )
{
char buf[256];
strerror_r( errno, buf, sizeof(buf) );
throw( IO_ERROR( buf ) );
}
path = aDirectoryPath;
}
#if 1 || defined( TEST_DIR_LIB_SOURCE )
int main( int argv, char** argv )
{
}
#endif