bool SCH_FIELD::Replace( wxFindReplaceData& aSearchData, void* aAuxData ) { bool isReplaced; wxString text = GetFullyQualifiedText(); if( m_id == REFERENCE ) { wxCHECK_MSG( aAuxData != NULL, false, wxT( "Cannot replace reference designator without valid sheet path." ) ); wxCHECK_MSG( aSearchData.GetFlags() & FR_REPLACE_REFERENCES, false, wxT( "Invalid replace component reference field call." ) ) ; SCH_COMPONENT* component = (SCH_COMPONENT*) m_Parent; wxCHECK_MSG( component != NULL, false, wxT( "No component associated with field" ) + text ); text = component->GetRef( (SCH_SHEET_PATH*) aAuxData ); // if( component->GetUnitCount() > 1 ) // text << LIB_PART::SubReference( component->GetUnit() ); isReplaced = EDA_ITEM::Replace( aSearchData, text ); if( isReplaced ) component->SetRef( ((SCH_SHEET_PATH*) aAuxData)->Last(), text ); } else { isReplaced = EDA_ITEM::Replace( aSearchData, m_Text ); } return isReplaced; }
void SCH_SHEET_PATH::GetComponents( PART_LIBS* aLibs, SCH_REFERENCE_LIST& aReferences, bool aIncludePowerSymbols ) { // Search to sheet path number: int sheetnumber = 1; // 1 = root SCH_SHEET_LIST sheetList; for( SCH_SHEET_PATH* path = sheetList.GetFirst(); path; path = sheetList.GetNext(), sheetnumber++ ) { if( Cmp( *path ) == 0 ) break; } for( SCH_ITEM* item = LastDrawList(); item; item = item->Next() ) { if( item->Type() == SCH_COMPONENT_T ) { SCH_COMPONENT* component = (SCH_COMPONENT*) item; // Skip pseudo components, which have a reference starting with #. This mainly // affects power symbols. if( !aIncludePowerSymbols && component->GetRef( this )[0] == wxT( '#' ) ) continue; LIB_PART* part = aLibs->FindLibPart( component->GetPartName() ); if( part ) { SCH_REFERENCE reference = SCH_REFERENCE( component, part, *this ); reference.SetSheetNumber( sheetnumber ); aReferences.AddItem( reference ); } } } }
bool SCH_FIELD::Replace( wxFindReplaceData& aSearchData, void* aAuxData ) { bool isReplaced; wxString text = GetText(); if( m_id == REFERENCE && aAuxData != NULL ) { wxCHECK_MSG( aSearchData.GetFlags() & FR_REPLACE_REFERENCES, false, wxT( "Invalid replace component reference field call." ) ) ; SCH_COMPONENT* component = (SCH_COMPONENT*) m_Parent; wxCHECK_MSG( component != NULL, false, wxT( "No component associated with field" ) + text ); text = component->GetRef( (SCH_SHEET_PATH*) aAuxData ); if( component->GetPartCount() > 1 ) text << LIB_COMPONENT::ReturnSubReference( component->GetUnit() ); isReplaced = EDA_ITEM::Replace( aSearchData, text ); if( isReplaced ) component->SetRef( (SCH_SHEET_PATH*) aAuxData, text ); } else { isReplaced = EDA_ITEM::Replace( aSearchData, m_Text ); } return isReplaced; }
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 SCH_EDIT_FRAME::OrientComponent( COMPONENT_ORIENTATION_T aOrientation ) { SCH_SCREEN* screen = GetScreen(); SCH_ITEM* item = screen->GetCurItem(); wxCHECK_RET( item != NULL && item->Type() == SCH_COMPONENT_T, wxT( "Cannot change orientation of invalid schematic item." ) ); SCH_COMPONENT* component = (SCH_COMPONENT*) item; m_canvas->MoveCursorToCrossHair(); if( item->GetFlags() == 0 ) SetUndoItem( item ); INSTALL_UNBUFFERED_DC( dc, m_canvas ); component->SetOrientation( aOrientation ); m_canvas->CrossHairOn( &dc ); if( item->GetFlags() == 0 ) { addCurrentItemToList(); SchematicCleanUp( true ); } if( GetScreen()->TestDanglingEnds() ) m_canvas->Refresh(); OnModify(); }
void SCH_SHEET_PATH::AnnotatePowerSymbols( PART_LIBS* aLibs, int* aReference ) { int ref = 1; if( aReference ) ref = *aReference; for( EDA_ITEM* item = LastDrawList(); item; item = item->Next() ) { if( item->Type() != SCH_COMPONENT_T ) continue; SCH_COMPONENT* component = (SCH_COMPONENT*) item; LIB_PART* part = aLibs->FindLibPart( component->GetPartName() ); if( !part || !part->IsPower() ) continue; wxString refstr = component->GetPrefix(); //str will be "C?" or so after the ClearAnnotation call. while( refstr.Last() == '?' ) refstr.RemoveLast(); if( !refstr.StartsWith( wxT( "#" ) ) ) refstr = wxT( "#" ) + refstr; refstr << wxT( "0" ) << ref; component->SetRef( this, refstr ); ref++; } if( aReference ) *aReference = ref; }
EDA_RECT SCH_FIELD::GetBoundingBox() const { SCH_COMPONENT* parentComponent = (SCH_COMPONENT*) m_Parent; int linewidth = ( m_Thickness == 0 ) ? GetDefaultLineThickness() : m_Thickness; // We must pass the effective text thickness to GetTextBox // when calculating the bounding box linewidth = Clamp_Text_PenSize( linewidth, m_Size, m_Bold ); // Calculate the text bounding box: EDA_RECT rect; // set USE_TEXT_JUSTIFY_INITIAL_BEHAVIOR to 0 to use // a justification relative to the text itself // i.e. justification relative to an horizontal text // or to 1 to keep the initial behavior #if (USE_TEXT_JUSTIFY_INITIAL_BEHAVIOR == 1 ) if( m_Orient == TEXT_ORIENT_VERT ) { // For vertical texts, exchange the horizontal and the vertical justification // The idea is to keep the justification always left or top for instance, // no matter the text orientation SCH_FIELD text( *this ); // Make a local copy to swap justifications // because GetBoundingBox() is const int tmp = (int)text.m_VJustify; NEGATE( tmp ); text.m_VJustify = (EDA_TEXT_VJUSTIFY_T)text.m_HJustify; text.m_HJustify = (EDA_TEXT_HJUSTIFY_T)tmp; rect = text.GetTextBox( -1, linewidth ); } else #endif rect = GetTextBox( -1, linewidth ); // Calculate the bounding box position relative to the component: wxPoint origin = parentComponent->GetPosition(); wxPoint pos = m_Pos - origin; wxPoint begin = rect.GetOrigin() - origin; wxPoint end = rect.GetEnd() - origin; RotatePoint( &begin, pos, m_Orient ); RotatePoint( &end, pos, m_Orient ); // Due to the Y axis direction, we must mirror the bounding box, // relative to the text position: begin.y -= pos.y; end.y -= pos.y; NEGATE( begin.y ); NEGATE( end.y ); begin.y += pos.y; end.y += pos.y; // Now, apply the component transform (mirror/rot) begin = parentComponent->GetTransform().TransformCoordinate( begin ); end = parentComponent->GetTransform().TransformCoordinate( end ); rect.SetOrigin( begin); rect.SetEnd( end); rect.Move( origin ); rect.Normalize(); return rect; }
/** * return the short net name of the item i.e. the net name * from the "best" label without any prefix. * 2 different nets can have the same short name */ wxString NETLIST_OBJECT::GetShortNetName( bool adoptTimestamp ) const { if( m_netNameCandidate == NULL ) return wxEmptyString; wxString netName; if( m_netNameCandidate->m_Type == NET_PIN ) { SCH_COMPONENT* link = m_netNameCandidate->GetComponentParent(); if( link ) // Should be always true { netName = wxT("Net-("); netName << link->GetRef( &m_netNameCandidate->m_SheetPath ); if( adoptTimestamp && netName.Last() == '?' ) netName << link->GetTimeStamp(); netName << wxT("-Pad") << m_netNameCandidate->m_PinNum << wxT(")"); } } else netName = m_netNameCandidate->m_Label; return netName; }
SEARCH_RESULT SCH_FIND_COLLECTOR::Inspect( EDA_ITEM* aItem, const void* aTestData ) { wxPoint position; if( aItem->Matches( m_findReplaceData, m_sheetPath, &position ) ) { if( aItem->Type() == LIB_PIN_T ) { wxCHECK_MSG( aTestData && ( (EDA_ITEM*) aTestData )->Type() == SCH_COMPONENT_T, SEARCH_CONTINUE, wxT( "Cannot inspect invalid data. Bad programmer!" ) ); // Pin positions are relative to their parent component's position and // orientation in the schematic. The pin's position must be converted // schematic coordinates. SCH_COMPONENT* component = (SCH_COMPONENT*) aTestData; TRANSFORM transform = component->GetTransform(); position.y = -position.y; position = transform.TransformCoordinate( position ) + component->GetPosition(); } Append( aItem ); m_data.push_back( SCH_FIND_COLLECTOR_DATA( position, m_sheetPath->PathHumanReadable(), (SCH_ITEM*) aTestData ) ); } return SEARCH_CONTINUE; }
SEARCH_RESULT SCH_COLLECTOR::Inspect( EDA_ITEM* aItem, const void* aTestData ) { if( aItem->Type() != LIB_PIN_T && !aItem->HitTest( m_RefPos ) ) return SEARCH_CONTINUE; // Pins have special hit testing requirements that are relative to their parent // SCH_COMPONENT item. if( aItem->Type() == LIB_PIN_T ) { wxCHECK_MSG( aTestData && ( (EDA_ITEM*) aTestData )->Type() == SCH_COMPONENT_T, SEARCH_CONTINUE, wxT( "Cannot inspect invalid data. Bad programmer!" ) ); // Pin hit testing is relative to the components position and orientation in the // schematic. The hit test position must be converted to library coordinates. SCH_COMPONENT* component = (SCH_COMPONENT*) aTestData; TRANSFORM transform = component->GetTransform().InverseTransform(); wxPoint position = transform.TransformCoordinate( m_RefPos - component->GetPosition() ); position.y *= -1; // Y axis polarity in schematic is inverted from library. if( !aItem->HitTest( position ) ) return SEARCH_CONTINUE; } Append( aItem ); return SEARCH_CONTINUE; }
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; }
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(); }
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; }
void SCH_EDIT_FRAME::OrientComponent( COMPONENT_ORIENTATION_T aOrientation ) { SCH_SCREEN* screen = GetScreen(); SCH_ITEM* item = screen->GetCurItem(); SCH_COMPONENT* component = (SCH_COMPONENT*) item; GetCanvas()->MoveCursorToCrossHair(); if( item->GetFlags() == 0 ) SetUndoItem( item ); component->SetOrientation( aOrientation ); m_canvas->CrossHairOn( ); if( item->GetFlags() == 0 ) { addCurrentItemToScreen(); SchematicCleanUp(); } TestDanglingEnds(); RefreshItem( item ); if( item->GetFlags() == 0 ) OnModify(); }
int SCH_SHEET::ComponentCount() { int n = 0; if( m_screen ) { EDA_ITEM* bs; for( bs = m_screen->GetDrawItems(); bs != NULL; bs = bs->Next() ) { if( bs->Type() == SCH_COMPONENT_T ) { SCH_COMPONENT* Cmp = (SCH_COMPONENT*) bs; if( Cmp->GetField( VALUE )->GetText().GetChar( 0 ) != '#' ) n++; } if( bs->Type() == SCH_SHEET_T ) { SCH_SHEET* sheet = (SCH_SHEET*) bs; n += sheet->ComponentCount(); } } } return n; }
void SCH_FIELD::Plot( PLOTTER* aPlotter ) { SCH_COMPONENT* parent = ( SCH_COMPONENT* ) GetParent(); wxCHECK_RET( parent != NULL && parent->Type() == SCH_COMPONENT_T, wxT( "Cannot plot field with invalid parent." ) ); EDA_COLOR_T color = ReturnLayerColor( GetLayer() ); if( m_Attributs & TEXT_NO_VISIBLE ) return; if( IsVoid() ) return; /* Calculate the text orientation, according to the component * orientation/mirror */ int orient = m_Orient; if( parent->GetTransform().y1 ) // Rotate component 90 deg. { if( orient == TEXT_ORIENT_HORIZ ) orient = TEXT_ORIENT_VERT; else orient = TEXT_ORIENT_HORIZ; } /* Calculate the text justification, according to the component * orientation/mirror * this is a bit complicated due to cumulative calculations: * - numerous cases (mirrored or not, rotation) * - the DrawGraphicText function recalculate also H and H justifications * according to the text orientation. * - When a component is mirrored, the text is not mirrored and * justifications are complicated to calculate * so the more easily way is to use no justifications ( Centered text ) * and use GetBoundaryBox to know the text coordinate considered as centered */ EDA_RECT BoundaryBox = GetBoundingBox(); EDA_TEXT_HJUSTIFY_T hjustify = GR_TEXT_HJUSTIFY_CENTER; EDA_TEXT_VJUSTIFY_T vjustify = GR_TEXT_VJUSTIFY_CENTER; wxPoint textpos = BoundaryBox.Centre(); int thickness = GetPenSize(); if( (parent->GetPartCount() <= 1) || (m_id != REFERENCE) ) { aPlotter->Text( textpos, color, m_Text, orient, m_Size, hjustify, vjustify, thickness, m_Italic, m_Bold ); } else /* We plot the reference, for a multiple parts per package */ { /* Adding A, B ... to the reference */ wxString Text = m_Text + LIB_COMPONENT::ReturnSubReference( parent->GetUnit() ); aPlotter->Text( textpos, color, Text, orient, m_Size, hjustify, vjustify, thickness, m_Italic, m_Bold ); } }
wxPoint SCH_FIELD::GetPosition() const { SCH_COMPONENT* component = (SCH_COMPONENT*) GetParent(); wxPoint pos = GetTextPos() - component->GetPosition(); return component->GetTransform().TransformCoordinate( pos ) + component->GetPosition(); }
void SCH_EDIT_FRAME::PrepareMoveItem( SCH_ITEM* aItem, wxDC* aDC ) { wxCHECK_RET( aItem != NULL, wxT( "Cannot move invalid schematic item" ) ); SetRepeatItem( NULL ); if( !aItem->IsNew() ) { if( (aItem->Type() == SCH_SHEET_PIN_T) || (aItem->Type() == SCH_FIELD_T) ) SetUndoItem( (SCH_ITEM*) aItem->GetParent() ); else SetUndoItem( aItem ); } if( aItem->Type() == SCH_FIELD_T && aItem->GetParent()->Type() == SCH_COMPONENT_T ) { // Now that we're moving a field, they're no longer autoplaced. SCH_COMPONENT *parent = static_cast<SCH_COMPONENT*>( aItem->GetParent() ); parent->ClearFieldsAutoplaced(); } aItem->SetFlags( IS_MOVED ); // For some items, moving the cursor to anchor is not good // (for instance large hierarchical sheets od componants can have // the anchor position outside the canvas) // these items return IsMovableFromAnchorPoint() == false // For these items, do not wrap the cursor if( aItem->IsMovableFromAnchorPoint() ) { SetCrossHairPosition( aItem->GetPosition() ); m_canvas->MoveCursorToCrossHair(); aItem->SetStoredPos( wxPoint( 0,0 ) ); } else { // Round the point under the cursor to a multiple of the grid wxPoint cursorpos = GetCrossHairPosition() - aItem->GetPosition(); wxPoint gridsize = GetScreen()->GetGridSize(); cursorpos.x = ( cursorpos.x / gridsize.x ) * gridsize.x; cursorpos.y = ( cursorpos.y / gridsize.y ) * gridsize.y; aItem->SetStoredPos( cursorpos ); } OnModify(); GetScreen()->SetCurItem( aItem ); m_canvas->SetMouseCapture( moveItemWithMouseCursor, abortMoveItem ); m_canvas->Refresh(); }
void SCH_FIELD::SetPosition( const wxPoint& aPosition ) { SCH_COMPONENT* component = (SCH_COMPONENT*) GetParent(); wxPoint pos = ( (SCH_COMPONENT*) GetParent() )->GetPosition(); // Actual positions are calculated by the rotation/mirror transform of the // parent component of the field. The inverse transfrom is used to calculate // the position relative to the parent component. wxPoint pt = aPosition - pos; m_Pos = pos + component->GetTransform().InverseTransform().TransformCoordinate( pt ); }
void SCH_FIELD::Plot( PLOTTER* aPlotter ) { SCH_COMPONENT* parent = ( SCH_COMPONENT* ) GetParent(); wxCHECK_RET( parent != NULL && parent->Type() == SCH_COMPONENT_T, wxT( "Cannot plot field with invalid parent." ) ); COLOR4D color = GetLayerColor( GetLayer() ); if( !IsVisible() ) return; if( IsVoid() ) return; /* Calculate the text orientation, according to the component * orientation/mirror */ int orient = GetTextAngle(); if( parent->GetTransform().y1 ) // Rotate component 90 deg. { if( orient == TEXT_ANGLE_HORIZ ) orient = TEXT_ANGLE_VERT; else orient = TEXT_ANGLE_HORIZ; } /* Calculate the text justification, according to the component * orientation/mirror * this is a bit complicated due to cumulative calculations: * - numerous cases (mirrored or not, rotation) * - the DrawGraphicText function recalculate also H and H justifications * according to the text orientation. * - When a component is mirrored, the text is not mirrored and * justifications are complicated to calculate * so the more easily way is to use no justifications ( Centered text ) * and use GetBoundaryBox to know the text coordinate considered as centered */ EDA_RECT BoundaryBox = GetBoundingBox(); EDA_TEXT_HJUSTIFY_T hjustify = GR_TEXT_HJUSTIFY_CENTER; EDA_TEXT_VJUSTIFY_T vjustify = GR_TEXT_VJUSTIFY_CENTER; wxPoint textpos = BoundaryBox.Centre(); int thickness = GetPenSize(); aPlotter->Text( textpos, color, GetFullyQualifiedText(), orient, GetTextSize(), hjustify, vjustify, thickness, IsItalic(), IsBold() ); }
const EDA_RECT SCH_FIELD::GetBoundingBox() const { SCH_COMPONENT* parentComponent = (SCH_COMPONENT*) m_Parent; int linewidth = ( m_Thickness == 0 ) ? GetDefaultLineThickness() : m_Thickness; // We must pass the effective text thickness to GetTextBox // when calculating the bounding box linewidth = Clamp_Text_PenSize( linewidth, m_Size, m_Bold ); // Calculate the text bounding box: EDA_RECT rect; if( m_id == REFERENCE ) // multi units have one letter or more added to reference { SCH_FIELD text( *this ); // Make a local copy to change text // because GetBoundingBox() is const text.SetText( GetFullyQualifiedText() ); rect = text.GetTextBox( -1, linewidth ); } else rect = GetTextBox( -1, linewidth ); // Calculate the bounding box position relative to the component: wxPoint origin = parentComponent->GetPosition(); wxPoint pos = m_Pos - origin; wxPoint begin = rect.GetOrigin() - origin; wxPoint end = rect.GetEnd() - origin; RotatePoint( &begin, pos, m_Orient ); RotatePoint( &end, pos, m_Orient ); // Due to the Y axis direction, we must mirror the bounding box, // relative to the text position: begin.y -= pos.y; end.y -= pos.y; NEGATE( begin.y ); NEGATE( end.y ); begin.y += pos.y; end.y += pos.y; // Now, apply the component transform (mirror/rot) begin = parentComponent->GetTransform().TransformCoordinate( begin ); end = parentComponent->GetTransform().TransformCoordinate( end ); rect.SetOrigin( begin); rect.SetEnd( end); rect.Move( origin ); rect.Normalize(); return rect; }
void mapExistingAnnotation( std::map<timestamp_t, wxString>& aMap ) { SCH_SHEET_LIST sheets( g_RootSheet ); SCH_REFERENCE_LIST references; sheets.GetComponents( references ); for( size_t i = 0; i < references.GetCount(); i++ ) { SCH_COMPONENT* comp = references[ i ].GetComp(); wxString ref = comp->GetField( REFERENCE )->GetFullyQualifiedText(); if( !ref.Contains( wxT( "?" ) ) ) aMap[ comp->GetTimeStamp() ] = ref; } }
void SCH_SHEET_PATH::UpdateAllScreenReferences() { EDA_ITEM* t = LastDrawList(); while( t ) { if( t->Type() == SCH_COMPONENT_T ) { SCH_COMPONENT* component = (SCH_COMPONENT*) t; component->GetField( REFERENCE )->SetText( component->GetRef( this ) ); component->UpdateUnit( component->GetUnitSelection( this ) ); } t = t->Next(); } }
SCH_COMPONENT* NETLIST_EXPORTER::findNextComponent( EDA_ITEM* aItem, SCH_SHEET_PATH* aSheetPath ) { wxString ref; // continue searching from the middle of a linked list (the draw list) for( ; aItem; aItem = aItem->Next() ) { if( aItem->Type() != SCH_COMPONENT_T ) continue; // found next component SCH_COMPONENT* comp = (SCH_COMPONENT*) aItem; // Power symbols and other components which have the reference starting // with "#" are not included in netlist (pseudo or virtual components) ref = comp->GetRef( aSheetPath->Last() ); if( ref[0] == wxChar( '#' ) ) continue; // if( Component->m_FlagControlMulti == 1 ) // continue; /* yes */ // removed because with multiple instances of one schematic // (several sheets pointing to 1 screen), this will be erroneously be // toggled. LIB_PART* part = m_libs->FindLibPart( comp->GetPartName() ); if( !part ) continue; // If component is a "multi parts per package" type if( part->GetUnitCount() > 1 ) { // test if this reference has already been processed, and if so skip if( m_ReferencesAlreadyFound.Lookup( ref ) ) continue; } // record the usage of this library component entry. m_LibParts.insert( part ); // rejects non-unique pointers return comp; } return NULL; }
void SCH_SCREEN::ClearAnnotation( SCH_SHEET_PATH* aSheetPath ) { for( SCH_ITEM* item = m_drawList.begin(); item; item = item->Next() ) { if( item->Type() == SCH_COMPONENT_T ) { SCH_COMPONENT* component = (SCH_COMPONENT*) item; component->ClearAnnotation( aSheetPath ); // Clear the modified component flag set by component->ClearAnnotation // because we do not use it here and we should not leave this flag set, // when an edition is finished: component->ClearFlags(); } } }
LIB_PIN* SCH_SCREEN::GetPin( const wxPoint& aPosition, SCH_COMPONENT** aComponent, bool aEndPointOnly ) const { SCH_ITEM* item; SCH_COMPONENT* component = NULL; LIB_PIN* pin = NULL; for( item = m_drawList.begin(); item; item = item->Next() ) { if( item->Type() != SCH_COMPONENT_T ) continue; component = (SCH_COMPONENT*) item; if( aEndPointOnly ) { pin = NULL; LIB_PART* part = Prj().SchLibs()->FindLibPart( component->GetPartName() ); if( !part ) continue; for( pin = part->GetNextPin(); pin; pin = part->GetNextPin( pin ) ) { // Skip items not used for this part. if( component->GetUnit() && pin->GetUnit() && ( pin->GetUnit() != component->GetUnit() ) ) continue; if( component->GetConvert() && pin->GetConvert() && ( pin->GetConvert() != component->GetConvert() ) ) continue; if(component->GetPinPhysicalPosition( pin ) == aPosition ) break; } if( pin ) break; } else { pin = (LIB_PIN*) component->GetDrawItem( aPosition, LIB_PIN_T ); if( pin ) break; } } if( pin && aComponent ) *aComponent = component; return pin; }
const wxString SCH_FIELD::GetText() const { wxString text = m_Text; /* For more than one part per package, we must add the part selection * A, B, ... or 1, 2, .. to the reference. */ if( m_id == REFERENCE ) { SCH_COMPONENT* component = (SCH_COMPONENT*) m_Parent; wxCHECK_MSG( component != NULL, text, wxT( "No component associated with field" ) + text ); if( component->GetPartCount() > 1 ) text << LIB_COMPONENT::ReturnSubReference( component->GetUnit() ); } return text; }
void DIALOG_SCH_EDIT_ONE_FIELD::UpdateField( SCH_FIELD* aField, SCH_SHEET_PATH* aSheetPath ) { wxASSERT( aField != NULL || aField->Type() != SCH_FIELD_T ); if( aField->GetId() == REFERENCE ) { wxASSERT( aSheetPath != NULL ); SCH_COMPONENT* component = dynamic_cast< SCH_COMPONENT* >( aField->GetParent() ); wxASSERT( component != NULL ); if( component != NULL ) component->SetRef( aSheetPath, m_text ); } aField->SetText( m_text ); updateText( aField ); }
LIB_PIN* SCH_SCREEN::GetPin( const wxPoint& aPosition, SCH_COMPONENT** aComponent, bool aEndPointOnly ) const { SCH_ITEM* item; SCH_COMPONENT* component = NULL; LIB_PIN* pin = NULL; for( item = m_drawList.begin(); item != NULL; item = item->Next() ) { if( item->Type() != SCH_COMPONENT_T ) continue; component = (SCH_COMPONENT*) item; if( aEndPointOnly ) { pin = NULL; LIB_COMPONENT* entry = CMP_LIBRARY::FindLibraryComponent( component->GetLibName() ); if( entry == NULL ) continue; for( pin = entry->GetNextPin(); pin != NULL; pin = entry->GetNextPin( pin ) ) { // Skip items not used for this part. if( component->GetUnit() && pin->GetUnit() && ( pin->GetUnit() != component->GetUnit() ) ) continue; if( component->GetConvert() && pin->GetConvert() && ( pin->GetConvert() != component->GetConvert() ) ) continue; if(component->GetPinPhysicalPosition( pin ) == aPosition ) break; } if( pin ) break; } else { pin = (LIB_PIN*) component->GetDrawItem( aPosition, LIB_PIN_T ); if( pin ) break; } } if( pin && aComponent ) *aComponent = component; return pin; }
void SCH_EDIT_FRAME::OnOpenLibraryEditor( wxCommandEvent& event ) { SCH_COMPONENT* component = NULL; if( event.GetId() == ID_POPUP_SCH_CALL_LIBEDIT_AND_LOAD_CMP ) { SCH_ITEM* item = GetScreen()->GetCurItem(); if( (item == NULL) || (item->GetFlags() != 0) || ( item->Type() != SCH_COMPONENT_T ) ) { wxMessageBox( _("Error: not a component or no component" ) ); return; } component = (SCH_COMPONENT*) item; } LIB_EDIT_FRAME* libeditFrame = LIB_EDIT_FRAME::GetActiveLibraryEditor();; if( libeditFrame ) { if( libeditFrame->IsIconized() ) libeditFrame->Iconize( false ); libeditFrame->Raise(); } else { wxWindow* w = Kiface().CreateWindow( this, LIBEDITOR_FRAME_TYPE, &Kiway() ); libeditFrame = dynamic_cast<LIB_EDIT_FRAME*>( w ); } if( component ) { LIB_ALIAS* entry = CMP_LIBRARY::FindLibraryEntry( component->GetLibName() ); if( entry == NULL ) // Should not occur return; CMP_LIBRARY* library = entry->GetLibrary(); libeditFrame->LoadComponentAndSelectLib( entry, library ); } }