More Eagle importer fixes.

1) Don't process wires more than once when looking for bus entries.
2) Don't allow processing a wire to mess up iteration over the RTree.
This commit is contained in:
Jeff Young 2021-06-17 18:16:38 +01:00
parent 16047b7419
commit bdeeace2ab
1 changed files with 134 additions and 123 deletions

View File

@ -2253,42 +2253,46 @@ void SCH_EAGLE_PLUGIN::addBusEntries()
// for each wire segment, compare each end with all busses.
// If the wire end is found to end on a bus segment, place a bus entry symbol.
std::vector<SCH_LINE*> buses;
std::vector<SCH_LINE*> wires;
for( SCH_ITEM* ii : m_currentSheet->GetScreen()->Items().OfType( SCH_LINE_T ) )
{
SCH_LINE* bus = static_cast<SCH_LINE*>( ii );
SCH_LINE* line = static_cast<SCH_LINE*>( ii );
if( !bus->IsBus() )
continue;
if( line->IsBus() )
buses.push_back( line );
else if( line->IsWire() )
wires.push_back( line );
}
wxPoint busStart = bus->GetStartPoint();
wxPoint busEnd = bus->GetEndPoint();
for( SCH_LINE* wire : wires )
{
wxPoint wireStart = wire->GetStartPoint();
wxPoint wireEnd = wire->GetEndPoint();
auto entrySize =
[]( int signX, int signY ) -> wxPoint
{
return wxPoint( Mils2iu( DEFAULT_SCH_ENTRY_SIZE ) * signX,
Mils2iu( DEFAULT_SCH_ENTRY_SIZE ) * signY );
};
auto testBusHit =
[&]( const wxPoint& aPt ) -> bool
{
return TestSegmentHit( aPt, busStart, busEnd, 0 );
};
for( SCH_ITEM* jj : m_currentSheet->GetScreen()->Items().OfType( SCH_LINE_T ) )
for( SCH_LINE* bus : buses )
{
SCH_LINE* wire = static_cast<SCH_LINE*>( jj );
wxPoint busStart = bus->GetStartPoint();
wxPoint busEnd = bus->GetEndPoint();
if( !wire->IsWire() )
continue;
auto entrySize =
[]( int signX, int signY ) -> wxPoint
{
return wxPoint( Mils2iu( DEFAULT_SCH_ENTRY_SIZE ) * signX,
Mils2iu( DEFAULT_SCH_ENTRY_SIZE ) * signY );
};
wxPoint wireStart = wire->GetStartPoint();
wxPoint wireEnd = wire->GetEndPoint();
auto testBusHit =
[&]( const wxPoint& aPt ) -> bool
{
return TestSegmentHit( aPt, busStart, busEnd, 0 );
};
// Test for horizontal wire and vertical bus
if( wireStart.y == wireEnd.y && busStart.x == busEnd.x )
{
// Horizontal wire and vertical bus
if( testBusHit( wireStart ) )
{
// Wire start is on the vertical bus
@ -2371,10 +2375,10 @@ void SCH_EAGLE_PLUGIN::addBusEntries()
m_currentSheet->GetScreen()->Append( marker );
}
}
}
// Same thing but test end of the wire instead.
if( testBusHit( wireEnd ) )
break;
}
else if( testBusHit( wireEnd ) )
{
// Wire end is on the vertical bus
@ -2456,12 +2460,14 @@ void SCH_EAGLE_PLUGIN::addBusEntries()
m_currentSheet->GetScreen()->Append( marker );
}
}
}
} // if( wireStart.y == wireEnd.y && busStart.x == busEnd.x)
// Test for vertical wire and horizontal bus
if( wireStart.x == wireEnd.x && busStart.y == busEnd.y )
break;
}
}
else if( wireStart.x == wireEnd.x && busStart.y == busEnd.y )
{
// Vertical wire and horizontal bus
if( testBusHit( wireStart ) )
{
// Wire start is on the bus
@ -2548,9 +2554,10 @@ void SCH_EAGLE_PLUGIN::addBusEntries()
m_currentSheet->GetScreen()->Append( marker );
}
}
}
if( testBusHit( wireEnd ) )
break;
}
else if( testBusHit( wireEnd ) )
{
// Wire end is on the bus
@ -2636,115 +2643,119 @@ void SCH_EAGLE_PLUGIN::addBusEntries()
m_currentSheet->GetScreen()->Append( marker );
}
}
break;
}
}
wireStart = wire->GetStartPoint();
wireEnd = wire->GetEndPoint();
busStart = bus->GetStartPoint();
busEnd = bus->GetEndPoint();
// bus entry wire isn't horizontal or vertical
if( testBusHit( wireStart ) )
else
{
wxPoint wirevector = wireStart - wireEnd;
// Wire isn't horizontal or vertical
if( wirevector.x > 0 )
if( testBusHit( wireStart ) )
{
if( wirevector.y > 0 )
{
wxPoint p = wireStart + entrySize( -1, -1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 2 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
wxPoint wirevector = wireStart - wireEnd;
moveLabels( wire, p );
wire->SetStartPoint( p );
if( wirevector.x > 0 )
{
if( wirevector.y > 0 )
{
wxPoint p = wireStart + entrySize( -1, -1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 2 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
moveLabels( wire, p );
wire->SetStartPoint( p );
}
else
{
wxPoint p = wireStart + entrySize( -1, 1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 1 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
moveLabels( wire, p );
wire->SetStartPoint( p );
}
}
else
{
wxPoint p = wireStart + entrySize( -1, 1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 1 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
if( wirevector.y > 0 )
{
wxPoint p = wireStart + entrySize( 1, -1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 3 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
moveLabels( wire, p );
wire->SetStartPoint( p );
moveLabels( wire, p );
wire->SetStartPoint( p );
}
else
{
wxPoint p = wireStart + entrySize( 1, 1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 4 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
moveLabels( wire, p );
wire->SetStartPoint( p );
}
}
break;
}
else
else if( testBusHit( wireEnd ) )
{
if( wirevector.y > 0 )
{
wxPoint p = wireStart + entrySize( 1, -1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 3 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
wxPoint wirevector = wireStart - wireEnd;
moveLabels( wire, p );
wire->SetStartPoint( p );
if( wirevector.x > 0 )
{
if( wirevector.y > 0 )
{
wxPoint p = wireEnd + entrySize( 1, 1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 4 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
moveLabels( wire, p );
wire->SetEndPoint( p );
}
else
{
wxPoint p = wireEnd + entrySize( 1, -1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 3 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
moveLabels( wire, p );
wire->SetEndPoint( p );
}
}
else
{
wxPoint p = wireStart + entrySize( 1, 1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 4 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
if( wirevector.y > 0 )
{
wxPoint p = wireEnd + entrySize( -1, 1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 1 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
moveLabels( wire, p );
wire->SetStartPoint( p );
moveLabels( wire, p );
wire->SetEndPoint( p );
}
else
{
wxPoint p = wireEnd + entrySize( -1, -1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 2 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
moveLabels( wire, p );
wire->SetEndPoint( p );
}
}
}
}
else if( testBusHit( wireEnd ) )
{
wxPoint wirevector = wireStart - wireEnd;
if( wirevector.x > 0 )
{
if( wirevector.y > 0 )
{
wxPoint p = wireEnd + entrySize( 1, 1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 4 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
moveLabels( wire, p );
wire->SetEndPoint( p );
}
else
{
wxPoint p = wireEnd + entrySize( 1, -1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 3 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
moveLabels( wire, p );
wire->SetEndPoint( p );
}
}
else
{
if( wirevector.y > 0 )
{
wxPoint p = wireEnd + entrySize( -1, 1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 1 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
moveLabels( wire, p );
wire->SetEndPoint( p );
}
else
{
wxPoint p = wireEnd + entrySize( -1, -1 );
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 2 );
busEntry->SetFlags( IS_NEW );
m_currentSheet->GetScreen()->Append( busEntry );
moveLabels( wire, p );
wire->SetEndPoint( p );
}
break;
}
}
}