void WinEDA_PcbFrame::Start_MoveOneTrackSegment(TRACK * track, wxDC * DC, bool Drag) /***********************************************************************************/ { /* Change hight light net: the new one will be hightlighted */ Old_HightLigt_Status = g_HightLigt_Status; Old_HightLigth_NetCode = g_HightLigth_NetCode; if(g_HightLigt_Status) Hight_Light(DC); if ( Drag && track->m_StructType == TYPEVIA) { track->m_Flags = IS_DRAGGED|STARTPOINT|ENDPOINT; Collect_TrackSegmentsToDrag(DrawPanel, DC, track->m_Start, track->ReturnMaskLayer(), track->m_NetCode); NewTrack = track; NbPtNewTrack = 1; PosInit = track->m_Start; } else { int diag = track->IsPointOnEnds(GetScreen()->m_Curseur, -1); wxPoint pos = (diag & STARTPOINT) ? track->m_Start : track->m_End; Collect_TrackSegmentsToDrag(DrawPanel, DC, pos, track->ReturnMaskLayer(), track->m_NetCode); track->m_Flags |= IS_DRAGGED; NewTrack = NULL; NbPtNewTrack = 0; PosInit = pos; } LastPos = PosInit; GetScreen()->ManageCurseur = Show_MoveTrack; GetScreen()->ForceCloseManageCurseur = Exit_MoveTrack; g_HightLigth_NetCode = track->m_NetCode; g_HightLigt_Status = TRUE; DrawHightLight( DC, g_HightLigth_NetCode) ; GetScreen()->ManageCurseur(DrawPanel, DC, TRUE); }
void PCB_EDIT_FRAME::StartMoveOneNodeOrSegment( TRACK* aTrack, wxDC* aDC, int aCommand ) { if( !aTrack ) return; EraseDragList(); // Change highlighted net: the new one will be highlighted GetBoard()->PushHighLight(); if( GetBoard()->IsHighLightNetON() ) HighLight( aDC ); PosInit = GetCrossHairPosition(); if( aTrack->Type() == PCB_VIA_T ) { aTrack->SetFlags( IS_DRAGGED | STARTPOINT | ENDPOINT ); AddSegmentToDragList( aTrack->GetFlags(), aTrack ); if( aCommand != ID_POPUP_PCB_MOVE_TRACK_SEGMENT ) { Collect_TrackSegmentsToDrag( GetBoard(), aTrack->GetStart(), aTrack->GetLayerSet(), aTrack->GetNetCode(), aTrack->GetWidth() / 2 ); } PosInit = aTrack->GetStart(); } else { STATUS_FLAGS diag = aTrack->IsPointOnEnds( GetCrossHairPosition(), -1 ); wxPoint pos; switch( aCommand ) { case ID_POPUP_PCB_MOVE_TRACK_SEGMENT: // Move segment aTrack->SetFlags( IS_DRAGGED | ENDPOINT | STARTPOINT ); AddSegmentToDragList( aTrack->GetFlags(), aTrack ); break; case ID_POPUP_PCB_DRAG_TRACK_SEGMENT: // drag a segment pos = aTrack->GetStart(); Collect_TrackSegmentsToDrag( GetBoard(), pos, aTrack->GetLayerSet(), aTrack->GetNetCode(), aTrack->GetWidth() / 2 ); pos = aTrack->GetEnd(); aTrack->SetFlags( IS_DRAGGED | ENDPOINT | STARTPOINT ); Collect_TrackSegmentsToDrag( GetBoard(), pos, aTrack->GetLayerSet(), aTrack->GetNetCode(), aTrack->GetWidth() / 2 ); break; case ID_POPUP_PCB_MOVE_TRACK_NODE: // Drag via or move node pos = (diag & STARTPOINT) ? aTrack->GetStart() : aTrack->GetEnd(); Collect_TrackSegmentsToDrag( GetBoard(), pos, aTrack->GetLayerSet(), aTrack->GetNetCode(), aTrack->GetWidth() / 2 ); PosInit = pos; break; } aTrack->SetFlags( IS_DRAGGED ); } // Prepare the Undo command ITEM_PICKER picker( aTrack, UR_CHANGED ); picker.SetLink( aTrack->Clone() ); s_ItemsListPicker.PushItem( picker ); for( unsigned ii = 0; ii < g_DragSegmentList.size(); ii++ ) { TRACK* draggedtrack = g_DragSegmentList[ii].m_Track; picker.SetItem( draggedtrack ); picker.SetLink( draggedtrack->Clone() ); s_ItemsListPicker.PushItem( picker ); draggedtrack = (TRACK*) picker.GetLink(); draggedtrack->SetStatus( 0 ); draggedtrack->ClearFlags(); } s_LastPos = PosInit; m_canvas->SetMouseCapture( Show_MoveNode, Abort_MoveTrack ); GetBoard()->SetHighLightNet( aTrack->GetNetCode() ); GetBoard()->HighLightON(); GetBoard()->DrawHighLight( m_canvas, aDC, GetBoard()->GetHighLightNetCode() ); m_canvas->CallMouseCapture( aDC, wxDefaultPosition, true ); UndrawAndMarkSegmentsToDrag( m_canvas, aDC ); }