Add optional reporting of non-KiCad design issues

Also add HTML reporter to PCB side to match schematic
This commit is contained in:
Jon Evans 2024-05-04 11:27:22 -04:00
parent 09736ebf2c
commit b8fa10ab2b
6 changed files with 120 additions and 12 deletions

View File

@ -160,6 +160,9 @@ APP_SETTINGS_BASE::APP_SETTINGS_BASE( const std::string& aFilename, int aSchemaV
m_params.emplace_back( new PARAM<int>( "system.last_imperial_units",
&m_System.last_imperial_units, static_cast<int>( EDA_UNITS::MILS ) ) );
m_params.emplace_back( new PARAM<bool>( "system.show_import_issues",
&m_System.show_import_issues, true ) );
m_params.emplace_back( new PARAM<wxString>( "appearance.color_theme",
&m_ColorTheme, COLOR_SETTINGS::COLOR_BUILTIN_DEFAULT ) );

View File

@ -61,6 +61,7 @@
#include <tools/sch_editor_control.h>
#include <tools/sch_navigate_tool.h>
#include <trace_helpers.h>
#include <widgets/filedlg_import_non_kicad.h>
#include <widgets/wx_infobar.h>
#include <wildcards_and_files_ext.h>
#include <drawing_sheet/ds_data_model.h>
@ -730,9 +731,14 @@ void SCH_EDIT_FRAME::OnImportProject( wxCommandEvent& aEvent )
wxFileDialog dlg( this, _( "Import Schematic" ), path, wxEmptyString, fileFiltersStr,
wxFD_OPEN | wxFD_FILE_MUST_EXIST ); // TODO
FILEDLG_IMPORT_NON_KICAD importOptions( eeconfig()->m_System.show_import_issues );
dlg.SetCustomizeHook( importOptions );
if( dlg.ShowModal() == wxID_CANCEL )
return;
eeconfig()->m_System.show_import_issues = importOptions.GetShowIssues();
// Don't leave dangling pointers to previously-opened document.
m_toolManager->GetTool<EE_SELECTION_TOOL>()->ClearSelection();
ClearUndoRedoList();
@ -1383,7 +1389,11 @@ bool SCH_EDIT_FRAME::importFile( const wxString& aFileName, int aFileType,
std::placeholders::_1 ) );
}
pi->SetReporter( errorReporter.m_Reporter );
if( eeconfig()->m_System.show_import_issues )
pi->SetReporter( errorReporter.m_Reporter );
else
pi->SetReporter( &NULL_REPORTER::GetInstance() );
pi->SetProgressReporter( &progressReporter );
SCH_SHEET* loadedSheet =

View File

@ -142,6 +142,8 @@ public:
int units;
int last_metric_units;
int last_imperial_units;
/// Stored value for "show import issues" when importing non-KiCad designs to this application
bool show_import_issues;
};
APP_SETTINGS_BASE( const std::string& aFilename, int aSchemaVersion );

View File

@ -0,0 +1,55 @@
/*
* This program source code file is part of KiCad, a free EDA CAD application.
*
* Copyright (C) 2024 KiCad Developers, see AUTHORS.txt for contributors.
*
* 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 3 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, see <http://www.gnu.org/licenses/>.
*/
#ifndef KICAD_FILEDLG_IMPORT_NON_KICAD_H
#define KICAD_FILEDLG_IMPORT_NON_KICAD_H
#include <wx/wx.h>
#include <wx/filedlgcustomize.h>
class FILEDLG_IMPORT_NON_KICAD : public wxFileDialogCustomizeHook
{
public:
FILEDLG_IMPORT_NON_KICAD( bool aDefaultShowIssues = true ) :
m_showIssues( aDefaultShowIssues )
{};
virtual void AddCustomControls( wxFileDialogCustomize& customizer ) override
{
m_cb = customizer.AddCheckBox( _( "Show import issues" ) );
m_cb->SetValue( m_showIssues );
}
virtual void TransferDataFromCustomControls() override
{
m_showIssues = m_cb->GetValue();
}
bool GetShowIssues() const { return m_showIssues; }
private:
bool m_showIssues;
wxFileDialogCheckBox* m_cb = nullptr;
wxDECLARE_NO_COPY_CLASS( FILEDLG_IMPORT_NON_KICAD );
};
#endif //KICAD_FILEDLG_IMPORT_NON_KICAD_H

View File

