void SCH_EDIT_FRAME::OnSelectUnit( wxCommandEvent& aEvent ) { SCH_SCREEN* screen = GetScreen(); SCH_ITEM* item = screen->GetCurItem(); wxCHECK_RET( item != NULL && item->Type() == SCH_COMPONENT_T, wxT( "Cannot select unit of invalid schematic item." ) ); INSTALL_UNBUFFERED_DC( dc, m_canvas ); m_canvas->MoveCursorToCrossHair(); SCH_COMPONENT* component = (SCH_COMPONENT*) item; int unit = aEvent.GetId() + 1 - ID_POPUP_SCH_SELECT_UNIT1; LIB_PART* part = GetLibPart( component->GetLibId() ); if( !part ) return; int unitCount = part->GetUnitCount(); wxCHECK_RET( (unit >= 1) && (unit <= unitCount), wxString::Format( wxT( "Cannot select unit %d from component " ), unit ) + part->GetName() ); if( unitCount <= 1 || component->GetUnit() == unit ) return; if( unit > unitCount ) unit = unitCount; STATUS_FLAGS flags = component->GetFlags(); if( !flags ) // No command in progress: save in undo list SaveCopyInUndoList( component, UR_CHANGED ); if( flags ) component->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode, g_GhostColor ); else component->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode ); /* Update the unit number. */ component->SetUnitSelection( m_CurrentSheet, unit ); component->SetUnit( unit ); component->ClearFlags(); component->SetFlags( flags ); // Restore m_Flag modified by SetUnit() if( m_autoplaceFields ) component->AutoAutoplaceFields( GetScreen() ); if( screen->TestDanglingEnds() ) m_canvas->Refresh(); OnModify(); }
void SCH_REFERENCE::Annotate() { if( m_NumRef < 0 ) m_Ref += '?'; else { // To avoid a risk of duplicate, for power components // the ref number is 0nnn instead of nnn. // Just because sometimes only power components are annotated if( GetLibPart() && GetLibPart()->IsPower() ) m_Ref = TO_UTF8( GetRef() << "0" << m_NumRef ); else m_Ref = TO_UTF8( GetRef() << m_NumRef ); } m_RootCmp->SetRef( &m_SheetPath, FROM_UTF8( m_Ref.c_str() ) ); m_RootCmp->SetUnit( m_Unit ); m_RootCmp->SetUnitSelection( &m_SheetPath, m_Unit ); }
void SCH_EDIT_FRAME::ConvertPart( SCH_COMPONENT* aComponent, wxDC* DC ) { if( !aComponent ) return; LIB_ID id = aComponent->GetLibId(); LIB_PART* part = GetLibPart( id ); if( part ) { wxString msg; if( !part->HasConversion() ) { msg.Printf( _( "No alternate body style found for symbol \"%s\" in library \"%s\"." ), id.GetLibItemName().wx_str(), id.GetLibNickname().wx_str() ); DisplayError( this, msg ); return; } STATUS_FLAGS flags = aComponent->GetFlags(); if( aComponent->GetFlags() ) aComponent->Draw( m_canvas, DC, wxPoint( 0, 0 ), g_XorMode, g_GhostColor ); else aComponent->Draw( m_canvas, DC, wxPoint( 0, 0 ), g_XorMode ); aComponent->SetConvert( aComponent->GetConvert() + 1 ); // ensure m_Convert = 0, 1 or 2 // 0 and 1 = shape 1 = not converted // 2 = shape 2 = first converted shape // > 2 is not used but could be used for more shapes // like multiple shapes for a programmable component // When m_Convert = val max, return to the first shape if( aComponent->GetConvert() > 2 ) aComponent->SetConvert( 1 ); // The alternate symbol may cause a change in the connection status so test the // connections so the connection indicators are drawn correctly. GetScreen()->TestDanglingEnds(); aComponent->ClearFlags(); aComponent->SetFlags( flags ); // Restore m_Flag (modified by SetConvert()) /* Redraw the component in the new position. */ if( aComponent->IsMoving() ) aComponent->Draw( m_canvas, DC, wxPoint( 0, 0 ), g_XorMode, g_GhostColor ); else aComponent->Draw( m_canvas, DC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE ); OnModify(); } }
void SCH_EDIT_FRAME::ConvertPart( SCH_COMPONENT* aComponent ) { if( !aComponent ) return; LIB_ID id = aComponent->GetLibId(); LIB_PART* part = GetLibPart( id ); if( part ) { wxString msg; if( !part->HasConversion() ) { msg.Printf( _( "No alternate body style found for symbol \"%s\" in library \"%s\"." ), id.GetLibItemName().wx_str(), id.GetLibNickname().wx_str() ); DisplayError( this, msg ); return; } STATUS_FLAGS savedFlags = aComponent->GetFlags(); aComponent->SetConvert( aComponent->GetConvert() + 1 ); // ensure m_Convert = 1 or 2 // 1 = shape 1 = not converted // 2 = shape 2 = first converted shape // > 2 is not used but could be used for more shapes // like multiple shapes for a programmable component // When m_Convert = val max, return to the first shape if( aComponent->GetConvert() > LIB_ITEM::LIB_CONVERT::DEMORGAN ) aComponent->SetConvert( LIB_ITEM::LIB_CONVERT::BASE ); // The alternate symbol may cause a change in the connection status so test the // connections so the connection indicators are drawn correctly. aComponent->UpdatePins(); TestDanglingEnds(); aComponent->ClearFlags(); aComponent->SetFlags( savedFlags ); // Restore m_Flags (modified by SetConvert()) // If selected make sure all the now-included pins are selected if( aComponent->IsSelected() ) m_toolManager->RunAction( EE_ACTIONS::addItemToSel, true, aComponent ); RefreshItem( aComponent ); OnModify(); } }
void SCH_EDIT_FRAME::ConvertPart( SCH_COMPONENT* aComponent ) { if( !aComponent ) return; LIB_ID id = aComponent->GetLibId(); LIB_PART* part = GetLibPart( id ); if( part ) { wxString msg; if( !part->HasConversion() ) { msg.Printf( _( "No alternate body style found for symbol \"%s\" in library \"%s\"." ), id.GetLibItemName().wx_str(), id.GetLibNickname().wx_str() ); DisplayError( this, msg ); return; } STATUS_FLAGS flags = aComponent->GetFlags(); aComponent->SetConvert( aComponent->GetConvert() + 1 ); // ensure m_Convert = 0, 1 or 2 // 0 and 1 = shape 1 = not converted // 2 = shape 2 = first converted shape // > 2 is not used but could be used for more shapes // like multiple shapes for a programmable component // When m_Convert = val max, return to the first shape if( aComponent->GetConvert() > 2 ) aComponent->SetConvert( 1 ); // The alternate symbol may cause a change in the connection status so test the // connections so the connection indicators are drawn correctly. aComponent->UpdatePins(); TestDanglingEnds(); aComponent->ClearFlags(); aComponent->SetFlags( flags ); // Restore m_Flag (modified by SetConvert()) RefreshItem( aComponent ); OnModify(); } }
void SCH_EDIT_FRAME::OnSelectUnit( wxCommandEvent& aEvent ) { SCH_SCREEN* screen = GetScreen(); SCH_ITEM* item = screen->GetCurItem(); SCH_COMPONENT* component = (SCH_COMPONENT*) item; GetCanvas()->MoveCursorToCrossHair(); int unit = aEvent.GetId() + 1 - ID_POPUP_SCH_SELECT_UNIT1; LIB_PART* part = GetLibPart( component->GetLibId() ); if( !part ) return; int unitCount = part->GetUnitCount(); if( unitCount <= 1 || component->GetUnit() == unit ) return; if( unit > unitCount ) unit = unitCount; STATUS_FLAGS flags = component->GetFlags(); if( !flags ) // No command in progress: save in undo list SaveCopyInUndoList( component, UR_CHANGED ); /* Update the unit number. */ component->SetUnitSelection( g_CurrentSheet, unit ); component->SetUnit( unit ); component->ClearFlags(); component->SetFlags( flags ); // Restore m_Flag modified by SetUnit() if( m_autoplaceFields ) component->AutoAutoplaceFields( GetScreen() ); TestDanglingEnds(); RefreshItem( component ); OnModify(); }
void SCH_EDIT_FRAME::SelectUnit( SCH_COMPONENT* aComponent, int aUnit ) { GetCanvas()->MoveCursorToCrossHair(); LIB_PART* part = GetLibPart( aComponent->GetLibId() ); if( !part ) return; int unitCount = part->GetUnitCount(); if( unitCount <= 1 || aComponent->GetUnit() == aUnit ) return; if( aUnit > unitCount ) aUnit = unitCount; STATUS_FLAGS savedFlags = aComponent->GetFlags(); if( !aComponent->GetEditFlags() ) // No command in progress: save in undo list SaveCopyInUndoList( aComponent, UR_CHANGED ); /* Update the unit number. */ aComponent->SetUnitSelection( g_CurrentSheet, aUnit ); aComponent->SetUnit( aUnit ); aComponent->ClearFlags(); aComponent->SetFlags( savedFlags ); // Restore m_Flag modified by SetUnit() if( !aComponent->GetEditFlags() ) // No command in progress: update schematic { if( m_autoplaceFields ) aComponent->AutoAutoplaceFields( GetScreen() ); TestDanglingEnds(); RefreshItem( aComponent ); OnModify(); } }
SCH_COMPONENT* SCH_EDIT_FRAME::Load_Component( const SCHLIB_FILTER* aFilter, SCH_BASE_FRAME::HISTORY_LIST& aHistoryList, bool aAllowBrowser ) { wxString msg; SetRepeatItem( NULL ); m_canvas->SetIgnoreMouseEvents( true ); auto sel = SelectComponentFromLibTree( aFilter, aHistoryList, aAllowBrowser, 1, 1, m_footprintPreview ); if( !sel.LibId.IsValid() ) { m_canvas->SetIgnoreMouseEvents( false ); m_canvas->MoveCursorToCrossHair(); return NULL; } m_canvas->SetIgnoreMouseEvents( false ); m_canvas->MoveCursorToCrossHair(); wxString libsource; // the library name to use. If empty, load from any lib if( aFilter ) libsource = aFilter->GetLibSource(); LIB_ID libId = sel.LibId; LIB_PART* part = GetLibPart( libId, true ); if( !part ) return NULL; SCH_COMPONENT* component = new SCH_COMPONENT( *part, libId, g_CurrentSheet, sel.Unit, sel.Convert, GetCrossHairPosition(), true ); // Be sure the link to the corresponding LIB_PART is OK: component->Resolve( *Prj().SchSymbolLibTable() ); // Set any fields that have been modified for( auto const& i : sel.Fields ) { auto field = component->GetField( i.first ); if( field ) field->SetText( i.second ); } MSG_PANEL_ITEMS items; component->GetMsgPanelInfo( m_UserUnits, items ); SetMsgPanel( items ); component->SetFlags( IS_NEW ); if( m_autoplaceFields ) component->AutoplaceFields( /* aScreen */ NULL, /* aManual */ false ); PrepareMoveItem( component ); return component; }
SCH_COMPONENT* SCH_EDIT_FRAME::Load_Component( wxDC* aDC, const SCHLIB_FILTER* aFilter, SCH_BASE_FRAME::HISTORY_LIST& aHistoryList, bool aUseLibBrowser ) { wxString msg; SetRepeatItem( NULL ); m_canvas->SetIgnoreMouseEvents( true ); auto sel = SelectComponentFromLibrary( aFilter, aHistoryList, aUseLibBrowser, 1, 1, m_footprintPreview ); if( !sel.LibId.IsValid() ) { m_canvas->SetIgnoreMouseEvents( false ); m_canvas->MoveCursorToCrossHair(); return NULL; } m_canvas->SetIgnoreMouseEvents( false ); m_canvas->MoveCursorToCrossHair(); wxString libsource; // the library name to use. If empty, load from any lib if( aFilter ) libsource = aFilter->GetLibSource(); LIB_ID libId = sel.LibId; LIB_PART* part = GetLibPart( libId, true ); if( !part ) return NULL; SCH_COMPONENT* component = new SCH_COMPONENT( *part, m_CurrentSheet, sel.Unit, sel.Convert, GetCrossHairPosition(), true ); // Set the m_ChipName value, from component name in lib, for aliases // Note if part is found, and if name is an alias of a component, // alias exists because its root component was found component->SetLibId( libId ); // Be sure the link to the corresponding LIB_PART is OK: component->Resolve( *Prj().SchSymbolLibTable() ); // Set any fields that have been modified for( auto const& i : sel.Fields ) { auto field = component->GetField( i.first ); if( field ) field->SetText( i.second ); } // Set the component value that can differ from component name in lib, for aliases component->GetField( VALUE )->SetText( sel.LibId.GetLibItemName() ); // If there is no field defined in the component, copy one over from the library // ( from the .dcm file ) // This way the Datasheet field will not be empty and can be changed from the schematic if( component->GetField( DATASHEET )->GetText().IsEmpty() ) { LIB_ALIAS* entry = GetLibAlias( component->GetLibId(), true, true ); if( entry && !!entry->GetDocFileName() ) component->GetField( DATASHEET )->SetText( entry->GetDocFileName() ); } MSG_PANEL_ITEMS items; component->SetCurrentSheetPath( &GetCurrentSheet() ); component->GetMsgPanelInfo( items ); SetMsgPanel( items ); component->Draw( m_canvas, aDC, wxPoint( 0, 0 ), g_XorMode ); component->SetFlags( IS_NEW ); if( m_autoplaceFields ) component->AutoplaceFields( /* aScreen */ NULL, /* aManual */ false ); PrepareMoveItem( (SCH_ITEM*) component, aDC ); return component; }