void SCH_EDIT_FRAME::OnRotate( wxCommandEvent& aEvent ) { SCH_SCREEN* screen = GetScreen(); SCH_ITEM* item = screen->GetCurItem(); INSTALL_UNBUFFERED_DC( dc, m_canvas ); // Allows block rotate operation on hot key. if( screen->m_BlockLocate.GetState() != STATE_NO_BLOCK ) { screen->m_BlockLocate.SetCommand( BLOCK_ROTATE ); HandleBlockEnd( &dc ); return; } if( item == NULL ) { // If we didn't get here by a hot key, then something has gone wrong. if( aEvent.GetInt() == 0 ) return; EDA_HOTKEY_CLIENT_DATA* data = (EDA_HOTKEY_CLIENT_DATA*) aEvent.GetClientObject(); wxCHECK_RET( data != NULL, wxT( "Invalid hot key client object." ) ); item = LocateAndShowItem( data->GetPosition(), SCH_COLLECTOR::RotatableItems, aEvent.GetInt() ); // Exit if no item found at the current location or the item is already being edited. if( (item == NULL) || (item->GetFlags() != 0) ) return; } switch( item->Type() ) { case SCH_COMPONENT_T: if( aEvent.GetId() == ID_SCH_ROTATE_CLOCKWISE ) OrientComponent( CMP_ROTATE_CLOCKWISE ); else if( aEvent.GetId() == ID_SCH_ROTATE_COUNTERCLOCKWISE ) OrientComponent( CMP_ROTATE_COUNTERCLOCKWISE ); else wxFAIL_MSG( wxT( "Unknown rotate item command ID." ) ); break; case SCH_TEXT_T: case SCH_LABEL_T: case SCH_GLOBAL_LABEL_T: case SCH_HIERARCHICAL_LABEL_T: m_canvas->MoveCursorToCrossHair(); ChangeTextOrient( (SCH_TEXT*) item, &dc ); break; case SCH_FIELD_T: m_canvas->MoveCursorToCrossHair(); RotateField( (SCH_FIELD*) item, &dc ); break; case SCH_BITMAP_T: RotateImage( (SCH_BITMAP*) item ); break; case SCH_SHEET_T: /// @todo allow sheet rotate on hotkey default: wxFAIL_MSG( wxString::Format( wxT( "Cannot rotate schematic item type %s." ), GetChars( item->GetClass() ) ) ); } if( item->GetFlags() == 0 ) screen->SetCurItem( NULL ); }
void WinEDA_SchematicFrame::OnHotKey(wxDC * DC, int hotkey, EDA_BaseStruct * DrawStruct) /***********************************************************/ /* Gestion des commandes rapides (Raccourcis claviers) concernant l'element sous le courseur souris Les majuscules/minuscules sont indifferenciees touche DELETE: Effacement (tout element) touche R: Rotation (composant ou label) touche X: Miroir X (composant) touche Y: Miroir Y (composant) touche N: Orient 0 (composant) touche M: Start Move composant */ { bool PopupOn = m_CurrentScreen->m_CurrentItem && m_CurrentScreen->m_CurrentItem->m_Flags; if ( hotkey == 0 ) return; switch (hotkey) { case WXK_DELETE: case WXK_NUMPAD_DELETE: if ( PopupOn ) break; LocateAndDeleteItem(this, DC); m_CurrentScreen->SetModify(); m_CurrentScreen->m_CurrentItem = NULL; TestDanglingEnds(m_CurrentScreen->EEDrawList, DC); break; case WXK_F5 : if ( g_LastSearchIsMarker ) WinEDA_SchematicFrame::FindMarker(1); else FindSchematicItem(wxEmptyString, 2); break; case 'r': // Rotation case 'R': if ( DrawStruct == NULL ) { DrawStruct = PickStruct( GetScreen()->m_Curseur, GetScreen()->EEDrawList, LIBITEM|TEXTITEM|LABELITEM ); if ( DrawStruct == NULL ) break; if ( DrawStruct->m_StructType == DRAW_LIB_ITEM_STRUCT_TYPE ) DrawStruct = LocateSmallestComponent( GetScreen() ); if ( DrawStruct == NULL ) break; } switch (DrawStruct->m_StructType) { case DRAW_LIB_ITEM_STRUCT_TYPE: CmpRotationMiroir( (EDA_SchComponentStruct *) DrawStruct, DC, CMP_ROTATE_COUNTERCLOCKWISE ); break; case DRAW_TEXT_STRUCT_TYPE: case DRAW_LABEL_STRUCT_TYPE: case DRAW_GLOBAL_LABEL_STRUCT_TYPE: ChangeTextOrient( (DrawTextStruct*)DrawStruct, DC); break; } break; case 'y': // Mirror Y (drawlibpart) case 'Y': if ( DrawStruct == NULL ) DrawStruct = LocateSmallestComponent( GetScreen() ); if ( DrawStruct ) { CmpRotationMiroir( (EDA_SchComponentStruct *) DrawStruct, DC, CMP_MIROIR_Y ); } break; case 'x': // Mirror X (drawlibpart) case 'X': if ( DrawStruct == NULL ) DrawStruct = LocateSmallestComponent( GetScreen() ); if ( DrawStruct ) { CmpRotationMiroir( (EDA_SchComponentStruct *) DrawStruct, DC, CMP_MIROIR_X ); } break; case 'n': case 'N': // Orient 0, no mirror (drawlibpart) if ( DrawStruct == NULL ) DrawStruct = LocateSmallestComponent( GetScreen() ); if ( DrawStruct ) { CmpRotationMiroir( (EDA_SchComponentStruct *) DrawStruct, DC, CMP_NORMAL ); TestDanglingEnds(m_CurrentScreen->EEDrawList, DC); } break; case 'm': case 'M': // Start move drawlibpart if ( PopupOn ) break; if ( DrawStruct == NULL ) DrawStruct = LocateSmallestComponent( GetScreen() ); if ( DrawStruct && (DrawStruct->m_Flags ==0) ) { m_CurrentScreen->m_CurrentItem = DrawStruct; Process_Move_Item(m_CurrentScreen->m_CurrentItem, DC); } break; } }
void SCH_EDIT_FRAME::OnRotate( wxCommandEvent& aEvent ) { SCH_SCREEN* screen = GetScreen(); SCH_ITEM* item = screen->GetCurItem(); INSTALL_UNBUFFERED_DC( dc, m_canvas ); // Allows block rotate operation on hot key. if( screen->m_BlockLocate.GetState() != STATE_NO_BLOCK ) { screen->m_BlockLocate.SetCommand( BLOCK_ROTATE ); HandleBlockEnd( &dc ); return; } if( item == NULL ) { // If we didn't get here by a hot key, then something has gone wrong. if( aEvent.GetInt() == 0 ) return; EDA_HOTKEY_CLIENT_DATA* data = (EDA_HOTKEY_CLIENT_DATA*) aEvent.GetClientObject(); wxCHECK_RET( data != NULL, wxT( "Invalid hot key client object." ) ); item = LocateAndShowItem( data->GetPosition(), SCH_COLLECTOR::RotatableItems, aEvent.GetInt() ); // Exit if no item found at the current location or the item is already being edited. if( (item == NULL) || (item->GetFlags() != 0) ) return; } switch( item->Type() ) { case SCH_COMPONENT_T: { SCH_COMPONENT* component = static_cast<SCH_COMPONENT*>( item ); if( aEvent.GetId() == ID_SCH_ROTATE_CLOCKWISE ) OrientComponent( CMP_ROTATE_CLOCKWISE ); else if( aEvent.GetId() == ID_SCH_ROTATE_COUNTERCLOCKWISE ) OrientComponent( CMP_ROTATE_COUNTERCLOCKWISE ); else wxFAIL_MSG( wxT( "Unknown rotate item command ID." ) ); if( m_autoplaceFields ) component->AutoAutoplaceFields( GetScreen() ); m_canvas->Refresh(); break; } case SCH_TEXT_T: case SCH_LABEL_T: case SCH_GLOBAL_LABEL_T: case SCH_HIERARCHICAL_LABEL_T: m_canvas->MoveCursorToCrossHair(); ChangeTextOrient( (SCH_TEXT*) item ); m_canvas->Refresh(); break; case SCH_FIELD_T: m_canvas->MoveCursorToCrossHair(); RotateField( (SCH_FIELD*) item ); if( item->GetParent()->Type() == SCH_COMPONENT_T ) { // Now that we're moving a field, they're no longer autoplaced. SCH_COMPONENT *parent = static_cast<SCH_COMPONENT*>( item->GetParent() ); parent->ClearFieldsAutoplaced(); } m_canvas->Refresh(); break; case SCH_BITMAP_T: RotateImage( (SCH_BITMAP*) item ); break; case SCH_SHEET_T: if( !item->IsNew() ) // rotate a sheet during its creation has no sense { bool retCCW = ( aEvent.GetId() == ID_SCH_ROTATE_COUNTERCLOCKWISE ); RotateHierarchicalSheet( static_cast<SCH_SHEET*>( item ), retCCW ); } break; case SCH_JUNCTION_T: case SCH_NO_CONNECT_T: // these items are not rotated, because rotation does not change them. break; default: // Other items (wires...) cannot be rotated, at least during creation if( item->IsNew() ) break; wxFAIL_MSG( wxString::Format( wxT( "Cannot rotate schematic item type %s." ), GetChars( item->GetClass() ) ) ); } if( item->GetFlags() == 0 ) screen->SetCurItem( NULL ); }