diff --git a/common/trigo.cpp b/common/trigo.cpp index d41ae2b15f..96d29d17c9 100644 --- a/common/trigo.cpp +++ b/common/trigo.cpp @@ -9,7 +9,27 @@ #include #include +// Returns true if the point P is on the segment S. +// faster than TestSegmentHit() because P should be exactly on S +// therefore works fine only for H, V and 45 deg segm (suitable for wires in eeschema) +bool IsPointOnSegment( const wxPoint& aSegStart, const wxPoint& aSegEnd, + const wxPoint& aTestPoint ) +{ + wxPoint vectSeg = aSegEnd - aSegStart; // Vector from S1 to S2 + wxPoint vectPoint = aTestPoint - aSegStart; // Vector from S1 to P + // Use long long here to avoid overflow in calculations + if( (long long) vectSeg.x * vectPoint.y - (long long) vectSeg.y * vectPoint.x ) + return false; /* Cross product non-zero, vectors not parallel */ + + if( ( (long long) vectSeg.x * vectPoint.x + (long long) vectSeg.y * vectPoint.y ) < + ( (long long) vectPoint.x * vectPoint.x + (long long) vectPoint.y * vectPoint.y ) ) + return false; /* Point not on segment */ + + return true; +} + +// Returns true if the segment 1 intersectd the segment 2. bool SegmentIntersectsSegment( const wxPoint &a_p1_l1, const wxPoint &a_p2_l1, const wxPoint &a_p1_l2, const wxPoint &a_p2_l2 ) { diff --git a/eeschema/CMakeLists.txt b/eeschema/CMakeLists.txt index 049c14c65e..82d8c544ba 100644 --- a/eeschema/CMakeLists.txt +++ b/eeschema/CMakeLists.txt @@ -71,7 +71,6 @@ set(EESCHEMA_SRCS component_references_lister.cpp controle.cpp cross-probing.cpp - dangling_ends.cpp database.cpp ${EESCHEMA_DLGS} edit_component_in_schematic.cpp diff --git a/eeschema/class_netlist_object.cpp b/eeschema/class_netlist_object.cpp index 73fd102103..cd0282009f 100644 --- a/eeschema/class_netlist_object.cpp +++ b/eeschema/class_netlist_object.cpp @@ -182,7 +182,7 @@ NETLIST_OBJECT::NETLIST_OBJECT() m_Member = 0; /* for labels type NET_BUSLABELMEMBER ( bus member created * from the BUS label ) member number */ - m_FlagOfConnection = UNCONNECTED; + m_ConnectionType = UNCONNECTED; m_PinNum = 0; /* pin number ( 1 long = 4 bytes -> 4 ascii codes) */ m_netNameCandidate = NULL; /* a pointer to a NETLIST_OBJECT type label connected to this * object used to give a name to the net diff --git a/eeschema/class_netlist_object.h b/eeschema/class_netlist_object.h index ce26caea09..9d01e7769f 100644 --- a/eeschema/class_netlist_object.h +++ b/eeschema/class_netlist_object.h @@ -104,7 +104,7 @@ public: int m_Member; /* for labels type NET_BUSLABELMEMBER ( bus member * created from the BUS label ) member number. */ - NET_CONNECTION_T m_FlagOfConnection; + NET_CONNECTION_T m_ConnectionType; // Used to store the connection type SCH_SHEET_PATH m_SheetListInclude; // sheet path which contains the hierarchical label long m_PinNum; // pin number ( 1 long = 4 bytes -> 4 ascii codes) wxString m_Label; // Label text (for labels) or Pin name (for pins) @@ -137,6 +137,23 @@ public: void SetNet( int aNetCode ) { m_netCode = aNetCode; } int GetNet() const { return m_netCode; } + /** + * Set the item connection type: + * UNCONNECTED Pin or Label not connected (error) + * NOCONNECT_SYMBOL_PRESENT Pin not connected but have a NoConnect + * symbol on it (no error) + * PAD_CONNECT Normal connection (no error) + */ + void SetConnectionType( NET_CONNECTION_T aFlg = UNCONNECTED ) + { + m_ConnectionType = aFlg; + } + + NET_CONNECTION_T GetConnectionType() + { + return m_ConnectionType; + } + /** * Set m_netNameCandidate to a connected item which will * be used to calcule the net name of the item @@ -223,6 +240,10 @@ class NETLIST_OBJECT_LIST: public std::vector { bool m_isOwner; // = true if the objects in list are owned my me, and therefore // the memory should be freed by the destructor and the list cleared + int m_lastNetCode; // Used in intermediate calculation: last net code created + int m_lastBusNetCode; // Used in intermediate calculation: + // last net code created for bus members + public: /** * Constructor. @@ -250,16 +271,64 @@ public: /* * Acces to an item in list */ - NETLIST_OBJECT* GetItem( unsigned aIdx ) + NETLIST_OBJECT* GetItem( unsigned aIdx ) const { return *( this->begin() + aIdx ); } /* - * Delete all objects in list and clear list - * (free memory used to store info about NETLIST_OBJECT items) + * Acces to an item type */ - void ClearList(); + NETLIST_ITEM_T GetItemType( unsigned aIdx ) const + { + return GetItem( aIdx )->m_Type; + } + + /* + * Acces to an item net code + */ + int GetItemNet( unsigned aIdx ) const + { + return GetItem( aIdx )->GetNet(); + } + + NET_CONNECTION_T GetConnectionType( unsigned aIdx ) + { + return GetItem( aIdx )->GetConnectionType(); + } + + /** + * Set the item connection type: + * UNCONNECTED Pin or Label not connected (error) + * NOCONNECT_SYMBOL_PRESENT Pin not connected but have a NoConnect + * symbol on it (no error) + * PAD_CONNECT Normal connection (no error) + */ + void SetConnectionType( unsigned aIdx, NET_CONNECTION_T aFlg = UNCONNECTED ) + { + GetItem( aIdx )->SetConnectionType( aFlg ); + } + + /* + * Delete all objects in list and clear list + * (delete NETLIST_OBJECT items) + */ + void FreeList(); + + /* + * Clear list but do not delete NETLIST_OBJECT items + * (they can be deleted only if the instance is owner of the items + */ + void Clear() { this->clear(); } + + /** + * Reset the connection type of all items to UNCONNECTED type + */ + void ResetConnectionsType( ) + { + for( unsigned ii = 0; ii < size(); ii++ ) + GetItem( ii )->SetConnectionType( UNCONNECTED ); + } /* * Sorts the list of connected items by net code @@ -273,46 +342,6 @@ public: */ void SortListbySheet(); - /* - * Propagate net codes from a parent sheet to an include sheet, - * from a pin sheet connection - */ - void SheetLabelConnect( NETLIST_OBJECT* aSheetLabel ); - - void PointToPointConnect( NETLIST_OBJECT* aRef, bool aIsBus, int start ); - - /* - * Search connections betweena junction and segments - * Propagate the junction net code to objects connected by this junction. - * The junction must have a valid net code - * The list of objects is expected sorted by sheets. - * Search is done from index aIdxStart to the last element of list - */ - void SegmentToPointConnect( NETLIST_OBJECT* aJonction, bool aIsBus, int aIdxStart ); - - void ConnectBusLabels(); - - /* - * Set the m_FlagOfConnection member of items in list - * depending on the connection type: - * UNCONNECTED, PAD_CONNECT or NOCONNECT_SYMBOL_PRESENT - * The list is expected sorted by order of net code, - * i.e. items having the same net code are grouped - */ - void SetUnconnectedFlag(); - - /** - * Function FindBestNetNameForEachNet - * fill the .m_NetNameCandidate member of each item of aNetItemBuffer - * with a reference to the "best" NETLIST_OBJECT usable to give a name to the net - * If no suitable object found, .m_NetNameCandidate is filled with 0. - * The "best" NETLIST_OBJECT is a NETLIST_OBJECT that have the type label - * and by priority order: - * the label is global or local - * the label is in the first sheet in a hierarchy (the root sheet has the most priority) - * alphabetic order. - */ - void FindBestNetNameForEachNet(); #if defined(DEBUG) void DumpNetTable() @@ -352,11 +381,48 @@ private: { return Objet1->m_SheetList.Cmp( Objet2->m_SheetList ) < 0; } + /* + * Propagate net codes from a parent sheet to an include sheet, + * from a pin sheet connection + */ + void sheetLabelConnect( NETLIST_OBJECT* aSheetLabel ); + + void pointToPointConnect( NETLIST_OBJECT* aRef, bool aIsBus, int start ); + + /* + * Search connections betweena junction and segments + * Propagate the junction net code to objects connected by this junction. + * The junction must have a valid net code + * The list of objects is expected sorted by sheets. + * Search is done from index aIdxStart to the last element of list + */ + void segmentToPointConnect( NETLIST_OBJECT* aJonction, bool aIsBus, int aIdxStart ); + + void connectBusLabels(); + + /* + * Set the m_FlagOfConnection member of items in list + * depending on the connection type: + * UNCONNECTED, PAD_CONNECT or NOCONNECT_SYMBOL_PRESENT + * The list is expected sorted by order of net code, + * i.e. items having the same net code are grouped + */ + void setUnconnectedFlag(); + + /** + * Function findBestNetNameForEachNet + * fill the .m_NetNameCandidate member of each item of aNetItemBuffer + * with a reference to the "best" NETLIST_OBJECT usable to give a name to the net + * If no suitable object found, .m_NetNameCandidate is filled with 0. + * The "best" NETLIST_OBJECT is a NETLIST_OBJECT that have the type label + * and by priority order: + * the label is global or local + * the label is in the first sheet in a hierarchy (the root sheet has the most priority) + * alphabetic order. + */ + void findBestNetNameForEachNet(); }; - -extern NETLIST_OBJECT_LIST g_NetObjectslist; - /** * Function IsBusLabel * test if \a aLabel has a bus notation. diff --git a/eeschema/dangling_ends.cpp b/eeschema/dangling_ends.cpp deleted file mode 100644 index 88b6700553..0000000000 --- a/eeschema/dangling_ends.cpp +++ /dev/null @@ -1,32 +0,0 @@ -/** - * @file dangling_ends.cpp - */ - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - - -/* Returns true if the point P is on the segment S. */ -bool SegmentIntersect( wxPoint aSegStart, wxPoint aSegEnd, wxPoint aTestPoint ) -{ - wxPoint vectSeg = aSegEnd - aSegStart; // Vector from S1 to S2 - wxPoint vectPoint = aTestPoint - aSegStart; // Vector from S1 to P - - // Use long long here to avoid overflow in calculations - if( (long long) vectSeg.x * vectPoint.y - (long long) vectSeg.y * vectPoint.x ) - return false; /* Cross product non-zero, vectors not parallel */ - - if( ( (long long) vectSeg.x * vectPoint.x + (long long) vectSeg.y * vectPoint.y ) < - ( (long long) vectPoint.x * vectPoint.x + (long long) vectPoint.y * vectPoint.y ) ) - return false; /* Point not on segment */ - - return true; -} diff --git a/eeschema/dialogs/dialog_erc.cpp b/eeschema/dialogs/dialog_erc.cpp index 939d342e4a..91268209b5 100644 --- a/eeschema/dialogs/dialog_erc.cpp +++ b/eeschema/dialogs/dialog_erc.cpp @@ -464,20 +464,20 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList ) */ TestDuplicateSheetNames( true ); - m_parent->BuildNetListBase(); + NETLIST_OBJECT_LIST* objectsConnectedList = m_parent->BuildNetListBase(); - /* Reset the flag m_FlagOfConnection, that will be used next, in calculations */ - for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ ) - g_NetObjectslist[ii]->m_FlagOfConnection = UNCONNECTED; + // Reset the connection type indicator + objectsConnectedList->ResetConnectionsType(); unsigned lastNet; unsigned nextNet = lastNet = 0; int NetNbItems = 0; int MinConn = NOC; - for( unsigned net = 0; net < g_NetObjectslist.size(); net++ ) + for( unsigned net = 0; net < objectsConnectedList->size(); net++ ) { - if( g_NetObjectslist[lastNet]->GetNet() != g_NetObjectslist[net]->GetNet() ) + if( objectsConnectedList->GetItemNet( lastNet ) != + objectsConnectedList->GetItemNet( net ) ) { // New net found: MinConn = NOC; @@ -485,7 +485,7 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList ) nextNet = net; } - switch( g_NetObjectslist[net]->m_Type ) + switch( objectsConnectedList->GetItemType( net ) ) { // These items do not create erc problems case NET_ITEM_UNSPECIFIED: @@ -507,7 +507,7 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList ) // ERC problems when pin sheets do not match hierarchical labels. // Each pin sheet must match a hierarchical label // Each hierarchical label must match a pin sheet - TestLabel( net, nextNet ); + TestLabel( objectsConnectedList, net, nextNet ); break; case NET_NOCONNECT: @@ -516,14 +516,14 @@ void DIALOG_ERC::TestErc( wxArrayString* aMessagesList ) MinConn = NET_NC; if( NetNbItems != 0 ) - Diagnose( g_NetObjectslist[net], NULL, MinConn, UNC ); + Diagnose( objectsConnectedList->GetItem( net ), NULL, MinConn, UNC ); break; case NET_PIN: // Look for ERC problems between pins: - TestOthersItems( net, nextNet, &NetNbItems, &MinConn ); + TestOthersItems( objectsConnectedList, net, nextNet, &NetNbItems, &MinConn ); break; } diff --git a/eeschema/dialogs/dialog_netlist.cpp b/eeschema/dialogs/dialog_netlist.cpp index 1e8519568b..142020d67a 100644 --- a/eeschema/dialogs/dialog_netlist.cpp +++ b/eeschema/dialogs/dialog_netlist.cpp @@ -727,8 +727,9 @@ Do you want to annotate schematic?" ) ) ) SCH_SCREENS screens; screens.SchematicCleanUp(); - BuildNetListBase(); - bool success = WriteNetListFile( aFormat, aFullFileName, aNetlistOptions ); + NETLIST_OBJECT_LIST * connectedItemsList = BuildNetListBase(); + bool success = WriteNetListFile( connectedItemsList, aFormat, + aFullFileName, aNetlistOptions ); return success; } diff --git a/eeschema/erc.cpp b/eeschema/erc.cpp index 36e6349599..6a6c36e731 100644 --- a/eeschema/erc.cpp +++ b/eeschema/erc.cpp @@ -349,40 +349,40 @@ void Diagnose( NETLIST_OBJECT* aNetItemRef, NETLIST_OBJECT* aNetItemTst, } -void TestOthersItems( unsigned NetItemRef, unsigned netstart, - int* NetNbItems, int* MinConnexion ) +void TestOthersItems( NETLIST_OBJECT_LIST* aList, + unsigned aNetItemRef, unsigned aNetStart, + int* aNetNbItems, int* aMinConnexion ) { - unsigned NetItemTst; - - int ref_elect_type, jj, erc = OK, local_minconn; + unsigned netItemTst = aNetStart; + int jj; + int erc = OK; /* Analysis of the table of connections. */ - ref_elect_type = g_NetObjectslist[NetItemRef]->m_ElectricalType; - - NetItemTst = netstart; - local_minconn = NOC; + int ref_elect_type = aList->GetItem( aNetItemRef )->m_ElectricalType; + int local_minconn = NOC; if( ref_elect_type == PIN_NC ) local_minconn = NPI; /* Test pins connected to NetItemRef */ - for( ; ; NetItemTst++ ) + for( ; ; netItemTst++ ) { - if( NetItemRef == NetItemTst ) + if( aNetItemRef == netItemTst ) continue; // We examine only a given net. We stop the search if the net changes - if( ( NetItemTst >= g_NetObjectslist.size() ) // End of list - || ( g_NetObjectslist[NetItemRef]->GetNet() != - g_NetObjectslist[NetItemTst]->GetNet() ) ) // End of net + if( ( netItemTst >= aList->size() ) // End of list + || ( aList->GetItemNet( aNetItemRef ) != + aList->GetItemNet( netItemTst ) ) ) // End of net { /* End net code found: minimum connection test. */ - if( (*MinConnexion < NET_NC ) && (local_minconn < NET_NC ) ) + if( ( *aMinConnexion < NET_NC ) && ( local_minconn < NET_NC ) ) { /* Not connected or not driven pin. */ bool seterr = true; - if( local_minconn == NOC && g_NetObjectslist[NetItemRef]->m_Type == NET_PIN ) + if( local_minconn == NOC && + aList->GetItemType( aNetItemRef ) == NET_PIN ) { /* This pin is not connected: for multiple part per * package, and duplicated pin, @@ -392,49 +392,49 @@ void TestOthersItems( unsigned NetItemRef, unsigned netstart, * TODO test also if instances connected are connected to * the same net */ - for( unsigned duplicate = 0; duplicate < g_NetObjectslist.size(); duplicate++ ) + for( unsigned duplicate = 0; duplicate < aList->size(); duplicate++ ) { - if( g_NetObjectslist[duplicate]->m_Type != NET_PIN ) + if( aList->GetItemType( duplicate ) != NET_PIN ) continue; - if( duplicate == NetItemRef ) + if( duplicate == aNetItemRef ) continue; - if( g_NetObjectslist[NetItemRef]->m_PinNum != - g_NetObjectslist[duplicate]->m_PinNum ) + if( aList->GetItem( aNetItemRef )->m_PinNum != + aList->GetItem( duplicate )->m_PinNum ) continue; - if( ( (SCH_COMPONENT*) g_NetObjectslist[NetItemRef]-> - m_Link )->GetRef( &g_NetObjectslist[NetItemRef]-> m_SheetList ) != - ( (SCH_COMPONENT*) g_NetObjectslist[duplicate]->m_Link ) - ->GetRef( &g_NetObjectslist[duplicate]->m_SheetList ) ) + if( ( (SCH_COMPONENT*) aList->GetItem( aNetItemRef )-> + m_Link )->GetRef( &aList->GetItem( aNetItemRef )-> m_SheetList ) != + ( (SCH_COMPONENT*) aList->GetItem( duplicate )->m_Link ) + ->GetRef( &aList->GetItem( duplicate )->m_SheetList ) ) continue; // Same component and same pin. Do dot create error for this pin // if the other pin is connected (i.e. if duplicate net has an other // item) if( (duplicate > 0) - && ( g_NetObjectslist[duplicate]->GetNet() == - g_NetObjectslist[duplicate - 1]->GetNet() ) ) + && ( aList->GetItemNet( duplicate ) == + aList->GetItemNet( duplicate - 1 ) ) ) seterr = false; - if( (duplicate < g_NetObjectslist.size() - 1) - && ( g_NetObjectslist[duplicate]->GetNet() == - g_NetObjectslist[duplicate + 1]->GetNet() ) ) + if( (duplicate < aList->size() - 1) + && ( aList->GetItemNet( duplicate ) == + aList->GetItemNet( duplicate + 1 ) ) ) seterr = false; } } if( seterr ) - Diagnose( g_NetObjectslist[NetItemRef], NULL, local_minconn, WAR ); + Diagnose( aList->GetItem( aNetItemRef ), NULL, local_minconn, WAR ); - *MinConnexion = DRV; // inhibiting other messages of this + *aMinConnexion = DRV; // inhibiting other messages of this // type for the net. } return; } - switch( g_NetObjectslist[NetItemTst]->m_Type ) + switch( aList->GetItemType( netItemTst ) ) { case NET_ITEM_UNSPECIFIED: case NET_SEGMENT: @@ -456,13 +456,13 @@ void TestOthersItems( unsigned NetItemRef, unsigned netstart, break; case NET_PIN: - jj = g_NetObjectslist[NetItemTst]->m_ElectricalType; + jj = aList->GetItem( netItemTst )->m_ElectricalType; local_minconn = std::max( MinimalReq[ref_elect_type][jj], local_minconn ); - if( NetItemTst <= NetItemRef ) + if( netItemTst <= aNetItemRef ) break; - *NetNbItems += 1; + *aNetNbItems += 1; if( erc == OK ) { @@ -470,14 +470,12 @@ void TestOthersItems( unsigned NetItemRef, unsigned netstart, if( erc != OK ) { - if( g_NetObjectslist[NetItemTst]->m_FlagOfConnection == 0 ) + if( aList->GetConnectionType( netItemTst ) == UNCONNECTED ) { - Diagnose( g_NetObjectslist[NetItemRef], - g_NetObjectslist[NetItemTst], - 0, - erc ); - g_NetObjectslist[NetItemTst]->m_FlagOfConnection = - NOCONNECT_SYMBOL_PRESENT; + Diagnose( aList->GetItem( aNetItemRef ), + aList->GetItem( netItemTst ), + 0, erc ); + aList->SetConnectionType( netItemTst, NOCONNECT_SYMBOL_PRESENT ); } } } @@ -538,38 +536,36 @@ bool WriteDiagnosticERC( const wxString& aFullFileName ) } -void TestLabel( unsigned NetItemRef, unsigned StartNet ) +void TestLabel( NETLIST_OBJECT_LIST* aList, unsigned aNetItemRef, unsigned aStartNet ) { - unsigned NetItemTst; + unsigned netItemTst = aStartNet; int erc = 1; - NetItemTst = StartNet; - /* Review the list of labels connected to NetItemRef. */ - for( ; ; NetItemTst++ ) + for( ; ; netItemTst++ ) { - if( NetItemTst == NetItemRef ) + if( netItemTst == aNetItemRef ) continue; /* Is always in the same net? */ - if( ( NetItemTst == g_NetObjectslist.size() ) - || ( g_NetObjectslist[NetItemRef]->GetNet() != g_NetObjectslist[NetItemTst]->GetNet() ) ) + if( ( netItemTst == aList->size() ) + || ( aList->GetItemNet( aNetItemRef ) != aList->GetItemNet( netItemTst ) ) ) { /* End Netcode found. */ if( erc ) { /* Glabel or SheetLabel orphaned. */ - Diagnose( g_NetObjectslist[NetItemRef], NULL, -1, WAR ); + Diagnose( aList->GetItem( aNetItemRef ), NULL, -1, WAR ); } return; } - if( g_NetObjectslist[NetItemRef]->IsLabelConnected( g_NetObjectslist[NetItemTst] ) ) + if( aList->GetItem( aNetItemRef )->IsLabelConnected( aList->GetItem( netItemTst ) ) ) erc = 0; //same thing, different order. - if( g_NetObjectslist[NetItemTst]->IsLabelConnected( g_NetObjectslist[NetItemRef] ) ) + if( aList->GetItem( netItemTst )->IsLabelConnected( aList->GetItem( aNetItemRef ) ) ) erc = 0; } } diff --git a/eeschema/erc.h b/eeschema/erc.h index 541bfe4d22..22eb00257d 100644 --- a/eeschema/erc.h +++ b/eeschema/erc.h @@ -33,6 +33,7 @@ class EDA_DRAW_PANEL; class NETLIST_OBJECT; +class NETLIST_OBJECT_LIST; /* For ERC markers: error types (used in diags, and to set the color): */ @@ -83,15 +84,16 @@ extern void Diagnose( NETLIST_OBJECT* NetItemRef, NETLIST_OBJECT* NetItemTst, * Perform ERC testing for electrical conflicts between \a NetItemRef and other items * on the same net. */ -extern void TestOthersItems( unsigned NetItemRef, unsigned NetStart, - int* NetNbItems, int* MinConnexion ); +extern void TestOthersItems( NETLIST_OBJECT_LIST* aList, + unsigned aNetItemRef, unsigned aNetStart, + int* aNetNbItems, int* aMinConnexion ); /** * Function TestLabel * performs an ERC on a sheet labels to verify that it is connected to a corresponding * sub sheet global label. */ -extern void TestLabel( unsigned NetItemRef, unsigned StartNet ); +extern void TestLabel( NETLIST_OBJECT_LIST* aList, unsigned aNetItemRef, unsigned aStartNet ); /** * Function TestDuplicateSheetNames( ) diff --git a/eeschema/netform.cpp b/eeschema/netform.cpp index 41571f1b43..346f7dc5c9 100644 --- a/eeschema/netform.cpp +++ b/eeschema/netform.cpp @@ -1,9 +1,9 @@ /* * This program source code file is part of KiCad, a free EDA CAD application. * - * Copyright (C) 1992-2012 jp.charras at wanadoo.fr - * Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck - * Copyright (C) 1992-2012 KiCad Developers, see change_log.txt for contributors. + * Copyright (C) 1992-2013 jp.charras at wanadoo.fr + * Copyright (C) 2013 SoftPLC Corporation, Dick Hollenbeck + * Copyright (C) 1992-2013 KiCad Developers, see change_log.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -44,15 +44,12 @@ #include #include - #include // also nests: - #include +#include #define INTERMEDIATE_NETLIST_EXT wxT("xml") -#include - /** * Class UNIQUE_STRINGS * tracks unique wxStrings and is useful in telling if a string @@ -95,6 +92,8 @@ bool UNIQUE_STRINGS::Lookup( const wxString& aString ) */ class NETLIST_EXPORT_TOOL { + NETLIST_OBJECT_LIST * m_masterList; /// The main connected items flat list + /// Used to temporary store and filter the list of pins of a schematic component /// when generating schematic component data in netlist (comp section) NETLIST_OBJECT_LIST m_SortedComponentPinList; @@ -187,7 +186,7 @@ class NETLIST_EXPORT_TOOL * - 6 CA *

