Browse Source

Fix segfault when finishing a wire at a connection point.

pull/15/head
Jeff Young 7 years ago
parent
commit
5e556f0c6a
  1. 37
      eeschema/tools/sch_drawing_tool.cpp

37
eeschema/tools/sch_drawing_tool.cpp

@ -881,6 +881,7 @@ static void computeBreakPoint( SCH_SCREEN* aScreen, SCH_LINE* aSegment, wxPoint&
int SCH_DRAWING_TOOL::doDrawSegments( int aType, SCH_LINE* aSegment )
{
bool forceHV = m_frame->GetForceHVLines();
SCH_SCREEN* screen = m_frame->GetScreen();
m_toolMgr->RunAction( SCH_ACTIONS::selectionClear, true );
m_controls->ShowCursor( true );
@ -915,8 +916,8 @@ int SCH_DRAWING_TOOL::doDrawSegments( int aType, SCH_LINE* aSegment )
m_view->ClearHiddenFlags();
// Clear flags used in edit functions.
m_frame->GetScreen()->ClearDrawingState();
m_frame->GetScreen()->SetCurItem( nullptr );
screen->ClearDrawingState();
screen->SetCurItem( nullptr );
if( !evt->IsActivate() )
continue;
@ -961,7 +962,7 @@ int SCH_DRAWING_TOOL::doDrawSegments( int aType, SCH_LINE* aSegment )
aSegment->SetFlags( IS_NEW );
aSegment->SetStartPoint( cursorPos );
s_wires.PushBack( aSegment );
m_frame->GetScreen()->SetCurItem( aSegment );
screen->SetCurItem( aSegment );
}
else if( !aSegment )
{
@ -972,23 +973,25 @@ int SCH_DRAWING_TOOL::doDrawSegments( int aType, SCH_LINE* aSegment )
{
// Terminate the command if the end point is on a pin, junction, or another
// wire or bus.
if( !m_busUnfold.in_progress &&
m_frame->GetScreen()->IsTerminalPoint( cursorPos, aSegment->GetLayer() ) )
if( !m_busUnfold.in_progress
&& screen->IsTerminalPoint( cursorPos, aSegment->GetLayer() ) )
{
finishSegments();
aSegment = nullptr;
}
aSegment->SetEndPoint( cursorPos );
aSegment->ClearFlags( IS_NEW );
aSegment->SetFlags( SELECTED );
// Create a new segment, and chain it after the current new segment.
aSegment = new SCH_LINE( *aSegment );
aSegment->SetFlags( IS_NEW );
aSegment->SetStartPoint( cursorPos );
s_wires.PushBack( aSegment );
m_frame->GetScreen()->SetCurItem( aSegment );
else
{
aSegment->SetEndPoint( cursorPos );
aSegment->ClearFlags( IS_NEW );
aSegment->SetFlags( SELECTED );
// Create a new segment, and chain it after the current new segment.
aSegment = new SCH_LINE( *aSegment );
aSegment->SetFlags( IS_NEW );
aSegment->SetStartPoint( cursorPos );
s_wires.PushBack( aSegment );
screen->SetCurItem( aSegment );
}
}
if( evt->IsDblClick( BUT_LEFT ) )
@ -1038,7 +1041,7 @@ int SCH_DRAWING_TOOL::doDrawSegments( int aType, SCH_LINE* aSegment )
{
// Coerce the line to vertical or horizontal if necessary
if( forceHV )
computeBreakPoint( m_frame->GetScreen(), aSegment->Back(), cursorPos );
computeBreakPoint( screen, aSegment->Back(), cursorPos );
else
aSegment->SetEndPoint( cursorPos );
}

Loading…
Cancel
Save