bool LIB_EDIT_FRAME::LoadComponentFromCurrentLib( const wxString& aAliasName, int aUnit, int aConvert ) { LIB_ALIAS* alias = nullptr; try { alias = Prj().SchSymbolLibTable()->LoadSymbol( GetCurLib(), aAliasName ); } catch( const IO_ERROR& ioe ) { wxString msg; msg.Printf( _( "Error occurred loading symbol \"%s\" from library \"%s\"." ), aAliasName, GetCurLib() ); DisplayErrorMessage( this, msg, ioe.What() ); return false; } if( !alias || !LoadOneLibraryPartAux( alias, GetCurLib(), aUnit, aConvert ) ) return false; // Enable synchronized pin edit mode for symbols with interchangeable units m_syncPinEdit = !GetCurPart()->UnitsLocked(); GetScreen()->ClearUndoRedoList(); Zoom_Automatique( false ); SetShowDeMorgan( GetCurPart()->HasConversion() ); if( aUnit > 0 ) UpdatePartSelectList(); return true; }
bool LIB_EDIT_FRAME::isCurrentPart( const LIB_ID& aLibId ) const { // This will return the root part of any alias LIB_PART* part = m_libMgr->GetBufferedPart( aLibId.GetLibItemName(), aLibId.GetLibNickname() ); // Now we can compare the libId of the current part and the root part return ( part && GetCurPart() && part->GetLibId() == GetCurPart()->GetLibId() ); }
void LIB_EDIT_FRAME::OnAddPartToSchematic( wxCommandEvent& event ) { if( GetCurPart() ) { SCH_EDIT_FRAME* schframe = (SCH_EDIT_FRAME*) Kiway().Player( FRAME_SCH, false ); if( schframe == NULL ) // happens when the schematic editor is not active (or closed) { DisplayErrorMessage( this, _( "No schematic currently open." ) ); return; } SCH_COMPONENT* component = new SCH_COMPONENT( *GetCurPart(), GetCurPart()->GetLibId(), g_CurrentSheet, GetUnit(), GetConvert() ); // Be sure the link to the corresponding LIB_PART is OK: component->Resolve( *Prj().SchSymbolLibTable() ); if( schframe->GetAutoplaceFields() ) component->AutoplaceFields( /* aScreen */ NULL, /* aManual */ false ); schframe->Raise(); schframe->GetToolManager()->RunAction( EE_ACTIONS::placeSymbol, true, component ); } }
void LIB_EDIT_FRAME::SyncLibraries( bool aShowProgress ) { LIB_ID selected; if( m_treePane ) selected = m_treePane->GetLibTree()->GetSelectedLibId(); if( aShowProgress ) { wxProgressDialog progressDlg( _( "Loading Symbol Libraries" ), wxEmptyString, m_libMgr->GetAdapter()->GetLibrariesCount(), this ); m_libMgr->Sync( true, [&]( int progress, int max, const wxString& libName ) { progressDlg.Update( progress, wxString::Format( _( "Loading library \"%s\"" ), libName ) ); } ); } else { m_libMgr->Sync( true ); } if( m_treePane ) { wxDataViewItem found; if( selected.IsValid() ) { // Check if the previously selected item is still valid, // if not - it has to be unselected to prevent crash found = m_libMgr->GetAdapter()->FindItem( selected ); if( !found ) m_treePane->GetLibTree()->Unselect(); } m_treePane->Regenerate(); // Try to select the parent library, in case the part is not found if( !found && selected.IsValid() ) { selected.SetLibItemName( "" ); found = m_libMgr->GetAdapter()->FindItem( selected ); if( found ) m_treePane->GetLibTree()->SelectLibId( selected ); } // If no selection, see if there's a current part to centre if( !selected.IsValid() && GetCurPart() ) { LIB_ID current( GetCurLib(), GetCurPart()->GetName() ); m_treePane->GetLibTree()->CenterLibId( current ); } } }
void LIB_EDIT_FRAME::updateTitle() { wxString lib = GetCurLib(); wxString title = _( "Symbol Editor" ); if( GetCurPart() ) title += wxT( " \u2014 " ) + GetCurPart()->GetLibId().Format(); SetTitle( title ); }
LIB_ID LIB_EDIT_FRAME::getTargetLibId() const { LIB_ID id = m_treePane->GetLibTree()->GetSelectedLibId(); wxString nickname = id.GetLibNickname(); if( nickname.IsEmpty() && GetCurPart() ) id = GetCurPart()->GetLibId(); return id; }
void LIB_EDIT_FRAME::OnRevert( wxCommandEvent& aEvent ) { LIB_ID libId = getTargetLibId(); const wxString& libName = libId.GetLibNickname(); const wxString& partName = libId.GetLibItemName(); // Empty if this is the library itself that is selected wxString msg = wxString::Format( _( "Revert \"%s\" to last version saved?" ), partName.IsEmpty() ? libName : partName ); if( !ConfirmRevertDialog( this, msg ) ) return; bool reload_currentPart = false; wxString curr_partName = partName; if( GetCurPart() ) { // the library itself is reverted: the current part will be reloaded only if it is // owned by this library if( partName.IsEmpty() ) { LIB_ID curr_libId = GetCurPart()->GetLibId(); reload_currentPart = libName == curr_libId.GetLibNickname(); if( reload_currentPart ) curr_partName = curr_libId.GetLibItemName(); } else reload_currentPart = isCurrentPart( libId ); } int unit = m_unit; if( reload_currentPart ) emptyScreen(); if( partName.IsEmpty() ) { m_libMgr->RevertLibrary( libName ); } else { libId = m_libMgr->RevertPart( libId.GetLibItemName(), libId.GetLibNickname() ); m_treePane->GetLibTree()->SelectLibId( libId ); m_libMgr->ClearPartModified( libId.GetLibItemName(), libId.GetLibNickname() ); } if( reload_currentPart && m_libMgr->PartExists( curr_partName, libName ) ) loadPart( curr_partName, libName, unit ); m_treePane->Refresh(); refreshSchematic(); }
bool LIB_EDIT_FRAME::LoadComponentFromCurrentLib( LIB_ALIAS* aLibEntry ) { if( !LoadOneLibraryPartAux( aLibEntry, GetCurLib() ) ) return false; m_editPinsPerPartOrConvert = GetCurPart()->UnitsLocked() ? true : false; GetScreen()->ClearUndoRedoList(); Zoom_Automatique( false ); SetShowDeMorgan( GetCurPart()->HasConversion() ); return true; }
void LIB_EDIT_FRAME::RebuildSymbolUnitsList() { if( m_partSelectBox == NULL ) return; if( m_partSelectBox->GetCount() != 0 ) m_partSelectBox->Clear(); LIB_PART* part = GetCurPart(); if( !part || part->GetUnitCount() <= 1 ) { m_unit = 1; m_partSelectBox->Append( wxEmptyString ); } else { for( int i = 0; i < part->GetUnitCount(); i++ ) { wxString sub = LIB_PART::SubReference( i+1, false ); wxString unit = wxString::Format( _( "Unit %s" ), GetChars( sub ) ); m_partSelectBox->Append( unit ); } } // Ensure the current selected unit is compatible with // the number of units of the current part: if( part && part->GetUnitCount() < m_unit ) m_unit = 1; m_partSelectBox->SetSelection( ( m_unit > 0 ) ? m_unit - 1 : 0 ); }
bool LIB_EDIT_FRAME::SaveOnePart( PART_LIB* aLib, bool aPromptUser ) { wxString msg; LIB_PART* part = GetCurPart(); GetScreen()->ClrModify(); LIB_PART* old_part = aLib->FindPart( part->GetName() ); if( old_part && aPromptUser ) { msg.Printf( _( "Part '%s' already exists. Change it?" ), GetChars( part->GetName() ) ); if( !IsOK( this, msg ) ) return false; } m_drawItem = m_lastDrawItem = NULL; if( old_part ) aLib->ReplacePart( old_part, part ); else aLib->AddPart( part ); msg.Printf( _( "Part '%s' saved in library '%s'" ), GetChars( part->GetName() ), GetChars( aLib->GetName() ) ); SetStatusText( msg ); return true; }
void LIB_EDIT_FRAME::copySelectedItems() { LIB_PART* part = GetCurPart(); if( !part ) return; m_clipboard.ClearListAndDeleteItems(); // delete previous saved list, if exists m_clipboard.SetLastCursorPosition( GetScreen()->m_BlockLocate.GetEnd() ); // store the reference point for( LIB_ITEM& item : part->GetDrawItems() ) { // We *do not* copy fields because they are unique for the whole component // so skip them (do not duplicate) if they are flagged selected. if( item.Type() == LIB_FIELD_T ) item.ClearFlags( SELECTED ); if( !item.IsSelected() ) continue; // Do not clear the 'selected' flag. It is required to have items drawn when they are pasted. LIB_ITEM* copy = (LIB_ITEM*) item.Clone(); copy->SetFlags( copy->GetFlags() | UR_TRANSIENT ); ITEM_PICKER picker( copy, UR_NEW ); m_clipboard.PushItem( picker ); } }
bool LIB_EDIT_FRAME::SynchronizePins() { LIB_PART* part = GetCurPart(); return !m_editPinsPerPartOrConvert && ( part && ( part->HasConversion() || part->IsMulti() ) ); }
void LIB_EDIT_FRAME::OnUpdateDeMorganConvert( wxUpdateUIEvent& event ) { LIB_PART* part = GetCurPart(); event.Enable( GetShowDeMorgan() || ( part && part->HasConversion() ) ); event.Check( m_convert > 1 ); }
bool LIB_EDIT_FRAME::saveCurrentPart() { if( GetCurPart() ) { LIB_ID libId = GetCurPart()->GetLibId(); const wxString& libName = libId.GetLibNickname(); const wxString& partName = libId.GetLibItemName(); if( m_libMgr->FlushPart( partName, libName ) ) { m_libMgr->ClearPartModified( partName, libName ); return true; } } return false; }
void LIB_EDIT_FRAME::OnUpdatePinByPin( wxUpdateUIEvent& event ) { LIB_PART* part = GetCurPart(); event.Enable( part && ( part->GetUnitCount() > 1 || m_showDeMorgan ) ); event.Check( m_editPinsPerPartOrConvert ); }
void LIB_EDIT_FRAME::OnUpdateEditingPart( wxUpdateUIEvent& aEvent ) { LIB_PART* part = GetCurPart(); aEvent.Enable( part != NULL ); if( part && aEvent.GetEventObject() == m_drawToolBar ) aEvent.Check( GetToolId() == aEvent.GetId() ); }
void LIB_EDIT_FRAME::OnUpdateDeMorganNormal( wxUpdateUIEvent& event ) { if( m_mainToolBar == NULL ) return; LIB_PART* part = GetCurPart(); event.Enable( GetShowDeMorgan() || ( part && part->HasConversion() ) ); event.Check( m_convert <= 1 ); }
void LIB_EDIT_FRAME::OnUpdatePartNumber( wxUpdateUIEvent& event ) { if( m_partSelectBox == NULL ) return; LIB_PART* part = GetCurPart(); // Using the typical event.Enable() call doesn't seem to work with wxGTK // so use the pointer to alias combobox to directly enable or disable. m_partSelectBox->Enable( part && part->GetUnitCount() > 1 ); }
void LIB_EDIT_FRAME::OnOpenPinTable( wxCommandEvent& aEvent ) { LIB_PART* part = GetCurPart(); DIALOG_LIB_EDIT_PIN_TABLE dlg( this, *part ); if( dlg.ShowModal() == wxID_CANCEL ) return; return; }
void LIB_EDIT_FRAME::TempCopyComponent() { delete m_tempCopyComponent; if( LIB_PART* part = GetCurPart() ) // clone it and own the clone. m_tempCopyComponent = new LIB_PART( *part ); else // clear it, there was no CurPart m_tempCopyComponent = NULL; }
void LIB_EDIT_FRAME::deleteItem( wxDC* aDC ) { wxCHECK_RET( m_drawItem != NULL, wxT( "No drawing item selected to delete." ) ); m_canvas->CrossHairOff( aDC ); LIB_PART* part = GetCurPart(); SaveCopyInUndoList( part ); if( m_drawItem->Type() == LIB_PIN_T ) { LIB_PIN* pin = (LIB_PIN*) m_drawItem; wxPoint pos = pin->GetPosition(); part->RemoveDrawItem( (LIB_ITEM*) pin, m_canvas, aDC ); if( SynchronizePins() ) { LIB_PIN* tmp = part->GetNextPin(); while( tmp != NULL ) { pin = tmp; tmp = part->GetNextPin( pin ); if( pin->GetPosition() != pos ) continue; part->RemoveDrawItem( (LIB_ITEM*) pin ); } } m_canvas->Refresh(); } else { if( m_canvas->IsMouseCaptured() ) { m_canvas->CallEndMouseCapture( aDC ); } else { part->RemoveDrawItem( m_drawItem, m_canvas, aDC ); m_canvas->Refresh(); } } m_drawItem = NULL; m_lastDrawItem = NULL; OnModify(); m_canvas->CrossHairOn( aDC ); }
void LIB_EDIT_FRAME::InstallFieldsEditorDialog( wxCommandEvent& event ) { if( !GetCurPart() ) return; m_canvas->EndMouseCapture( ID_NO_TOOL_SELECTED, m_canvas->GetDefaultCursor() ); DIALOG_EDIT_LIBENTRY_FIELDS_IN_LIB dlg( this, GetCurPart() ); // This dialog itself subsequently can invoke a KIWAY_PLAYER as a quasimodal // frame. Therefore this dialog as a modal frame parent, MUST be run under // quasimodal mode for the quasimodal frame support to work. So don't use // the QUASIMODAL macros here. if( dlg.ShowQuasiModal() != wxID_OK ) return; UpdateAliasSelectList(); UpdatePartSelectList(); DisplayLibInfos(); Refresh(); }
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(); }
bool LIB_EDIT_FRAME::LoadComponentAndSelectLib( const LIB_ID& aLibId, int aUnit, int aConvert ) { if( GetScreen()->IsModify() && GetCurPart() ) { if( !HandleUnsavedChanges( this, _( "The current symbol has been modified. Save changes?" ), [&]()->bool { return saveCurrentPart(); } ) ) { return false; } } SelectActiveLibrary( aLibId.GetLibNickname() ); return LoadComponentFromCurrentLib( aLibId.GetLibItemName(), aUnit, aConvert ); }
const BOX2I LIB_EDIT_FRAME::GetDocumentExtents() const { LIB_PART* part = GetCurPart(); if( !part ) { return BOX2I( VECTOR2I(-100, -100), VECTOR2I( 200, 200 ) ); } else { EDA_RECT boundingBox = part->GetUnitBoundingBox( m_unit, m_convert ); return BOX2I( boundingBox.GetOrigin(), VECTOR2I( boundingBox.GetWidth(), boundingBox.GetHeight() ) ); } }
void LIB_EDIT_FRAME::OnEditComponentProperties( wxCommandEvent& event ) { bool partLocked = GetCurPart()->UnitsLocked(); DIALOG_EDIT_COMPONENT_IN_LIBRARY dlg( this ); if( dlg.ShowModal() == wxID_CANCEL ) return; if( partLocked != GetCurPart()->UnitsLocked() ) { // m_editPinsPerPartOrConvert is set to the better value, if m_UnitSelectionLocked // has changed m_editPinsPerPartOrConvert = GetCurPart()->UnitsLocked() ? true : false; } UpdateAliasSelectList(); UpdatePartSelectList(); DisplayLibInfos(); DisplayCmpDoc(); OnModify(); m_canvas->Refresh(); }
void LIB_EDIT_FRAME::OnCreateNewPartFromExisting( wxCommandEvent& event ) { LIB_PART* part = GetCurPart(); wxCHECK_RET( part, wxT( "Cannot create new part from non-existent current part." ) ); INSTALL_UNBUFFERED_DC( dc, m_canvas ); m_canvas->CrossHairOff( &dc ); EditField( &part->GetValueField() ); m_canvas->MoveCursorToCrossHair(); m_canvas->CrossHairOn( &dc ); }
void LIB_EDIT_FRAME::DisplayCmpDoc() { LIB_ALIAS* alias; PART_LIB* lib = GetCurLib(); LIB_PART* part = GetCurPart(); ClearMsgPanel(); if( !lib || !part ) return; wxString msg = part->GetName(); AppendMsgPanel( _( "Name" ), msg, BLUE, 8 ); if( m_aliasName == part->GetName() ) msg = _( "None" ); else msg = m_aliasName; alias = part->GetAlias( m_aliasName ); wxCHECK_RET( alias != NULL, "Alias not found in component." ); AppendMsgPanel( _( "Alias" ), msg, RED, 8 ); static wxChar UnitLetter[] = wxT( "?ABCDEFGHIJKLMNOPQRSTUVWXYZ" ); msg = UnitLetter[m_unit]; AppendMsgPanel( _( "Unit" ), msg, BROWN, 8 ); if( m_convert > 1 ) msg = _( "Convert" ); else msg = _( "Normal" ); AppendMsgPanel( _( "Body" ), msg, GREEN, 8 ); if( part->IsPower() ) msg = _( "Power Symbol" ); else msg = _( "Part" ); AppendMsgPanel( _( "Type" ), msg, MAGENTA, 8 ); AppendMsgPanel( _( "Description" ), alias->GetDescription(), CYAN, 8 ); AppendMsgPanel( _( "Key words" ), alias->GetKeyWords(), DARKDARKGRAY ); AppendMsgPanel( _( "Datasheet" ), alias->GetDocFileName(), DARKDARKGRAY ); }
void LIB_EDIT_FRAME::SVG_PlotComponent( const wxString& aFullFileName ) { const bool plotBW = false; const PAGE_INFO& pageInfo = GetScreen()->GetPageSettings(); SVG_PLOTTER* plotter = new SVG_PLOTTER(); plotter->SetPageSettings( pageInfo ); plotter->SetDefaultLineWidth( GetDefaultLineThickness() ); plotter->SetColorMode( plotBW ); wxPoint plot_offset; const double scale = 1.0; // Currently, plot units are in decimil plotter->SetViewport( plot_offset, IU_PER_MILS/10, scale, false ); // Init : plotter->SetCreator( wxT( "Eeschema-SVG" ) ); if( ! plotter->OpenFile( aFullFileName ) ) { delete plotter; return; } LOCALE_IO toggle; plotter->StartPlot(); LIB_PART* part = GetCurPart(); if( part ) { TRANSFORM temp; // Uses default transform wxPoint plotPos; plotPos.x = pageInfo.GetWidthIU() /2; plotPos.y = pageInfo.GetHeightIU()/2; part->Plot( plotter, GetUnit(), GetConvert(), plotPos, temp ); // Plot lib fields, not plotted by m_component->Plot(): part->PlotLibFields( plotter, GetUnit(), GetConvert(), plotPos, temp ); } plotter->EndPlot(); delete plotter; }
LIB_PART* LIB_EDIT_FRAME::getTargetPart() const { LIB_ALIAS* alias = nullptr; if( m_treePane->GetLibTree()->IsMenuActive() ) { LIB_ID libId = m_treePane->GetLibTree()->GetSelectedLibId(); alias = m_libMgr->GetAlias( libId.GetLibItemName(), libId.GetLibNickname() ); } else if( LIB_PART* part = GetCurPart() ) { alias = part->GetAlias( 0 ); } return alias ? alias->GetPart() : nullptr; }