int DRAWING_TOOL::DrawLine( const TOOL_EVENT& aEvent ) { boost::optional<VECTOR2D> startingPoint; if( m_editModules ) { m_frame->SetToolID( ID_MODEDIT_LINE_TOOL, wxCURSOR_PENCIL, _( "Add graphic line" ) ); EDGE_MODULE* line = new EDGE_MODULE( m_board->m_Modules ); while( drawSegment( S_SEGMENT, reinterpret_cast<DRAWSEGMENT*&>( line ), startingPoint ) ) { if( line ) { m_frame->OnModify(); m_frame->SaveCopyInUndoList( m_board->m_Modules, UR_MODEDIT ); line->SetParent( m_board->m_Modules ); line->SetLocalCoord(); m_board->m_Modules->GraphicalItems().PushFront( line ); startingPoint = line->GetEnd(); } else { startingPoint = boost::none; } line = new EDGE_MODULE( m_board->m_Modules ); } } else // !m_editModules case { m_frame->SetToolID( ID_PCB_ADD_LINE_BUTT, wxCURSOR_PENCIL, _( "Add graphic line" ) ); DRAWSEGMENT* line = new DRAWSEGMENT; while( drawSegment( S_SEGMENT, line, startingPoint ) ) { if( line ) { m_board->Add( line ); m_frame->OnModify(); m_frame->SaveCopyInUndoList( line, UR_NEW ); startingPoint = line->GetEnd(); } else { startingPoint = boost::none; } line = new DRAWSEGMENT; } } m_frame->SetToolID( ID_NO_TOOL_SELECTED, wxCURSOR_DEFAULT, wxEmptyString ); return 0; }
int DRAWING_TOOL::DrawArc( const TOOL_EVENT& aEvent ) { if( m_editModules ) { m_frame->SetToolID( ID_MODEDIT_ARC_TOOL, wxCURSOR_PENCIL, _( "Add graphic arc" ) ); EDGE_MODULE* arc = new EDGE_MODULE( m_board->m_Modules ); while( drawArc( reinterpret_cast<DRAWSEGMENT*&>( arc ) ) ) { if( arc ) { m_frame->OnModify(); m_frame->SaveCopyInUndoList( m_board->m_Modules, UR_MODEDIT ); arc->SetParent( m_board->m_Modules ); arc->SetLocalCoord(); m_board->m_Modules->GraphicalItems().PushFront( arc ); } arc = new EDGE_MODULE( m_board->m_Modules ); } } else // !m_editModules case { m_frame->SetToolID( ID_PCB_ARC_BUTT, wxCURSOR_PENCIL, _( "Add graphic arc" ) ); DRAWSEGMENT* arc = new DRAWSEGMENT; while( drawArc( arc ) ) { if( arc ) { m_board->Add( arc ); m_frame->OnModify(); m_frame->SaveCopyInUndoList( arc, UR_NEW ); } arc = new DRAWSEGMENT; } } m_frame->SetToolID( ID_NO_TOOL_SELECTED, wxCURSOR_DEFAULT, wxEmptyString ); return 0; }
int DRAWING_TOOL::DrawCircle( const TOOL_EVENT& aEvent ) { if( m_editModules ) { m_frame->SetToolID( ID_MODEDIT_CIRCLE_TOOL, wxCURSOR_PENCIL, _( "Add graphic circle" ) ); EDGE_MODULE* circle = new EDGE_MODULE( m_board->m_Modules ); while( drawSegment( S_CIRCLE, reinterpret_cast<DRAWSEGMENT*&>( circle ) ) ) { if( circle ) { m_frame->OnModify(); m_frame->SaveCopyInUndoList( m_board->m_Modules, UR_MODEDIT ); circle->SetParent( m_board->m_Modules ); circle->SetLocalCoord(); m_board->m_Modules->GraphicalItems().PushFront( circle ); } circle = new EDGE_MODULE( m_board->m_Modules ); } } else // !m_editModules case { m_frame->SetToolID( ID_PCB_CIRCLE_BUTT, wxCURSOR_PENCIL, _( "Add graphic circle" ) ); DRAWSEGMENT* circle = new DRAWSEGMENT; while( drawSegment( S_CIRCLE, circle ) ) { if( circle ) { m_board->Add( circle ); m_frame->OnModify(); m_frame->SaveCopyInUndoList( circle, UR_NEW ); } circle = new DRAWSEGMENT; } } m_frame->SetToolID( ID_NO_TOOL_SELECTED, wxCURSOR_DEFAULT, wxEmptyString ); return 0; }