diff --git a/pcbnew/generators/pcb_tuning_pattern.cpp b/pcbnew/generators/pcb_tuning_pattern.cpp index ecde7ff687..4125774b6f 100644 --- a/pcbnew/generators/pcb_tuning_pattern.cpp +++ b/pcbnew/generators/pcb_tuning_pattern.cpp @@ -128,23 +128,32 @@ public: m_origin += aMoveVector; m_end += aMoveVector; - PCB_GROUP::Move( aMoveVector ); + if( !this->HasFlag( IN_EDIT ) ) + { + PCB_GROUP::Move( aMoveVector ); + + if( m_baseLine ) + m_baseLine->Move( aMoveVector ); + + if( m_baseLineCoupled ) + m_baseLineCoupled->Move( aMoveVector ); + } } void Rotate( const VECTOR2I& aRotCentre, const EDA_ANGLE& aAngle ) override { - // Not supported for tuning patterns -#if 0 - RotatePoint( m_origin, aRotCentre, aAngle ); - RotatePoint( m_end, aRotCentre, aAngle ); - PCB_GROUP::Rotate( aRotCentre, aAngle ); + if( !this->HasFlag( IN_EDIT ) ) + { + RotatePoint( m_origin, aRotCentre, aAngle ); + RotatePoint( m_end, aRotCentre, aAngle ); + PCB_GROUP::Rotate( aRotCentre, aAngle ); - if( m_baseLine ) - m_baseLine->Rotate( aAngle, aRotCentre ); + if( m_baseLine ) + m_baseLine->Rotate( aAngle, aRotCentre ); - if( m_baseLineCoupled ) - m_baseLineCoupled->Rotate( aAngle, aRotCentre );*/ -#endif + if( m_baseLineCoupled ) + m_baseLineCoupled->Rotate( aAngle, aRotCentre ); + } } const BOX2I GetBoundingBox() const override @@ -510,7 +519,7 @@ void PCB_TUNING_PATTERN::EditStart( GENERATOR_TOOL* aTool, BOARD* aBoard, aCommit->Modify( this ); } - SetFlags( IS_MOVING ); + SetFlags( IN_EDIT ); int layer = GetLayer(); PNS::ROUTER* router = aTool->Router(); @@ -1007,6 +1016,7 @@ bool PCB_TUNING_PATTERN::Update( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_ PNS::MEANDER_PLACER_BASE* placer = static_cast( router->Placer() ); + m_settings.m_keepEndpoints = true; // Required for re-grouping placer->UpdateSettings( m_settings ); router->Move( m_end, nullptr ); @@ -1038,6 +1048,8 @@ void PCB_TUNING_PATTERN::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, BOARD_COMMIT* aCommit, const wxString& aCommitMsg, int aCommitFlags ) { + ClearFlags( IN_EDIT ); + PNS::ROUTER* router = aTool->Router(); SHAPE_LINE_CHAIN bounds = getRectShape(); PICKED_ITEMS_LIST groupUndoList; @@ -1066,13 +1078,14 @@ void PCB_TUNING_PATTERN::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, for( BOARD_ITEM* item : routerAddedItems ) { - PCB_TRACK* track = dynamic_cast( item ); - - if( track && bounds.PointInside( track->GetPosition(), epsilon ) - && bounds.PointInside( track->GetEnd(), epsilon ) ) + if( PCB_TRACK* track = dynamic_cast( item ) ) { - AddItem( item ); - groupUndoList.PushItem( ITEM_PICKER( nullptr, item, UNDO_REDO::REGROUP ) ); + if( bounds.PointInside( track->GetPosition(), epsilon ) + && bounds.PointInside( track->GetEnd(), epsilon ) ) + { + AddItem( item ); + groupUndoList.PushItem( ITEM_PICKER( nullptr, item, UNDO_REDO::REGROUP ) ); + } } aCommit->Add( item ); @@ -1091,6 +1104,8 @@ void PCB_TUNING_PATTERN::EditPush( GENERATOR_TOOL* aTool, BOARD* aBoard, void PCB_TUNING_PATTERN::EditRevert( GENERATOR_TOOL* aTool, BOARD* aBoard, PCB_BASE_EDIT_FRAME* aFrame, BOARD_COMMIT* aCommit ) { + ClearFlags( IN_EDIT ); + for( BOARD_ITEM* item : m_removedItems ) aFrame->GetCanvas()->GetView()->Hide( item, false ); @@ -1299,19 +1314,21 @@ void PCB_TUNING_PATTERN::ViewDraw( int aLayer, KIGFX::VIEW* aView ) const return; KIGFX::PREVIEW::DRAW_CONTEXT ctx( *aView ); + int size = KiROUND( aView->ToWorld( EDIT_POINT::POINT_SIZE ) * 0.8 ); + size = std::max( size, pcbIUScale.mmToIU( 0.05 ) ); if( m_baseLine ) { for( int i = 0; i < m_baseLine->SegmentCount(); i++ ) { SEG seg = m_baseLine->CSegment( i ); - ctx.DrawLine( seg.A, seg.B, false ); + ctx.DrawLineDashed( seg.A, seg.B, size, size / 6, true ); } } else { - ctx.DrawLine( m_origin, m_end, false ); + ctx.DrawLineDashed( m_origin, m_end, size, size / 6, false ); } if( m_tuningMode == DIFF_PAIR && m_baseLineCoupled ) @@ -1319,7 +1336,7 @@ void PCB_TUNING_PATTERN::ViewDraw( int aLayer, KIGFX::VIEW* aView ) const for( int i = 0; i < m_baseLineCoupled->SegmentCount(); i++ ) { SEG seg = m_baseLineCoupled->CSegment( i ); - ctx.DrawLine( seg.A, seg.B, false ); + ctx.DrawLineDashed( seg.A, seg.B, size, size / 6, true ); } } diff --git a/pcbnew/router/pns_dp_meander_placer.cpp b/pcbnew/router/pns_dp_meander_placer.cpp index cf61e5e32b..868d04e2af 100644 --- a/pcbnew/router/pns_dp_meander_placer.cpp +++ b/pcbnew/router/pns_dp_meander_placer.cpp @@ -352,16 +352,38 @@ bool DP_MEANDER_PLACER::Move( const VECTOR2I& aP, ITEM* aEndItem ) } m_finalShapeP.Clear(); - m_finalShapeP.Append( preP ); - m_finalShapeP.Append( tunedP ); - m_finalShapeP.Append( postP ); - m_finalShapeP.Simplify(); - m_finalShapeN.Clear(); - m_finalShapeN.Append( preN ); - m_finalShapeN.Append( tunedN ); - m_finalShapeN.Append( postN ); - m_finalShapeN.Simplify(); + + if( m_settings.m_keepEndpoints ) + { + preP.Simplify(); + tunedP.Simplify(); + postP.Simplify(); + + m_finalShapeP.Append( preP ); + m_finalShapeP.Append( tunedP ); + m_finalShapeP.Append( postP ); + + preN.Simplify(); + tunedN.Simplify(); + postN.Simplify(); + + m_finalShapeN.Append( preN ); + m_finalShapeN.Append( tunedN ); + m_finalShapeN.Append( postN ); + } + else + { + m_finalShapeP.Append( preP ); + m_finalShapeP.Append( tunedP ); + m_finalShapeP.Append( postP ); + m_finalShapeP.Simplify(); + + m_finalShapeN.Append( preN ); + m_finalShapeN.Append( tunedN ); + m_finalShapeN.Append( postN ); + m_finalShapeN.Simplify(); + } return true; } diff --git a/pcbnew/router/pns_kicad_iface.cpp b/pcbnew/router/pns_kicad_iface.cpp index a035ccc4ef..849ec238e4 100644 --- a/pcbnew/router/pns_kicad_iface.cpp +++ b/pcbnew/router/pns_kicad_iface.cpp @@ -1163,7 +1163,7 @@ std::unique_ptr PNS_KICAD_IFACE_BASE::syncTrack( PCB_TRACK* aTrack if( PCB_GENERATOR* generator = dynamic_cast( aTrack->GetParentGroup() ) ) { - if( !generator->IsMoving() ) + if( !generator->HasFlag( IN_EDIT ) ) segment->Mark( PNS::MK_LOCKED ); } @@ -1185,7 +1185,7 @@ std::unique_ptr PNS_KICAD_IFACE_BASE::syncArc( PCB_ARC* aArc ) if( PCB_GENERATOR* generator = dynamic_cast( aArc->GetParentGroup() ) ) { - if( !generator->IsMoving() ) + if( !generator->HasFlag( IN_EDIT ) ) arc->Mark( PNS::MK_LOCKED ); } @@ -1212,7 +1212,7 @@ std::unique_ptr PNS_KICAD_IFACE_BASE::syncVia( PCB_VIA* aVia ) if( PCB_GENERATOR* generator = dynamic_cast( aVia->GetParentGroup() ) ) { - if( !generator->IsMoving() ) + if( !generator->HasFlag( IN_EDIT ) ) via->Mark( PNS::MK_LOCKED ); } diff --git a/pcbnew/router/pns_meander.h b/pcbnew/router/pns_meander.h index 0ef04e5d22..42db96cd8a 100644 --- a/pcbnew/router/pns_meander.h +++ b/pcbnew/router/pns_meander.h @@ -85,6 +85,7 @@ public: m_singleSided = false; m_initialSide = MEANDER_SIDE_LEFT; m_lengthTolerance = 0; + m_keepEndpoints = false; } void SetTargetLength( long long int aOpt ) @@ -160,6 +161,9 @@ public: ///< Allowable tuning error. int m_lengthTolerance; + + ///< Keep vertices between pre, tuned and post parts of the line. + bool m_keepEndpoints; }; /** diff --git a/pcbnew/router/pns_meander_placer.cpp b/pcbnew/router/pns_meander_placer.cpp index f7c8cda2ec..3bd29da91d 100644 --- a/pcbnew/router/pns_meander_placer.cpp +++ b/pcbnew/router/pns_meander_placer.cpp @@ -199,10 +199,24 @@ bool MEANDER_PLACER::doMove( const VECTOR2I& aP, ITEM* aEndItem, long long int a } m_finalShape.Clear(); - m_finalShape.Append( pre ); - m_finalShape.Append( tuned ); - m_finalShape.Append( post ); - m_finalShape.Simplify(); + + if( m_settings.m_keepEndpoints ) + { + pre.Simplify(); + tuned.Simplify(); + post.Simplify(); + + m_finalShape.Append( pre ); + m_finalShape.Append( tuned ); + m_finalShape.Append( post ); + } + else + { + m_finalShape.Append( pre ); + m_finalShape.Append( tuned ); + m_finalShape.Append( post ); + m_finalShape.Simplify(); + } return true; } diff --git a/pcbnew/tools/edit_tool_move_fct.cpp b/pcbnew/tools/edit_tool_move_fct.cpp index c6cd7b8f1f..521a6d4920 100644 --- a/pcbnew/tools/edit_tool_move_fct.cpp +++ b/pcbnew/tools/edit_tool_move_fct.cpp @@ -230,17 +230,11 @@ int EDIT_TOOL::Move( const TOOL_EVENT& aEvent ) if( doMoveSelection( aEvent, &localCommit ) ) { - if( PCB_GENERATOR* genItem = dynamic_cast( localCommit.GetFirst() ) ) - m_toolMgr->RunSynchronousAction( PCB_ACTIONS::genPushEdit, &localCommit, genItem ); - else - localCommit.Push( _( "Move" ) ); + localCommit.Push( _( "Move" ) ); } else { - if( PCB_GENERATOR* genItem = dynamic_cast( localCommit.GetFirst() ) ) - m_toolMgr->RunSynchronousAction( PCB_ACTIONS::genRevertEdit, &localCommit, genItem ); - else - localCommit.Revert(); + localCommit.Revert(); } } @@ -590,15 +584,15 @@ bool EDIT_TOOL::doMoveSelection( const TOOL_EVENT& aEvent, BOARD_COMMIT* aCommit else { aCommit->Modify( item ); - - item->SetFlags( IS_MOVING ); - - static_cast( item )->RunOnDescendants( - [&]( BOARD_ITEM* bItem ) - { - item->SetFlags( IS_MOVING ); - } ); } + + item->SetFlags( IS_MOVING ); + + static_cast( item )->RunOnDescendants( + [&]( BOARD_ITEM* bItem ) + { + item->SetFlags( IS_MOVING ); + } ); } } @@ -789,8 +783,22 @@ bool EDIT_TOOL::doMoveSelection( const TOOL_EVENT& aEvent, BOARD_COMMIT* aCommit // items. m_toolMgr->RunAction( PCB_ACTIONS::selectionClear ); - if( !restore_state ) + if( restore_state ) { + if( sel_items.size() == 1 && sel_items.back()->Type() == PCB_GENERATOR_T ) + { + m_toolMgr->RunSynchronousAction( PCB_ACTIONS::genRevertEdit, aCommit, + static_cast( sel_items.back() ) ); + } + } + else + { + if( sel_items.size() == 1 && sel_items.back()->Type() == PCB_GENERATOR_T ) + { + m_toolMgr->RunSynchronousAction( PCB_ACTIONS::genPushEdit, aCommit, + static_cast( sel_items.back() ) ); + } + EDA_ITEMS oItems( orig_items.begin(), orig_items.end() ); m_toolMgr->RunAction( PCB_ACTIONS::selectItems, &oItems ); }