Browse Source

groups: add support for syncing from SCH->PCB

pull/18/head
Mike Williams 5 months ago
parent
commit
a17ef3fd93
  1. 7
      common/eda_group.h
  2. 4
      common/netlist.keywords
  3. 53
      eeschema/netlist_exporters/netlist_exporter_xml.cpp
  4. 5
      eeschema/netlist_exporters/netlist_exporter_xml.h
  5. 1
      pcbnew/cross-probing.cpp
  6. 3
      pcbnew/dialogs/dialog_import_netlist.cpp
  7. 7
      pcbnew/dialogs/dialog_import_netlist_base.cpp
  8. 1508
      pcbnew/dialogs/dialog_import_netlist_base.fbp
  9. 3
      pcbnew/dialogs/dialog_import_netlist_base.h
  10. 3
      pcbnew/dialogs/dialog_update_pcb.cpp
  11. 9
      pcbnew/dialogs/dialog_update_pcb_base.cpp
  12. 928
      pcbnew/dialogs/dialog_update_pcb_base.fbp
  13. 3
      pcbnew/dialogs/dialog_update_pcb_base.h
  14. 157
      pcbnew/netlist_reader/board_netlist_updater.cpp
  15. 7
      pcbnew/netlist_reader/board_netlist_updater.h
  16. 9
      pcbnew/netlist_reader/kicad_netlist_parser.h
  17. 99
      pcbnew/netlist_reader/kicad_netlist_reader.cpp
  18. 48
      pcbnew/netlist_reader/pcb_netlist.cpp
  19. 51
      pcbnew/netlist_reader/pcb_netlist.h
  20. 3
      pcbnew/pcbnew_settings.cpp
  21. 1
      pcbnew/pcbnew_settings.h

7
common/eda_group.h

@ -80,13 +80,6 @@ public:
*/
virtual EDA_GROUP* DeepDuplicate() const = 0;
/**
* Check if the proposed type can be added to a group
* @param aType KICAD_T type to check
* @return true if the type can belong to a group, false otherwise
*/
//virtual static bool IsGroupableType( KICAD_T aType );
protected:
std::unordered_set<EDA_ITEM*> m_items; // Members of the group
wxString m_name; // Optional group name

4
common/netlist.keywords

@ -16,6 +16,7 @@ footprint
footprints
fp
group
groups
jumper_pin_groups
lib
libpart
@ -23,6 +24,8 @@ libparts
libraries
library
libsource
member
members
name
names
net
@ -42,6 +45,7 @@ tool
tstamp
tstamps
uri
uuid
value
version
aliases

53
eeschema/netlist_exporters/netlist_exporter_xml.cpp

