router: allow modification of SOLIDs in PNS::NODE
This commit is contained in:
parent
b7aea6f14c
commit
5a16fda11a
|
@ -701,38 +701,32 @@ void NODE::removeArcIndex( ARC* aArc )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void NODE::removeViaIndex( VIA* aVia )
|
void NODE::rebuildJoint( JOINT* aJoint, ITEM* aItem )
|
||||||
{
|
{
|
||||||
// We have to split a single joint (associated with a via, binding together multiple layers)
|
// We have to split a single joint (associated with a via or a pad, binding together multiple layers)
|
||||||
// into multiple independent joints. As I'm a lazy bastard, I simply delete the via and all
|
// into multiple independent joints. As I'm a lazy bastard, I simply delete the via/solid and all its links and re-insert them.
|
||||||
// its links and re-insert them.
|
|
||||||
|
|
||||||
|
JOINT::LINKED_ITEMS links( aJoint->LinkList() );
|
||||||
JOINT::HASH_TAG tag;
|
JOINT::HASH_TAG tag;
|
||||||
|
int net = aItem->Net();
|
||||||
VECTOR2I p( aVia->Pos() );
|
|
||||||
LAYER_RANGE vLayers( aVia->Layers() );
|
|
||||||
int net = aVia->Net();
|
|
||||||
|
|
||||||
JOINT* jt = FindJoint( p, vLayers.Start(), net );
|
|
||||||
JOINT::LINKED_ITEMS links( jt->LinkList() );
|
|
||||||
|
|
||||||
tag.net = net;
|
tag.net = net;
|
||||||
tag.pos = p;
|
tag.pos = aJoint->Pos();
|
||||||
|
|
||||||
bool split;
|
bool split;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
split = false;
|
split = false;
|
||||||
std::pair<JOINT_MAP::iterator, JOINT_MAP::iterator> range = m_joints.equal_range( tag );
|
auto range = m_joints.equal_range( tag );
|
||||||
|
|
||||||
if( range.first == m_joints.end() )
|
if( range.first == m_joints.end() )
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// find and remove all joints containing the via to be removed
|
// find and remove all joints containing the via to be removed
|
||||||
|
|
||||||
for( JOINT_MAP::iterator f = range.first; f != range.second; ++f )
|
for( auto f = range.first; f != range.second; ++f )
|
||||||
{
|
{
|
||||||
if( aVia->LayersOverlap( &f->second ) )
|
if( aItem->LayersOverlap( &f->second ) )
|
||||||
{
|
{
|
||||||
m_joints.erase( f );
|
m_joints.erase( f );
|
||||||
split = true;
|
split = true;
|
||||||
|
@ -742,16 +736,28 @@ void NODE::removeViaIndex( VIA* aVia )
|
||||||
} while( split );
|
} while( split );
|
||||||
|
|
||||||
// and re-link them, using the former via's link list
|
// and re-link them, using the former via's link list
|
||||||
for(ITEM* item : links)
|
for(ITEM* link : links)
|
||||||
{
|
{
|
||||||
if( item != aVia )
|
if( link != aItem )
|
||||||
linkJoint( p, item->Layers(), net, item );
|
linkJoint( tag.pos, link->Layers(), net, link );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void NODE::removeViaIndex( VIA* aVia )
|
||||||
|
{
|
||||||
|
JOINT* jt = FindJoint( aVia->Pos(), aVia->Layers().Start(), aVia->Net() );
|
||||||
|
assert( jt );
|
||||||
|
rebuildJoint( jt, aVia );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void NODE::removeSolidIndex( SOLID* aSolid )
|
void NODE::removeSolidIndex( SOLID* aSolid )
|
||||||
{
|
{
|
||||||
// fixme: this fucks up the joints, but it's only used for marking colliding obstacles for the moment, so we don't care.
|
// fixme: redundant code
|
||||||
|
JOINT* jt = FindJoint( aSolid->Pos(), aSolid->Layers().Start(), aSolid->Net() );
|
||||||
|
assert( jt );
|
||||||
|
rebuildJoint( jt, aSolid );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1213,12 +1219,15 @@ void NODE::Dump( bool aLong )
|
||||||
|
|
||||||
void NODE::GetUpdatedItems( ITEM_VECTOR& aRemoved, ITEM_VECTOR& aAdded )
|
void NODE::GetUpdatedItems( ITEM_VECTOR& aRemoved, ITEM_VECTOR& aAdded )
|
||||||
{
|
{
|
||||||
aRemoved.reserve( m_override.size() );
|
|
||||||
aAdded.reserve( m_index->Size() );
|
|
||||||
|
|
||||||
if( isRoot() )
|
if( isRoot() )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if( m_override.size() )
|
||||||
|
aRemoved.reserve( m_override.size() );
|
||||||
|
|
||||||
|
if( m_index->Size() )
|
||||||
|
aAdded.reserve( m_index->Size() );
|
||||||
|
|
||||||
for( ITEM* item : m_override )
|
for( ITEM* item : m_override )
|
||||||
aRemoved.push_back( item );
|
aRemoved.push_back( item );
|
||||||
|
|
||||||
|
|
|
@ -416,6 +416,7 @@ public:
|
||||||
|
|
||||||
void RemoveByMarker( int aMarker );
|
void RemoveByMarker( int aMarker );
|
||||||
|
|
||||||
|
const ITEM_SET FindItemsByParent( const BOARD_CONNECTED_ITEM* aParent );
|
||||||
ITEM* FindItemByParent( const BOARD_CONNECTED_ITEM* aParent );
|
ITEM* FindItemByParent( const BOARD_CONNECTED_ITEM* aParent );
|
||||||
|
|
||||||
bool HasChildren() const
|
bool HasChildren() const
|
||||||
|
|
Loading…
Reference in New Issue