diff --git a/pcb_calculator/CMakeLists.txt b/pcb_calculator/CMakeLists.txt
index 2069c9e835..b9fdb3144d 100644
--- a/pcb_calculator/CMakeLists.txt
+++ b/pcb_calculator/CMakeLists.txt
@@ -18,6 +18,8 @@ set( PCB_CALCULATOR_SRCS
calculator_panels/panel_attenuators_base.cpp
calculator_panels/panel_board_class.cpp
calculator_panels/panel_board_class_base.cpp
+ calculator_panels/panel_cable_size.cpp
+ calculator_panels/panel_cable_size_base.cpp
calculator_panels/panel_color_code.cpp
calculator_panels/panel_color_code_base.cpp
calculator_panels/panel_electrical_spacing.cpp
diff --git a/pcb_calculator/calculator_panels/panel_cable_size.cpp b/pcb_calculator/calculator_panels/panel_cable_size.cpp
new file mode 100644
index 0000000000..c75c70f590
--- /dev/null
+++ b/pcb_calculator/calculator_panels/panel_cable_size.cpp
@@ -0,0 +1,402 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 1992-2022 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 .
+ */
+
+#include
+#include
+#include
+#include
+
+#define M2_to_MM2 1000000.0
+
+#define COPPER_RESISTIVITY 1.72e-8 // ohm meter
+#define VACCUM_PERMEABILITY 1.256637e-6
+#define RELATIVE_PERMEABILITY 1
+
+
+CABLE_SIZE_ENTRY::CABLE_SIZE_ENTRY( wxString aName, double aRadius )
+{
+ m_name = aName;
+ m_radius = aRadius;
+}
+
+
+PANEL_CABLE_SIZE::PANEL_CABLE_SIZE( wxWindow* parent, wxWindowID id, const wxPoint& pos,
+ const wxSize& size, long style, const wxString& name ) :
+ PANEL_CABLE_SIZE_BASE( parent, id, pos, size, style, name )
+{
+ m_entries.clear();
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG0000" ), 0.005842 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG000" ), 0.00520192 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG00" ), 0.00463296 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG0" ), 0.00412623 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG1" ), 0.00367411 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG2" ), 0.00327152 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG3" ), 0.00291338 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG4" ), 0.00259461 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG5" ), 0.00231013 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG6" ), 0.00205740 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG7" ), 0.00183261 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG8" ), 0.00163195 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG9" ), 0.00145288 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG10" ), 0.00129413 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG11" ), 0.00115189 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG12" ), 0.00102616 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG13" ), 0.0009144 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG14" ), 0.00081407 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG15" ), 0.00072517 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG16" ), 0.00064516 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG17" ), 0.00057531 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG18" ), 0.00051181 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG19" ), 0.00045593 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG20" ), 0.0004046 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG21" ), 0.00036195 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG22" ), 0.00032258 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG23" ), 0.00028702 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG24" ), 0.00025527 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG25" ), 0.00022773 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG26" ), 0.00020193 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG27" ), 0.00018034 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG28" ), 0.00016002 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG29" ), 0.00014351 ) );
+ m_entries.push_back( CABLE_SIZE_ENTRY( _( "AWG30" ), 0.000127 ) );
+
+ for( CABLE_SIZE_ENTRY entry : m_entries )
+ {
+ m_sizeChoice->Append( entry.m_name );
+ }
+}
+
+
+void PANEL_CABLE_SIZE::OnUpdateUnit( wxCommandEvent& aEvent )
+{
+ printAll();
+}
+
+
+PANEL_CABLE_SIZE::~PANEL_CABLE_SIZE()
+{
+}
+
+
+void PANEL_CABLE_SIZE::SaveSettings( PCB_CALCULATOR_SETTINGS* aCfg )
+{
+ aCfg->m_cableSize.diameterUnit = m_diameterUnit->GetSelection();
+ aCfg->m_cableSize.linResUnit = m_linResistanceUnit->GetSelection();
+ aCfg->m_cableSize.frequencyUnit = m_frequencyUnit->GetSelection();
+ aCfg->m_cableSize.lengthUnit = m_lengthUnit->GetSelection();
+}
+
+
+void PANEL_CABLE_SIZE::LoadSettings( PCB_CALCULATOR_SETTINGS* aCfg )
+{
+ m_diameterUnit->SetSelection( aCfg->m_cableSize.diameterUnit );
+ m_linResistanceUnit->SetSelection( aCfg->m_cableSize.linResUnit );
+ m_frequencyUnit->SetSelection( aCfg->m_cableSize.frequencyUnit );
+ m_lengthUnit->SetSelection( aCfg->m_cableSize.lengthUnit );
+}
+
+void PANEL_CABLE_SIZE::OnSizeChange( wxCommandEvent& aEvent )
+{
+ if( !m_updatingUI )
+ {
+ double value;
+ int index = m_sizeChoice->GetSelection();
+ wxString str;
+
+ if( ( index >= 0 ) && ( index < m_entries.size() ) )
+ {
+ value = m_entries.at( index ).m_radius;
+ updateAll( value );
+ }
+ }
+}
+
+
+void PANEL_CABLE_SIZE::OnDiameterChange( wxCommandEvent& aEvent )
+{
+ if( !m_updatingUI )
+ {
+ m_updatingDiameter = true;
+ double value;
+
+ if( m_diameterCtrl->GetValue().ToDouble( &value ) )
+ {
+ updateAll( value / 2 * m_diameterUnit->GetUnitScale() );
+ m_sizeChoice->SetSelection( -1 );
+ }
+ m_updatingDiameter = false;
+ }
+}
+
+
+void PANEL_CABLE_SIZE::OnLinResistanceChange( wxCommandEvent& aEvent )
+{
+ if( !m_updatingUI )
+ {
+ m_updatingLinResistance = true;
+ double value;
+
+ if( m_linResistanceCtrl->GetValue().ToDouble( &value ) )
+ {
+ updateAll( sqrt( COPPER_RESISTIVITY / ( value * m_linResistanceUnit->GetUnitScale() )
+ / M_PI ) );
+ m_sizeChoice->SetSelection( -1 );
+ }
+ m_updatingLinResistance = false;
+ }
+}
+
+
+void PANEL_CABLE_SIZE::OnAreaChange( wxCommandEvent& aEvent )
+{
+ if( !m_updatingUI )
+ {
+ m_updatingArea = true;
+ double value;
+
+ if( m_areaCtrl->GetValue().ToDouble( &value ) )
+ {
+ updateAll( sqrt( value / M_PI / M2_to_MM2 ) );
+ m_sizeChoice->SetSelection( -1 );
+ }
+ m_updatingArea = false;
+ }
+}
+
+
+void PANEL_CABLE_SIZE::OnFrequencyChange( wxCommandEvent& aEvent )
+{
+ if( !m_updatingUI )
+ {
+ m_updatingFrequency = true;
+ double value;
+
+ if( m_frequencyCtrl->GetValue().ToDouble( &value ) )
+ {
+ updateAll( sqrt( COPPER_RESISTIVITY / value / m_frequencyUnit->GetUnitScale() / M_PI
+ / VACCUM_PERMEABILITY / RELATIVE_PERMEABILITY ) );
+ m_sizeChoice->SetSelection( -1 );
+ }
+ m_updatingFrequency = false;
+ }
+}
+
+
+void PANEL_CABLE_SIZE::OnAmpacityChange( wxCommandEvent& aEvent )
+{
+ if( !m_updatingUI )
+ {
+ m_updatingAmpacity = true;
+ double value;
+
+ if( m_AmpacityCtrl->GetValue().ToDouble( &value ) )
+ {
+ // Based on the 700 circular mils per amp rule of the thumb
+ // The long number is the sq m to circular mils conversion
+ updateAll( sqrt( value * 700 / 1973525241.77 / M_PI ) );
+ m_sizeChoice->SetSelection( -1 );
+ }
+ m_updatingAmpacity = false;
+ }
+}
+
+
+void PANEL_CABLE_SIZE::OnCurrentChange( wxCommandEvent& aEvent )
+{
+ if( !m_updatingUI )
+ {
+ double value;
+ m_updatingCurrent = true;
+
+ if( m_currentCtrl->GetValue().ToDouble( &value ) )
+ {
+ m_current = value;
+ updateApplication();
+ }
+ m_updatingCurrent = false;
+ }
+}
+
+
+void PANEL_CABLE_SIZE::OnLengthChange( wxCommandEvent& aEvent )
+{
+ if( !m_updatingUI )
+ {
+ double value;
+ m_updatingLength = true;
+
+ if( m_lengthCtrl->GetValue().ToDouble( &value ) )
+ {
+ m_length = value * m_lengthUnit->GetUnitScale();
+ updateApplication();
+ }
+ m_updatingLength = false;
+ }
+}
+
+
+void PANEL_CABLE_SIZE::OnResistanceChange( wxCommandEvent& aEvent )
+{
+ if( !m_updatingUI )
+ {
+ double value;
+ m_updatingResistance = true;
+
+ if( m_resistanceCtrl->GetValue().ToDouble( &value ) )
+ {
+ updateAll( sqrt( COPPER_RESISTIVITY / value * m_length / M_PI ) );
+ m_sizeChoice->SetSelection( -1 );
+ }
+ m_updatingResistance = false;
+ }
+}
+
+
+void PANEL_CABLE_SIZE::OnVDropChange( wxCommandEvent& aEvent )
+{
+ if( !m_updatingUI )
+ {
+ double value;
+ m_updatingRVdrop = true;
+
+ if( m_vDropCtrl->GetValue().ToDouble( &value ) )
+ {
+ updateAll( sqrt( COPPER_RESISTIVITY / value * m_length * m_current / M_PI ) );
+ m_sizeChoice->SetSelection( -1 );
+ }
+ m_updatingRVdrop = false;
+ }
+}
+
+
+void PANEL_CABLE_SIZE::OnPowerChange( wxCommandEvent& aEvent )
+{
+ if( !m_updatingUI )
+ {
+ double value;
+ m_updatingPower = true;
+
+ if( m_powerCtrl->GetValue().ToDouble( &value ) )
+ {
+ updateAll(
+ sqrt( COPPER_RESISTIVITY / value * m_length * m_current * m_current / M_PI ) );
+ m_sizeChoice->SetSelection( -1 );
+ }
+ m_updatingPower = false;
+ }
+}
+
+
+void PANEL_CABLE_SIZE::printAll()
+{
+ m_updatingUI = true;
+
+ wxString value;
+
+ if( !m_updatingDiameter )
+ {
+ value = wxString( "" ) << m_diameter / m_diameterUnit->GetUnitScale();
+ m_diameterCtrl->SetValue( value );
+ }
+
+ if( !m_updatingArea )
+ {
+ value = wxString( "" ) << m_area * M2_to_MM2;
+ m_areaCtrl->SetValue( value );
+ }
+
+ if( !m_updatingAmpacity )
+ {
+ value = wxString( "" ) << m_ampacity;
+ m_AmpacityCtrl->SetValue( value );
+ }
+
+ if( !m_updatingFrequency )
+ {
+ value = wxString( "" ) << m_maxFrequency / m_frequencyUnit->GetUnitScale();
+ m_frequencyCtrl->SetValue( value );
+ }
+
+ if( !m_updatingLinResistance )
+ {
+ value = wxString( "" ) << m_linearResistance / m_linResistanceUnit->GetUnitScale();
+ m_linResistanceCtrl->SetValue( value );
+ }
+
+ if( !m_updatingLength )
+ {
+ value = wxString( "" ) << m_length / m_lengthUnit->GetUnitScale();
+ m_lengthCtrl->SetValue( value );
+ }
+
+ if( !m_updatingCurrent )
+ {
+ value = wxString( "" ) << m_current;
+ m_currentCtrl->SetValue( value );
+ }
+
+ if( !m_updatingResistance )
+ {
+ value = wxString( "" ) << m_resistance;
+ m_resistanceCtrl->SetValue( value );
+ }
+
+ if( !m_updatingRVdrop )
+ {
+ value = wxString( "" ) << m_voltageDrop;
+ m_vDropCtrl->SetValue( value );
+ }
+
+ if( !m_updatingPower )
+ {
+ value = wxString( "" ) << m_dissipatedPower;
+ m_powerCtrl->SetValue( value );
+ }
+
+ m_updatingUI = false;
+}
+
+
+void PANEL_CABLE_SIZE::updateAll( double aRadius )
+{
+ // Update wire properties
+ m_diameter = aRadius * 2;
+ m_area = M_PI * aRadius * aRadius;
+ m_linearResistance = COPPER_RESISTIVITY / m_area;
+ // max frequency is when skin depth = radius
+ m_maxFrequency = COPPER_RESISTIVITY
+ / ( M_PI * aRadius * aRadius * VACCUM_PERMEABILITY * RELATIVE_PERMEABILITY );
+
+ // Based on the 700 circular mils per amp rule of the thumb
+ // The long number is the sq m to circular mils conversion
+ m_ampacity = ( m_area * 1973525241.77 ) / 700;
+ // Update application-specific values
+ m_resistance = m_linearResistance * m_length;
+ m_voltageDrop = m_resistance * m_current;
+ m_dissipatedPower = m_voltageDrop * m_current;
+ printAll();
+}
+
+void PANEL_CABLE_SIZE::updateApplication()
+{
+ m_resistance = m_linearResistance * m_length;
+ m_voltageDrop = m_resistance * m_current;
+ m_dissipatedPower = m_voltageDrop * m_current;
+ printAll();
+}
diff --git a/pcb_calculator/calculator_panels/panel_cable_size.h b/pcb_calculator/calculator_panels/panel_cable_size.h
new file mode 100644
index 0000000000..bf2158a14f
--- /dev/null
+++ b/pcb_calculator/calculator_panels/panel_cable_size.h
@@ -0,0 +1,104 @@
+/*
+ * This program source code file is part of KICAD, a free EDA CAD application.
+ *
+ * Copyright (C) 1992-2022 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 .
+ */
+
+#ifndef PANEL_CABLE_SIZE_H
+#define PANEL_CABLE_SIZE_H
+
+#include "panel_cable_size_base.h"
+#include
+
+class PCB_CALCULATOR_SETTINGS;
+
+class CABLE_SIZE_ENTRY
+{
+public:
+ CABLE_SIZE_ENTRY( wxString aName, double aRadius );
+ wxString m_name;
+ double m_radius; // stored in m
+};
+
+class PANEL_CABLE_SIZE : public PANEL_CABLE_SIZE_BASE
+{
+public:
+ PANEL_CABLE_SIZE( wxWindow* parent, wxWindowID id = wxID_ANY,
+ const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
+ long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+ ~PANEL_CABLE_SIZE();
+
+ // Methods from CALCULATOR_PANEL that must be overriden
+ void LoadSettings( PCB_CALCULATOR_SETTINGS* aCfg ) override;
+ void SaveSettings( PCB_CALCULATOR_SETTINGS* aCfg ) override;
+ void ThemeChanged() override{};
+
+ void OnSizeChange( wxCommandEvent& aEvent );
+ void OnUpdateUnit( wxCommandEvent& aEvent );
+
+ void OnDiameterChange( wxCommandEvent& aEvent );
+ void OnAreaChange( wxCommandEvent& aEvent );
+ void OnLinResistanceChange( wxCommandEvent& aEvent );
+ void OnFrequencyChange( wxCommandEvent& aEvent );
+ void OnAmpacityChange( wxCommandEvent& aEvent );
+ void OnCurrentChange( wxCommandEvent& aEvent );
+ void OnLengthChange( wxCommandEvent& aEvent );
+ void OnResistanceChange( wxCommandEvent& aEvent );
+ void OnVDropChange( wxCommandEvent& aEvent );
+ void OnPowerChange( wxCommandEvent& aEvent );
+
+private:
+ bool m_updatingUI;
+ bool m_updatingDiameter;
+ bool m_updatingArea;
+ bool m_updatingLinResistance;
+ bool m_updatingFrequency;
+ bool m_updatingAmpacity;
+ bool m_updatingCurrent;
+ bool m_updatingLength;
+ bool m_updatingResistance;
+ bool m_updatingRVdrop;
+ bool m_updatingPower;
+ void updateAll( double aRadius );
+ void updateApplication();
+ void printAll();
+
+ bool m_imperial;
+
+
+ std::vector m_entries;
+
+ void onParameterUpdate( wxCommandEvent& aEvent );
+
+ // Stored in normalized units
+ double m_diameter;
+ double m_current;
+ double m_length;
+ double m_area;
+ double m_linearResistance;
+ double m_maxFrequency;
+ double m_resistance;
+ double m_voltageDrop;
+ double m_dissipatedPower;
+ double m_ampacity;
+ /*
+ void updateRow( int aRow, bool aInit=false );
+ void updateRows();
+ void OnUpdateLength();
+*/
+};
+
+#endif
diff --git a/pcb_calculator/calculator_panels/panel_cable_size_base.cpp b/pcb_calculator/calculator_panels/panel_cable_size_base.cpp
new file mode 100644
index 0000000000..469161bdd3
--- /dev/null
+++ b/pcb_calculator/calculator_panels/panel_cable_size_base.cpp
@@ -0,0 +1,222 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version 3.10.1)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO *NOT* EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#include "widgets/unit_selector.h"
+
+#include "panel_cable_size_base.h"
+
+///////////////////////////////////////////////////////////////////////////
+
+PANEL_CABLE_SIZE_BASE::PANEL_CABLE_SIZE_BASE( wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name ) : CALCULATOR_PANEL( parent, id, pos, size, style, name )
+{
+ wxBoxSizer* bSizer6;
+ bSizer6 = new wxBoxSizer( wxVERTICAL );
+
+ wxBoxSizer* bSizer9;
+ bSizer9 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxBoxSizer* bSizer4;
+ bSizer4 = new wxBoxSizer( wxHORIZONTAL );
+
+ wxStaticBoxSizer* sbSizer1;
+ sbSizer1 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Wire properties") ), wxVERTICAL );
+
+ wxGridSizer* gSizer1;
+ gSizer1 = new wxGridSizer( 0, 3, 0, 0 );
+
+ m_staticText162 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("Standard Size:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText162->Wrap( -1 );
+ gSizer1->Add( m_staticText162, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
+
+ wxArrayString m_sizeChoiceChoices;
+ m_sizeChoice = new wxChoice( sbSizer1->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_sizeChoiceChoices, 0 );
+ m_sizeChoice->SetSelection( 0 );
+ gSizer1->Add( m_sizeChoice, 0, wxALL|wxEXPAND, 5 );
+
+
+ gSizer1->Add( 0, 0, 1, wxEXPAND, 5 );
+
+ m_staticText16 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("Diameter:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText16->Wrap( -1 );
+ gSizer1->Add( m_staticText16, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
+
+ m_diameterCtrl = new wxTextCtrl( sbSizer1->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ gSizer1->Add( m_diameterCtrl, 0, wxALL|wxEXPAND, 5 );
+
+ wxArrayString m_diameterUnitChoices;
+ m_diameterUnit = new UNIT_SELECTOR_LEN( sbSizer1->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_diameterUnitChoices, 0 );
+ m_diameterUnit->SetSelection( 0 );
+ gSizer1->Add( m_diameterUnit, 0, wxALL, 5 );
+
+ m_staticText161 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("Area:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText161->Wrap( -1 );
+ gSizer1->Add( m_staticText161, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
+
+ m_areaCtrl = new wxTextCtrl( sbSizer1->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ gSizer1->Add( m_areaCtrl, 0, wxALL|wxEXPAND, 5 );
+
+ m_staticText1641 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("mm^2"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText1641->Wrap( -1 );
+ gSizer1->Add( m_staticText1641, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxALL, 5 );
+
+ m_staticText16411 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("Linear resistance:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText16411->Wrap( -1 );
+ gSizer1->Add( m_staticText16411, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
+
+ m_linResistanceCtrl = new wxTextCtrl( sbSizer1->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ gSizer1->Add( m_linResistanceCtrl, 0, wxALL|wxEXPAND, 5 );
+
+ wxArrayString m_linResistanceUnitChoices;
+ m_linResistanceUnit = new UNIT_SELECTOR_LINEAR_RESISTANCE( sbSizer1->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_linResistanceUnitChoices, 0 );
+ m_linResistanceUnit->SetSelection( 0 );
+ gSizer1->Add( m_linResistanceUnit, 0, wxALL, 5 );
+
+ m_staticText164 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("Frequency for 100% skin depth:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText164->Wrap( -1 );
+ gSizer1->Add( m_staticText164, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
+
+ m_frequencyCtrl = new wxTextCtrl( sbSizer1->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ gSizer1->Add( m_frequencyCtrl, 0, wxALL|wxEXPAND, 5 );
+
+ wxArrayString m_frequencyUnitChoices;
+ m_frequencyUnit = new UNIT_SELECTOR_FREQUENCY( sbSizer1->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_frequencyUnitChoices, 0 );
+ m_frequencyUnit->SetSelection( 0 );
+ gSizer1->Add( m_frequencyUnit, 0, wxALL, 5 );
+
+ m_staticText1642 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("Ampacity:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText1642->Wrap( -1 );
+ gSizer1->Add( m_staticText1642, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
+
+ m_AmpacityCtrl = new wxTextCtrl( sbSizer1->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ gSizer1->Add( m_AmpacityCtrl, 0, wxALL|wxEXPAND, 5 );
+
+ m_staticText16421 = new wxStaticText( sbSizer1->GetStaticBox(), wxID_ANY, _("A"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText16421->Wrap( -1 );
+ gSizer1->Add( m_staticText16421, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ sbSizer1->Add( gSizer1, 0, wxALL, 5 );
+
+
+ bSizer4->Add( sbSizer1, 1, wxALL|wxEXPAND, 5 );
+
+ wxStaticBoxSizer* sbSizer12;
+ sbSizer12 = new wxStaticBoxSizer( new wxStaticBox( this, wxID_ANY, _("Application") ), wxVERTICAL );
+
+ wxGridSizer* gSizer12;
+ gSizer12 = new wxGridSizer( 0, 3, 0, 0 );
+
+ m_staticText163 = new wxStaticText( sbSizer12->GetStaticBox(), wxID_ANY, _("Current:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText163->Wrap( -1 );
+ gSizer12->Add( m_staticText163, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
+
+ m_currentCtrl = new wxTextCtrl( sbSizer12->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ gSizer12->Add( m_currentCtrl, 1, wxALL|wxEXPAND, 5 );
+
+ m_staticText = new wxStaticText( sbSizer12->GetStaticBox(), wxID_ANY, _("A"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText->Wrap( -1 );
+ gSizer12->Add( m_staticText, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_LEFT|wxALL, 5 );
+
+ m_staticText1612 = new wxStaticText( sbSizer12->GetStaticBox(), wxID_ANY, _("Length:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText1612->Wrap( -1 );
+ gSizer12->Add( m_staticText1612, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
+
+ m_lengthCtrl = new wxTextCtrl( sbSizer12->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ gSizer12->Add( m_lengthCtrl, 1, wxALL|wxEXPAND, 5 );
+
+ wxArrayString m_lengthUnitChoices;
+ m_lengthUnit = new UNIT_SELECTOR_LEN_CABLE( sbSizer12->GetStaticBox(), wxID_ANY, wxDefaultPosition, wxDefaultSize, m_lengthUnitChoices, 0 );
+ m_lengthUnit->SetSelection( 0 );
+ gSizer12->Add( m_lengthUnit, 0, wxALL, 5 );
+
+ m_staticText16121 = new wxStaticText( sbSizer12->GetStaticBox(), wxID_ANY, _("Resistance:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText16121->Wrap( -1 );
+ gSizer12->Add( m_staticText16121, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
+
+ m_resistanceCtrl = new wxTextCtrl( sbSizer12->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ gSizer12->Add( m_resistanceCtrl, 1, wxALL|wxEXPAND, 5 );
+
+ m_staticText161211 = new wxStaticText( sbSizer12->GetStaticBox(), wxID_ANY, _("ohm"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText161211->Wrap( -1 );
+ gSizer12->Add( m_staticText161211, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_staticText161212 = new wxStaticText( sbSizer12->GetStaticBox(), wxID_ANY, _("Voltage drop:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText161212->Wrap( -1 );
+ gSizer12->Add( m_staticText161212, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
+
+ m_vDropCtrl = new wxTextCtrl( sbSizer12->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ gSizer12->Add( m_vDropCtrl, 0, wxALL|wxEXPAND, 5 );
+
+ m_staticText1612121 = new wxStaticText( sbSizer12->GetStaticBox(), wxID_ANY, _("mV"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText1612121->Wrap( -1 );
+ gSizer12->Add( m_staticText1612121, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+ m_staticText1612122 = new wxStaticText( sbSizer12->GetStaticBox(), wxID_ANY, _("Dissipated power:"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText1612122->Wrap( -1 );
+ gSizer12->Add( m_staticText1612122, 0, wxALIGN_CENTER_VERTICAL|wxALIGN_RIGHT|wxALL, 5 );
+
+ m_powerCtrl = new wxTextCtrl( sbSizer12->GetStaticBox(), wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 );
+ gSizer12->Add( m_powerCtrl, 0, wxALL|wxEXPAND, 5 );
+
+ m_staticText16121211 = new wxStaticText( sbSizer12->GetStaticBox(), wxID_ANY, _("mW"), wxDefaultPosition, wxDefaultSize, 0 );
+ m_staticText16121211->Wrap( -1 );
+ gSizer12->Add( m_staticText16121211, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
+
+
+ sbSizer12->Add( gSizer12, 0, wxALL, 5 );
+
+
+ bSizer4->Add( sbSizer12, 1, wxALL|wxEXPAND, 5 );
+
+
+ bSizer9->Add( bSizer4, 1, wxEXPAND, 5 );
+
+
+ bSizer6->Add( bSizer9, 0, wxEXPAND, 5 );
+
+
+ this->SetSizer( bSizer6 );
+ this->Layout();
+
+ // Connect Events
+ m_sizeChoice->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnSizeChange ), NULL, this );
+ m_diameterCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnDiameterChange ), NULL, this );
+ m_diameterUnit->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnUpdateUnit ), NULL, this );
+ m_areaCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnAreaChange ), NULL, this );
+ m_linResistanceCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnLinResistanceChange ), NULL, this );
+ m_linResistanceUnit->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnUpdateUnit ), NULL, this );
+ m_frequencyCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnFrequencyChange ), NULL, this );
+ m_frequencyUnit->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnUpdateUnit ), NULL, this );
+ m_AmpacityCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnAmpacityChange ), NULL, this );
+ m_currentCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnCurrentChange ), NULL, this );
+ m_lengthCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnLengthChange ), NULL, this );
+ m_lengthUnit->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnUpdateUnit ), NULL, this );
+ m_resistanceCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnResistanceChange ), NULL, this );
+ m_vDropCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnVDropChange ), NULL, this );
+ m_powerCtrl->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnPowerChange ), NULL, this );
+}
+
+PANEL_CABLE_SIZE_BASE::~PANEL_CABLE_SIZE_BASE()
+{
+ // Disconnect Events
+ m_sizeChoice->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnSizeChange ), NULL, this );
+ m_diameterCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnDiameterChange ), NULL, this );
+ m_diameterUnit->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnUpdateUnit ), NULL, this );
+ m_areaCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnAreaChange ), NULL, this );
+ m_linResistanceCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnLinResistanceChange ), NULL, this );
+ m_linResistanceUnit->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnUpdateUnit ), NULL, this );
+ m_frequencyCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnFrequencyChange ), NULL, this );
+ m_frequencyUnit->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnUpdateUnit ), NULL, this );
+ m_AmpacityCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnAmpacityChange ), NULL, this );
+ m_currentCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnCurrentChange ), NULL, this );
+ m_lengthCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnLengthChange ), NULL, this );
+ m_lengthUnit->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnUpdateUnit ), NULL, this );
+ m_resistanceCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnResistanceChange ), NULL, this );
+ m_vDropCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnVDropChange ), NULL, this );
+ m_powerCtrl->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PANEL_CABLE_SIZE_BASE::OnPowerChange ), NULL, this );
+
+}
diff --git a/pcb_calculator/calculator_panels/panel_cable_size_base.fbp b/pcb_calculator/calculator_panels/panel_cable_size_base.fbp
new file mode 100644
index 0000000000..97debc03ac
--- /dev/null
+++ b/pcb_calculator/calculator_panels/panel_cable_size_base.fbp
@@ -0,0 +1,2163 @@
+
+
+
+
+
diff --git a/pcb_calculator/calculator_panels/panel_cable_size_base.h b/pcb_calculator/calculator_panels/panel_cable_size_base.h
new file mode 100644
index 0000000000..605849e66b
--- /dev/null
+++ b/pcb_calculator/calculator_panels/panel_cable_size_base.h
@@ -0,0 +1,97 @@
+///////////////////////////////////////////////////////////////////////////
+// C++ code generated with wxFormBuilder (version 3.10.0-4761b0c5)
+// http://www.wxformbuilder.org/
+//
+// PLEASE DO *NOT* EDIT THIS FILE!
+///////////////////////////////////////////////////////////////////////////
+
+#pragma once
+
+#include
+#include
+#include
+class UNIT_SELECTOR_FREQUENCY;
+class UNIT_SELECTOR_LEN;
+class UNIT_SELECTOR_LEN_CABLE;
+class UNIT_SELECTOR_LINEAR_RESISTANCE;
+
+#include "calculator_panels/calculator_panel.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+///////////////////////////////////////////////////////////////////////////
+
+
+///////////////////////////////////////////////////////////////////////////////
+/// Class PANEL_CABLE_SIZE_BASE
+///////////////////////////////////////////////////////////////////////////////
+class PANEL_CABLE_SIZE_BASE : public CALCULATOR_PANEL
+{
+ private:
+
+ protected:
+ wxStaticText* m_staticText162;
+ wxChoice* m_sizeChoice;
+ wxStaticText* m_staticText16;
+ wxTextCtrl* m_diameterCtrl;
+ UNIT_SELECTOR_LEN* m_diameterUnit;
+ wxStaticText* m_staticText161;
+ wxTextCtrl* m_areaCtrl;
+ wxStaticText* m_staticText1641;
+ wxStaticText* m_staticText16411;
+ wxTextCtrl* m_linResistanceCtrl;
+ UNIT_SELECTOR_LINEAR_RESISTANCE* m_linResistanceUnit;
+ wxStaticText* m_staticText164;
+ wxTextCtrl* m_frequencyCtrl;
+ UNIT_SELECTOR_FREQUENCY* m_frequencyUnit;
+ wxStaticText* m_staticText1642;
+ wxTextCtrl* m_AmpacityCtrl;
+ wxStaticText* m_staticText16421;
+ wxStaticText* m_staticText163;
+ wxTextCtrl* m_currentCtrl;
+ wxStaticText* m_staticText;
+ wxStaticText* m_staticText1612;
+ wxTextCtrl* m_lengthCtrl;
+ UNIT_SELECTOR_LEN_CABLE* m_lengthUnit;
+ wxStaticText* m_staticText16121;
+ wxTextCtrl* m_resistanceCtrl;
+ wxStaticText* m_staticText161211;
+ wxStaticText* m_staticText161212;
+ wxTextCtrl* m_vDropCtrl;
+ wxStaticText* m_staticText1612121;
+ wxStaticText* m_staticText1612122;
+ wxTextCtrl* m_powerCtrl;
+ wxStaticText* m_staticText16121211;
+
+ // Virtual event handlers, override them in your derived class
+ virtual void OnSizeChange( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnDiameterChange( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnUpdateUnit( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnAreaChange( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnLinResistanceChange( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnFrequencyChange( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnAmpacityChange( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnCurrentChange( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnLengthChange( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnResistanceChange( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnVDropChange( wxCommandEvent& event ) { event.Skip(); }
+ virtual void OnPowerChange( wxCommandEvent& event ) { event.Skip(); }
+
+
+ public:
+
+ PANEL_CABLE_SIZE_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 677,453 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString );
+
+ ~PANEL_CABLE_SIZE_BASE();
+
+};
+
diff --git a/pcb_calculator/pcb_calculator_frame.cpp b/pcb_calculator/pcb_calculator_frame.cpp
index 8165b42f16..b3a76d5dd5 100644
--- a/pcb_calculator/pcb_calculator_frame.cpp
+++ b/pcb_calculator/pcb_calculator_frame.cpp
@@ -35,6 +35,7 @@
#include
#include
+#include
#include
#include
#include
@@ -86,6 +87,9 @@ PCB_CALCULATOR_FRAME::PCB_CALCULATOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
_( "Via Size" ) );
AddCalculator( new PANEL_TRACK_WIDTH( m_treebook, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL ),
_( "Track Width" ) );
+ AddCalculator( new PANEL_CABLE_SIZE( m_treebook, wxID_ANY, wxDefaultPosition, wxDefaultSize,
+ wxTAB_TRAVERSAL ),
+ _( "Cable Size" ) );
m_treebook->AddPage( nullptr, _( "High speed" ) );
diff --git a/pcb_calculator/pcb_calculator_settings.cpp b/pcb_calculator/pcb_calculator_settings.cpp
index 115139ac11..db096d7a3b 100644
--- a/pcb_calculator/pcb_calculator_settings.cpp
+++ b/pcb_calculator/pcb_calculator_settings.cpp
@@ -34,16 +34,9 @@ const int pcbCalculatorSchemaVersion = 0;
PCB_CALCULATOR_SETTINGS::PCB_CALCULATOR_SETTINGS() :
- APP_SETTINGS_BASE( "pcb_calculator", pcbCalculatorSchemaVersion ),
- m_Attenuators(),
- m_BoardClassUnits( 0 ),
- m_ColorCodeTolerance( 0 ),
- m_Electrical(),
- m_LastPage( 0 ),
- m_Regulators(),
- m_TrackWidth(),
- m_TransLine(),
- m_ViaSize()
+ APP_SETTINGS_BASE( "pcb_calculator", pcbCalculatorSchemaVersion ), m_Attenuators(),
+ m_BoardClassUnits( 0 ), m_ColorCodeTolerance( 0 ), m_Electrical(), m_LastPage( 0 ),
+ m_Regulators(), m_cableSize(), m_TrackWidth(), m_TransLine(), m_ViaSize()
{
// Build settings:
m_params.emplace_back( new PARAM( "board_class_units", &m_BoardClassUnits, 0 ) );
@@ -94,6 +87,16 @@ PCB_CALCULATOR_SETTINGS::PCB_CALCULATOR_SETTINGS() :
m_params.emplace_back( new PARAM( "regulators.last_param", &m_Regulators.last_param, 0 ) );
+ m_params.emplace_back(
+ new PARAM( "cable_size.diameterUnit", &m_cableSize.diameterUnit, 0 ) );
+
+ m_params.emplace_back( new PARAM( "cable_size.linResUnit", &m_cableSize.linResUnit, 0 ) );
+
+ m_params.emplace_back(
+ new PARAM( "cable_size.frequencyUnit", &m_cableSize.frequencyUnit, 0 ) );
+
+ m_params.emplace_back( new PARAM( "cable_size.lengthUnit", &m_cableSize.lengthUnit, 0 ) );
+
m_params.emplace_back( new PARAM( "track_width.current",
&m_TrackWidth.current, "1.0" ) );
diff --git a/pcb_calculator/pcb_calculator_settings.h b/pcb_calculator/pcb_calculator_settings.h
index 41a703aa4f..06309a3874 100644
--- a/pcb_calculator/pcb_calculator_settings.h
+++ b/pcb_calculator/pcb_calculator_settings.h
@@ -62,6 +62,14 @@ public:
int last_param;
};
+ struct CABLE_SIZE
+ {
+ int diameterUnit;
+ int linResUnit;
+ int frequencyUnit;
+ int lengthUnit;
+ };
+
struct TRACK_WIDTH
{
wxString current;
@@ -139,6 +147,8 @@ public:
REGULATORS m_Regulators;
+ CABLE_SIZE m_cableSize;
+
TRACK_WIDTH m_TrackWidth;
TRANSMISSION_LINE m_TransLine;
diff --git a/pcb_calculator/units_scales.h b/pcb_calculator/units_scales.h
index 6701d611d0..9341f4aaa4 100644
--- a/pcb_calculator/units_scales.h
+++ b/pcb_calculator/units_scales.h
@@ -28,11 +28,14 @@
#ifndef UNITS_SCALES_H
#define UNITS_SCALES_H
-#define UNIT_MM 1e-3 // mm to meter
+#define UNIT_KM 1e3 // km to meter
+#define UNIT_M 1 // m to meter
#define UNIT_CM 1e-2 // cm to meter
+#define UNIT_MM 1e-3 // mm to meter
#define UNIT_MICRON 1e-6 // um to meter
#define UNIT_INCH (1e-2*2.54) // inch to meter
#define UNIT_MIL (1e-5*2.54) // mil (or thou) to meter
+#define UNIT_FEET 0.3048 // feet to meter
#define UNIT_OZSQFT (34.40*UNIT_MICRON) // 1 oz/ft^2 is 34.30 microns nominal, 30.90 minimum
#define UNIT_GHZ 1e9
@@ -45,4 +48,9 @@
#define UNIT_OHM 1.0 // Ohm to Ohm
#define UNIT_KOHM 1e3 // KOhm to Ohm
+#define UNIT_OHM_PER_METER 1.0 // Ohm per meter to Ohm per meter
+#define UNIT_OHM_PER_KILOMETER 1e-3 // Ohm per kilometer to Ohm per meter
+#define UNIT_OHM_PER_FEET 3.28084 // Ohm per feet to Ohm per meter
+#define UNIT_OHM_PER_1000FEET 3280.84 // Ohm per feet to Ohm per meter
+
#endif // UNITS_SCALES_H
diff --git a/pcb_calculator/widgets/unit_selector.cpp b/pcb_calculator/widgets/unit_selector.cpp
index c317416d25..4e23cf454c 100644
--- a/pcb_calculator/widgets/unit_selector.cpp
+++ b/pcb_calculator/widgets/unit_selector.cpp
@@ -171,3 +171,64 @@ double UNIT_SELECTOR_RESISTOR::GetUnitScale()
return 1.0;
}
+
+UNIT_SELECTOR_LINEAR_RESISTANCE::UNIT_SELECTOR_LINEAR_RESISTANCE( wxWindow *parent, wxWindowID id,
+ const wxPoint& pos, const wxSize& size,
+ const wxArrayString& choices, long style )
+ : UNIT_SELECTOR( parent, id, pos, size, choices, style )
+{
+ Append( wxT( "Ω/m" ) );
+ Append( wxT( "Ω/km" ) );
+ Append( wxT( "Ω/ft" ) );
+ Append( wxT( "Ω/1000ft" ) );
+}
+
+
+/*
+ * Function GetUnitScale
+ * return the scaling factor to convert users units
+ * to normalized units ( ohm )
+ */
+double UNIT_SELECTOR_LINEAR_RESISTANCE::GetUnitScale()
+{
+ switch( GetCurrentSelection() )
+ {
+ case 0: return UNIT_OHM_PER_METER; break;
+ case 1: return UNIT_OHM_PER_KILOMETER; break;
+ case 2: return UNIT_OHM_PER_FEET; break;
+ case 3: return UNIT_OHM_PER_1000FEET; break;
+ }
+ return 1.0;
+}
+
+
+UNIT_SELECTOR_LEN_CABLE::UNIT_SELECTOR_LEN_CABLE( wxWindow *parent, wxWindowID id,
+ const wxPoint& pos, const wxSize& size,
+ const wxArrayString& choices, long style ) :
+ UNIT_SELECTOR( parent, id, pos, size, choices, style )
+{
+ Append( _( "cm" ) );
+ Append( _( "m" ) );
+ Append( _( "km" ) );
+ Append( _( "inch" ) );
+ Append( _( "feet" ) );
+}
+
+
+/*
+ * Function GetUnitScale
+ * return the scaling factor to convert users units
+ * to normalized units (meter)
+ */
+double UNIT_SELECTOR_LEN_CABLE::GetUnitScale()
+{
+ switch( GetCurrentSelection() )
+ {
+ case 0: return UNIT_CM; break;
+ case 1: return UNIT_M; break;
+ case 2: return UNIT_KM; break;
+ case 3: return UNIT_INCH; break;
+ case 4: return UNIT_FEET; break;
+ }
+ return 1.0;
+}
\ No newline at end of file
diff --git a/pcb_calculator/widgets/unit_selector.h b/pcb_calculator/widgets/unit_selector.h
index b31c09748b..1fcd711b98 100644
--- a/pcb_calculator/widgets/unit_selector.h
+++ b/pcb_calculator/widgets/unit_selector.h
@@ -129,5 +129,35 @@ public:
double GetUnitScale() override;
};
+class UNIT_SELECTOR_LINEAR_RESISTANCE : public UNIT_SELECTOR
+{
+public:
+ UNIT_SELECTOR_LINEAR_RESISTANCE( wxWindow *parent, wxWindowID id,
+ const wxPoint& pos, const wxSize& size,
+ const wxArrayString& choices, long style = 0 );
+
+ /**
+ * Function GetUnitScale
+ * @return the scaling factor to convert users units
+ * to normalized units ( ohm/m )
+ */
+ double GetUnitScale() override;
+};
+
+class UNIT_SELECTOR_LEN_CABLE : public UNIT_SELECTOR
+{
+public:
+ UNIT_SELECTOR_LEN_CABLE( wxWindow *parent, wxWindowID id,
+ const wxPoint& pos, const wxSize& size,
+ const wxArrayString& choices, long style = 0 );
+
+ /**
+ * Function GetUnitScale
+ * @return the scaling factor to convert users units
+ * to normalized units ( ohm/m )
+ */
+ double GetUnitScale() override;
+};
+
#endif // UNIT_SELECTOR_H