From 130d52dd80225d1d987b5f2733a61d3835214aa2 Mon Sep 17 00:00:00 2001 From: jean-pierre charras Date: Fri, 20 Sep 2019 18:14:52 +0200 Subject: [PATCH] Pcb Calculator: Via Calculator gives too low resistance values (100 times). Fixes: lp:1844804 https://bugs.launchpad.net/kicad/+bug/1844804 --- .../dialogs/pcb_calculator_frame_base.cpp | 13 ++- .../dialogs/pcb_calculator_frame_base.fbp | 80 ++++++++++++++++++- .../dialogs/pcb_calculator_frame_base.h | 2 + pcb_calculator/pcb_calculator.h | 5 ++ pcb_calculator/via.cpp | 19 ++++- 5 files changed, 114 insertions(+), 5 deletions(-) diff --git a/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp b/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp index 8990047020..ee83c000d3 100644 --- a/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp +++ b/pcb_calculator/dialogs/pcb_calculator_frame_base.cpp @@ -623,7 +623,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow m_staticTextAppliedCurrentUnits->Wrap( -1 ); fgSizerVS_Inputs->Add( m_staticTextAppliedCurrentUnits, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 ); - m_staticTextResistivity = new wxStaticText( sbSizerVS_Inputs->GetStaticBox(), wxID_ANY, _("Plating resistivity:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextResistivity = new wxStaticText( sbSizerVS_Inputs->GetStaticBox(), wxID_ANY, _("Plating resistivity (Ohm.m):"), wxDefaultPosition, wxDefaultSize, 0 ); m_staticTextResistivity->Wrap( -1 ); m_staticTextResistivity->SetToolTip( _("Specific resistance in ohms * meters") ); @@ -824,6 +824,15 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow sbSizerVS_Result->Add( fgSizerTW_Results11, 0, wxEXPAND, 5 ); + sbSizerVS_Result->Add( 30, 30, 0, 0, 5 ); + + m_staticTextWarning = new wxStaticText( sbSizerVS_Result->GetStaticBox(), wxID_ANY, _("Warning:\nVia pad diameter >= Clearance hole diameter.\nSome parameters cannot be calculated for a via\ninside a copper zone."), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextWarning->Wrap( -1 ); + m_staticTextWarning->SetFont( wxFont( wxNORMAL_FONT->GetPointSize(), wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD, false, wxEmptyString ) ); + + sbSizerVS_Result->Add( m_staticTextWarning, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5 ); + + bSizerViaSize->Add( sbSizerVS_Result, 1, wxEXPAND|wxALL, 5 ); @@ -1694,6 +1703,7 @@ PCB_CALCULATOR_FRAME_BASE::PCB_CALCULATOR_FRAME_BASE( wxWindow* parent, wxWindow m_button_Permittivity->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PCB_CALCULATOR_FRAME_BASE::OnViaEpsilonR_Button ), NULL, this ); m_textCtrlTemperatureDiff->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PCB_CALCULATOR_FRAME_BASE::OnViaCalculate ), NULL, this ); m_textCtrlRiseTime->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PCB_CALCULATOR_FRAME_BASE::OnViaCalculate ), NULL, this ); + m_staticTextWarning->Connect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( PCB_CALCULATOR_FRAME_BASE::onUpdateViaCalcErrorText ), NULL, this ); m_ElectricalSpacingUnitsSelector->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( PCB_CALCULATOR_FRAME_BASE::OnElectricalSpacingUnitsSelection ), NULL, this ); m_buttonElectSpacingRefresh->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PCB_CALCULATOR_FRAME_BASE::OnElectricalSpacingRefresh ), NULL, this ); m_TranslineSelection->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( PCB_CALCULATOR_FRAME_BASE::OnTranslineSelection ), NULL, this ); @@ -1756,6 +1766,7 @@ PCB_CALCULATOR_FRAME_BASE::~PCB_CALCULATOR_FRAME_BASE() m_button_Permittivity->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PCB_CALCULATOR_FRAME_BASE::OnViaEpsilonR_Button ), NULL, this ); m_textCtrlTemperatureDiff->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PCB_CALCULATOR_FRAME_BASE::OnViaCalculate ), NULL, this ); m_textCtrlRiseTime->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( PCB_CALCULATOR_FRAME_BASE::OnViaCalculate ), NULL, this ); + m_staticTextWarning->Disconnect( wxEVT_UPDATE_UI, wxUpdateUIEventHandler( PCB_CALCULATOR_FRAME_BASE::onUpdateViaCalcErrorText ), NULL, this ); m_ElectricalSpacingUnitsSelector->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( PCB_CALCULATOR_FRAME_BASE::OnElectricalSpacingUnitsSelection ), NULL, this ); m_buttonElectSpacingRefresh->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PCB_CALCULATOR_FRAME_BASE::OnElectricalSpacingRefresh ), NULL, this ); m_TranslineSelection->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( PCB_CALCULATOR_FRAME_BASE::OnTranslineSelection ), NULL, this ); diff --git a/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp b/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp index 4795292ed0..c6ca3c95b7 100644 --- a/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp +++ b/pcb_calculator/dialogs/pcb_calculator_frame_base.fbp @@ -14,6 +14,7 @@ pcb_calculator_frame_base 1000 none + 1 pcb_calculator_frame_base @@ -25,6 +26,7 @@ 1 1 UI + 0 0 0 @@ -3295,6 +3297,7 @@ + 1 0 @@ -3306,6 +3309,7 @@ 0 Left 1 + 1 0 @@ -7272,7 +7276,7 @@ 0 0 wxID_ANY - Plating resistivity: + Plating resistivity (Ohm.m): 0 0 @@ -8144,7 +8148,7 @@ wxVERTICAL 1 none - + 5 wxEXPAND 0 @@ -9809,6 +9813,78 @@ + + 5 + + 0 + + 30 + protected + 30 + + + + 5 + wxALL|wxALIGN_CENTER_HORIZONTAL + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + ,90,92,-1,70,0 + 0 + 0 + wxID_ANY + Warning: Via pad diameter >= Clearance hole diameter. Some parameters cannot be calculated for a via inside a copper zone. + 0 + + 0 + + + 0 + + 1 + m_staticTextWarning + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + onUpdateViaCalcErrorText + + diff --git a/pcb_calculator/dialogs/pcb_calculator_frame_base.h b/pcb_calculator/dialogs/pcb_calculator_frame_base.h index 6f97bd4f6f..e7654825c2 100644 --- a/pcb_calculator/dialogs/pcb_calculator_frame_base.h +++ b/pcb_calculator/dialogs/pcb_calculator_frame_base.h @@ -208,6 +208,7 @@ class PCB_CALCULATOR_FRAME_BASE : public KIWAY_PLAYER wxStaticText* m_staticTextReactance; wxStaticText* m_Reactance; wxStaticText* m_staticTextReactanceUnits; + wxStaticText* m_staticTextWarning; wxPanel* m_panelElectricalSpacing; UNIT_SELECTOR_LEN* m_ElectricalSpacingUnitsSelector; wxStaticLine* m_staticline2; @@ -355,6 +356,7 @@ class PCB_CALCULATOR_FRAME_BASE : public KIWAY_PLAYER virtual void OnViaCalculate( wxCommandEvent& event ) { event.Skip(); } virtual void OnViaRho_Button( wxCommandEvent& event ) { event.Skip(); } virtual void OnViaEpsilonR_Button( wxCommandEvent& event ) { event.Skip(); } + virtual void onUpdateViaCalcErrorText( wxUpdateUIEvent& event ) { event.Skip(); } virtual void OnElectricalSpacingUnitsSelection( wxCommandEvent& event ) { event.Skip(); } virtual void OnElectricalSpacingRefresh( wxCommandEvent& event ) { event.Skip(); } virtual void OnTranslineSelection( wxCommandEvent& event ) { event.Skip(); } diff --git a/pcb_calculator/pcb_calculator.h b/pcb_calculator/pcb_calculator.h index 22474744f1..967e1f689f 100644 --- a/pcb_calculator/pcb_calculator.h +++ b/pcb_calculator/pcb_calculator.h @@ -202,6 +202,11 @@ private: */ void OnViaRho_Button( wxCommandEvent& event ) override; + /** + * Update the Error message in Via calculation panel + */ + void onUpdateViaCalcErrorText( wxUpdateUIEvent& event ) override; + /** * Function VSDisplayValues * Displays the results of the calculation. diff --git a/pcb_calculator/via.cpp b/pcb_calculator/via.cpp index 079f909eed..e5dfdfd7de 100644 --- a/pcb_calculator/via.cpp +++ b/pcb_calculator/via.cpp @@ -98,11 +98,26 @@ void PCB_CALCULATOR_FRAME::OnViaRho_Button( wxCommandEvent& event ) wxArrayString list = StandardResistivityList(); wxString value = wxGetSingleChoice( wxEmptyString, - _("Specific Resistance"), list).BeforeFirst( ' ' ); + _("Electrical Resistivity in Ohm*m"), list).BeforeFirst( ' ' ); if( ! value.IsEmpty() ) m_textCtrlPlatingResistivity->SetValue( value ); } + +void PCB_CALCULATOR_FRAME::onUpdateViaCalcErrorText( wxUpdateUIEvent& event ) +{ + // Update the Error message if a via has a external diameter + // bigger than the clearance area diameter + // (therefore the via is inside a copper zone and some parameters connot be calculated) + double clearanceDia = std::abs( DoubleFromString( m_textCtrlClearanceDia->GetValue() ) ); + clearanceDia *= m_choiceClearanceDia->GetUnitScale(); + double padDia = std::abs( DoubleFromString( m_textCtrlViaPadDia->GetValue() ) ); + padDia *= m_choiceViaPadDia->GetUnitScale(); + + m_staticTextWarning->Show( clearanceDia <= padDia ); +} + + void PCB_CALCULATOR_FRAME::VS_Init( wxConfigBase* aCfg ) { int tmp; @@ -196,7 +211,7 @@ void PCB_CALCULATOR_FRAME::OnViaCalculate( wxCommandEvent& event ) padDia *= m_choiceViaPadDia->GetUnitScale(); clearanceDia *= m_choiceClearanceDia->GetUnitScale(); charImpedance *= m_choiceImpedance->GetUnitScale(); - platingResistivity = platingResistivity / 100; // Ohm-cm to Ohm-m + // platingResistivity is ok: it is in Ohm*m in tables // Calculate cross-sectional area of the via's cylindrical structure [3] double area = M_PI * (finishedHoleDia + platingThickness) * platingThickness; // m^2