@ -28,6 +28,7 @@
#include <build_version.h>
#include <common.h> // for ExpandTextVars
#include <sch_base_frame.h>
#include <sch_group.h>
#include <symbol_library.h>
#include <string_utils.h>
#include <connection_graph.h>
@ -73,8 +74,13 @@ XNODE* NETLIST_EXPORTER_XML::makeRoot( unsigned aCtl )
xroot->AddChild( makeDesignHeader() );
if( aCtl & GNL_SYMBOLS )
{
xroot->AddChild( makeSymbols( aCtl ) );
if( aCtl & GNL_OPT_KICAD )
xroot->AddChild( makeGroups() );
}
if( aCtl & GNL_PARTS )
xroot->AddChild( makeLibParts() );
@ -484,6 +490,53 @@ XNODE* NETLIST_EXPORTER_XML::makeSymbols( unsigned aCtl )
}
XNODE* NETLIST_EXPORTER_XML::makeGroups()
{
XNODE* xcomps = node( wxT( "groups" ) );
m_referencesAlreadyFound.Clear();
m_libParts.clear();
SCH_SHEET_PATH currentSheet = m_schematic->CurrentSheet();
SCH_SHEET_LIST sheetList = m_schematic->Hierarchy();
for( const SCH_SHEET_PATH& sheet : sheetList )
{
// Change schematic CurrentSheet in each iteration to allow hierarchical
// resolution of text variables in sheet fields.
m_schematic->SetCurrentSheet( sheet );
for( SCH_ITEM* item : sheet.LastScreen()->Items().OfType( SCH_GROUP_T ) )
{
SCH_GROUP* group = static_cast<SCH_GROUP*>( item );
XNODE* xgroup; // current symbol being constructed
xcomps->AddChild( xgroup = node( wxT( "group" ) ) );
xgroup->AddAttribute( wxT( "name" ), group->GetName() );
xgroup->AddAttribute( wxT( "uuid" ), group->m_Uuid.AsString() );
XNODE* xmembers;
xgroup->AddChild( xmembers = node( wxT( "members" ) ) );
for( EDA_ITEM* member : group->GetItems() )
{
if( member->Type() == SCH_SYMBOL_T )
{
XNODE* xmember;
xmembers->AddChild( xmember = node( wxT( "member" ) ) );
xmember->AddAttribute( wxT( "uuid" ), member->m_Uuid.AsString() );
}
}
}
}
m_schematic->SetCurrentSheet( currentSheet );
return xcomps;
}
std::vector<wxString> NETLIST_EXPORTER_XML::getComponentClassNamesForAllSymbolUnits(
SCH_SYMBOL* aSymbol, const SCH_SHEET_PATH& aSymbolSheet, const SCH_SHEET_LIST& aSheetList )
{

5
eeschema/netlist_exporters/netlist_exporter_xml.h

@ -105,6 +105,11 @@ protected:
*/
XNODE* makeSymbols( unsigned aCtl );
/**
* @return a sub-tree holding all the schematic groups.
*/
XNODE* makeGroups();
/**
* Fill out a project "design" header into an XML node.
* @return the design header

1
pcbnew/cross-probing.cpp

@ -600,6 +600,7 @@ void PCB_EDIT_FRAME::KiwayMailIn( KIWAY_EXPRESS& mail )
updater.SetLookupByTimestamp( false );
updater.SetDeleteUnusedFootprints( false );
updater.SetReplaceFootprints( false );
updater.SetTransferGroups( false );
updater.UpdateNetlist( netlist );
bool dummy;

3
pcbnew/dialogs/dialog_import_netlist.cpp

@ -71,6 +71,7 @@ DIALOG_IMPORT_NETLIST::DIALOG_IMPORT_NETLIST( PCB_EDIT_FRAME* aParent,
auto cfg = m_parent->GetPcbNewSettings();
m_cbUpdateFootprints->SetValue( cfg->m_NetlistDialog.update_footprints );
m_cbTransferGroups->SetValue( cfg->m_NetlistDialog.transfer_groups );
m_cbDeleteShortingTracks->SetValue( cfg->m_NetlistDialog.delete_shorting_tracks );
m_cbDeleteExtraFootprints->SetValue( cfg->m_NetlistDialog.delete_extra_footprints );
@ -108,6 +109,7 @@ DIALOG_IMPORT_NETLIST::~DIALOG_IMPORT_NETLIST()
{
cfg->m_NetlistDialog.report_filter = m_MessageWindow->GetVisibleSeverities();
cfg->m_NetlistDialog.update_footprints = m_cbUpdateFootprints->GetValue();
cfg->m_NetlistDialog.transfer_groups = m_cbTransferGroups->GetValue();
cfg->m_NetlistDialog.delete_shorting_tracks = m_cbDeleteShortingTracks->GetValue();
cfg->m_NetlistDialog.delete_extra_footprints = m_cbDeleteExtraFootprints->GetValue();
}
@ -264,6 +266,7 @@ void DIALOG_IMPORT_NETLIST::loadNetlist( bool aDryRun )
updater.SetLookupByTimestamp( m_matchByUUID );
updater.SetDeleteUnusedFootprints( m_cbDeleteExtraFootprints->GetValue());
updater.SetReplaceFootprints( m_cbUpdateFootprints->GetValue() );
updater.SetTransferGroups( m_cbTransferGroups->GetValue() );
updater.SetOverrideLocks( m_cbOverrideLocks->GetValue() );
updater.UpdateNetlist( netlist );

7
pcbnew/dialogs/dialog_import_netlist_base.cpp

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b)
// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf-dirty)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -56,6 +56,9 @@ DIALOG_IMPORT_NETLIST_BASE::DIALOG_IMPORT_NETLIST_BASE( wxWindow* parent, wxWind
m_cbUpdateFootprints = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Replace footprints with those specified in netlist"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizer1->Add( m_cbUpdateFootprints, 0, wxBOTTOM, 5 );
m_cbTransferGroups = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Group footprints based on symbol group"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizer1->Add( m_cbTransferGroups, 0, wxBOTTOM, 5 );
m_cbOverrideLocks = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Delete/replace footprints even if locked"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizer1->Add( m_cbOverrideLocks, 0, wxBOTTOM|wxRIGHT, 5 );
@ -105,6 +108,7 @@ DIALOG_IMPORT_NETLIST_BASE::DIALOG_IMPORT_NETLIST_BASE( wxWindow* parent, wxWind
m_matchByTimestamp->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnMatchChanged ), NULL, this );
m_cbDeleteExtraFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
m_cbUpdateFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
m_cbTransferGroups->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
m_cbOverrideLocks->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
m_cbDeleteShortingTracks->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
m_sdbSizerApply->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::onUpdatePCB ), NULL, this );
@ -119,6 +123,7 @@ DIALOG_IMPORT_NETLIST_BASE::~DIALOG_IMPORT_NETLIST_BASE()
m_matchByTimestamp->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnMatchChanged ), NULL, this );
m_cbDeleteExtraFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
m_cbUpdateFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
m_cbTransferGroups->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
m_cbOverrideLocks->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
m_cbDeleteShortingTracks->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
m_sdbSizerApply->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::onUpdatePCB ), NULL, this );

1508
pcbnew/dialogs/dialog_import_netlist_base.fbp
File diff suppressed because it is too large
View File

3
pcbnew/dialogs/dialog_import_netlist_base.h

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b)
// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf-dirty)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -48,6 +48,7 @@ class DIALOG_IMPORT_NETLIST_BASE : public DIALOG_SHIM
wxRadioBox* m_matchByTimestamp;
wxCheckBox* m_cbDeleteExtraFootprints;
wxCheckBox* m_cbUpdateFootprints;
wxCheckBox* m_cbTransferGroups;
wxCheckBox* m_cbOverrideLocks;
wxCheckBox* m_cbDeleteShortingTracks;
WX_HTML_REPORT_PANEL* m_MessageWindow;

3
pcbnew/dialogs/dialog_update_pcb.cpp

@ -45,6 +45,7 @@ DIALOG_UPDATE_PCB::DIALOG_UPDATE_PCB( PCB_EDIT_FRAME* aParent, NETLIST* aNetlist
m_cbRelinkFootprints->SetValue( cfg->m_NetlistDialog.associate_by_ref_sch );
m_cbUpdateFootprints->SetValue( cfg->m_NetlistDialog.update_footprints );
m_cbTransferGroups->SetValue( cfg->m_NetlistDialog.transfer_groups );
m_cbDeleteExtraFootprints->SetValue( cfg->m_NetlistDialog.delete_extra_footprints );
m_messagePanel->SetLabel( _("Changes to Be Applied") );
@ -84,6 +85,7 @@ DIALOG_UPDATE_PCB::~DIALOG_UPDATE_PCB()
{
cfg->m_NetlistDialog.associate_by_ref_sch = m_cbRelinkFootprints->GetValue();
cfg->m_NetlistDialog.update_footprints = m_cbUpdateFootprints->GetValue();
cfg->m_NetlistDialog.transfer_groups = m_cbTransferGroups->GetValue();
cfg->m_NetlistDialog.delete_extra_footprints = m_cbDeleteExtraFootprints->GetValue();
cfg->m_NetlistDialog.report_filter = m_messagePanel->GetVisibleSeverities();
}
@ -120,6 +122,7 @@ void DIALOG_UPDATE_PCB::PerformUpdate( bool aDryRun )
updater.SetLookupByTimestamp( !m_cbRelinkFootprints->GetValue() );
updater.SetDeleteUnusedFootprints( m_cbDeleteExtraFootprints->GetValue());
updater.SetReplaceFootprints( m_cbUpdateFootprints->GetValue() );
updater.SetTransferGroups( m_cbTransferGroups->GetValue() );
updater.SetOverrideLocks( m_cbOverrideLocks->GetValue() );
updater.UpdateNetlist( *m_netlist );

9
pcbnew/dialogs/dialog_update_pcb_base.cpp

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b)
// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf-dirty)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -40,8 +40,11 @@ DIALOG_UPDATE_PCB_BASE::DIALOG_UPDATE_PCB_BASE( wxWindow* parent, wxWindowID id,
sbSizer1->Add( m_cbUpdateFootprints, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
m_cbTransferGroups = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Group footprints based on symbol group"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizer1->Add( m_cbTransferGroups, 0, wxBOTTOM|wxLEFT|wxRIGHT, 5 );
m_cbOverrideLocks = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Delete/replace footprints even if locked"), wxDefaultPosition, wxDefaultSize, 0 );
sbSizer1->Add( m_cbOverrideLocks, 0, wxBOTTOM|wxRIGHT|wxLEFT, 5 );
sbSizer1->Add( m_cbOverrideLocks, 0, wxBOTTOM|wxLEFT|wxRIGHT, 5 );
bUpperSizer->Add( sbSizer1, 1, wxEXPAND|wxTOP|wxRIGHT|wxLEFT, 5 );
@ -77,6 +80,7 @@ DIALOG_UPDATE_PCB_BASE::DIALOG_UPDATE_PCB_BASE( wxWindow* parent, wxWindowID id,
m_cbRelinkFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbDeleteExtraFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbUpdateFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbTransferGroups->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbOverrideLocks->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_sdbSizer1OK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnUpdateClick ), NULL, this );
}
@ -87,6 +91,7 @@ DIALOG_UPDATE_PCB_BASE::~DIALOG_UPDATE_PCB_BASE()
m_cbRelinkFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbDeleteExtraFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbUpdateFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbTransferGroups->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_cbOverrideLocks->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnOptionChanged ), NULL, this );
m_sdbSizer1OK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_UPDATE_PCB_BASE::OnUpdateClick ), NULL, this );

928
pcbnew/dialogs/dialog_update_pcb_base.fbp

@ -1,439 +1,511 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<wxFormBuilder_Project>
<FileVersion major="1" minor="16" />
<object class="Project" expanded="1">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file">dialog_update_pcb_base</property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="image_path_wrapper_function_name"></property>
<property name="indent_with_spaces"></property>
<property name="internationalize">1</property>
<property name="name">dialog_update_pcb_base</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_lua_events">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="ui_table">UI</property>
<property name="use_array_enum">0</property>
<property name="use_enum">1</property>
<property name="use_microsoft_bom">0</property>
<object class="Dialog" expanded="1">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="center"></property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="extra_style"></property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size">-1,-1</property>
<property name="name">DIALOG_UPDATE_PCB_BASE</property>
<property name="pos"></property>
<property name="size">-1,-1</property>
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
<property name="title">Update PCB from Schematic</property>
<property name="tooltip"></property>
<property name="two_step_creation">0</property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<object class="wxBoxSizer" expanded="1">
<FileVersion major="1" minor="17"/>
<object class="Project" expanded="true">
<property name="class_decoration"></property>
<property name="code_generation">C++</property>
<property name="disconnect_events">1</property>
<property name="disconnect_mode">source_name</property>
<property name="disconnect_php_events">0</property>
<property name="disconnect_python_events">0</property>
<property name="embedded_files_path">res</property>
<property name="encoding">UTF-8</property>
<property name="event_generation">connect</property>
<property name="file">dialog_update_pcb_base</property>
<property name="first_id">1000</property>
<property name="help_provider">none</property>
<property name="image_path_wrapper_function_name"></property>
<property name="indent_with_spaces"></property>
<property name="internationalize">1</property>
<property name="name">dialog_update_pcb_base</property>
<property name="namespace"></property>
<property name="path">.</property>
<property name="precompiled_header"></property>
<property name="relative_path">1</property>
<property name="skip_lua_events">1</property>
<property name="skip_php_events">1</property>
<property name="skip_python_events">1</property>
<property name="ui_table">UI</property>
<property name="use_array_enum">0</property>
<property name="use_enum">1</property>
<property name="use_microsoft_bom">0</property>
<object class="Dialog" expanded="true">
<property name="aui_managed">0</property>
<property name="aui_manager_style">wxAUI_MGR_DEFAULT</property>
<property name="bg"></property>
<property name="center"></property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="event_handler">impl_virtual</property>
<property name="extra_style"></property>
<property name="fg"></property>
<property name="font"></property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="maximum_size"></property>
<property name="minimum_size">-1,-1</property>
<property name="name">DIALOG_UPDATE_PCB_BASE</property>
<property name="pos"></property>
<property name="size">-1,-1</property>
<property name="style">wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</property>
<property name="subclass">DIALOG_SHIM; dialog_shim.h</property>
<property name="title">Update PCB from Schematic</property>
<property name="tooltip"></property>
<property name="two_step_creation">0</property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<object class="wxBoxSizer" expanded="true">
<property name="minimum_size"></property>
<property name="name">bMainSizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="true">
<property name="minimum_size"></property>
<property name="name">bUpperSizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property>
<property name="proportion">1</property>
<object class="wxStaticBoxSizer" expanded="true">
<property name="id">wxID_ANY</property>
<property name="label">Options</property>
<property name="minimum_size"></property>
<property name="name">bMainSizer</property>
<property name="name">sbSizer1</property>
<property name="orient">wxVERTICAL</property>
<property name="parent">1</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size"></property>
<property name="name">bUpperSizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property>
<property name="proportion">1</property>
<object class="wxStaticBoxSizer" expanded="1">
<property name="id">wxID_ANY</property>
<property name="label">Options</property>
<property name="minimum_size"></property>
<property name="name">sbSizer1</property>
<property name="orient">wxVERTICAL</property>
<property name="parent">1</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="checked">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Re-link footprints to schematic symbols based on their reference designators</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cbRelinkFootprints</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip">Normally footprints are linked to their symbols via their Unique IDs. Select this option only if you want to reset the footprint linkages based on their reference designators.</property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnCheckBox">OnOptionChanged</event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="checked">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Delete footprints with no symbols</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cbDeleteExtraFootprints</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip">Remove from the board unlocked footprints which are not linked to a schematic symbol.</property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnCheckBox">OnOptionChanged</event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="checked">1</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Replace footprints with those specified in the schematic</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cbUpdateFootprints</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip">Normally footprints on the board should be changed to match footprint assignment changes made in the schematic. Uncheck this only if you don&apos;t want to change existing footprints on the board.</property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnCheckBox">OnOptionChanged</event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="checked">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Delete/replace footprints even if locked</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cbOverrideLocks</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnCheckBox">OnOptionChanged</event>
</object>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="checked">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Re-link footprints to schematic symbols based on their reference designators</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cbRelinkFootprints</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip">Normally footprints are linked to their symbols via their Unique IDs. Select this option only if you want to reset the footprint linkages based on their reference designators.</property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnCheckBox">OnOptionChanged</event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="1">
<property name="minimum_size">660,300</property>
<property name="name">bLowerSizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxEXPAND | wxALL</property>
<property name="proportion">1</property>
<object class="wxPanel" expanded="1">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">-1,-1</property>
<property name="moveable">1</property>
<property name="name">m_messagePanel</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size">-1,-1</property>
<property name="subclass">WX_HTML_REPORT_PANEL; widgets/wx_html_report_panel.h; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxTAB_TRAVERSAL</property>
</object>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="checked">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Delete footprints with no symbols</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cbDeleteExtraFootprints</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip">Remove from the board unlocked footprints which are not linked to a schematic symbol.</property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnCheckBox">OnOptionChanged</event>
</object>
</object>
<object class="sizeritem" expanded="1">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxStdDialogButtonSizer" expanded="1">
<property name="Apply">0</property>
<property name="Cancel">1</property>
<property name="ContextHelp">0</property>
<property name="Help">0</property>
<property name="No">0</property>
<property name="OK">1</property>
<property name="Save">0</property>
<property name="Yes">0</property>
<property name="minimum_size"></property>
<property name="name">m_sdbSizer1</property>
<property name="permission">protected</property>
<event name="OnOKButtonClick">OnUpdateClick</event>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxRIGHT|wxLEFT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="checked">1</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Replace footprints with those specified in the schematic</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cbUpdateFootprints</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip">Normally footprints on the board should be changed to match footprint assignment changes made in the schematic. Uncheck this only if you don&apos;t want to change existing footprints on the board.</property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnCheckBox">OnOptionChanged</event>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxLEFT|wxRIGHT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="checked">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Group footprints based on symbol group</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cbTransferGroups</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnCheckBox">OnOptionChanged</event>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxBOTTOM|wxLEFT|wxRIGHT</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="checked">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Delete/replace footprints even if locked</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_cbOverrideLocks</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass">; ; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnCheckBox">OnOptionChanged</event>
</object>
</object>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND|wxTOP|wxRIGHT|wxLEFT</property>
<property name="proportion">1</property>
<object class="wxBoxSizer" expanded="true">
<property name="minimum_size">660,300</property>
<property name="name">bLowerSizer</property>
<property name="orient">wxVERTICAL</property>
<property name="permission">none</property>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxEXPAND | wxALL</property>
<property name="proportion">1</property>
<object class="wxPanel" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer"></property>
<property name="aui_name"></property>
<property name="aui_position"></property>
<property name="aui_row"></property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size">-1,-1</property>
<property name="moveable">1</property>
<property name="name">m_messagePanel</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size">-1,-1</property>
<property name="subclass">WX_HTML_REPORT_PANEL; widgets/wx_html_report_panel.h; forward_declare</property>
<property name="toolbar_pane">0</property>
<property name="tooltip"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style">wxTAB_TRAVERSAL</property>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxALL|wxEXPAND</property>
<property name="proportion">0</property>
<object class="wxStdDialogButtonSizer" expanded="true">
<property name="Apply">0</property>
<property name="Cancel">1</property>
<property name="ContextHelp">0</property>
<property name="Help">0</property>
<property name="No">0</property>
<property name="OK">1</property>
<property name="Save">0</property>
<property name="Yes">0</property>
<property name="minimum_size"></property>
<property name="name">m_sdbSizer1</property>
<property name="permission">protected</property>
<event name="OnOKButtonClick">OnUpdateClick</event>
</object>
</object>
</object>
</object>
</object>
</wxFormBuilder_Project>

3
pcbnew/dialogs/dialog_update_pcb_base.h

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b)
// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf-dirty)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -38,6 +38,7 @@ class DIALOG_UPDATE_PCB_BASE : public DIALOG_SHIM
wxCheckBox* m_cbRelinkFootprints;
wxCheckBox* m_cbDeleteExtraFootprints;
wxCheckBox* m_cbUpdateFootprints;
wxCheckBox* m_cbTransferGroups;
wxCheckBox* m_cbOverrideLocks;
WX_HTML_REPORT_PANEL* m_messagePanel;
wxStdDialogButtonSizer* m_sdbSizer1;

157
pcbnew/netlist_reader/board_netlist_updater.cpp

@ -36,6 +36,7 @@
#include <netinfo.h>
#include <footprint.h>
#include <pad.h>
#include <pcb_group.h>
#include <pcb_track.h>
#include <zone.h>
#include <string_utils.h>
@ -59,6 +60,7 @@ BOARD_NETLIST_UPDATER::BOARD_NETLIST_UPDATER( PCB_EDIT_FRAME* aFrame, BOARD* aBo
m_isDryRun = false;
m_replaceFootprints = true;
m_lookupByTimestamp = false;
m_transferGroups = false;
m_overrideLocks = false;
m_warningCount = 0;
@ -804,6 +806,120 @@ bool BOARD_NETLIST_UPDATER::updateFootprintParameters( FOOTPRINT* aPcbFootprint,
}
bool BOARD_NETLIST_UPDATER::updateFootprintGroup( FOOTPRINT* aPcbFootprint,
COMPONENT* aNetlistComponent )
{
if( !m_transferGroups )
return false;
wxString msg;
// Create a copy only if the footprint has not been added during this update
FOOTPRINT* copy = nullptr;
if( !m_commit.GetStatus( aPcbFootprint ) )
{
copy = static_cast<FOOTPRINT*>( aPcbFootprint->Clone() );
copy->SetParentGroup( nullptr );
}
bool changed = false;
// These hold the info for group and group KIID coming from the netlist
// newGroup may point to an existing group on the board if we find an
// incoming group UUID that matches an existing group
PCB_GROUP* newGroup = nullptr;
KIID newGroupKIID = aNetlistComponent->GetGroup() ? aNetlistComponent->GetGroup()->uuid : 0;
PCB_GROUP* existingGroup = static_cast<PCB_GROUP*>( aPcbFootprint->GetParentGroup() );
KIID existingGroupKIID = existingGroup ? existingGroup->m_Uuid : 0;
// Find existing group based on matching UUIDs
auto it = std::find_if( m_board->Groups().begin(), m_board->Groups().end(),
[&](PCB_GROUP* group) {
return group->m_Uuid == newGroupKIID;
});
// If we find a group with the same UUID, use it
if( it != m_board->Groups().end() )
newGroup = *it;
// No changes, nothing to do
if( newGroupKIID == existingGroupKIID )
return changed;
// Remove from existing group
if( existingGroupKIID != 0 )
{
if( m_isDryRun )
{
msg.Printf( _( "Remove %s from group \"%s\"." ),
aPcbFootprint->GetReference(),
EscapeHTML( existingGroup->GetName() ) );
}
else
{
msg.Printf( _( "Removed %s from group \"%s\"." ),
aPcbFootprint->GetReference(),
EscapeHTML( existingGroup->GetName() ) );
changed = true;
m_commit.Modify( aPcbFootprint->GetParentGroup()->AsEdaItem() );
aPcbFootprint->GetParentGroup()->RemoveItem( aPcbFootprint );
aPcbFootprint->SetParentGroup( nullptr );
}
m_reporter->Report( msg, RPT_SEVERITY_ACTION );
}
// Add to new group
if( newGroupKIID != 0 )
{
if( m_isDryRun )
{
msg.Printf( _( "Add %s to group \"%s\"." ),
aPcbFootprint->GetReference(),
EscapeHTML( aNetlistComponent->GetGroup()->name ) );
}
else
{
msg.Printf( _( "Added %s group \"%s\"." ),
aPcbFootprint->GetReference(),
EscapeHTML( aNetlistComponent->GetGroup()->name ) );
changed = true;
if( newGroup == nullptr )
{
newGroup = new PCB_GROUP( m_board );
const_cast<KIID&>( newGroup->m_Uuid ) = newGroupKIID;
newGroup->SetName( aNetlistComponent->GetGroup()->name );
m_board->Add( newGroup );
newGroup->AddItem( aPcbFootprint );
m_commit.Add( newGroup );
}
else
{
newGroup->AddItem( aPcbFootprint );
m_commit.Modify( newGroup->AsEdaItem() );
}
aPcbFootprint->SetParentGroup( newGroup );
}
m_reporter->Report( msg, RPT_SEVERITY_ACTION );
}
if( changed && copy )
m_commit.Modified( aPcbFootprint, copy );
else if( copy )
delete copy;
return changed;
}
bool BOARD_NETLIST_UPDATER::updateComponentPadConnections( FOOTPRINT* aFootprint,
COMPONENT* aNewComponent )
{
@ -1228,6 +1344,44 @@ bool BOARD_NETLIST_UPDATER::updateCopperZoneNets( NETLIST& aNetlist )
}
bool BOARD_NETLIST_UPDATER::updateGroups( NETLIST& aNetlist )
{
if( !m_transferGroups )
return false;
for( PCB_GROUP* pcbGroup : m_board->Groups() )
{
NETLIST_GROUP* netlistGroup = aNetlist.GetGroupByUuid( pcbGroup->m_Uuid );
if( netlistGroup == nullptr )
continue;
if( netlistGroup->name == pcbGroup->GetName() )
continue;
if( m_isDryRun )
{
wxString msg;
msg.Printf( _( "Change group name to '%s' to '%s'." ),
EscapeHTML( pcbGroup->GetName() ),
EscapeHTML( netlistGroup->name ) );
m_reporter->Report( msg, RPT_SEVERITY_ACTION );
}
else
{
wxString msg;
msg.Printf( _( "Changed group name to '%s' to '%s'." ),
EscapeHTML( pcbGroup->GetName() ),
EscapeHTML( netlistGroup->name ) );
m_commit.Modify( pcbGroup->AsEdaItem() );
pcbGroup->SetName( netlistGroup->name );
}
}
return true;
}
bool BOARD_NETLIST_UPDATER::testConnectivity( NETLIST& aNetlist,
std::map<COMPONENT*, FOOTPRINT*>& aFootprintMap )
{
@ -1361,6 +1515,7 @@ bool BOARD_NETLIST_UPDATER::UpdateNetlist( NETLIST& aNetlist )
footprintMap[ component ] = tmp;
updateFootprintParameters( tmp, component );
updateFootprintGroup( tmp, component );
updateComponentPadConnections( tmp, component );
updateComponentClass( tmp, component );
@ -1386,6 +1541,7 @@ bool BOARD_NETLIST_UPDATER::UpdateNetlist( NETLIST& aNetlist )
footprintMap[ component ] = footprint;
updateFootprintParameters( footprint, component );
updateFootprintGroup( footprint, component );
updateComponentPadConnections( footprint, component );
updateComponentClass( footprint, component );
@ -1402,6 +1558,7 @@ bool BOARD_NETLIST_UPDATER::UpdateNetlist( NETLIST& aNetlist )
}
updateCopperZoneNets( aNetlist );
updateGroups( aNetlist );
// Finally go through the board footprints and update all those that *don't* have matching
// component entries.

7
pcbnew/netlist_reader/board_netlist_updater.h

@ -85,6 +85,8 @@ public:
void SetReplaceFootprints( bool aEnabled ) { m_replaceFootprints = aEnabled; }
void SetTransferGroups( bool aEnabled ) { m_transferGroups = aEnabled; }
void SetOverrideLocks( bool aOverride ) { m_overrideLocks = aOverride; }
void SetDeleteUnusedFootprints( bool aEnabled ) { m_deleteUnusedFootprints = aEnabled; }
@ -109,6 +111,8 @@ private:
bool updateFootprintParameters( FOOTPRINT* aPcbFootprint, COMPONENT* aNetlistComponent );
bool updateFootprintGroup( FOOTPRINT* aPcbFootprint, COMPONENT* aNetlistComponent );
bool updateComponentPadConnections( FOOTPRINT* aFootprint, COMPONENT* aNewComponent );
void updateComponentClass( FOOTPRINT* aFootprint, COMPONENT* aNewComponent );
@ -117,6 +121,8 @@ private:
bool updateCopperZoneNets( NETLIST& aNetlist );
bool updateGroups( NETLIST& aNetlist );
bool testConnectivity( NETLIST& aNetlist, std::map<COMPONENT*, FOOTPRINT*>& aFootprintMap );
PCB_EDIT_FRAME* m_frame;
@ -134,6 +140,7 @@ private:
bool m_deleteUnusedFootprints;
bool m_isDryRun;
bool m_replaceFootprints;
bool m_transferGroups; // copy component group associations from schematic to PCB
bool m_lookupByTimestamp;
bool m_overrideLocks;

9
pcbnew/netlist_reader/kicad_netlist_parser.h

@ -73,6 +73,15 @@ private:
*/
void parseNet();
/**
* Parse a group section
* (group (name "GroupName")
* (member (uuid "..."))))
*
* and set the corresponding pads netnames
*/
void parseGroup();
/**
* Read the section "libparts" in the netlist:
* (libparts

99
pcbnew/netlist_reader/kicad_netlist_reader.cpp

@ -117,6 +117,20 @@ void KICAD_NETLIST_PARSER::Parse()
break;
case T_groups: // The section groups starts here.
while( ( token = NextTok() ) != T_EOF )
{
if( token == T_RIGHT )
break;
else if( token == T_LEFT )
token = NextTok();
if( token == T_group ) // A group section found. Read it
parseGroup();
}
break;
case T_nets: // The section nets starts here.
while( ( token = NextTok() ) != T_EOF )
{
@ -166,6 +180,9 @@ void KICAD_NETLIST_PARSER::Parse()
}
}
// Go back and apply group information to the components
m_netlist->ApplyGroupMembership();
if( plevel != 0 )
{
wxFAIL_MSG( wxString::Format( wxT( "KICAD_NETLIST_PARSER::Parse(): bad parenthesis "
@ -565,6 +582,88 @@ void KICAD_NETLIST_PARSER::parseComponent()
}
void KICAD_NETLIST_PARSER::parseGroup()
{
/* Parses a section like
* (groups
* (group (name "") (uuid "7b1488be-4c43-4004-94fc-e4a26dda8f5b")
* (member (uuid "dfef752d-e203-4feb-91de-483b44bc4062"))
*/
wxString name;
KIID uuid;
std::vector<KIID> members;
// The token net was read, so the next data is (code <number>)
while( (token = NextTok() ) != T_EOF )
{
if( token == T_RIGHT )
break;
else if( token == T_LEFT )
token = NextTok();
switch( token )
{
case T_name:
NeedSYMBOLorNUMBER();
name = From_UTF8( CurText() );
NeedRIGHT();
break;
case T_uuid:
NeedSYMBOLorNUMBER();
uuid = From_UTF8( CurText() );
NeedRIGHT();
break;
case T_members:
while( ( token = NextTok() ) != T_RIGHT )
{
if( token == T_LEFT )
token = NextTok();
if( token == T_member )
{
wxString memberUuid;
while( ( token = NextTok() ) != T_RIGHT )
{
if( token == T_LEFT )
token = NextTok();
if( token == T_uuid )
{
NeedSYMBOLorNUMBER();
memberUuid = From_UTF8( CurText() );
NeedRIGHT();
}
else
{
Expecting( "uuid" );
}
}
members.emplace_back( memberUuid );
}
else
{
Expecting( "member" );
}
}
break;
default:
skipCurrent();
break;
}
}
NETLIST_GROUP* group = new NETLIST_GROUP { name, uuid, members };
m_netlist->AddGroup( group );
}
void KICAD_NETLIST_PARSER::parseLibPartList()
{
/* Parses a section like

48
pcbnew/netlist_reader/pcb_netlist.cpp

@ -165,6 +165,23 @@ void NETLIST::AddComponent( COMPONENT* aComponent )
}
void NETLIST::AddGroup( NETLIST_GROUP* aComponent )
{
m_groups.push_back( aComponent );
}
NETLIST_GROUP* NETLIST::GetGroupByUuid( const KIID& aUuid )
{
for( NETLIST_GROUP& group : m_groups )
{
if( group.uuid == aUuid )
return &group;
}
return nullptr;
}
COMPONENT* NETLIST::GetComponentByReference( const wxString& aReference )
{
COMPONENT* component = nullptr;
@ -208,6 +225,24 @@ COMPONENT* NETLIST::GetComponentByPath( const KIID_PATH& aUuidPath )
}
COMPONENT* NETLIST::GetComponentByUuid( const KIID& aUuid)
{
if( aUuid == 0 )
return nullptr;
for( COMPONENT& component : m_components )
{
for( const KIID& compUuid : component.GetKIIDs() )
{
if( aUuid == compUuid )
return &component;
}
}
return nullptr;
}
/**
* A helper function used to sort the component list used by loadNewModules.
*/
@ -250,3 +285,16 @@ bool NETLIST::AnyFootprintsLinked() const
}
void NETLIST::ApplyGroupMembership()
{
for( NETLIST_GROUP& group : m_groups )
{
for( KIID& member : group.members )
{
COMPONENT* component = GetComponentByUuid( member );
if( component )
component->SetGroup( &group );
}
}
}