*/ - bool writeListOfNetsCADSTAR( FILE* f, NETLIST_OBJECT_LIST& aObjectsList ); + bool writeListOfNetsCADSTAR( FILE* f ); /** * Function makeGenericRoot @@ -230,6 +229,10 @@ class NETLIST_EXPORT_TOOL XNODE* makeGenericLibraries(); public: + NETLIST_EXPORT_TOOL( NETLIST_OBJECT_LIST * aMasterList ) + { + m_masterList = aMasterList; + } /** * Function WriteKiCadNetList @@ -354,6 +357,8 @@ wxString NETLIST_EXPORT_TOOL::MakeCommandLine( const wxString& aFormatString, /* Function WriteNetListFile * creates the netlist file. Netlist info must be existing + * (call BuildNetListBase() to create this info ) + * param aConnectedItemsList = the initialized list of connected items * param aFormat = netlist format (NET_TYPE_PCBNEW ...) * param aFullFileName = full netlist file name * param aNetlistOptions = netlist options using OR'ed bits. @@ -361,12 +366,13 @@ wxString NETLIST_EXPORT_TOOL::MakeCommandLine( const wxString& aFormatString, * if NET_USE_X_PREFIX is set : change "U" and "IC" refernce prefix to "X" * return true if success. */ -bool SCH_EDIT_FRAME::WriteNetListFile( int aFormat, const wxString& aFullFileName, +bool SCH_EDIT_FRAME::WriteNetListFile( NETLIST_OBJECT_LIST * aConnectedItemsList, + int aFormat, const wxString& aFullFileName, unsigned aNetlistOptions ) { bool ret = true; FILE* f = NULL; - NETLIST_EXPORT_TOOL helper; + NETLIST_EXPORT_TOOL helper( aConnectedItemsList ); bool open_file = aFormat < NET_TYPE_CUSTOM1; if( (aFormat == NET_TYPE_PCBNEW) && (aNetlistOptions & NET_PCBNEW_USE_NEW_FORMAT ) ) @@ -439,8 +445,6 @@ bool SCH_EDIT_FRAME::WriteNetListFile( int aFormat, const wxString& aFullFileNam D(printf("commandLine:'%s'\n", TO_UTF8( commandLine ) );) ProcessExecute( commandLine, wxEXEC_SYNC ); - - // ::wxRemoveFile( tmpFile.GetFullPath() ); } break; } @@ -473,7 +477,7 @@ void NETLIST_EXPORT_TOOL::sprintPinNetName( wxString& aResult, // caller's loop. aResult.Empty(); - if( netcode != 0 && aPin->m_FlagOfConnection == PAD_CONNECT ) + if( netcode != 0 && aPin->GetConnectionType() == PAD_CONNECT ) { aResult = aPin->GetNetName(); @@ -852,9 +856,9 @@ XNODE* NETLIST_EXPORT_TOOL::makeGenericListOfNets() m_LibParts.clear(); // must call this function before using m_LibParts. - for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ ) + for( unsigned ii = 0; ii < m_masterList->size(); ii++ ) { - NETLIST_OBJECT* nitem = g_NetObjectslist[ii]; + NETLIST_OBJECT* nitem = m_masterList->GetItem( ii ); SCH_COMPONENT* comp; // New net found, write net id; @@ -1035,8 +1039,8 @@ XNODE* NETLIST_EXPORT_TOOL::makeGenericComponents() bool NETLIST_EXPORT_TOOL::WriteKiCadNetList( const wxString& aOutFileName ) { // Prepare list of nets generation - for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ ) - g_NetObjectslist[ii]->m_Flag = 0; + for( unsigned ii = 0; ii < m_masterList->size(); ii++ ) + m_masterList->GetItem( ii )->m_Flag = 0; std::auto_ptr xroot( makeGenericRoot() ); @@ -1058,8 +1062,8 @@ bool NETLIST_EXPORT_TOOL::WriteKiCadNetList( const wxString& aOutFileName ) bool NETLIST_EXPORT_TOOL::WriteGENERICNetList( const wxString& aOutFileName ) { // Prepare list of nets generation - for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ ) - g_NetObjectslist[ii]->m_Flag = 0; + for( unsigned ii = 0; ii < m_masterList->size(); ii++ ) + m_masterList->GetItem( ii )->m_Flag = 0; // output the XML format netlist. wxXmlDocument xdoc; @@ -1091,8 +1095,8 @@ bool NETLIST_EXPORT_TOOL::WriteNetListPspice( FILE* f, bool aUsePrefix ) NETLIST_HEAD_STRING, TO_UTF8( DateAndTime() ) ); // Prepare list of nets generation (not used here, but... - for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ ) - g_NetObjectslist[ii]->m_Flag = 0; + for( unsigned ii = 0; ii < m_masterList->size(); ii++ ) + m_masterList->GetItem( ii )->m_Flag = 0; ret |= fprintf( f, "* To exclude a component from the Spice Netlist add [Spice_Netlist_Enabled] user FIELD set to: N\n" ); ret |= fprintf( f, "* To reorder the component spice node sequence add [Spice_Node_Sequence] user FIELD and define sequence: 2,1,0\n" ); @@ -1370,8 +1374,8 @@ bool NETLIST_EXPORT_TOOL::WriteNetListPCBNEW( FILE* f, bool with_pcbnew ) NETLIST_HEAD_STRING, TO_UTF8( DateAndTime() ) ); // Prepare list of nets generation - for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ ) - g_NetObjectslist[ii]->m_Flag = 0; + for( unsigned ii = 0; ii < m_masterList->size(); ii++ ) + m_masterList->GetItem( ii )->m_Flag = 0; // Create netlist module section m_ReferencesAlreadyFound.Clear(); @@ -1487,7 +1491,7 @@ bool NETLIST_EXPORT_TOOL::WriteNetListPCBNEW( FILE* f, bool with_pcbnew ) { ret |= fprintf( f, "{ Pin List by Nets\n" ); - if( !writeGENERICListOfNets( f, g_NetObjectslist ) ) + if( !writeGENERICListOfNets( f, *m_masterList ) ) ret = -1; ret |= fprintf( f, "}\n" ); @@ -1502,9 +1506,9 @@ bool NETLIST_EXPORT_TOOL::addPinToComponentPinList( SCH_COMPONENT* aComponent, SCH_SHEET_PATH* aSheetPath, LIB_PIN* aPin ) { // Search the PIN description for Pin in g_NetObjectslist - for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ ) + for( unsigned ii = 0; ii < m_masterList->size(); ii++ ) { - NETLIST_OBJECT* pin = g_NetObjectslist[ii]; + NETLIST_OBJECT* pin = m_masterList->GetItem( ii ); if( pin->m_Type != NET_PIN ) continue; @@ -1567,7 +1571,7 @@ void NETLIST_EXPORT_TOOL::eraseDuplicatePins( ) if( m_SortedComponentPinList[idxref]->m_PinNum != m_SortedComponentPinList[jj]->m_PinNum ) break; - if( m_SortedComponentPinList[idxref]->m_FlagOfConnection == PAD_CONNECT ) + if( m_SortedComponentPinList[idxref]->GetConnectionType() == PAD_CONNECT ) { m_SortedComponentPinList[jj]->m_Flag = 1; m_SortedComponentPinList[jj] = NULL; @@ -1575,7 +1579,7 @@ void NETLIST_EXPORT_TOOL::eraseDuplicatePins( ) else /* the reference pin is not connected: remove this pin if the * other pin is connected */ { - if( m_SortedComponentPinList[jj]->m_FlagOfConnection == PAD_CONNECT ) + if( m_SortedComponentPinList[jj]->GetConnectionType() == PAD_CONNECT ) { m_SortedComponentPinList[idxref]->m_Flag = 1; m_SortedComponentPinList[idxref] = NULL; @@ -1729,8 +1733,8 @@ bool NETLIST_EXPORT_TOOL::WriteNetListCADSTAR( FILE* f ) ret |= fprintf( f, "\n" ); // Prepare list of nets generation - for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ ) - g_NetObjectslist[ii]->m_Flag = 0; + for( unsigned ii = 0; ii < m_masterList->size(); ii++ ) + m_masterList->GetItem( ii )->m_Flag = 0; // Create netlist module section m_ReferencesAlreadyFound.Clear(); @@ -1772,7 +1776,7 @@ bool NETLIST_EXPORT_TOOL::WriteNetListCADSTAR( FILE* f ) m_SortedComponentPinList.clear(); - if( ! writeListOfNetsCADSTAR( f, g_NetObjectslist ) ) + if( ! writeListOfNetsCADSTAR( f ) ) ret = -1; // set error ret |= fprintf( f, "\n%sEND\n", TO_UTF8( StartLine ) ); @@ -1781,7 +1785,7 @@ bool NETLIST_EXPORT_TOOL::WriteNetListCADSTAR( FILE* f ) } -bool NETLIST_EXPORT_TOOL::writeListOfNetsCADSTAR( FILE* f, NETLIST_OBJECT_LIST& aObjectsList ) +bool NETLIST_EXPORT_TOOL::writeListOfNetsCADSTAR( FILE* f ) { int ret = 0; wxString InitNetDesc = StartLine + wxT( "ADD_TER" ); @@ -1793,9 +1797,9 @@ bool NETLIST_EXPORT_TOOL::writeListOfNetsCADSTAR( FILE* f, NETLIST_OBJECT_LIST& SCH_COMPONENT* Cmp; wxString netName; - for( ii = 0; ii < g_NetObjectslist.size(); ii++ ) + for( ii = 0; ii < m_masterList->size(); ii++ ) { - NETLIST_OBJECT* nitem = aObjectsList[ii]; + NETLIST_OBJECT* nitem = m_masterList->GetItem( ii ); // Get the NetName of the current net : if( ( NetCode = nitem->GetNet() ) != lastNetCode ) diff --git a/eeschema/netlist.cpp b/eeschema/netlist.cpp index 3ba0f26408..7a90b39e83 100644 --- a/eeschema/netlist.cpp +++ b/eeschema/netlist.cpp @@ -49,17 +49,16 @@ #define IS_BUS true // Buffer to build the list of items used in netlist and erc calculations -NETLIST_OBJECT_LIST g_NetObjectslist( true ); +NETLIST_OBJECT_LIST s_NetObjectslist( true ); //#define NETLIST_DEBUG -// Local variables -static int LastNetCode, LastBusNetCode; - NETLIST_OBJECT_LIST::~NETLIST_OBJECT_LIST() { if( m_isOwner ) - ClearList(); + FreeList(); + else + Clear(); } @@ -67,7 +66,7 @@ NETLIST_OBJECT_LIST::~NETLIST_OBJECT_LIST() * Delete all objects in list and clear list * (free memory used to store info about NETLIST_OBJECT items) */ -void NETLIST_OBJECT_LIST::ClearList() +void NETLIST_OBJECT_LIST::FreeList() { std::vector::iterator iter; @@ -93,9 +92,9 @@ void NETLIST_OBJECT_LIST::SortListbySheet() /* * Build net list connection table. - * Updates g_NetObjectslist + * Initializes s_NetObjectslist */ -void SCH_EDIT_FRAME::BuildNetListBase() +NETLIST_OBJECT_LIST * SCH_EDIT_FRAME::BuildNetListBase() { wxBusyCursor Busy; @@ -103,20 +102,22 @@ void SCH_EDIT_FRAME::BuildNetListBase() SCH_SHEET_LIST aSheets; // Build netlist info - bool success = g_NetObjectslist.BuildNetListInfo( aSheets ); + bool success = s_NetObjectslist.BuildNetListInfo( aSheets ); if( !success ) { SetStatusText( _("No Objects" ) ); - return; + return &s_NetObjectslist; } /* The new %zu specification is needed to properly format a size_t * value (returned by size(), here) */ wxString msg; - msg.Printf( _( "Net count = %zu" ), g_NetObjectslist.size() ); + msg.Printf( _( "Net count = %zu" ), s_NetObjectslist.size() ); SetStatusText( msg ); + + return &s_NetObjectslist; } /* the master function of NETLIST_OBJECT_LIST class. @@ -125,8 +126,8 @@ void SCH_EDIT_FRAME::BuildNetListBase() */ bool NETLIST_OBJECT_LIST::BuildNetListInfo( SCH_SHEET_LIST& aSheets ) { - g_NetObjectslist.SetOwner( true ); - g_NetObjectslist.ClearList(); + s_NetObjectslist.SetOwner( true ); + s_NetObjectslist.FreeList(); SCH_SHEET_PATH* sheet; @@ -147,7 +148,7 @@ bool NETLIST_OBJECT_LIST::BuildNetListInfo( SCH_SHEET_LIST& aSheets ) SortListbySheet(); sheet = &(GetItem( 0 )->m_SheetList); - LastNetCode = LastBusNetCode = 1; + m_lastNetCode = m_lastBusNetCode = 1; for( unsigned ii = 0, istart = 0; ii < size(); ii++ ) { @@ -176,31 +177,31 @@ bool NETLIST_OBJECT_LIST::BuildNetListInfo( SCH_SHEET_LIST& aSheets ) // Test connections point to point type without bus. if( net_item->GetNet() == 0 ) { - net_item->SetNet( LastNetCode ); - LastNetCode++; + net_item->SetNet( m_lastNetCode ); + m_lastNetCode++; } - PointToPointConnect( net_item, IS_WIRE, istart ); + pointToPointConnect( net_item, IS_WIRE, istart ); break; case NET_JUNCTION: // Control of the junction outside BUS. if( net_item->GetNet() == 0 ) { - net_item->SetNet( LastNetCode ); - LastNetCode++; + net_item->SetNet( m_lastNetCode ); + m_lastNetCode++; } - SegmentToPointConnect( net_item, IS_WIRE, istart ); + segmentToPointConnect( net_item, IS_WIRE, istart ); /* Control of the junction, on BUS. */ if( net_item->m_BusNetCode == 0 ) { - net_item->m_BusNetCode = LastBusNetCode; - LastBusNetCode++; + net_item->m_BusNetCode = m_lastBusNetCode; + m_lastBusNetCode++; } - SegmentToPointConnect( net_item, IS_BUS, istart ); + segmentToPointConnect( net_item, IS_BUS, istart ); break; case NET_LABEL: @@ -209,11 +210,11 @@ bool NETLIST_OBJECT_LIST::BuildNetListInfo( SCH_SHEET_LIST& aSheets ) // Test connections type junction without bus. if( net_item->GetNet() == 0 ) { - net_item->SetNet( LastNetCode ); - LastNetCode++; + net_item->SetNet( m_lastNetCode ); + m_lastNetCode++; } - SegmentToPointConnect( net_item, IS_WIRE, istart ); + segmentToPointConnect( net_item, IS_WIRE, istart ); break; case NET_SHEETBUSLABELMEMBER: @@ -224,11 +225,11 @@ bool NETLIST_OBJECT_LIST::BuildNetListInfo( SCH_SHEET_LIST& aSheets ) /* Control type connections point to point mode bus */ if( net_item->m_BusNetCode == 0 ) { - net_item->m_BusNetCode = LastBusNetCode; - LastBusNetCode++; + net_item->m_BusNetCode = m_lastBusNetCode; + m_lastBusNetCode++; } - PointToPointConnect( net_item, IS_BUS, istart ); + pointToPointConnect( net_item, IS_BUS, istart ); break; case NET_BUSLABELMEMBER: @@ -237,11 +238,11 @@ bool NETLIST_OBJECT_LIST::BuildNetListInfo( SCH_SHEET_LIST& aSheets ) /* Control connections similar has on BUS */ if( net_item->GetNet() == 0 ) { - net_item->m_BusNetCode = LastBusNetCode; - LastBusNetCode++; + net_item->m_BusNetCode = m_lastBusNetCode; + m_lastBusNetCode++; } - SegmentToPointConnect( net_item, IS_BUS, istart ); + segmentToPointConnect( net_item, IS_BUS, istart ); break; } } @@ -252,7 +253,7 @@ bool NETLIST_OBJECT_LIST::BuildNetListInfo( SCH_SHEET_LIST& aSheets ) #endif /* Updating the Bus Labels Netcode connected by Bus */ - ConnectBusLabels(); + connectBusLabels(); /* Group objects by label. */ for( unsigned ii = 0; ii < size(); ii++ ) @@ -291,11 +292,11 @@ bool NETLIST_OBJECT_LIST::BuildNetListInfo( SCH_SHEET_LIST& aSheets ) #endif // Connection between hierarchy sheets - for( unsigned ii = 0; ii < g_NetObjectslist.size(); ii++ ) + for( unsigned ii = 0; ii < size(); ii++ ) { if( GetItem( ii )->m_Type == NET_SHEETLABEL || GetItem( ii )->m_Type == NET_SHEETBUSLABELMEMBER ) - SheetLabelConnect( GetItem( ii ) ); + sheetLabelConnect( GetItem( ii ) ); } // Sort objects by NetCode @@ -308,24 +309,24 @@ bool NETLIST_OBJECT_LIST::BuildNetListInfo( SCH_SHEET_LIST& aSheets ) /* Compress numbers of Netcode having consecutive values. */ int NetCode = 0; - LastNetCode = 0; + m_lastNetCode = 0; for( unsigned ii = 0; ii < size(); ii++ ) { - if( GetItem( ii )->GetNet() != LastNetCode ) + if( GetItem( ii )->GetNet() != m_lastNetCode ) { NetCode++; - LastNetCode = GetItem( ii )->GetNet(); + m_lastNetCode = GetItem( ii )->GetNet(); } GetItem( ii )->SetNet( NetCode ); } // Set the minimal connection info: - SetUnconnectedFlag(); + setUnconnectedFlag(); // find the best label object to give the best net name to each net - FindBestNetNameForEachNet(); + findBestNetNameForEachNet(); return true; } @@ -348,9 +349,9 @@ static int getPriority( const NETLIST_OBJECT* Objet ) return 0; } -/* function evalLabelsPriority used by FindBestNetNameForEachNet() +/* function evalLabelsPriority used by findBestNetNameForEachNet() * evalLabelsPriority calculates the priority of alabel1 and aLabel2 - * return true if alabel1 has a smaller priority than aLabel2 + * return true if alabel1 has a highter priority than aLabel2 */ static bool evalLabelsPriority( const NETLIST_OBJECT* aLabel1, const NETLIST_OBJECT* aLabel2 ) @@ -359,7 +360,7 @@ static bool evalLabelsPriority( const NETLIST_OBJECT* aLabel1, int priority2 = getPriority( aLabel2 ); if( priority1 != priority2 ) - return priority1 < priority2; + return priority1 > priority2; // Objects have here the same priority, therefore they have the same type. @@ -383,15 +384,15 @@ static bool evalLabelsPriority( const NETLIST_OBJECT* aLabel1, // For labels on sheets having an equivalent deep in hierarchy, use // alphabetic label name order: if( aLabel1->m_Label.Cmp( aLabel2->m_Label ) != 0 ) - return aLabel1->m_Label.Cmp( aLabel2->m_Label ) ; + return aLabel1->m_Label.Cmp( aLabel2->m_Label ) < 0; return aLabel1->m_SheetList.PathHumanReadable().Cmp( - aLabel2->m_SheetList.PathHumanReadable() ); + aLabel2->m_SheetList.PathHumanReadable() ) < 0; } /** - * Function FindBestNetNameForEachNet + * Function findBestNetNameForEachNet * fill the .m_NetNameCandidate member of each item of aNetItemBuffer * with a reference to the "best" NETLIST_OBJECT usable to give a name to the net * If no suitable object found, .m_NetNameCandidate is filled with 0. @@ -401,7 +402,7 @@ static bool evalLabelsPriority( const NETLIST_OBJECT* aLabel1, * the label is in the first sheet in a hierarchy (the root sheet has the most priority) * alphabetic order. */ -void NETLIST_OBJECT_LIST::FindBestNetNameForEachNet() +void NETLIST_OBJECT_LIST::findBestNetNameForEachNet() { int netcode = 0; // current netcode for tested items unsigned idxstart = 0; // index of the first item of this net @@ -448,6 +449,8 @@ void NETLIST_OBJECT_LIST::FindBestNetNameForEachNet() else { if( evalLabelsPriority( item, candidate ) ) + // item has a highter priority than candidate + // so update the best candidate candidate = item; } break; @@ -512,7 +515,7 @@ void NETLIST_OBJECT_LIST::FindBestNetNameForEachNet() * Propagate net codes from a parent sheet to an include sheet, * from a pin sheet connection */ -void NETLIST_OBJECT_LIST::SheetLabelConnect( NETLIST_OBJECT* SheetLabel ) +void NETLIST_OBJECT_LIST::sheetLabelConnect( NETLIST_OBJECT* SheetLabel ) { if( SheetLabel->GetNet() == 0 ) return; @@ -547,9 +550,9 @@ void NETLIST_OBJECT_LIST::SheetLabelConnect( NETLIST_OBJECT* SheetLabel ) * Propagate net codes between the corresponding labels (ie when * the is the same) when they are connected * uqsually by their BusNetCode - * Uses and updates the variable LastNetCode + * Uses and updates the variable m_lastNetCode */ -void NETLIST_OBJECT_LIST::ConnectBusLabels() +void NETLIST_OBJECT_LIST::connectBusLabels() { for( unsigned ii = 0; ii < size(); ii++ ) { @@ -561,8 +564,8 @@ void NETLIST_OBJECT_LIST::ConnectBusLabels() { if( Label->GetNet() == 0 ) { - Label->SetNet( LastNetCode ); - LastNetCode++; + Label->SetNet( m_lastNetCode ); + m_lastNetCode++; } for( unsigned jj = ii + 1; jj < size(); jj++ ) @@ -642,7 +645,7 @@ void NETLIST_OBJECT_LIST::propageNetCode( int aOldNetCode, int aNewNetCode, bool * Leaf schema * (There can be no physical connection between elements of different sheets) */ -void NETLIST_OBJECT_LIST::PointToPointConnect( NETLIST_OBJECT* aRef, bool aIsBus, +void NETLIST_OBJECT_LIST::pointToPointConnect( NETLIST_OBJECT* aRef, bool aIsBus, int start ) { int netCode; @@ -745,7 +748,7 @@ void NETLIST_OBJECT_LIST::PointToPointConnect( NETLIST_OBJECT* aRef, bool aIsBus * The list of objects is expected sorted by sheets. * Search is done from index aIdxStart to the last element of list */ -void NETLIST_OBJECT_LIST::SegmentToPointConnect( NETLIST_OBJECT* aJonction, +void NETLIST_OBJECT_LIST::segmentToPointConnect( NETLIST_OBJECT* aJonction, bool aIsBus, int aIdxStart ) { for( unsigned i = aIdxStart; i < size(); i++ ) @@ -767,7 +770,7 @@ void NETLIST_OBJECT_LIST::SegmentToPointConnect( NETLIST_OBJECT* aJonction, continue; } - if( SegmentIntersect( segment->m_Start, segment->m_End, aJonction->m_Start ) ) + if( IsPointOnSegment( segment->m_Start, segment->m_End, aJonction->m_Start ) ) { // Propagation Netcode has all the objects of the same Netcode. if( aIsBus == IS_WIRE ) @@ -837,13 +840,13 @@ void NETLIST_OBJECT_LIST::labelConnect( NETLIST_OBJECT* aLabelRef ) } -/* Set the m_FlagOfConnection member of items in list +/* Set the m_ConnectionType member of items in list * depending on the connection type: * UNCONNECTED, PAD_CONNECT or NOCONNECT_SYMBOL_PRESENT * The list is expected sorted by order of net code, * i.e. items having the same net code are grouped */ -void NETLIST_OBJECT_LIST::SetUnconnectedFlag() +void NETLIST_OBJECT_LIST::setUnconnectedFlag() { NETLIST_OBJECT* NetItemRef; unsigned NetStart, NetEnd; @@ -863,13 +866,13 @@ void NETLIST_OBJECT_LIST::SetUnconnectedFlag() if( ( idxtoTest >= size() ) || ( NetItemRef->GetNet() != GetItem( idxtoTest )->GetNet() ) ) { - /* Net analysis to update m_FlagOfConnection */ + /* Net analysis to update m_ConnectionType */ NetEnd = idxtoTest; - /* set m_FlagOfConnection member to StateFlag for all items of + /* set m_ConnectionType member to StateFlag for all items of * this net: */ for( unsigned kk = NetStart; kk < NetEnd; kk++ ) - GetItem( kk )->m_FlagOfConnection = StateFlag; + GetItem( kk )->m_ConnectionType = StateFlag; if( idxtoTest >= size() ) return; diff --git a/eeschema/protos.h b/eeschema/protos.h index 47341416b5..1da8164820 100644 --- a/eeschema/protos.h +++ b/eeschema/protos.h @@ -21,12 +21,6 @@ class SCH_ITEM; //void DisplayCmpDoc( wxString& Name ); wxString DataBaseGetName( EDA_DRAW_FRAME* frame, wxString& Keys, wxString& BufName ); - -/*********************/ -/* DANGLING_ENDS.CPP */ -/*********************/ -bool SegmentIntersect( wxPoint aSegStart, wxPoint aSegEnd, wxPoint aTestPoint ); - // operations_on_item_lists.cpp void DeleteItemsInList( EDA_DRAW_PANEL* panel, PICKED_ITEMS_LIST& aItemsList ); diff --git a/eeschema/sch_text.cpp b/eeschema/sch_text.cpp index 0a3356ff10..c2ec767599 100644 --- a/eeschema/sch_text.cpp +++ b/eeschema/sch_text.cpp @@ -535,7 +535,7 @@ bool SCH_TEXT::IsDanglingStateChanged( std::vector< DANGLING_END_ITEM >& aItemLi wxT( "Dangling end type list overflow. Bad programmer!" ) ); DANGLING_END_ITEM & nextItem = aItemList[ii]; - m_isDangling = !SegmentIntersect( item.GetPosition(), nextItem.GetPosition(), m_Pos ); + m_isDangling = !IsPointOnSegment( item.GetPosition(), nextItem.GetPosition(), m_Pos ); } break; diff --git a/include/trigo.h b/include/trigo.h index f7ced0916e..c48d76391a 100644 --- a/include/trigo.h +++ b/include/trigo.h @@ -31,6 +31,19 @@ #include #include // For wxPoint +/** + * Function IsPointOnSegment + * @param aSegStart The first point of the segment S. + * @param aSegEnd The second point of the segment S. + * @param aTestPoint The point P to test. + * @return true if the point P is on the segment S. + * faster than TestSegmentHit() because P should be exactly on S + * therefore works fine only for H, V and 45 deg segm. + * suitable for busses and wires in eeschema, otherwise use TestSegmentHit() + */ +bool IsPointOnSegment( const wxPoint& aSegStart, const wxPoint& aSegEnd, + const wxPoint& aTestPoint ); + /** * Function SegmentIntersectsSegment * @@ -105,8 +118,8 @@ inline double EuclideanNorm( const wxSize &vector ) //! @param linePointA Point on line //! @param linePointB Point on line //! @param referencePoint Reference point -inline double DistanceLinePoint( const wxPoint &linePointA, - const wxPoint &linePointB, +inline double DistanceLinePoint( const wxPoint &linePointA, + const wxPoint &linePointB, const wxPoint &referencePoint ) { // Some of the multiple double casts are redundant. However in the previous @@ -114,9 +127,9 @@ inline double DistanceLinePoint( const wxPoint &linePointA, // the division (EuclideanNorm gives a double so from int it would // be promoted); that means that the whole expression were // vulnerable to overflow during int multiplications - return fabs( ( double(linePointB.x - linePointA.x) * + return fabs( ( double(linePointB.x - linePointA.x) * double(linePointA.y - referencePoint.y) - - double(linePointA.x - referencePoint.x ) * + double(linePointA.x - referencePoint.x ) * double(linePointB.y - linePointA.y) ) / EuclideanNorm( linePointB - linePointA ) ); } @@ -126,7 +139,7 @@ inline double DistanceLinePoint( const wxPoint &linePointA, //! @param pointB Second point //! @param threshold The maximum distance //! @return True or false -inline bool HitTestPoints( const wxPoint &pointA, const wxPoint &pointB, +inline bool HitTestPoints( const wxPoint &pointA, const wxPoint &pointB, double threshold ) { wxPoint vectorAB = pointB - pointA; @@ -157,7 +170,7 @@ inline double CrossProduct( const wxPoint &vectorA, const wxPoint &vectorB ) * @param aEnd is the second end-point of the line segment * @param aDist = maximum distance for hit */ -bool TestSegmentHit( const wxPoint &aRefPoint, wxPoint aStart, +bool TestSegmentHit( const wxPoint &aRefPoint, wxPoint aStart, wxPoint aEnd, int aDist ); /** @@ -191,10 +204,10 @@ template inline void NORMALIZE_ANGLE_360( T &Angle ) while( Angle < -3600 ) Angle += 3600; while( Angle > 3600 ) - Angle -= 3600; + Angle -= 3600; } -/// Normalize angle to be in the 0.0 .. 360.0 range: +/// Normalize angle to be in the 0.0 .. 360.0 range: template inline void NORMALIZE_ANGLE_POS( T &Angle ) { while( Angle < 0 ) diff --git a/include/wxEeschemaStruct.h b/include/wxEeschemaStruct.h index 2f050ba60d..50004d1018 100644 --- a/include/wxEeschemaStruct.h +++ b/include/wxEeschemaStruct.h @@ -446,8 +446,14 @@ public: */ void SendMessageToPCBNEW( EDA_ITEM* objectToSync, SCH_COMPONENT* LibItem ); - /* netlist generation */ - void BuildNetListBase(); + /** + * BuildNetListBase + * netlist generation: + * Creates a flat list which stores all connected objects, and mainly + * pins and labels. + * @return a pointer to the list + */ + NETLIST_OBJECT_LIST * BuildNetListBase(); /** * Function CreateNetlist @@ -474,6 +480,8 @@ public: /** * Function WriteNetListFile * Create the netlist file. Netlist info must be existing + * (BuildNetListBase() creates this info) + * @param aConnectedItemsList = the initialized list of connected items * @param aFormat = netlist format (NET_TYPE_PCBNEW ...) * @param aFullFileName = full netlist file name * @param aNetlistOptions = netlist options using OR'ed bits. @@ -485,7 +493,8 @@ public: *

* @return true if success. */ - bool WriteNetListFile( int aFormat, + bool WriteNetListFile( NETLIST_OBJECT_LIST * aConnectedItemsList, + int aFormat, const wxString& aFullFileName, unsigned aNetlistOptions );