Move bitmap2cmp and pcb_calculator to tool framework.
Fixes https://gitlab.com/kicad/code/kicad/-/issues/1939 Fixes https://gitlab.com/kicad/code/kicad/-/issues/7561
This commit is contained in:
parent
d8debfa0ee
commit
75e78f9088
|
@ -11,6 +11,7 @@ include_directories( ${INC_AFTER} )
|
|||
|
||||
set( BITMAP2COMPONENT_SRCS
|
||||
${CMAKE_SOURCE_DIR}/common/single_top.cpp
|
||||
bitmap2cmp_control.cpp
|
||||
bitmap2cmp_main.cpp
|
||||
bitmap2cmp_settings.cpp
|
||||
bitmap2component.cpp
|
||||
|
|
|
@ -0,0 +1,62 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2023 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 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
|
||||
*/
|
||||
|
||||
#include <kiway.h>
|
||||
#include <tool/tool_manager.h>
|
||||
#include <tool/actions.h>
|
||||
#include <bitmap2cmp_frame.h>
|
||||
#include <bitmap2cmp_control.h>
|
||||
|
||||
|
||||
bool BITMAP2CMP_CONTROL::Init()
|
||||
{
|
||||
Reset( MODEL_RELOAD );
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void BITMAP2CMP_CONTROL::Reset( RESET_REASON aReason )
|
||||
{
|
||||
m_frame = getEditFrame<BITMAP2CMP_FRAME>();
|
||||
}
|
||||
|
||||
|
||||
int BITMAP2CMP_CONTROL::Open( const TOOL_EVENT& aEvent )
|
||||
{
|
||||
m_frame->OnLoadFile();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int BITMAP2CMP_CONTROL::Close( const TOOL_EVENT& aEvent )
|
||||
{
|
||||
m_frame->Close();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void BITMAP2CMP_CONTROL::setTransitions()
|
||||
{
|
||||
Go( &BITMAP2CMP_CONTROL::Open, ACTIONS::open.MakeEvent() );
|
||||
Go( &BITMAP2CMP_CONTROL::Close, ACTIONS::quit.MakeEvent() );
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2023 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 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
|
||||
*/
|
||||
|
||||
|
||||
#ifndef BITMAP2CMP_CONTROL_H
|
||||
#define BITMAP2CMP_CONTROL_H
|
||||
|
||||
#include <tool/tool_interactive.h>
|
||||
|
||||
class BITMAP2CMP_FRAME;
|
||||
|
||||
|
||||
/**
|
||||
* Handle actions for the various symbol editor and viewers.
|
||||
*/
|
||||
class BITMAP2CMP_CONTROL : public wxEvtHandler, public TOOL_INTERACTIVE
|
||||
{
|
||||
public:
|
||||
BITMAP2CMP_CONTROL() :
|
||||
TOOL_INTERACTIVE( "bitmap2cmp.Control" ),
|
||||
m_frame( nullptr )
|
||||
{ }
|
||||
|
||||
virtual ~BITMAP2CMP_CONTROL() { }
|
||||
|
||||
/// @copydoc TOOL_INTERACTIVE::Init()
|
||||
bool Init() override;
|
||||
|
||||
/// @copydoc TOOL_INTERACTIVE::Reset()
|
||||
void Reset( RESET_REASON aReason ) override;
|
||||
|
||||
int Open( const TOOL_EVENT& aEvent );
|
||||
int Close( const TOOL_EVENT& aEvent );
|
||||
|
||||
private:
|
||||
///< Set up handlers for various events.
|
||||
void setTransitions() override;
|
||||
|
||||
private:
|
||||
BITMAP2CMP_FRAME* m_frame;
|
||||
};
|
||||
|
||||
|
||||
#endif // BITMAP2CMP_CONTROL_H
|
|
@ -31,7 +31,14 @@
|
|||
#include <common.h>
|
||||
#include <kiface_base.h>
|
||||
#include <pgm_base.h>
|
||||
#include <widgets/wx_menubar.h>
|
||||
#include <menus_helpers.h>
|
||||
#include <wildcards_and_files_ext.h>
|
||||
#include <tool/tool_manager.h>
|
||||
#include <tool/tool_dispatcher.h>
|
||||
#include <tool/common_control.h>
|
||||
#include <bitmap2cmp_control.h>
|
||||
#include <tool/actions.h>
|
||||
|
||||
#include <wx/filedlg.h>
|
||||
#include <wx/msgdlg.h>
|
||||
|
@ -130,18 +137,14 @@ void IMAGE_SIZE::SetUnit( EDA_UNITS aUnit )
|
|||
}
|
||||
|
||||
|
||||
BEGIN_EVENT_TABLE( BITMAP2CMP_FRAME, KIWAY_PLAYER )
|
||||
EVT_MENU( wxID_EXIT, BITMAP2CMP_FRAME::OnExit )
|
||||
EVT_MENU( wxID_OPEN, BITMAP2CMP_FRAME::OnLoadFile )
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
BITMAP2CMP_FRAME::BITMAP2CMP_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
||||
KIWAY_PLAYER( aKiway, aParent, FRAME_BM2CMP, _( "Image Converter" ), wxDefaultPosition,
|
||||
wxDefaultSize, wxDEFAULT_FRAME_STYLE, wxT( "bitmap2cmp" ), unityScale ),
|
||||
m_panel( nullptr ),
|
||||
m_statusBar( nullptr )
|
||||
{
|
||||
m_aboutTitle = _HKI( "KiCad Image Converter" );
|
||||
|
||||
// Give an icon
|
||||
wxIcon icon;
|
||||
wxIconBundle icon_bundle;
|
||||
|
@ -163,10 +166,20 @@ BITMAP2CMP_FRAME::BITMAP2CMP_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
|||
|
||||
m_statusBar = this->CreateStatusBar( 1, wxSTB_SIZEGRIP, wxID_ANY );
|
||||
|
||||
ReCreateMenuBar();
|
||||
|
||||
LoadSettings( config() );
|
||||
|
||||
m_toolManager = new TOOL_MANAGER;
|
||||
m_toolManager->SetEnvironment( nullptr, nullptr, nullptr, config(), this );
|
||||
|
||||
m_toolDispatcher = new TOOL_DISPATCHER( m_toolManager );
|
||||
|
||||
// Register tools
|
||||
m_toolManager->RegisterTool( new COMMON_CONTROL );
|
||||
m_toolManager->RegisterTool( new BITMAP2CMP_CONTROL );
|
||||
m_toolManager->InitTools();
|
||||
|
||||
ReCreateMenuBar();
|
||||
|
||||
GetSizer()->SetSizeHints( this );
|
||||
|
||||
SetSize( m_framePos.x, m_framePos.y, m_frameSize.x, m_frameSize.y );
|
||||
|
@ -195,41 +208,95 @@ wxWindow* BITMAP2CMP_FRAME::GetToolCanvas() const
|
|||
|
||||
void BITMAP2CMP_FRAME::doReCreateMenuBar()
|
||||
{
|
||||
// wxWidgets handles the Mac Application menu behind the scenes, but that means
|
||||
COMMON_CONTROL* tool = m_toolManager->GetTool<COMMON_CONTROL>();
|
||||
EDA_BASE_FRAME* base_frame = dynamic_cast<EDA_BASE_FRAME*>( this );
|
||||
|
||||
// base_frame == nullptr should not happen, but it makes Coverity happy
|
||||
wxCHECK( base_frame, /* void */ );
|
||||
|
||||
// wxWidgets handles the OSX Application menu behind the scenes, but that means
|
||||
// we always have to start from scratch with a new wxMenuBar.
|
||||
wxMenuBar* oldMenuBar = GetMenuBar();
|
||||
wxMenuBar* menuBar = new wxMenuBar();
|
||||
wxMenuBar* oldMenuBar = base_frame->GetMenuBar();
|
||||
WX_MENUBAR* menuBar = new WX_MENUBAR();
|
||||
|
||||
wxMenu* fileMenu = new wxMenu;
|
||||
//-- File menu -----------------------------------------------------------
|
||||
//
|
||||
ACTION_MENU* fileMenu = new ACTION_MENU( false, tool );
|
||||
|
||||
wxMenuItem* item = new wxMenuItem( fileMenu, wxID_OPEN, _( "Open..." ) + wxT( "\tCtrl+O" ),
|
||||
_( "Load source image" ) );
|
||||
fileMenu->Add( ACTIONS::open );
|
||||
|
||||
fileMenu->Append( item );
|
||||
|
||||
#ifndef __WXMAC__
|
||||
// Mac moves Quit to the App menu so we don't need a separator on Mac
|
||||
fileMenu->AppendSeparator();
|
||||
#endif
|
||||
fileMenu->AddQuit( _( "Image Converter" ) );
|
||||
|
||||
item = new wxMenuItem( fileMenu, wxID_EXIT, _( "Quit" ) + wxT( "\tCtrl+Q" ),
|
||||
_( "Quit Image Converter" ) );
|
||||
//-- Preferences menu -----------------------------------------------
|
||||
//
|
||||
ACTION_MENU* prefsMenu = new ACTION_MENU( false, tool );
|
||||
|
||||
if( Pgm().GetCommonSettings()->m_Appearance.use_icons_in_menus )
|
||||
item->SetBitmap( KiBitmap( BITMAPS::exit ) );
|
||||
// We can't use ACTIONS::showPreferences yet because wxWidgets moves this on
|
||||
// Mac, and it needs the wxID_PREFERENCES id to find it.
|
||||
prefsMenu->Add( _( "Preferences..." ) + "\tCtrl+,",
|
||||
_( "Show preferences for all open tools" ),
|
||||
wxID_PREFERENCES,
|
||||
BITMAPS::preference );
|
||||
|
||||
fileMenu->Append( item );
|
||||
prefsMenu->AppendSeparator();
|
||||
AddMenuLanguageList( prefsMenu, tool );
|
||||
|
||||
|
||||
//-- Menubar -------------------------------------------------------------
|
||||
//
|
||||
menuBar->Append( fileMenu, _( "&File" ) );
|
||||
menuBar->Append( prefsMenu, _( "&Preferences" ) );
|
||||
base_frame->AddStandardHelpMenu( menuBar );
|
||||
|
||||
SetMenuBar( menuBar );
|
||||
base_frame->SetMenuBar( menuBar );
|
||||
delete oldMenuBar;
|
||||
}
|
||||
|
||||
|
||||
void BITMAP2CMP_FRAME::OnExit( wxCommandEvent& event )
|
||||
void BITMAP2CMP_FRAME::ShowChangedLanguage()
|
||||
{
|
||||
Destroy();
|
||||
EDA_BASE_FRAME::ShowChangedLanguage();
|
||||
|
||||
UpdateTitle();
|
||||
|
||||
SaveSettings( config() );
|
||||
IMAGE_SIZE imageSizeX = m_panel->GetOutputSizeX();
|
||||
IMAGE_SIZE imageSizeY = m_panel->GetOutputSizeY();
|
||||
Freeze();
|
||||
|
||||
wxSizer* mainSizer = m_panel->GetContainingSizer();
|
||||
mainSizer->Detach( m_panel );
|
||||
m_panel->Destroy();
|
||||
|
||||
m_panel = new BITMAP2CMP_PANEL( this );
|
||||
mainSizer->Add( m_panel, 1, wxEXPAND, 5 );
|
||||
Layout();
|
||||
|
||||
if( !m_bitmapFileName.IsEmpty() )
|
||||
OpenProjectFiles( std::vector<wxString>( 1, m_bitmapFileName ) );
|
||||
|
||||
LoadSettings( config() );
|
||||
m_panel->SetOutputSize( imageSizeX, imageSizeY );
|
||||
|
||||
Thaw();
|
||||
Refresh();
|
||||
}
|
||||
|
||||
|
||||
void BITMAP2CMP_FRAME::UpdateTitle()
|
||||
{
|
||||
wxString title;
|
||||
|
||||
if( !m_bitmapFileName.IsEmpty() )
|
||||
{
|
||||
wxFileName filename( m_bitmapFileName );
|
||||
title = filename.GetFullName() + wxT( " \u2014 " );
|
||||
}
|
||||
|
||||
title += _( "Image Converter" );
|
||||
|
||||
SetTitle( title );
|
||||
}
|
||||
|
||||
|
||||
|
@ -263,7 +330,7 @@ void BITMAP2CMP_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg )
|
|||
}
|
||||
|
||||
|
||||
void BITMAP2CMP_FRAME::OnLoadFile( wxCommandEvent& event )
|
||||
void BITMAP2CMP_FRAME::OnLoadFile()
|
||||
{
|
||||
wxFileName fn( m_bitmapFileName );
|
||||
wxString path = fn.GetPath();
|
||||
|
@ -288,6 +355,7 @@ void BITMAP2CMP_FRAME::OnLoadFile( wxCommandEvent& event )
|
|||
fn = fullFilename;
|
||||
m_mruPath = fn.GetPath();
|
||||
SetStatusText( fullFilename );
|
||||
UpdateTitle();
|
||||
Refresh();
|
||||
}
|
||||
|
||||
|
|
|
@ -31,59 +31,6 @@
|
|||
|
||||
class BITMAP2CMP_PANEL;
|
||||
|
||||
class IMAGE_SIZE
|
||||
{
|
||||
public:
|
||||
IMAGE_SIZE();
|
||||
|
||||
// Set the unit used for m_outputSize, and convert the old m_outputSize value
|
||||
// to the value in new unit
|
||||
void SetUnit( EDA_UNITS aUnit );
|
||||
|
||||
// Accessors:
|
||||
void SetOriginalDPI( int aDPI )
|
||||
{
|
||||
m_originalDPI = aDPI;
|
||||
}
|
||||
|
||||
void SetOriginalSizePixels( int aPixels )
|
||||
{
|
||||
m_originalSizePixels = aPixels;
|
||||
}
|
||||
|
||||
double GetOutputSize()
|
||||
{
|
||||
return m_outputSize;
|
||||
}
|
||||
|
||||
void SetOutputSize( double aSize, EDA_UNITS aUnit )
|
||||
{
|
||||
m_unit = aUnit;
|
||||
m_outputSize = aSize;
|
||||
}
|
||||
|
||||
int GetOriginalSizePixels()
|
||||
{
|
||||
return m_originalSizePixels;
|
||||
}
|
||||
|
||||
// Set the m_outputSize value from the m_originalSizePixels and the selected unit
|
||||
void SetOutputSizeFromInitialImageSize();
|
||||
|
||||
/** @return the pixels per inch value to build the output image.
|
||||
* It is used by potrace to build the polygonal image
|
||||
*/
|
||||
int GetOutputDPI();
|
||||
|
||||
private:
|
||||
EDA_UNITS m_unit; // The units for m_outputSize (mm, inch, dpi)
|
||||
double m_outputSize; // The size in m_unit of the output image, depending on
|
||||
// the user settings. Set to the initial image size
|
||||
int m_originalDPI; // The image DPI if specified in file, or 0 if unknown
|
||||
int m_originalSizePixels; // The original image size read from file, in pixels
|
||||
};
|
||||
|
||||
|
||||
class BITMAP2CMP_FRAME : public KIWAY_PLAYER
|
||||
{
|
||||
public:
|
||||
|
@ -94,7 +41,7 @@ public:
|
|||
bool OpenProjectFiles( const std::vector<wxString>& aFilenames, int aCtl = 0 ) override;
|
||||
|
||||
void OnExit( wxCommandEvent& event );
|
||||
void OnLoadFile( wxCommandEvent& event );
|
||||
void OnLoadFile();
|
||||
|
||||
/**
|
||||
* Generate a schematic library which contains one component:
|
||||
|
@ -117,13 +64,14 @@ public:
|
|||
*/
|
||||
void ExportLogo();
|
||||
|
||||
void UpdateTitle();
|
||||
void ShowChangedLanguage() override;
|
||||
|
||||
void LoadSettings( APP_SETTINGS_BASE* aCfg ) override;
|
||||
void SaveSettings( APP_SETTINGS_BASE* aCfg ) override;
|
||||
|
||||
wxWindow* GetToolCanvas() const override;
|
||||
|
||||
DECLARE_EVENT_TABLE()
|
||||
|
||||
protected:
|
||||
void doReCreateMenuBar() override;
|
||||
|
||||
|
@ -134,4 +82,5 @@ private:
|
|||
wxString m_bitmapFileName;
|
||||
wxString m_convertedFileName;
|
||||
};
|
||||
|
||||
#endif// BITMOP2CMP_GUI_H_
|
||||
|
|
|
@ -44,7 +44,8 @@
|
|||
|
||||
BITMAP2CMP_PANEL::BITMAP2CMP_PANEL( BITMAP2CMP_FRAME* aParent ) :
|
||||
BITMAP2CMP_PANEL_BASE( aParent ),
|
||||
m_parentFrame( aParent )
|
||||
m_parentFrame( aParent ), m_negative( false ),
|
||||
m_aspectRatio( 1.0 )
|
||||
{
|
||||
for( wxString unit : { _( "mm" ), _( "Inch" ), _( "DPI" ) } )
|
||||
m_PixelUnit->Append( unit );
|
||||
|
@ -84,10 +85,10 @@ void BITMAP2CMP_PANEL::LoadSettings( BITMAP2CMP_SETTINGS* cfg )
|
|||
|
||||
m_sliderThreshold->SetValue( cfg->m_Threshold );
|
||||
|
||||
m_Negative = cfg->m_Negative;
|
||||
m_negative = cfg->m_Negative;
|
||||
m_checkNegative->SetValue( cfg->m_Negative );
|
||||
|
||||
m_AspectRatio = 1.0;
|
||||
m_aspectRatio = 1.0;
|
||||
m_aspectRatioCheckbox->SetValue( true );
|
||||
|
||||
int format = cfg->m_LastFormat;
|
||||
|
@ -177,7 +178,7 @@ void BITMAP2CMP_PANEL::OnPaintBW( wxPaintEvent& event )
|
|||
|
||||
void BITMAP2CMP_PANEL::OnLoadFile( wxCommandEvent& event )
|
||||
{
|
||||
m_parentFrame->OnLoadFile( event );
|
||||
m_parentFrame->OnLoadFile();
|
||||
}
|
||||
|
||||
|
||||
|
@ -217,7 +218,7 @@ bool BITMAP2CMP_PANEL::OpenProjectFiles( const std::vector<wxString>& aFileSet,
|
|||
|
||||
int h = m_Pict_Bitmap.GetHeight();
|
||||
int w = m_Pict_Bitmap.GetWidth();
|
||||
m_AspectRatio = (double) w / h;
|
||||
m_aspectRatio = (double) w / h;
|
||||
|
||||
m_outputSizeX.SetOriginalDPI( imageDPIx );
|
||||
m_outputSizeX.SetOriginalSizePixels( w );
|
||||
|
@ -253,7 +254,7 @@ bool BITMAP2CMP_PANEL::OpenProjectFiles( const std::vector<wxString>& aFileSet,
|
|||
}
|
||||
}
|
||||
|
||||
if( m_Negative )
|
||||
if( m_negative )
|
||||
NegateGreyscaleImage( );
|
||||
|
||||
m_Greyscale_Bitmap = wxBitmap( m_Greyscale_Image );
|
||||
|
@ -326,7 +327,7 @@ void BITMAP2CMP_PANEL::OnSizeChangeX( wxCommandEvent& event )
|
|||
{
|
||||
if( m_aspectRatioCheckbox->GetValue() )
|
||||
{
|
||||
double calculatedY = new_size / m_AspectRatio;
|
||||
double calculatedY = new_size / m_aspectRatio;
|
||||
|
||||
if( getUnitFromSelection() == EDA_UNITS::UNSCALED )
|
||||
{
|
||||
|
@ -355,7 +356,7 @@ void BITMAP2CMP_PANEL::OnSizeChangeY( wxCommandEvent& event )
|
|||
{
|
||||
if( m_aspectRatioCheckbox->GetValue() )
|
||||
{
|
||||
double calculatedX = new_size * m_AspectRatio;
|
||||
double calculatedX = new_size * m_aspectRatio;
|
||||
|
||||
if( getUnitFromSelection() == EDA_UNITS::UNSCALED )
|
||||
{
|
||||
|
@ -387,6 +388,17 @@ void BITMAP2CMP_PANEL::OnSizeUnitChange( wxCommandEvent& event )
|
|||
}
|
||||
|
||||
|
||||
void BITMAP2CMP_PANEL::SetOutputSize( const IMAGE_SIZE& aSizeX, const IMAGE_SIZE& aSizeY )
|
||||
{
|
||||
m_outputSizeX = aSizeX;
|
||||
m_outputSizeY = aSizeY;
|
||||
updateImageInfo();
|
||||
|
||||
m_UnitSizeX->ChangeValue( FormatOutputSize( m_outputSizeX.GetOutputSize() ) );
|
||||
m_UnitSizeY->ChangeValue( FormatOutputSize( m_outputSizeY.GetOutputSize() ) );
|
||||
}
|
||||
|
||||
|
||||
void BITMAP2CMP_PANEL::ToggleAspectRatioLock( wxCommandEvent& event )
|
||||
{
|
||||
if( m_aspectRatioCheckbox->GetValue() )
|
||||
|
@ -447,13 +459,13 @@ void BITMAP2CMP_PANEL::NegateGreyscaleImage( )
|
|||
|
||||
void BITMAP2CMP_PANEL::OnNegativeClicked( wxCommandEvent& )
|
||||
{
|
||||
if( m_checkNegative->GetValue() != m_Negative )
|
||||
if( m_checkNegative->GetValue() != m_negative )
|
||||
{
|
||||
NegateGreyscaleImage();
|
||||
|
||||
m_Greyscale_Bitmap = wxBitmap( m_Greyscale_Image );
|
||||
Binarize( (double)m_sliderThreshold->GetValue()/m_sliderThreshold->GetMax() );
|
||||
m_Negative = m_checkNegative->GetValue();
|
||||
m_negative = m_checkNegative->GetValue();
|
||||
|
||||
Refresh();
|
||||
}
|
||||
|
|
|
@ -31,6 +31,59 @@ class BITMAP2CMP_FRAME;
|
|||
class BITMAP2CMP_SETTINGS;
|
||||
|
||||
|
||||
class IMAGE_SIZE
|
||||
{
|
||||
public:
|
||||
IMAGE_SIZE();
|
||||
|
||||
// Set the unit used for m_outputSize, and convert the old m_outputSize value
|
||||
// to the value in new unit
|
||||
void SetUnit( EDA_UNITS aUnit );
|
||||
|
||||
// Accessors:
|
||||
void SetOriginalDPI( int aDPI )
|
||||
{
|
||||
m_originalDPI = aDPI;
|
||||
}
|
||||
|
||||
void SetOriginalSizePixels( int aPixels )
|
||||
{
|
||||
m_originalSizePixels = aPixels;
|
||||
}
|
||||
|
||||
double GetOutputSize()
|
||||
{
|
||||
return m_outputSize;
|
||||
}
|
||||
|
||||
void SetOutputSize( double aSize, EDA_UNITS aUnit )
|
||||
{
|
||||
m_unit = aUnit;
|
||||
m_outputSize = aSize;
|
||||
}
|
||||
|
||||
int GetOriginalSizePixels()
|
||||
{
|
||||
return m_originalSizePixels;
|
||||
}
|
||||
|
||||
// Set the m_outputSize value from the m_originalSizePixels and the selected unit
|
||||
void SetOutputSizeFromInitialImageSize();
|
||||
|
||||
/** @return the pixels per inch value to build the output image.
|
||||
* It is used by potrace to build the polygonal image
|
||||
*/
|
||||
int GetOutputDPI();
|
||||
|
||||
private:
|
||||
EDA_UNITS m_unit; // The units for m_outputSize (mm, inch, dpi)
|
||||
double m_outputSize; // The size in m_unit of the output image, depending on
|
||||
// the user settings. Set to the initial image size
|
||||
int m_originalDPI; // The image DPI if specified in file, or 0 if unknown
|
||||
int m_originalSizePixels; // The original image size read from file, in pixels
|
||||
};
|
||||
|
||||
|
||||
class BITMAP2CMP_PANEL : public BITMAP2CMP_PANEL_BASE
|
||||
{
|
||||
public:
|
||||
|
@ -46,6 +99,10 @@ public:
|
|||
|
||||
wxWindow* GetCurrentPage();
|
||||
|
||||
IMAGE_SIZE GetOutputSizeX() const { return m_outputSizeX; }
|
||||
IMAGE_SIZE GetOutputSizeY() const { return m_outputSizeY; }
|
||||
void SetOutputSize( const IMAGE_SIZE& aSizeX, const IMAGE_SIZE& aSizeY );
|
||||
|
||||
/**
|
||||
* generate a export data of the current bitmap.
|
||||
* @param aOutput is a string buffer to fill with data
|
||||
|
@ -94,7 +151,7 @@ private:
|
|||
wxBitmap m_BN_Bitmap;
|
||||
IMAGE_SIZE m_outputSizeX;
|
||||
IMAGE_SIZE m_outputSizeY;
|
||||
bool m_Negative;
|
||||
double m_AspectRatio;
|
||||
bool m_negative;
|
||||
double m_aspectRatio;
|
||||
};
|
||||
#endif// BITMAP2CMP_PANEL
|
||||
|
|
|
@ -235,6 +235,17 @@ void ACTION_MENU::AddQuitOrClose( KIFACE_BASE* aKiface, wxString aAppname )
|
|||
}
|
||||
|
||||
|
||||
void ACTION_MENU::AddQuit( const wxString& aAppname )
|
||||
{
|
||||
// Don't use ACTIONS::quit; wxWidgets moves this on OSX and expects to find it via
|
||||
// wxID_EXIT
|
||||
Add( _( "Quit" ) + wxS( "\tCtrl+Q" ),
|
||||
wxString::Format( _( "Quit %s" ), aAppname ),
|
||||
wxID_EXIT,
|
||||
BITMAPS::exit );
|
||||
}
|
||||
|
||||
|
||||
void ACTION_MENU::Clear()
|
||||
{
|
||||
m_titleDisplayed = false;
|
||||
|
|
|
@ -39,7 +39,8 @@ class SIMULATOR_CONTROL : public wxEvtHandler, public TOOL_INTERACTIVE
|
|||
{
|
||||
public:
|
||||
SIMULATOR_CONTROL() :
|
||||
TOOL_INTERACTIVE( "eeschema.SimulatorControl" ), m_simulatorFrame( nullptr ),
|
||||
TOOL_INTERACTIVE( "eeschema.SimulatorControl" ),
|
||||
m_simulatorFrame( nullptr ),
|
||||
m_schematicFrame( nullptr )
|
||||
{ }
|
||||
|
||||
|
|
|
@ -121,13 +121,22 @@ public:
|
|||
/**
|
||||
* Add either a standard Quit or Close item to the menu.
|
||||
*
|
||||
* If \a aKiface is NULL or in single-instance then quit (wxID_QUIT) is used, otherwise
|
||||
* If \a aKiface is NULL or in single-instance then quit (wxID_EXIT) is used, otherwise
|
||||
* close (wxID_CLOSE) is used.
|
||||
*
|
||||
* @param aAppname is the application name to append to the tooltip.
|
||||
*/
|
||||
void AddQuitOrClose( KIFACE_BASE* aKiface, wxString aAppname = "" );
|
||||
|
||||
/**
|
||||
* Add a standard Quit item to the menu.
|
||||
*
|
||||
* Emits the wxID_EXIT event.
|
||||
*
|
||||
* @param aAppname is the application name to append to the tooltip.
|
||||
*/
|
||||
void AddQuit( const wxString& aAppname = "" );
|
||||
|
||||
/**
|
||||
* Remove all the entries from the menu (as well as its title).
|
||||
*
|
||||
|
|
|
@ -10,6 +10,7 @@ include_directories(
|
|||
set( PCB_CALCULATOR_SRCS
|
||||
common_data.cpp
|
||||
params_read_write.cpp
|
||||
pcb_calculator_control.cpp
|
||||
pcb_calculator_frame.cpp
|
||||
pcb_calculator_settings.cpp
|
||||
datafile_read_write.cpp
|
||||
|
|
|
@ -0,0 +1,54 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2023 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 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
|
||||
*/
|
||||
|
||||
#include <kiway.h>
|
||||
#include <tool/tool_manager.h>
|
||||
#include <tool/actions.h>
|
||||
#include <pcb_calculator_frame.h>
|
||||
#include <pcb_calculator_control.h>
|
||||
|
||||
|
||||
bool PCB_CALCULATOR_CONTROL::Init()
|
||||
{
|
||||
Reset( MODEL_RELOAD );
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void PCB_CALCULATOR_CONTROL::Reset( RESET_REASON aReason )
|
||||
{
|
||||
m_frame = getEditFrame<PCB_CALCULATOR_FRAME>();
|
||||
}
|
||||
|
||||
|
||||
int PCB_CALCULATOR_CONTROL::Close( const TOOL_EVENT& aEvent )
|
||||
{
|
||||
m_frame->Close();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void PCB_CALCULATOR_CONTROL::setTransitions()
|
||||
{
|
||||
Go( &PCB_CALCULATOR_CONTROL::Close, ACTIONS::quit.MakeEvent() );
|
||||
}
|
|
@ -0,0 +1,63 @@
|
|||
/*
|
||||
* This program source code file is part of KiCad, a free EDA CAD application.
|
||||
*
|
||||
* Copyright (C) 2023 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 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
|
||||
*/
|
||||
|
||||
|
||||
#ifndef PCB_CALCULATOR_CONTROL_H
|
||||
#define PCB_CALCULATOR_CONTROL_H
|
||||
|
||||
#include "tool/tool_interactive.h"
|
||||
|
||||
class PCB_CALCULATOR_FRAME;
|
||||
|
||||
|
||||
/**
|
||||
* Handle actions for the various symbol editor and viewers.
|
||||
*/
|
||||
class PCB_CALCULATOR_CONTROL : public wxEvtHandler, public TOOL_INTERACTIVE
|
||||
{
|
||||
public:
|
||||
PCB_CALCULATOR_CONTROL() :
|
||||
TOOL_INTERACTIVE( "pcb_calculator.Control" ),
|
||||
m_frame( nullptr )
|
||||
{ }
|
||||
|
||||
virtual ~PCB_CALCULATOR_CONTROL() { }
|
||||
|
||||
/// @copydoc TOOL_INTERACTIVE::Init()
|
||||
bool Init() override;
|
||||
|
||||
/// @copydoc TOOL_INTERACTIVE::Reset()
|
||||
void Reset( RESET_REASON aReason ) override;
|
||||
|
||||
int Close( const TOOL_EVENT& aEvent );
|
||||
|
||||
private:
|
||||
///< Set up handlers for various events.
|
||||
void setTransitions() override;
|
||||
|
||||
private:
|
||||
PCB_CALCULATOR_FRAME* m_frame;
|
||||
};
|
||||
|
||||
|
||||
#endif // PCB_CALCULATOR_CONTROL_H
|
|
@ -27,9 +27,14 @@
|
|||
#include <bitmap_store.h>
|
||||
#include <geometry/shape_poly_set.h>
|
||||
#include <kiface_base.h>
|
||||
#include <menus_helpers.h>
|
||||
#include <tool/tool_manager.h>
|
||||
#include <tool/tool_dispatcher.h>
|
||||
#include <tool/common_control.h>
|
||||
#include <attenuators/attenuator_classes.h>
|
||||
#include <pcb_calculator_frame.h>
|
||||
#include <pcb_calculator_settings.h>
|
||||
#include <pcb_calculator_control.h>
|
||||
|
||||
#include <calculator_panels/panel_rf_attenuators.h>
|
||||
#include <calculator_panels/panel_board_class.h>
|
||||
|
@ -44,6 +49,7 @@
|
|||
#include <calculator_panels/panel_transline.h>
|
||||
#include <calculator_panels/panel_via_size.h>
|
||||
#include <calculator_panels/panel_wavelength.h>
|
||||
#include "widgets/wx_menubar.h"
|
||||
|
||||
|
||||
PCB_CALCULATOR_FRAME::PCB_CALCULATOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
||||
|
@ -53,6 +59,8 @@ PCB_CALCULATOR_FRAME::PCB_CALCULATOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
|||
wxT( "calculator_tools" ), unityScale ),
|
||||
m_lastNotebookPage( -1 )
|
||||
{
|
||||
m_aboutTitle = _HKI( "KiCad Calculator Tools" );
|
||||
|
||||
SHAPE_POLY_SET dummy; // A ugly trick to force the linker to include
|
||||
// some methods in code and avoid link errors
|
||||
|
||||
|
@ -68,35 +76,7 @@ PCB_CALCULATOR_FRAME::PCB_CALCULATOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
|||
Layout();
|
||||
Centre( wxBOTH );
|
||||
|
||||
m_treebook->AddPage( nullptr, _( "General system design" ) );
|
||||
|
||||
AddCalculator( new PANEL_REGULATOR( m_treebook ), _( "Regulators" ) );
|
||||
|
||||
m_treebook->AddPage( nullptr, _( "Power, current and isolation" ) );
|
||||
|
||||
AddCalculator( new PANEL_ELECTRICAL_SPACING( m_treebook ), _( "Electrical Spacing" ) );
|
||||
AddCalculator( new PANEL_VIA_SIZE( m_treebook ), _( "Via Size" ) );
|
||||
AddCalculator( new PANEL_TRACK_WIDTH( m_treebook ), _( "Track Width" ) );
|
||||
AddCalculator( new PANEL_FUSING_CURRENT( m_treebook ), _( "Fusing Current" ) );
|
||||
AddCalculator( new PANEL_CABLE_SIZE( m_treebook ), _( "Cable Size" ) );
|
||||
|
||||
m_treebook->AddPage( nullptr, _( "High speed" ) );
|
||||
|
||||
AddCalculator( new PANEL_WAVELENGTH( m_treebook ), _( "Wavelength" ) );
|
||||
AddCalculator( new PANEL_RF_ATTENUATORS( m_treebook ), _( "RF Attenuators" ) );
|
||||
AddCalculator( new PANEL_TRANSLINE( m_treebook ), _( "Transmission Lines") );
|
||||
|
||||
m_treebook->AddPage( nullptr, _( "Memo" ) );
|
||||
|
||||
AddCalculator( new PANEL_E_SERIES( m_treebook ), _( "E-Series" ) );
|
||||
AddCalculator( new PANEL_COLOR_CODE( m_treebook ), _( "Color Code" ) );
|
||||
AddCalculator( new PANEL_BOARD_CLASS( m_treebook ), _("Board Classes") );
|
||||
AddCalculator( new PANEL_GALVANIC_CORROSION( m_treebook ), _( "Galvanic Corrosion" ) );
|
||||
|
||||
LoadSettings( config() );
|
||||
|
||||
if( PANEL_REGULATOR* regPanel = GetCalculator<PANEL_REGULATOR>() )
|
||||
regPanel->ReadDataFile();
|
||||
loadPages();
|
||||
|
||||
// Give an icon
|
||||
wxIcon icon;
|
||||
|
@ -111,6 +91,18 @@ PCB_CALCULATOR_FRAME::PCB_CALCULATOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
|
|||
|
||||
SetIcons( icon_bundle );
|
||||
|
||||
m_toolManager = new TOOL_MANAGER;
|
||||
m_toolManager->SetEnvironment( nullptr, nullptr, nullptr, config(), this );
|
||||
|
||||
m_toolDispatcher = new TOOL_DISPATCHER( m_toolManager );
|
||||
|
||||
// Register tools
|
||||
m_toolManager->RegisterTool( new COMMON_CONTROL );
|
||||
m_toolManager->RegisterTool( new PCB_CALCULATOR_CONTROL );
|
||||
m_toolManager->InitTools();
|
||||
|
||||
ReCreateMenuBar();
|
||||
|
||||
GetSizer()->SetSizeHints( this );
|
||||
|
||||
// Set previous size and position
|
||||
|
@ -144,6 +136,110 @@ PCB_CALCULATOR_FRAME::~PCB_CALCULATOR_FRAME()
|
|||
this->Freeze();
|
||||
}
|
||||
|
||||
|
||||
void PCB_CALCULATOR_FRAME::loadPages()
|
||||
{
|
||||
m_treebook->AddPage( nullptr, _( "General system design" ) );
|
||||
|
||||
AddCalculator( new PANEL_REGULATOR( m_treebook ), _( "Regulators" ) );
|
||||
|
||||
m_treebook->AddPage( nullptr, _( "Power, current and isolation" ) );
|
||||
|
||||
AddCalculator( new PANEL_ELECTRICAL_SPACING( m_treebook ), _( "Electrical Spacing" ) );
|
||||
AddCalculator( new PANEL_VIA_SIZE( m_treebook ), _( "Via Size" ) );
|
||||
AddCalculator( new PANEL_TRACK_WIDTH( m_treebook ), _( "Track Width" ) );
|
||||
AddCalculator( new PANEL_FUSING_CURRENT( m_treebook ), _( "Fusing Current" ) );
|
||||
AddCalculator( new PANEL_CABLE_SIZE( m_treebook ), _( "Cable Size" ) );
|
||||
|
||||
m_treebook->AddPage( nullptr, _( "High Speed" ) );
|
||||
|
||||
AddCalculator( new PANEL_WAVELENGTH( m_treebook ), _( "Wavelength" ) );
|
||||
AddCalculator( new PANEL_RF_ATTENUATORS( m_treebook ), _( "RF Attenuators" ) );
|
||||
AddCalculator( new PANEL_TRANSLINE( m_treebook ), _( "Transmission Lines") );
|
||||
|
||||
m_treebook->AddPage( nullptr, _( "Memo" ) );
|
||||
|
||||
AddCalculator( new PANEL_E_SERIES( m_treebook ), _( "E-Series" ) );
|
||||
AddCalculator( new PANEL_COLOR_CODE( m_treebook ), _( "Color Code" ) );
|
||||
AddCalculator( new PANEL_BOARD_CLASS( m_treebook ), _( "Board Classes" ) );
|
||||
AddCalculator( new PANEL_GALVANIC_CORROSION( m_treebook ), _( "Galvanic Corrosion" ) );
|
||||
|
||||
LoadSettings( config() );
|
||||
|
||||
if( PANEL_REGULATOR* regPanel = GetCalculator<PANEL_REGULATOR>() )
|
||||
regPanel->ReadDataFile();
|
||||
}
|
||||
|
||||
|
||||
void PCB_CALCULATOR_FRAME::doReCreateMenuBar()
|
||||
{
|
||||
COMMON_CONTROL* tool = m_toolManager->GetTool<COMMON_CONTROL>();
|
||||
EDA_BASE_FRAME* base_frame = dynamic_cast<EDA_BASE_FRAME*>( this );
|
||||
|
||||
// base_frame == nullptr should not happen, but it makes Coverity happy
|
||||
wxCHECK( base_frame, /* void */ );
|
||||
|
||||
// wxWidgets handles the OSX Application menu behind the scenes, but that means
|
||||
// we always have to start from scratch with a new wxMenuBar.
|
||||
wxMenuBar* oldMenuBar = base_frame->GetMenuBar();
|
||||
WX_MENUBAR* menuBar = new WX_MENUBAR();
|
||||
|
||||
//-- File menu -----------------------------------------------------------
|
||||
//
|
||||
ACTION_MENU* fileMenu = new ACTION_MENU( false, tool );
|
||||
|
||||
fileMenu->AddQuit( _( "Calculator Tools" ) );
|
||||
|
||||
//-- Preferences menu -----------------------------------------------
|
||||
//
|
||||
ACTION_MENU* prefsMenu = new ACTION_MENU( false, tool );
|
||||
|
||||
// We can't use ACTIONS::showPreferences yet because wxWidgets moves this on
|
||||
// Mac, and it needs the wxID_PREFERENCES id to find it.
|
||||
prefsMenu->Add( _( "Preferences..." ) + "\tCtrl+,",
|
||||
_( "Show preferences for all open tools" ),
|
||||
wxID_PREFERENCES,
|
||||
BITMAPS::preference );
|
||||
|
||||
prefsMenu->AppendSeparator();
|
||||
AddMenuLanguageList( prefsMenu, tool );
|
||||
|
||||
|
||||
//-- Menubar -------------------------------------------------------------
|
||||
//
|
||||
menuBar->Append( fileMenu, _( "&File" ) );
|
||||
menuBar->Append( prefsMenu, _( "&Preferences" ) );
|
||||
base_frame->AddStandardHelpMenu( menuBar );
|
||||
|
||||
base_frame->SetMenuBar( menuBar );
|
||||
delete oldMenuBar;
|
||||
}
|
||||
|
||||
|
||||
void PCB_CALCULATOR_FRAME::ShowChangedLanguage()
|
||||
{
|
||||
EDA_BASE_FRAME::ShowChangedLanguage();
|
||||
|
||||
SetTitle( _( "Calculator Tools" ) );
|
||||
|
||||
SaveSettings( config() );
|
||||
Freeze();
|
||||
|
||||
int page = m_treebook->GetSelection();
|
||||
m_treebook->DeleteAllPages();
|
||||
m_panels.clear();
|
||||
|
||||
loadPages();
|
||||
Layout();
|
||||
|
||||
m_treebook->SetSelection( page );
|
||||
LoadSettings( config() );
|
||||
|
||||
Thaw();
|
||||
Refresh();
|
||||
}
|
||||
|
||||
|
||||
void PCB_CALCULATOR_FRAME::OnPageChanged ( wxTreebookEvent& aEvent )
|
||||
{
|
||||
int page = aEvent.GetSelection();
|
||||
|
@ -152,11 +248,14 @@ void PCB_CALCULATOR_FRAME::OnPageChanged ( wxTreebookEvent& aEvent )
|
|||
if ( m_treebook->GetPageParent( page ) == wxNOT_FOUND )
|
||||
{
|
||||
m_treebook->ExpandNode( page );
|
||||
|
||||
// Select the first child
|
||||
if( page + 1 < m_treebook->GetPageCount() )
|
||||
m_treebook->ChangeSelection( page + 1 );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void PCB_CALCULATOR_FRAME::AddCalculator( CALCULATOR_PANEL *aPanel, const wxString& panelUIName )
|
||||
{
|
||||
// Update internal structures
|
||||
|
|
|
@ -63,6 +63,15 @@ public:
|
|||
|
||||
void AddCalculator( CALCULATOR_PANEL *aPanel, const wxString& panelUIName );
|
||||
|
||||
void ShowChangedLanguage() override;
|
||||
|
||||
// Config read-write, virtual from EDA_BASE_FRAME
|
||||
void LoadSettings( APP_SETTINGS_BASE* aCfg ) override;
|
||||
void SaveSettings( APP_SETTINGS_BASE* aCfg ) override;
|
||||
|
||||
protected:
|
||||
void doReCreateMenuBar() override;
|
||||
|
||||
private:
|
||||
// Event handlers
|
||||
void OnClosePcbCalc( wxCloseEvent& event );
|
||||
|
@ -71,9 +80,7 @@ private:
|
|||
|
||||
void onThemeChanged( wxSysColourChangedEvent& aEvent );
|
||||
|
||||
// Config read-write, virtual from EDA_BASE_FRAME
|
||||
void LoadSettings( APP_SETTINGS_BASE* aCfg ) override;
|
||||
void SaveSettings( APP_SETTINGS_BASE* aCfg ) override;
|
||||
void loadPages();
|
||||
|
||||
private:
|
||||
wxBoxSizer* m_mainSizer;
|
||||
|
|
Loading…
Reference in New Issue