51
pcbnew/netlist_reader/pcb_netlist.h

@ -81,6 +81,17 @@ private:
typedef std::vector< COMPONENT_NET > COMPONENT_NETS;
struct NETLIST_GROUP
{
wxString name;
KIID uuid;
std::vector<KIID> members;
};
typedef boost::ptr_vector< NETLIST_GROUP > NETLIST_GROUPS;
/**
* Store all of the related footprint information found in a netlist.
*/
@ -100,6 +111,7 @@ public:
m_path = aPath;
m_kiids = aKiids;
m_duplicatePadNumbersAreJumpers = false;
m_group = nullptr;
}
virtual ~COMPONENT() { };
@ -190,6 +202,9 @@ public:
std::vector<std::set<wxString>>& JumperPadGroups() { return m_jumperPadGroups; }
const std::vector<std::set<wxString>>& JumperPadGroups() const { return m_jumperPadGroups; }
NETLIST_GROUP* GetGroup() const { return m_group; }
void SetGroup( NETLIST_GROUP* aGroup ) { m_group = aGroup; }
private:
std::vector<COMPONENT_NET> m_nets; ///< list of nets shared by the component pins
@ -240,6 +255,9 @@ private:
/// number as jumpered pin groups
bool m_duplicatePadNumbersAreJumpers;
/// Group membership for this footprint. Nullptr if none.
NETLIST_GROUP* m_group;
static COMPONENT_NET m_emptyNet;
};
@ -293,6 +311,29 @@ public:
*/
void AddComponent( COMPONENT* aComponent );
/**
* @note If \a aGroup already exists in the NETLIST, \a aGroup is deleted
* to prevent memory leaks. An assertion is raised in debug builds.
*
* @param aGroup is the NETLIST_GROUP to save to the NETLIST.
*/
void AddGroup( NETLIST_GROUP* aGroup );
/**
* @brief Return a #NETLIST_GROUP by \a aUuid.
*
* @param aUuid is the KIID of the #NETLIST_GROUP.
*
* @return a pointer to the #NETLIST_GROUP that matches \a aUuid if found. Otherwise NULL.
*/
NETLIST_GROUP* GetGroupByUuid( const KIID& aUuid );
/**
* After groups and components are parsed, apply the group memberships to the
* internal components based on the group member UUIDs.
*/
void ApplyGroupMembership();
/**
* Return a #COMPONENT by \a aReference.
*
@ -309,6 +350,14 @@ public:
*/
COMPONENT* GetComponentByPath( const KIID_PATH& aPath );
/**
* Return a #COMPONENT by \a aUuid.
*
* @param aUuid is the KIID of the #COMPONENT.
* @return a pointer to the #COMPONENT that matches \a aUuid if found. Otherwise NULL.
*/
COMPONENT* GetComponentByUuid( const KIID& aUuid );
void SortByFPID();
void SortByReference();
@ -334,6 +383,8 @@ public:
private:
COMPONENTS m_components; // Components found in the netlist.
NETLIST_GROUPS m_groups; // Groups found in the netlist.
bool m_findByTimeStamp; // Associate components by KIID (or refdes if false)
bool m_replaceFootprints; // Update footprints to match footprints defined in netlist

3
pcbnew/pcbnew_settings.cpp

@ -492,6 +492,9 @@ PCBNEW_SETTINGS::PCBNEW_SETTINGS()
m_params.emplace_back( new PARAM<bool>( "netlist.update_footprints",
&m_NetlistDialog.update_footprints, true ) );
m_params.emplace_back( new PARAM<bool>( "netlist.transfer_groups",
&m_NetlistDialog.transfer_groups, true ) );
m_params.emplace_back( new PARAM<bool>( "netlist.delete_shorting_tracks",
&m_NetlistDialog.delete_shorting_tracks, false ) );

1
pcbnew/pcbnew_settings.h

@ -274,6 +274,7 @@ public:
{
int report_filter;
bool update_footprints;
bool transfer_groups;
bool delete_shorting_tracks;
bool delete_extra_footprints;
bool associate_by_ref_sch;

Loading…
Cancel
Save