/** * Process an area that has been modified, by clipping its polygon against * itself and the polygons for any other areas on the same net. * This may change the number and order of copper areas in the net. * @param aModifiedZonesList = a PICKED_ITEMS_LIST * where to store deleted or added areas * (useful in undo commands can be NULL * @param modified_area = area to test * @param bMessageBoxArc if true, shows message when clipping can't be done due to arcs. * @param bMessageBoxInt == true, shows message when clipping occurs. * @return : * -1 if arcs intersect other sides, so polygon can't be clipped * 0 if no intersecting sides * 1 if intersecting sides, polygon clipped */ int BOARD::AreaPolygonModified( PICKED_ITEMS_LIST* aModifiedZonesList, ZONE_CONTAINER* modified_area, bool bMessageBoxArc, bool bMessageBoxInt ) { // clip polygon against itself int test = ClipAreaPolygon( aModifiedZonesList, modified_area, bMessageBoxArc, bMessageBoxInt ); if( test == -1 ) return test; // now see if we need to clip against other areas int layer = modified_area->GetLayer(); bool bCheckAllAreas = false; if( test == 1 ) bCheckAllAreas = true; else bCheckAllAreas = TestAreaIntersections( modified_area ); if( bCheckAllAreas ) CombineAllAreasInNet( aModifiedZonesList, modified_area->GetNet(), bMessageBoxInt, true ); if( layer >= FIRST_NO_COPPER_LAYER ) // Refill non copper zones on this layer { if( m_ZoneDescriptorList.size() > 0 ) { for( unsigned ia = 0; ia < m_ZoneDescriptorList.size(); ia++ ) if( m_ZoneDescriptorList[ia]->GetLayer() == layer ) m_ZoneDescriptorList[ia]->BuildFilledPolysListData( this ); } } // Test for bad areas: all zones must have more than 2 corners: // Note: should not happen, but just in case. for( unsigned ia1 = 0; ia1 < m_ZoneDescriptorList.size() - 1; ) { ZONE_CONTAINER* zone = m_ZoneDescriptorList[ia1]; if( zone->GetNumCorners() >= 3 ) ia1++; else // Remove zone because it is incorrect: RemoveArea( aModifiedZonesList, zone ); } return test; }
bool BOARD::OnAreaPolygonModified( PICKED_ITEMS_LIST* aModifiedZonesList, ZONE_CONTAINER* modified_area ) { // clip polygon against itself bool modified = NormalizeAreaPolygon( aModifiedZonesList, modified_area ); // now see if we need to clip against other areas /* LAYER_NUM layer = modified_area->GetLayer(); */ bool bCheckAllAreas = TestAreaIntersections( modified_area ); if( bCheckAllAreas ) { modified = true; CombineAllAreasInNet( aModifiedZonesList, modified_area->GetNetCode(), true ); } /* FIXME : do we really need this? if( !IsCopperLayer( layer ) ) // Refill non copper zones on this layer { for( unsigned ia = 0; ia < m_ZoneDescriptorList.size(); ia++ ) if( m_ZoneDescriptorList[ia]->GetLayer() == layer ) m_ZoneDescriptorList[ia]->BuildFilledSolidAreasPolygons( this ); } */ // Test for bad areas: all zones must have more than 2 corners: // Note: should not happen, but just in case. for( unsigned ii = 0; ii < m_ZoneDescriptorList.size(); ) { ZONE_CONTAINER* zone = m_ZoneDescriptorList[ii]; if( zone->GetNumCorners() >= 3 ) ii++; else // Remove zone because it is incorrect: RemoveArea( aModifiedZonesList, zone ); } return modified; }