mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 02:03:12 +02:00
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:
parent
adf8d6626f
commit
be9ce460f8
@ -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' )
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user