void DIALOG_ERC::DisplayERC_MarkersList() { SCH_SHEET_LIST sheetList; m_MarkersList->ClearList(); SCH_SHEET_PATH* sheet = sheetList.GetFirst(); for( ; sheet != NULL; sheet = sheetList.GetNext() ) { SCH_ITEM* item = sheet->LastDrawList(); for( ; item != NULL; item = item->Next() ) { if( item->Type() != SCH_MARKER_T ) continue; SCH_MARKER* Marker = (SCH_MARKER*) item; if( Marker->GetMarkerType() != MARKER_BASE::MARKER_ERC ) continue; // Add marker without refresh the displayed list: m_MarkersList->AppendToList( Marker, false ); } } m_MarkersList->Refresh(); }
void DIALOG_ERC::DisplayERC_MarkersList() { SCH_SHEET_LIST sheetList; m_MarkersList->ClearList(); SCH_SHEET_PATH* sheet = sheetList.GetFirst(); for( ; sheet != NULL; sheet = sheetList.GetNext() ) { SCH_ITEM* item = sheet->LastDrawList(); for( ; item != NULL; item = item->Next() ) { if( item->Type() != SCH_MARKER_T ) continue; SCH_MARKER* marker = (SCH_MARKER*) item; if( marker->GetMarkerType() != MARKER_BASE::MARKER_ERC ) continue; m_MarkersList->AppendToList( marker ); } } m_MarkersList->DisplayList(); }
void DIALOG_ERC::OnLeftClickMarkersList( wxHtmlLinkEvent& event ) { wxString link = event.GetLinkInfo().GetHref(); m_lastMarkerFound = NULL; long index; if( !link.ToLong( &index ) ) return; const SCH_MARKER* marker = m_MarkersList->GetItem( index ); if( marker == NULL ) return; // Search for the selected marker SCH_SHEET_PATH* sheet; SCH_SHEET_LIST SheetList; bool notFound = true; for( sheet = SheetList.GetFirst(); sheet; sheet = SheetList.GetNext() ) { SCH_ITEM* item = (SCH_ITEM*) sheet->LastDrawList(); for( ; item; item = item->Next() ) { if( item == marker ) { notFound = false; break; } } if( notFound == false ) break; } if( notFound ) // Error { wxMessageBox( _( "Marker not found" ) ); // The marker was deleted, so rebuild marker list DisplayERC_MarkersList(); return; } if( *sheet != m_parent->GetCurrentSheet() ) { sheet->LastScreen()->SetZoom( m_parent->GetScreen()->GetZoom() ); m_parent->SetCurrentSheet( *sheet ); m_parent->GetCurrentSheet().UpdateAllScreenReferences(); } m_lastMarkerFound = marker; m_parent->SetCrossHairPosition( marker->m_Pos ); m_parent->RedrawScreen( marker->m_Pos, false); }
bool WriteDiagnosticERC( const wxString& aFullFileName ) { wxString msg; wxFFile file( aFullFileName, wxT( "wt" ) ); if( !file.IsOpened() ) return false; msg = _( "ERC report" ); msg << wxT(" (") << DateAndTime() << wxT( ", " ) << _( "Encoding UTF8" ) << wxT( " )\n" ); int err_count = 0; int warn_count = 0; int total_count = 0; SCH_SHEET_LIST sheetList; SCH_SHEET_PATH* sheet; for( sheet = sheetList.GetFirst(); sheet != NULL; sheet = sheetList.GetNext() ) { msg << wxString::Format( _( "\n***** Sheet %s\n" ), GetChars( sheet->PathHumanReadable() ) ); for( SCH_ITEM* item = sheet->LastDrawList(); item != NULL; item = item->Next() ) { if( item->Type() != SCH_MARKER_T ) continue; SCH_MARKER* marker = (SCH_MARKER*) item; if( marker->GetMarkerType() != MARKER_BASE::MARKER_ERC ) continue; total_count++; if( marker->GetErrorLevel() == MARKER_BASE::MARKER_SEVERITY_ERROR ) err_count++; if( marker->GetErrorLevel() == MARKER_BASE::MARKER_SEVERITY_WARNING ) warn_count++; msg << marker->GetReporter().ShowReport(); } } msg << wxString::Format( _( "\n ** ERC messages: %d Errors %d Warnings %d\n" ), total_count, err_count, warn_count ); // Currently: write report unsing UTF8 (as usual in Kicad). // TODO: see if we can use the current encoding page (mainly for Windows users), // Or other format (HTML?) file.Write( msg ); // wxFFile dtor will close the file. return true; }
bool WriteDiagnosticERC( const wxString& aFullFileName ) { SCH_ITEM* item; SCH_MARKER* marker; static FILE* file; SCH_SHEET_PATH* sheet; wxString msg; int count = 0; if( ( file = wxFopen( aFullFileName, wxT( "wt" ) ) ) == NULL ) return false; msg = _( "ERC report" ); fprintf( file, "%s (%s)\n", TO_UTF8( msg ), TO_UTF8( DateAndTime() ) ); SCH_SHEET_LIST sheetList; for( sheet = sheetList.GetFirst(); sheet != NULL; sheet = sheetList.GetNext() ) { msg.Printf( _( "\n***** Sheet %s\n" ), GetChars( sheet->PathHumanReadable() ) ); fprintf( file, "%s", TO_UTF8( msg ) ); for( item = sheet->LastDrawList(); item != NULL; item = item->Next() ) { if( item->Type() != SCH_MARKER_T ) continue; marker = (SCH_MARKER*) item; if( marker->GetMarkerType() != MARK_ERC ) continue; if( marker->GetMarkerType() == ERR ) count++; msg = marker->GetReporter().ShowReport(); fprintf( file, "%s", TO_UTF8( msg ) ); } } msg.Printf( _( "\n >> Errors ERC: %d\n" ), count ); fprintf( file, "%s", TO_UTF8( msg ) ); fclose( file ); return true; }
SCH_ITEM* SCH_SHEET_LIST::FindNextItem( KICAD_T aType, SCH_SHEET_PATH** aSheetFoundIn, SCH_ITEM* aLastItem, bool aWrap ) { bool hasWrapped = false; bool firstItemFound = false; SCH_ITEM* drawItem = NULL; SCH_SHEET_PATH* sheet = GetFirst(); while( sheet ) { drawItem = sheet->LastDrawList(); while( drawItem ) { if( drawItem->Type() == aType ) { if( aLastItem == NULL || firstItemFound ) { if( aSheetFoundIn ) *aSheetFoundIn = sheet; return drawItem; } else if( !firstItemFound && drawItem == aLastItem ) { firstItemFound = true; } } drawItem = drawItem->Next(); } sheet = GetNext(); if( sheet == NULL && aLastItem && aWrap && !hasWrapped ) { hasWrapped = true; sheet = GetFirst(); } } return NULL; }
void NETLIST_EXPORTER::findAllInstancesOfComponent( SCH_COMPONENT* aComponent, LIB_PART* aEntry, SCH_SHEET_PATH* aSheetPath ) { wxString ref = aComponent->GetRef( aSheetPath ); wxString ref2; SCH_SHEET_LIST sheetList; for( SCH_SHEET_PATH* sheet = sheetList.GetFirst(); sheet; sheet = sheetList.GetNext() ) { for( EDA_ITEM* item = sheet->LastDrawList(); item; item = item->Next() ) { if( item->Type() != SCH_COMPONENT_T ) continue; SCH_COMPONENT* comp2 = (SCH_COMPONENT*) item; ref2 = comp2->GetRef( sheet ); if( ref2.CmpNoCase( ref ) != 0 ) continue; int unit2 = comp2->GetUnitSelection( sheet ); // slow for( LIB_PIN* pin = aEntry->GetNextPin(); pin; pin = aEntry->GetNextPin( pin ) ) { wxASSERT( pin->Type() == LIB_PIN_T ); if( pin->GetUnit() && pin->GetUnit() != unit2 ) continue; if( pin->GetConvert() && pin->GetConvert() != comp2->GetConvert() ) continue; // A suitable pin is found: add it to the current list addPinToComponentPinList( comp2, sheet, pin ); } } } }
bool NETLIST_EXPORTER_CADSTAR::Write( const wxString& aOutFileName, unsigned aNetlistOptions ) { (void)aNetlistOptions; //unused int ret = 0; FILE* f = NULL; if( ( f = wxFopen( aOutFileName, wxT( "wt" ) ) ) == NULL ) { wxString msg; msg.Printf( _( "Failed to create file '%s'" ), GetChars( aOutFileName ) ); DisplayError( NULL, msg ); return false; } wxString StartCmpDesc = StartLine + wxT( "ADD_COM" ); wxString msg; wxString footprint; SCH_SHEET_PATH* sheet; EDA_ITEM* DrawList; SCH_COMPONENT* component; wxString title = wxT( "Eeschema " ) + GetBuildVersion(); ret |= fprintf( f, "%sHEA\n", TO_UTF8( StartLine ) ); ret |= fprintf( f, "%sTIM %s\n", TO_UTF8( StartLine ), TO_UTF8( DateAndTime() ) ); ret |= fprintf( f, "%sAPP ", TO_UTF8( StartLine ) ); ret |= fprintf( f, "\"%s\"\n", TO_UTF8( title ) ); ret |= fprintf( f, "\n" ); // Prepare list of nets generation for( unsigned ii = 0; ii < m_masterList->size(); ii++ ) m_masterList->GetItem( ii )->m_Flag = 0; // Create netlist module section m_ReferencesAlreadyFound.Clear(); SCH_SHEET_LIST SheetList; for( sheet = SheetList.GetFirst(); sheet != NULL; sheet = SheetList.GetNext() ) { for( DrawList = sheet->LastDrawList(); DrawList != NULL; DrawList = DrawList->Next() ) { DrawList = component = findNextComponentAndCreatePinList( DrawList, sheet ); if( component == NULL ) break; /* doing nothing with footprint if( !component->GetField( FOOTPRINT )->IsVoid() ) { footprint = component->GetField( FOOTPRINT )->m_Text; footprint.Replace( wxT( " " ), wxT( "_" ) ); } else footprint = wxT( "$noname" ); */ msg = component->GetRef( sheet ); ret |= fprintf( f, "%s ", TO_UTF8( StartCmpDesc ) ); ret |= fprintf( f, "%s", TO_UTF8( msg ) ); msg = component->GetField( VALUE )->GetText(); msg.Replace( wxT( " " ), wxT( "_" ) ); ret |= fprintf( f, " \"%s\"", TO_UTF8( msg ) ); ret |= fprintf( f, "\n" ); } } ret |= fprintf( f, "\n" ); m_SortedComponentPinList.clear(); if( ! writeListOfNets( f ) ) ret = -1; // set error ret |= fprintf( f, "\n%sEND\n", TO_UTF8( StartLine ) ); fclose( f ); return ret >= 0; }
XNODE* NETLIST_EXPORTER_GENERIC::makeComponents() { XNODE* xcomps = node( wxT( "components" ) ); wxString timeStamp; // some strings we need many times, but don't want to construct more // than once for performance. These are used within loops so the // enclosing wxString constructor would fire on each loop iteration if // they were in a nested scope. // these are actually constructor invocations, not assignments as it appears: wxString sFields = wxT( "fields" ); wxString sField = wxT( "field" ); wxString sComponent = wxT( "comp" ); // use "part" ? wxString sName = wxT( "name" ); wxString sRef = wxT( "ref" ); wxString sPins = wxT( "pins" ); wxString sPin = wxT( "pin" ); wxString sValue = wxT( "value" ); wxString sSheetPath = wxT( "sheetpath" ); wxString sFootprint = wxT( "footprint" ); wxString sDatasheet = wxT( "datasheet" ); wxString sTStamp = wxT( "tstamp" ); wxString sTStamps = wxT( "tstamps" ); wxString sTSFmt = wxT( "%8.8lX" ); // comp->m_TimeStamp wxString sLibSource = wxT( "libsource" ); wxString sLibPart = wxT( "libpart" ); wxString sLib = wxT( "lib" ); wxString sPart = wxT( "part" ); wxString sNames = wxT( "names" ); m_ReferencesAlreadyFound.Clear(); SCH_SHEET_LIST sheetList; // Output is xml, so there is no reason to remove spaces from the field values. // And XML element names need not be translated to various languages. for( SCH_SHEET_PATH* path = sheetList.GetFirst(); path; path = sheetList.GetNext() ) { for( EDA_ITEM* schItem = path->LastDrawList(); schItem; schItem = schItem->Next() ) { SCH_COMPONENT* comp = findNextComponentAndCreatePinList( schItem, path ); if( !comp ) break; // No component left schItem = comp; XNODE* xcomp; // current component being constructed // Output the component's elements in order of expected access frequency. // This may not always look best, but it will allow faster execution // under XSL processing systems which do sequential searching within // an element. xcomps->AddChild( xcomp = node( sComponent ) ); xcomp->AddAttribute( sRef, comp->GetRef( path->Last() ) ); xcomp->AddChild( node( sValue, comp->GetField( VALUE )->GetText() ) ); if( !comp->GetField( FOOTPRINT )->IsVoid() ) xcomp->AddChild( node( sFootprint, comp->GetField( FOOTPRINT )->GetText() ) ); if( !comp->GetField( DATASHEET )->IsVoid() ) xcomp->AddChild( node( sDatasheet, comp->GetField( DATASHEET )->GetText() ) ); // Export all user defined fields within the component, // which start at field index MANDATORY_FIELDS. Only output the <fields> // container element if there are any <field>s. if( comp->GetFieldCount() > MANDATORY_FIELDS ) { XNODE* xfields; xcomp->AddChild( xfields = node( sFields ) ); for( int fldNdx = MANDATORY_FIELDS; fldNdx < comp->GetFieldCount(); ++fldNdx ) { SCH_FIELD* f = comp->GetField( fldNdx ); // only output a field if non empty and not just "~" if( !f->IsVoid() ) { XNODE* xfield; xfields->AddChild( xfield = node( sField, f->GetText() ) ); xfield->AddAttribute( sName, f->GetName() ); } } } XNODE* xlibsource; xcomp->AddChild( xlibsource = node( sLibSource ) ); // "logical" library name, which is in anticipation of a better search // algorithm for parts based on "logical_lib.part" and where logical_lib // is merely the library name minus path and extension. LIB_PART* part = m_libs->FindLibPart( comp->GetPartName() ); if( part ) xlibsource->AddAttribute( sLib, part->GetLib()->GetLogicalName() ); xlibsource->AddAttribute( sPart, comp->GetPartName() ); XNODE* xsheetpath; xcomp->AddChild( xsheetpath = node( sSheetPath ) ); xsheetpath->AddAttribute( sNames, path->PathHumanReadable() ); xsheetpath->AddAttribute( sTStamps, path->Path() ); timeStamp.Printf( sTSFmt, (unsigned long)comp->GetTimeStamp() ); xcomp->AddChild( node( sTStamp, timeStamp ) ); } } return xcomps; }
SCH_ITEM* SCH_EDIT_FRAME::FindComponentAndItem( const wxString& aReference, bool aSearchHierarchy, SCH_SEARCH_T aSearchType, const wxString& aSearchText, bool aWarpMouse ) { SCH_SHEET_PATH* sheet; SCH_SHEET_PATH* sheetWithComponentFound = NULL; SCH_ITEM* item = NULL; SCH_COMPONENT* Component = NULL; wxPoint pos, curpos; bool centerAndRedraw = false; bool notFound = true; wxString msg; LIB_PIN* pin; SCH_SHEET_LIST sheetList; sheet = sheetList.GetFirst(); if( !aSearchHierarchy ) sheet = m_CurrentSheet; for( ; sheet != NULL; sheet = sheetList.GetNext() ) { item = (SCH_ITEM*) sheet->LastDrawList(); for( ; ( item != NULL ) && ( notFound == true ); item = item->Next() ) { if( item->Type() != SCH_COMPONENT_T ) continue; SCH_COMPONENT* pSch = (SCH_COMPONENT*) item; if( aReference.CmpNoCase( pSch->GetRef( sheet ) ) == 0 ) { Component = pSch; sheetWithComponentFound = sheet; switch( aSearchType ) { default: case FIND_COMPONENT_ONLY: // Find component only notFound = false; pos = pSch->GetPosition(); break; case FIND_PIN: // find a pin pos = pSch->GetPosition(); // temporary: will be changed if the pin is found. pin = pSch->GetPin( aSearchText ); if( pin == NULL ) break; notFound = false; pos += pin->GetPosition(); break; case FIND_REFERENCE: // find reference notFound = false; pos = pSch->GetField( REFERENCE )->GetPosition(); break; case FIND_VALUE: // find value pos = pSch->GetPosition(); if( aSearchText.CmpNoCase( pSch->GetField( VALUE )->m_Text ) != 0 ) break; notFound = false; pos = pSch->GetField( VALUE )->GetPosition(); break; } } } if( (aSearchHierarchy == false) || (notFound == false) ) break; } if( Component ) { sheet = sheetWithComponentFound; if( *sheet != *m_CurrentSheet ) { sheet->LastScreen()->SetZoom( GetScreen()->GetZoom() ); *m_CurrentSheet = *sheet; m_CurrentSheet->UpdateAllScreenReferences(); centerAndRedraw = true; } wxPoint delta; pos -= Component->GetPosition(); delta = Component->GetTransform().TransformCoordinate( pos ); pos = delta + Component->GetPosition(); /* There may be need to reframe the drawing */ if( ! m_canvas->IsPointOnDisplay( pos ) ) { centerAndRedraw = true; } if( centerAndRedraw ) { GetScreen()->SetCrossHairPosition(pos); RedrawScreen( pos, aWarpMouse ); } else { INSTALL_UNBUFFERED_DC( dc, m_canvas ); m_canvas->CrossHairOff( &dc ); if( aWarpMouse ) m_canvas->MoveCursor( pos ); GetScreen()->SetCrossHairPosition(pos); m_canvas->CrossHairOn( &dc ); } } /* Print diag */ wxString msg_item; msg = aReference; switch( aSearchType ) { default: case FIND_COMPONENT_ONLY: // Find component only break; case FIND_PIN: // find a pin msg_item = _( "Pin " ) + aSearchText; break; case FIND_REFERENCE: // find reference msg_item = _( "Ref " ) + aSearchText; break; case FIND_VALUE: // find value msg_item = _( "Value " ) + aSearchText; break; case FIND_FIELD: // find field. todo msg_item = _( "Field " ) + aSearchText; break; } if( Component ) { if( !notFound ) { if( !msg_item.IsEmpty() ) msg += wxT( " " ) + msg_item; msg += _( " found" ); } else { msg += _( " found" ); if( !msg_item.IsEmpty() ) { msg += wxT( " but " ) + msg_item + _( " not found" ); } } } else { if( !msg_item.IsEmpty() ) msg += wxT( " " ) + msg_item; msg += _( " not found" ); } SetStatusText( msg ); return item; }