Fix a few issues when copying a footprint from fp editor to clipboard, and paste it:
- ref and value texts were converted to user texts. - fpid was left empty, thus creating a potential issue if pasted in the board editor. Now: - ref and value texts are no changed, and not copied is pasted in the footprint editor (these texts already exist) - a dummy fpid (clipboard:<md5 string>) is added if pasted in board editor (Pasting a (partial) footprint from fp editor to a board editor is certainly not a good idea but is possible)
This commit is contained in:
parent
68625494f3
commit
5c08ad1ab9
|
@ -100,6 +100,13 @@ void CLIPBOARD_IO::SaveSelection( const PCBNEW_SELECTION& aSelected, bool isFoot
|
||||||
{
|
{
|
||||||
FOOTPRINT partialFootprint( m_board );
|
FOOTPRINT partialFootprint( m_board );
|
||||||
|
|
||||||
|
// Usefull to copy the selection to the board editor (if any), and provides
|
||||||
|
// a dummy lib id.
|
||||||
|
// Perhaps not a good Id, but better than a empty id
|
||||||
|
KIID dummy;
|
||||||
|
LIB_ID id( "clipboard", dummy.AsString() );
|
||||||
|
partialFootprint.SetFPID( id );
|
||||||
|
|
||||||
for( const EDA_ITEM* item : aSelected )
|
for( const EDA_ITEM* item : aSelected )
|
||||||
{
|
{
|
||||||
const PCB_GROUP* group = dynamic_cast<const PCB_GROUP*>( item );
|
const PCB_GROUP* group = dynamic_cast<const PCB_GROUP*>( item );
|
||||||
|
@ -110,10 +117,6 @@ void CLIPBOARD_IO::SaveSelection( const PCBNEW_SELECTION& aSelected, bool isFoot
|
||||||
else
|
else
|
||||||
clone = static_cast<BOARD_ITEM*>( item->Clone() );
|
clone = static_cast<BOARD_ITEM*>( item->Clone() );
|
||||||
|
|
||||||
// Do not add reference/value - convert them to the common type
|
|
||||||
if( FP_TEXT* text = dyn_cast<FP_TEXT*>( clone ) )
|
|
||||||
text->SetType( FP_TEXT::TEXT_is_DIVERS );
|
|
||||||
|
|
||||||
// If it is only a footprint, clear the nets from the pads
|
// If it is only a footprint, clear the nets from the pads
|
||||||
if( PAD* pad = dyn_cast<PAD*>( clone ) )
|
if( PAD* pad = dyn_cast<PAD*>( clone ) )
|
||||||
pad->SetNetCode( 0 );
|
pad->SetNetCode( 0 );
|
||||||
|
|
|
@ -539,8 +539,8 @@ int PCBNEW_CONTROL::DeleteItemCursor( const TOOL_EVENT& aEvent )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void pasteFootprintItemsToFootprintEditor( FOOTPRINT* aClipFootprint, BOARD* aBoard,
|
static void pasteFootprintItemsToFootprintEditor( FOOTPRINT* aClipFootprint, BOARD* aBoard,
|
||||||
std::vector<BOARD_ITEM*>& aPastedItems )
|
std::vector<BOARD_ITEM*>& aPastedItems )
|
||||||
{
|
{
|
||||||
FOOTPRINT* editorFootprint = aBoard->GetFirstFootprint();
|
FOOTPRINT* editorFootprint = aBoard->GetFirstFootprint();
|
||||||
|
|
||||||
|
@ -554,6 +554,10 @@ void pasteFootprintItemsToFootprintEditor( FOOTPRINT* aClipFootprint, BOARD* aBo
|
||||||
|
|
||||||
aClipFootprint->Pads().clear();
|
aClipFootprint->Pads().clear();
|
||||||
|
|
||||||
|
// Not all graphic items can be added to the current footprint:
|
||||||
|
// Reference and value are already existing in the current footprint, and
|
||||||
|
// must be unique.
|
||||||
|
// So they will be skipped
|
||||||
for( BOARD_ITEM* item : aClipFootprint->GraphicalItems() )
|
for( BOARD_ITEM* item : aClipFootprint->GraphicalItems() )
|
||||||
{
|
{
|
||||||
if( item->Type() == PCB_FP_SHAPE_T )
|
if( item->Type() == PCB_FP_SHAPE_T )
|
||||||
|
@ -568,12 +572,7 @@ void pasteFootprintItemsToFootprintEditor( FOOTPRINT* aClipFootprint, BOARD* aBo
|
||||||
FP_TEXT* text = static_cast<FP_TEXT*>( item );
|
FP_TEXT* text = static_cast<FP_TEXT*>( item );
|
||||||
|
|
||||||
if( text->GetType() != FP_TEXT::TEXT_is_DIVERS )
|
if( text->GetType() != FP_TEXT::TEXT_is_DIVERS )
|
||||||
text->SetType( FP_TEXT::TEXT_is_DIVERS );
|
continue;
|
||||||
|
|
||||||
if( text->GetText() == "${VALUE}" )
|
|
||||||
text->SetText( aClipFootprint->GetValue() );
|
|
||||||
else if( text->GetText() == "${REFERENCE}" )
|
|
||||||
text->SetText( aClipFootprint->GetReference() );
|
|
||||||
|
|
||||||
text->SetTextAngle( aClipFootprint->GetOrientation() );
|
text->SetTextAngle( aClipFootprint->GetOrientation() );
|
||||||
|
|
||||||
|
@ -594,32 +593,6 @@ void pasteFootprintItemsToFootprintEditor( FOOTPRINT* aClipFootprint, BOARD* aBo
|
||||||
}
|
}
|
||||||
|
|
||||||
aClipFootprint->Groups().clear();
|
aClipFootprint->Groups().clear();
|
||||||
|
|
||||||
if( !aClipFootprint->GetReference().IsEmpty() )
|
|
||||||
{
|
|
||||||
FP_TEXT* text = new FP_TEXT( aClipFootprint->Reference() );
|
|
||||||
text->SetType( FP_TEXT::TEXT_is_DIVERS );
|
|
||||||
text->SetTextAngle( aClipFootprint->GetOrientation() );
|
|
||||||
|
|
||||||
text->SetParent( nullptr );
|
|
||||||
text->SetLocalCoord();
|
|
||||||
|
|
||||||
text->SetParent( editorFootprint );
|
|
||||||
aPastedItems.push_back( text );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( !aClipFootprint->GetValue().IsEmpty() )
|
|
||||||
{
|
|
||||||
FP_TEXT* text = new FP_TEXT( aClipFootprint->Value() );
|
|
||||||
text->SetType( FP_TEXT::TEXT_is_DIVERS );
|
|
||||||
text->SetTextAngle( aClipFootprint->GetOrientation() );
|
|
||||||
|
|
||||||
text->SetParent( nullptr );
|
|
||||||
text->SetLocalCoord();
|
|
||||||
|
|
||||||
text->SetParent( editorFootprint );
|
|
||||||
aPastedItems.push_back( text );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue