/* This function is used to extract a board outlines (3D view, automatic zones build ...) * Any closed outline inside the main outline is a hole * All contours should be closed, i.e. valid closed polygon vertices */ bool BuildBoardPolygonOutlines( BOARD* aBoard, SHAPE_POLY_SET& aOutlines, wxString* aErrorText, unsigned int aTolerance, wxPoint* aErrorLocation ) { PCB_TYPE_COLLECTOR items; // Get all the DRAWSEGMENTS and module graphics into 'items', // then keep only those on layer == Edge_Cuts. static const KICAD_T scan_graphics[] = { PCB_LINE_T, PCB_MODULE_EDGE_T, EOT }; items.Collect( aBoard, scan_graphics ); // Make a working copy of aSegList, because the list is modified during calculations std::vector< DRAWSEGMENT* > segList; for( int ii = 0; ii < items.GetCount(); ii++ ) { if( items[ii]->GetLayer() == Edge_Cuts ) segList.push_back( static_cast< DRAWSEGMENT* >( items[ii] ) ); } bool success = ConvertOutlineToPolygon( segList, aOutlines, aErrorText, aTolerance, aErrorLocation ); if( !success || !aOutlines.OutlineCount() ) { // Creates a valid polygon outline is not possible. // So uses the board edge cuts bounding box to create a // rectangular outline // When no edge cuts items, build a contour // from global bounding box EDA_RECT bbbox = aBoard->GetBoardEdgesBoundingBox(); // If null area, uses the global bounding box. if( ( bbbox.GetWidth() ) == 0 || ( bbbox.GetHeight() == 0 ) ) bbbox = aBoard->ComputeBoundingBox(); // Ensure non null area. If happen, gives a minimal size. if( ( bbbox.GetWidth() ) == 0 || ( bbbox.GetHeight() == 0 ) ) bbbox.Inflate( Millimeter2iu( 1.0 ) ); aOutlines.RemoveAllContours(); aOutlines.NewOutline(); wxPoint corner; aOutlines.Append( bbbox.GetOrigin() ); corner.x = bbbox.GetOrigin().x; corner.y = bbbox.GetEnd().y; aOutlines.Append( corner ); aOutlines.Append( bbbox.GetEnd() ); corner.x = bbbox.GetEnd().x; corner.y = bbbox.GetOrigin().y; aOutlines.Append( corner ); } return success; }
std::vector<LAYER_PAIR> EXCELLON_WRITER::getUniqueLayerPairs() const { wxASSERT( m_pcb ); static const KICAD_T interesting_stuff_to_collect[] = { PCB_VIA_T, EOT }; PCB_TYPE_COLLECTOR vias; vias.Collect( m_pcb, interesting_stuff_to_collect ); std::set< LAYER_PAIR > unique; LAYER_PAIR layer_pair; for( int i = 0; i < vias.GetCount(); ++i ) { VIA* v = (VIA*) vias[i]; v->LayerPair( &layer_pair.first, &layer_pair.second ); // only make note of blind buried. // thru hole is placed unconditionally as first in fetched list. if( layer_pair != LAYER_PAIR( F_Cu, B_Cu ) ) { unique.insert( layer_pair ); } } std::vector<LAYER_PAIR> ret; ret.push_back( LAYER_PAIR( F_Cu, B_Cu ) ); // always first in returned list for( std::set< LAYER_PAIR >::const_iterator it = unique.begin(); it != unique.end(); ++it ) ret.push_back( *it ); return ret; }