void LIB_EDIT_FRAME::pasteClipboard( const wxPoint& aOffset ) { LIB_PART* part = GetCurPart(); if( !part || m_clipboard.GetCount() == 0 ) return; for( unsigned int i = 0; i < m_clipboard.GetCount(); i++ ) { // Append a copy to the current part, so the clipboard buffer might be pasted multiple times LIB_ITEM* item = (LIB_ITEM*) m_clipboard.GetItem( i )->Clone(); item->SetParent( part ); item->SetSelected(); item->SetUnit( GetUnit() ); part->AddDrawItem( item ); } BlockMoveSelectedItems( aOffset, GetCurPart(), &GetScreen()->m_BlockLocate ); RebuildView(); GetCanvas()->Refresh(); OnModify(); }
/** * 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 LIB_EDIT_FRAME::LoadOneSymbol() { LIB_PART* part = GetCurPart(); // Exit if no library entry is selected or a command is in progress. if( !part || ( m_drawItem && m_drawItem->GetFlags() ) ) return; PROJECT& prj = Prj(); SEARCH_STACK* search = prj.SchSearchS(); m_canvas->SetIgnoreMouseEvents( true ); wxString default_path = prj.GetRString( PROJECT::SCH_LIB_PATH ); if( !default_path ) default_path = search->LastVisitedPath(); wxFileDialog dlg( this, _( "Import Symbol Drawings" ), default_path, wxEmptyString, SchematicSymbolFileWildcard, wxFD_OPEN | wxFD_FILE_MUST_EXIST ); if( dlg.ShowModal() == wxID_CANCEL ) return; SetCrossHairPosition( wxPoint( 0, 0 ) ); m_canvas->MoveCursorToCrossHair(); m_canvas->SetIgnoreMouseEvents( false ); wxString filename = dlg.GetPath(); prj.SetRString( PROJECT::SCH_LIB_PATH, filename ); std::unique_ptr<PART_LIB> lib( new PART_LIB( LIBRARY_TYPE_SYMBOL, filename ) ); wxString err; if( !lib->Load( err ) ) { wxString msg = wxString::Format( _( "Error '%s' occurred loading part file '%s'." ), GetChars( err ), GetChars( filename ) ); DisplayError( this, msg ); return; } if( lib->IsEmpty() ) { wxString msg = wxString::Format( _( "No parts found in part file '%s'." ), GetChars( filename ) ); DisplayError( this, msg ); return; } if( lib->GetCount() > 1 ) { wxString msg = wxString::Format( _( "More than one part in part file '%s'." ), GetChars( filename ) ); wxMessageBox( msg, _( "Warning" ), wxOK | wxICON_EXCLAMATION, this ); } LIB_PART* first = lib->GetFirstEntry()->GetPart(); LIB_ITEMS& drawList = first->GetDrawItemList(); for( LIB_ITEM& item : drawList ) { if( item.Type() == LIB_FIELD_T ) continue; if( item.GetUnit() ) item.SetUnit( m_unit ); if( item.GetConvert() ) item.SetConvert( m_convert ); item.SetFlags( IS_NEW | SELECTED ); LIB_ITEM* newItem = (LIB_ITEM*) item.Clone(); newItem->SetParent( part ); part->AddDrawItem( newItem ); } part->RemoveDuplicateDrawItems(); part->ClearSelectedItems(); OnModify(); m_canvas->Refresh(); }