void POINT_EDITOR::removeCorner( EDIT_POINT* aPoint ) { EDA_ITEM* item = m_editPoints->GetParent(); if( item->Type() == PCB_ZONE_AREA_T ) { const SELECTION& selection = m_selectionTool->GetSelection(); PCB_BASE_FRAME* frame = getEditFrame<PCB_BASE_FRAME>(); ZONE_CONTAINER* zone = static_cast<ZONE_CONTAINER*>( item ); CPolyLine* outline = zone->Outline(); for( int i = 0; i < outline->GetCornersCount(); ++i ) { if( VECTOR2I( outline->GetPos( i ) ) == aPoint->GetPosition() ) { frame->OnModify(); frame->SaveCopyInUndoList( selection.items, UR_CHANGED ); outline->DeleteCorner( i ); setEditedPoint( NULL ); break; } } } }
// Restore arcs to a polygon where they were replaced with steps // If pa != NULL, also use polygons in pa array // int CPolyLine::RestoreArcs( CArray<CArc> * arc_array, CArray<CPolyLine*> * pa ) { // get poly info int n_polys = 1; if( pa ) n_polys += pa->GetSize(); CPolyLine * poly; // undraw polys and clear utility flag for all corners for( int ip=0; ip<n_polys; ip++ ) { if( ip == 0 ) poly = this; else poly = (*pa)[ip-1]; poly->Undraw(); for( int ic=0; ic<poly->GetNumCorners(); ic++ ) poly->SetUtility( ic, 0 ); // clear utility flag } // find arcs and replace them BOOL bFound; int arc_start; int arc_end; for( int iarc=0; iarc<arc_array->GetSize(); iarc++ ) { int arc_xi = (*arc_array)[iarc].xi; int arc_yi = (*arc_array)[iarc].yi; int arc_xf = (*arc_array)[iarc].xf; int arc_yf = (*arc_array)[iarc].yf; int n_steps = (*arc_array)[iarc].n_steps; int style = (*arc_array)[iarc].style; bFound = FALSE; // loop through polys for( int ip=0; ip<n_polys; ip++ ) { if( ip == 0 ) poly = this; else poly = (*pa)[ip-1]; for( int icont=0; icont<poly->GetNumContours(); icont++ ) { int ic_start = poly->GetContourStart(icont); int ic_end = poly->GetContourEnd(icont); if( (ic_end-ic_start) > n_steps ) { for( int ic=ic_start; ic<=ic_end; ic++ ) { int ic_next = ic+1; if( ic_next > ic_end ) ic_next = ic_start; int xi = poly->GetX(ic); int yi = poly->GetY(ic); if( xi == arc_xi && yi == arc_yi ) { // test for forward arc int ic2 = ic + n_steps; if( ic2 > ic_end ) ic2 = ic2 - ic_end + ic_start - 1; int xf = poly->GetX(ic2); int yf = poly->GetY(ic2); if( xf == arc_xf && yf == arc_yf ) { // arc from ic to ic2 bFound = TRUE; arc_start = ic; arc_end = ic2; } else { // try reverse arc ic2 = ic - n_steps; if( ic2 < ic_start ) ic2 = ic2 - ic_start + ic_end + 1; xf = poly->GetX(ic2); yf = poly->GetY(ic2); if( xf == arc_xf && yf == arc_yf ) { // arc from ic2 to ic bFound = TRUE; arc_start = ic2; arc_end = ic; style = 3 - style; } } if( bFound ) { poly->side_style[arc_start] = style; // mark corners for deletion from arc_start+1 to arc_end-1 for( int i=arc_start+1; i!=arc_end; ) { if( i > ic_end ) i = ic_start; poly->SetUtility( i, 1 ); if( i == ic_end ) i = ic_start; else i++; } break; } } if( bFound ) break; } } if( bFound ) break; } } if( bFound ) (*arc_array)[iarc].bFound = TRUE; } // now delete all marked corners for( int ip=0; ip<n_polys; ip++ ) { if( ip == 0 ) poly = this; else poly = (*pa)[ip-1]; for( int ic=poly->GetNumCorners()-1; ic>=0; ic-- ) { if( poly->GetUtility(ic) ) poly->DeleteCorner( ic, FALSE ); } } return 0; }