2012-06-08 09:56:42 +00:00
|
|
|
/*
|
|
|
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2012 Jean-Pierre Charras, jean-pierre.charras@ujf-grenoble.fr
|
|
|
|
* Copyright (C) 2012 SoftPLC Corporation, Dick Hollenbeck <dick@softplc.com>
|
|
|
|
* Copyright (C) 1992-2012 KiCad Developers, see AUTHORS.txt for contributors.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, you may find one here:
|
|
|
|
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
|
|
* or you may search the http://www.gnu.org website for the version 2 license,
|
|
|
|
* or you may write to the Free Software Foundation, Inc.,
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
|
|
|
|
*/
|
|
|
|
|
Removed D_PAD::SetNetname() function and D_PAD::m_Netname, D_PAD::m_ShortNetname fields.
D_PAD::GetNetname() and D_PAD::GetShortNetname() were moved to BOARD_CONNECTED_ITEM. Now they use the net name stored in NETINFO_ITEM.
Moved some one-line functions from class_board_connected_item.cpp to class_board_connected_item.h.
Added a copyright notice, moved Doxygen comments from class_board_connected_item.cpp to class_board_connected_item.h.
I have some doubts if changes introduced pcbnew/dialogs/dialog_pad_properties.cpp do not break anything, but I could not find a test case that breaks the pcbnew.
Performed tests:
- changed pad's net name from empty to existent - ok, name was changed
- changed pad's net name from empty to nonexistent - ok, error message is displayed, net name stays empty
- changed pad's net name from existent to empty - ok, net name became empty
- changed pad's net name from existent to nonexistent - ok, error message is displayed, net name is not changed
- (re)reading netlists, including net changes - fine, changes are applied, but empty nets are still kept
- loaded pcbnew/pcad2kicadpcb_plugin/examples/CK1202_V1.pcb to test P-CAD import plugin - ok, net names are correct
- imported an Eagle 6.0 board (Arduino Uno; http://arduino.cc/en/uploads/Main/arduino_Uno_Rev3-02-TH.zip) then saved in .kicad_pcb format and reloaded - ok, net names are correct
- saved demos/video/video.kicad_pcb in legacy format and then loaded it again - ok, net names are correct
2014-01-14 09:41:52 +00:00
|
|
|
/**
|
|
|
|
* @file class_board_connected_item.cpp
|
|
|
|
* @brief BOARD_CONNECTED_ITEM class functions.
|
|
|
|
*/
|
|
|
|
|
2012-01-23 04:33:36 +00:00
|
|
|
#include <fctsys.h>
|
|
|
|
#include <pcbnew.h>
|
2008-11-18 18:13:55 +00:00
|
|
|
|
2012-01-23 04:33:36 +00:00
|
|
|
#include <class_board.h>
|
|
|
|
#include <class_board_item.h>
|
2011-09-23 13:57:12 +00:00
|
|
|
|
2008-12-04 04:28:11 +00:00
|
|
|
BOARD_CONNECTED_ITEM::BOARD_CONNECTED_ITEM( BOARD_ITEM* aParent, KICAD_T idtype ) :
|
2014-02-25 10:40:34 +00:00
|
|
|
BOARD_ITEM( aParent, idtype ), m_netinfo( &NETINFO_LIST::ORPHANED ),
|
|
|
|
m_Subnet( 0 ), m_ZoneSubnet( 0 )
|
2008-11-18 18:13:55 +00:00
|
|
|
{
|
2014-02-25 10:40:34 +00:00
|
|
|
// The unconnected net is set only in case the item belongs to a BOARD
|
|
|
|
SetNetCode( NETINFO_LIST::UNCONNECTED );
|
2008-11-18 18:13:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-01-14 19:50:32 +00:00
|
|
|
BOARD_CONNECTED_ITEM::BOARD_CONNECTED_ITEM( const BOARD_CONNECTED_ITEM& aItem ) :
|
2014-02-25 10:40:34 +00:00
|
|
|
BOARD_ITEM( aItem ), m_netinfo( aItem.m_netinfo ), m_Subnet( aItem.m_Subnet ),
|
|
|
|
m_ZoneSubnet( aItem.m_ZoneSubnet )
|
2008-11-18 18:13:55 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-02-25 10:40:34 +00:00
|
|
|
void BOARD_CONNECTED_ITEM::SetNetCode( int aNetCode )
|
2008-11-18 18:13:55 +00:00
|
|
|
{
|
Removed D_PAD::SetNetname() function and D_PAD::m_Netname, D_PAD::m_ShortNetname fields.
D_PAD::GetNetname() and D_PAD::GetShortNetname() were moved to BOARD_CONNECTED_ITEM. Now they use the net name stored in NETINFO_ITEM.
Moved some one-line functions from class_board_connected_item.cpp to class_board_connected_item.h.
Added a copyright notice, moved Doxygen comments from class_board_connected_item.cpp to class_board_connected_item.h.
I have some doubts if changes introduced pcbnew/dialogs/dialog_pad_properties.cpp do not break anything, but I could not find a test case that breaks the pcbnew.
Performed tests:
- changed pad's net name from empty to existent - ok, name was changed
- changed pad's net name from empty to nonexistent - ok, error message is displayed, net name stays empty
- changed pad's net name from existent to empty - ok, net name became empty
- changed pad's net name from existent to nonexistent - ok, error message is displayed, net name is not changed
- (re)reading netlists, including net changes - fine, changes are applied, but empty nets are still kept
- loaded pcbnew/pcad2kicadpcb_plugin/examples/CK1202_V1.pcb to test P-CAD import plugin - ok, net names are correct
- imported an Eagle 6.0 board (Arduino Uno; http://arduino.cc/en/uploads/Main/arduino_Uno_Rev3-02-TH.zip) then saved in .kicad_pcb format and reloaded - ok, net names are correct
- saved demos/video/video.kicad_pcb in legacy format and then loaded it again - ok, net names are correct
2014-01-14 09:41:52 +00:00
|
|
|
BOARD* board = GetBoard();
|
BOARD_CONNECTED_ITEMs do not store net code anymore (m_NetCode field), instead net info is stored using a pointer to NETINFO_ITEM.
GetNet() refers to the net code stored in the NETINFO_ITEM. SetNet() finds an appropriate NETINFO_ITEM and uses it.
Removing GetNet() & SetNet() (and the whole net code idea) requires too many changes in the code (~250 references to the mentioned functions).
BOARD_CONNECTED_ITEMs by default get a pointer to NETINFO_ITEM that stores unconnected items. This requires for all BOARD_CONNECTED_ITEMs to have a parent (so BOARD* is accessible). The only orphaned item is BOARD_DESIGN_SETTINGS::m_Pad_Master, but it does not cause any issues so far.
Items that do not have access to a BOARD (do not have set parents) and therefore cannot get net assigned, by default get const static NETINFO_LIST::ORPHANED.
Performed tests:
- loaded .kicad_pcb, KiCad legacy board, Eagle 6.0 board, P-CAD board - all ok
- load a simple project, reload netlist after changing connections in eeschema - ok
- save & reload a board - ok, but still contain empty nets
- remove everything, restore with undo - ok
- remove everything, reload netlist - ok
- changing net names (all possibilites: empty->existing, empty->not existing, existing->empty, existing->not existing) - all ok
- zones: when net is changed to a net that does not have any nodes besides the zone itself, it does not get filled
2014-01-15 17:03:06 +00:00
|
|
|
if( board )
|
|
|
|
{
|
|
|
|
m_netinfo = board->FindNet( aNetCode );
|
2008-11-18 18:13:55 +00:00
|
|
|
|
Added NETINFO_MAPPING, to ease saving nets with consecutive net codes (without modifying the net codes during the run time).
Now, nets are saved with consecutive net codes (both modern & legacy plugins).
Zones are saved together with their nets, without depending on the fact if there are any pads with such net. Therefore validation of zone net names was removed (pcbnew/class_board.cpp).
Performed tests:
- Changed a pad's net name from empty to existent - ok, name was changed.
- Changed a pad's net name from empty to nonexistent - ok, error message is displayed, net name stays empty.
- Changed a pad's net name from existent to empty - ok, net name became empty
- Changed a pad's net name from existent to nonexistent - ok, error message is displayed, net name is not changed.
- Drawn a zone that belongs to a net, then modified schematics so the net does not exist anymore. After reloading the net list, all pads/tracks are updated. Zones still belongs to the net that does not exist in the schematic (but still exists in .kicad_pcb file). After running DRC, the zone becomes not filled.
- Undo & redo affects assignment of a polygon to a specific net (you may change net of a polygon, refill it and undo/redo the changes).
- KiCad s-expr & legacy, Eagle, P-CAD boards seem to load without any problem (they also contain correct net names assigned to the appropriate pads). All types of board file formats were loaded, then saved in sexpr format and reopened with a KiCad built from the master branch (without my modifications).
- A few boards were also saved using the legacy format and were opened with the master KiCad without any issues.
- Change a net name for a pad, restore with undo/redo - ok
- Remove everything, restore with undo - ok
- Remove everything, reload netlist - ok
Differences observed between files saved by the master branch KiCad and this one:
- list of nets are not saved in any particular order, so net codes may differ
- the default net class does not contain the unconnected net
2014-01-28 09:19:51 +00:00
|
|
|
// The requested net does not exist, mark it as unconnected
|
BOARD_CONNECTED_ITEMs do not store net code anymore (m_NetCode field), instead net info is stored using a pointer to NETINFO_ITEM.
GetNet() refers to the net code stored in the NETINFO_ITEM. SetNet() finds an appropriate NETINFO_ITEM and uses it.
Removing GetNet() & SetNet() (and the whole net code idea) requires too many changes in the code (~250 references to the mentioned functions).
BOARD_CONNECTED_ITEMs by default get a pointer to NETINFO_ITEM that stores unconnected items. This requires for all BOARD_CONNECTED_ITEMs to have a parent (so BOARD* is accessible). The only orphaned item is BOARD_DESIGN_SETTINGS::m_Pad_Master, but it does not cause any issues so far.
Items that do not have access to a BOARD (do not have set parents) and therefore cannot get net assigned, by default get const static NETINFO_LIST::ORPHANED.
Performed tests:
- loaded .kicad_pcb, KiCad legacy board, Eagle 6.0 board, P-CAD board - all ok
- load a simple project, reload netlist after changing connections in eeschema - ok
- save & reload a board - ok, but still contain empty nets
- remove everything, restore with undo - ok
- remove everything, reload netlist - ok
- changing net names (all possibilites: empty->existing, empty->not existing, existing->empty, existing->not existing) - all ok
- zones: when net is changed to a net that does not have any nodes besides the zone itself, it does not get filled
2014-01-15 17:03:06 +00:00
|
|
|
if( m_netinfo == NULL )
|
|
|
|
m_netinfo = board->FindNet( NETINFO_LIST::UNCONNECTED );
|
|
|
|
}
|
Added NETINFO_MAPPING, to ease saving nets with consecutive net codes (without modifying the net codes during the run time).
Now, nets are saved with consecutive net codes (both modern & legacy plugins).
Zones are saved together with their nets, without depending on the fact if there are any pads with such net. Therefore validation of zone net names was removed (pcbnew/class_board.cpp).
Performed tests:
- Changed a pad's net name from empty to existent - ok, name was changed.
- Changed a pad's net name from empty to nonexistent - ok, error message is displayed, net name stays empty.
- Changed a pad's net name from existent to empty - ok, net name became empty
- Changed a pad's net name from existent to nonexistent - ok, error message is displayed, net name is not changed.
- Drawn a zone that belongs to a net, then modified schematics so the net does not exist anymore. After reloading the net list, all pads/tracks are updated. Zones still belongs to the net that does not exist in the schematic (but still exists in .kicad_pcb file). After running DRC, the zone becomes not filled.
- Undo & redo affects assignment of a polygon to a specific net (you may change net of a polygon, refill it and undo/redo the changes).
- KiCad s-expr & legacy, Eagle, P-CAD boards seem to load without any problem (they also contain correct net names assigned to the appropriate pads). All types of board file formats were loaded, then saved in sexpr format and reopened with a KiCad built from the master branch (without my modifications).
- A few boards were also saved using the legacy format and were opened with the master KiCad without any issues.
- Change a net name for a pad, restore with undo/redo - ok
- Remove everything, restore with undo - ok
- Remove everything, reload netlist - ok
Differences observed between files saved by the master branch KiCad and this one:
- list of nets are not saved in any particular order, so net codes may differ
- the default net class does not contain the unconnected net
2014-01-28 09:19:51 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
// There is no board that contains list of nets, the item is orphaned
|
|
|
|
m_netinfo = &NETINFO_LIST::ORPHANED;
|
|
|
|
}
|
2008-11-18 18:13:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-08-17 02:59:38 +00:00
|
|
|
int BOARD_CONNECTED_ITEM::GetClearance( BOARD_CONNECTED_ITEM* aItem ) const
|
|
|
|
{
|
2014-05-20 09:29:37 +00:00
|
|
|
NETCLASSPTR myclass = GetNetClass();
|
2009-08-17 02:59:38 +00:00
|
|
|
|
2009-09-19 16:15:40 +00:00
|
|
|
// DO NOT use wxASSERT, because GetClearance is called inside an OnPaint event
|
|
|
|
// and a call to wxASSERT can crash the application.
|
2009-08-17 02:59:38 +00:00
|
|
|
if( myclass )
|
|
|
|
{
|
2010-04-08 11:33:43 +00:00
|
|
|
int myClearance = myclass->GetClearance();
|
2009-09-10 15:22:26 +00:00
|
|
|
// @todo : after GetNetClass() is reliably not returning NULL, remove the
|
2010-04-08 11:33:43 +00:00
|
|
|
// tests for if( myclass )
|
2009-09-10 15:22:26 +00:00
|
|
|
|
|
|
|
if( aItem )
|
|
|
|
{
|
2010-04-08 11:33:43 +00:00
|
|
|
int hisClearance = aItem->GetClearance();
|
2012-08-03 15:43:15 +00:00
|
|
|
return std::max( hisClearance, myClearance );
|
2009-09-10 15:22:26 +00:00
|
|
|
}
|
|
|
|
|
2010-04-08 11:33:43 +00:00
|
|
|
return myClearance;
|
2009-08-17 02:59:38 +00:00
|
|
|
}
|
2009-09-19 16:15:40 +00:00
|
|
|
else
|
2009-09-23 05:53:12 +00:00
|
|
|
{
|
2014-04-04 18:43:12 +00:00
|
|
|
DBG(printf( "%s: NULL netclass,type %d", __func__, Type() );)
|
2009-09-23 05:53:12 +00:00
|
|
|
}
|
2009-08-17 02:59:38 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-05-20 09:29:37 +00:00
|
|
|
NETCLASSPTR BOARD_CONNECTED_ITEM::GetNetClass() const
|
2009-08-17 02:59:38 +00:00
|
|
|
{
|
|
|
|
// It is important that this be implemented without any sequential searching.
|
|
|
|
// Simple array lookups should be fine, performance-wise.
|
|
|
|
BOARD* board = GetBoard();
|
2011-12-14 04:29:25 +00:00
|
|
|
|
2009-09-19 16:15:40 +00:00
|
|
|
// DO NOT use wxASSERT, because GetNetClass is called inside an OnPaint event
|
|
|
|
// and a call to wxASSERT can crash the application.
|
2011-12-14 04:29:25 +00:00
|
|
|
|
|
|
|
if( board == NULL ) // Should not occur
|
2009-08-17 02:59:38 +00:00
|
|
|
{
|
2014-04-04 18:43:12 +00:00
|
|
|
DBG(printf( "%s: NULL board,type %d", __func__, Type() );)
|
2014-05-20 09:29:37 +00:00
|
|
|
|
|
|
|
return NETCLASSPTR();
|
2009-10-21 19:16:25 +00:00
|
|
|
}
|
|
|
|
|
2014-05-20 09:29:37 +00:00
|
|
|
NETCLASSPTR netclass;
|
2014-02-25 10:40:34 +00:00
|
|
|
NETINFO_ITEM* net = board->FindNet( GetNetCode() );
|
2011-12-14 04:29:25 +00:00
|
|
|
|
2009-10-21 19:16:25 +00:00
|
|
|
if( net )
|
|
|
|
{
|
|
|
|
netclass = net->GetNetClass();
|
2011-12-14 04:29:25 +00:00
|
|
|
|
2014-04-04 18:43:12 +00:00
|
|
|
//DBG( if(!netclass) printf( "%s: NULL netclass,type %d", __func__, Type() );)
|
2009-08-17 02:59:38 +00:00
|
|
|
}
|
|
|
|
|
2009-10-21 19:16:25 +00:00
|
|
|
if( netclass )
|
|
|
|
return netclass;
|
|
|
|
else
|
2014-05-15 08:51:08 +00:00
|
|
|
return board->GetDesignSettings().GetDefault();
|
2009-08-17 02:59:38 +00:00
|
|
|
}
|
2009-09-27 11:00:21 +00:00
|
|
|
|
Removed D_PAD::SetNetname() function and D_PAD::m_Netname, D_PAD::m_ShortNetname fields.
D_PAD::GetNetname() and D_PAD::GetShortNetname() were moved to BOARD_CONNECTED_ITEM. Now they use the net name stored in NETINFO_ITEM.
Moved some one-line functions from class_board_connected_item.cpp to class_board_connected_item.h.
Added a copyright notice, moved Doxygen comments from class_board_connected_item.cpp to class_board_connected_item.h.
I have some doubts if changes introduced pcbnew/dialogs/dialog_pad_properties.cpp do not break anything, but I could not find a test case that breaks the pcbnew.
Performed tests:
- changed pad's net name from empty to existent - ok, name was changed
- changed pad's net name from empty to nonexistent - ok, error message is displayed, net name stays empty
- changed pad's net name from existent to empty - ok, net name became empty
- changed pad's net name from existent to nonexistent - ok, error message is displayed, net name is not changed
- (re)reading netlists, including net changes - fine, changes are applied, but empty nets are still kept
- loaded pcbnew/pcad2kicadpcb_plugin/examples/CK1202_V1.pcb to test P-CAD import plugin - ok, net names are correct
- imported an Eagle 6.0 board (Arduino Uno; http://arduino.cc/en/uploads/Main/arduino_Uno_Rev3-02-TH.zip) then saved in .kicad_pcb format and reloaded - ok, net names are correct
- saved demos/video/video.kicad_pcb in legacy format and then loaded it again - ok, net names are correct
2014-01-14 09:41:52 +00:00
|
|
|
|
2011-12-14 04:43:51 +00:00
|
|
|
wxString BOARD_CONNECTED_ITEM::GetNetClassName() const
|
2009-09-27 11:00:21 +00:00
|
|
|
{
|
2011-12-14 04:43:51 +00:00
|
|
|
wxString name;
|
2014-05-20 09:29:37 +00:00
|
|
|
NETCLASSPTR myclass = GetNetClass();
|
2009-09-27 11:00:21 +00:00
|
|
|
|
|
|
|
if( myclass )
|
|
|
|
name = myclass->GetName();
|
|
|
|
else
|
2014-05-15 08:51:08 +00:00
|
|
|
name = NETCLASS::Default;
|
2009-09-27 11:00:21 +00:00
|
|
|
|
|
|
|
return name;
|
|
|
|
}
|