diff --git a/.bzrignore b/.bzrignore index feb3c8f91f..6f7c904a97 100644 --- a/.bzrignore +++ b/.bzrignore @@ -17,8 +17,8 @@ install_manifest.txt Documentation/doxygen *.cmake *.bak -pcbnew/pcb_plot_params_keywords.cpp -pcbnew/pcb_plot_params_lexer.h +common/pcb_plot_params_keywords.cpp +common/pcb_plot_params_lexer.h pcbnew/specctra_keywords.cpp pcbnew/specctra_lexer.h new/html diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 7c02e1f196..595614b9b7 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -4,6 +4,14 @@ KiCad ChangeLog 2011 Please add newer entries at the top, list the date and your name with email address. + +2011-Dec-9 UPDATE Dick Hollenbeck +================================================================================ +++PCBNew + * added BOARD::GetPad(int), made BOARD::m_NetInfo private + * more kicad_plugin work. + + 2011-Dec-5 UPDATE Dick Hollenbeck ================================================================================ ++PCBNew diff --git a/CMakeLists.txt b/CMakeLists.txt index e6ea644c70..7050345b08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -276,9 +276,13 @@ add_subdirectory(template) #================================================ find_package(Doxygen) if(DOXYGEN_FOUND) - add_custom_target( doxygen-docs ${DOXYGEN_EXECUTABLE} + add_custom_target( doxygen-docs + ${CMAKE_COMMAND} -E remove_directory Documentation/doxygen + COMMAND ${DOXYGEN_EXECUTABLE} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS Doxyfile ) + DEPENDS Doxyfile + COMMENT "building doxygen docs into directory Documentation/doxygen/html" + ) else(DOXYGEN_FOUND) message( STATUS "WARNING: Doxygen not found - doxygen-docs (Source Docs) target not created" ) endif() diff --git a/include/dlist.h b/include/dlist.h index 10e593389d..fcdb8f37af 100644 --- a/include/dlist.h +++ b/include/dlist.h @@ -113,7 +113,7 @@ public: * Function GetCount * returns the number of elements in the list. */ - unsigned GetCount() { return count; } + unsigned GetCount() const { return count; } #if defined(DEBUG) void VerifyListIntegrity(); diff --git a/pcbnew/board.cpp b/pcbnew/board.cpp index 7568b3ba3f..3bc08e68ca 100644 --- a/pcbnew/board.cpp +++ b/pcbnew/board.cpp @@ -203,9 +203,9 @@ void PlaceCells( BOARD* aPcb, int net_code, int flag ) via_marge = clearance + (viaSize / 2); // Place PADS on matrix routing: - for( unsigned i = 0; i < aPcb->GetPadsCount(); ++i ) + for( unsigned i = 0; i < aPcb->GetPadCount(); ++i ) { - D_PAD* pad = aPcb->m_NetInfo->GetPad( i ); + D_PAD* pad = aPcb->GetPad( i ); if( net_code != pad->GetNet() || (flag & FORCE_PADS) ) { diff --git a/pcbnew/class_board.cpp b/pcbnew/class_board.cpp index 547245d75b..0775a2c134 100644 --- a/pcbnew/class_board.cpp +++ b/pcbnew/class_board.cpp @@ -30,6 +30,7 @@ wxPoint BOARD_ITEM::ZeroOffset( 0, 0 ); BOARD::BOARD() : BOARD_ITEM( (BOARD_ITEM*) NULL, PCB_T ), + m_NetInfo( this ), m_NetClasses( this ) { // we have not loaded a board yet, assume latest until then. @@ -42,8 +43,8 @@ BOARD::BOARD() : m_CurrentZoneContour = NULL; // This ZONE_CONTAINER handle the // zone contour currently in progress - m_NetInfo = new NETINFO_LIST( this ); // handle nets info list (name, design constraints .. - m_NetInfo->BuildListOfNets(); // prepare pads and nets lists containers. + + BuildListOfNets(); // prepare pad and netlist containers. for( int layer = 0; layer < NB_COPPER_LAYERS; ++layer ) { @@ -89,8 +90,6 @@ BOARD::~BOARD() delete m_CurrentZoneContour; m_CurrentZoneContour = NULL; - - delete m_NetInfo; } @@ -814,25 +813,25 @@ void BOARD::DeleteZONEOutlines() } -int BOARD::GetNumSegmTrack() +int BOARD::GetNumSegmTrack() const { return m_Track.GetCount(); } -int BOARD::GetNumSegmZone() +int BOARD::GetNumSegmZone() const { return m_Zone.GetCount(); } -unsigned BOARD::GetNoconnectCount() +unsigned BOARD::GetNoconnectCount() const { return m_NbNoconnect; } -unsigned BOARD::GetNodesCount() +unsigned BOARD::GetNodesCount() const { return m_NbNodes; } @@ -844,7 +843,7 @@ EDA_RECT BOARD::ComputeBoundingBox( bool aBoardEdgesOnly ) EDA_RECT area; // Check segments, dimensions, texts, and fiducials - for( BOARD_ITEM* item = m_Drawings; item != NULL; item = item->Next() ) + for( BOARD_ITEM* item = m_Drawings; item; item = item->Next() ) { if( aBoardEdgesOnly && (item->Type() != PCB_LINE_T || item->GetLayer() != EDGE_N ) ) continue; @@ -931,7 +930,7 @@ void BOARD::DisplayInfo( EDA_DRAW_FRAME* frame ) trackSegmentsCount++; } - txt.Printf( wxT( "%d" ), GetPadsCount() ); + txt.Printf( wxT( "%d" ), GetPadCount() ); frame->AppendMsgPanel( _( "Pads" ), txt, DARKGREEN ); txt.Printf( wxT( "%d" ), viasCount ); @@ -943,7 +942,7 @@ void BOARD::DisplayInfo( EDA_DRAW_FRAME* frame ) txt.Printf( wxT( "%d" ), GetNodesCount() ); frame->AppendMsgPanel( _( "Nodes" ), txt, DARKCYAN ); - txt.Printf( wxT( "%d" ), m_NetInfo->GetCount() ); + txt.Printf( wxT( "%d" ), m_NetInfo.GetNetCount() ); frame->AppendMsgPanel( _( "Nets" ), txt, RED ); /* These parameters are known only if the full ratsnest is available, @@ -1229,10 +1228,10 @@ SEARCH_RESULT BOARD::Visit( INSPECTOR* inspector, const void* testData, NETINFO_ITEM* BOARD::FindNet( int aNetcode ) const { - // the first valid netcode is 1 and the last is m_NetInfo->GetCount()-1. + // the first valid netcode is 1 and the last is m_NetInfo.GetCount()-1. // zero is reserved for "no connection" and is not used. // NULL is returned for non valid netcodes - NETINFO_ITEM* net = m_NetInfo->GetNetItem( aNetcode ); + NETINFO_ITEM* net = m_NetInfo.GetNetItem( aNetcode ); #if defined(DEBUG) if( net ) // item can be NULL if anetcode is not valid @@ -1256,7 +1255,7 @@ NETINFO_ITEM* BOARD::FindNet( const wxString& aNetname ) const if( aNetname.IsEmpty() ) return NULL; - int ncount = m_NetInfo->GetCount(); + int ncount = m_NetInfo.GetNetCount(); // Search for a netname = aNetname #if 0 @@ -1264,7 +1263,7 @@ NETINFO_ITEM* BOARD::FindNet( const wxString& aNetname ) const // Use a sequential search: easy to understand, but slow for( int ii = 1; ii < ncount; ii++ ) { - NETINFO_ITEM* item = m_NetInfo->GetNetItem( ii ); + NETINFO_ITEM* item = m_NetInfo.GetNetItem( ii ); if( item && item->GetNetname() == aNetname ) { @@ -1289,7 +1288,7 @@ NETINFO_ITEM* BOARD::FindNet( const wxString& aNetname ) const if( (ii & 1) && ( ii > 1 ) ) ncount++; - NETINFO_ITEM* item = m_NetInfo->GetNetItem( index ); + NETINFO_ITEM* item = m_NetInfo.GetNetItem( index ); if( item == NULL ) return NULL; @@ -1370,18 +1369,18 @@ static bool s_SortByNodes( const NETINFO_ITEM* a, const NETINFO_ITEM* b ) int BOARD::ReturnSortedNetnamesList( wxArrayString& aNames, bool aSortbyPadsCount ) { - if( m_NetInfo->GetCount() == 0 ) + if( m_NetInfo.GetNetCount() == 0 ) return 0; // Build the list std::vector netBuffer; - netBuffer.reserve( m_NetInfo->GetCount() ); + netBuffer.reserve( m_NetInfo.GetNetCount() ); - for( unsigned ii = 1; ii < m_NetInfo->GetCount(); ii++ ) + for( unsigned ii = 1; ii < m_NetInfo.GetNetCount(); ii++ ) { - if( m_NetInfo->GetNetItem( ii )->GetNet() > 0 ) - netBuffer.push_back( m_NetInfo->GetNetItem( ii ) ); + if( m_NetInfo.GetNetItem( ii )->GetNet() > 0 ) + netBuffer.push_back( m_NetInfo.GetNetItem( ii ) ); } // sort the list @@ -1561,9 +1560,9 @@ D_PAD* BOARD::GetPad( TRACK* aTrace, int aEndPoint ) D_PAD* BOARD::GetPadFast( const wxPoint& aPosition, int aLayerMask ) { - for( unsigned i=0; iGetPad(i); + D_PAD* pad = m_NetInfo.GetPad(i); if( pad->m_Pos != aPosition ) continue; @@ -1675,8 +1674,8 @@ static bool sortPadsByXthenYCoord( D_PAD* const & ref, D_PAD* const & comp ) void BOARD::GetSortedPadListByXthenYCoord( std::vector& aVector ) { - aVector.insert( aVector.end(), m_NetInfo->m_PadsFullList.begin(), - m_NetInfo->m_PadsFullList.end() ); + aVector.insert( aVector.end(), m_NetInfo.m_PadsFullList.begin(), + m_NetInfo.m_PadsFullList.end() ); sort( aVector.begin(), aVector.end(), sortPadsByXthenYCoord ); } diff --git a/pcbnew/class_board.h b/pcbnew/class_board.h index 82a328a960..50a0922f52 100644 --- a/pcbnew/class_board.h +++ b/pcbnew/class_board.h @@ -38,7 +38,8 @@ typedef std::vector< TRACK* > TRACK_PTRS; * Enum LAYER_T * gives the allowed types of layers, same as Specctra DSN spec. */ -enum LAYER_T { +enum LAYER_T +{ LT_SIGNAL, LT_POWER, LT_MIXED, @@ -169,6 +170,23 @@ private: EDA_RECT m_BoundingBox; + NETINFO_LIST m_NetInfo; ///< net info list (name, design constraints .. + + BOARD_DESIGN_SETTINGS m_designSettings; + COLORS_DESIGN_SETTINGS* m_colorsSettings; // Link to current colors settings + + /** + * Function chainMarkedSegments + * is used by MarkTrace() to set the BUSY flag of connected segments of the trace + * segment located at \a aPosition on aLayerMask. + * Vias are put in list but their flags BUSY is not set + * @param aPosition A wxPoint object containing the position of the starting search. + * @param aLayerMask The allowed layers for segments to search. + * @param aList The track list to fill with points of flagged segments. + */ + void chainMarkedSegments( wxPoint aPosition, int aLayerMask, TRACK_PTRS* aList ); + + public: /// Flags used in ratsnest calculation and update. @@ -185,9 +203,6 @@ public: DLIST m_Track; // linked list of TRACKs and SEGVIAs DLIST m_Zone; // linked list of SEGZONEs - /// nets info list (name, design constraints .. - NETINFO_LIST* m_NetInfo; - /// Ratsnest list for the BOARD std::vector m_FullRatsnest; @@ -223,22 +238,7 @@ public: // Index for m_TrackWidthList to select the value. unsigned m_TrackWidthSelector; -private: - BOARD_DESIGN_SETTINGS m_designSettings; - COLORS_DESIGN_SETTINGS* m_colorsSettings; // Link to current colors settings - /** - * Function chainMarkedSegments - * is used by MarkTrace() to set the BUSY flag of connected segments of the trace - * segment located at \a aPosition on aLayerMask. - * Vias are put in list but their flags BUSY is not set - * @param aPosition A wxPoint object containing the position of the starting search. - * @param aLayerMask The allowed layers for segments to search. - * @param aList The track list to fill with points of flagged segments. - */ - void chainMarkedSegments( wxPoint aPosition, int aLayerMask, TRACK_PTRS* aList ); - -public: BOARD(); ~BOARD(); @@ -310,7 +310,6 @@ public: */ void DeleteZONEOutlines(); - /** * Function GetMARKER * returns the MARKER at a given index. @@ -325,7 +324,6 @@ public: return NULL; } - /** * Function GetMARKERCount * @return int - The number of MARKER_PCBS. @@ -335,7 +333,6 @@ public: return (int) m_markers.size(); } - /** * Function ResetHighLight * Reset all high light data to the init state @@ -361,7 +358,6 @@ public: m_hightLight.m_netCode = aNetCode; } - /** * Function IsHighLightNetON * @return true if a net is currently highlighted @@ -610,19 +606,19 @@ public: */ int GetLayerColor( int aLayer ); - /* Functions to get some items count */ - int GetNumSegmTrack(); + /** Functions to get some items count */ + int GetNumSegmTrack() const; - /* Calculate the zone segment count */ - int GetNumSegmZone(); + /** Calculate the zone segment count */ + int GetNumSegmZone() const; - unsigned GetNoconnectCount(); // Return the number of missing links. + unsigned GetNoconnectCount() const; // Return the number of missing links. /** * Function GetNumRatsnests * @return int - The number of rats */ - unsigned GetRatsnestsCount() + unsigned GetRatsnestsCount() const { return m_FullRatsnest.size(); } @@ -632,15 +628,71 @@ public: * Function GetNodesCount * @return the number of pads members of nets (i.e. with netcode > 0) */ - unsigned GetNodesCount(); + unsigned GetNodesCount() const; /** - * Function GetPadsCount + * Function GetPadCount * @return the number of pads in board */ - unsigned GetPadsCount() + unsigned GetPadCount() const { - return m_NetInfo->GetPadsCount(); + return m_NetInfo.GetPadCount(); + } + + /** + * Function GetPad + * @return D_PAD* - at the \a aIndex from m_NetInfo + */ + D_PAD* GetPad( unsigned aIndex ) const + { + return m_NetInfo.GetPad( aIndex ); + } + + /** + * Function GetPads + * returns a list of all the pads by value. The returned list is not + * sorted and contains pointers to PADS, but those pointers do not convey + * ownership of the respective PADs. + * @return std::vector - a full list of pads + */ + std::vector GetPads() + { + return m_NetInfo.m_PadsFullList; + } + + void BuildListOfNets() + { + m_NetInfo.buildListOfNets(); + } + + /** + * Function FindNet + * searches for a net with the given netcode. + * @param aNetcode A netcode to search for. + * @return NETINFO_ITEM_ITEM* - the net or NULL if not found. + */ + NETINFO_ITEM* FindNet( int aNetcode ) const; + + /** + * Function FindNet overloaded + * searches for a net with the given name. + * @param aNetname A Netname to search for. + * @return NETINFO_ITEM* - the net or NULL if not found. + */ + NETINFO_ITEM* FindNet( const wxString& aNetname ) const; + + void AppendNet( NETINFO_ITEM* aNewNet ) + { + m_NetInfo.AppendNet( aNewNet ); + } + + /** + * Function GetNetCount + * @return the number of nets (NETINFO_ITEM) + */ + unsigned GetNetCount() const + { + return m_NetInfo.GetNetCount(); } /** @@ -709,23 +761,6 @@ public: SEARCH_RESULT Visit( INSPECTOR* inspector, const void* testData, const KICAD_T scanTypes[] ); - - /** - * Function FindNet - * searches for a net with the given netcode. - * @param aNetcode A netcode to search for. - * @return NETINFO_ITEM_ITEM* - the net or NULL if not found. - */ - NETINFO_ITEM* FindNet( int aNetcode ) const; - - /** - * Function FindNet overloaded - * searches for a net with the given name. - * @param aNetname A Netname to search for. - * @return NETINFO_ITEM* - the net or NULL if not found. - */ - NETINFO_ITEM* FindNet( const wxString& aNetname ) const; - /** * Function FindModuleByReference * searches for a MODULE within this board with the given @@ -787,7 +822,6 @@ public: return m_TrackWidthList[m_TrackWidthSelector]; } - /** * Function GetCurrentViaSize * @return the current via size, according to the selected options @@ -799,7 +833,6 @@ public: return m_ViasDimensionsList[m_ViaSizeSelector].m_Diameter; } - /** * Function GetCurrentViaDrill * @return the current via size, according to the selected options @@ -837,7 +870,6 @@ public: */ bool Save( FILE* aFile ) const; - /** * Function GetClass * returns the class name. @@ -848,7 +880,6 @@ public: return wxT( "BOARD" ); } - #if defined(DEBUG) /** @@ -922,7 +953,6 @@ public: return NULL; } - /** * Function GetAreaIndex * returns the Area Index for the given Zone Container. @@ -940,7 +970,6 @@ public: return -1; } - /** * Function GetAreaCount * @return int - The number of Areas or ZONE_CONTAINER. @@ -950,7 +979,6 @@ public: return (int) m_ZoneDescriptorList.size(); } - /* Functions used in test, merge and cut outlines */ /** @@ -1196,7 +1224,6 @@ public: */ void GetSortedPadListByXthenYCoord( std::vector& aVector ); - /** * Function GetTrace * find the segment of \a aTrace at \a aPosition on \a aLayer if \a Layer is visible. diff --git a/pcbnew/class_netclass.cpp b/pcbnew/class_netclass.cpp index 09563bce7b..e41cc31855 100644 --- a/pcbnew/class_netclass.cpp +++ b/pcbnew/class_netclass.cpp @@ -195,7 +195,7 @@ void BOARD::SynchronizeNetsAndNetClasses() // set all NETs to the default NETCLASS, then later override some // as we go through the NETCLASSes. - int count = m_NetInfo->GetCount(); + int count = m_NetInfo.GetNetCount(); for( int i=0; i m_NetBuffer; // nets buffer list (name, design constraints .. + friend class BOARD; public: - std::vector m_PadsFullList; // Entry for a sorted pad list (used in ratsnest - // calculations) - -public: NETINFO_LIST( BOARD* aParent ); + NETINFO_LIST( BOARD* aParent ); ~NETINFO_LIST(); /** * Function GetItem * @param aNetcode = netcode to identify a given NETINFO_ITEM - * @return a NETINFO_ITEM pointer to the selected NETINFO_ITEM by its - * netcode, or NULL if not found + * @return NETINFO_ITEM* - by \a aNetcode, or NULL if not found */ - NETINFO_ITEM* GetNetItem( int aNetcode ); + NETINFO_ITEM* GetNetItem( int aNetcode ) const + { + if( unsigned( aNetcode ) >= GetNetCount() ) // catches < 0 too + return NULL; + return m_NetBuffer[aNetcode]; + } /** - * Function GetCount + * Function GetNetCount * @return the number of nets ( always >= 1 ) - * becuse the first net is the "not connected" net and always exists + * because the first net is the "not connected" net and always exists */ - unsigned GetCount() { return m_NetBuffer.size(); } + unsigned GetNetCount() const { return m_NetBuffer.size(); } /** * Function Append @@ -126,33 +130,28 @@ public: NETINFO_LIST( BOARD* aParent ); void AppendNet( NETINFO_ITEM* aNewElement ); /** - * Function DeleteData - * delete the list of nets (and free memory) - */ - void DeleteData(); - - /** - * Function BuildListOfNets - * Build or rebuild the list of NETINFO_ITEM m_NetBuffer - * The list is sorted by names. - */ - void BuildListOfNets(); - - /** - * Function GetPadsCount + * Function GetPadCount * @return the number of pads in board */ - unsigned GetPadsCount() - { - return m_PadsFullList.size(); - } + unsigned GetPadCount() const { return m_PadsFullList.size(); } + /** + * Function GetPads + * returns a list of all the pads. The returned list is not + * sorted and contains pointers to PADS, but those pointers do not convey + * ownership of the respective PADs. + * @return std::vector& - a full list of pads + std::vector& GetPads() + { + return m_PadsFullList; + } + */ /** * Function GetPad * @return the pad idx from m_PadsFullList */ - D_PAD* GetPad( unsigned aIdx ) + D_PAD* GetPad( unsigned aIdx ) const { if( aIdx < m_PadsFullList.size() ) return m_PadsFullList[aIdx]; @@ -160,19 +159,36 @@ public: NETINFO_LIST( BOARD* aParent ); return NULL; } - private: /** - * Function Build_Pads_Full_List - * Create the pad list - * initialise: + * Function DeleteData + * deletes the list of nets (and free memory) + */ + void clear(); + + /** + * Function BuildListOfNets + * builds or rebuilds the list of NETINFO_ITEMs + * The list is sorted by names. + */ + void buildListOfNets(); + + /** + * Function buildPadsFullList + * creates the pad list, and initializes: * m_Pads (list of pads) * set m_Status_Pcb = LISTE_PAD_OK; * and clear for all pads in list the m_SubRatsnest member; * clear m_Pcb->m_FullRatsnest */ - void Build_Pads_Full_List(); + void buildPadsFullList(); + + BOARD* m_Parent; + std::vector m_NetBuffer; ///< net list (name, design constraints ..) + + std::vector m_PadsFullList; ///< contains all pads, sorted by pad's netname. + ///< can be used in ratsnest calculations. }; @@ -183,11 +199,11 @@ private: class NETINFO_ITEM { private: - int m_NetCode; // this is a number equivalent to the net name - // Used for fast comparisons in ratsnest and DRC computations. + int m_NetCode; ///< A number equivalent to the net name. + ///< Used for fast comparisons in ratsnest and DRC computations. - wxString m_Netname; // Full net name like /mysheet/mysubsheet/vout - // used by Eeschema + wxString m_Netname; ///< Full net name like /mysheet/mysubsheet/vout + ///< used by Eeschema wxString m_ShortNetname; // short net name, like vout from // /mysheet/mysubsheet/vout @@ -233,13 +249,11 @@ public: m_NetClassName = NETCLASS::Default; } - NETCLASS* GetNetClass() { return m_NetClass; } - /** * Function GetClassName * returns the class name @@ -249,7 +263,6 @@ public: return m_NetClassName; } - #if 1 /** @@ -272,7 +285,6 @@ public: return m_NetClass->GetViaDiameter(); } - /** * Function GetMicroViaSize * returns the size of vias used to route this net @@ -283,7 +295,6 @@ public: return m_NetClass->GetuViaDiameter(); } - /** * Function GetViaDrillSize * returns the size of via drills used to route this net @@ -294,7 +305,6 @@ public: return m_NetClass->GetViaDrill(); } - /** * Function GetViaDrillSize * returns the size of via drills used to route this net @@ -318,7 +328,6 @@ public: return m_NetClass->GetViaMinSize(); } - #endif /** @@ -331,7 +340,6 @@ public: return m_NetClass->GetClearance(); } - #endif /* Reading and writing data on files */ @@ -346,7 +354,6 @@ public: */ bool Save( FILE* aFile ) const; - /** * Function Draw * @todo we actually could show a NET, simply show all the tracks and @@ -354,7 +361,6 @@ public: */ void Draw( EDA_DRAW_PANEL* panel, wxDC* DC, int aDrawMode, const wxPoint& offset ); - /** * Function GetNet * @return int - the netcode @@ -383,14 +389,13 @@ public: */ void SetNetname( const wxString& aNetname ); - -/** - * Function DisplayInfo - * has knowledge about the frame and how and where to put status information - * about this object into the frame's message panel. - * Is virtual from EDA_ITEM. - * @param frame A EDA_DRAW_FRAME in which to print status information. - */ + /** + * Function DisplayInfo + * has knowledge about the frame and how and where to put status information + * about this object into the frame's message panel. + * Is virtual from EDA_ITEM. + * @param frame A EDA_DRAW_FRAME in which to print status information. + */ void DisplayInfo( EDA_DRAW_FRAME* frame ); }; diff --git a/pcbnew/class_netinfo_item.cpp b/pcbnew/class_netinfo_item.cpp index 2517e50fda..38bdbcaadb 100644 --- a/pcbnew/class_netinfo_item.cpp +++ b/pcbnew/class_netinfo_item.cpp @@ -140,7 +140,6 @@ void NETINFO_ITEM::DisplayInfo( EDA_DRAW_FRAME* frame ) // Displays the net lenght of internal ICs connections (wires inside ICs): txt = frame->CoordinateToString( lengthdie ); frame->AppendMsgPanel( _( "On Die" ), txt, RED ); - } @@ -170,7 +169,9 @@ void RATSNEST_ITEM::Draw( EDA_DRAW_PANEL* panel, const wxPoint& aOffset ) { GRSetDrawMode( DC, aDrawMode ); + int color = g_ColorsSettings.GetItemColor(RATSNEST_VISIBLE); + GRLine( &panel->m_ClipBox, DC, m_PadStart->m_Pos - aOffset, m_PadEnd->m_Pos - aOffset, 0, color ); } diff --git a/pcbnew/class_netinfolist.cpp b/pcbnew/class_netinfolist.cpp index ff8d580172..b82d00b395 100644 --- a/pcbnew/class_netinfolist.cpp +++ b/pcbnew/class_netinfolist.cpp @@ -23,31 +23,13 @@ NETINFO_LIST::NETINFO_LIST( BOARD* aParent ) NETINFO_LIST::~NETINFO_LIST() { - DeleteData(); + clear(); } -/** - * Function GetItem - * @param aNetcode = netcode to identify a given NETINFO_ITEM - * @return a NETINFO_ITEM pointer to the selected NETINFO_ITEM by its netcode, or NULL if not found - */ -NETINFO_ITEM* NETINFO_LIST::GetNetItem( int aNetcode ) +void NETINFO_LIST::clear() { - if( aNetcode < 0 || ( aNetcode > (int) ( GetCount() - 1 ) ) ) - return NULL; - - return m_NetBuffer[aNetcode]; -} - - -/** - * Function DeleteData - * delete the list of nets (and free memory) - */ -void NETINFO_LIST::DeleteData() -{ - for( unsigned ii = 0; ii < GetCount(); ii++ ) + for( unsigned ii = 0; ii < GetNetCount(); ii++ ) delete m_NetBuffer[ii]; m_NetBuffer.clear(); @@ -72,7 +54,7 @@ void NETINFO_LIST::AppendNet( NETINFO_ITEM* aNewElement ) * and expects to have a nets list sorted by an alphabetic case sensitive sort */ -static bool PadlistSortByNetnames( const D_PAD* a, const D_PAD* b ) +static bool padlistSortByNetnames( const D_PAD* a, const D_PAD* b ) { return ( a->GetNetname().Cmp( b->GetNetname() ) ) < 0; } @@ -90,23 +72,23 @@ static bool PadlistSortByNetnames( const D_PAD* a, const D_PAD* b ) * and expects to have a nets list sorted by an alphabetic case sensitive sort * So do not change Build_Pads_Full_List() taht build a sorted list of pads */ -void NETINFO_LIST::BuildListOfNets() +void NETINFO_LIST::buildListOfNets() { - D_PAD* pad; - int nodes_count = 0; - NETINFO_ITEM* net_item; + D_PAD* pad; + int nodes_count = 0; + NETINFO_ITEM* net_item; - DeleteData(); // Remove all nets info and free memory + clear(); // Remove all nets info and free memory // Create and add the "unconnected net", always existing, // used to handle pads and tracks that are not member of a "real" net net_item = new NETINFO_ITEM( (BOARD_ITEM*) m_Parent ); AppendNet( net_item ); - /* Build the PAD list, sorted by net */ - Build_Pads_Full_List(); + // Build the PAD list, sorted by net + buildPadsFullList(); - /* Build netnames list, and create a netcode for each netname */ + // Build netnames list, and create a netcode for each netname D_PAD* last_pad = NULL; int netcode = 0; @@ -158,21 +140,20 @@ void NETINFO_LIST::BuildListOfNets() } -/** - * Function Build_Pads_Full_List - * Create the pad list, sorted by net names (sorted by an alphabetic case sensitive sort) - * initialise: - * m_Pads (list of pads) - * set m_Status_Pcb = LISTE_PAD_OK; - * also clear m_Pcb->m_FullRatsnest that could have bad data - * (m_Pcb->m_FullRatsnest uses pointer to pads) - * Be aware NETINFO_ITEM* BOARD::FindNet( const wxString& aNetname ) - * when search a net by its net name does a binary search - * and expects to have a nets list sorted by an alphabetic case sensitive sort - * So do not change the sort function used here - */ -void NETINFO_LIST::Build_Pads_Full_List() +void NETINFO_LIST::buildPadsFullList() { + /* + * initialize: + * m_Pads (list of pads) + * set m_Status_Pcb = LISTE_PAD_OK; + * also clear m_Pcb->m_FullRatsnest that could have bad data + * (m_Pcb->m_FullRatsnest uses pointer to pads) + * Be aware NETINFO_ITEM* BOARD::FindNet( const wxString& aNetname ) + * when search a net by its net name does a binary search + * and expects to have a nets list sorted by an alphabetic case sensitive sort + * So do not change the sort function used here + */ + if( m_Parent->m_Status_Pcb & LISTE_PAD_OK ) return; @@ -180,7 +161,7 @@ void NETINFO_LIST::Build_Pads_Full_List() m_PadsFullList.clear(); m_Parent->m_FullRatsnest.clear(); - /* Clear variables used in rastnest computation */ + // Clear variables used in ratsnest computation for( MODULE* module = m_Parent->m_Modules; module; module = module->Next() ) { for( D_PAD* pad = module->m_Pads; pad; pad = pad->Next() ) @@ -193,8 +174,7 @@ void NETINFO_LIST::Build_Pads_Full_List() } // Sort pad list per net - // - sort( m_PadsFullList.begin(), m_PadsFullList.end(), PadlistSortByNetnames ); + sort( m_PadsFullList.begin(), m_PadsFullList.end(), padlistSortByNetnames ); m_Parent->m_Status_Pcb = LISTE_PAD_OK; } diff --git a/pcbnew/clean.cpp b/pcbnew/clean.cpp index ec2c0540b2..cbd649fa7b 100644 --- a/pcbnew/clean.cpp +++ b/pcbnew/clean.cpp @@ -69,7 +69,7 @@ void CleanupTracks( PCB_EDIT_FRAME* aFrame, /* Rebuild the pad infos (pad list and netcodes) to ensure an up to date info */ aFrame->GetBoard()->m_Status_Pcb = 0; - aFrame->GetBoard()->m_NetInfo->BuildListOfNets(); + aFrame->GetBoard()->BuildListOfNets(); if( aCleanVias ) // delete redundant vias { diff --git a/pcbnew/connect.cpp b/pcbnew/connect.cpp index 31809bc16d..7c9fc5a792 100644 --- a/pcbnew/connect.cpp +++ b/pcbnew/connect.cpp @@ -677,9 +677,9 @@ void CONNECTIONS::Propagate_SubNets() void PCB_BASE_FRAME::TestConnections() { // Clear the cluster identifier for all pads - for( unsigned i = 0; i< m_Pcb->GetPadsCount(); ++i ) + for( unsigned i = 0; i< m_Pcb->GetPadCount(); ++i ) { - D_PAD* pad = m_Pcb->m_NetInfo->GetPad(i); + D_PAD* pad = m_Pcb->GetPad(i); pad->SetZoneSubNet( 0 ); pad->SetSubNet( 0 ); @@ -720,9 +720,9 @@ void PCB_BASE_FRAME::TestNetConnection( wxDC* aDC, int aNetCode ) Compile_Ratsnest( aDC, true ); // Clear the cluster identifier (subnet) of pads for this net - for( unsigned i = 0; i < m_Pcb->GetPadsCount(); ++i ) + for( unsigned i = 0; i < m_Pcb->GetPadCount(); ++i ) { - D_PAD* pad = m_Pcb->m_NetInfo->GetPad(i); + D_PAD* pad = m_Pcb->GetPad(i); int pad_net_code = pad->GetNet(); if( pad_net_code < aNetCode ) @@ -786,7 +786,8 @@ void PCB_BASE_FRAME::RecalculateAllTracksNetcode() TRACK* curr_track; // Build the net info list - GetBoard()->m_NetInfo->BuildListOfNets(); + GetBoard()->BuildListOfNets(); + // Reset variables and flags used in computation curr_track = m_Pcb->m_Track; for( ; curr_track != NULL; curr_track = curr_track->Next() ) @@ -801,7 +802,7 @@ void PCB_BASE_FRAME::RecalculateAllTracksNetcode() } // If no pad, reset pointers and netcode, and do nothing else - if( m_Pcb->GetPadsCount() == 0 ) + if( m_Pcb->GetPadCount() == 0 ) return; CONNECTIONS connections( m_Pcb ); diff --git a/pcbnew/drc_clearance_test_functions.cpp b/pcbnew/drc_clearance_test_functions.cpp index dabd8ac457..9e3ff5c921 100644 --- a/pcbnew/drc_clearance_test_functions.cpp +++ b/pcbnew/drc_clearance_test_functions.cpp @@ -276,9 +276,9 @@ bool DRC::doTrackDrc( TRACK* aRefSeg, TRACK* aStart, bool testPads ) // Compute the min distance to pads if( testPads ) { - for( unsigned ii = 0; iiGetPadsCount(); ++ii ) + for( unsigned ii = 0; iiGetPadCount(); ++ii ) { - D_PAD* pad = m_pcb->m_NetInfo->GetPad( ii ); + D_PAD* pad = m_pcb->GetPad( ii ); /* No problem if pads are on an other layer, * But if a drill hole exists (a pad on a single layer can have a hole!) diff --git a/pcbnew/export_gencad.cpp b/pcbnew/export_gencad.cpp index d237152361..9f9b76d698 100644 --- a/pcbnew/export_gencad.cpp +++ b/pcbnew/export_gencad.cpp @@ -262,12 +262,10 @@ static void CreatePadsShapesSection( FILE* aFile, BOARD* aPcb ) fputs( "$PADS\n", aFile ); // Enumerate and sort the pads - if( aPcb->GetPadsCount() > 0 ) + if( aPcb->GetPadCount() > 0 ) { - pads.insert( pads.end(), - aPcb->m_NetInfo->m_PadsFullList.begin(), - aPcb->m_NetInfo->m_PadsFullList.end() ); - qsort( &pads[0], aPcb->GetPadsCount(), sizeof( D_PAD* ), + pads = aPcb->GetPads(); + qsort( &pads[0], aPcb->GetPadCount(), sizeof( D_PAD* ), PadListSortByShape ); } @@ -643,9 +641,9 @@ static void CreateSignalsSection( FILE* aFile, BOARD* aPcb ) fputs( "$SIGNALS\n", aFile ); - for( unsigned ii = 0; ii < aPcb->m_NetInfo->GetCount(); ii++ ) + for( unsigned ii = 0; ii < aPcb->GetNetCount(); ii++ ) { - net = aPcb->m_NetInfo->GetNetItem( ii ); + net = aPcb->FindNet( ii ); if( net->GetNetname() == wxEmptyString ) // dummy netlist (no connection) { diff --git a/pcbnew/highlight.cpp b/pcbnew/highlight.cpp index fa0cbdf6d9..b543436f2e 100644 --- a/pcbnew/highlight.cpp +++ b/pcbnew/highlight.cpp @@ -63,9 +63,9 @@ void PCB_EDIT_FRAME::ListNetsAndSelect( wxCommandEvent& event ) return; wxString Line; - for( unsigned ii = 0; ii < GetBoard()->m_NetInfo->GetCount(); ii++ ) + for( unsigned ii = 0; ii < GetBoard()->GetNetCount(); ii++ ) { - net = GetBoard()->m_NetInfo->GetNetItem( ii ); + net = GetBoard()->m_NetInfo.GetNetItem( ii ); if( !WildCompareString( netFilter, net->GetNetname(), false ) ) continue; @@ -84,9 +84,9 @@ void PCB_EDIT_FRAME::ListNetsAndSelect( wxCommandEvent& event ) unsigned netcode = (unsigned) choiceDlg.GetSelection(); // Search for the net selected. - for( unsigned ii = 0; ii < GetBoard()->m_NetInfo->GetCount(); ii++ ) + for( unsigned ii = 0; ii < GetBoard()->GetNetCount(); ii++ ) { - net = GetBoard()->m_NetInfo->GetNetItem( ii ); + net = GetBoard()->FindNet( ii ); if( !WildCompareString( netFilter, net->GetNetname(), false ) ) continue; diff --git a/pcbnew/ioascii.cpp b/pcbnew/ioascii.cpp index 87d6c3b0bd..dcad90feb7 100644 --- a/pcbnew/ioascii.cpp +++ b/pcbnew/ioascii.cpp @@ -824,7 +824,7 @@ bool PCB_EDIT_FRAME::WriteGeneralDescrPcb( FILE* File ) fprintf( File, "Nzone %d\n", GetBoard()->GetNumSegmZone() ); fprintf( File, "BoardThickness %d\n", GetBoard()->GetDesignSettings().m_BoardThickness ); fprintf( File, "Nmodule %d\n", NbModules ); - fprintf( File, "Nnets %d\n", GetBoard()->m_NetInfo->GetCount() ); + fprintf( File, "Nnets %d\n", GetBoard()->GetNetCount() ); fprintf( File, "$EndGENERAL\n\n" ); return true; } @@ -1010,7 +1010,7 @@ int PCB_EDIT_FRAME::ReadPcbFile( LINE_READER* aReader, bool Append ) if( TESTLINE( "EQUIPOT" ) ) { NETINFO_ITEM* net = new NETINFO_ITEM( board ); - board->m_NetInfo->AppendNet( net ); + board->m_NetInfo.AppendNet( net ); net->ReadDescr( aReader ); continue; } @@ -1133,7 +1133,7 @@ int PCB_EDIT_FRAME::ReadPcbFile( LINE_READER* aReader, bool Append ) GetBoard()->m_Status_Pcb = 0; // Build the net info list - GetBoard()->m_NetInfo->BuildListOfNets(); + GetBoard()->m_NetInfo.BuildListOfNets(); board->SynchronizeNetsAndNetClasses(); diff --git a/pcbnew/item_io.cpp b/pcbnew/item_io.cpp index 0c35812af6..a277757e96 100644 --- a/pcbnew/item_io.cpp +++ b/pcbnew/item_io.cpp @@ -41,7 +41,6 @@ #include "pcbnew.h" #include "pcbnew_id.h" #include "autorout.h" -#include "pcb_plot_params.h" #include "3d_struct.h" #include "trigo.h" @@ -60,8 +59,8 @@ bool BOARD::Save( FILE* aFile ) const BOARD_ITEM* item; // save the nets - for( unsigned ii = 0; ii < m_NetInfo->GetCount(); ii++ ) - if( !m_NetInfo->GetNetItem( ii )->Save( aFile ) ) + for( unsigned ii = 0; ii < GetNetCount(); ii++ ) + if( !FindNet( ii )->Save( aFile ) ) goto out; // Saved nets do not include netclass names, so save netclasses after nets. diff --git a/pcbnew/kicad_plugin.cpp b/pcbnew/kicad_plugin.cpp index 03f5d46ffa..b0a5b81bf4 100644 --- a/pcbnew/kicad_plugin.cpp +++ b/pcbnew/kicad_plugin.cpp @@ -232,7 +232,7 @@ void KICAD_PLUGIN::loadAllSections( bool doAppend ) else if( TESTLINE( "$TEXTPCB" ) ) { - loadPCB_TEXTE(); + loadPCB_TEXT(); } else if( TESTLINE( "$TRACK" ) ) @@ -362,8 +362,7 @@ void KICAD_PLUGIN::loadGENERAL() else if( TESTLINE( "Ly" ) ) // Old format for Layer count { - int layer_mask = hexParse( line + SZ( "Ly" ) ); - + int layer_mask = hexParse( line + SZ( "Ly" ) ); int layer_count = 0; for( int ii = 0; ii < NB_COPPER_LAYERS && layer_mask; ++ii, layer_mask >>= 1 ) @@ -566,7 +565,7 @@ void KICAD_PLUGIN::loadSETUP() */ } -#if defined(PCBNEW) +#if 1 // defined(PCBNEW) else if( TESTLINE( "Layers" ) ) { @@ -853,13 +852,6 @@ void KICAD_PLUGIN::loadMODULE() if( TESTLINE( "D" ) ) // read a drawing item, e.g. "DS" { loadEDGE_MODULE( module.get() ); - /* - EDGE_MODULE * edge; - edge = new EDGE_MODULE( this ); - m_Drawings.PushBack( edge ); - edge->ReadDescr( m_reader ); - edge->SetDrawCoord(); - */ } else if( TESTLINE( "$PAD" ) ) @@ -886,7 +878,7 @@ void KICAD_PLUGIN::loadMODULE() textm = new TEXTE_MODULE( module.get() ); module->m_Drawings.PushBack( textm ); } - loadTEXTE_MODULE( textm ); + loadMODULE_TEXT( textm ); } else if( TESTLINE( "Po" ) ) @@ -1315,13 +1307,13 @@ void KICAD_PLUGIN::loadEDGE_MODULE( MODULE* aModule ) aModule->m_Drawings.PushBack( em ); - // this had been done at the MODULE level before, presumably because it needs - // to be already added to a module before this function will work. + // this had been done at the MODULE level before, presumably because the + // EDGE_MODULE needs to be already added to a module before this function will work. em->SetDrawCoord(); } -void KICAD_PLUGIN::loadTEXTE_MODULE( TEXTE_MODULE* aText ) +void KICAD_PLUGIN::loadMODULE_TEXT( TEXTE_MODULE* aText ) { const char* data; char* line = m_reader->Line(); // current (old) line @@ -1334,7 +1326,7 @@ void KICAD_PLUGIN::loadTEXTE_MODULE( TEXTE_MODULE* aText ) int type = intParse( line+1, &data ); BIU pos0_x = biuParse( data, &data ); BIU pos0_y = biuParse( data, &data ); - BIU size0_y = biuParse( data, &data ); // why y? + BIU size0_y = biuParse( data, &data ); BIU size0_x = biuParse( data, &data ); double orient = degParse( data, &data ); BIU thickn = biuParse( data, &data ); @@ -1586,7 +1578,7 @@ void KICAD_PLUGIN::loadNETINFO_ITEM() char buf[1024]; NETINFO_ITEM* net = new NETINFO_ITEM( m_board ); - m_board->m_NetInfo->AppendNet( net ); + m_board->AppendNet( net ); while( READLINE() ) { @@ -1612,7 +1604,7 @@ void KICAD_PLUGIN::loadNETINFO_ITEM() } -void KICAD_PLUGIN::loadPCB_TEXTE() +void KICAD_PLUGIN::loadPCB_TEXT() { /* examples: For a single line text: @@ -1746,7 +1738,8 @@ void KICAD_PLUGIN::loadTrackList( TRACK* aInsertBeforeMe, int aStructType ) // example first line: // "Po 0 23994 28800 24400 28800 150 -1\r\n" - char* line = m_reader->Line(); + const char* data; + char* line = m_reader->Line(); if( line[0] == '$' ) // $EndTRACK return; // preferred exit @@ -1755,9 +1748,7 @@ void KICAD_PLUGIN::loadTrackList( TRACK* aInsertBeforeMe, int aStructType ) assert( TESTLINE( "Po" ) ); - const char* data = line + SZ( "Po" ); - - int shape = intParse( data, &data ); + int shape = intParse( line + SZ( "Po" ), &data ); BIU start_x = biuParse( data, &data ); BIU start_y = biuParse( data, &data ); BIU end_x = biuParse( data, &data ); @@ -1781,11 +1772,15 @@ void KICAD_PLUGIN::loadTrackList( TRACK* aInsertBeforeMe, int aStructType ) // example second line: // "De 0 0 463 0 800000\r\n" +#if 1 + assert( TESTLINE( "Po" ) ); +#else if( !TESTLINE( "De" ) ) { // mandatory 2nd line is missing THROW_IO_ERROR( "Missing 2nd line of a TRACK def" ); } +#endif int makeType; long timeStamp; @@ -2530,6 +2525,8 @@ void KICAD_PLUGIN::Save( const wxString& aFileName, BOARD* aBoard, PROPERTIES* a THROW_IO_ERROR( m_error ); } + m_filename = aFileName; + // wxf now owns fp, will close on exception or return wxFFile wxf( fp ); @@ -2537,174 +2534,214 @@ void KICAD_PLUGIN::Save( const wxString& aFileName, BOARD* aBoard, PROPERTIES* a init( aProperties ); -// saveAllSections(); + saveAllSections(); +} + + +void KICAD_PLUGIN::checkWriteError( const char* aCaller ) const +{ + if( ferror( m_fp ) ) + { + THROW_IO_ERROR( wxString::Format( _( "error writing to file '%s' from function %s" ), + m_filename.GetData(), FROM_UTF8( aCaller ).GetData() ) ); + } } -#if 0 void KICAD_PLUGIN::saveAllSections() const { - // $GENERAL section is first + saveGENERAL(); - // $SHEETDESCR section is next + saveSHEET(); - // $SETUP section is next + saveSETUP(); - // Then follows $EQUIPOT and all the rest saveBOARD(); } +void KICAD_PLUGIN::saveGENERAL() const +{ + +} + + +void KICAD_PLUGIN::saveSHEET() const +{ +} + + +void KICAD_PLUGIN::saveSETUP() const +{ + +} + + void KICAD_PLUGIN::saveBOARD() const { - bool rc = false; - BOARD_ITEM* item; - +#if 0 // save the nets - for( unsigned ii = 0; ii < m_NetInfo->GetCount(); ii++ ) - if( !m_NetInfo->GetNetItem( ii )->Save( aFile ) ) - goto out; + int netcount = m_board->GetNetCount(); + for( int i = 0; i < netcount; ++i ) + saveNETINFO_ITEM( m_board->FindNet( i ) ); // Saved nets do not include netclass names, so save netclasses after nets. - m_NetClasses.Save( aFile ); + saveNETCLASSES(); // save the modules - for( item = m_Modules; item; item = item->Next() ) - if( !item->Save( aFile ) ) - goto out; + for( MODULE* m = m_board->m_Modules; m; m = (MODULE*) m->Next() ) + saveMODULE( m ); - for( item = m_Drawings; item; item = item->Next() ) + // save the graphics owned by the board (not owned by a module) + for( BOARD_ITEM* gr = m_board->m_Drawings; gr; gr = gr->Next() ) { - switch( item->Type() ) + switch( gr->Type() ) { case PCB_TEXT_T: + savePCB_TEXT( (TEXTE_PCB*) gr ); + break; case PCB_LINE_T: + saveEDGE_MODULE( (EDGE_MODULE*) gr ); + break; case PCB_TARGET_T: + saveTARGET( (PCB_TARGET*) gr ); + break; case PCB_DIMENSION_T: - if( !item->Save( aFile ) ) - goto out; - + saveDIMENTION( (DIMENSION*) gr ); break; - default: - - // future: throw exception here -#if defined(DEBUG) - printf( "BOARD::Save() ignoring m_Drawings type %d\n", item->Type() ); -#endif - break; + THROW_IO_ERROR( wxString::Format( _( "unknown graphic type %d"), gr->Type() ) ); } } // do not save MARKER_PCBs, they can be regenerated easily // save the tracks & vias - fprintf( aFile, "$TRACK\n" ); - - for( item = m_Track; item; item = item->Next() ) - { - if( !item->Save( aFile ) ) - goto out; - } - - fprintf( aFile, "$EndTRACK\n" ); + fprintf( m_fp, "$TRACK\n" ); + for( TRACK* track = m_board->m_Track; track; track = track->Next() ) + saveTRACK( (TRACK*) track ); + fprintf( m_fp, "$EndTRACK\n" ); // save the zones - fprintf( aFile, "$ZONE\n" ); + fprintf( m_fp, "$ZONE\n" ); + for( SEGZONE* zone = m_board->m_Zone; zone; zone = zone->Next() ) + saveSEGZONE( zone ); + fprintf( m_fp, "$EndZONE\n" ); - for( item = m_Zone; item; item = item->Next() ) - { - if( !item->Save( aFile ) ) - goto out; - } + // save the polygon (which are the newer technology) zones + for( int i=0; i < m_board->GetAreaCount(); ++i ) + saveZONE_CONTAINER( m_board->GetArea( i ) ); - fprintf( aFile, "$EndZONE\n" ); - - // save the zone edges - for( unsigned ii = 0; ii < m_ZoneDescriptorList.size(); ii++ ) - { - ZONE_CONTAINER* edge_zone = m_ZoneDescriptorList[ii]; - edge_zone->Save( aFile ); - } - - - if( fprintf( aFile, "$EndBOARD\n" ) != sizeof("$EndBOARD\n") - 1 ) - goto out; - - rc = true; // wrote all OK - -out: - return rc; + fprintf( m_fp, "$EndBOARD\n" ); +#endif } -bool DRAWSEGMENT::Save( FILE* aFile ) const +void KICAD_PLUGIN::saveNETINFO_ITEM( const NETINFO_ITEM* aNet ) const { - if( fprintf( aFile, "$DRAWSEGMENT\n" ) != sizeof("$DRAWSEGMENT\n") - 1 ) + fprintf( m_fp, "$EQUIPOT\n" ); + fprintf( m_fp, "Na %d %s\n", aNet->GetNet(), EscapedUTF8( aNet->GetNetname() ).c_str() ); + fprintf( m_fp, "St %s\n", "~" ); + fprintf( m_fp, "$EndEQUIPOT\n" ); + + checkWriteError( __FUNCTION__ ); +} + + +void KICAD_PLUGIN::saveNETCLASSES() const +{ + // @todo make m_NetClasses private + NETCLASSES nc = m_board->m_NetClasses; + + // save the default first. + saveNETCLASS( nc.GetDefault() ); + + // the rest will be alphabetical in the *.brd file. + for( NETCLASSES::const_iterator it = nc.begin(); it != nc.end(); ++it ) + { + NETCLASS* netclass = it->second; + + saveNETCLASS( netclass ); + } + + checkWriteError( __FUNCTION__ ); +} + + +void KICAD_PLUGIN::saveNETCLASS( const NETCLASS* nc ) const +{ + fprintf( m_fp, "$NCLASS\n" ); + fprintf( m_fp, "Name %s\n", EscapedUTF8( nc->GetName() ).c_str() ); + fprintf( m_fp, "Desc %s\n", EscapedUTF8( nc->GetDescription() ).c_str() ); + + // Write parameters + + fprintf( m_fp, "Clearance %d\n", nc->GetClearance() ); + fprintf( m_fp, "TrackWidth %d\n", nc->GetTrackWidth() ); + + fprintf( m_fp, "ViaDia %d\n", nc->GetViaDiameter() ); + fprintf( m_fp, "ViaDrill %d\n", nc->GetViaDrill() ); + + fprintf( m_fp, "uViaDia %d\n", nc->GetuViaDiameter() ); + fprintf( m_fp, "uViaDrill %d\n", nc->GetuViaDrill() ); + + // Write members: + for( NETCLASS::const_iterator it = nc->begin(); it!=nc->end(); ++it ) + fprintf( m_fp, "AddNet %s\n", EscapedUTF8( *it ).c_str() ); + + fprintf( m_fp, "$EndNCLASS\n" ); + + checkWriteError( __FUNCTION__ ); +} + + +#if 0 + +bool DRAWSEGMENT::Save( FILE* m_fp ) const +{ + if( fprintf( m_fp, "$DRAWSEGMENT\n" ) != sizeof("$DRAWSEGMENT\n") - 1 ) return false; - fprintf( aFile, "Po %d %d %d %d %d %d\n", + fprintf( m_fp, "Po %d %d %d %d %d %d\n", m_Shape, m_Start.x, m_Start.y, m_End.x, m_End.y, m_Width ); if( m_Type != S_CURVE ) { - fprintf( aFile, "De %d %d %d %lX %X\n", + fprintf( m_fp, "De %d %d %d %lX %X\n", m_Layer, m_Type, m_Angle, m_TimeStamp, ReturnStatus() ); } else { - fprintf( aFile, "De %d %d %d %lX %X %d %d %d %d\n", + fprintf( m_fp, "De %d %d %d %lX %X %d %d %d %d\n", m_Layer, m_Type, m_Angle, m_TimeStamp, ReturnStatus(), m_BezierC1.x,m_BezierC1.y, m_BezierC2.x,m_BezierC2.y); } - if( fprintf( aFile, "$EndDRAWSEGMENT\n" ) != sizeof("$EndDRAWSEGMENT\n") - 1 ) + if( fprintf( m_fp, "$EndDRAWSEGMENT\n" ) != sizeof("$EndDRAWSEGMENT\n") - 1 ) return false; return true; } -/** Note: the old name of class NETINFO_ITEM was EQUIPOT - * so in Save (and read) functions, for compatibility, we use EQUIPOT as - * keyword - */ -bool NETINFO_ITEM::Save( FILE* aFile ) const -{ - bool success = false; - - fprintf( aFile, "$EQUIPOT\n" ); - fprintf( aFile, "Na %d %s\n", GetNet(), EscapedUTF8( m_Netname ).c_str() ); - fprintf( aFile, "St %s\n", "~" ); - - if( fprintf( aFile, "$EndEQUIPOT\n" ) != sizeof("$EndEQUIPOT\n") - 1 ) - goto out; - - success = true; - -out: - return success; -} - - -bool PCB_TARGET::Save( FILE* aFile ) const +bool PCB_TARGET::Save( FILE* m_fp ) const { bool rc = false; - if( fprintf( aFile, "$PCB_TARGET\n" ) != sizeof("$PCB_TARGET\n")-1 ) + if( fprintf( m_fp, "$PCB_TARGET\n" ) != sizeof("$PCB_TARGET\n")-1 ) goto out; - fprintf( aFile, "Po %X %d %d %d %d %d %8.8lX\n", + fprintf( m_fp, "Po %X %d %d %d %d %d %8.8lX\n", m_Shape, m_Layer, m_Pos.x, m_Pos.y, m_Size, m_Width, m_TimeStamp ); - if( fprintf( aFile, "$EndPCB_TARGET\n" ) != sizeof("$EndPCB_TARGET\n")-1 ) + if( fprintf( m_fp, "$EndPCB_TARGET\n" ) != sizeof("$EndPCB_TARGET\n")-1 ) goto out; rc = true; @@ -2714,7 +2751,7 @@ out: } -bool ZONE_CONTAINER::Save( FILE* aFile ) const +bool ZONE_CONTAINER::Save( FILE* m_fp ) const { unsigned item_pos; int ret; @@ -2722,10 +2759,10 @@ bool ZONE_CONTAINER::Save( FILE* aFile ) const int outline_hatch; char padoption; - fprintf( aFile, "$CZONE_OUTLINE\n" ); + fprintf( m_fp, "$CZONE_OUTLINE\n" ); // Save the outline main info - ret = fprintf( aFile, "ZInfo %8.8lX %d %s\n", + ret = fprintf( m_fp, "ZInfo %8.8lX %d %s\n", m_TimeStamp, m_NetCode, EscapedUTF8( m_Netname ).c_str() ); @@ -2733,7 +2770,7 @@ bool ZONE_CONTAINER::Save( FILE* aFile ) const return false; // Save the outline layer info - ret = fprintf( aFile, "ZLayer %d\n", m_Layer ); + ret = fprintf( m_fp, "ZLayer %d\n", m_Layer ); if( ret < 1 ) return false; @@ -2755,7 +2792,7 @@ bool ZONE_CONTAINER::Save( FILE* aFile ) const break; } - ret = fprintf( aFile, "ZAux %d %c\n", corners_count, outline_hatch ); + ret = fprintf( m_fp, "ZAux %d %c\n", corners_count, outline_hatch ); if( ret < 2 ) return false; @@ -2777,17 +2814,17 @@ bool ZONE_CONTAINER::Save( FILE* aFile ) const break; } - ret = fprintf( aFile, "ZClearance %d %c\n", m_ZoneClearance, padoption ); + ret = fprintf( m_fp, "ZClearance %d %c\n", m_ZoneClearance, padoption ); if( ret < 2 ) return false; - ret = fprintf( aFile, "ZMinThickness %d\n", m_ZoneMinThickness ); + ret = fprintf( m_fp, "ZMinThickness %d\n", m_ZoneMinThickness ); if( ret < 1 ) return false; - ret = fprintf( aFile, + ret = fprintf( m_fp, "ZOptions %d %d %c %d %d\n", m_FillMode, m_ArcToSegmentsCount, @@ -2798,7 +2835,7 @@ bool ZONE_CONTAINER::Save( FILE* aFile ) const if( ret < 3 ) return false; - ret = fprintf( aFile, + ret = fprintf( m_fp, "ZSmoothing %d %d\n", cornerSmoothingType, cornerRadius ); @@ -2808,7 +2845,7 @@ bool ZONE_CONTAINER::Save( FILE* aFile ) const // Save the corner list for( item_pos = 0; item_pos < corners_count; item_pos++ ) { - ret = fprintf( aFile, "ZCorner %d %d %d\n", + ret = fprintf( m_fp, "ZCorner %d %d %d\n", m_Poly->corner[item_pos].x, m_Poly->corner[item_pos].y, m_Poly->corner[item_pos].end_contour ); @@ -2819,12 +2856,12 @@ bool ZONE_CONTAINER::Save( FILE* aFile ) const // Save the PolysList if( m_FilledPolysList.size() ) { - fprintf( aFile, "$POLYSCORNERS\n" ); + fprintf( m_fp, "$POLYSCORNERS\n" ); for( unsigned ii = 0; ii < m_FilledPolysList.size(); ii++ ) { const CPolyPt* corner = &m_FilledPolysList[ii]; - ret = fprintf( aFile, + ret = fprintf( m_fp, "%d %d %d %d\n", corner->x, corner->y, @@ -2835,17 +2872,17 @@ bool ZONE_CONTAINER::Save( FILE* aFile ) const return false; } - fprintf( aFile, "$endPOLYSCORNERS\n" ); + fprintf( m_fp, "$endPOLYSCORNERS\n" ); } // Save the filling segments list if( m_FillSegmList.size() ) { - fprintf( aFile, "$FILLSEGMENTS\n" ); + fprintf( m_fp, "$FILLSEGMENTS\n" ); for( unsigned ii = 0; ii < m_FillSegmList.size(); ii++ ) { - ret = fprintf( aFile, "%d %d %d %d\n", + ret = fprintf( m_fp, "%d %d %d %d\n", m_FillSegmList[ii].m_Start.x, m_FillSegmList[ii].m_Start.y, m_FillSegmList[ii].m_End.x, m_FillSegmList[ii].m_End.y ); @@ -2853,74 +2890,21 @@ bool ZONE_CONTAINER::Save( FILE* aFile ) const return false; } - fprintf( aFile, "$endFILLSEGMENTS\n" ); + fprintf( m_fp, "$endFILLSEGMENTS\n" ); } - fprintf( aFile, "$endCZONE_OUTLINE\n" ); + fprintf( m_fp, "$endCZONE_OUTLINE\n" ); return true; } -bool NETCLASSES::Save( FILE* aFile ) const -{ - bool result; - - // save the default first. - result = m_Default.Save( aFile ); - - if( result ) - { - // the rest will be alphabetical in the *.brd file. - for( const_iterator i = begin(); i!=end(); ++i ) - { - NETCLASS* netclass = i->second; - - result = netclass->Save( aFile ); - if( !result ) - break; - } - } - - return result; -} - - -bool NETCLASS::Save( FILE* aFile ) const -{ - bool result = true; - - fprintf( aFile, "$NCLASS\n" ); - fprintf( aFile, "Name %s\n", EscapedUTF8( m_Name ).c_str() ); - fprintf( aFile, "Desc %s\n", EscapedUTF8( GetDescription() ).c_str() ); - - // Write parameters - - fprintf( aFile, "Clearance %d\n", GetClearance() ); - fprintf( aFile, "TrackWidth %d\n", GetTrackWidth() ); - - fprintf( aFile, "ViaDia %d\n", GetViaDiameter() ); - fprintf( aFile, "ViaDrill %d\n", GetViaDrill() ); - - fprintf( aFile, "uViaDia %d\n", GetuViaDiameter() ); - fprintf( aFile, "uViaDrill %d\n", GetuViaDrill() ); - - // Write members: - for( const_iterator i = begin(); i!=end(); ++i ) - fprintf( aFile, "AddNet %s\n", EscapedUTF8( *i ).c_str() ); - - fprintf( aFile, "$EndNCLASS\n" ); - - return result; -} - - -bool TEXTE_PCB::Save( FILE* aFile ) const +bool TEXTE_PCB::Save( FILE* m_fp ) const { if( m_Text.IsEmpty() ) return true; - if( fprintf( aFile, "$TEXTPCB\n" ) != sizeof("$TEXTPCB\n") - 1 ) + if( fprintf( m_fp, "$TEXTPCB\n" ) != sizeof("$TEXTPCB\n") - 1 ) return false; const char* style = m_Italic ? "Italic" : "Normal"; @@ -2932,14 +2916,14 @@ bool TEXTE_PCB::Save( FILE* aFile ) const wxString txt = list->Item( ii ); if ( ii == 0 ) - fprintf( aFile, "Te %s\n", EscapedUTF8( txt ).c_str() ); + fprintf( m_fp, "Te %s\n", EscapedUTF8( txt ).c_str() ); else - fprintf( aFile, "nl %s\n", EscapedUTF8( txt ).c_str() ); + fprintf( m_fp, "nl %s\n", EscapedUTF8( txt ).c_str() ); } delete list; - fprintf( aFile, "Po %d %d %d %d %d %d\n", + fprintf( m_fp, "Po %d %d %d %d %d %d\n", m_Pos.x, m_Pos.y, m_Size.x, m_Size.y, m_Thickness, m_Orient ); char hJustify = 'L'; @@ -2959,11 +2943,11 @@ bool TEXTE_PCB::Save( FILE* aFile ) const break; } - fprintf( aFile, "De %d %d %lX %s %c\n", m_Layer, + fprintf( m_fp, "De %d %d %lX %s %c\n", m_Layer, m_Mirror ? 0 : 1, m_TimeStamp, style, hJustify ); - if( fprintf( aFile, "$EndTEXTPCB\n" ) != sizeof("$EndTEXTPCB\n") - 1 ) + if( fprintf( m_fp, "$EndTEXTPCB\n" ) != sizeof("$EndTEXTPCB\n") - 1 ) return false; return true; @@ -2973,10 +2957,10 @@ bool TEXTE_PCB::Save( FILE* aFile ) const /** * Function Save * writes the data structures for this object out to a FILE in "*.brd" format. - * @param aFile The FILE to write to. + * @param m_fp The FILE to write to. * @return bool - true if success writing else false. */ -bool TEXTE_MODULE::Save( FILE* aFile ) const +bool TEXTE_MODULE::Save( FILE* m_fp ) const { MODULE* parent = (MODULE*) GetParent(); int orient = m_Orient; @@ -2986,7 +2970,7 @@ bool TEXTE_MODULE::Save( FILE* aFile ) const if( parent ) orient += parent->m_Orient; - int ret = fprintf( aFile, "T%d %d %d %d %d %d %d %c %c %d %c %s\n", + int ret = fprintf( m_fp, "T%d %d %d %d %d %d %d %c %c %d %c %s\n", m_Type, m_Pos0.x, m_Pos0.y, m_Size.y, m_Size.x, @@ -3002,28 +2986,28 @@ bool TEXTE_MODULE::Save( FILE* aFile ) const } -bool EDGE_MODULE::Save( FILE* aFile ) const +bool EDGE_MODULE::Save( FILE* m_fp ) const { int ret = -1; switch( m_Shape ) { case S_SEGMENT: - ret = fprintf( aFile, "DS %d %d %d %d %d %d\n", + ret = fprintf( m_fp, "DS %d %d %d %d %d %d\n", m_Start0.x, m_Start0.y, m_End0.x, m_End0.y, m_Width, m_Layer ); break; case S_CIRCLE: - ret = fprintf( aFile, "DC %d %d %d %d %d %d\n", + ret = fprintf( m_fp, "DC %d %d %d %d %d %d\n", m_Start0.x, m_Start0.y, m_End0.x, m_End0.y, m_Width, m_Layer ); break; case S_ARC: - ret = fprintf( aFile, "DA %d %d %d %d %d %d %d\n", + ret = fprintf( m_fp, "DA %d %d %d %d %d %d %d\n", m_Start0.x, m_Start0.y, m_End0.x, m_End0.y, m_Angle, @@ -3031,14 +3015,14 @@ bool EDGE_MODULE::Save( FILE* aFile ) const break; case S_POLYGON: - ret = fprintf( aFile, "DP %d %d %d %d %d %d %d\n", + ret = fprintf( m_fp, "DP %d %d %d %d %d %d %d\n", m_Start0.x, m_Start0.y, m_End0.x, m_End0.y, (int) m_PolyPoints.size(), m_Width, m_Layer ); for( unsigned i = 0; im_Text.IsEmpty() ) - fprintf( aFile, "Te %s\n", EscapedUTF8( m_Text->m_Text ).c_str() ); + fprintf( m_fp, "Te %s\n", EscapedUTF8( m_Text->m_Text ).c_str() ); else - fprintf( aFile, "Te \"?\"\n" ); + fprintf( m_fp, "Te \"?\"\n" ); - fprintf( aFile, "Po %d %d %d %d %d %d %d\n", + fprintf( m_fp, "Po %d %d %d %d %d %d %d\n", m_Text->m_Pos.x, m_Text->m_Pos.y, m_Text->m_Size.x, m_Text->m_Size.y, m_Text->GetThickness(), m_Text->GetOrientation(), m_Text->m_Mirror ? 0 : 1 ); - fprintf( aFile, "Sb %d %d %d %d %d %d\n", S_SEGMENT, + fprintf( m_fp, "Sb %d %d %d %d %d %d\n", S_SEGMENT, m_crossBarOx, m_crossBarOy, m_crossBarFx, m_crossBarFy, m_Width ); - fprintf( aFile, "Sd %d %d %d %d %d %d\n", S_SEGMENT, + fprintf( m_fp, "Sd %d %d %d %d %d %d\n", S_SEGMENT, m_featureLineDOx, m_featureLineDOy, m_featureLineDFx, m_featureLineDFy, m_Width ); - fprintf( aFile, "Sg %d %d %d %d %d %d\n", S_SEGMENT, + fprintf( m_fp, "Sg %d %d %d %d %d %d\n", S_SEGMENT, m_featureLineGOx, m_featureLineGOy, m_featureLineGFx, m_featureLineGFy, m_Width ); - fprintf( aFile, "S1 %d %d %d %d %d %d\n", S_SEGMENT, + fprintf( m_fp, "S1 %d %d %d %d %d %d\n", S_SEGMENT, m_arrowD1Ox, m_arrowD1Oy, m_arrowD1Fx, m_arrowD1Fy, m_Width ); - fprintf( aFile, "S2 %d %d %d %d %d %d\n", S_SEGMENT, + fprintf( m_fp, "S2 %d %d %d %d %d %d\n", S_SEGMENT, m_arrowD2Ox, m_arrowD2Oy, m_arrowD2Fx, m_arrowD2Fy, m_Width ); - fprintf( aFile, "S3 %d %d %d %d %d %d\n", S_SEGMENT, + fprintf( m_fp, "S3 %d %d %d %d %d %d\n", S_SEGMENT, m_arrowG1Ox, m_arrowG1Oy, m_arrowG1Fx, m_arrowG1Fy, m_Width ); - fprintf( aFile, "S4 %d %d %d %d %d %d\n", S_SEGMENT, + fprintf( m_fp, "S4 %d %d %d %d %d %d\n", S_SEGMENT, m_arrowG2Ox, m_arrowG2Oy, m_arrowG2Fx, m_arrowG2Fy, m_Width ); - if( fputs( keyWordLineEnd, aFile ) == EOF ) + if( fputs( keyWordLineEnd, m_fp ) == EOF ) goto out; rc = true; @@ -3139,13 +3123,13 @@ out: } -bool D_PAD::Save( FILE* aFile ) const +bool D_PAD::Save( FILE* m_fp ) const { int cshape; const char* texttype; // check the return values for first and last fprints() in this function - if( fprintf( aFile, "$PAD\n" ) != sizeof("$PAD\n") - 1 ) + if( fprintf( m_fp, "$PAD\n" ) != sizeof("$PAD\n") - 1 ) return false; switch( m_PadShape ) @@ -3168,18 +3152,18 @@ bool D_PAD::Save( FILE* aFile ) const break; } - fprintf( aFile, "Sh \"%.4s\" %c %d %d %d %d %d\n", + fprintf( m_fp, "Sh \"%.4s\" %c %d %d %d %d %d\n", m_Padname, cshape, m_Size.x, m_Size.y, m_DeltaSize.x, m_DeltaSize.y, m_Orient ); - fprintf( aFile, "Dr %d %d %d", m_Drill.x, m_Offset.x, m_Offset.y ); + fprintf( m_fp, "Dr %d %d %d", m_Drill.x, m_Offset.x, m_Offset.y ); if( m_DrillShape == PAD_OVAL ) { - fprintf( aFile, " %c %d %d", 'O', m_Drill.x, m_Drill.y ); + fprintf( m_fp, " %c %d %d", 'O', m_Drill.x, m_Drill.y ); } - fprintf( aFile, "\n" ); + fprintf( m_fp, "\n" ); switch( m_Attribut ) { @@ -3201,42 +3185,42 @@ bool D_PAD::Save( FILE* aFile ) const break; } - fprintf( aFile, "At %s N %8.8X\n", texttype, m_layerMask ); + fprintf( m_fp, "At %s N %8.8X\n", texttype, m_layerMask ); - fprintf( aFile, "Ne %d %s\n", GetNet(), EscapedUTF8( m_Netname ).c_str() ); + fprintf( m_fp, "Ne %d %s\n", GetNet(), EscapedUTF8( m_Netname ).c_str() ); - fprintf( aFile, "Po %d %d\n", m_Pos0.x, m_Pos0.y ); + fprintf( m_fp, "Po %d %d\n", m_Pos0.x, m_Pos0.y ); if( m_LengthDie != 0 ) - fprintf( aFile, "Le %d\n", m_LengthDie ); + fprintf( m_fp, "Le %d\n", m_LengthDie ); if( m_LocalSolderMaskMargin != 0 ) - fprintf( aFile, ".SolderMask %d\n", m_LocalSolderMaskMargin ); + fprintf( m_fp, ".SolderMask %d\n", m_LocalSolderMaskMargin ); if( m_LocalSolderPasteMargin != 0 ) - fprintf( aFile, ".SolderPaste %d\n", m_LocalSolderPasteMargin ); + fprintf( m_fp, ".SolderPaste %d\n", m_LocalSolderPasteMargin ); if( m_LocalSolderPasteMarginRatio != 0 ) - fprintf( aFile, ".SolderPasteRatio %g\n", m_LocalSolderPasteMarginRatio ); + fprintf( m_fp, ".SolderPasteRatio %g\n", m_LocalSolderPasteMarginRatio ); if( m_LocalClearance != 0 ) - fprintf( aFile, ".LocalClearance %d\n", m_LocalClearance ); + fprintf( m_fp, ".LocalClearance %d\n", m_LocalClearance ); - if( fprintf( aFile, "$EndPAD\n" ) != sizeof("$EndPAD\n") - 1 ) + if( fprintf( m_fp, "$EndPAD\n" ) != sizeof("$EndPAD\n") - 1 ) return false; return true; } -bool MODULE::Save( FILE* aFile ) const +bool MODULE::Save( FILE* m_fp ) const { char statusTxt[8]; BOARD_ITEM* item; bool rc = false; - fprintf( aFile, "$MODULE %s\n", TO_UTF8( m_LibRef ) ); + fprintf( m_fp, "$MODULE %s\n", TO_UTF8( m_LibRef ) ); memset( statusTxt, 0, sizeof(statusTxt) ); if( IsLocked() ) @@ -3249,59 +3233,59 @@ bool MODULE::Save( FILE* aFile ) const else statusTxt[1] = '~'; - fprintf( aFile, "Po %d %d %d %d %8.8lX %8.8lX %s\n", + fprintf( m_fp, "Po %d %d %d %d %8.8lX %8.8lX %s\n", m_Pos.x, m_Pos.y, m_Orient, m_Layer, m_LastEdit_Time, m_TimeStamp, statusTxt ); - fprintf( aFile, "Li %s\n", TO_UTF8( m_LibRef ) ); + fprintf( m_fp, "Li %s\n", TO_UTF8( m_LibRef ) ); if( !m_Doc.IsEmpty() ) { - fprintf( aFile, "Cd %s\n", TO_UTF8( m_Doc ) ); + fprintf( m_fp, "Cd %s\n", TO_UTF8( m_Doc ) ); } if( !m_KeyWord.IsEmpty() ) { - fprintf( aFile, "Kw %s\n", TO_UTF8( m_KeyWord ) ); + fprintf( m_fp, "Kw %s\n", TO_UTF8( m_KeyWord ) ); } - fprintf( aFile, "Sc %8.8lX\n", m_TimeStamp ); - fprintf( aFile, "AR %s\n", TO_UTF8( m_Path ) ); - fprintf( aFile, "Op %X %X 0\n", m_CntRot90, m_CntRot180 ); + fprintf( m_fp, "Sc %8.8lX\n", m_TimeStamp ); + fprintf( m_fp, "AR %s\n", TO_UTF8( m_Path ) ); + fprintf( m_fp, "Op %X %X 0\n", m_CntRot90, m_CntRot180 ); if( m_LocalSolderMaskMargin != 0 ) - fprintf( aFile, ".SolderMask %d\n", m_LocalSolderMaskMargin ); + fprintf( m_fp, ".SolderMask %d\n", m_LocalSolderMaskMargin ); if( m_LocalSolderPasteMargin != 0 ) - fprintf( aFile, ".SolderPaste %d\n", m_LocalSolderPasteMargin ); + fprintf( m_fp, ".SolderPaste %d\n", m_LocalSolderPasteMargin ); if( m_LocalSolderPasteMarginRatio != 0 ) - fprintf( aFile, ".SolderPasteRatio %g\n", m_LocalSolderPasteMarginRatio ); + fprintf( m_fp, ".SolderPasteRatio %g\n", m_LocalSolderPasteMarginRatio ); if( m_LocalClearance != 0 ) - fprintf( aFile, ".LocalClearance %d\n", m_LocalClearance ); + fprintf( m_fp, ".LocalClearance %d\n", m_LocalClearance ); // attributes if( m_Attributs != MOD_DEFAULT ) { - fprintf( aFile, "At " ); + fprintf( m_fp, "At " ); if( m_Attributs & MOD_CMS ) - fprintf( aFile, "SMD " ); + fprintf( m_fp, "SMD " ); if( m_Attributs & MOD_VIRTUAL ) - fprintf( aFile, "VIRTUAL " ); + fprintf( m_fp, "VIRTUAL " ); - fprintf( aFile, "\n" ); + fprintf( m_fp, "\n" ); } // save reference - if( !m_Reference->Save( aFile ) ) + if( !m_Reference->Save( m_fp ) ) goto out; // save value - if( !m_Value->Save( aFile ) ) + if( !m_Value->Save( m_fp ) ) goto out; // save drawing elements @@ -3311,7 +3295,7 @@ bool MODULE::Save( FILE* aFile ) const { case PCB_MODULE_TEXT_T: case PCB_MODULE_EDGE_T: - if( !item->Save( aFile ) ) + if( !item->Save( m_fp ) ) goto out; break; @@ -3326,12 +3310,12 @@ bool MODULE::Save( FILE* aFile ) const // save the pads for( item = m_Pads; item; item = item->Next() ) - if( !item->Save( aFile ) ) + if( !item->Save( m_fp ) ) goto out; - Write_3D_Descr( aFile ); + Write_3D_Descr( m_fp ); - fprintf( aFile, "$EndMODULE %s\n", TO_UTF8( m_LibRef ) ); + fprintf( m_fp, "$EndMODULE %s\n", TO_UTF8( m_LibRef ) ); rc = true; out: diff --git a/pcbnew/kicad_plugin.h b/pcbnew/kicad_plugin.h index 18ef91e49f..50f8dd4947 100644 --- a/pcbnew/kicad_plugin.h +++ b/pcbnew/kicad_plugin.h @@ -40,6 +40,9 @@ class ZONE_CONTAINER; class DIMENSION; class NETINFO_ITEM; class TEXTE_MODULE; +class EDGE_MODULE; +class TRACK; +class SEGZONE; /** @@ -73,6 +76,7 @@ protected: LINE_READER* m_reader; ///< no ownership here. FILE* m_fp; ///< no ownership here. + wxString m_filename; ///< for saves only, name is in m_reader for loads wxString m_field; ///< reused to stuff MODULE fields. @@ -88,9 +92,6 @@ protected: double biuToDisk; ///< convert from BIUs to disk engineering units with this scale factor double diskToBiu; ///< convert from disk engineering units to BIUs with this scale factor - /// convert a BIU to engineering units by scaling and formatting to ASCII. - std::string biuFmt( BIU aValue ); - /** * Function biuParse * parses an ASCII decimal floating point value and scales it into a BIU @@ -133,12 +134,12 @@ protected: void loadMODULE(); void load3D( MODULE* aModule ); void loadPAD( MODULE* aModule ); - void loadTEXTE_MODULE( TEXTE_MODULE* aText ); + void loadMODULE_TEXT( TEXTE_MODULE* aText ); void loadEDGE_MODULE( MODULE* aModule ); void loadDRAWSEGMENT(); void loadNETINFO_ITEM(); - void loadPCB_TEXTE(); + void loadPCB_TEXT(); void loadNETCLASS(); /** @@ -158,6 +159,50 @@ protected: void loadPCB_TARGET(); // "$PCB_TARGET" //-------------------------------------------------- + + + //---------------------------------------------------------- + + /** + * Function checkWriteError + * checks to see if there is an error on the output FILE, and its ability to + * continue saving to disk. + */ + void checkWriteError( const char* aCaller ) const; + + /// convert a BIU to engineering units by scaling and formatting to ASCII. + std::string biuFmt( BIU aValue ); + + void saveAllSections() const; + void saveGENERAL() const; + void saveSHEET() const; + void saveSETUP() const; + void saveBOARD() const; + void saveMODULE( const MODULE* aModule ) const; + void saveNETINFO_ITEM( const NETINFO_ITEM* aNet ) const; + void saveNETCLASSES() const; + void saveNETCLASS( const NETCLASS* aNetclass ) const; + + void savePCB_TEXT( const TEXTE_PCB* aText ) const; + void saveEDGE_MODULE( const EDGE_MODULE* aEdge ) const; + void saveTARGET( const PCB_TARGET* aTarget ) const; + void saveDIMENTION( const DIMENSION* aDimension ) const; + void saveTRACK( const TRACK* aTrack ) const; + + /** + * Function saveSEGZONE + * saves the oldschool zones, now outdated in favor of polygon zones. + */ + void saveSEGZONE( const SEGZONE* aZone ) const; + + /** + * Function saveZONE_CONTAINER + * saves the new polygon zones. + */ + void saveZONE_CONTAINER( const ZONE_CONTAINER* aZone ) const; + + //--------------------------------------------------------- + }; #endif // KICAD_PLUGIN_H_ diff --git a/pcbnew/librairi.cpp b/pcbnew/librairi.cpp index 96110b223e..a31aa652e3 100644 --- a/pcbnew/librairi.cpp +++ b/pcbnew/librairi.cpp @@ -134,7 +134,7 @@ MODULE* FOOTPRINT_EDIT_FRAME::Import_Module() module->DisplayInfo( this ); PlaceModule( module, NULL ); GetBoard()->m_Status_Pcb = 0; - GetBoard()->m_NetInfo->BuildListOfNets(); + GetBoard()->BuildListOfNets(); return module; } diff --git a/pcbnew/loadcmp.cpp b/pcbnew/loadcmp.cpp index 9ba14b7f1d..2332101d7f 100644 --- a/pcbnew/loadcmp.cpp +++ b/pcbnew/loadcmp.cpp @@ -86,7 +86,7 @@ bool FOOTPRINT_EDIT_FRAME::Load_Module_From_BOARD( MODULE* aModule ) aModule->m_Flags = 0; - GetBoard()->m_NetInfo->BuildListOfNets(); + GetBoard()->BuildListOfNets(); GetScreen()->SetCrossHairPosition( wxPoint( 0, 0 ) ); PlaceModule( aModule, NULL ); @@ -196,7 +196,7 @@ MODULE* PCB_BASE_FRAME::Load_Module_From_Library( const wxString& library, wxDC* */ -// GetBoard()->m_Pcb->m_NetInfo->BuildListOfNets(); +// GetBoard()->m_Pcb->m_NetInfo.BuildListOfNets(); RecalculateAllTracksNetcode(); if( DC ) diff --git a/pcbnew/modedit.cpp b/pcbnew/modedit.cpp index 49a4eede85..dda8090b4c 100644 --- a/pcbnew/modedit.cpp +++ b/pcbnew/modedit.cpp @@ -242,7 +242,7 @@ void FOOTPRINT_EDIT_FRAME::Process_Special_Functions( wxCommandEvent& event ) // Initialize data relative to nets and netclasses (for a new // module the defaults are used) // This is mandatory to handle and draw pads - GetBoard()->m_NetInfo->BuildListOfNets(); + GetBoard()->BuildListOfNets(); redraw = true; module->SetPosition( wxPoint( 0, 0 ) ); diff --git a/pcbnew/modules.cpp b/pcbnew/modules.cpp index 8835df3c0e..f29f6591f1 100644 --- a/pcbnew/modules.cpp +++ b/pcbnew/modules.cpp @@ -170,7 +170,7 @@ void Abort_MoveOrCopyModule( EDA_DRAW_PANEL* Panel, wxDC* DC ) module->DeleteStructure(); module = NULL; pcbframe->GetBoard()->m_Status_Pcb = 0; - pcbframe->GetBoard()->m_NetInfo->BuildListOfNets(); + pcbframe->GetBoard()->BuildListOfNets(); } } diff --git a/pcbnew/ratsnest.cpp b/pcbnew/ratsnest.cpp index 39ddd4446b..0a5391f687 100644 --- a/pcbnew/ratsnest.cpp +++ b/pcbnew/ratsnest.cpp @@ -135,7 +135,7 @@ void PCB_BASE_FRAME::Compile_Ratsnest( wxDC* aDC, bool aDisplayStatus ) { wxString msg; - GetBoard()->m_Status_Pcb = 0; /* we want a full ratsnest computation, from the scratch */ + GetBoard()->m_Status_Pcb = 0; // we want a full ratsnest computation, from the scratch ClearMsgPanel(); // Rebuild the full pads and net info list @@ -143,9 +143,9 @@ void PCB_BASE_FRAME::Compile_Ratsnest( wxDC* aDC, bool aDisplayStatus ) if( aDisplayStatus ) { - msg.Printf( wxT( " %d" ), m_Pcb->GetPadsCount() ); + msg.Printf( wxT( " %d" ), m_Pcb->GetPadCount() ); AppendMsgPanel( wxT( "Pads" ), msg, RED ); - msg.Printf( wxT( " %d" ), m_Pcb->m_NetInfo->GetCount() ); + msg.Printf( wxT( " %d" ), m_Pcb->GetNetCount() ); AppendMsgPanel( wxT( "Nets" ), msg, CYAN ); } @@ -158,7 +158,7 @@ void PCB_BASE_FRAME::Compile_Ratsnest( wxDC* aDC, bool aDisplayStatus ) */ Build_Board_Ratsnest(); - /* Compute the pad connections due to the existing tracks (physical connections) */ + // Compute the pad connections due to the existing tracks (physical connections) TestConnections(); /* Compute the active ratsnest, i.e. the unconnected links @@ -206,16 +206,16 @@ void PCB_BASE_FRAME::Build_Board_Ratsnest() m_Pcb->m_FullRatsnest.clear(); - if( m_Pcb->GetPadsCount() == 0 ) + if( m_Pcb->GetPadCount() == 0 ) return; /* Created pad list and the net_codes if needed */ if( (m_Pcb->m_Status_Pcb & NET_CODES_OK) == 0 ) - m_Pcb->m_NetInfo->BuildListOfNets(); + m_Pcb->BuildListOfNets(); - for( unsigned ii = 0; iiGetPadsCount(); ++ii ) + for( unsigned ii = 0; iiGetPadCount(); ++ii ) { - pad = m_Pcb->m_NetInfo->GetPad( ii ); + pad = m_Pcb->GetPad( ii ); pad->SetSubRatsnest( 0 ); } @@ -227,7 +227,7 @@ void PCB_BASE_FRAME::Build_Board_Ratsnest() // (net_code = 0 -> no connect) noconn = 0; MIN_SPAN_TREE_PADS min_spanning_tree; - for( ; current_net_code < m_Pcb->m_NetInfo->GetCount(); current_net_code++ ) + for( ; current_net_code < m_Pcb->GetNetCount(); current_net_code++ ) { NETINFO_ITEM* net = m_Pcb->FindNet( current_net_code ); @@ -439,13 +439,13 @@ void PCB_BASE_FRAME::TestForActiveLinksInRatsnest( int aNetCode ) D_PAD* pad; NETINFO_ITEM* net; - if( m_Pcb->GetPadsCount() == 0 ) + if( m_Pcb->GetPadCount() == 0 ) return; if( (m_Pcb->m_Status_Pcb & LISTE_RATSNEST_ITEM_OK) == 0 ) Build_Board_Ratsnest(); - for( int net_code = 1; net_code < (int) m_Pcb->m_NetInfo->GetCount(); net_code++ ) + for( int net_code = 1; net_code < (int) m_Pcb->GetNetCount(); net_code++ ) { net = m_Pcb->FindNet( net_code ); @@ -514,7 +514,7 @@ void PCB_BASE_FRAME::build_ratsnest_module( MODULE* aModule ) if( (GetBoard()->m_Status_Pcb & LISTE_PAD_OK) == 0 ) { GetBoard()->m_Status_Pcb = 0; - GetBoard()->m_NetInfo->BuildListOfNets(); + GetBoard()->BuildListOfNets(); } /* Compute the "local" ratsnest if needed (when this footprint starts move) diff --git a/pcbnew/solve.cpp b/pcbnew/solve.cpp index 47221d958e..7e4e68db4d 100644 --- a/pcbnew/solve.cpp +++ b/pcbnew/solve.cpp @@ -508,12 +508,11 @@ static int Autoroute_One_Track( PCB_EDIT_FRAME* pcbframe, /* Regenerates the remaining barriers (which may encroach on the placement bits precedent) */ - i = pcbframe->GetBoard()->GetPadsCount(); + i = pcbframe->GetBoard()->GetPadCount(); - for( unsigned ii = 0; ii < pcbframe->GetBoard()->GetPadsCount(); ii++ ) + for( unsigned ii = 0; ii < pcbframe->GetBoard()->GetPadCount(); ii++ ) { - - D_PAD* ptr = pcbframe->GetBoard()->m_NetInfo->GetPad( ii ); + D_PAD* ptr = pcbframe->GetBoard()->GetPad( ii ); if( ( pt_cur_ch->m_PadStart != ptr ) && ( pt_cur_ch->m_PadEnd != ptr ) ) { diff --git a/pcbnew/specctra_export.cpp b/pcbnew/specctra_export.cpp index 27f21998c0..c4c7a41c75 100644 --- a/pcbnew/specctra_export.cpp +++ b/pcbnew/specctra_export.cpp @@ -1172,7 +1172,7 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR ) std::string componentId; // find the highest numbered netCode within the board. - int highestNetCode = aBoard->m_NetInfo->GetCount() - 1; + int highestNetCode = aBoard->GetNetCount() - 1; deleteNETs(); // expand the net vector to highestNetCode+1, setting empty to NULL @@ -1182,9 +1182,9 @@ void SPECCTRA_DB::FromBOARD( BOARD* aBoard ) throw( IO_ERROR ) for( unsigned i=1; inetwork ); - for( unsigned ii = 0; ii < aBoard->m_NetInfo->GetCount(); ii++ ) + for( unsigned ii = 0; ii < aBoard->GetNetCount(); ii++ ) { - NETINFO_ITEM* net = aBoard->m_NetInfo->GetNetItem(ii); + NETINFO_ITEM* net = aBoard->FindNet(ii); int netcode = net->GetNet(); if( netcode > 0 ) nets[ netcode ]->net_id = TO_UTF8( net->GetNetname() );