void PCB_EDIT_FRAME::ReadPcbNetlist( const wxString& aNetlistFileName, const wxString& aCmpFileName, REPORTER* aReporter, bool aChangeFootprints, bool aDeleteUnconnectedTracks, bool aDeleteExtraFootprints, bool aSelectByTimeStamp, bool aDeleteSinglePadNets, bool aIsDryRun ) { wxString msg; NETLIST netlist; KIGFX::VIEW* view = GetGalCanvas()->GetView(); BOARD* board = GetBoard(); netlist.SetIsDryRun( aIsDryRun ); netlist.SetFindByTimeStamp( aSelectByTimeStamp ); netlist.SetDeleteExtraFootprints( aDeleteExtraFootprints ); netlist.SetReplaceFootprints( aChangeFootprints ); try { std::auto_ptr<NETLIST_READER> netlistReader( NETLIST_READER::GetNetlistReader( &netlist, aNetlistFileName, aCmpFileName ) ); if( !netlistReader.get() ) { msg.Printf( _( "Cannot open netlist file \"%s\"." ), GetChars( aNetlistFileName ) ); wxMessageBox( msg, _( "Netlist Load Error." ), wxOK | wxICON_ERROR, this ); return; } SetLastNetListRead( aNetlistFileName ); netlistReader->LoadNetlist(); loadFootprints( netlist, aReporter ); } catch( const IO_ERROR& ioe ) { msg.Printf( _( "Error loading netlist.\n%s" ), ioe.errorText.GetData() ); wxMessageBox( msg, _( "Netlist Load Error" ), wxOK | wxICON_ERROR ); return; } // Clear undo and redo lists to avoid inconsistencies between lists if( !netlist.IsDryRun() ) GetScreen()->ClearUndoRedoList(); if( !netlist.IsDryRun() ) { // Remove old modules for( MODULE* module = board->m_Modules; module; module = module->Next() ) { module->RunOnChildren( boost::bind( &KIGFX::VIEW::Remove, view, _1 ) ); view->Remove( module ); } } // Clear selection, just in case a selected item has to be removed m_toolManager->RunAction( COMMON_ACTIONS::selectionClear, true ); netlist.SortByReference(); board->ReplaceNetlist( netlist, aDeleteSinglePadNets, aReporter ); // If it was a dry run, nothing has changed so we're done. if( netlist.IsDryRun() ) return; OnModify(); SetCurItem( NULL ); // Reload modules for( MODULE* module = board->m_Modules; module; module = module->Next() ) { module->RunOnChildren( boost::bind( &KIGFX::VIEW::Add, view, _1 ) ); view->Add( module ); module->ViewUpdate(); } if( aDeleteUnconnectedTracks && board->m_Track ) { // Remove erroneous tracks. This should probably pushed down to the #BOARD object. RemoveMisConnectedTracks(); } // Rebuild the board connectivity: if( IsGalCanvasActive() ) board->GetRatsnest()->ProcessBoard(); Compile_Ratsnest( NULL, true ); SetMsgPanel( board ); m_canvas->Refresh(); }
void PCB_EDIT_FRAME::ReadPcbNetlist( const wxString& aNetlistFileName, const wxString& aCmpFileName, REPORTER* aReporter, bool aChangeFootprints, bool aDeleteUnconnectedTracks, bool aDeleteExtraFootprints, bool aSelectByTimeStamp, bool aDeleteSinglePadNets, bool aIsDryRun ) { wxString msg; NETLIST netlist; KIGFX::VIEW* view = GetGalCanvas()->GetView(); BOARD* board = GetBoard(); std::vector<MODULE*> newFootprints; // keep trace of the initial baord area, if we want to place new footprints // outside the existinag board EDA_RECT bbox = board->GetBoundingBox(); netlist.SetIsDryRun( aIsDryRun ); netlist.SetFindByTimeStamp( aSelectByTimeStamp ); netlist.SetDeleteExtraFootprints( aDeleteExtraFootprints ); netlist.SetReplaceFootprints( aChangeFootprints ); try { std::unique_ptr<NETLIST_READER> netlistReader( NETLIST_READER::GetNetlistReader( &netlist, aNetlistFileName, aCmpFileName ) ); if( !netlistReader.get() ) { msg.Printf( _( "Cannot open netlist file \"%s\"." ), GetChars( aNetlistFileName ) ); wxMessageBox( msg, _( "Netlist Load Error." ), wxOK | wxICON_ERROR, this ); return; } SetLastNetListRead( aNetlistFileName ); netlistReader->LoadNetlist(); LoadFootprints( netlist, aReporter ); } catch( const IO_ERROR& ioe ) { msg.Printf( _( "Error loading netlist.\n%s" ), ioe.What().GetData() ); wxMessageBox( msg, _( "Netlist Load Error" ), wxOK | wxICON_ERROR ); return; } // Clear undo and redo lists to avoid inconsistencies between lists if( !netlist.IsDryRun() ) GetScreen()->ClearUndoRedoList(); if( !netlist.IsDryRun() ) { // Remove old modules for( MODULE* module = board->m_Modules; module; module = module->Next() ) { view->Remove( module ); } } // Clear selection, just in case a selected item has to be removed m_toolManager->RunAction( PCB_ACTIONS::selectionClear, true ); netlist.SortByReference(); board->ReplaceNetlist( netlist, aDeleteSinglePadNets, &newFootprints, aReporter ); // If it was a dry run, nothing has changed so we're done. if( netlist.IsDryRun() ) return; if( IsGalCanvasActive() ) { SpreadFootprints( &newFootprints, false, false, GetCrossHairPosition() ); if( !newFootprints.empty() ) { for( MODULE* footprint : newFootprints ) { m_toolManager->RunAction( PCB_ACTIONS::selectItem, true, footprint ); } m_toolManager->InvokeTool( "pcbnew.InteractiveEdit" ); } } else { wxPoint placementAreaPosition; // Place area to the left side of the board. // if the board is empty, the bbox position is (0,0) placementAreaPosition.x = bbox.GetEnd().x + Millimeter2iu( 10 ); placementAreaPosition.y = bbox.GetOrigin().y; SpreadFootprints( &newFootprints, false, false, placementAreaPosition ); } OnModify(); SetCurItem( NULL ); // Reload modules for( MODULE* module = board->m_Modules; module; module = module->Next() ) { view->Add( module ); } if( aDeleteUnconnectedTracks && board->m_Track ) { // Remove erroneous tracks. This should probably pushed down to the #BOARD object. RemoveMisConnectedTracks(); } // Rebuild the board connectivity: board->GetConnectivity()->Build( board ); SetMsgPanel( board ); m_canvas->Refresh(); }
void PCB_EDIT_FRAME::ReadPcbNetlist( const wxString& aNetlistFileName, const wxString& aCmpFileName, REPORTER* aReporter, bool aChangeFootprints, bool aDeleteUnconnectedTracks, bool aDeleteExtraFootprints, bool aSelectByTimeStamp, bool aDeleteSinglePadNets, bool aIsDryRun ) { wxString msg; NETLIST netlist; NETLIST_READER* netlistReader; netlist.SetIsDryRun( aIsDryRun ); netlist.SetFindByTimeStamp( aSelectByTimeStamp ); netlist.SetDeleteExtraFootprints( aDeleteExtraFootprints ); netlist.SetReplaceFootprints( aChangeFootprints ); try { netlistReader = NETLIST_READER::GetNetlistReader( &netlist, aNetlistFileName, aCmpFileName ); if( netlistReader == NULL ) { msg.Printf( _( "Cannot open netlist file \"%s\"." ), GetChars( aNetlistFileName ) ); wxMessageBox( msg, _( "Netlist Load Error." ), wxOK | wxICON_ERROR, this ); return; } std::auto_ptr< NETLIST_READER > nlr( netlistReader ); SetLastNetListRead( aNetlistFileName ); netlistReader->LoadNetlist(); loadFootprints( netlist, aReporter ); } catch( const IO_ERROR& ioe ) { msg.Printf( _( "Error loading netlist.\n%s" ), ioe.errorText.GetData() ); wxMessageBox( msg, _( "Netlist Load Error" ), wxOK | wxICON_ERROR ); return; } // Clear undo and redo lists to avoid inconsistencies between lists if( !netlist.IsDryRun() ) GetScreen()->ClearUndoRedoList(); netlist.SortByReference(); GetBoard()->ReplaceNetlist( netlist, aDeleteSinglePadNets, aReporter ); // If it was a dry run, nothing has changed so we're done. if( netlist.IsDryRun() ) return; OnModify(); SetCurItem( NULL ); if( aDeleteUnconnectedTracks && GetBoard()->m_Track ) { // Remove erroneous tracks. This should probably pushed down to the #BOARD object. RemoveMisConnectedTracks(); } // Rebuild the board connectivity: Compile_Ratsnest( NULL, true ); SetMsgPanel( GetBoard() ); m_canvas->Refresh(); }