int SCH_SCREENS::GetMarkerCount( int aMarkerType ) { SCH_ITEM* item; SCH_ITEM* nextItem; SCH_MARKER* marker; SCH_SCREEN* screen; int count = 0; for( screen = GetFirst(); screen; screen = GetNext() ) { for( item = screen->GetDrawItems(); item; item = nextItem ) { nextItem = item->Next(); if( item->Type() != SCH_MARKER_T ) continue; marker = (SCH_MARKER*) item; if( (aMarkerType != -1) && (marker->GetMarkerType() != aMarkerType) ) continue; count++; } } return count; }
void SCH_SCREENS::BuildScreenList( EDA_ITEM* aItem ) { if( aItem && aItem->Type() == SCH_SHEET_T ) { SCH_SHEET* ds = (SCH_SHEET*) aItem; aItem = ds->GetScreen(); } if( aItem && aItem->Type() == SCH_SCREEN_T ) { SCH_SCREEN* screen = (SCH_SCREEN*) aItem; // Ensure each component has its pointer to its part lib LIB_PART // up to date (the cost is low if this is the case) // We do this update here, because most of time this function is called // to create a netlist, or an ERC, which need this update screen->BuildSchCmpLinksToLibCmp(); AddScreenToList( screen ); EDA_ITEM* strct = screen->GetDrawItems(); while( strct ) { if( strct->Type() == SCH_SHEET_T ) { BuildScreenList( strct ); } strct = strct->Next(); } } }
void SCH_SCREENS::DeleteAllMarkers( int aMarkerType ) { SCH_ITEM* item; SCH_ITEM* nextItem; SCH_MARKER* marker; SCH_SCREEN* screen; for( screen = GetFirst(); screen; screen = GetNext() ) { for( item = screen->GetDrawItems(); item; item = nextItem ) { nextItem = item->Next(); if( item->Type() != SCH_MARKER_T ) continue; marker = (SCH_MARKER*) item; if( marker->GetMarkerType() != aMarkerType ) continue; screen->DeleteItem( marker ); } } }
size_t SCH_SCREENS::GetLibNicknames( wxArrayString& aLibNicknames ) { SCH_COMPONENT* symbol; SCH_ITEM* item; SCH_ITEM* nextItem; SCH_SCREEN* screen; wxString nickname; for( screen = GetFirst(); screen; screen = GetNext() ) { for( item = screen->GetDrawItems(); item; item = nextItem ) { nextItem = item->Next(); if( item->Type() != SCH_COMPONENT_T ) continue; symbol = dynamic_cast< SCH_COMPONENT* >( item ); wxASSERT( symbol ); nickname = symbol->GetLibId().GetLibNickname(); if( !nickname.empty() && ( aLibNicknames.Index( nickname ) == wxNOT_FOUND ) ) aLibNicknames.Add( nickname );; } } return aLibNicknames.GetCount(); }
void SCH_SCREENS::BuildScreenList( EDA_ITEM* aItem ) { if( aItem && aItem->Type() == SCH_SHEET_T ) { SCH_SHEET* ds = (SCH_SHEET*) aItem; aItem = ds->GetScreen(); } if( aItem && aItem->Type() == SCH_SCREEN_T ) { SCH_SCREEN* screen = (SCH_SCREEN*) aItem; AddScreenToList( screen ); EDA_ITEM* strct = screen->GetDrawItems(); while( strct ) { if( strct->Type() == SCH_SHEET_T ) { BuildScreenList( strct ); } strct = strct->Next(); } } }
int SCH_SCREENS::ChangeSymbolLibNickname( const wxString& aFrom, const wxString& aTo ) { SCH_COMPONENT* symbol; SCH_ITEM* item; SCH_ITEM* nextItem; SCH_SCREEN* screen; int cnt = 0; for( screen = GetFirst(); screen; screen = GetNext() ) { for( item = screen->GetDrawItems(); item; item = nextItem ) { nextItem = item->Next(); if( item->Type() != SCH_COMPONENT_T ) continue; symbol = dynamic_cast< SCH_COMPONENT* >( item ); wxASSERT( symbol ); if( symbol->GetLibId().GetLibNickname() != aFrom ) continue; LIB_ID id = symbol->GetLibId(); id.SetLibNickname( aTo ); symbol->SetLibId( id ); cnt++; } } return cnt; }
bool SCH_SCREENS::HasNoFullyDefinedLibIds() { SCH_COMPONENT* symbol; SCH_ITEM* item; SCH_ITEM* nextItem; SCH_SCREEN* screen; unsigned cnt = 0; for( screen = GetFirst(); screen; screen = GetNext() ) { for( item = screen->GetDrawItems(); item; item = nextItem ) { nextItem = item->Next(); if( item->Type() != SCH_COMPONENT_T ) continue; cnt += 1; symbol = dynamic_cast< SCH_COMPONENT* >( item ); wxASSERT( symbol ); if( !symbol->GetLibId().GetLibNickname().empty() ) return false; } } if( cnt == 0 ) return false; return true; }
int SCH_SCREENS::GetMarkerCount( enum MARKER_BASE::TYPEMARKER aMarkerType, enum MARKER_BASE::MARKER_SEVERITY aSeverity ) { int count = 0; for( SCH_SCREEN* screen = GetFirst(); screen; screen = GetNext() ) { for( SCH_ITEM* item = screen->GetDrawItems(); item; item = item->Next() ) { if( item->Type() != SCH_MARKER_T ) continue; SCH_MARKER* marker = (SCH_MARKER*) item; if( ( aMarkerType != MARKER_BASE::MARKER_UNSPEC ) && ( marker->GetMarkerType() != aMarkerType ) ) continue; if( aSeverity == MARKER_BASE::MARKER_SEVERITY_UNSPEC || aSeverity == marker->GetErrorLevel() ) count++; } } return count; }
/** * Function get_components * Fills a vector with all of the project's components, to ease iterating over them. * * @param aComponents - a vector that will take the components */ static void get_components( std::vector<SCH_COMPONENT*>& aComponents ) { SCH_SCREENS screens; for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() ) { for( SCH_ITEM* item = screen->GetDrawItems(); item; item = item->Next() ) { if( item->Type() != SCH_COMPONENT_T ) continue; SCH_COMPONENT* component = dynamic_cast<SCH_COMPONENT*>( item ); aComponents.push_back( component ); } } }
int TestDuplicateSheetNames( bool aCreateMarker ) { SCH_SCREEN* screen; SCH_ITEM* item; SCH_ITEM* test_item; int err_count = 0; SCH_SCREENS screenList; // Created the list of screen for( screen = screenList.GetFirst(); screen != NULL; screen = screenList.GetNext() ) { for( item = screen->GetDrawItems(); item != NULL; item = item->Next() ) { // search for a sheet; if( item->Type() != SCH_SHEET_T ) continue; for( test_item = item->Next(); test_item != NULL; test_item = test_item->Next() ) { if( test_item->Type() != SCH_SHEET_T ) continue; // We have found a second sheet: compare names // we are using case insensitive comparison to avoid mistakes between // similar names like Mysheet and mysheet if( ( (SCH_SHEET*) item )->GetName().CmpNoCase( ( ( SCH_SHEET* ) test_item )->GetName() ) == 0 ) { if( aCreateMarker ) { /* Create a new marker type ERC error*/ SCH_MARKER* marker = new SCH_MARKER(); marker->SetTimeStamp( GetNewTimeStamp() ); marker->SetData( ERCE_DUPLICATE_SHEET_NAME, ( (SCH_SHEET*) test_item )->GetPosition(), _( "Duplicate sheet name" ), ( (SCH_SHEET*) test_item )->GetPosition() ); marker->SetMarkerType( MARKER_BASE::MARKER_ERC ); marker->SetErrorLevel( MARKER_BASE::MARKER_SEVERITY_ERROR ); screen->Append( marker ); } err_count++; } } } } return err_count; }
void SCH_SCREENS::buildScreenList( SCH_SHEET* aSheet ) { if( aSheet && aSheet->Type() == SCH_SHEET_T ) { SCH_SCREEN* screen = aSheet->GetScreen(); addScreenToList( screen ); EDA_ITEM* strct = screen->GetDrawItems(); while( strct ) { if( strct->Type() == SCH_SHEET_T ) { buildScreenList( ( SCH_SHEET* )strct ); } strct = strct->Next(); } } }
void DIALOG_SYMBOL_REMAP::remapSymbolsToLibTable( REPORTER& aReporter ) { wxString msg; SCH_SCREENS schematic; SCH_COMPONENT* symbol; SCH_ITEM* item; SCH_ITEM* nextItem; SCH_SCREEN* screen; for( screen = schematic.GetFirst(); screen; screen = schematic.GetNext() ) { for( item = screen->GetDrawItems(); item; item = nextItem ) { nextItem = item->Next(); if( item->Type() != SCH_COMPONENT_T ) continue; symbol = dynamic_cast< SCH_COMPONENT* >( item ); if( !remapSymbolToLibTable( symbol ) ) { msg.Printf( _( "No symbol \"%s\" found in symbol library table." ), symbol->GetLibId().GetLibItemName().wx_str() ); aReporter.Report( msg, REPORTER::RPT_WARNING ); } else { msg.Printf( _( "Symbol \"%s\" mapped to symbol library \"%s\"." ), symbol->GetLibId().GetLibItemName().wx_str(), symbol->GetLibId().GetLibNickname().wx_str() ); aReporter.Report( msg, REPORTER::RPT_ACTION ); screen->SetModify(); } } } aReporter.Report( _( "Symbol library table mapping complete!" ), REPORTER::RPT_INFO ); schematic.UpdateSymbolLinks( true ); }
bool SCH_EDIT_FRAME::AppendOneEEProject() { SCH_SCREEN* screen; wxString FullFileName; wxString msg; screen = GetScreen(); if( !screen ) { wxLogError( wxT("Document not ready, cannot import") ); return false; } // open file chooser dialog wxFileDialog dlg( this, _( "Import Schematic" ), wxGetCwd(), wxEmptyString, SchematicFileWildcard, wxFD_OPEN | wxFD_FILE_MUST_EXIST ); if( dlg.ShowModal() == wxID_CANCEL ) return false; FullFileName = dlg.GetPath(); wxFileName fn = FullFileName; if( fn.IsRelative() ) { fn.MakeAbsolute(); FullFileName = fn.GetFullPath(); } LoadCacheLibrary( FullFileName ); wxLogDebug( wxT( "Importing schematic " ) + FullFileName ); // load the project bool success = LoadOneEEFile( screen, FullFileName, true ); if( success ) { // load sub-sheets EDA_ITEM* bs = screen->GetDrawItems(); while( bs ) { // do not append hierarchical sheets if( bs->Type() == SCH_SHEET_T ) { screen->Remove( (SCH_SHEET*) bs ); } // clear annotation and init new time stamp for the new components else if( bs->Type() == SCH_COMPONENT_T ) { ( (SCH_COMPONENT*) bs )->SetTimeStamp( GetNewTimeStamp() ); ( (SCH_COMPONENT*) bs )->ClearAnnotation( NULL ); // Clear flags, which are set by these previous modifications: bs->ClearFlags(); } bs = bs->Next(); } } // redraw base screen (ROOT) if necessary GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId ); Zoom_Automatique( false ); SetSheetNumberAndCount(); m_canvas->Refresh( true ); return success; }
bool SCH_EDIT_FRAME::CreateArchiveLibrary( const wxString& aFileName ) { SCH_SCREENS screens; PART_LIBS* libs = Prj().SchLibs(); std::unique_ptr<PART_LIB> libCache( new PART_LIB( LIBRARY_TYPE_EESCHEMA, aFileName ) ); libCache->SetCache(); /* examine all screens (not sheets) used and build the list of components * found in lib. * Complex hierarchies are not a problem because we just want * to know used components in libraries */ for( SCH_SCREEN* screen = screens.GetFirst(); screen; screen = screens.GetNext() ) { for( SCH_ITEM* item = screen->GetDrawItems(); item; item = item->Next() ) { if( item->Type() != SCH_COMPONENT_T ) continue; SCH_COMPONENT* component = (SCH_COMPONENT*) item; // If not already saved in the new cache, put it: if( !libCache->FindEntry( component->GetPartName() ) ) { if( LIB_PART* part = libs->FindLibPart( component->GetPartName() ) ) { // AddPart() does first clone the part before adding. libCache->AddPart( part ); } } } } try { FILE_OUTPUTFORMATTER formatter( aFileName ); if( !libCache->Save( formatter ) ) { wxString msg = wxString::Format( _( "An error occurred attempting to save component library '%s'." ), GetChars( aFileName ) ); DisplayError( this, msg ); return false; } } catch( ... /* IO_ERROR ioe */ ) { wxString msg = wxString::Format( _( "Failed to create component library file '%s'" ), GetChars( aFileName ) ); DisplayError( this, msg ); return false; } return true; }
/* * OnConvertTextType is a command event handler to change a text type to an other one. * The new text, label, hierarchical label, or global label is created from the old text * The old text is deleted. * A tricky case is when the 'old" text is being edited (i.e. moving) * because we must create a new text, and prepare the undo/redo command data for this * change and the current move/edit command */ void SCH_EDIT_FRAME::OnConvertTextType( wxCommandEvent& aEvent ) { SCH_SCREEN* screen = GetScreen(); SCH_TEXT* text = (SCH_TEXT*) screen->GetCurItem(); wxCHECK_RET( (text != NULL) && text->CanIncrementLabel(), wxT( "Cannot convert text type." ) ); KICAD_T type; switch( aEvent.GetId() ) { case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_LABEL: type = SCH_LABEL_T; break; case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_GLABEL: type = SCH_GLOBAL_LABEL_T; break; case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_HLABEL: type = SCH_HIERARCHICAL_LABEL_T; break; case ID_POPUP_SCH_CHANGE_TYPE_TEXT_TO_COMMENT: type = SCH_TEXT_T; break; default: wxFAIL_MSG( wxString::Format( wxT( "Invalid text type command ID %d." ), aEvent.GetId() ) ); return; } if( text->Type() == type ) return; SCH_TEXT* newtext; const wxPoint &position = text->GetPosition(); const wxString &txt = text->GetText(); switch( type ) { case SCH_LABEL_T: newtext = new SCH_LABEL( position, txt ); break; case SCH_GLOBAL_LABEL_T: newtext = new SCH_GLOBALLABEL( position, txt ); break; case SCH_HIERARCHICAL_LABEL_T: newtext = new SCH_HIERLABEL( position, txt ); break; case SCH_TEXT_T: newtext = new SCH_TEXT( position, txt ); break; default: newtext = NULL; wxFAIL_MSG( wxString::Format( wxT( "Cannot convert text type to %d" ), type ) ); return; } /* Copy the old text item settings to the new one. Justifications are not copied because * they are not used in labels. Justifications will be set to default value in the new * text item type. */ newtext->SetFlags( text->GetFlags() ); newtext->SetShape( text->GetShape() ); newtext->SetOrientation( text->GetOrientation() ); newtext->SetSize( text->GetSize() ); newtext->SetThickness( text->GetThickness() ); newtext->SetItalic( text->IsItalic() ); newtext->SetBold( text->IsBold() ); /* Save the new text in undo list if the old text was not itself a "new created text" * In this case, the old text is already in undo list as a deleted item. * Of course if the old text was a "new created text" the new text will be * put in undo list later, at the end of the current command (if not aborted) */ INSTALL_UNBUFFERED_DC( dc, m_canvas ); m_canvas->CrossHairOff( &dc ); // Erase schematic cursor text->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode ); // For an exiting item (i.e. already in list): // replace the existing item by the new text in list for( SCH_ITEM* item = screen->GetDrawItems(); item != NULL; item = item->Next() ) { if( item == text ) { screen->Remove( text ); screen->Append( newtext ); break; } } SetRepeatItem( NULL ); OnModify(); newtext->Draw( m_canvas, &dc, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE ); m_canvas->CrossHairOn( &dc ); // redraw schematic cursor // if the old item is the current schematic item, replace it by the new text: if( screen->GetCurItem() == text ) screen->SetCurItem( newtext ); if( text->IsNew() ) { // if the previous text is new, no undo command to prepare here // just delete this previous text. delete text; return; } // previous text is not new and we replace text by new text. // So this is equivalent to delete text and add newtext // If text if being currently edited (i.e. moved) // we also save the initial copy of text, and prepare undo command for new text modifications. // we must save it as modified text,if it is currently edited, then save as deleted text, // and replace text with newtext PICKED_ITEMS_LIST pickList; ITEM_PICKER picker( text, UR_CHANGED ); if( text->GetFlags() ) { // text is being edited, save initial text for undo command picker.SetLink( GetUndoItem() ); pickList.PushItem( picker ); // the owner of undoItem is no more "this", it is now "picker": SetUndoItem( NULL ); // save current newtext copy for undo/abort current command SetUndoItem( newtext ); } // Prepare undo command for delete old text picker.SetStatus( UR_DELETED ); picker.SetLink( NULL ); pickList.PushItem( picker ); // Prepare undo command for new text picker.SetStatus( UR_NEW ); picker.SetItem(newtext); pickList.PushItem( picker ); SaveCopyInUndoList( pickList, UR_UNSPECIFIED ); }