27 #include <unordered_set> 29 #include <boost/range/adaptor/map.hpp> 32 #include <geometry/shape_index.h> 49 typedef std::list<ITEM*> NET_ITEMS_LIST;
51 typedef std::unordered_set<ITEM*> ITEM_SET;
90 template<
class Visitor>
91 int Query(
const ITEM* aItem,
int aMinDistance, Visitor& aVisitor );
106 template<
class Visitor>
107 int Query(
const SHAPE* aShape,
int aMinDistance, Visitor& aVisitor );
130 return m_allItems.find( aItem ) != m_allItems.end();
138 int Size()
const {
return m_allItems.size(); }
140 ITEM_SET::iterator begin() {
return m_allItems.begin(); }
141 ITEM_SET::iterator end() {
return m_allItems.end(); }
144 static const int MaxSubIndices = 128;
145 static const int SI_Multilayer = 2;
146 static const int SI_SegDiagonal = 0;
147 static const int SI_SegStraight = 1;
148 static const int SI_Traces = 3;
149 static const int SI_PadsTop = 0;
150 static const int SI_PadsBottom = 1;
152 template <
class Visitor>
153 int querySingle(
int index,
const SHAPE* aShape,
int aMinDistance, Visitor& aVisitor );
155 ITEM_SHAPE_INDEX* getSubindex(
const ITEM* aItem );
157 ITEM_SHAPE_INDEX* m_subIndices[MaxSubIndices];
158 std::map<int, NET_ITEMS_LIST> m_netMap;
164 memset( m_subIndices, 0,
sizeof( m_subIndices ) );
173 switch( aItem->
Kind() )
176 idx_n = SI_Multilayer;
181 if( l.IsMultilayer() )
182 idx_n = SI_Multilayer;
183 else if( l.Start() == B_Cu )
185 else if( l.Start() == F_Cu )
186 idx_n = SI_PadsBottom;
190 case ITEM::SEGMENT_T:
192 idx_n = SI_Traces + 2 * l.Start() + SI_SegStraight;
199 if( idx_n < 0 || idx_n >= MaxSubIndices )
201 assert( idx_n >= 0 );
202 assert( idx_n < MaxSubIndices );
206 if( !m_subIndices[idx_n] )
209 return m_subIndices[idx_n];
220 m_allItems.insert( aItem );
221 int net = aItem->
Net();
225 m_netMap[net].push_back( aItem );
237 m_allItems.erase( aItem );
238 int net = aItem->
Net();
240 if( net >= 0 && m_netMap.find( net ) != m_netMap.end() )
241 m_netMap[net].
remove( aItem );
250 template<
class Visitor>
251 int INDEX::querySingle(
int index,
const SHAPE* aShape,
int aMinDistance, Visitor& aVisitor )
253 if( !m_subIndices[index] )
256 return m_subIndices[index]->
Query( aShape, aMinDistance, aVisitor,
false );
259 template<
class Visitor>
265 total += querySingle( SI_Multilayer, shape, aMinDistance, aVisitor );
269 if( layers.IsMultilayer() )
271 total += querySingle( SI_PadsTop, shape, aMinDistance, aVisitor );
272 total += querySingle( SI_PadsBottom, shape, aMinDistance, aVisitor );
274 for(
int i = layers.Start(); i <= layers.End(); ++i )
275 total += querySingle( SI_Traces + 2 * i + SI_SegStraight, shape, aMinDistance, aVisitor );
279 int l = layers.Start();
282 total += querySingle( SI_PadsTop, shape, aMinDistance, aVisitor );
284 total += querySingle( SI_PadsBottom, shape, aMinDistance, aVisitor );
286 total += querySingle( SI_Traces + 2 * l + SI_SegStraight, shape, aMinDistance, aVisitor );
292 template<
class Visitor>
297 for(
int i = 0; i < MaxSubIndices; i++ )
298 total += querySingle( i, aShape, aMinDistance, aVisitor );
305 for(
int i = 0; i < MaxSubIndices; ++i )
312 m_subIndices[i] = NULL;
323 if( m_netMap.find( aNet ) == m_netMap.end() )
326 return &m_netMap[aNet];
Class ITEM.
Definition: pns_item.h:54
Definition: shape_index.h:107
void Add(T aShape)
Function Add()
Definition: shape_index.h:310
virtual const SHAPE * Shape() const
Function Shape()
Definition: pns_item.h:297
int Net() const
Function Net()
Definition: pns_item.h:178
void Remove(T aShape)
Function Remove()
Definition: shape_index.h:320
void Clear()
Function Clear()
Definition: pns_index.h:303
Class SHAPE.
Definition: shape.h:57
NET_ITEMS_LIST * GetItemsForNet(int aNet)
Function GetItemsForNet()
Definition: pns_index.h:321
int Query(const ITEM *aItem, int aMinDistance, Visitor &aVisitor)
Function Query()
Definition: pns_index.h:260
bool Contains(ITEM *aItem) const
Function Contains()
Definition: pns_index.h:128
void Replace(ITEM *aOldItem, ITEM *aNewItem)
Function Add()
Definition: pns_index.h:244
Board layer functions and definitions.
int Size() const
Function Size()
Definition: pns_index.h:138
void Add(ITEM *aItem)
Function Add()
Definition: pns_index.h:212
int Query(const SHAPE *aShape, int aMinDistance, V &aVisitor, bool aExact)
Function Query()
Definition: shape_index.h:270
PnsKind Kind() const
Function Kind()
Definition: pns_item.h:121
Definition: pns_algo_base.cpp:26
void Remove(ITEM *aItem)
Function Remove()
Definition: pns_index.h:229
Class INDEX.
Definition: pns_index.h:46
Class LAYER_RANGE.
Definition: pns_layerset.h:32
const LAYER_RANGE & Layers() const
Function Layers()
Definition: pns_item.h:208