2017-12-23 17:34:57 +00:00
|
|
|
/*
|
|
|
|
* This program source code file is part of KiCad, a free EDA CAD application.
|
|
|
|
*
|
|
|
|
* Copyright (C) 2012 Miguel Angel Ajo Pelayo, miguelangel@nbee.es
|
2018-08-15 13:55:32 +00:00
|
|
|
* Copyright (C) 2018 Jean-Pierre Charras, jp.charras at wanadoo.fr
|
|
|
|
* Copyright (C) 2004-2018 KiCad Developers, see AUTHORS.txt for contributors.
|
2017-12-23 17:34:57 +00:00
|
|
|
*
|
|
|
|
* 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
|
|
|
|
*/
|
|
|
|
|
2012-05-09 17:37:25 +00:00
|
|
|
/**
|
2018-01-30 19:23:06 +00:00
|
|
|
* @file footprint_wizard_frame_functions.cpp
|
2012-05-09 17:37:25 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <fctsys.h>
|
|
|
|
#include <gr_basic.h>
|
|
|
|
#include <class_drawpanel.h>
|
2018-01-29 20:58:58 +00:00
|
|
|
#include <pcb_edit_frame.h>
|
2012-05-09 17:37:25 +00:00
|
|
|
#include <dialog_helpers.h>
|
|
|
|
|
|
|
|
#include <class_board.h>
|
|
|
|
#include <class_module.h>
|
|
|
|
|
|
|
|
#include <pcbnew.h>
|
|
|
|
#include <pcbnew_id.h>
|
|
|
|
#include "footprint_wizard_frame.h"
|
|
|
|
#include <wildcards_and_files_ext.h>
|
2012-05-09 23:04:08 +00:00
|
|
|
#include <dialogs/dialog_footprint_wizard_list.h>
|
2012-07-22 22:23:17 +00:00
|
|
|
#include <base_units.h>
|
2019-03-04 11:02:12 +00:00
|
|
|
#include <widgets/wx_grid.h>
|
2012-05-09 17:37:25 +00:00
|
|
|
|
2018-08-15 13:55:32 +00:00
|
|
|
#include <tool/tool_manager.h>
|
2012-05-09 17:37:25 +00:00
|
|
|
|
|
|
|
void FOOTPRINT_WIZARD_FRAME::Process_Special_Functions( wxCommandEvent& event )
|
|
|
|
{
|
2013-03-15 16:35:24 +00:00
|
|
|
wxString msg;
|
|
|
|
int page;
|
2012-05-09 17:37:25 +00:00
|
|
|
|
|
|
|
switch( event.GetId() )
|
|
|
|
{
|
|
|
|
case ID_FOOTPRINT_WIZARD_NEXT:
|
2014-01-29 17:01:42 +00:00
|
|
|
m_pageList->SetSelection( m_pageList->GetSelection() + 1, true );
|
2013-08-05 13:43:15 +00:00
|
|
|
ClickOnPageList( event );
|
2012-05-09 17:37:25 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
case ID_FOOTPRINT_WIZARD_PREVIOUS:
|
2014-01-29 17:01:42 +00:00
|
|
|
page = m_pageList->GetSelection() - 1;
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2014-01-29 17:01:42 +00:00
|
|
|
if( page < 0 )
|
2013-03-15 16:35:24 +00:00
|
|
|
page = 0;
|
|
|
|
|
2014-01-29 17:01:42 +00:00
|
|
|
m_pageList->SetSelection( page, true );
|
2013-08-05 13:43:15 +00:00
|
|
|
ClickOnPageList( event );
|
2012-05-09 17:37:25 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
2019-01-02 04:43:13 +00:00
|
|
|
wxLogDebug( wxT( "FOOTPRINT_WIZARD_FRAME::Process_Special_Functions error: id = %d" ),
|
|
|
|
event.GetId() );
|
2012-05-09 17:37:25 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2012-06-27 21:19:19 +00:00
|
|
|
/* Function OnLeftClick
|
|
|
|
* Captures a left click event in the dialog
|
2013-03-15 16:35:24 +00:00
|
|
|
*
|
2012-06-27 21:19:19 +00:00
|
|
|
*/
|
2012-05-09 17:37:25 +00:00
|
|
|
void FOOTPRINT_WIZARD_FRAME::OnLeftClick( wxDC* DC, const wxPoint& MousePos )
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2012-06-27 21:19:19 +00:00
|
|
|
/* Function OnRightClick
|
2013-03-15 16:35:24 +00:00
|
|
|
* Captures a right click event in the dialog
|
|
|
|
*
|
2012-06-27 21:19:19 +00:00
|
|
|
*/
|
2012-05-09 17:37:25 +00:00
|
|
|
bool FOOTPRINT_WIZARD_FRAME::OnRightClick( const wxPoint& MousePos, wxMenu* PopMenu )
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Displays the name of the current opened library in the caption */
|
|
|
|
void FOOTPRINT_WIZARD_FRAME::DisplayWizardInfos()
|
|
|
|
{
|
2013-03-15 16:35:24 +00:00
|
|
|
wxString msg;
|
2012-05-09 17:37:25 +00:00
|
|
|
|
|
|
|
msg = _( "Footprint Wizard" );
|
|
|
|
msg << wxT( " [" );
|
|
|
|
|
2013-03-15 16:35:24 +00:00
|
|
|
if( !m_wizardName.IsEmpty() )
|
2012-05-09 17:37:25 +00:00
|
|
|
msg << m_wizardName;
|
|
|
|
else
|
|
|
|
msg += _( "no wizard selected" );
|
|
|
|
|
|
|
|
msg << wxT( "]" );
|
|
|
|
|
|
|
|
SetTitle( msg );
|
|
|
|
}
|
|
|
|
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2012-05-10 20:49:07 +00:00
|
|
|
void FOOTPRINT_WIZARD_FRAME::ReloadFootprint()
|
|
|
|
{
|
2013-03-16 03:27:48 +00:00
|
|
|
FOOTPRINT_WIZARD* footprintWizard = GetMyWizard();
|
|
|
|
|
|
|
|
if( !footprintWizard )
|
2012-07-16 14:48:51 +00:00
|
|
|
return;
|
|
|
|
|
2012-05-10 20:49:07 +00:00
|
|
|
SetCurItem( NULL );
|
2018-08-15 13:55:32 +00:00
|
|
|
|
|
|
|
if( IsGalCanvasActive() )
|
|
|
|
m_toolManager->ResetTools( TOOL_BASE::MODEL_RELOAD );
|
|
|
|
|
2012-05-10 20:49:07 +00:00
|
|
|
// Delete the current footprint
|
|
|
|
GetBoard()->m_Modules.DeleteAll();
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2013-08-05 13:43:15 +00:00
|
|
|
// Creates the module
|
2015-09-05 12:10:54 +00:00
|
|
|
wxString msg;
|
|
|
|
MODULE* module = footprintWizard->GetFootprint( &msg );
|
|
|
|
DisplayBuildMessage( msg );
|
2013-08-05 13:43:15 +00:00
|
|
|
|
|
|
|
if( module )
|
2012-05-10 20:49:07 +00:00
|
|
|
{
|
2013-08-05 13:43:15 +00:00
|
|
|
// Add the object to board
|
2015-02-10 08:35:17 +00:00
|
|
|
GetBoard()->Add( module, ADD_APPEND );
|
2013-08-05 13:43:15 +00:00
|
|
|
module->SetPosition( wxPoint( 0, 0 ) );
|
2012-05-10 20:49:07 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-09-05 12:10:54 +00:00
|
|
|
DBG(printf( "footprintWizard->GetFootprint() returns NULL\n" );)
|
2012-05-10 20:49:07 +00:00
|
|
|
}
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2018-08-11 06:25:09 +00:00
|
|
|
updateView();
|
2013-09-20 15:29:32 +00:00
|
|
|
m_canvas->Refresh();
|
2012-05-10 20:49:07 +00:00
|
|
|
}
|
2012-05-09 17:37:25 +00:00
|
|
|
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2015-09-05 12:10:54 +00:00
|
|
|
void FOOTPRINT_WIZARD_FRAME::DisplayBuildMessage( wxString& aMessage )
|
|
|
|
{
|
2018-05-20 22:46:24 +00:00
|
|
|
m_buildMessageBox->SetValue( aMessage );
|
2015-09-05 12:10:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-03-16 03:27:48 +00:00
|
|
|
FOOTPRINT_WIZARD* FOOTPRINT_WIZARD_FRAME::GetMyWizard()
|
|
|
|
{
|
2015-09-02 13:55:36 +00:00
|
|
|
if( m_wizardName.Length() == 0 )
|
2013-03-16 03:27:48 +00:00
|
|
|
return NULL;
|
|
|
|
|
2018-01-30 19:23:06 +00:00
|
|
|
FOOTPRINT_WIZARD* footprintWizard = FOOTPRINT_WIZARD_LIST::GetWizard( m_wizardName );
|
2013-03-16 03:27:48 +00:00
|
|
|
|
|
|
|
if( !footprintWizard )
|
|
|
|
{
|
|
|
|
wxMessageBox( _( "Couldn't reload footprint wizard" ) );
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
return footprintWizard;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-08-04 22:15:57 +00:00
|
|
|
MODULE* FOOTPRINT_WIZARD_FRAME::GetBuiltFootprint()
|
|
|
|
{
|
2018-01-30 19:23:06 +00:00
|
|
|
FOOTPRINT_WIZARD* footprintWizard = FOOTPRINT_WIZARD_LIST::GetWizard( m_wizardName );
|
2013-03-16 03:27:48 +00:00
|
|
|
|
Modular-Kicad milestone B), major portions:
*) Rework the set language support, simplify it by using KIWAY. Now any major
frame with a "change language" menu can change the language for all KIWAY_PLAYERs
in the whole KIWAY. Multiple KIWAYs are not supported yet.
*) Simplify "modal wxFrame" support, and add that support exclusively to
KIWAY_PLAYER where it is inherited by all derivatives. The function
KIWAY_PLAYER::ShowModal() is in the vtable and so is cross module capable.
*) Remove the requirements and assumptions that the wxFrame hierarchy always
had PCB_EDIT_FRAME and SCH_EDIT_FRAME as immediate parents of their viewers
and editors. This is no longer the case, nor required.
*) Use KIWAY::Player() everywhere to make KIWAY_PLAYERs, this registers the
KIWAY_PLAYER within the KIWAY and makes it very easy to find an open frame
quickly. It also gives control to the KIWAY as to frame hierarchical
relationships.
*) Change single_top to use the KIWAY for loading a KIFACE and instantiating
the single KIWAY_PLAYER, see bullet immediately above.
*) Add KIWAY::OnKiwayEnd() and call it from PGM_BASE at program termination, this
gives the KIFACEs a chance to save their final configuration dope to disk.
*) Add dedicated FRAME_T's for the modal frames, so m_Ident can be tested and
these modal frames are distinctly different than their non-modal equivalents.
KIWAY_PLAYER::IsModal() is !not! a valid test during the wxFrame's constructor,
so this is another important reason for having a dedicated FRAME_T for each
modal wxFrame.
On balance, more lines were deleted than were added to achieve all this.
2014-05-03 17:40:19 +00:00
|
|
|
if( footprintWizard && m_modal_ret_val )
|
2012-08-06 20:41:41 +00:00
|
|
|
{
|
2015-09-05 12:10:54 +00:00
|
|
|
wxString msg;
|
|
|
|
MODULE * footprint = footprintWizard->GetFootprint( &msg );
|
|
|
|
DisplayBuildMessage( msg );
|
|
|
|
|
|
|
|
return footprint;
|
2012-08-06 20:41:41 +00:00
|
|
|
}
|
2013-08-05 13:43:15 +00:00
|
|
|
|
|
|
|
return NULL;
|
2012-08-04 22:15:57 +00:00
|
|
|
}
|
|
|
|
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2012-05-09 23:04:08 +00:00
|
|
|
void FOOTPRINT_WIZARD_FRAME::SelectFootprintWizard()
|
2012-05-09 17:37:25 +00:00
|
|
|
{
|
2015-04-21 15:42:30 +00:00
|
|
|
DIALOG_FOOTPRINT_WIZARD_LIST wizardSelector( this );
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2015-04-21 15:42:30 +00:00
|
|
|
if( wizardSelector.ShowModal() != wxID_OK )
|
2013-08-05 13:43:15 +00:00
|
|
|
return;
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2015-04-21 15:42:30 +00:00
|
|
|
FOOTPRINT_WIZARD* footprintWizard = wizardSelector.GetWizard();
|
2012-05-09 17:37:25 +00:00
|
|
|
|
2013-03-16 03:27:48 +00:00
|
|
|
if( footprintWizard )
|
2012-05-09 23:04:08 +00:00
|
|
|
{
|
2013-03-16 03:27:48 +00:00
|
|
|
m_wizardName = footprintWizard->GetName();
|
|
|
|
m_wizardDescription = footprintWizard->GetDescription();
|
2018-03-15 16:29:24 +00:00
|
|
|
|
|
|
|
footprintWizard->ResetParameters();
|
2013-03-16 03:27:48 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2015-04-21 15:42:30 +00:00
|
|
|
m_wizardName.Empty();
|
|
|
|
m_wizardDescription.Empty();
|
2012-05-09 23:04:08 +00:00
|
|
|
}
|
2012-05-09 17:37:25 +00:00
|
|
|
|
2012-05-10 20:49:07 +00:00
|
|
|
ReloadFootprint();
|
2012-07-31 21:00:33 +00:00
|
|
|
Zoom_Automatique( false );
|
2012-05-09 17:37:25 +00:00
|
|
|
DisplayWizardInfos();
|
|
|
|
ReCreatePageList();
|
|
|
|
ReCreateParameterList();
|
2012-05-09 23:04:08 +00:00
|
|
|
}
|
|
|
|
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2012-05-09 23:04:08 +00:00
|
|
|
void FOOTPRINT_WIZARD_FRAME::SelectCurrentWizard( wxCommandEvent& event )
|
|
|
|
{
|
|
|
|
SelectFootprintWizard();
|
2018-08-11 06:25:09 +00:00
|
|
|
updateView();
|
2012-05-09 17:37:25 +00:00
|
|
|
}
|
|
|
|
|
2017-01-03 15:01:47 +00:00
|
|
|
void FOOTPRINT_WIZARD_FRAME::DefaultParameters( wxCommandEvent& event )
|
|
|
|
{
|
|
|
|
FOOTPRINT_WIZARD* footprintWizard = GetMyWizard();
|
|
|
|
|
|
|
|
if ( footprintWizard == NULL )
|
|
|
|
return;
|
|
|
|
|
|
|
|
footprintWizard->ResetParameters();
|
|
|
|
|
|
|
|
// Reload
|
|
|
|
ReCreateParameterList();
|
|
|
|
ReloadFootprint();
|
|
|
|
DisplayWizardInfos();
|
|
|
|
}
|
|
|
|
|
2020-09-08 16:19:28 +00:00
|
|
|
// This is a flag to avoid reentering of ParametersUpdated
|
|
|
|
// that can happen in some cases
|
|
|
|
static bool lock_update_prms = false;
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2012-05-16 09:35:18 +00:00
|
|
|
void FOOTPRINT_WIZARD_FRAME::ParametersUpdated( wxGridEvent& event )
|
2012-05-09 17:37:25 +00:00
|
|
|
{
|
2013-03-16 03:27:48 +00:00
|
|
|
FOOTPRINT_WIZARD* footprintWizard = GetMyWizard();
|
|
|
|
|
|
|
|
if( !footprintWizard )
|
|
|
|
return;
|
|
|
|
|
2017-12-23 17:34:57 +00:00
|
|
|
if( m_parameterGridPage < 0 )
|
2012-05-16 09:35:18 +00:00
|
|
|
return;
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2020-09-08 16:19:28 +00:00
|
|
|
if( lock_update_prms )
|
|
|
|
return;
|
|
|
|
|
2017-12-23 17:34:57 +00:00
|
|
|
wxArrayString prmValues = footprintWizard->GetParameterValues( m_parameterGridPage );
|
|
|
|
wxArrayString ptList = footprintWizard->GetParameterTypes( m_parameterGridPage );
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2015-09-02 13:55:36 +00:00
|
|
|
bool has_changed = false;
|
|
|
|
int count = m_parameterGrid->GetNumberRows();
|
|
|
|
|
|
|
|
for( int prm_id = 0; prm_id < count; ++prm_id )
|
2013-03-15 16:35:24 +00:00
|
|
|
{
|
2017-01-03 17:04:35 +00:00
|
|
|
wxString value = m_parameterGrid->GetCellValue( prm_id, WIZ_COL_VALUE );
|
2012-07-22 22:23:17 +00:00
|
|
|
|
2015-09-02 13:55:36 +00:00
|
|
|
if( prmValues[prm_id] != value )
|
|
|
|
{
|
|
|
|
has_changed = true;
|
|
|
|
prmValues[prm_id] = value;
|
|
|
|
}
|
2012-05-16 09:35:18 +00:00
|
|
|
}
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2015-09-02 13:55:36 +00:00
|
|
|
if( has_changed )
|
|
|
|
{
|
2020-09-08 16:19:28 +00:00
|
|
|
wxString res = footprintWizard->SetParameterValues( m_parameterGridPage, prmValues );
|
2013-03-15 16:35:24 +00:00
|
|
|
|
2015-09-02 13:55:36 +00:00
|
|
|
if( !res.IsEmpty() )
|
|
|
|
wxMessageBox( res );
|
|
|
|
|
|
|
|
ReloadFootprint();
|
|
|
|
DisplayWizardInfos();
|
2019-11-02 09:17:35 +00:00
|
|
|
|
|
|
|
// The python script can have modified some other parameters.
|
|
|
|
// So rebuild the current parameter list with new values, just in case.
|
2020-09-08 16:19:28 +00:00
|
|
|
//
|
|
|
|
// On wxWidgets 3.0.5, ReCreateParameterList() generates a EVT_GRID_CMD_CELL_CHANGED
|
|
|
|
// that call ParametersUpdated() and creating an infinite loop
|
|
|
|
// Note also it happens **only for languages using a comma** instead of a point
|
|
|
|
// for floating point separator
|
|
|
|
// It does not happen on wxWidgets 3.1.4
|
|
|
|
//
|
|
|
|
// So lock the next call.
|
|
|
|
lock_update_prms = true;
|
2019-11-02 09:17:35 +00:00
|
|
|
ReCreateParameterList();
|
2015-09-02 13:55:36 +00:00
|
|
|
}
|
2020-09-08 16:19:28 +00:00
|
|
|
|
|
|
|
// unlock ParametersUpdated() now the update is finished
|
|
|
|
lock_update_prms = false;
|
2012-05-09 17:37:25 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Function RedrawActiveWindow
|
|
|
|
* Display the current selected component.
|
|
|
|
* If the component is an alias, the ROOT component is displayed
|
2013-03-15 16:35:24 +00:00
|
|
|
*
|
|
|
|
*/
|
2012-05-09 17:37:25 +00:00
|
|
|
void FOOTPRINT_WIZARD_FRAME::RedrawActiveWindow( wxDC* DC, bool EraseBg )
|
|
|
|
{
|
|
|
|
if( !GetBoard() )
|
|
|
|
return;
|
|
|
|
|
|
|
|
m_canvas->DrawBackGround( DC );
|
|
|
|
GetBoard()->Draw( m_canvas, DC, GR_COPY );
|
|
|
|
|
|
|
|
MODULE* module = GetBoard()->m_Modules;
|
|
|
|
|
2013-03-15 16:35:24 +00:00
|
|
|
if( module )
|
2013-01-12 17:32:24 +00:00
|
|
|
SetMsgPanel( module );
|
2012-05-09 17:37:25 +00:00
|
|
|
|
|
|
|
m_canvas->DrawCrossHair( DC );
|
|
|
|
|
|
|
|
ClearMsgPanel();
|
2013-01-12 17:32:24 +00:00
|
|
|
|
2012-05-09 17:37:25 +00:00
|
|
|
if( module )
|
2013-01-12 17:32:24 +00:00
|
|
|
SetMsgPanel( module );
|
2012-05-09 17:37:25 +00:00
|
|
|
}
|