EasyEDA Std import: support multiple consecutive arc parameter sets.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21238

(cherry picked from commit 90f5cbf0034a1f08a40836259bd3e2f65a59e193)
This commit is contained in:
Alex Shvartzkop 2025-07-02 18:03:24 +03:00
parent adf8d6626f
commit be9ce460f8

View File

@ -211,41 +211,59 @@ EASYEDA_PARSER_BASE::ParseLineChains( const wxString& data, int aMaxError, bool
} }
else if( sym == 'A' ) else if( sym == 'A' )
{ {
wxString radX, radY, unknown, farFlag, cwFlag, endX, endY; // Arc command can have multiple consecutive arc parameter sets
while( true )
{
if( pos >= data.size() )
break;
readNumber( radX ); wxUniChar ch = data[pos];
readNumber( radY );
readNumber( unknown );
readNumber( farFlag );
readNumber( cwFlag );
readNumber( endX );
readNumber( endY );
bool isFar = farFlag == wxS( "1" ); while( ch == ' ' || ch == ',' )
bool cw = cwFlag == wxS( "1" ); {
VECTOR2D rad( Convert( radX ), Convert( radY ) ); if( ++pos >= data.size() )
VECTOR2D end( Convert( endX ), Convert( endY ) ); break;
VECTOR2D start = prevPt; ch = data[pos];
VECTOR2D delta = end - start; }
double d = delta.EuclideanNorm(); if( !isdigit( ch ) && ch != '-' )
double h = sqrt( std::max( 0.0, rad.x * rad.x - d * d / 4 ) ); break;
//( !far && cw ) => h wxString radX, radY, unknown, farFlag, cwFlag, endX, endY;
//( far && cw ) => -h
//( !far && !cw ) => -h
//( far && !cw ) => h
VECTOR2D arcCenter =
start + delta / 2 + delta.Perpendicular().Resize( ( isFar ^ cw ) ? h : -h );
SHAPE_ARC arc; readNumber( radX );
arc.ConstructFromStartEndCenter( RelPos( start ), RelPos( end ), RelPos( arcCenter ), readNumber( radY );
!cw ); readNumber( unknown );
readNumber( farFlag );
readNumber( cwFlag );
readNumber( endX );
readNumber( endY );
chain.Append( arc, aMaxError ); bool isFar = farFlag == wxS( "1" );
bool cw = cwFlag == wxS( "1" );
VECTOR2D rad( Convert( radX ), Convert( radY ) );
VECTOR2D end( Convert( endX ), Convert( endY ) );
prevPt = end; VECTOR2D start = prevPt;
VECTOR2D delta = end - start;
double d = delta.EuclideanNorm();
double h = sqrt( std::max( 0.0, rad.x * rad.x - d * d / 4 ) );
//( !far && cw ) => h
//( far && cw ) => -h
//( !far && !cw ) => -h
//( far && !cw ) => h
VECTOR2D arcCenter = start + delta / 2 + delta.Perpendicular().Resize( ( isFar ^ cw ) ? h : -h );
SHAPE_ARC arc;
arc.ConstructFromStartEndCenter( RelPos( start ), RelPos( end ), RelPos( arcCenter ), !cw );
chain.Append( arc, aMaxError );
prevPt = end;
}
} }
else if( sym == 'C' ) else if( sym == 'C' )
{ {