void SCH_EDIT_FRAME::OnFindReplace( wxFindDialogEvent& aEvent ) { SCH_FIND_COLLECTOR_DATA data; bool warpCursor = !( aEvent.GetFlags() & FR_NO_WARP_CURSOR ); SCH_ITEM* item = (SCH_ITEM*) m_foundItems.GetItem( data ); wxCHECK_RET( item != NULL, wxT( "Invalid replace item in find collector list." ) ); wxLogTrace( traceFindReplace, wxT( "Replacing %s with %s in item %s" ), GetChars( aEvent.GetFindString() ), GetChars( aEvent.GetReplaceString() ), GetChars( m_foundItems.GetText() ) ); SCH_ITEM* undoItem = data.GetParent(); if( undoItem == NULL ) undoItem = item; SetUndoItem( undoItem ); if( m_foundItems.ReplaceItem() ) { OnModify(); SaveUndoItemInUndoList( undoItem ); RedrawScreen( data.GetPosition(), warpCursor ); } OnFindSchematicItem( aEvent ); if( aEvent.GetEventType() == wxEVT_COMMAND_FIND_REPLACE_ALL ) { while( ( item = (SCH_ITEM*) m_foundItems.GetItem( data ) ) != NULL ) { wxLogTrace( traceFindReplace, wxT( "Replacing %s with %s in item %s" ), GetChars( aEvent.GetFindString() ), GetChars( aEvent.GetReplaceString() ), GetChars( m_foundItems.GetText() ) ); SCH_ITEM* undoItem = data.GetParent(); // Don't save child items in undo list. if( undoItem == NULL ) undoItem = item; SetUndoItem( undoItem ); if( m_foundItems.ReplaceItem() ) { OnModify(); SaveUndoItemInUndoList( undoItem ); RedrawScreen( data.GetPosition(), warpCursor ); } OnFindSchematicItem( aEvent ); } } }
BOOL CScriptDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { NMHDR *phDR; phDR = (NMHDR*)lParam; // Does notification come from scintilla window? if (phDR != NULL) { CScintillaWnd* m_wndScintilla = NULL; if(phDR->hwndFrom == m_Script.m_hWnd) m_wndScintilla = &m_Script; if(phDR->hwndFrom == m_Help.m_hWnd) m_wndScintilla = &m_Help; SCNotification *pMsg = (SCNotification*)lParam; switch(phDR->code) { case SCN_SAVEPOINTLEFT: break; case SCN_UPDATEUI: m_wndScintilla->UpdateUI(); OnModify(); break; case SCN_MARGINCLICK: m_wndScintilla->DoDefaultFolding(pMsg->margin,pMsg->position); break; case SCN_DOUBLECLICK: HelpMe(); break; case SCN_CHARADDED: { SCNotification *scn = (SCNotification*)phDR; OnChar(scn->ch); OnModify(); break; } case SCN_MODIFIED: OnModify(); break; } return TRUE; } return CWnd::OnNotify(wParam, lParam, pResult); }
bool SCH_EDIT_FRAME::RescueProject( bool aRunningOnDemand ) { RESCUER rescuer( *this, Prj() ); rescuer.FindCandidates(); if( ! rescuer.GetCandidateCount() ) { if( aRunningOnDemand ) { wxMessageDialog dlg( this, _( "This project has nothing to rescue." ), _( "Project Rescue Helper" ) ); dlg.ShowModal(); } return true; } rescuer.RemoveDuplicates(); rescuer.InvokeDialog( !aRunningOnDemand ); // If no components were rescued, let the user know what's going on. He might // have clicked cancel by mistake, and should have some indication of that. if( !rescuer.GetChosenCandidateCount() ) { wxMessageDialog dlg( this, _( "No symbols were rescued." ), _( "Project Rescue Helper" ) ); dlg.ShowModal(); // Set the modified flag even on Cancel. Many users seem to instinctively want to Save at // this point, due to the reloading of the symbols, so we'll make the save button active. OnModify(); return true; } RESCUE_CACHE_CANDIDATE::OpenRescueLibrary(); if( !rescuer.DoRescues() ) { rescuer.UndoRescues(); return false; } RESCUE_CACHE_CANDIDATE::WriteRescueLibrary( this, &Prj() ); Prj().SetElem( PROJECT::ELEM_SCH_PART_LIBS, NULL ); // Clean up wire ends GetScreen()->SchematicCleanUp(); m_canvas->Refresh( true ); OnModify(); return true; }
SCH_SHEET_PIN* SCH_EDIT_FRAME::CreateSheetPin( SCH_SHEET* aSheet, wxDC* aDC ) { wxString line; SCH_SHEET_PIN* sheetPin; sheetPin = new SCH_SHEET_PIN( aSheet, wxPoint( 0, 0 ), line ); sheetPin->SetFlags( IS_NEW ); sheetPin->SetSize( m_lastSheetPinTextSize ); sheetPin->SetShape( m_lastSheetPinType ); int response = EditSheetPin( sheetPin, NULL ); if( sheetPin->GetText().IsEmpty() || (response == wxID_CANCEL) ) { delete sheetPin; return NULL; } m_lastSheetPinType = sheetPin->GetShape(); m_lastSheetPinTextSize = sheetPin->GetSize(); sheetPin->SetPosition( GetCrossHairPosition() ); sheetPin->Draw( m_canvas, aDC, wxPoint( 0, 0 ), g_XorMode ); MoveItem( (SCH_ITEM*) sheetPin, aDC ); OnModify(); return sheetPin; }
void PCB_BASE_FRAME::DeletePad( D_PAD* aPad, bool aQuery ) { if( aPad == NULL ) return; MODULE* module = (MODULE*) aPad->GetParent(); module->SetLastEditTime(); // aQuery = true to prompt for confirmation, false to delete silently if( aQuery ) { wxString msg; msg.Printf( _( "Delete Pad (footprint %s %s) ?" ), GetChars( module->GetReference() ), GetChars( module->GetValue() ) ); if( !IsOK( this, msg ) ) return; } m_Pcb->m_Status_Pcb = 0; aPad->DeleteStructure(); // Refresh the modified screen area, using the initial bounding box // which is perhaps larger than the new bounding box m_canvas->RefreshDrawingRect( module->GetBoundingBox() ); // Update the bounding box module->CalculateBoundingBox(); OnModify(); }
void PCB_BASE_FRAME::DeletePad( D_PAD* aPad, bool aQuery ) { if( aPad == NULL ) return; MODULE* module = aPad->GetParent(); module->SetLastEditTime(); // aQuery = true to prompt for confirmation, false to delete silently if( aQuery ) { wxString msg = wxString::Format( _( "Delete pad (footprint %s %s)?" ), module->GetReference(), module->GetValue() ); if( !IsOK( this, msg ) ) return; } // Stores the initial bounding box to refresh the old area EDA_RECT bbox = module->GetBoundingBox(); m_Pcb->m_Status_Pcb = 0; GetBoard()->PadDelete( aPad ); // Update the bounding box module->CalculateBoundingBox(); // Refresh the modified screen area, using the initial bounding box // which is perhaps larger than the new bounding box m_canvas->RefreshDrawingRect( bbox ); OnModify(); }
void PCB_EDIT_FRAME::End_Move_Zone_Corner_Or_Outlines( wxDC* DC, ZONE_CONTAINER* aZone ) { aZone->ClearFlags(); m_canvas->SetMouseCapture( NULL, NULL ); if( DC ) aZone->Draw( m_canvas, DC, GR_OR ); OnModify(); s_AddCutoutToCurrentZone = false; s_CurrentZone = NULL; SetCurItem( NULL ); // This outline can be deleted when merging outlines // Combine zones if possible GetBoard()->OnAreaPolygonModified( &s_AuxiliaryList, aZone ); m_canvas->Refresh(); int ii = GetBoard()->GetAreaIndex( aZone ); // test if aZone exists if( ii < 0 ) aZone = NULL; // was removed by combining zones UpdateCopyOfZonesList( s_PickedList, s_AuxiliaryList, GetBoard() ); SaveCopyInUndoList(s_PickedList, UR_UNSPECIFIED); s_PickedList.ClearItemsList(); // s_ItemsListPicker is no more owner of picked items int error_count = GetBoard()->Test_Drc_Areas_Outlines_To_Areas_Outlines( aZone, true ); if( error_count ) { DisplayError( this, _( "Area: DRC outline error" ) ); } }
void PCB_EDIT_FRAME::Delete_Zone_Contour( wxDC* DC, ZONE_CONTAINER* aZone ) { int ncont = aZone->m_Poly->GetContour( aZone->m_CornerSelection ); EDA_RECT dirty = aZone->GetBoundingBox(); // For compatibility with old boards: remove old SEGZONE fill segments Delete_OldZone_Fill( NULL, aZone->GetTimeStamp() ); // Remove current filling: aZone->UnFill(); if( ncont == 0 ) // This is the main outline: remove all { SaveCopyInUndoList( aZone, UR_DELETED ); GetBoard()->Remove( aZone ); } else { SaveCopyInUndoList( aZone, UR_CHANGED ); aZone->m_Poly->RemoveContour( ncont ); } m_canvas->RefreshDrawingRect( dirty ); OnModify(); }
void PCB_BASE_FRAME::RotateTextModule( TEXTE_MODULE* Text, wxDC* DC ) { if( Text == NULL ) return; MODULE* module = (MODULE*) Text->GetParent(); if( module && module->GetFlags() == 0 && Text->GetFlags() == 0 ) // prepare undo command { if( IsType( FRAME_PCB ) ) SaveCopyInUndoList( module, UR_CHANGED ); } // we expect MoveVector to be (0,0) if there is no move in progress Text->Draw( m_canvas, DC, GR_XOR, MoveVector ); Text->SetTextAngle( Text->GetTextAngle() + 900 ); Text->Draw( m_canvas, DC, GR_XOR, MoveVector ); SetMsgPanel( Text ); if( module ) module->SetLastEditTime(); OnModify(); }
void PCB_EDIT_FRAME::Delete_Segment_Edge( DRAWSEGMENT* Segment, wxDC* DC ) { EDA_ITEM* PtStruct; int track_fill_copy = DisplayOpt.DisplayDrawItems; if( Segment == NULL ) return; if( Segment->IsNew() ) // Trace in progress. { // Delete current segment. DisplayOpt.DisplayDrawItems = SKETCH; Segment->Draw( m_canvas, DC, GR_XOR ); PtStruct = Segment->Back(); Segment ->DeleteStructure(); if( PtStruct && (PtStruct->Type() == PCB_LINE_T ) ) Segment = (DRAWSEGMENT*) PtStruct; DisplayOpt.DisplayDrawItems = track_fill_copy; SetCurItem( NULL ); } else if( Segment->GetFlags() == 0 ) { Segment->Draw( m_canvas, DC, GR_XOR ); Segment->ClearFlags(); SaveCopyInUndoList(Segment, UR_DELETED); Segment->UnLink(); SetCurItem( NULL ); OnModify(); } }
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_EDIT_FRAME::MoveItem( 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 ); } aItem->SetFlags( IS_MOVED ); #ifdef USE_WX_OVERLAY this->Refresh(); this->Update(); #endif m_canvas->CrossHairOff( aDC ); if( aItem->Type() != SCH_SHEET_PIN_T ) SetCrossHairPosition( aItem->GetPosition() ); m_canvas->MoveCursorToCrossHair(); OnModify(); m_canvas->SetMouseCapture( moveItem, abortMoveItem ); GetScreen()->SetCurItem( aItem ); moveItem( m_canvas, aDC, wxDefaultPosition, true ); m_canvas->CrossHairOn( aDC ); }
void SCH_EDIT_FRAME::RotateHierarchicalSheet( SCH_SHEET* aSheet, bool aRotCCW ) { if( aSheet == NULL ) return; // Save old sheet in undo list if not already in edit, or moving. if( aSheet->GetFlags() == 0 ) SaveCopyInUndoList( aSheet, UR_CHANGED ); // Rotate the sheet on itself. Sheets do not have a anchor point. // Rotation is made around it center wxPoint rotPoint = aSheet->GetBoundingBox().Centre(); // rotate CCW, or CW. to rotate CW, rotate 3 times aSheet->Rotate( rotPoint ); if( !aRotCCW ) { aSheet->Rotate( rotPoint ); aSheet->Rotate( rotPoint ); } GetCanvas()->Refresh(); OnModify(); }
void PCB_EDIT_FRAME::Rotate_Texte_Pcb( TEXTE_PCB* TextePcb, wxDC* DC ) { int angle = 900; if( TextePcb == NULL ) return; // Erase previous text: TextePcb->Draw( m_canvas, DC, GR_XOR ); TextePcb->SetOrientation( TextePcb->GetOrientation() + angle ); // Redraw text in new position: TextePcb->Draw( m_canvas, DC, GR_XOR ); SetMsgPanel( TextePcb ); if( TextePcb->GetFlags() == 0 ) // i.e. not edited, or moved SaveCopyInUndoList( TextePcb, UR_ROTATED, TextePcb->GetTextPosition() ); else // set flag edit, to show it was a complex command TextePcb->SetFlags( IN_EDIT ); OnModify(); #ifdef USE_WX_OVERLAY m_canvas->Refresh(); #endif }
/** * Function Delete_OldZone_Fill (obsolete) * Used for compatibility with old boards * Remove the zone filling which include the segment aZone, or the zone which have the * given time stamp. * A zone is a group of segments which have the same TimeStamp * @param aZone = zone segment within the zone to delete. Can be NULL * @param aTimestamp = Timestamp for the zone to delete, used if aZone == NULL */ void PCB_EDIT_FRAME::Delete_OldZone_Fill( SEGZONE* aZone, time_t aTimestamp ) { bool modify = false; time_t TimeStamp; if( aZone == NULL ) TimeStamp = aTimestamp; else TimeStamp = aZone->GetTimeStamp(); // Save reference time stamp (aZone will be deleted) SEGZONE* next; for( SEGZONE* zone = GetBoard()->m_Zone; zone != NULL; zone = next ) { next = zone->Next(); if( zone->GetTimeStamp() == TimeStamp ) { modify = true; // remove item from linked list and free memory zone->DeleteStructure(); } } if( modify ) { OnModify(); m_canvas->Refresh(); } }
void PCB_EDIT_FRAME::PlaceTarget( PCB_TARGET* aTarget, wxDC* DC ) { if( aTarget == NULL ) return; aTarget->Draw( m_canvas, DC, GR_OR ); m_canvas->SetMouseCapture( NULL, NULL ); SetCurItem( NULL ); OnModify(); if( aTarget->IsNew() ) { SaveCopyInUndoList( aTarget, UR_NEW ); aTarget->ClearFlags(); return; } if( aTarget->GetFlags() == IS_MOVED ) { SaveCopyInUndoList( aTarget, UR_MOVED, aTarget->GetPosition() - s_TargetCopy.GetPosition() ); aTarget->ClearFlags(); return; } if( (aTarget->GetFlags() & IN_EDIT) ) { aTarget->SwapData( &s_TargetCopy ); SaveCopyInUndoList( aTarget, UR_CHANGED ); aTarget->SwapData( &s_TargetCopy ); } aTarget->ClearFlags(); }
void PCB_EDIT_FRAME::Delete_Segment_Edge( DRAWSEGMENT* Segment, wxDC* DC ) { auto displ_opts = (PCB_DISPLAY_OPTIONS*)GetDisplayOptions(); bool tmp = displ_opts->m_DisplayDrawItemsFill; if( Segment == NULL ) return; int mask = EDA_ITEM_ALL_FLAGS - ( SELECTED | HIGHLIGHTED | BRIGHTENED ); if( Segment->IsNew() ) // Trace in progress. { // Delete current segment. displ_opts->m_DisplayDrawItemsFill = SKETCH; Segment->Draw( m_canvas, DC, GR_XOR ); Segment->DeleteStructure(); displ_opts->m_DisplayDrawItemsFill = tmp; SetCurItem( NULL ); } else if( ( Segment->GetFlags() & mask ) == 0 ) // i.e. not edited, or moved { Segment->Draw( m_canvas, DC, GR_XOR ); Segment->ClearFlags(); SaveCopyInUndoList(Segment, UR_DELETED); Segment->UnLink(); SetCurItem( NULL ); OnModify(); } }
void FOOTPRINT_EDIT_FRAME::Edit_Edge_Width( EDGE_MODULE* aEdge ) { MODULE* module = GetBoard()->m_Modules; SaveCopyInUndoList( module, UR_CHANGED ); if( aEdge == NULL ) { for( BOARD_ITEM *item = module->GraphicalItemsList(); item; item = item->Next() ) { aEdge = dyn_cast<EDGE_MODULE*>( item ); if( aEdge ) aEdge->SetWidth( GetDesignSettings().GetLineThickness( aEdge->GetLayer() ) ); } } else { aEdge->SetWidth( GetDesignSettings().GetLineThickness( aEdge->GetLayer() ) ); } OnModify(); module->CalculateBoundingBox(); module->SetLastEditTime(); }
void FOOTPRINT_EDIT_FRAME::Edit_Edge_Width( EDGE_MODULE* aEdge ) { MODULE* module = GetBoard()->m_Modules; SaveCopyInUndoList( module, UR_MODEDIT ); if( aEdge == NULL ) { aEdge = (EDGE_MODULE*) (BOARD_ITEM*) module->m_Drawings; for( ; aEdge != NULL; aEdge = aEdge->Next() ) { if( aEdge->Type() != PCB_MODULE_EDGE_T ) continue; aEdge->SetWidth( GetDesignSettings().m_ModuleSegmentWidth ); } } else { aEdge->SetWidth( GetDesignSettings().m_ModuleSegmentWidth ); } OnModify(); module->CalculateBoundingBox(); module->m_LastEdit_Time = time( NULL ); }
void PCB_EDIT_FRAME::RestoreCopyFromRedoList( wxCommandEvent& aEvent ) { if( UndoRedoBlocked() ) return; if( GetScreen()->GetRedoCommandCount() == 0 ) return; // Inform tools that redo command was issued TOOL_EVENT event( TC_MESSAGE, TA_UNDO_REDO, AS_GLOBAL ); m_toolManager->ProcessEvent( event ); /* Get the old list */ PICKED_ITEMS_LIST* List = GetScreen()->PopCommandFromRedoList(); /* Redo the command: */ PutDataInPreviousState( List, true ); /* Put the old list in UndoList */ List->ReversePickersListOrder(); GetScreen()->PushCommandToUndoList( List ); OnModify(); m_canvas->Refresh(); }
bool PCB_BASE_FRAME::InvokeDialogGrid() { wxPoint grid_origin = GetGridOrigin(); DIALOG_SET_GRID dlg( this, &m_UserGridUnit, g_UserUnit, &m_UserGridSize, &grid_origin, &m_FastGrid1, &m_FastGrid2, m_gridSelectBox->GetStrings() ); int ret = dlg.ShowModal(); if( ret == wxID_OK ) { if( GetGridOrigin() != grid_origin && IsType( FRAME_PCB ) ) OnModify(); // because grid origin is saved in board, show as modified SetGridOrigin( grid_origin ); GetScreen()->AddGrid( m_UserGridSize, m_UserGridUnit, ID_POPUP_GRID_USER ); // If the user grid is the current option, recall SetGrid() // to force new values put in list as current grid value if( GetScreen()->GetGridId() == ID_POPUP_GRID_USER ) GetScreen()->SetGrid( ID_POPUP_GRID_USER ); m_canvas->Refresh(); return true; } return false; }
int PCB_EDIT_FRAME::Fill_Zone( ZONE_CONTAINER* aZone ) { aZone->ClearFilledPolysList(); aZone->UnFill(); // Cannot fill keepout zones: if( aZone->GetIsKeepout() ) return 1; wxString msg; ClearMsgPanel(); // Shows the net ZONE_SETTINGS zoneInfo = GetZoneSettings(); zoneInfo.m_NetcodeSelection = aZone->GetNetCode(); SetZoneSettings( zoneInfo ); msg = aZone->GetNetname(); if( msg.IsEmpty() ) msg = wxT( "No net" ); AppendMsgPanel( _( "NetName" ), msg, RED ); wxBusyCursor dummy; // Shows an hourglass cursor (removed by its destructor) aZone->BuildFilledSolidAreasPolygons( GetBoard() ); GetGalCanvas()->GetView()->Update( aZone, KIGFX::ALL ); GetBoard()->GetRatsnest()->Update( aZone ); OnModify(); return 0; }
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(); }
/* Initialize the drawing of a segment of type other than trace. */ DRAWSEGMENT* PCB_EDIT_FRAME::Begin_DrawSegment( DRAWSEGMENT* Segment, STROKE_T shape, wxDC* DC ) { int lineWidth; DRAWSEGMENT* DrawItem; lineWidth = GetDesignSettings().GetLineThickness( GetActiveLayer() ); if( Segment == NULL ) // Create new segment. { SetCurItem( Segment = new DRAWSEGMENT( GetBoard() ) ); Segment->SetFlags( IS_NEW ); Segment->SetLayer( GetActiveLayer() ); Segment->SetWidth( lineWidth ); Segment->SetShape( shape ); Segment->SetAngle( 900 ); Segment->SetStart( GetCrossHairPosition() ); Segment->SetEnd( GetCrossHairPosition() ); m_canvas->SetMouseCapture( DrawSegment, Abort_EditEdge ); } else { // The ending point coordinate Segment->m_End was updated by the function // DrawSegment() called on a move mouse event during the segment creation if( Segment->GetStart() != Segment->GetEnd() ) { if( Segment->GetShape() == S_SEGMENT ) { SaveCopyInUndoList( Segment, UR_NEW ); GetBoard()->Add( Segment ); OnModify(); Segment->ClearFlags(); Segment->Draw( m_canvas, DC, GR_OR ); DrawItem = Segment; SetCurItem( Segment = new DRAWSEGMENT( GetBoard() ) ); Segment->SetFlags( IS_NEW ); Segment->SetLayer( DrawItem->GetLayer() ); Segment->SetWidth( lineWidth ); Segment->SetShape( DrawItem->GetShape() ); Segment->SetType( DrawItem->GetType() ); Segment->SetAngle( DrawItem->GetAngle() ); Segment->SetStart( DrawItem->GetEnd() ); Segment->SetEnd( DrawItem->GetEnd() ); DrawSegment( m_canvas, DC, wxDefaultPosition, false ); } else { End_Edge( Segment, DC ); Segment = NULL; } } } return Segment; }
void PCB_EDIT_FRAME::Block_Delete() { OnModify(); SetCurItem( NULL ); PICKED_ITEMS_LIST* itemsList = &GetScreen()->m_BlockLocate.GetItems(); itemsList->m_Status = UR_DELETED; // unlink items and clear flags for( unsigned ii = 0; ii < itemsList->GetCount(); ii++ ) { BOARD_ITEM* item = (BOARD_ITEM*) itemsList->GetPickedItem( ii ); itemsList->SetPickedItemStatus( UR_DELETED, ii ); GetBoard()->GetConnectivity()->Remove( item ); switch( item->Type() ) { case PCB_MODULE_T: { MODULE* module = (MODULE*) item; module->ClearFlags(); module->UnLink(); m_Pcb->m_Status_Pcb = 0; } break; case PCB_ZONE_AREA_T: // a zone area m_Pcb->Remove( item ); break; case PCB_LINE_T: // a segment not on copper layers case PCB_TEXT_T: // a text on a layer case PCB_TRACE_T: // a track segment (segment on a copper layer) case PCB_VIA_T: // a via (like track segment on a copper layer) case PCB_DIMENSION_T: // a dimension (graphic item) case PCB_TARGET_T: // a target (graphic item) item->UnLink(); break; // These items are deleted, but not put in undo list case PCB_MARKER_T: // a marker used to show something case PCB_ZONE_T: // SEG_ZONE items are now deprecated item->UnLink(); itemsList->RemovePicker( ii ); ii--; item->DeleteStructure(); break; default: wxMessageBox( wxT( "PCB_EDIT_FRAME::Block_Delete( ) error: unexpected type" ) ); break; } } SaveCopyInUndoList( *itemsList, UR_DELETED ); Compile_Ratsnest( NULL, true ); m_canvas->Refresh( true ); }
void PCB_EDIT_FRAME::Block_Flip() { #define INVERT( pos ) (pos) = center.y - ( (pos) - center.y ) wxPoint memo; wxPoint center; // Position of the axis for inversion of all elements OnModify(); PICKED_ITEMS_LIST* itemsList = &GetScreen()->m_BlockLocate.GetItems(); itemsList->m_Status = UR_FLIPPED; memo = GetCrossHairPosition(); center = GetScreen()->m_BlockLocate.Centre(); for( unsigned ii = 0; ii < itemsList->GetCount(); ii++ ) { BOARD_ITEM* item = (BOARD_ITEM*) itemsList->GetPickedItem( ii ); wxASSERT( item ); itemsList->SetPickedItemStatus( UR_FLIPPED, ii ); item->Flip( center ); switch( item->Type() ) { case PCB_MODULE_T: item->ClearFlags(); m_Pcb->m_Status_Pcb = 0; break; // Move and rotate the track segments case PCB_TRACE_T: // a track segment (segment on a copper layer) case PCB_VIA_T: // a via (like track segment on a copper layer) m_Pcb->m_Status_Pcb = 0; break; case PCB_ZONE_AREA_T: case PCB_LINE_T: case PCB_TEXT_T: case PCB_TARGET_T: case PCB_DIMENSION_T: break; // This item is not put in undo list case PCB_ZONE_T: // SEG_ZONE items are now deprecated itemsList->RemovePicker( ii ); ii--; break; default: wxMessageBox( wxT( "PCB_EDIT_FRAME::Block_Flip( ) error: unexpected type" ) ); break; } } SaveCopyInUndoList( *itemsList, UR_FLIPPED, center ); Compile_Ratsnest( NULL, true ); m_canvas->Refresh( true ); }
void PCB_EDIT_FRAME::Delete_Drawings_All_Layer( PCB_LAYER_ID aLayer ) { if( IsCopperLayer( aLayer ) ) { DisplayError( this, _( "Copper layer global delete not allowed!" ) ); return; } wxString msg; msg.Printf( _( "Delete everything on layer %s?" ), GetChars( GetBoard()->GetLayerName( aLayer ) ) ); if( !IsOK( this, msg ) ) return; // Step 1: build the list of items to remove. // because we are using iterators, we cannot modify the drawing list during iterate // so we are using a 2 steps calculation: // First, collect items. // Second, remove items. std::vector<BOARD_ITEM*> list; for( auto item : GetBoard()->Drawings() ) { switch( item->Type() ) { case PCB_LINE_T: case PCB_TEXT_T: case PCB_DIMENSION_T: case PCB_TARGET_T: if( item->GetLayer() == aLayer ) list.push_back( item ); break; default: wxLogDebug( wxT( "Delete_Drawings_All_Layer() error: unknown type %d" ), item->Type() ); } } if( list.size() == 0 ) // No item found return; // Step 2: remove items from main list, and move them to the undo list PICKED_ITEMS_LIST pickList; ITEM_PICKER picker( NULL, UR_DELETED ); for( auto item : list ) { item->UnLink(); picker.SetItem( item ); pickList.PushItem( picker ); } OnModify(); SaveCopyInUndoList(pickList, UR_DELETED); }
void PCB_EDIT_FRAME::Block_Rotate() { wxPoint oldpos; wxPoint centre; // rotation cent-re for the rotation transform int rotAngle = 900; // rotation angle in 0.1 deg. oldpos = GetScreen()->GetCrossHairPosition(); centre = GetScreen()->m_BlockLocate.Centre(); OnModify(); PICKED_ITEMS_LIST* itemsList = &GetScreen()->m_BlockLocate.m_ItemsSelection; itemsList->m_Status = UR_ROTATED; for( unsigned ii = 0; ii < itemsList->GetCount(); ii++ ) { BOARD_ITEM* item = (BOARD_ITEM*) itemsList->GetPickedItem( ii ); wxASSERT( item ); itemsList->SetPickedItemStatus( UR_ROTATED, ii ); item->Rotate( centre, rotAngle ); switch( item->Type() ) { case PCB_MODULE_T: ( (MODULE*) item )->ClearFlags(); m_Pcb->m_Status_Pcb = 0; break; /* Move and rotate the track segments */ case PCB_TRACE_T: // a track segment (segment on a copper layer) case PCB_VIA_T: // a via (like track segment on a copper layer) m_Pcb->m_Status_Pcb = 0; break; case PCB_ZONE_AREA_T: case PCB_LINE_T: case PCB_TEXT_T: case PCB_TARGET_T: case PCB_DIMENSION_T: break; // This item is not put in undo list case PCB_ZONE_T: // SEG_ZONE items are now deprecated itemsList->RemovePicker( ii ); ii--; break; default: wxMessageBox( wxT( "PCB_EDIT_FRAME::Block_Rotate( ) error: unexpected type" ) ); break; } } SaveCopyInUndoList( *itemsList, UR_ROTATED, centre ); Compile_Ratsnest( NULL, true ); m_canvas->Refresh( true ); }
void PCB_EDIT_FRAME::Remove_Zone_Corner( wxDC* DC, ZONE_CONTAINER* aZone ) { OnModify(); if( aZone->m_Poly->GetNumCorners() <= 3 ) { m_canvas->RefreshDrawingRect( aZone->GetBoundingBox() ); if( DC ) { // Remove the full zone because this is no more an area aZone->UnFill(); aZone->DrawFilledArea( m_canvas, DC, GR_XOR ); } GetBoard()->Delete( aZone ); return; } int layer = aZone->GetLayer(); if( DC ) { GetBoard()->RedrawAreasOutlines( m_canvas, DC, GR_XOR, layer ); GetBoard()->RedrawFilledAreas( m_canvas, DC, GR_XOR, layer ); } s_AuxiliaryList.ClearListAndDeleteItems(); s_PickedList. ClearListAndDeleteItems(); SaveCopyOfZones( s_PickedList, GetBoard(), aZone->GetNet(), aZone->GetLayer() ); aZone->m_Poly->DeleteCorner( aZone->m_CornerSelection ); // modify zones outlines according to the new aZone shape GetBoard()->OnAreaPolygonModified( &s_AuxiliaryList, aZone ); if( DC ) { GetBoard()->RedrawAreasOutlines( m_canvas, DC, GR_OR, layer ); GetBoard()->RedrawFilledAreas( m_canvas, DC, GR_OR, layer ); } UpdateCopyOfZonesList( s_PickedList, s_AuxiliaryList, GetBoard() ); SaveCopyInUndoList(s_PickedList, UR_UNSPECIFIED); s_PickedList.ClearItemsList(); // s_ItemsListPicker is no more owner of picked items int ii = GetBoard()->GetAreaIndex( aZone ); // test if aZone exists if( ii < 0 ) aZone = NULL; // aZone does not exist anymore, after combining zones int error_count = GetBoard()->Test_Drc_Areas_Outlines_To_Areas_Outlines( aZone, true ); if( error_count ) { DisplayError( this, _( "Area: DRC outline error" ) ); } }
void SCH_EDIT_FRAME::OnSelectUnit( wxCommandEvent& aEvent ) { SCH_SCREEN* screen = GetScreen(); SCH_ITEM* item = screen->GetCurItem(); wxCHECK_RET( item != NULL && item->Type() == SCH_COMPONENT_T, wxT( "Cannot select unit of invalid schematic item." ) ); INSTALL_UNBUFFERED_DC( dc, m_canvas ); m_canvas->MoveCursorToCrossHair(); SCH_COMPONENT* component = (SCH_COMPONENT*) item; int unit = aEvent.GetId() + 1 - ID_POPUP_SCH_SELECT_UNIT1; LIB_PART* part = GetLibPart( component->GetLibId() ); if( !part ) return; int unitCount = part->GetUnitCount(); wxCHECK_RET( (unit >= 1) && (unit <= unitCount), wxString::Format( wxT( "Cannot select unit %d from component " ), unit ) + part->GetName() ); if( unitCount <= 1 || component->GetUnit() == unit ) return; if( unit > unitCount ) unit = unitCount; STATUS_FLAGS flags = component->GetFlags(); if( !flags ) // No command in progress: save in undo list SaveCopyInUndoList( component, UR_CHANGED ); if( flags ) component->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode, g_GhostColor ); else component->Draw( m_canvas, &dc, wxPoint( 0, 0 ), g_XorMode ); /* Update the unit number. */ component->SetUnitSelection( m_CurrentSheet, unit ); component->SetUnit( unit ); component->ClearFlags(); component->SetFlags( flags ); // Restore m_Flag modified by SetUnit() if( m_autoplaceFields ) component->AutoAutoplaceFields( GetScreen() ); if( screen->TestDanglingEnds() ) m_canvas->Refresh(); OnModify(); }