@ -29,6 +29,7 @@
#include <confirm.h>
#include <core/arraydim.h>
#include <core/thread_pool.h>
#include <dialog_HTML_reporter_base.h>
#include <gestfich.h>
#include <pcb_edit_frame.h>
#include <board_design_settings.h>
@ -67,6 +68,8 @@
#include "footprint_info_impl.h"
#include <board_commit.h>
#include <zone_filler.h>
#include <widgets/filedlg_import_non_kicad.h>
#include <widgets/wx_html_report_box.h>
#include <wx_filename.h> // For ::ResolvePossibleSymlinks()
#include <kiplatform/io.h>
@ -169,15 +172,25 @@ bool AskLoadBoardFileName( PCB_EDIT_FRAME* aParent, wxString* aFileName, int aCt
// leave name empty
}
bool kicadFormat = ( aCtl & KICTL_KICAD_ONLY );
wxFileDialog dlg( aParent,
( aCtl & KICTL_KICAD_ONLY ) ? _( "Open Board File" )
: _( "Import Non KiCad Board File" ),
kicadFormat ? _( "Open Board File" ) : _( "Import Non KiCad Board File" ),
path, name, fileFiltersStr, wxFD_OPEN | wxFD_FILE_MUST_EXIST );
FILEDLG_IMPORT_NON_KICAD importOptions( aParent->config()->m_System.show_import_issues );
if( !kicadFormat )
dlg.SetCustomizeHook( importOptions );
if( dlg.ShowModal() == wxID_OK )
{
*aFileName = dlg.GetPath();
aParent->SetMruPath( wxFileName( dlg.GetPath() ).GetPath() );
if( !kicadFormat )
aParent->config()->m_System.show_import_issues = importOptions.GetShowIssues();
return true;
}
else
@ -645,6 +658,7 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
CheckForAutoSaveFile( fullFileName );
}
DIALOG_HTML_REPORTER errorReporter( this );
bool failedLoad = false;
try
@ -681,6 +695,10 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
// measure the time to load a BOARD.
int64_t startTime = GetRunningMicroSecs();
#endif
if( config()->m_System.show_import_issues )
pi->SetReporter( errorReporter.m_Reporter );
else
pi->SetReporter( &NULL_REPORTER::GetInstance() );
pi->SetProgressReporter( &progressReporter );
loadedBoard = pi->LoadBoard( fullFileName, nullptr, &props, &Prj() );
@ -731,6 +749,12 @@ bool PCB_EDIT_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, in
// compiled.
Raise();
if( errorReporter.m_Reporter->HasMessage() )
{
errorReporter.m_Reporter->Flush(); // Build HTML messages
errorReporter.ShowModal();
}
// Skip (possibly expensive) connectivity build here; we build it below after load
SetBoard( loadedBoard, false, &progressReporter );

View File

@ -253,9 +253,13 @@ std::vector<PCB_LAYER_ID> ALTIUM_PCB::GetKicadLayersToIterate( ALTIUM_LAYER aAlt
if( klayer == UNDEFINED_LAYER )
{
wxLogWarning( _( "Altium layer (%d) has no KiCad equivalent. It has been moved to KiCad "
"layer Eco1_User." ),
aAltiumLayer );
if( m_reporter )
{
m_reporter->Report( wxString::Format(
_( "Altium layer (%d) has no KiCad equivalent. It has been moved to KiCad "
"layer Eco1_User." ), aAltiumLayer ), RPT_SEVERITY_INFO );
}
klayer = Eco1_User;
}
@ -1289,9 +1293,14 @@ void ALTIUM_PCB::HelperParseDimensions6Linear( const ADIMENSION6& aElem )
if( klayer == UNDEFINED_LAYER )
{
wxLogWarning( _( "Dimension found on an Altium layer (%d) with no KiCad equivalent. "
"It has been moved to KiCad layer Eco1_User." ),
aElem.layer );
if( m_reporter )
{
m_reporter->Report( wxString::Format(
_( "Dimension found on an Altium layer (%d) with no KiCad equivalent. "
"It has been moved to KiCad layer Eco1_User." ), aElem.layer ),
RPT_SEVERITY_INFO );
}
klayer = Eco1_User;
}
@ -1390,9 +1399,14 @@ void ALTIUM_PCB::HelperParseDimensions6Radial(const ADIMENSION6 &aElem)
if( klayer == UNDEFINED_LAYER )
{
wxLogWarning( _( "Dimension found on an Altium layer (%d) with no KiCad equivalent. "
"It has been moved to KiCad layer Eco1_User." ),
aElem.layer );
if( m_reporter )
{
m_reporter->Report( wxString::Format(
_( "Dimension found on an Altium layer (%d) with no KiCad equivalent. "
"It has been moved to KiCad layer Eco1_User." ),
aElem.layer ), RPT_SEVERITY_INFO );
}
klayer = Eco1_User;
}