Skip to content

Commit a17ef3f

Browse files
committed
groups: add support for syncing from SCH->PCB
1 parent b14472e commit a17ef3f

21 files changed

+1753
-1156
lines changed

common/eda_group.h

-7
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,6 @@ class EDA_GROUP
8080
*/
8181
virtual EDA_GROUP* DeepDuplicate() const = 0;
8282

83-
/**
84-
* Check if the proposed type can be added to a group
85-
* @param aType KICAD_T type to check
86-
* @return true if the type can belong to a group, false otherwise
87-
*/
88-
//virtual static bool IsGroupableType( KICAD_T aType );
89-
9083
protected:
9184
std::unordered_set<EDA_ITEM*> m_items; // Members of the group
9285
wxString m_name; // Optional group name

common/netlist.keywords

+4
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,16 @@ footprint
1616
footprints
1717
fp
1818
group
19+
groups
1920
jumper_pin_groups
2021
lib
2122
libpart
2223
libparts
2324
libraries
2425
library
2526
libsource
27+
member
28+
members
2629
name
2730
names
2831
net
@@ -42,6 +45,7 @@ tool
4245
tstamp
4346
tstamps
4447
uri
48+
uuid
4549
value
4650
version
4751
aliases

eeschema/netlist_exporters/netlist_exporter_xml.cpp

+53
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <build_version.h>
2929
#include <common.h> // for ExpandTextVars
3030
#include <sch_base_frame.h>
31+
#include <sch_group.h>
3132
#include <symbol_library.h>
3233
#include <string_utils.h>
3334
#include <connection_graph.h>
@@ -73,8 +74,13 @@ XNODE* NETLIST_EXPORTER_XML::makeRoot( unsigned aCtl )
7374
xroot->AddChild( makeDesignHeader() );
7475

7576
if( aCtl & GNL_SYMBOLS )
77+
{
7678
xroot->AddChild( makeSymbols( aCtl ) );
7779

80+
if( aCtl & GNL_OPT_KICAD )
81+
xroot->AddChild( makeGroups() );
82+
}
83+
7884
if( aCtl & GNL_PARTS )
7985
xroot->AddChild( makeLibParts() );
8086

@@ -484,6 +490,53 @@ XNODE* NETLIST_EXPORTER_XML::makeSymbols( unsigned aCtl )
484490
}
485491

486492

493+
XNODE* NETLIST_EXPORTER_XML::makeGroups()
494+
{
495+
XNODE* xcomps = node( wxT( "groups" ) );
496+
497+
m_referencesAlreadyFound.Clear();
498+
m_libParts.clear();
499+
500+
SCH_SHEET_PATH currentSheet = m_schematic->CurrentSheet();
501+
SCH_SHEET_LIST sheetList = m_schematic->Hierarchy();
502+
503+
for( const SCH_SHEET_PATH& sheet : sheetList )
504+
{
505+
// Change schematic CurrentSheet in each iteration to allow hierarchical
506+
// resolution of text variables in sheet fields.
507+
m_schematic->SetCurrentSheet( sheet );
508+
509+
for( SCH_ITEM* item : sheet.LastScreen()->Items().OfType( SCH_GROUP_T ) )
510+
{
511+
SCH_GROUP* group = static_cast<SCH_GROUP*>( item );
512+
513+
XNODE* xgroup; // current symbol being constructed
514+
xcomps->AddChild( xgroup = node( wxT( "group" ) ) );
515+
516+
xgroup->AddAttribute( wxT( "name" ), group->GetName() );
517+
xgroup->AddAttribute( wxT( "uuid" ), group->m_Uuid.AsString() );
518+
519+
XNODE* xmembers;
520+
xgroup->AddChild( xmembers = node( wxT( "members" ) ) );
521+
522+
for( EDA_ITEM* member : group->GetItems() )
523+
{
524+
if( member->Type() == SCH_SYMBOL_T )
525+
{
526+
XNODE* xmember;
527+
xmembers->AddChild( xmember = node( wxT( "member" ) ) );
528+
xmember->AddAttribute( wxT( "uuid" ), member->m_Uuid.AsString() );
529+
}
530+
}
531+
}
532+
}
533+
534+
m_schematic->SetCurrentSheet( currentSheet );
535+
536+
return xcomps;
537+
}
538+
539+
487540
std::vector<wxString> NETLIST_EXPORTER_XML::getComponentClassNamesForAllSymbolUnits(
488541
SCH_SYMBOL* aSymbol, const SCH_SHEET_PATH& aSymbolSheet, const SCH_SHEET_LIST& aSheetList )
489542
{

eeschema/netlist_exporters/netlist_exporter_xml.h

+5
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,11 @@ class NETLIST_EXPORTER_XML : public NETLIST_EXPORTER_BASE
105105
*/
106106
XNODE* makeSymbols( unsigned aCtl );
107107

108+
/**
109+
* @return a sub-tree holding all the schematic groups.
110+
*/
111+
XNODE* makeGroups();
112+
108113
/**
109114
* Fill out a project "design" header into an XML node.
110115
* @return the design header

pcbnew/cross-probing.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,7 @@ void PCB_EDIT_FRAME::KiwayMailIn( KIWAY_EXPRESS& mail )
600600
updater.SetLookupByTimestamp( false );
601601
updater.SetDeleteUnusedFootprints( false );
602602
updater.SetReplaceFootprints( false );
603+
updater.SetTransferGroups( false );
603604
updater.UpdateNetlist( netlist );
604605

605606
bool dummy;

pcbnew/dialogs/dialog_import_netlist.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ DIALOG_IMPORT_NETLIST::DIALOG_IMPORT_NETLIST( PCB_EDIT_FRAME* aParent,
7171
auto cfg = m_parent->GetPcbNewSettings();
7272

7373
m_cbUpdateFootprints->SetValue( cfg->m_NetlistDialog.update_footprints );
74+
m_cbTransferGroups->SetValue( cfg->m_NetlistDialog.transfer_groups );
7475
m_cbDeleteShortingTracks->SetValue( cfg->m_NetlistDialog.delete_shorting_tracks );
7576
m_cbDeleteExtraFootprints->SetValue( cfg->m_NetlistDialog.delete_extra_footprints );
7677

@@ -108,6 +109,7 @@ DIALOG_IMPORT_NETLIST::~DIALOG_IMPORT_NETLIST()
108109
{
109110
cfg->m_NetlistDialog.report_filter = m_MessageWindow->GetVisibleSeverities();
110111
cfg->m_NetlistDialog.update_footprints = m_cbUpdateFootprints->GetValue();
112+
cfg->m_NetlistDialog.transfer_groups = m_cbTransferGroups->GetValue();
111113
cfg->m_NetlistDialog.delete_shorting_tracks = m_cbDeleteShortingTracks->GetValue();
112114
cfg->m_NetlistDialog.delete_extra_footprints = m_cbDeleteExtraFootprints->GetValue();
113115
}
@@ -264,6 +266,7 @@ void DIALOG_IMPORT_NETLIST::loadNetlist( bool aDryRun )
264266
updater.SetLookupByTimestamp( m_matchByUUID );
265267
updater.SetDeleteUnusedFootprints( m_cbDeleteExtraFootprints->GetValue());
266268
updater.SetReplaceFootprints( m_cbUpdateFootprints->GetValue() );
269+
updater.SetTransferGroups( m_cbTransferGroups->GetValue() );
267270
updater.SetOverrideLocks( m_cbOverrideLocks->GetValue() );
268271
updater.UpdateNetlist( netlist );
269272

pcbnew/dialogs/dialog_import_netlist_base.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
///////////////////////////////////////////////////////////////////////////
2-
// C++ code generated with wxFormBuilder (version 3.10.1-0-g8feb16b)
2+
// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf-dirty)
33
// http://www.wxformbuilder.org/
44
//
55
// PLEASE DO *NOT* EDIT THIS FILE!
@@ -56,6 +56,9 @@ DIALOG_IMPORT_NETLIST_BASE::DIALOG_IMPORT_NETLIST_BASE( wxWindow* parent, wxWind
5656
m_cbUpdateFootprints = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Replace footprints with those specified in netlist"), wxDefaultPosition, wxDefaultSize, 0 );
5757
sbSizer1->Add( m_cbUpdateFootprints, 0, wxBOTTOM, 5 );
5858

59+
m_cbTransferGroups = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Group footprints based on symbol group"), wxDefaultPosition, wxDefaultSize, 0 );
60+
sbSizer1->Add( m_cbTransferGroups, 0, wxBOTTOM, 5 );
61+
5962
m_cbOverrideLocks = new wxCheckBox( sbSizer1->GetStaticBox(), wxID_ANY, _("Delete/replace footprints even if locked"), wxDefaultPosition, wxDefaultSize, 0 );
6063
sbSizer1->Add( m_cbOverrideLocks, 0, wxBOTTOM|wxRIGHT, 5 );
6164

@@ -105,6 +108,7 @@ DIALOG_IMPORT_NETLIST_BASE::DIALOG_IMPORT_NETLIST_BASE( wxWindow* parent, wxWind
105108
m_matchByTimestamp->Connect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnMatchChanged ), NULL, this );
106109
m_cbDeleteExtraFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
107110
m_cbUpdateFootprints->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
111+
m_cbTransferGroups->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
108112
m_cbOverrideLocks->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
109113
m_cbDeleteShortingTracks->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
110114
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()
119123
m_matchByTimestamp->Disconnect( wxEVT_COMMAND_RADIOBOX_SELECTED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnMatchChanged ), NULL, this );
120124
m_cbDeleteExtraFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
121125
m_cbUpdateFootprints->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
126+
m_cbTransferGroups->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
122127
m_cbOverrideLocks->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
123128
m_cbDeleteShortingTracks->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::OnOptionChanged ), NULL, this );
124129
m_sdbSizerApply->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_IMPORT_NETLIST_BASE::onUpdatePCB ), NULL, this );

0 commit comments

Comments
 (0)