/** * Managed cursor callback for placing component pins. */ void LIB_EDIT_FRAME::PlacePin() { LIB_PIN* cur_pin = (LIB_PIN*) m_drawItem; bool ask_for_pin = true; wxPoint newpos; bool status; // Some tests if( !cur_pin || cur_pin->Type() != LIB_PIN_T ) { wxMessageBox( wxT( "LIB_EDIT_FRAME::PlacePin() error" ) ); return; } newpos = GetCrossHairPosition( true ); LIB_PART* part = GetCurPart(); // Test for an other pin in same new position: for( LIB_PIN* pin = part->GetNextPin(); pin; pin = part->GetNextPin( pin ) ) { if( pin == cur_pin || newpos != pin->GetPosition() || pin->GetFlags() ) continue; if( ask_for_pin && SynchronizePins() ) { m_canvas->SetIgnoreMouseEvents( true ); status = IsOK( this, _( "This position is already occupied by another pin. Continue?" ) ); m_canvas->MoveCursorToCrossHair(); m_canvas->SetIgnoreMouseEvents( false ); if( !status ) return; else ask_for_pin = false; } } // Create Undo from GetTempCopyComponent() if exists ( i.e. after a pin move) // or from m_component (pin add ...) if( GetTempCopyComponent() ) SaveCopyInUndoList( GetTempCopyComponent() ); else SaveCopyInUndoList( part ); m_canvas->SetMouseCapture( NULL, NULL ); OnModify(); cur_pin->Move( newpos ); if( cur_pin->IsNew() ) { LastPinOrient = cur_pin->GetOrientation(); LastPinType = cur_pin->GetType(); LastPinShape = cur_pin->GetShape(); if( SynchronizePins() ) CreateImagePins( cur_pin, m_unit, m_convert, m_showDeMorgan ); m_lastDrawItem = cur_pin; part->AddDrawItem( m_drawItem ); } // Put linked pins in new position, and clear flags for( LIB_PIN* pin = part->GetNextPin(); pin; pin = part->GetNextPin( pin ) ) { if( pin->GetFlags() == 0 ) continue; pin->Move( cur_pin->GetPosition() ); pin->ClearFlags(); } m_drawItem = NULL; m_canvas->Refresh(); }
void WinEDA_LibeditFrame::PlacePin(wxDC * DC) /********************************************/ /* Routine de fin de deplacement de la pin selectionnee */ { LibDrawPin * Pin; LibDrawPin * CurrentPin = (LibDrawPin *) CurrentDrawItem; bool ask_for_pin = TRUE; wxPoint newpos; bool status; if( CurrentPin == NULL ) return; newpos.x = GetScreen()->m_Curseur.x; newpos.y = - GetScreen()->m_Curseur.y; Pin = (LibDrawPin *) CurrentLibEntry->m_Drawings; // Tst for an other pin in same new position: for ( ; Pin != NULL; Pin = (LibDrawPin *) Pin->Pnext) { if ( Pin->m_StructType != COMPONENT_PIN_DRAW_TYPE ) continue; if ( Pin == CurrentPin ) continue; if( newpos != Pin->m_Pos ) continue; if ( Pin->m_Flags ) continue; if ( ask_for_pin ) { DrawPanel->m_IgnoreMouseEvents = TRUE; status = IsOK(this, _("Occupied by other pin, Continue ?")); DrawPanel->MouseToCursorSchema(); DrawPanel->m_IgnoreMouseEvents = FALSE; if( ! status ) return; else ask_for_pin = FALSE; } } GetScreen()->ManageCurseur = NULL; GetScreen()->ForceCloseManageCurseur = NULL; GetScreen()->SetModify(); CurrentPin->m_Pos = newpos; if( CurrentPin->m_Flags & IS_NEW ) { LastPinOrient = CurrentPin->m_Orient; LastPinType = CurrentPin->m_PinType; LastPinShape = CurrentPin->m_PinShape; CreateImagePins(CurrentPin); LibItemToRepeat = CurrentPin; } /* Put linked pins in new position, and clear flags */ Pin = (LibDrawPin *)CurrentLibEntry->m_Drawings; for ( ; Pin != NULL; Pin = (LibDrawPin *)Pin->Pnext) { if(Pin->m_StructType != COMPONENT_PIN_DRAW_TYPE ) continue; if( Pin->m_Flags == 0 ) continue; Pin->m_Pos = CurrentPin->m_Pos; Pin->m_Flags = 0; } GetScreen()->CursorOff(DrawPanel, DC); DrawLibraryDrawStruct(DrawPanel, DC, CurrentLibEntry,0,0, CurrentPin,CurrentUnit, GR_DEFAULT_DRAWMODE); GetScreen()->CursorOn(DrawPanel, DC); CurrentDrawItem = NULL; };