void SCH_EDIT_FRAME::OnCopySchematicItemRequest( wxCommandEvent& event ) { SCH_ITEM * curr_item = GetScreen()->GetCurItem(); if( !curr_item || curr_item->GetFlags() ) return; INSTALL_UNBUFFERED_DC( dc, m_canvas ); switch( curr_item->Type() ) { case SCH_COMPONENT_T: { SCH_COMPONENT* newitem; newitem = new SCH_COMPONENT( *( (SCH_COMPONENT*) curr_item ) ); newitem->SetTimeStamp( GetNewTimeStamp() ); newitem->ClearAnnotation( NULL ); newitem->SetFlags( IS_NEW ); // Draw the new part, MoveItem() expects it to be already on screen. newitem->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode ); PrepareMoveItem( newitem, &dc ); } break; case SCH_TEXT_T: case SCH_LABEL_T: case SCH_GLOBAL_LABEL_T: case SCH_HIERARCHICAL_LABEL_T: { SCH_TEXT* newitem = (SCH_TEXT*) curr_item->Clone(); newitem->SetFlags( IS_NEW ); // Draw the new item, MoveItem() expects it to be already on screen. newitem->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode ); PrepareMoveItem( newitem, &dc ); } 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 ); }
SCH_COMPONENT* SCH_EDIT_FRAME::Load_Component( const SCHLIB_FILTER* aFilter, SCH_BASE_FRAME::HISTORY_LIST& aHistoryList, bool aAllowBrowser ) { wxString msg; SetRepeatItem( NULL ); m_canvas->SetIgnoreMouseEvents( true ); auto sel = SelectComponentFromLibTree( aFilter, aHistoryList, aAllowBrowser, 1, 1, m_footprintPreview ); if( !sel.LibId.IsValid() ) { m_canvas->SetIgnoreMouseEvents( false ); m_canvas->MoveCursorToCrossHair(); return NULL; } m_canvas->SetIgnoreMouseEvents( false ); m_canvas->MoveCursorToCrossHair(); wxString libsource; // the library name to use. If empty, load from any lib if( aFilter ) libsource = aFilter->GetLibSource(); LIB_ID libId = sel.LibId; LIB_PART* part = GetLibPart( libId, true ); if( !part ) return NULL; SCH_COMPONENT* component = new SCH_COMPONENT( *part, libId, g_CurrentSheet, sel.Unit, sel.Convert, GetCrossHairPosition(), true ); // Be sure the link to the corresponding LIB_PART is OK: component->Resolve( *Prj().SchSymbolLibTable() ); // Set any fields that have been modified for( auto const& i : sel.Fields ) { auto field = component->GetField( i.first ); if( field ) field->SetText( i.second ); } MSG_PANEL_ITEMS items; component->GetMsgPanelInfo( m_UserUnits, items ); SetMsgPanel( items ); component->SetFlags( IS_NEW ); if( m_autoplaceFields ) component->AutoplaceFields( /* aScreen */ NULL, /* aManual */ false ); PrepareMoveItem( component ); return component; }
SCH_COMPONENT* SCH_EDIT_FRAME::Load_Component( wxDC* aDC, const SCHLIB_FILTER* aFilter, SCH_BASE_FRAME::HISTORY_LIST& aHistoryList, bool aUseLibBrowser ) { wxString msg; SetRepeatItem( NULL ); m_canvas->SetIgnoreMouseEvents( true ); auto sel = SelectComponentFromLibrary( aFilter, aHistoryList, aUseLibBrowser, 1, 1, m_footprintPreview ); if( !sel.LibId.IsValid() ) { m_canvas->SetIgnoreMouseEvents( false ); m_canvas->MoveCursorToCrossHair(); return NULL; } m_canvas->SetIgnoreMouseEvents( false ); m_canvas->MoveCursorToCrossHair(); wxString libsource; // the library name to use. If empty, load from any lib if( aFilter ) libsource = aFilter->GetLibSource(); LIB_ID libId = sel.LibId; LIB_PART* part = GetLibPart( libId, true ); if( !part ) return NULL; SCH_COMPONENT* component = new SCH_COMPONENT( *part, m_CurrentSheet, sel.Unit, sel.Convert, GetCrossHairPosition(), true ); // Set the m_ChipName value, from component name in lib, for aliases // Note if part is found, and if name is an alias of a component, // alias exists because its root component was found component->SetLibId( libId ); // Be sure the link to the corresponding LIB_PART is OK: component->Resolve( *Prj().SchSymbolLibTable() ); // Set any fields that have been modified for( auto const& i : sel.Fields ) { auto field = component->GetField( i.first ); if( field ) field->SetText( i.second ); } // Set the component value that can differ from component name in lib, for aliases component->GetField( VALUE )->SetText( sel.LibId.GetLibItemName() ); // If there is no field defined in the component, copy one over from the library // ( from the .dcm file ) // This way the Datasheet field will not be empty and can be changed from the schematic if( component->GetField( DATASHEET )->GetText().IsEmpty() ) { LIB_ALIAS* entry = GetLibAlias( component->GetLibId(), true, true ); if( entry && !!entry->GetDocFileName() ) component->GetField( DATASHEET )->SetText( entry->GetDocFileName() ); } MSG_PANEL_ITEMS items; component->SetCurrentSheetPath( &GetCurrentSheet() ); component->GetMsgPanelInfo( items ); SetMsgPanel( items ); component->Draw( m_canvas, aDC, wxPoint( 0, 0 ), g_XorMode ); component->SetFlags( IS_NEW ); if( m_autoplaceFields ) component->AutoplaceFields( /* aScreen */ NULL, /* aManual */ false ); PrepareMoveItem( (SCH_ITEM*) component, aDC ); return component; }
SCH_TEXT* SCH_EDIT_FRAME::CreateNewText( wxDC* aDC, int aType ) { SCH_TEXT* textItem = NULL; SetRepeatItem( NULL ); switch( aType ) { case LAYER_NOTES: textItem = new SCH_TEXT( GetCrossHairPosition() ); break; case LAYER_LOCLABEL: textItem = new SCH_LABEL( GetCrossHairPosition() ); break; case LAYER_HIERLABEL: textItem = new SCH_HIERLABEL( GetCrossHairPosition() ); textItem->SetShape( lastGlobalLabelShape ); break; case LAYER_GLOBLABEL: textItem = new SCH_GLOBALLABEL( GetCrossHairPosition() ); textItem->SetShape( lastGlobalLabelShape ); break; default: DisplayError( this, wxT( "SCH_EDIT_FRAME::CreateNewText() Internal error" ) ); return NULL; } textItem->SetBold( lastTextBold ); textItem->SetItalic( lastTextItalic ); textItem->SetOrientation( lastTextOrientation ); textItem->SetSize( wxSize( GetDefaultTextSize(), GetDefaultTextSize() ) ); textItem->SetFlags( IS_NEW | IS_MOVED ); EditSchematicText( textItem ); if( textItem->GetText().IsEmpty() ) { delete textItem; return NULL; } lastTextBold = textItem->IsBold(); lastTextItalic = textItem->IsItalic(); lastTextOrientation = textItem->GetOrientation(); if( ( textItem->Type() == SCH_GLOBAL_LABEL_T ) || ( textItem->Type() == SCH_HIERARCHICAL_LABEL_T ) ) { lastGlobalLabelShape = textItem->GetShape(); } // Prepare display to move the new item textItem->Draw( m_canvas, aDC, wxPoint( 0, 0 ), g_XorMode ); PrepareMoveItem( (SCH_ITEM*) textItem, aDC ); return textItem; }
void SCH_EDIT_FRAME::OnMoveItem( wxCommandEvent& aEvent ) { SCH_SCREEN* screen = GetScreen(); SCH_ITEM* item = screen->GetCurItem(); if( screen->m_BlockLocate.GetState() != STATE_NO_BLOCK ) { // trying to move an item when there is a block at the same time is not acceptable return; } if( item == NULL ) { // If we didn't get here by a hot key, then something has gone wrong. if( aEvent.GetInt() == 0 ) return; EDA_HOTKEY_CLIENT_DATA* data = (EDA_HOTKEY_CLIENT_DATA*) aEvent.GetClientObject(); wxCHECK_RET( data != NULL, wxT( "Invalid hot key client object." ) ); item = LocateAndShowItem( data->GetPosition(), SCH_COLLECTOR::MovableItems, aEvent.GetInt() ); // Exit if no item found at the current location or the item is already being edited. if( (item == NULL) || (item->GetFlags() != 0) ) return; } INSTALL_UNBUFFERED_DC( dc, m_canvas ); switch( item->Type() ) { case SCH_LINE_T: break; case SCH_JUNCTION_T: case SCH_NO_CONNECT_T: case SCH_BUS_BUS_ENTRY_T: case SCH_BUS_WIRE_ENTRY_T: case SCH_LABEL_T: case SCH_GLOBAL_LABEL_T: case SCH_HIERARCHICAL_LABEL_T: case SCH_TEXT_T: case SCH_COMPONENT_T: case SCH_SHEET_PIN_T: case SCH_FIELD_T: case SCH_SHEET_T: PrepareMoveItem( item, &dc ); break; case SCH_BITMAP_T: // move an image is a special case: // we cannot undraw/redraw a bitmap just using our xor mode // the MoveImage function handle this undraw/redraw difficulty // By redrawing the full bounding box MoveImage( (SCH_BITMAP*) item, &dc ); break; case SCH_MARKER_T: // Moving a marker has no sense break; default: // Unknown items cannot be moved wxFAIL_MSG( wxString::Format( wxT( "Cannot move item type %d" ), item->Type() ) ); break; } if( GetToolId() == ID_NO_TOOL_SELECTED ) SetRepeatItem( NULL ); }