Ensure partially triangulated polys are not valid
Moves rule area triangulation outside of layer iterator and keeps the triangulation_valid flag false until the triangulation has been completed. Fixes https://gitlab.com/kicad/code/kicad/issues/7032
This commit is contained in:
parent
af3789571e
commit
73886aecb1
|
@ -2141,7 +2141,7 @@ void SHAPE_POLY_SET::CacheTriangulation( bool aPartition )
|
||||||
}
|
}
|
||||||
|
|
||||||
m_triangulatedPolys.clear();
|
m_triangulatedPolys.clear();
|
||||||
m_triangulationValid = true;
|
m_triangulationValid = false;
|
||||||
|
|
||||||
while( tmpSet.OutlineCount() > 0 )
|
while( tmpSet.OutlineCount() > 0 )
|
||||||
{
|
{
|
||||||
|
|
|
@ -963,7 +963,7 @@ std::unique_ptr<PNS::VIA> PNS_KICAD_IFACE_BASE::syncVia( VIA* aVia )
|
||||||
|
|
||||||
bool PNS_KICAD_IFACE_BASE::syncZone( PNS::NODE* aWorld, ZONE* aZone, SHAPE_POLY_SET* aBoardOutline )
|
bool PNS_KICAD_IFACE_BASE::syncZone( PNS::NODE* aWorld, ZONE* aZone, SHAPE_POLY_SET* aBoardOutline )
|
||||||
{
|
{
|
||||||
SHAPE_POLY_SET poly;
|
SHAPE_POLY_SET* poly;
|
||||||
|
|
||||||
if( !aZone->GetIsRuleArea() && aZone->GetZoneName().IsEmpty() )
|
if( !aZone->GetIsRuleArea() && aZone->GetZoneName().IsEmpty() )
|
||||||
return false;
|
return false;
|
||||||
|
@ -979,32 +979,32 @@ bool PNS_KICAD_IFACE_BASE::syncZone( PNS::NODE* aWorld, ZONE* aZone, SHAPE_POLY_
|
||||||
LSET layers = aZone->GetLayerSet();
|
LSET layers = aZone->GetLayerSet();
|
||||||
EDA_UNITS units = EDA_UNITS::MILLIMETRES; // TODO: get real units
|
EDA_UNITS units = EDA_UNITS::MILLIMETRES; // TODO: get real units
|
||||||
|
|
||||||
|
poly = aZone->Outline();
|
||||||
|
poly->CacheTriangulation( false );
|
||||||
|
|
||||||
|
if( !poly->IsTriangulationUpToDate() )
|
||||||
|
{
|
||||||
|
KIDIALOG dlg( nullptr, wxString::Format( _( "%s is malformed." ),
|
||||||
|
aZone->GetSelectMenuText( units ) ),
|
||||||
|
KIDIALOG::KD_WARNING );
|
||||||
|
dlg.ShowDetailedText( wxString::Format( _( "This zone cannot be handled by the track "
|
||||||
|
"layout tool.\n"
|
||||||
|
"Please verify it is not a "
|
||||||
|
"self-intersecting polygon." ) ) );
|
||||||
|
dlg.DoNotShowCheckbox( __FILE__, __LINE__ );
|
||||||
|
dlg.ShowModal();
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
for( int layer = F_Cu; layer <= B_Cu; layer++ )
|
for( int layer = F_Cu; layer <= B_Cu; layer++ )
|
||||||
{
|
{
|
||||||
if( ! layers[ layer ] )
|
if( !layers[ layer ] )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
aZone->BuildSmoothedPoly( poly, ToLAYER_ID( layer ), aBoardOutline );
|
for( int outline = 0; outline < poly->OutlineCount(); outline++ )
|
||||||
poly.CacheTriangulation();
|
|
||||||
|
|
||||||
if( !poly.IsTriangulationUpToDate() )
|
|
||||||
{
|
{
|
||||||
KIDIALOG dlg( nullptr, wxString::Format( _( "%s is malformed." ),
|
const SHAPE_POLY_SET::TRIANGULATED_POLYGON* tri = poly->TriangulatedPolygon( outline );
|
||||||
aZone->GetSelectMenuText( units ) ),
|
|
||||||
KIDIALOG::KD_WARNING );
|
|
||||||
dlg.ShowDetailedText( wxString::Format( _( "This zone cannot be handled by the track "
|
|
||||||
"layout tool.\n"
|
|
||||||
"Please verify it is not a "
|
|
||||||
"self-intersecting polygon." ) ) );
|
|
||||||
dlg.DoNotShowCheckbox( __FILE__, __LINE__ );
|
|
||||||
dlg.ShowModal();
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
for( int outline = 0; outline < poly.OutlineCount(); outline++ )
|
|
||||||
{
|
|
||||||
const SHAPE_POLY_SET::TRIANGULATED_POLYGON* tri = poly.TriangulatedPolygon( outline );
|
|
||||||
|
|
||||||
for( size_t i = 0; i < tri->GetTriangleCount(); i++)
|
for( size_t i = 0; i < tri->GetTriangleCount(); i++)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue