Commit 510fee13 authored by Maciej Suminski's avatar Maciej Suminski
Browse files

Another way of handling items for the ratsnest (clearer and now finally...

Another way of handling items for the ratsnest (clearer and now finally supports undo/redo of the PNS created tracks).
parent bbb3972f
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -548,8 +548,7 @@ void PCB_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool aRed
            if( item->Type() == PCB_MODULE_T )
            {
                MODULE* module = static_cast<MODULE*>( item );
                module->RunOnChildren( std::bind1st( std::mem_fun( &KIGFX::VIEW::Remove ),
                                                                   view ) );
                module->RunOnChildren( std::bind1st( std::mem_fun( &KIGFX::VIEW::Remove ), view ) );
            }
            view->Remove( item );

@@ -563,8 +562,7 @@ void PCB_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool aRed
            if( item->Type() == PCB_MODULE_T )
            {
                MODULE* module = static_cast<MODULE*>( item );
                module->RunOnChildren( std::bind1st( std::mem_fun( &KIGFX::VIEW::Add ),
                                                                   view ) );
                module->RunOnChildren( std::bind1st( std::mem_fun( &KIGFX::VIEW::Add ), view ) );
            }
            view->Add( item );

@@ -575,23 +573,27 @@ void PCB_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool aRed
        case UR_MOVED:
            item->Move( aRedoCommand ? aList->m_TransformPoint : -aList->m_TransformPoint );
            item->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
            ratsnest->Update( item );
            break;

        case UR_ROTATED:
            item->Rotate( aList->m_TransformPoint,
                          aRedoCommand ? m_rotationAngle : -m_rotationAngle );
            item->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
            ratsnest->Update( item );
            break;

        case UR_ROTATED_CLOCKWISE:
            item->Rotate( aList->m_TransformPoint,
                          aRedoCommand ? -m_rotationAngle : m_rotationAngle );
            item->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY );
            ratsnest->Update( item );
            break;

        case UR_FLIPPED:
            item->Flip( aList->m_TransformPoint );
            item->ViewUpdate( KIGFX::VIEW_ITEM::LAYERS );
            ratsnest->Update( item );
            break;

        default:
@@ -603,8 +605,6 @@ void PCB_EDIT_FRAME::PutDataInPreviousState( PICKED_ITEMS_LIST* aList, bool aRed
        }
        break;
        }

        ratsnest->Update( item );
    }

    if( not_found )
+10 −36
Original line number Diff line number Diff line
@@ -842,6 +842,8 @@ void BOARD::Add( BOARD_ITEM* aBoardItem, int aControl )
        }
        break;
    }

    m_ratsnest->Add( aBoardItem );
}


@@ -867,55 +869,25 @@ BOARD_ITEM* BOARD::Remove( BOARD_ITEM* aBoardItem )
        break;

    case PCB_ZONE_AREA_T:    // this one uses a vector
    {
        ZONE_CONTAINER* zone = static_cast<ZONE_CONTAINER*>( aBoardItem );

        // find the item in the vector, then delete then erase it.
        for( unsigned i = 0; i<m_ZoneDescriptorList.size(); ++i )
        {
            if( m_ZoneDescriptorList[i] == zone )
            if( m_ZoneDescriptorList[i] == (ZONE_CONTAINER*) aBoardItem )
            {
                m_ZoneDescriptorList.erase( m_ZoneDescriptorList.begin() + i );
                break;
            }
        }

        if( zone->GetNet() > 0 )
            m_ratsnest->GetNet( zone->GetNet() ).RemoveItem( zone );
    }
        break;

    case PCB_MODULE_T:
    {
        MODULE* module = static_cast<MODULE*>( aBoardItem );
        m_Modules.Remove( (MODULE*) aBoardItem );

        for( D_PAD* pad = module->Pads().GetFirst(); pad; pad = pad->Next() )
        {
            if( pad->GetNet() > 0 )
                m_ratsnest->GetNet( pad->GetNet() ).RemoveItem( pad );
        }
    }
        break;

    case PCB_TRACE_T:
    {
        TRACK* track = static_cast<TRACK*>( aBoardItem );
        m_Track.Remove( track );

        if( track->GetNet() > 0 )
            m_ratsnest->GetNet( track->GetNet() ).RemoveItem( track );
    }
    break;

    case PCB_VIA_T:
    {
        SEGVIA* via = static_cast<SEGVIA*>( aBoardItem );
        m_Track.Remove( via );

        if( via->GetNet() > 0 )
            m_ratsnest->GetNet( via->GetNet() ).RemoveItem( via );
    }
        m_Track.Remove( (TRACK*) aBoardItem );
        break;

    case PCB_ZONE_T:
@@ -935,6 +907,8 @@ BOARD_ITEM* BOARD::Remove( BOARD_ITEM* aBoardItem )
        wxFAIL_MSG( wxT( "BOARD::Remove() needs more ::Type() support" ) );
    }

    m_ratsnest->Remove( aBoardItem );

    return aBoardItem;
}

+2 −2
Original line number Diff line number Diff line
@@ -428,11 +428,11 @@ BOARD* PCB_PARSER::parseBOARD() throw( IO_ERROR, PARSE_ERROR )
            break;

        case T_segment:
            m_board->m_Track.Append( parseTRACK() );
            m_board->Add( parseTRACK(), ADD_APPEND );
            break;

        case T_via:
            m_board->m_Track.Append( parseSEGVIA() );
            m_board->Add( parseSEGVIA(), ADD_APPEND );
            break;

        case T_zone:
+0 −1
Original line number Diff line number Diff line
@@ -612,7 +612,6 @@ void PCB_EDIT_FRAME::ViewReloadBoard( const BOARD* aBoard ) const

    // Add an entry for the ratsnest
    RN_DATA* ratsnest = aBoard->GetRatsnest();
    ratsnest->ProcessBoard();
    ratsnest->Recalculate();
    view->Add( new KIGFX::RATSNEST_VIEWITEM( ratsnest ) );

+10 −4
Original line number Diff line number Diff line
@@ -782,6 +782,10 @@ void RN_DATA::Add( const BOARD_ITEM* aItem )
        net = static_cast<const BOARD_CONNECTED_ITEM*>( aItem )->GetNet();
        if( net < 1 )           // do not process unconnected items
            return;

        // Autoresize
        if( net >= (int) m_nets.size() )
            m_nets.resize( net + 1 );
    }
    else if( aItem->Type() == PCB_MODULE_T )
    {
@@ -789,10 +793,13 @@ void RN_DATA::Add( const BOARD_ITEM* aItem )
        for( const D_PAD* pad = module->Pads().GetFirst(); pad; pad = pad->Next() )
        {
            net = pad->GetNet();

            if( net < 1 )       // do not process unconnected items
                continue;

            // Autoresize
            if( net >= (int) m_nets.size() )
                m_nets.resize( net + 1 );

            m_nets[net].AddItem( pad );
        }

@@ -841,7 +848,6 @@ void RN_DATA::Remove( const BOARD_ITEM* aItem )
        for( const D_PAD* pad = module->Pads().GetFirst(); pad; pad = pad->Next() )
        {
            net = pad->GetNet();

            if( net < 1 )       // do not process unconnected items
                continue;

@@ -916,8 +922,8 @@ void RN_DATA::Recalculate( int aNet )
{
    if( aNet < 0 )              // Recompute everything
    {
        // Start with net number 1, as 0 stand for not connected
        for( unsigned int i = 1; i < m_board->GetNetCount(); ++i )
        // Start with net number 1, as 0 stands for not connected
        for( unsigned int i = 1; i < m_nets.size(); ++i )
        {
            // Recompute only nets that require it
            if( m_nets[i].IsDirty() )