summaryrefslogtreecommitdiff
path: root/pcbnew/class_board_connected_item.h
diff options
context:
space:
mode:
Diffstat (limited to 'pcbnew/class_board_connected_item.h')
-rw-r--r--pcbnew/class_board_connected_item.h310
1 files changed, 310 insertions, 0 deletions
diff --git a/pcbnew/class_board_connected_item.h b/pcbnew/class_board_connected_item.h
new file mode 100644
index 0000000..fea4554
--- /dev/null
+++ b/pcbnew/class_board_connected_item.h
@@ -0,0 +1,310 @@
+/*
+ * 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
+ */
+
+/**
+ * @file class_board_connected_item.h
+ * @brief Class BOARD_CONNECTED_ITEM.
+ */
+
+#ifndef BOARD_CONNECTED_ITEM_H
+#define BOARD_CONNECTED_ITEM_H
+
+#include <class_board_item.h>
+#include <class_netinfo.h>
+
+class NETCLASS;
+class TRACK;
+class D_PAD;
+
+/**
+ * Class BOARD_CONNECTED_ITEM
+ * is a base class derived from BOARD_ITEM for items that can be connected
+ * and have a net, a netname, a clearance ...
+ * mainly: tracks, pads and zones
+ * Handle connection info
+ */
+class BOARD_CONNECTED_ITEM : public BOARD_ITEM
+{
+ friend class CONNECTIONS;
+
+public:
+ // These 2 members are used for temporary storage during connections calculations:
+ std::vector<TRACK*> m_TracksConnected; // list of other tracks connected to me
+ std::vector<D_PAD*> m_PadsConnected; // list of other pads connected to me
+
+ BOARD_CONNECTED_ITEM( BOARD_ITEM* aParent, KICAD_T idtype );
+
+ BOARD_CONNECTED_ITEM( const BOARD_CONNECTED_ITEM& aItem );
+
+ static inline bool ClassOf( const EDA_ITEM* aItem )
+ {
+ if( aItem == NULL )
+ return false;
+
+ switch( aItem->Type() )
+ {
+ case PCB_PAD_T:
+ case PCB_TRACE_T:
+ case PCB_VIA_T:
+ case PCB_ZONE_AREA_T:
+ return true;
+
+ default:
+ return false;
+ }
+ }
+
+ ///> @copydoc BOARD_ITEM::IsConnected()
+ bool IsConnected() const
+ {
+ return true;
+ }
+
+ /**
+ * Function GetNet
+ * Returns NET_INFO object for a given item.
+ */
+ NETINFO_ITEM* GetNet() const
+ {
+ return m_netinfo;
+ }
+
+ /**
+ * Function GetNetCode
+ * @return int - the net code.
+ */
+ int GetNetCode() const
+ {
+ return m_netinfo->GetNet();
+ }
+
+ /**
+ * Function SetNetCode
+ * sets net using a net code.
+ * @param aNetCode is a net code for the new net. It has to exist in NETINFO_LIST held by BOARD.
+ * @param aNoAssert if true, do not assert that the net exists.
+ * Otherwise, item is assigned to the unconnected net.
+ * @return true on success, false if the net did not exist
+ */
+ bool SetNetCode( int aNetCode, bool aNoAssert=false );
+
+ /**
+ * Function GetSubNet
+ * @return int - the sub net code.
+ */
+ int GetSubNet() const
+ {
+ return m_Subnet;
+ }
+
+ void SetSubNet( int aSubNetCode )
+ {
+ m_Subnet = aSubNetCode;
+ }
+
+ /**
+ * Function GetZoneSubNet
+ * @return int - the sub net code in zone connections.
+ */
+ int GetZoneSubNet() const
+ {
+ return m_ZoneSubnet;
+ }
+
+ void SetZoneSubNet( int aSubNetCode )
+ {
+ m_ZoneSubnet = aSubNetCode;
+ }
+
+ /**
+ * Function GetNetname
+ * @return wxString - the full netname
+ */
+ const wxString& GetNetname() const
+ {
+ return m_netinfo->GetNetname();
+ }
+
+ /**
+ * Function GetShortNetname
+ * @return wxString - the short netname
+ */
+ const wxString& GetShortNetname() const
+ {
+ return m_netinfo->GetShortNetname();
+ }
+
+ /**
+ * Function GetClearance
+ * returns the clearance in 1/10000 inches. If \a aItem is not NULL then the
+ * returned clearance is the greater of this object's NETCLASS clearance and
+ * aItem's NETCLASS clearance. If \a aItem is NULL, then this objects clearance
+ * is returned.
+ * @param aItem is another BOARD_CONNECTED_ITEM or NULL
+ * @return int - the clearance in 1/10000 inches.
+ */
+ virtual int GetClearance( BOARD_CONNECTED_ITEM* aItem = NULL ) const;
+
+ /**
+ * Function GetNetClass
+ * returns the NETCLASS for this item.
+ */
+ boost::shared_ptr<NETCLASS> GetNetClass() const;
+
+ /**
+ * Function GetNetClassName
+ * returns a pointer to the netclass of the zone.
+ * If the net is not found (can happen when a netlist is reread,
+ * and the net name does not exist, return the default net class
+ * (should not return a null pointer).
+ * @return the Net Class name of this item
+ */
+ wxString GetNetClassName() const;
+
+protected:
+ /// Stores all informations about the net that item belongs to
+ NETINFO_ITEM* m_netinfo;
+
+private:
+ int m_Subnet; /* In rastnest routines : for the current net, block number
+ * (number common to the current connected items found)
+ */
+
+ int m_ZoneSubnet; // used in rastnest computations : for the current net,
+ // handle cluster number in zone connection
+};
+
+
+#if 0 // template for future
+/**
+ * Class BOARD_ITEM_LIST
+ * is a container for a list of BOARD_ITEMs.
+ */
+class BOARD_ITEM_LIST : public BOARD_ITEM
+{
+ typedef boost::ptr_vector<BOARD_ITEM> ITEM_ARRAY;
+
+ ITEM_ARRAY myItems;
+
+ BOARD_ITEM_LIST( const BOARD_ITEM_LIST& other ) :
+ BOARD_ITEM( NULL, PCB_ITEM_LIST_T )
+ {
+ // copy constructor is not supported, is private to cause compiler error
+ }
+
+public:
+
+ BOARD_ITEM_LIST( BOARD_ITEM* aParent = NULL ) :
+ BOARD_ITEM( aParent, PCB_ITEM_LIST_T )
+ {}
+
+ //-----< satisfy some virtual functions >------------------------------
+ const wxPoint GetPosition()
+ {
+ return wxPoint(0, 0); // dummy
+ }
+
+ void Draw( EDA_DRAW_PANEL* DrawPanel, wxDC* DC,
+ GR_DRAWMODE aDrawMode, const wxPoint& offset = ZeroOffset )
+ {
+ }
+
+ void UnLink()
+ {
+ /* if it were needed:
+ DHEAD* list = GetList();
+
+ wxASSERT( list );
+
+ list->remove( this );
+ */
+ }
+
+ //-----</ satisfy some virtual functions >-----------------------------
+
+ /**
+ * Function GetCount
+ * returns the number of BOARD_ITEMs.
+ */
+ int GetCount() const
+ {
+ return myItems.size();
+ }
+
+ void Append( BOARD_ITEM* aItem )
+ {
+ myItems.push_back( aItem );
+ }
+
+ BOARD_ITEM* Replace( int aIndex, BOARD_ITEM* aItem )
+ {
+ ITEM_ARRAY::auto_type ret = myItems.replace( aIndex, aItem );
+ return ret.release();
+ }
+
+ BOARD_ITEM* Remove( int aIndex )
+ {
+ ITEM_ARRAY::auto_type ret = myItems.release( myItems.begin()+aIndex );
+ return ret.release();
+ }
+
+ void Insert( int aIndex, BOARD_ITEM* aItem )
+ {
+ myItems.insert( myItems.begin()+aIndex, aItem );
+ }
+
+ BOARD_ITEM* At( int aIndex ) const
+ {
+ // we have varying sized objects and are using polymorphism, so we
+ // must return a pointer not a reference.
+ return (BOARD_ITEM*) &myItems[aIndex];
+ }
+
+ BOARD_ITEM* operator[]( int aIndex ) const
+ {
+ return At( aIndex );
+ }
+
+ void Delete( int aIndex )
+ {
+ myItems.erase( myItems.begin()+aIndex );
+ }
+
+ void PushBack( BOARD_ITEM* aItem )
+ {
+ Append( aItem );
+ }
+
+ BOARD_ITEM* PopBack()
+ {
+ if( GetCount() )
+ return Remove( GetCount()-1 );
+
+ return NULL;
+ }
+};
+#endif // future
+
+#endif // BOARD_CONNECTED_ITEM_H