void SCH_SCREEN::ExtractWires( DLIST< SCH_ITEM >& aList, bool aCreateCopy ) { SCH_ITEM* item; SCH_ITEM* next_item; for( item = m_drawList.begin(); item; item = next_item ) { next_item = item->Next(); switch( item->Type() ) { case SCH_JUNCTION_T: case SCH_LINE_T: m_drawList.Remove( item ); aList.Append( item ); if( aCreateCopy ) m_drawList.Insert( (SCH_ITEM*) item->Clone(), next_item ); break; default: break; } } }
void SCH_EDIT_FRAME::RepeatDrawItem( wxDC* DC ) { SCH_ITEM* repeater = GetRepeatItem(); if( !repeater ) return; //D( repeater>Show( 0, std::cout ); ) // clone the repeater, move it, insert into display list, then save a copy // via SetRepeatItem(); SCH_ITEM* my_clone = (SCH_ITEM*) repeater->Clone(); // If cloning a component then put into 'move' mode. if( my_clone->Type() == SCH_COMPONENT_T ) { wxPoint pos = GetCrossHairPosition() - ( (SCH_COMPONENT*) my_clone )->GetPosition(); my_clone->SetFlags( IS_NEW ); ( (SCH_COMPONENT*) my_clone )->SetTimeStamp( GetNewTimeStamp() ); my_clone->Move( pos ); my_clone->Draw( m_canvas, DC, wxPoint( 0, 0 ), g_XorMode ); PrepareMoveItem( my_clone, DC ); } else { my_clone->Move( GetRepeatStep() ); if( my_clone->CanIncrementLabel() ) ( (SCH_TEXT*) my_clone )->IncrementLabel( GetRepeatDeltaLabel() ); GetScreen()->Append( my_clone ); if( my_clone->IsConnectable() ) { GetScreen()->TestDanglingEnds(); m_canvas->Refresh(); } else { my_clone->Draw( m_canvas, DC, wxPoint( 0, 0 ), GR_DEFAULT_DRAWMODE ); } SaveCopyInUndoList( my_clone, UR_NEW ); my_clone->ClearFlags(); } // clone my_clone, now that it has been moved, thus saving new position. SetRepeatItem( my_clone ); }
void SCH_EDIT_FRAME::SetRepeatItem( SCH_ITEM* aItem ) { // we cannot store a pointer to an item in the display list here since // that item may be deleted, such as part of a line concatonation or other. // So simply always keep a copy of the object which is to be repeated. SCH_ITEM* old = m_item_to_repeat; SCH_ITEM* cur = aItem; if( cur != old ) { if( cur ) { aItem = (SCH_ITEM*) cur->Clone(); // Clone() preserves the flags, we want 'em cleared. aItem->ClearFlags(); } m_item_to_repeat = aItem; delete old; } }