kicad/qa/pns/pns_log_file.cpp

131 lines
3.8 KiB
C++

/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2020-2022 KiCad Developers.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, you may find one here:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* or you may search the http://www.gnu.org website for the version 2 license,
* or you may write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
// WARNING - this Tom's crappy PNS hack tool code. Please don't complain about its quality
// (unless you want to improve it).
#include "pns_log_file.h"
#include <board_design_settings.h>
#include <pcbnew/plugins/kicad/pcb_plugin.h>
#include <pcbnew/drc/drc_engine.h>
#include <console_log.h>
BOARD_CONNECTED_ITEM* PNS_LOG_FILE::ItemById( const PNS_LOG_FILE::EVENT_ENTRY& evt )
{
BOARD_CONNECTED_ITEM* parent = nullptr;
for( auto item : m_board->AllConnectedItems() )
{
if( item->m_Uuid == evt.uuid )
{
parent = item;
break;
};
}
return parent;
}
static const wxString readLine( FILE* f )
{
char str[16384];
fgets( str, sizeof( str ) - 1, f );
return wxString( str );
}
PNS_LOG_FILE::PNS_LOG_FILE()
{
m_routerSettings.reset( new PNS::ROUTING_SETTINGS( nullptr, "" ) );
}
bool PNS_LOG_FILE::Load( const std::string& logName, const std::string boardName )
{
FILE* f = fopen( logName.c_str(), "rb" );
if( !f )
return false;
while( !feof( f ) )
{
wxStringTokenizer tokens( readLine( f ) );
if( !tokens.CountTokens() )
continue;
wxString cmd = tokens.GetNextToken();
if( cmd == "event" )
{
EVENT_ENTRY evt;
evt.p.x = wxAtoi( tokens.GetNextToken() );
evt.p.y = wxAtoi( tokens.GetNextToken() );
evt.type = (PNS::LOGGER::EVENT_TYPE) wxAtoi( tokens.GetNextToken() );
evt.uuid = KIID( tokens.GetNextToken() );
m_events.push_back( evt );
}
else if( cmd == "config" )
{
m_routerSettings->SetMode( (PNS::PNS_MODE) wxAtoi( tokens.GetNextToken() ) );
m_routerSettings->SetRemoveLoops( wxAtoi( tokens.GetNextToken() ) );
m_routerSettings->SetFixAllSegments( wxAtoi( tokens.GetNextToken() ) );
m_routerSettings->SetCornerMode(
(DIRECTION_45::CORNER_MODE) wxAtoi( tokens.GetNextToken() ) );
}
}
fclose( f );
try
{
PCB_PLUGIN io;
m_board.reset( io.Load( boardName.c_str(), nullptr, nullptr ) );
std::shared_ptr<DRC_ENGINE> drcEngine( new DRC_ENGINE );
CONSOLE_LOG consoleLog;
BOARD_DESIGN_SETTINGS& bds = m_board->GetDesignSettings();
bds.m_DRCEngine = drcEngine;
drcEngine->SetBoard( m_board.get() );
drcEngine->SetDesignSettings( &bds );
drcEngine->SetLogReporter( new CONSOLE_MSG_REPORTER( &consoleLog ) );
drcEngine->InitEngine( wxFileName() );
}
catch( const PARSE_ERROR& parse_error )
{
printf( "parse error : %s (%s)\n", (const char*) parse_error.Problem().c_str(),
(const char*) parse_error.What().c_str() );
return false;
}
return true;
}