// Create CPolyLine for a pad // CPolyLine * CPolyLine::MakePolylineForPad( int type, int x, int y, int w, int l, int r, int angle ) { CPolyLine * poly = new CPolyLine; int dx = l/2; int dy = w/2; if( angle%180 == 90 ) { dx = w/2; dy = l/2; } if( type == PAD_ROUND ) { poly->Start( 0, 0, 0, x-dx, y, 0, NULL, NULL ); poly->AppendCorner( x, y+dy, ARC_CW, 0 ); poly->AppendCorner( x+dx, y, ARC_CW, 0 ); poly->AppendCorner( x, y-dy, ARC_CW, 0 ); poly->Close( ARC_CW ); } return poly; }
// Use the General Polygon Clipping Library to clip contours // If this results in new polygons, return them as CArray p // If bRetainArcs == TRUE, try to retain arcs in polys // Returns number of external contours, or -1 if error // int CPolyLine::NormalizeWithGpc( CArray<CPolyLine*> * pa, BOOL bRetainArcs ) { CArray<CArc> arc_array; if( bRetainArcs ) MakeGpcPoly( -1, &arc_array ); else MakeGpcPoly( -1, NULL ); Undraw(); // now, recreate poly // first, find outside contours and create new CPolyLines if necessary int n_ext_cont = 0; for( int ic=0; ic<m_gpc_poly->num_contours; ic++ ) { if( !(m_gpc_poly->hole)[ic] ) { if( n_ext_cont == 0 ) { // first external contour, replace this poly corner.RemoveAll(); side_style.RemoveAll(); m_ncorners = 0; for( int i=0; i<m_gpc_poly->contour[ic].num_vertices; i++ ) { int x = ((m_gpc_poly->contour)[ic].vertex)[i].x; int y = ((m_gpc_poly->contour)[ic].vertex)[i].y; if( i==0 ) Start( m_layer, m_w, m_sel_box, x, y, m_hatch, &m_id, m_ptr ); else AppendCorner( x, y, STRAIGHT, FALSE ); } Close(); n_ext_cont++; } else if( pa ) { // next external contour, create new poly CPolyLine * poly = new CPolyLine; pa->SetSize(n_ext_cont); // put in array (*pa)[n_ext_cont-1] = poly; for( int i=0; i<m_gpc_poly->contour[ic].num_vertices; i++ ) { int x = ((m_gpc_poly->contour)[ic].vertex)[i].x; int y = ((m_gpc_poly->contour)[ic].vertex)[i].y; if( i==0 ) poly->Start( m_layer, m_w, m_sel_box, x, y, m_hatch, &m_id, m_ptr ); else poly->AppendCorner( x, y, STRAIGHT, FALSE ); } poly->Close( STRAIGHT, FALSE ); n_ext_cont++; } } } // now add cutouts to the CPolyLine(s) for( int ic=0; ic<m_gpc_poly->num_contours; ic++ ) { if( (m_gpc_poly->hole)[ic] ) { CPolyLine * ext_poly = NULL; if( n_ext_cont == 1 ) { ext_poly = this; } else { // find the polygon that contains this hole for( int i=0; i<m_gpc_poly->contour[ic].num_vertices; i++ ) { int x = ((m_gpc_poly->contour)[ic].vertex)[i].x; int y = ((m_gpc_poly->contour)[ic].vertex)[i].y; if( TestPointInside( x, y ) ) ext_poly = this; else { for( int ext_ic=0; ext_ic<n_ext_cont-1; ext_ic++ ) { if( (*pa)[ext_ic]->TestPointInside( x, y ) ) { ext_poly = (*pa)[ext_ic]; break; } } } if( ext_poly ) break; } } if( !ext_poly ) ASSERT(0); for( int i=0; i<m_gpc_poly->contour[ic].num_vertices; i++ ) { int x = ((m_gpc_poly->contour)[ic].vertex)[i].x; int y = ((m_gpc_poly->contour)[ic].vertex)[i].y; ext_poly->AppendCorner( x, y, STRAIGHT, FALSE ); } ext_poly->Close( STRAIGHT, FALSE ); } } if( bRetainArcs ) RestoreArcs( &arc_array, pa ); FreeGpcPoly(); return n_ext_cont; }