Commit 3bd6aa1d authored by charras's avatar charras
Browse files

fixed: a bug that can delete an existing zone after creating a new zone (see changelog)

Switch to RC6
parent a575a8e7
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -5,6 +5,13 @@ Started 2007-June-11
Please add newer entries at the top, list the date and your name with
Please add newer entries at the top, list the date and your name with
email address.
email address.


2009-mar-11 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
++pcbnew:
    fixed: a bug that can delete an existing zone after creating a new zone,
        if the new zone contains this existing zone
        This is a DRC error, buf can be temporary possible when creating complex zones

2009-mar-10 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
2009-mar-10 UPDATE Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
================================================================================
================================================================================
++pcbnew:
++pcbnew:
+1 −1
Original line number Original line Diff line number Diff line
@@ -3,7 +3,7 @@
#ifndef KICAD_BUILD_VERSION
#ifndef KICAD_BUILD_VERSION
#define KICAD_BUILD_VERSION
#define KICAD_BUILD_VERSION


#define BUILD_VERSION wxT("(20090216-RC5)")
#define BUILD_VERSION wxT("(20090216-RC6)")


COMMON_GLOBL wxString g_BuildVersion
COMMON_GLOBL wxString g_BuildVersion
#ifdef EDA_BASE
#ifdef EDA_BASE
+69 −63
Original line number Original line Diff line number Diff line
@@ -336,6 +336,7 @@ int BOARD::AreaPolygonModified( ZONE_CONTAINER* modified_area,
                    m_ZoneDescriptorList[ia]->BuildFilledPolysListData( this );
                    m_ZoneDescriptorList[ia]->BuildFilledPolysListData( this );
        }
        }
    }
    }

    // Test for bad areas: all zones must have more than 2 corners:
    // Test for bad areas: all zones must have more than 2 corners:
    // Note: should not happen, but just in case.
    // Note: should not happen, but just in case.
    for( unsigned ia1 = 0; ia1 < m_ZoneDescriptorList.size() - 1; )
    for( unsigned ia1 = 0; ia1 < m_ZoneDescriptorList.size() - 1; )
@@ -343,10 +344,12 @@ int BOARD::AreaPolygonModified( ZONE_CONTAINER* modified_area,
        ZONE_CONTAINER* zone = m_ZoneDescriptorList[ia1];
        ZONE_CONTAINER* zone = m_ZoneDescriptorList[ia1];
        if( zone->GetNumCorners() >= 3 )
        if( zone->GetNumCorners() >= 3 )
            ia1++;
            ia1++;

        // Remove zone because it is incorrect:
        // Remove zone because it is incorrect:
        else
        else
            RemoveArea( zone );
            RemoveArea( zone );
    }
    }

    return test;
    return test;
}
}


@@ -362,8 +365,9 @@ int BOARD::AreaPolygonModified( ZONE_CONTAINER* modified_area,
 */
 */
int BOARD::CombineAllAreasInNet( int aNetCode, bool bMessageBox, bool bUseUtility )
int BOARD::CombineAllAreasInNet( int aNetCode, bool bMessageBox, bool bUseUtility )
{
{
    if( m_ZoneDescriptorList.size() > 1 )
    if( m_ZoneDescriptorList.size() <= 1 )
    {
        return 0;

    // start by testing all area polygons to set utility2 flags
    // start by testing all area polygons to set utility2 flags
    for( unsigned ia = 0; ia < m_ZoneDescriptorList.size(); ia++ )
    for( unsigned ia = 0; ia < m_ZoneDescriptorList.size(); ia++ )
        if( m_ZoneDescriptorList[ia]->GetNet() == aNetCode )
        if( m_ZoneDescriptorList[ia]->GetNet() == aNetCode )
@@ -382,6 +386,8 @@ int BOARD::CombineAllAreasInNet( int aNetCode, bool bMessageBox, bool bUseUtilit
        for( unsigned ia2 = m_ZoneDescriptorList.size() - 1; ia2 > ia1; ia2-- )
        for( unsigned ia2 = m_ZoneDescriptorList.size() - 1; ia2 > ia1; ia2-- )
        {
        {
            ZONE_CONTAINER* area2 = m_ZoneDescriptorList[ia2];
            ZONE_CONTAINER* area2 = m_ZoneDescriptorList[ia2];
            if( area2->GetNet() != aNetCode )
                continue;
            if( curr_area->GetLayer() == area2->GetLayer()
            if( curr_area->GetLayer() == area2->GetLayer()
                && curr_area->utility2 != -1 && area2->utility2 != -1 )
                && curr_area->utility2 != -1 && area2->utility2 != -1 )
            {
            {
@@ -423,7 +429,6 @@ int BOARD::CombineAllAreasInNet( int aNetCode, bool bMessageBox, bool bUseUtilit
        if( mod_ia1 )
        if( mod_ia1 )
            ia1--;     // if modified, we need to check it again
            ia1--;     // if modified, we need to check it again
    }
    }
    }


    return 0;
    return 0;
}
}
@@ -991,7 +996,8 @@ bool DRC::doEdgeZoneDrc( ZONE_CONTAINER* aArea, int aCornerIndex )
    for( int ia2 = 0; ia2 < m_pcb->GetAreaCount(); ia2++ )
    for( int ia2 = 0; ia2 < m_pcb->GetAreaCount(); ia2++ )
    {
    {
        ZONE_CONTAINER* Area_To_Test   = m_pcb->GetArea( ia2 );
        ZONE_CONTAINER* Area_To_Test   = m_pcb->GetArea( ia2 );
        int zone_clearance = max(Area_To_Test->m_ZoneClearance, aArea->m_ZoneClearance);
        int             zone_clearance = max( Area_To_Test->m_ZoneClearance,
                                              aArea->m_ZoneClearance );


        // test for same layer
        // test for same layer
        if( Area_To_Test->GetLayer() != aArea->GetLayer() )
        if( Area_To_Test->GetLayer() != aArea->GetLayer() )