diff --git a/eeschema/class_drawsheetpath.h b/eeschema/class_drawsheetpath.h index b7582d2434..ab850be3ad 100644 --- a/eeschema/class_drawsheetpath.h +++ b/eeschema/class_drawsheetpath.h @@ -99,7 +99,7 @@ public: * returns a pointer to the last sheet of the list * One can see the others sheet as the "path" to reach this last sheet */ - SCH_SHEET* Last(); + SCH_SHEET* Last(); /** Function LastScreen * @return the SCH_SCREEN relative to the last sheet in list @@ -143,11 +143,12 @@ public: */ wxString Path(); - /** Function PathHumanReadable - * Return the sheet path in a readable form, i.e. - * as a path made from sheet names. - * (the "normal" path uses the time stamps which do not changes even when - * editing sheet parameters) + /** + * Function PathHumanReadable + * returns the sheet path in a human readable form, i.e. as a path made + * from sheet names. The the "normal" path instead uses the time + * stamps in the path. (Time stamps do not change even when editing + * sheet parameters). */ wxString PathHumanReadable(); diff --git a/eeschema/class_libentry.h b/eeschema/class_libentry.h index f209fa0ecc..4382133d61 100644 --- a/eeschema/class_libentry.h +++ b/eeschema/class_libentry.h @@ -32,25 +32,25 @@ enum LibrEntryOptions /** - * Base class to describe library components and aliases. + * Class CMP_LIB_ENTRY + * is a base class to describe library components and aliases. * * This class is not to be used directly. */ class CMP_LIB_ENTRY : public EDA_BaseStruct { - protected: wxString name; - /** Library object that entry is attached to. */ + /// Library object that entry is attached to. CMP_LIBRARY* library; - /** Entry type, either ROOT or ALIAS. */ + /// Entry type, either ROOT or ALIAS. LibrEntryType type; - wxString description; /* documentation for info */ - wxString keyWords; /* keyword list (used for search for components by keyword) */ - wxString docFileName; /* Associate doc file name */ + wxString description; ///< documentation for info + wxString keyWords; ///< keyword list (used for search for components by keyword) + wxString docFileName; ///< Associate doc file name public: CMP_LIB_ENTRY( LibrEntryType aType, const wxString& aName, CMP_LIBRARY* aLibrary = NULL ); @@ -65,7 +65,7 @@ public: wxString GetLibraryName(); - CMP_LIBRARY* GetLibrary() {return library;} + CMP_LIBRARY* GetLibrary() { return library; } virtual const wxString& GetName() const { return name; } diff --git a/eeschema/class_library.h b/eeschema/class_library.h index 8e7386172f..5b2a6b97d0 100644 --- a/eeschema/class_library.h +++ b/eeschema/class_library.h @@ -51,27 +51,25 @@ extern bool operator<( const CMP_LIBRARY& item1, const CMP_LIBRARY& item2 ); /** - * Component library object. - * - * Component libraries are used to load, save, search, and otherwise manipulate + * Class CMP_LIBRARY + * is used to load, save, search, and otherwise manipulate * component library files. */ - class CMP_LIBRARY { public: - int m_Type; /* type indicator */ + int m_Type; ///< type indicator int m_Flags; protected: - wxFileName fileName; /* Library file name. */ - wxDateTime timeStamp; /* Library save time and date. */ - int versionMajor; /* Library major version number. */ - int versionMinor; /* Library minor version number. */ - LIB_ENTRY_LIST entries; /* Parts themselves are saved here. */ - bool isCache; /* False for the "standard" libraries, - * True for the library cache */ - wxString header; /* first line of loaded library. */ + wxFileName fileName; ///< Library file name. + wxDateTime timeStamp; ///< Library save time and date. + int versionMajor; ///< Library major version number. + int versionMinor; ///< Library minor version number. + LIB_ENTRY_LIST entries; ///< Parts themselves are saved here. + bool isCache; /**< False for the "standard" libraries, + True for the library cache */ + wxString header; ///< first line of loaded library. static CMP_LIBRARY_LIST libraryList; static wxArrayString libraryListSortOrder; @@ -79,7 +77,7 @@ protected: friend class CMP_LIB_ENTRY; private: - bool isModified; /* Library modification status. */ + bool isModified; ///< Library modification status. public: CMP_LIBRARY( int aType, const wxFileName& aFileName ); @@ -96,8 +94,9 @@ public: bool getModifyFlag( ) { return isModified;} /** - * Save library to file. - * + * Function Save + * saves library to a file. + *

* Prior to component library version 3.0, two files were created. The * component objects are wer as component library (*.lib) files. The * library entry ojbect document strings were save in library document @@ -142,8 +141,9 @@ private: bool LoadHeader( FILE* aFile, int* aLineNum ); void LoadAliases( LIB_COMPONENT* aComponent ); - /** function RemoveEntryName - * Remove an /a aName entry from the library list names. + /** + * Function RemoveEntryName + * removes an /a aName entry from the library list names. * Warning: this is a partiel remove, because if aname is an alias * it is not removed from its root component. * this is for internal use only @@ -164,7 +164,8 @@ public: } /** - * Get the number of entries in the library. + * Function GetCount + * returns the number of entries in the library. * * @return The number of component and alias entries. */ @@ -350,14 +351,25 @@ public: wxString GetName() const { return fileName.GetName(); } /** - * Return the full file library name with path and extension. + * Function GetFullFileName + * returns the full file library name with path and extension. * - * @return Full library file name with path and extension. + * @return wxString - Full library file name with path and extension. */ wxString GetFullFileName() { return fileName.GetFullPath(); } /** - * Set the component library file name. + * Function GetLogicalName + * returns the logical name of the library, which for now is the filename + * without path or extension. + * wxString - The logical library name. + */ + wxString GetLogicalName() { return fileName.GetName(); } + + + /** + * Function SetFileName + * sets the component library file name. * * @param aFileName - New library file name. */ @@ -374,16 +386,19 @@ public: * of safety from abusing the library list. */ - /** - * Test for an existing library. + /** + * Function LibraryExists + * tests for existence of a library. * * @param aLibptr - aLibptr. - * @return true found. false if not found. + * @return bool - true if exists, else false */ static bool LibraryExists( const CMP_LIBRARY* aLibptr ); + /** - * Load a component library file. + * Function LoadLibrary + * loads a component library file. * * @param aFileName - File name of the component library to load. * @param aErrorMsg - Error message if the component library failed to load. @@ -394,7 +409,8 @@ public: wxString& aErrorMsg ); /** - * Add a compnent library to the library list. + * Function AddLibrary + * adds a compnent library to the library list. * * @param aFileName - File name object of component library. * @param aErrorMsg - Error message if the component library failed to load. @@ -403,7 +419,8 @@ public: static bool AddLibrary( const wxFileName& aFileName, wxString& aErrorMsg ); /** - * Insert a compnent library to the library list. + * Function AddLibrary + * inserts a compnent library into the library list. * * @param aFileName - File name object of component library. * @param aErrerMsg - Error message if the component library failed to load. @@ -414,14 +431,16 @@ public: CMP_LIBRARY_LIST::iterator& aIterator ); /** - * Remove component library from the library list. + * Function RemoveLibrary + * removes a component library from the library list. * * @param aName - Name of component library to remove. */ static void RemoveLibrary( const wxString& aName ); /** - * Find component library by /a aName. + * Function FindLibrary + * finds a component library by \a aName. * * @param aName - Library file name without path or extension to find. * @return Component library if found, otherwise NULL. @@ -429,7 +448,8 @@ public: static CMP_LIBRARY* FindLibrary( const wxString& aName ); /** - * Get the list of component library file names without path and extension. + * Function GetLibraryNames + * returns the list of component library file names without path and extension. * * @param aSorted - Sort the list of name if true. Otherwise use the * library load order. @@ -438,7 +458,8 @@ public: static wxArrayString GetLibraryNames( bool aSorted = true ); /** - * Search all libraries in the list for a component. + * Function FindLibraryComponent + * searches all libraries in the list for a component. * * A component object will always be returned. If the entry found * is an alias. The root component will be found and returned. @@ -451,7 +472,8 @@ public: const wxString& aLibraryName = wxEmptyString ); /** - * Search all libraries in the list for an entry. + * Function FindLibraryEntry + * searches all libraries in the list for an entry. * * The object can be either a component or an alias. * @@ -463,7 +485,8 @@ public: const wxString& aLibraryName = wxEmptyString ); /** - * Remove all cache libraries from library list. + * Function RemoveCacheLibrary + * removes all cache libraries from library list. */ static void RemoveCacheLibrary(); diff --git a/eeschema/netform.cpp b/eeschema/netform.cpp index 043451521c..f0763a3b94 100644 --- a/eeschema/netform.cpp +++ b/eeschema/netform.cpp @@ -1,7 +1,33 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 1992-2009 jean-pierre.charras@gipsa-lab.inpg.fr + * Copyright (C) 2010 SoftPLC Corporation, Dick Hollenbeck + * Copyright (C) 1992-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 + */ + /*****************************/ /* Net list generation code. */ /*****************************/ + #include "fctsys.h" #include @@ -39,13 +65,14 @@ static void WriteListOfNetsCADSTAR( FILE* f, NETLIST_OBJECT_LIST& aObjectsList ) static void WriteNetListPspice( WinEDA_SchematicFrame* frame, FILE* f, bool use_netnames ); -static bool WriteGENERICListOfNets( FILE* f, NETLIST_OBJECT_LIST& aObjectsList ); +static bool WriteGENERICListOfNetsTxt( FILE* f, NETLIST_OBJECT_LIST& aObjectsList ); +static bool WriteGENERICListOfNets( wxXmlNode* aNode, NETLIST_OBJECT_LIST& aObjectsList ); static void AddPinToComponentPinList( SCH_COMPONENT* Component, SCH_SHEET_PATH* sheet, LIB_PIN* PinEntry ); -static void FindAllsInstancesOfComponent( SCH_COMPONENT* Component, +static void FindAllInstancesOfComponent( SCH_COMPONENT* Component, LIB_COMPONENT* aEntry, SCH_SHEET_PATH* Sheet_in ); @@ -220,14 +247,18 @@ static SCH_COMPONENT* FindNextComponentAndCreatPinList( EDA_BaseStruct* item, if( !entry ) continue; - // Multi parts per package: test if already visited: + // If Multi parts per package if( entry->GetPartCount() > 1 ) { + // test if already visited, and if so skip if( s_ReferencesAlreadyFound.Lookup( ref ) ) continue; + + // Collect all parts and pins for this first occurance of reference + FindAllInstancesOfComponent( comp, entry, path ); } - if( entry->GetPartCount() <= 1 ) // One part per package + else // entry->GetPartCount() <= 1 means one part per package { LIB_PIN_LIST pins; @@ -242,9 +273,6 @@ static SCH_COMPONENT* FindNextComponentAndCreatPinList( EDA_BaseStruct* item, AddPinToComponentPinList( comp, path, pin ); } } - else // Multiple parts per package: Collect all parts and pins for - // this reference - FindAllsInstancesOfComponent( comp, entry, path ); // Sort pins in s_SortedComponentPinList by pin number sort( s_SortedComponentPinList.begin(), @@ -302,19 +330,28 @@ static wxString ReturnPinNetName( NETLIST_OBJECT* Pin, const wxString& DefaultFo } -static wxXmlNode* Node( const wxString& name, const wxString& content=wxEmptyString ) +/** + * Function Node + * is a convenience function that creates a new wxXmlNode with an optional textual child. + * @param aName is the name to associate with a new node of type wxXML_ELEMENT_NODE. + * @param aContent is optional, and if given is the text to include in a child + * of the returned node, and has type wxXML_TEXT_NODE. + */ +static wxXmlNode* Node( const wxString& aName, const wxString& aTextualContent = wxEmptyString ) { - wxXmlNode* n = new wxXmlNode( 0, wxXML_ELEMENT_NODE, name ); + wxXmlNode* n = new wxXmlNode( 0, wxXML_ELEMENT_NODE, aName ); - if( content.Len() > 0 ) // excludes wxEmptyString - n->AddChild( new wxXmlNode( 0, wxXML_TEXT_NODE, wxEmptyString, content ) ); + if( aTextualContent.Len() > 0 ) // excludes wxEmptyString, the default textual content + n->AddChild( new wxXmlNode( 0, wxXML_TEXT_NODE, wxEmptyString, aTextualContent ) ); return n; } -/* Create a generic netlist, and call an external netlister - * to change the netlist syntax and create the file +/** + * Function Write_GENERIC_NetList + * creates a generic netlist, now in XML. + * @return bool - true if there were no errors, else false. */ bool Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxString& aOutFileName ) { @@ -325,30 +362,41 @@ bool Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxString& aOutFi wxXmlNode* xroot; // root node wxXmlNode* xcomps; // start of components - wxString timeStamp; - // some strings we need many times, but don't want to construct more // than once for performance. These are used within loops so the - // enclosing wxString constructor would fire on each usage. - const wxString sFields = wxT("fields"); - const wxString sField = wxT("field"); - const wxString sComponent = wxT("comp"); // use "part" ? - const wxString sName = wxT("name"); - const wxString sRef = wxT("ref"); - const wxString sPins = wxT("pins"); - const wxString sPin = wxT("pin"); - const wxString sValue = wxT("value"); - const wxString sFootprint = wxT("footprint"); - const wxString sDatasheet = wxT("datasheet"); - const wxString sTStamp = wxT("tstamp"); - const wxString sTSFmt = wxT("%8.8lX"); // comp->m_TimeStamp + // enclosing wxString constructor would fire on each loop iteration if + // they were in a nested scope. + + wxString timeStamp; + wxString logicalLibName; + + // these are actually constructor invocations, not assignments as it appears: + const wxString sFields = wxT( "fields" ); + const wxString sField = wxT( "field" ); + const wxString sComponent = wxT( "comp" ); // use "part" ? + const wxString sName = wxT( "name" ); + const wxString sRef = wxT( "ref" ); + const wxString sPins = wxT( "pins" ); + const wxString sPin = wxT( "pin" ); + const wxString sValue = wxT( "value" ); + const wxString sSheetPath = wxT( "sheetpath" ); + const wxString sFootprint = wxT( "footprint" ); + const wxString sDatasheet = wxT( "datasheet" ); + const wxString sTStamp = wxT( "tstamp" ); + const wxString sTStamps = wxT( "tstamps" ); + const wxString sTSFmt = wxT( "%8.8lX" ); // comp->m_TimeStamp + const wxString sLibSource = wxT( "libsource" ); + const wxString sLibPart = wxT( "libpart" ); + const wxString sLib = wxT( "lib" ); + const wxString sPart = wxT( "part" ); + const wxString sNames = wxT( "names" ); s_ReferencesAlreadyFound.Clear(); - xdoc.SetRoot( xroot = Node( wxT("netlist") ) ); - xroot->AddProperty( wxT("version"), wxT("B") ); + xdoc.SetRoot( xroot = Node( wxT( "netlist" ) ) ); + xroot->AddProperty( wxT( "version" ), wxT( "B" ) ); - xroot->AddChild( xcomps = Node( wxT("components") ) ); + xroot->AddChild( xcomps = Node( wxT( "components" ) ) ); SCH_SHEET_LIST sheetList; @@ -364,54 +412,78 @@ bool Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxString& aOutFi schItem = comp; - // current component being constructed - wxXmlNode* xcomp = Node( sComponent ); - xcomps->AddChild( xcomp ); + wxXmlNode* xcomp; // current component being constructed + + // Output the component's elments in order of expected access frequency. + // This may not always look best, but it will allow faster execution + // under XSL processing systems which do sequential searching within + // an element. + + xcomps->AddChild( xcomp = Node( sComponent ) ); xcomp->AddProperty( sRef, comp->GetRef( path ) ); xcomp->AddChild( Node( sValue, comp->GetField( VALUE )->m_Text ) ); - timeStamp.Printf( sTSFmt, comp->m_TimeStamp ); - - xcomp->AddChild( Node( sTStamp, timeStamp ) ); - if( !comp->GetField( FOOTPRINT )->m_Text.IsEmpty() ) xcomp->AddChild( Node( sFootprint, comp->GetField( FOOTPRINT )->m_Text ) ); if( !comp->GetField( DATASHEET )->m_Text.IsEmpty() ) xcomp->AddChild( Node( sDatasheet, comp->GetField( DATASHEET )->m_Text ) ); - // all fields within the component, starting with the MANDATORY_FIELDS + // Export all user defined fields within the component, + // which start at field index MANDATORY_FIELDS. Only output the + // container element if there are any s. if( comp->GetFieldCount() > MANDATORY_FIELDS ) { - wxXmlNode* xfields = Node( sFields ); - xcomp->AddChild( xfields ); + wxXmlNode* xfields; + xcomp->AddChild( xfields = Node( sFields ) ); - for( int fldNdx = MANDATORY_FIELDS; fldNdx < comp->GetFieldCount(); ++fldNdx ) + for( int fldNdx = MANDATORY_FIELDS; fldNdx < comp->GetFieldCount(); ++fldNdx ) { SCH_FIELD* f = comp->GetField( fldNdx ); - wxXmlNode* xfield = Node( sField, f->m_Text ); - xfield->AddProperty( sName, f->m_Name ); - xfields->AddChild( xfield ); + // only output a field if non empty + if( !f->m_Text.IsEmpty() ) + { + wxXmlNode* xfield; + xfields->AddChild( xfield = Node( sField, f->m_Text ) ); + xfield->AddProperty( sName, f->m_Name ); + } } } - // @todo add: libsource + sheetpath + wxXmlNode* xlibsource; + xcomp->AddChild( xlibsource = Node( sLibSource ) ); + + // "logical" library name, which is in anticipation of a better search + // algorithm for parts based on "logical_lib.part" and where logical_lib + // is merely the library name minus path and extension. + LIB_COMPONENT* entry = CMP_LIBRARY::FindLibraryComponent( comp->m_ChipName ); + if( entry ) + xlibsource->AddProperty( sLib, entry->GetLibrary()->GetLogicalName() ); + xlibsource->AddProperty( sPart, comp->m_ChipName ); + + wxXmlNode* xsheetpath; + xcomp->AddChild( xsheetpath = Node( sSheetPath ) ); + xsheetpath->AddProperty( sTStamps, path->Path() ); + xsheetpath->AddProperty( sNames, path->PathHumanReadable() ); + + timeStamp.Printf( sTSFmt, comp->m_TimeStamp ); + xcomp->AddChild( Node( sTStamp, timeStamp ) ); } } // @todo generate the nested s - xroot->AddChild( Node( wxT("libparts") ) ); + xroot->AddChild( Node( wxT( "libparts" ) ) ); - // @todo generate the nested s - xroot->AddChild( Node( wxT("nets") ) ); + wxXmlNode* xnets; + xroot->AddChild( xnets = Node( wxT( "nets" ) ) ); + WriteGENERICListOfNets( xnets, g_NetObjectslist ); return xdoc.Save( aOutFileName, 2 /* indent bug, today was ignored by wxXml lib */ ); -#else +#else // ouput the well established/old net list format which was not XML. - // ouput the well established/old net list format wxString field; wxString footprint; wxString netname; @@ -491,7 +563,7 @@ bool Write_GENERIC_NetList( WinEDA_SchematicFrame* frame, const wxString& aOutFi ret |= fprintf( out, "\n$BeginNets\n" ); - if( !WriteGENERICListOfNets( out, g_NetObjectslist ) ) + if( !WriteGENERICListOfNetsTxt( out, g_NetObjectslist ) ) ret = -1; ret |= fprintf( out, "$EndNets\n" ); @@ -669,7 +741,7 @@ static void WriteNetListPspice( WinEDA_SchematicFrame* frame, FILE* f, bool use_ */ static bool WriteNetListPCBNEW( WinEDA_SchematicFrame* frame, FILE* f, bool with_pcbnew ) { - wxString Line; + wxString field; wxString footprint; char dateBuf[256]; int ret = 0; // zero now, OR in the sign bit on error @@ -723,23 +795,23 @@ static bool WriteNetListPCBNEW( WinEDA_SchematicFrame* frame, FILE* f, bool with else footprint = wxT( "$noname" ); - Line = comp->GetRef( path ); + field = comp->GetRef( path ); ret |= fprintf( f, " ( %s %s", CONV_TO_UTF8( comp->GetPath( path ) ), CONV_TO_UTF8( footprint ) ); - ret |= fprintf( f, " %s", CONV_TO_UTF8( Line ) ); + ret |= fprintf( f, " %s", CONV_TO_UTF8( field ) ); - Line = comp->GetField( VALUE )->m_Text; - Line.Replace( wxT( " " ), wxT( "_" ) ); - ret |= fprintf( f, " %s", CONV_TO_UTF8( Line ) ); + field = comp->GetField( VALUE )->m_Text; + field.Replace( wxT( " " ), wxT( "_" ) ); + ret |= fprintf( f, " %s", CONV_TO_UTF8( field ) ); if( with_pcbnew ) // Add the lib name for this component { - Line = comp->m_ChipName; - Line.Replace( wxT( " " ), wxT( "_" ) ); - ret |= fprintf( f, " {Lib=%s}", CONV_TO_UTF8( Line ) ); + field = comp->m_ChipName; + field.Replace( wxT( " " ), wxT( "_" ) ); + ret |= fprintf( f, " {Lib=%s}", CONV_TO_UTF8( field ) ); } ret |= fprintf( f, "\n" ); @@ -803,7 +875,7 @@ static bool WriteNetListPCBNEW( WinEDA_SchematicFrame* frame, FILE* f, bool with { ret |= fprintf( f, "{ Pin List by Nets\n" ); - if( !WriteGENERICListOfNets( f, g_NetObjectslist ) ) + if( !WriteGENERICListOfNetsTxt( f, g_NetObjectslist ) ) ret = -1; ret |= fprintf( f, "}\n" ); @@ -907,13 +979,14 @@ static void EraseDuplicatePins( NETLIST_OBJECT_LIST& aPinList ) /** - * Used for multiple parts per package components. + * Function FindAllInstancesOfComponent + * is used for multiple parts per package components. * * Search all instances of Component_in, * Calls AddPinToComponentPinList() to and pins founds to the current * component pin list */ -static void FindAllsInstancesOfComponent( SCH_COMPONENT* Component_in, +static void FindAllInstancesOfComponent( SCH_COMPONENT* Component_in, LIB_COMPONENT* aEntry, SCH_SHEET_PATH* Sheet_in ) { @@ -981,7 +1054,7 @@ static bool SortPinsByNum( NETLIST_OBJECT* Pin1, NETLIST_OBJECT* Pin2 ) /* Written in the file / net list (ranked by Netcode), and elements that are * connected */ -static bool WriteGENERICListOfNets( FILE* f, NETLIST_OBJECT_LIST& aObjectsList ) +static bool WriteGENERICListOfNetsTxt( FILE* f, NETLIST_OBJECT_LIST& aObjectsList ) { int ret = 0; int netCode; @@ -1067,6 +1140,91 @@ static bool WriteGENERICListOfNets( FILE* f, NETLIST_OBJECT_LIST& aObjectsList ) } +/** + * Function WriteGENERICListOfNets + * saves a netlist in xml format. + */ +static bool WriteGENERICListOfNets( wxXmlNode* aNode, NETLIST_OBJECT_LIST& aObjectsList ) +{ + wxString netCodeTxt; + wxString netName; + wxString ref; + + wxString sNet = wxT( "net" ); + wxString sName = wxT( "name" ); + wxString sCode = wxT( "code" ); + wxString sRef = wxT( "ref" ); + wxString sPin = wxT( "pin" ); + wxString sNode = wxT( "node" ); + wxString sFmtd = wxT( "%d" ); + + wxXmlNode* xnet; + int netCode; + int lastNetCode = -1; + int sameNetcodeCount = 0; + + /* output: + + + + + */ + + for( unsigned ii = 0; ii < aObjectsList.size(); ii++ ) + { + SCH_COMPONENT* comp; + + // New net found, write net id; + if( ( netCode = aObjectsList[ii]->GetNet() ) != lastNetCode ) + { + sameNetcodeCount = 0; // item count for this net + + netName.Empty(); + + // Find a label for this net, if it exists. + NETLIST_OBJECT* netref = aObjectsList[ii]->m_NetNameCandidate; + if( netref ) + { + if( netref->m_Type != NET_PINLABEL && netref->m_Type != NET_GLOBLABEL ) + { + // usual net name, prefix it by the sheet path + netName = netref->m_SheetList.PathHumanReadable(); + } + + netName += netref->m_Label; + } + + lastNetCode = netCode; + } + + if( aObjectsList[ii]->m_Type != NET_PIN ) + continue; + + comp = (SCH_COMPONENT*) aObjectsList[ii]->m_Link; + + // Get the reference for the net name and the main parent component + ref = comp->GetRef( &aObjectsList[ii]->m_SheetList ); + if( ref[0] == wxChar( '#' ) ) + continue; + + if( ++sameNetcodeCount == 1 ) + { + aNode->AddChild( xnet = Node( sNet ) ); + netCodeTxt.Printf( sFmtd, netCode ); + xnet->AddProperty( sCode, netCodeTxt ); + xnet->AddProperty( sName, netName ); + } + + wxXmlNode* xnode; + xnet->AddChild( xnode = Node( sNode ) ); + xnode->AddProperty( sRef, ref ); + xnode->AddProperty( sPin, LIB_PIN::ReturnPinStringNum( aObjectsList[ii]->m_PinNum ) ); + } + + return true; +} + + /* Generate CADSTAR net list. */ wxString StartLine( wxT( "." ) );