diff --git a/pcbnew/tools/convert_tool.cpp b/pcbnew/tools/convert_tool.cpp index 80fe1823fe..b0818fbe4a 100644 --- a/pcbnew/tools/convert_tool.cpp +++ b/pcbnew/tools/convert_tool.cpp @@ -262,7 +262,8 @@ bool CONVERT_TOOL::Init() m_menu->SetTitle( _( "Create from Selection" ) ); static const std::vector<KICAD_T> padTypes = { PCB_PAD_T }; - static const std::vector<KICAD_T> segmentTypes = { PCB_TRACE_T, + static const std::vector<KICAD_T> toArcTypes = { PCB_ARC_T, + PCB_TRACE_T, PCB_SHAPE_LOCATE_SEGMENT_T }; static const std::vector<KICAD_T> shapeTypes = { PCB_SHAPE_LOCATE_SEGMENT_T, PCB_SHAPE_LOCATE_RECT_T, @@ -287,7 +288,7 @@ bool CONVERT_TOOL::Init() auto anyPolys = S_C::OnlyTypes( polyTypes ); auto anyPads = S_C::OnlyTypes( padTypes ); - auto canCreateArcs = S_C::Count( 1 ) && S_C::OnlyTypes( segmentTypes ); + auto canCreateArcs = S_C::Count( 1 ) && S_C::OnlyTypes( toArcTypes ); auto canCreateArray = S_C::MoreThan( 0 ); auto canCreatePoly = shapes || anyPolys || anyTracks; @@ -1179,14 +1180,15 @@ int CONVERT_TOOL::SegmentToArc( const TOOL_EVENT& aEvent ) BOARD_ITEM* item = aCollector[i]; if( !( item->Type() == PCB_SHAPE_T || - item->Type() == PCB_TRACE_T ) ) + item->Type() == PCB_TRACE_T || + item->Type() == PCB_ARC_T ) ) { aCollector.Remove( item ); } } } ); - if( !selection.Front()->IsBOARD_ITEM() ) + if( selection.Empty() || !selection.Front()->IsBOARD_ITEM() ) return -1; BOARD_ITEM* source = static_cast<BOARD_ITEM*>( selection.Front() ); @@ -1213,7 +1215,7 @@ int CONVERT_TOOL::SegmentToArc( const TOOL_EVENT& aEvent ) PCB_LAYER_ID layer = source->GetLayer(); BOARD_COMMIT commit( m_frame ); - if( source->Type() == PCB_SHAPE_T ) + if( source->Type() == PCB_SHAPE_T && static_cast<PCB_SHAPE*>( source )->GetShape() == SHAPE_T::SEGMENT ) { PCB_SHAPE* line = static_cast<PCB_SHAPE*>( source ); PCB_SHAPE* arc = new PCB_SHAPE( parent, SHAPE_T::ARC ); @@ -1224,26 +1226,50 @@ int CONVERT_TOOL::SegmentToArc( const TOOL_EVENT& aEvent ) arc->SetLayer( layer ); arc->SetStroke( line->GetStroke() ); - arc->SetCenter( VECTOR2I( center ) ); - arc->SetStart( VECTOR2I( start ) ); - arc->SetEnd( VECTOR2I( end ) ); + arc->SetCenter( center ); + arc->SetStart( start ); + arc->SetEnd( end ); commit.Add( arc ); } - else + else if( source->Type() == PCB_SHAPE_T && static_cast<PCB_SHAPE*>( source )->GetShape() == SHAPE_T::ARC ) + { + PCB_SHAPE* source_arc = static_cast<PCB_SHAPE*>( source ); + PCB_ARC* arc = new PCB_ARC( parent ); + + arc->SetLayer( layer ); + arc->SetWidth( source_arc->GetWidth() ); + arc->SetStart( start ); + arc->SetMid( source_arc->GetArcMid() ); + arc->SetEnd( end ); + + commit.Add( arc ); + } + else if( source->Type() == PCB_TRACE_T ) { - wxASSERT( source->Type() == PCB_TRACE_T ); PCB_TRACK* line = static_cast<PCB_TRACK*>( source ); PCB_ARC* arc = new PCB_ARC( parent ); arc->SetLayer( layer ); arc->SetWidth( line->GetWidth() ); - arc->SetStart( VECTOR2I( start ) ); - arc->SetMid( VECTOR2I( mid ) ); - arc->SetEnd( VECTOR2I( end ) ); + arc->SetStart( start ); + arc->SetMid( mid ); + arc->SetEnd( end ); commit.Add( arc ); } + else if( source->Type() == PCB_ARC_T ) + { + PCB_ARC* source_arc = static_cast<PCB_ARC*>( source ); + PCB_SHAPE* arc = new PCB_SHAPE( parent, SHAPE_T::ARC ); + + arc->SetFilled( false ); + arc->SetLayer( layer ); + arc->SetWidth( source_arc->GetWidth() ); + + arc->SetArcGeometry( source_arc->GetStart(), source_arc->GetMid(), source_arc->GetEnd() ); + commit.Add( arc ); + } commit.Push( _( "Create Arc" ) );