bool SCH_SHEET::HasUndefinedPins() { for( const SCH_SHEET_PIN& pin : m_pins ) { /* Search the schematic for a hierarchical label corresponding to this sheet label. */ EDA_ITEM* DrawStruct = m_screen->GetDrawItems(); const SCH_HIERLABEL* HLabel = NULL; for( ; DrawStruct != NULL; DrawStruct = DrawStruct->Next() ) { if( DrawStruct->Type() != SCH_HIERARCHICAL_LABEL_T ) continue; HLabel = static_cast<SCH_HIERLABEL*>( DrawStruct ); if( pin.GetText().CmpNoCase( HLabel->GetText() ) == 0 ) break; // Found! HLabel = NULL; } if( HLabel == NULL ) // Corresponding hierarchical label not found. return true; } return false; }
static void export_vrml_drawings( MODEL_VRML& aModel, BOARD* pcb ) { // draw graphic items for( EDA_ITEM* drawing = pcb->m_Drawings; drawing != 0; drawing = drawing->Next() ) { LAYER_ID layer = ( (DRAWSEGMENT*) drawing )->GetLayer(); if( layer != F_Cu && layer != B_Cu && layer != B_SilkS && layer != F_SilkS ) continue; switch( drawing->Type() ) { case PCB_LINE_T: export_vrml_drawsegment( aModel, (DRAWSEGMENT*) drawing ); break; case PCB_TEXT_T: export_vrml_pcbtext( aModel, (TEXTE_PCB*) drawing ); break; default: break; } } }
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; }
void SCH_SHEET::CleanupSheet() { SCH_SHEET_PINS::iterator i = m_pins.begin(); while( i != m_pins.end() ) { /* Search the schematic for a hierarchical label corresponding to this sheet label. */ EDA_ITEM* DrawStruct = m_screen->GetDrawItems(); const SCH_HIERLABEL* HLabel = NULL; for( ; DrawStruct != NULL; DrawStruct = DrawStruct->Next() ) { if( DrawStruct->Type() != SCH_HIERARCHICAL_LABEL_T ) continue; HLabel = static_cast<SCH_HIERLABEL*>( DrawStruct ); if( i->GetText().CmpNoCase( HLabel->GetText() ) == 0 ) break; // Found! HLabel = NULL; } if( HLabel == NULL ) // Hlabel not found: delete sheet label. i = m_pins.erase( i ); else ++i; } }
void FOOTPRINT_EDIT_FRAME::SaveCopyInUndoList( BOARD_ITEM* aItem, UNDO_REDO_T aTypeCommand, const wxPoint& aTransformPoint ) { EDA_ITEM* item; MODULE* CopyItem; PICKED_ITEMS_LIST* lastcmd; CopyItem = new MODULE( *( (MODULE*) aItem ) ); CopyItem->SetParent( GetBoard() ); lastcmd = new PICKED_ITEMS_LIST(); ITEM_PICKER wrapper( CopyItem, UR_MODEDIT ); lastcmd->PushItem( wrapper ); GetScreen()->PushCommandToUndoList( lastcmd ); /* Clear current flags (which can be temporary set by a current edit command) */ for( item = CopyItem->GraphicalItems(); item != NULL; item = item->Next() ) item->ClearFlags(); for( D_PAD* pad = CopyItem->Pads(); pad; pad = pad->Next() ) pad->ClearFlags(); CopyItem->Reference().ClearFlags(); CopyItem->Value().ClearFlags(); /* Clear redo list, because after new save there is no redo to do */ GetScreen()->ClearUndoORRedoList( GetScreen()->m_RedoList ); }
bool SCH_SHEET::SearchHierarchy( const wxString& aFilename, SCH_SCREEN** aScreen ) { if( m_screen ) { EDA_ITEM* item = m_screen->GetDrawItems(); while( item ) { if( item->Type() == SCH_SHEET_T ) { SCH_SHEET* sheet = (SCH_SHEET*) item; if( sheet->m_screen && sheet->m_screen->GetFileName().CmpNoCase( aFilename ) == 0 ) { *aScreen = sheet->m_screen; return true; } if( sheet->SearchHierarchy( aFilename, aScreen ) ) return true; } item = item->Next(); } } return false; }
bool SCH_SHEET::LocatePathOfScreen( SCH_SCREEN* aScreen, SCH_SHEET_PATH* aList ) { if( m_screen ) { aList->push_back( this ); if( m_screen == aScreen ) return true; EDA_ITEM* strct = m_screen->GetDrawItems(); while( strct ) { if( strct->Type() == SCH_SHEET_T ) { SCH_SHEET* ss = (SCH_SHEET*) strct; if( ss->LocatePathOfScreen( aScreen, aList ) ) return true; } strct = strct->Next(); } aList->pop_back(); } return false; }
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(); } } }
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(); } } }
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 MODULE::MoveAnchorPosition( const wxPoint& aMoveVector ) { /* Move the reference point of the footprint * the footprints elements (pads, outlines, edges .. ) are moved * but: * - the footprint position is not modified. * - the relative (local) coordinates of these items are modified */ wxPoint footprintPos = GetPosition(); /* Update the relative coordinates: * The coordinates are relative to the anchor point. * Calculate deltaX and deltaY from the anchor. */ wxPoint moveVector = aMoveVector; RotatePoint( &moveVector, -GetOrientation() ); // Update of the reference and value. m_Reference->SetPos0( m_Reference->GetPos0() + moveVector ); m_Reference->SetDrawCoord(); m_Value->SetPos0( m_Value->GetPos0() + moveVector ); m_Value->SetDrawCoord(); // Update the pad local coordinates. for( D_PAD* pad = Pads(); pad; pad = pad->Next() ) { pad->SetPos0( pad->GetPos0() + moveVector ); pad->SetPosition( pad->GetPos0() + footprintPos ); } // Update the draw element coordinates. for( EDA_ITEM* item = GraphicalItems(); item; item = item->Next() ) { switch( item->Type() ) { case PCB_MODULE_EDGE_T: { EDGE_MODULE* edge = static_cast<EDGE_MODULE*>( item ); edge->m_Start0 += moveVector; edge->m_End0 += moveVector; edge->SetDrawCoord(); break; } case PCB_MODULE_TEXT_T: { TEXTE_MODULE* text = static_cast<TEXTE_MODULE*>( item ); text->SetPos0( text->GetPos0() + moveVector ); text->SetDrawCoord(); break; } default: break; } } CalculateBoundingBox(); }
/* Mark items inside rect. * Items are inside rect when an end point is inside rect */ int MarkItemsInBloc( MODULE* module, EDA_RECT& Rect ) { EDA_ITEM* item; int ItemsCount = 0; wxPoint pos; D_PAD* pad; if( module == NULL ) return 0; pad = module->Pads(); for( ; pad != NULL; pad = pad->Next() ) { pad->ClearFlags( SELECTED ); pos = pad->GetPosition(); if( Rect.Contains( pos ) ) { pad->SetFlags( SELECTED ); ItemsCount++; } } item = module->GraphicalItems(); for( ; item != NULL; item = item->Next() ) { item->ClearFlags( SELECTED ); switch( item->Type() ) { case PCB_MODULE_EDGE_T: if( ((EDGE_MODULE*)item )->HitTest( Rect ) ) { item->SetFlags( SELECTED ); ItemsCount++; } break; case PCB_MODULE_TEXT_T: pos = ( (TEXTE_MODULE*) item )->GetTextPosition(); if( Rect.Contains( pos ) ) { item->SetFlags( SELECTED ); ItemsCount++; } break; default: break; } } return ItemsCount; }
// Same as function TransformGraphicShapesWithClearanceToPolygonSet but // this only render text void MODULE::TransformGraphicTextWithClearanceToPolygonSet( PCB_LAYER_ID aLayer, SHAPE_POLY_SET& aCornerBuffer, int aInflateValue, int aError ) const { std::vector<TEXTE_MODULE *> texts; // List of TEXTE_MODULE to convert for( EDA_ITEM* item = GraphicalItemsList(); item != NULL; item = item->Next() ) { switch( item->Type() ) { case PCB_MODULE_TEXT_T: { TEXTE_MODULE* text = static_cast<TEXTE_MODULE*>( item ); if( text->GetLayer() == aLayer && text->IsVisible() ) texts.push_back( text ); break; } case PCB_MODULE_EDGE_T: // This function does not render this break; default: break; } } // Convert texts sur modules if( Reference().GetLayer() == aLayer && Reference().IsVisible() ) texts.push_back( &Reference() ); if( Value().GetLayer() == aLayer && Value().IsVisible() ) texts.push_back( &Value() ); prms.m_cornerBuffer = &aCornerBuffer; for( unsigned ii = 0; ii < texts.size(); ii++ ) { TEXTE_MODULE *textmod = texts[ii]; prms.m_textWidth = textmod->GetThickness() + ( 2 * aInflateValue ); prms.m_error = aError; wxSize size = textmod->GetTextSize(); if( textmod->IsMirrored() ) size.x = -size.x; DrawGraphicText( NULL, NULL, textmod->GetTextPos(), BLACK, textmod->GetShownText(), textmod->GetDrawRotation(), size, textmod->GetHorizJustify(), textmod->GetVertJustify(), textmod->GetThickness(), textmod->IsItalic(), true, addTextSegmToPoly, &prms ); } }
/* Move marked items, at new position = old position + offset */ void MoveMarkedItems( MODULE* module, wxPoint offset ) { EDA_ITEM* item; if( module == NULL ) return; if( module->Reference().IsSelected() ) module->Reference().Move( offset ); if( module->Value().IsSelected() ) module->Value().Move( offset ); D_PAD* pad = module->Pads(); for( ; pad != NULL; pad = pad->Next() ) { if( !pad->IsSelected() ) continue; pad->SetPosition( pad->GetPosition() + offset ); pad->SetPos0( pad->GetPos0() + offset ); } item = module->GraphicalItems(); for( ; item != NULL; item = item->Next() ) { if( !item->IsSelected() ) continue; switch( item->Type() ) { case PCB_MODULE_TEXT_T: static_cast<TEXTE_MODULE*>( item )->Move( offset ); break; case PCB_MODULE_EDGE_T: { EDGE_MODULE* em = (EDGE_MODULE*) item; em->SetStart( em->GetStart() + offset ); em->SetEnd( em->GetEnd() + offset ); em->SetStart0( em->GetStart0() + offset ); em->SetEnd0( em->GetEnd0() + offset ); } break; default: ; } } ClearMarkItems( module ); }
void ClearMarkItems( MODULE* module ) { EDA_ITEM* item; if( module == NULL ) return; item = module->GraphicalItems(); for( ; item != NULL; item = item->Next() ) { item->ClearFlags(); } item = module->Pads(); for( ; item != NULL; item = item->Next() ) { item->ClearFlags(); } }
void SCH_SCREEN::Show( int nestLevel, std::ostream& os ) const { // for now, make it look like XML, expand on this later. NestedSpace( nestLevel, os ) << '<' << GetClass().Lower().mb_str() << ">\n"; for( EDA_ITEM* item = m_drawList.begin(); item; item = item->Next() ) { item->Show( nestLevel+1, os ); } NestedSpace( nestLevel, os ) << "</" << GetClass().Lower().mb_str() << ">\n"; }
/* Move marked items, at new position = old position + offset */ void MoveMarkedItems( MODULE* module, wxPoint offset ) { EDA_ITEM* item; if( module == NULL ) return; D_PAD* pad = module->Pads(); for( ; pad != NULL; pad = pad->Next() ) { if( !pad->IsSelected() ) continue; pad->SetPosition( pad->GetPosition() + offset ); pad->SetPos0( pad->GetPos0() + offset ); } item = module->GraphicalItems(); for( ; item != NULL; item = item->Next() ) { if( !item->IsSelected() ) continue; switch( item->Type() ) { case PCB_MODULE_TEXT_T: { TEXTE_MODULE* tm = (TEXTE_MODULE*) item; tm->Offset( offset ); tm->SetPos0( tm->GetPos0() + offset ); } break; case PCB_MODULE_EDGE_T: { EDGE_MODULE* em = (EDGE_MODULE*) item; em->SetStart( em->GetStart() + offset ); em->SetEnd( em->GetEnd() + offset ); em->SetStart0( em->GetStart0() + offset ); em->SetEnd0( em->GetEnd0() + offset ); } break; default: ; } item->ClearFlags(); } }
void ClearMarkItems( MODULE* module ) { if( module == NULL ) return; module->Reference().ClearFlags(); module->Value().ClearFlags(); EDA_ITEM* item = module->GraphicalItems(); for( ; item != NULL; item = item->Next() ) { item->ClearFlags(); } item = module->Pads(); for( ; item != NULL; item = item->Next() ) { item->ClearFlags(); } }
/** Rotate marked items, refer to a rotation point at position offset * Note: because this function is used in global transform, * if force_all is true, all items will be rotated */ void RotateMarkedItems( MODULE* module, wxPoint offset, bool force_all ) { #define ROTATE( z ) RotatePoint( (&z), offset, 900 ) if( module == NULL ) return; if( module->Reference().IsSelected() || force_all ) module->Reference().Rotate( offset, 900 ); if( module->Value().IsSelected() || force_all ) module->Value().Rotate( offset, 900 ); for( D_PAD* pad = module->Pads(); pad; pad = pad->Next() ) { if( !pad->IsSelected() && !force_all ) continue; wxPoint pos = pad->GetPos0(); ROTATE( pos ); pad->SetPos0( pos ); pad->SetOrientation( pad->GetOrientation() + 900 ); pad->SetDrawCoord(); } for( EDA_ITEM* item = module->GraphicalItems(); item; item = item->Next() ) { if( !item->IsSelected() && !force_all ) continue; switch( item->Type() ) { case PCB_MODULE_EDGE_T: ((EDGE_MODULE*) item)->Rotate( offset, 900 ); break; case PCB_MODULE_TEXT_T: static_cast<TEXTE_MODULE*>( item )->Rotate( offset, 900 ); break; default: break; } } ClearMarkItems( module ); }
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(); } }
/* * Move the footprint anchor position to the current cursor position. */ void FOOTPRINT_EDIT_FRAME::Place_Ancre( MODULE* aModule ) { wxPoint moveVector; if( aModule == NULL ) return; moveVector = aModule->m_Pos - GetScreen()->GetCrossHairPosition(); aModule->m_Pos = GetScreen()->GetCrossHairPosition(); /* Update the relative coordinates: * The coordinates are relative to the anchor point. * Calculate deltaX and deltaY from the anchor. */ RotatePoint( &moveVector, -aModule->m_Orient ); // Update the pad coordinates. for( D_PAD* pad = (D_PAD*) aModule->m_Pads; pad; pad = pad->Next() ) { pad->SetPos0( pad->GetPos0() + moveVector ); } // Update the draw element coordinates. for( EDA_ITEM* item = aModule->m_Drawings; item; item = item->Next() ) { switch( item->Type() ) { case PCB_MODULE_EDGE_T: #undef STRUCT #define STRUCT ( (EDGE_MODULE*) item ) STRUCT->m_Start0 += moveVector; STRUCT->m_End0 += moveVector; break; case PCB_MODULE_TEXT_T: #undef STRUCT #define STRUCT ( (TEXTE_MODULE*) item ) STRUCT->SetPos0( STRUCT->GetPos0() + moveVector ); break; default: break; } } aModule->CalculateBoundingBox(); }
void MODULE::Flip( const wxPoint& aCentre ) { // Move module to its final position: wxPoint finalPos = m_Pos; finalPos.y = aCentre.y - ( finalPos.y - aCentre.y ); /// Mirror the Y position SetPosition( finalPos ); // Flip layer SetLayer( FlipLayer( GetLayer() ) ); // Reverse mirror orientation. NEGATE( m_Orient ); NORMALIZE_ANGLE_POS( m_Orient ); // Mirror pads to other side of board about the x axis, i.e. vertically. for( D_PAD* pad = m_Pads; pad; pad = pad->Next() ) pad->Flip( m_Pos ); // Mirror reference. m_Reference->FlipWithModule( m_Pos.y ); // Mirror value. m_Value->FlipWithModule( m_Pos.y ); // Reverse mirror module graphics and texts. for( EDA_ITEM* item = m_Drawings; item; item = item->Next() ) { switch( item->Type() ) { case PCB_MODULE_EDGE_T: ( (EDGE_MODULE*) item )->Flip( m_Pos ); break; case PCB_MODULE_TEXT_T: static_cast<TEXTE_MODULE*>( item )->FlipWithModule( m_Pos.y ); break; default: wxMessageBox( wxT( "MODULE::Flip() error: Unknown Draw Type" ) ); break; } } CalculateBoundingBox(); }
int SCH_SHEET::CountSheets() { int count = 1; //1 = this!! if( m_screen ) { EDA_ITEM* strct = m_screen->GetDrawItems(); for( ; strct; strct = strct->Next() ) { if( strct->Type() == SCH_SHEET_T ) { SCH_SHEET* subsheet = (SCH_SHEET*) strct; count += subsheet->CountSheets(); } } } return count; }
SCH_SHEET_PIN* SCH_EDIT_FRAME::ImportSheetPin( SCH_SHEET* aSheet, wxDC* aDC ) { EDA_ITEM* item; SCH_SHEET_PIN* sheetPin; SCH_HIERLABEL* label = NULL; if( !aSheet->GetScreen() ) return NULL; item = aSheet->GetScreen()->GetDrawItems(); for( ; item != NULL; item = item->Next() ) { if( item->Type() != SCH_HIERARCHICAL_LABEL_T ) continue; label = (SCH_HIERLABEL*) item; /* A global label has been found: check if there a corresponding sheet label. */ if( !aSheet->HasPin( label->GetText() ) ) break; label = NULL; } if( label == NULL ) { DisplayInfoMessage( this, _( "No new hierarchical labels found." ) ); return NULL; } sheetPin = new SCH_SHEET_PIN( aSheet, wxPoint( 0, 0 ), label->GetText() ); sheetPin->SetFlags( IS_NEW ); sheetPin->SetSize( m_lastSheetPinTextSize ); m_lastSheetPinType = label->GetShape(); sheetPin->SetShape( label->GetShape() ); sheetPin->SetPosition( GetCrossHairPosition() ); sheetPin->Draw( m_canvas, aDC, wxPoint( 0, 0 ), g_XorMode ); MoveItem( (SCH_ITEM*) sheetPin, aDC ); return sheetPin; }
void NETLIST_EXPORTER_PSPICE::UpdateDirectives( unsigned aCtl ) { const SCH_SHEET_LIST& sheetList = g_RootSheet; m_directives.clear(); for( unsigned i = 0; i < sheetList.size(); i++ ) { for( EDA_ITEM* item = sheetList[i].LastDrawList(); item; item = item->Next() ) { if( item->Type() != SCH_TEXT_T ) continue; wxString text = static_cast<SCH_TEXT*>( item )->GetText(); if( text.IsEmpty() ) continue; if( text.GetChar( 0 ) == '.' ) { wxStringTokenizer tokenizer( text, "\r\n" ); while( tokenizer.HasMoreTokens() ) { wxString directive( tokenizer.GetNextToken() ); if( directive.StartsWith( ".inc" ) ) { wxString lib = directive.AfterFirst( ' ' ); if( !lib.IsEmpty() ) m_libraries.insert( lib ); } else { m_directives.push_back( directive ); } } } } } }
static void export_vrml_drawings( BOARD* pcb ) //{{{ { // draw graphic items for( EDA_ITEM* drawing = pcb->m_Drawings; drawing != 0; drawing = drawing->Next() ) { switch( drawing->Type() ) { case PCB_LINE_T: export_vrml_drawsegment( (DRAWSEGMENT*) drawing ); break; case PCB_TEXT_T: export_vrml_pcbtext( (TEXTE_PCB*) drawing ); break; default: break; } } }
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 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 ); } } } }
void SCH_SHEET_LIST::BuildSheetList( SCH_SHEET* aSheet ) { wxCHECK_RET( aSheet != NULL, wxT( "Cannot build sheet list from undefined sheet." ) ); if( aSheet == g_RootSheet ) m_isRootSheet = true; if( m_list == NULL ) { int count = aSheet->CountSheets(); m_count = count; m_index = 0; m_list = new SCH_SHEET_PATH[ count ]; m_currList.Clear(); } m_currList.Push( aSheet ); m_list[m_index] = m_currList; m_index++; if( aSheet->GetScreen() ) { EDA_ITEM* strct = m_currList.LastDrawList(); while( strct ) { if( strct->Type() == SCH_SHEET_T ) { SCH_SHEET* sheet = (SCH_SHEET*) strct; BuildSheetList( sheet ); } strct = strct->Next(); } } m_currList.Pop(); }
void MODULE::SetPosition( const wxPoint& newpos ) { wxPoint delta = newpos - m_Pos; m_Pos += delta; m_Reference->SetTextPosition( m_Reference->GetTextPosition() + delta ); m_Value->SetTextPosition( m_Value->GetTextPosition() + delta ); for( D_PAD* pad = m_Pads; pad; pad = pad->Next() ) { pad->SetPosition( pad->GetPosition() + delta ); } for( EDA_ITEM* item = m_Drawings; item; item = item->Next() ) { switch( item->Type() ) { case PCB_MODULE_EDGE_T: { EDGE_MODULE* pt_edgmod = (EDGE_MODULE*) item; pt_edgmod->SetDrawCoord(); break; } case PCB_MODULE_TEXT_T: { TEXTE_MODULE* text = static_cast<TEXTE_MODULE*>( item ); text->SetTextPosition( text->GetTextPosition() + delta ); break; } default: wxMessageBox( wxT( "Draw type undefined." ) ); break; } } CalculateBoundingBox(); }