void EC_LINE::Apply( EDIT_POINT& aHandle ) { SEG main( m_constrainer.GetPosition(), m_constrainer.GetPosition() + m_line ); SEG projection( aHandle.GetPosition(), aHandle.GetPosition() + m_line.Perpendicular() ); if( OPT_VECTOR2I intersect = projection.IntersectLines( main ) ) aHandle.SetPosition( *intersect ); }
void EC_45DEGREE::Apply( EDIT_POINT& aHandle ) { // Current line vector VECTOR2I lineVector( aHandle.GetPosition() - m_constrainer.GetPosition() ); double angle = lineVector.Angle(); // Find the closest angle, which is a multiple of 45 degrees double newAngle = KiROUND( angle / ( M_PI / 4.0 ) ) * M_PI / 4.0; VECTOR2I newLineVector = lineVector.Rotate( newAngle - angle ); aHandle.SetPosition( m_constrainer.GetPosition() + newLineVector ); }
void EC_CIRCLE::Apply( EDIT_POINT& aHandle ) { VECTOR2I centerToEnd = m_end.GetPosition() - m_center.GetPosition(); VECTOR2I centerToPoint = aHandle.GetPosition() - m_center.GetPosition(); int radius = centerToEnd.EuclideanNorm(); double angle = centerToPoint.Angle(); VECTOR2I newLine( radius, 0 ); newLine = newLine.Rotate( angle ); aHandle.SetPosition( m_center.GetPosition() + newLine ); }
void EC_HORIZONTAL::Apply( EDIT_POINT& aHandle ) { VECTOR2I point = aHandle.GetPosition(); point.y = m_constrainer.GetPosition().y; aHandle.SetPosition( point ); }
void EC_VERTICAL::Apply( EDIT_POINT& aHandle ) { VECTOR2I point = aHandle.GetPosition(); point.x = m_constrainer.GetPosition().x; aHandle.SetPosition( point ); }
int POINT_EDITOR::OnSelectionChange( TOOL_EVENT& aEvent ) { const SELECTION_TOOL::SELECTION& selection = m_selectionTool->GetSelection(); if( selection.Size() == 1 ) { Activate(); KIGFX::VIEW_CONTROLS* controls = getViewControls(); KIGFX::VIEW* view = getView(); PCB_EDIT_FRAME* editFrame = getEditFrame<PCB_EDIT_FRAME>(); EDA_ITEM* item = selection.items.GetPickedItem( 0 ); m_editPoints = EDIT_POINTS_FACTORY::Make( item, getView()->GetGAL() ); if( !m_editPoints ) { setTransitions(); return 0; } view->Add( m_editPoints.get() ); m_dragPoint = NULL; bool modified = false; // Main loop: keep receiving events while( OPT_TOOL_EVENT evt = Wait() ) { if( !m_editPoints || evt->Matches( m_selectionTool->ClearedEvent ) || evt->Matches( m_selectionTool->DeselectedEvent ) || evt->Matches( m_selectionTool->SelectedEvent ) ) { break; } if( evt->IsMotion() ) { EDIT_POINT* point = m_editPoints->FindPoint( evt->Position() ); if( m_dragPoint != point ) { if( point ) { controls->ShowCursor( true ); controls->SetSnapping( true ); controls->ForceCursorPosition( true, point->GetPosition() ); } else { controls->ShowCursor( false ); controls->SetSnapping( false ); controls->ForceCursorPosition( false ); } } m_dragPoint = point; } else if( evt->IsDblClick( BUT_LEFT ) ) { breakOutline( controls->GetCursorPosition() ); } else if( evt->IsDrag( BUT_LEFT ) && m_dragPoint ) { if( !modified ) { // Save items, so changes can be undone editFrame->OnModify(); editFrame->SaveCopyInUndoList( selection.items, UR_CHANGED ); controls->ForceCursorPosition( false ); m_original = *m_dragPoint; // Save the original position controls->SetAutoPan( true ); modified = true; } bool enableAltConstraint = !!evt->Modifier( MD_CTRL ); if( enableAltConstraint != (bool) m_altConstraint ) // alternative constraint setAltConstraint( enableAltConstraint ); m_dragPoint->SetPosition( controls->GetCursorPosition() ); if( m_altConstraint ) m_altConstraint->Apply(); else m_dragPoint->ApplyConstraint(); updateItem(); updatePoints(); m_editPoints->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY ); } else if( evt->IsAction( &COMMON_ACTIONS::pointEditorUpdate ) ) { updatePoints(); } else if( evt->IsMouseUp( BUT_LEFT ) ) { controls->SetAutoPan( false ); setAltConstraint( false ); modified = false; } else if( evt->IsCancel() ) { if( modified ) // Restore the last change { wxCommandEvent dummy; editFrame->GetBoardFromUndoList( dummy ); updatePoints(); modified = false; } // Let the selection tool receive the event too m_toolMgr->PassEvent(); break; } else { m_toolMgr->PassEvent(); } } if( m_editPoints ) { finishItem(); item->ViewUpdate( KIGFX::VIEW_ITEM::GEOMETRY ); view->Remove( m_editPoints.get() ); m_editPoints.reset(); } controls->ShowCursor( false ); controls->SetAutoPan( false ); controls->SetSnapping( false ); controls->ForceCursorPosition( false ); } setTransitions(); return 0; }