7
mirror of https://gitlab.com/kicad/code/kicad.git synced 2025-04-18 21:19:20 +00:00

Map nets in pasted data

Add missing nets to the existing board and use any existing nets of the
same name.

Adds option to clear all nets in Paste Special

Fixes https://gitlab.com/kicad/code/kicad/-/issues/17626
This commit is contained in:
Seth Hillbrand 2024-04-01 16:55:37 -07:00
parent c7d280dfa1
commit d82e8ee41a
7 changed files with 108 additions and 12 deletions

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf)
// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf0)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -21,10 +21,15 @@ DIALOG_PASTE_SPECIAL_BASE::DIALOG_PASTE_SPECIAL_BASE( wxWindow* parent, wxWindow
wxString m_pasteOptionsChoices[] = { _("Assign unique reference designators to pasted symbols"), _("Keep existing reference designators, even if they are duplicated"), _("Clear reference designators on all pasted symbols") };
int m_pasteOptionsNChoices = sizeof( m_pasteOptionsChoices ) / sizeof( wxString );
m_pasteOptions = new wxRadioBox( this, wxID_ANY, _("Paste Options"), wxDefaultPosition, wxDefaultSize, m_pasteOptionsNChoices, m_pasteOptionsChoices, 1, wxRA_SPECIFY_COLS );
m_pasteOptions = new wxRadioBox( this, wxID_ANY, _("Reference Designators"), wxDefaultPosition, wxDefaultSize, m_pasteOptionsNChoices, m_pasteOptionsChoices, 1, wxRA_SPECIFY_COLS );
m_pasteOptions->SetSelection( 1 );
optionsSizer->Add( m_pasteOptions, 0, wxALL, 5 );
m_clearNetsCB = new wxCheckBox( this, wxID_ANY, _("Clear Net Assignments"), wxDefaultPosition, wxDefaultSize, 0 );
m_clearNetsCB->SetToolTip( _("Remove the net information from all connected items before pasting") );
optionsSizer->Add( m_clearNetsCB, 0, wxALL, 5 );
m_mainSizer->Add( optionsSizer, 1, wxALL|wxEXPAND, 10 );

View File

@ -105,7 +105,7 @@
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Paste Options</property>
<property name="label">Reference Designators</property>
<property name="majorDimension">1</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
@ -139,6 +139,71 @@
<event name="OnRadioBox">onRadioBoxEvent</event>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxALL</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">Clear Net Assignments</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_clearNetsCB</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 the net information from all connected items before pasting</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>
</object>
</object>
</object>
</object>
<object class="sizeritem" expanded="true">

View File

@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf)
// C++ code generated with wxFormBuilder (version 4.0.0-0-g0efcecf0)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@ -17,6 +17,7 @@
#include <wx/font.h>
#include <wx/colour.h>
#include <wx/settings.h>
#include <wx/checkbox.h>
#include <wx/sizer.h>
#include <wx/button.h>
#include <wx/dialog.h>
@ -33,6 +34,7 @@ class DIALOG_PASTE_SPECIAL_BASE : public DIALOG_SHIM
protected:
wxRadioBox* m_pasteOptions;
wxCheckBox* m_clearNetsCB;
wxStdDialogButtonSizer* m_sdbSizer;
wxButton* m_sdbSizerOK;
wxButton* m_sdbSizerCancel;

View File

@ -50,6 +50,17 @@ public:
bool TransferDataToWindow() override;
bool TransferDataFromWindow() override;
bool GetClearNets() const
{
return m_clearNetsCB->IsChecked();
}
void HideClearNets()
{
m_clearNetsCB->Hide();
finishDialogSettings();
}
protected:
virtual void onRadioBoxEvent( wxCommandEvent& event ) override;

View File

@ -2461,7 +2461,7 @@ const std::vector<BOARD_CONNECTED_ITEM*> BOARD::AllConnectedItems()
}
void BOARD::MapNets( const BOARD* aDestBoard )
void BOARD::MapNets( BOARD* aDestBoard )
{
for( BOARD_CONNECTED_ITEM* item : AllConnectedItems() )
{
@ -2470,7 +2470,12 @@ void BOARD::MapNets( const BOARD* aDestBoard )
if( netInfo )
item->SetNet( netInfo );
else
item->SetNetCode( 0 );
{
NETINFO_ITEM* newNet = new NETINFO_ITEM( aDestBoard, item->GetNetname() );
aDestBoard->Add( newNet );
item->SetNet( newNet );
}
}
}

View File

@ -1153,10 +1153,10 @@ public:
/**
* Map all nets in the given board to nets with the same name (if any) in the destination
* board. This allows us to share layouts which came from the same hierarchical sheet in
* the schematic.
* board. If there are missing nets in the destination board, they will be created.
*
*/
void MapNets( const BOARD* aDestBoard );
void MapNets( BOARD* aDestBoard );
void SanitizeNetcodes();

View File

@ -924,28 +924,36 @@ int PCB_CONTROL::Paste( const TOOL_EVENT& aEvent )
return 0;
PASTE_MODE mode = PASTE_MODE::KEEP_ANNOTATIONS;
bool clear_nets = false;
const wxString defaultRef = wxT( "REF**" );
if( aEvent.IsAction( &ACTIONS::pasteSpecial ) )
{
DIALOG_PASTE_SPECIAL dlg( m_frame, &mode, defaultRef );
if( clipItem->Type() != PCB_T )
dlg.HideClearNets();
if( dlg.ShowModal() == wxID_CANCEL )
return 0;
clear_nets = dlg.GetClearNets();
}
bool isFootprintEditor = m_isFootprintEditor || frame()->IsType( FRAME_FOOTPRINT_EDITOR );
if( clipItem->Type() == PCB_T )
{
if( isFootprintEditor )
BOARD* clipBoard = static_cast<BOARD*>( clipItem );
if( isFootprintEditor || clear_nets )
{
for( BOARD_CONNECTED_ITEM* item : static_cast<BOARD*>( clipItem )->AllConnectedItems() )
for( BOARD_CONNECTED_ITEM* item : clipBoard->AllConnectedItems() )
item->SetNet( NETINFO_LIST::OrphanedItem() );
}
else
{
static_cast<BOARD*>( clipItem )->MapNets( m_frame->GetBoard() );
clipBoard->MapNets( m_frame->GetBoard() );
}
}