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:
parent
16047b7419
commit
bdeeace2ab
|
@ -2253,42 +2253,46 @@ void SCH_EAGLE_PLUGIN::addBusEntries()
|
||||||
// for each wire segment, compare each end with all busses.
|
// 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.
|
// 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 ) )
|
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() )
|
if( line->IsBus() )
|
||||||
continue;
|
buses.push_back( line );
|
||||||
|
else if( line->IsWire() )
|
||||||
|
wires.push_back( line );
|
||||||
|
}
|
||||||
|
|
||||||
wxPoint busStart = bus->GetStartPoint();
|
for( SCH_LINE* wire : wires )
|
||||||
wxPoint busEnd = bus->GetEndPoint();
|
{
|
||||||
|
wxPoint wireStart = wire->GetStartPoint();
|
||||||
|
wxPoint wireEnd = wire->GetEndPoint();
|
||||||
|
|
||||||
auto entrySize =
|
for( SCH_LINE* bus : buses )
|
||||||
[]( 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 ) )
|
|
||||||
{
|
{
|
||||||
SCH_LINE* wire = static_cast<SCH_LINE*>( jj );
|
wxPoint busStart = bus->GetStartPoint();
|
||||||
|
wxPoint busEnd = bus->GetEndPoint();
|
||||||
|
|
||||||
if( !wire->IsWire() )
|
auto entrySize =
|
||||||
continue;
|
[]( int signX, int signY ) -> wxPoint
|
||||||
|
{
|
||||||
|
return wxPoint( Mils2iu( DEFAULT_SCH_ENTRY_SIZE ) * signX,
|
||||||
|
Mils2iu( DEFAULT_SCH_ENTRY_SIZE ) * signY );
|
||||||
|
};
|
||||||
|
|
||||||
wxPoint wireStart = wire->GetStartPoint();
|
auto testBusHit =
|
||||||
wxPoint wireEnd = wire->GetEndPoint();
|
[&]( 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 )
|
if( wireStart.y == wireEnd.y && busStart.x == busEnd.x )
|
||||||
{
|
{
|
||||||
|
// Horizontal wire and vertical bus
|
||||||
|
|
||||||
if( testBusHit( wireStart ) )
|
if( testBusHit( wireStart ) )
|
||||||
{
|
{
|
||||||
// Wire start is on the vertical bus
|
// Wire start is on the vertical bus
|
||||||
|
@ -2371,10 +2375,10 @@ void SCH_EAGLE_PLUGIN::addBusEntries()
|
||||||
m_currentSheet->GetScreen()->Append( marker );
|
m_currentSheet->GetScreen()->Append( marker );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Same thing but test end of the wire instead.
|
break;
|
||||||
if( testBusHit( wireEnd ) )
|
}
|
||||||
|
else if( testBusHit( wireEnd ) )
|
||||||
{
|
{
|
||||||
// Wire end is on the vertical bus
|
// Wire end is on the vertical bus
|
||||||
|
|
||||||
|
@ -2456,12 +2460,14 @@ void SCH_EAGLE_PLUGIN::addBusEntries()
|
||||||
m_currentSheet->GetScreen()->Append( marker );
|
m_currentSheet->GetScreen()->Append( marker );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} // if( wireStart.y == wireEnd.y && busStart.x == busEnd.x)
|
|
||||||
|
|
||||||
// Test for vertical wire and horizontal bus
|
break;
|
||||||
if( wireStart.x == wireEnd.x && busStart.y == busEnd.y )
|
}
|
||||||
|
}
|
||||||
|
else if( wireStart.x == wireEnd.x && busStart.y == busEnd.y )
|
||||||
{
|
{
|
||||||
|
// Vertical wire and horizontal bus
|
||||||
|
|
||||||
if( testBusHit( wireStart ) )
|
if( testBusHit( wireStart ) )
|
||||||
{
|
{
|
||||||
// Wire start is on the bus
|
// Wire start is on the bus
|
||||||
|
@ -2548,9 +2554,10 @@ void SCH_EAGLE_PLUGIN::addBusEntries()
|
||||||
m_currentSheet->GetScreen()->Append( marker );
|
m_currentSheet->GetScreen()->Append( marker );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if( testBusHit( wireEnd ) )
|
break;
|
||||||
|
}
|
||||||
|
else if( testBusHit( wireEnd ) )
|
||||||
{
|
{
|
||||||
// Wire end is on the bus
|
// Wire end is on the bus
|
||||||
|
|
||||||
|
@ -2636,115 +2643,119 @@ void SCH_EAGLE_PLUGIN::addBusEntries()
|
||||||
m_currentSheet->GetScreen()->Append( marker );
|
m_currentSheet->GetScreen()->Append( marker );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
wireStart = wire->GetStartPoint();
|
|
||||||
wireEnd = wire->GetEndPoint();
|
|
||||||
busStart = bus->GetStartPoint();
|
|
||||||
busEnd = bus->GetEndPoint();
|
|
||||||
|
|
||||||
// bus entry wire isn't horizontal or vertical
|
|
||||||
if( testBusHit( wireStart ) )
|
|
||||||
{
|
{
|
||||||
wxPoint wirevector = wireStart - wireEnd;
|
// Wire isn't horizontal or vertical
|
||||||
|
|
||||||
if( wirevector.x > 0 )
|
if( testBusHit( wireStart ) )
|
||||||
{
|
{
|
||||||
if( wirevector.y > 0 )
|
wxPoint wirevector = wireStart - wireEnd;
|
||||||
{
|
|
||||||
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 );
|
if( wirevector.x > 0 )
|
||||||
wire->SetStartPoint( p );
|
{
|
||||||
|
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
|
else
|
||||||
{
|
{
|
||||||
wxPoint p = wireStart + entrySize( -1, 1 );
|
if( wirevector.y > 0 )
|
||||||
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 1 );
|
{
|
||||||
busEntry->SetFlags( IS_NEW );
|
wxPoint p = wireStart + entrySize( 1, -1 );
|
||||||
m_currentSheet->GetScreen()->Append( busEntry );
|
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 3 );
|
||||||
|
busEntry->SetFlags( IS_NEW );
|
||||||
|
m_currentSheet->GetScreen()->Append( busEntry );
|
||||||
|
|
||||||
moveLabels( wire, p );
|
moveLabels( wire, p );
|
||||||
wire->SetStartPoint( 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 wirevector = wireStart - wireEnd;
|
||||||
{
|
|
||||||
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 );
|
if( wirevector.x > 0 )
|
||||||
wire->SetStartPoint( p );
|
{
|
||||||
|
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
|
else
|
||||||
{
|
{
|
||||||
wxPoint p = wireStart + entrySize( 1, 1 );
|
if( wirevector.y > 0 )
|
||||||
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 4 );
|
{
|
||||||
busEntry->SetFlags( IS_NEW );
|
wxPoint p = wireEnd + entrySize( -1, 1 );
|
||||||
m_currentSheet->GetScreen()->Append( busEntry );
|
SCH_BUS_WIRE_ENTRY* busEntry = new SCH_BUS_WIRE_ENTRY( p, 1 );
|
||||||
|
busEntry->SetFlags( IS_NEW );
|
||||||
|
m_currentSheet->GetScreen()->Append( busEntry );
|
||||||
|
|
||||||
moveLabels( wire, p );
|
moveLabels( wire, p );
|
||||||
wire->SetStartPoint( 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 )
|
break;
|
||||||
{
|
|
||||||
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 );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue