Filter PCBNew contents when pasting into Footprint Editor.
Fixes: lp:1850724 * https://bugs.launchpad.net/kicad/+bug/1850724
This commit is contained in:
parent
4662205ecb
commit
872826085a
|
@ -995,7 +995,17 @@ int DRAWSEGMENT::GetPointCount() const
|
||||||
|
|
||||||
void DRAWSEGMENT::SwapData( BOARD_ITEM* aImage )
|
void DRAWSEGMENT::SwapData( BOARD_ITEM* aImage )
|
||||||
{
|
{
|
||||||
assert( aImage->Type() == PCB_LINE_T );
|
DRAWSEGMENT* image = dynamic_cast<DRAWSEGMENT*>( aImage );
|
||||||
|
assert( image );
|
||||||
|
|
||||||
std::swap( *((DRAWSEGMENT*) this), *((DRAWSEGMENT*) aImage) );
|
std::swap( m_Width, image->m_Width );
|
||||||
|
std::swap( m_Start, image->m_Start );
|
||||||
|
std::swap( m_End, image->m_End );
|
||||||
|
std::swap( m_Shape, image->m_Shape );
|
||||||
|
std::swap( m_Type, image->m_Type );
|
||||||
|
std::swap( m_Angle, image->m_Angle );
|
||||||
|
std::swap( m_BezierC1, image->m_BezierC1 );
|
||||||
|
std::swap( m_BezierC2, image->m_BezierC2 );
|
||||||
|
std::swap( m_BezierPoints, image->m_BezierPoints );
|
||||||
|
std::swap( m_Poly, image->m_Poly );
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <class_module.h>
|
#include <class_module.h>
|
||||||
#include <class_track.h>
|
#include <class_track.h>
|
||||||
#include <class_zone.h>
|
#include <class_zone.h>
|
||||||
|
#include <class_edge_mod.h>
|
||||||
#include <confirm.h>
|
#include <confirm.h>
|
||||||
#include <connectivity/connectivity_data.h>
|
#include <connectivity/connectivity_data.h>
|
||||||
#include <gal/graphics_abstraction_layer.h>
|
#include <gal/graphics_abstraction_layer.h>
|
||||||
|
@ -601,52 +602,109 @@ int PCBNEW_CONTROL::Paste( const TOOL_EVENT& aEvent )
|
||||||
{
|
{
|
||||||
case PCB_T:
|
case PCB_T:
|
||||||
{
|
{
|
||||||
|
BOARD* clipBoard = (BOARD*) clipItem;
|
||||||
|
|
||||||
if( editModules )
|
if( editModules )
|
||||||
{
|
{
|
||||||
wxLogDebug( wxT( "attempting to paste a pcb in the footprint editor\n") );
|
MODULE* editModule = board()->GetFirstModule();
|
||||||
return 0;
|
std::vector<BOARD_ITEM*> pastedItems;
|
||||||
|
|
||||||
|
for( MODULE* clipModule : clipBoard->Modules() )
|
||||||
|
{
|
||||||
|
clipModule->SetParent( board() );
|
||||||
|
|
||||||
|
for( auto pad : clipModule->Pads() )
|
||||||
|
{
|
||||||
|
pad->SetParent( editModule );
|
||||||
|
pastedItems.push_back( pad );
|
||||||
|
}
|
||||||
|
|
||||||
|
clipModule->Pads().clear();
|
||||||
|
|
||||||
|
for( auto item : clipModule->GraphicalItems() )
|
||||||
|
{
|
||||||
|
item->SetParent( editModule );
|
||||||
|
pastedItems.push_back( item );
|
||||||
|
}
|
||||||
|
|
||||||
|
clipModule->GraphicalItems().clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
for( BOARD_ITEM* clipDrawItem : clipBoard->Drawings() )
|
||||||
|
{
|
||||||
|
if( clipDrawItem->Type() == PCB_LINE_T )
|
||||||
|
{
|
||||||
|
DRAWSEGMENT* clipDrawSeg = (DRAWSEGMENT*) clipDrawItem;
|
||||||
|
|
||||||
|
// Convert to PCB_MODULE_EDGE_T
|
||||||
|
EDGE_MODULE* pastedDrawSeg = new EDGE_MODULE( editModule );
|
||||||
|
static_cast<DRAWSEGMENT*>( pastedDrawSeg )->SwapData( clipDrawSeg );
|
||||||
|
pastedDrawSeg->SetLocalCoord();
|
||||||
|
|
||||||
|
pastedItems.push_back( pastedDrawSeg );
|
||||||
|
}
|
||||||
|
else if( clipDrawItem->Type() == PCB_TEXT_T )
|
||||||
|
{
|
||||||
|
TEXTE_PCB* clipTextItem = (TEXTE_PCB*) clipDrawItem;
|
||||||
|
|
||||||
|
// Convert to PCB_MODULE_TEXT_T
|
||||||
|
TEXTE_MODULE* pastedTextItem = new TEXTE_MODULE( editModule );
|
||||||
|
static_cast<EDA_TEXT*>( pastedTextItem )->SwapText( *clipTextItem );
|
||||||
|
static_cast<EDA_TEXT*>( pastedTextItem )->SwapEffects( *clipTextItem );
|
||||||
|
|
||||||
|
pastedItems.push_back( pastedTextItem );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete clipBoard;
|
||||||
|
|
||||||
|
placeBoardItems( pastedItems, true, true );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
placeBoardItems( clipBoard, true );
|
||||||
|
|
||||||
|
m_frame->Compile_Ratsnest( true );
|
||||||
|
m_frame->GetBoard()->BuildConnectivity();
|
||||||
}
|
}
|
||||||
|
|
||||||
placeBoardItems( static_cast<BOARD*>( clipItem ), true );
|
|
||||||
|
|
||||||
m_frame->Compile_Ratsnest( true );
|
|
||||||
m_frame->GetBoard()->BuildConnectivity();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
case PCB_MODULE_T:
|
case PCB_MODULE_T:
|
||||||
{
|
{
|
||||||
std::vector<BOARD_ITEM*> items;
|
MODULE* clipModule = (MODULE*) clipItem;
|
||||||
|
std::vector<BOARD_ITEM*> pastedItems;
|
||||||
clipItem->SetParent( board() );
|
|
||||||
|
|
||||||
if( editModules )
|
if( editModules )
|
||||||
{
|
{
|
||||||
auto oldModule = static_cast<MODULE*>( clipItem );
|
MODULE* editModule = board()->GetFirstModule();
|
||||||
auto newModule = board()->GetFirstModule();
|
|
||||||
|
|
||||||
for( auto pad : oldModule->Pads() )
|
for( auto pad : clipModule->Pads() )
|
||||||
{
|
{
|
||||||
pad->SetParent( newModule );
|
pad->SetParent( editModule );
|
||||||
items.push_back( pad );
|
pastedItems.push_back( pad );
|
||||||
}
|
}
|
||||||
|
|
||||||
oldModule->Pads().clear();
|
clipModule->Pads().clear();
|
||||||
|
|
||||||
for( auto item : oldModule->GraphicalItems() )
|
for( auto item : clipModule->GraphicalItems() )
|
||||||
{
|
{
|
||||||
item->SetParent( newModule );
|
item->SetParent( editModule );
|
||||||
items.push_back( item );
|
pastedItems.push_back( item );
|
||||||
}
|
}
|
||||||
|
|
||||||
oldModule->GraphicalItems().clear();
|
clipModule->GraphicalItems().clear();
|
||||||
|
|
||||||
|
delete clipModule;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
items.push_back( clipItem );
|
clipModule->SetParent( board() );
|
||||||
|
pastedItems.push_back( clipModule );
|
||||||
}
|
}
|
||||||
|
|
||||||
placeBoardItems( items, true, true );
|
placeBoardItems( pastedItems, true, true );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue