Fixed a footprint editor crash on DXF import

Fixes: lp:1627422
* https://bugs.launchpad.net/kicad/+bug/1627422
This commit is contained in:
Maciej Suminski 2016-09-27 13:35:03 +02:00
parent 673b094b2b
commit 18695751e8
1 changed files with 40 additions and 8 deletions

View File

@ -605,28 +605,60 @@ int DRAWING_TOOL::PlaceDXF( const TOOL_EVENT& aEvent )
{ {
// Modules use different types for the same things, // Modules use different types for the same things,
// so we need to convert imported items to appropriate classes. // so we need to convert imported items to appropriate classes.
BOARD_ITEM* converted = NULL; BOARD_ITEM* converted;
switch( item->Type() ) switch( item->Type() )
{ {
case PCB_TEXT_T: case PCB_TEXT_T:
converted = new TEXTE_MODULE( (MODULE*) parent ); {
TEXTE_PCB* text = static_cast<TEXTE_PCB*>( item );
// Copy coordinates, layer, etc. TEXTE_MODULE* textMod = new TEXTE_MODULE( (MODULE*) parent );
*static_cast<BOARD_ITEM*>( converted ) = *static_cast<BOARD_ITEM*>( item ); // Assignment operator also copies the item PCB_TEXT_T type,
// so it cannot be added to a module which handles PCB_MODULE_TEXT_T
textMod->SetPosition( text->GetPosition() );
textMod->SetText( text->GetText() );
textMod->SetSize( text->GetSize() );
textMod->SetThickness( text->GetThickness() );
textMod->SetOrientation( text->GetOrientation() );
textMod->SetTextPosition( text->GetTextPosition() );
textMod->SetSize( text->GetSize() );
textMod->SetMirrored( text->IsMirrored() );
textMod->SetAttributes( text->GetAttributes() );
textMod->SetItalic( text->IsItalic() );
textMod->SetBold( text->IsBold() );
textMod->SetHorizJustify( text->GetHorizJustify() );
textMod->SetVertJustify( text->GetVertJustify() );
textMod->SetMultilineAllowed( text->IsMultilineAllowed() );
converted = textMod;
break; break;
}
case PCB_LINE_T: case PCB_LINE_T:
converted = new EDGE_MODULE( (MODULE*) parent ); {
// Copy coordinates, layer, etc. DRAWSEGMENT* seg = static_cast<DRAWSEGMENT*>( item );
*static_cast<DRAWSEGMENT*>( converted ) = *static_cast<DRAWSEGMENT*>( item ); EDGE_MODULE* modSeg = new EDGE_MODULE( (MODULE*) parent );
// Assignment operator also copies the item PCB_LINE_T type,
// so it cannot be added to a module which handles PCB_MODULE_EDGE_T
modSeg->SetWidth( seg->GetWidth() );
modSeg->SetStart( seg->GetStart() );
modSeg->SetEnd( seg->GetEnd() );
modSeg->SetShape( seg->GetShape() );
modSeg->SetType( seg->GetType() );
modSeg->SetBezControl1( seg->GetBezControl1() );
modSeg->SetBezControl2( seg->GetBezControl2() );
modSeg->SetBezierPoints( seg->GetBezierPoints() );
modSeg->SetPolyPoints( seg->GetPolyPoints() );
converted = modSeg;
break; break;
}
default: default:
assert( false ); assert( false );
break; break;
} }
converted->SetLayer( item->GetLayer() );
delete item; delete item;
item = converted; item = converted;
} }