mirror of
https://gitlab.com/kicad/code/kicad.git
synced 2025-09-14 10:13:19 +02:00
Slice() must also support aMaxError.
In some cases arcs are re-inserted.
This commit is contained in:
parent
bfa61dc8ad
commit
241959bca3
@ -623,7 +623,8 @@ public:
|
|||||||
* @param aEndIndex is the end of the point range to be returned (inclusive).
|
* @param aEndIndex is the end of the point range to be returned (inclusive).
|
||||||
* @return the cut line chain.
|
* @return the cut line chain.
|
||||||
*/
|
*/
|
||||||
const SHAPE_LINE_CHAIN Slice( int aStartIndex, int aEndIndex = -1 ) const;
|
const SHAPE_LINE_CHAIN Slice( int aStartIndex, int aEndIndex ) const;
|
||||||
|
const SHAPE_LINE_CHAIN Slice( int aStartIndex, int aEndIndex, int aMaxError ) const;
|
||||||
|
|
||||||
struct compareOriginDistance
|
struct compareOriginDistance
|
||||||
{
|
{
|
||||||
|
@ -1398,6 +1398,12 @@ void SHAPE_LINE_CHAIN::RemoveShape( int aPointIndex )
|
|||||||
|
|
||||||
|
|
||||||
const SHAPE_LINE_CHAIN SHAPE_LINE_CHAIN::Slice( int aStartIndex, int aEndIndex ) const
|
const SHAPE_LINE_CHAIN SHAPE_LINE_CHAIN::Slice( int aStartIndex, int aEndIndex ) const
|
||||||
|
{
|
||||||
|
return Slice( aStartIndex, aEndIndex, getArcPolygonizationMaxError() );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const SHAPE_LINE_CHAIN SHAPE_LINE_CHAIN::Slice( int aStartIndex, int aEndIndex, int aMaxError ) const
|
||||||
{
|
{
|
||||||
SHAPE_LINE_CHAIN rv;
|
SHAPE_LINE_CHAIN rv;
|
||||||
|
|
||||||
@ -1498,7 +1504,7 @@ const SHAPE_LINE_CHAIN SHAPE_LINE_CHAIN::Slice( int aStartIndex, int aEndIndex )
|
|||||||
{
|
{
|
||||||
// append the whole arc
|
// append the whole arc
|
||||||
const SHAPE_ARC& currentArc = Arc( ArcIndex( i ) );
|
const SHAPE_ARC& currentArc = Arc( ArcIndex( i ) );
|
||||||
rv.Append( currentArc );
|
rv.Append( currentArc, aMaxError );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( isLastShape )
|
if( isLastShape )
|
||||||
@ -1506,8 +1512,7 @@ const SHAPE_LINE_CHAIN SHAPE_LINE_CHAIN::Slice( int aStartIndex, int aEndIndex )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
wxASSERT_MSG( !IsArcSegment( i ),
|
wxASSERT_MSG( !IsArcSegment( i ), wxT( "Still on an arc segment, we missed something..." ) );
|
||||||
wxT( "Still on an arc segment, we missed something..." ) );
|
|
||||||
|
|
||||||
if( i == aStartIndex )
|
if( i == aStartIndex )
|
||||||
rv.Append( m_points[i] );
|
rv.Append( m_points[i] );
|
||||||
|
@ -924,7 +924,7 @@ BOOST_AUTO_TEST_CASE( Slice )
|
|||||||
//////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////
|
||||||
BOOST_TEST_CONTEXT( "Case 1: Start at arc endpoint, finish middle of arc" )
|
BOOST_TEST_CONTEXT( "Case 1: Start at arc endpoint, finish middle of arc" )
|
||||||
{
|
{
|
||||||
SHAPE_LINE_CHAIN sliceResult = chain.Slice( 9, 18 );
|
SHAPE_LINE_CHAIN sliceResult = chain.Slice( 9, 18, ARC_HIGH_DEF );
|
||||||
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
||||||
|
|
||||||
BOOST_CHECK_EQUAL( sliceResult.ArcCount(), 1 );
|
BOOST_CHECK_EQUAL( sliceResult.ArcCount(), 1 );
|
||||||
@ -959,7 +959,7 @@ BOOST_AUTO_TEST_CASE( Slice )
|
|||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
BOOST_TEST_CONTEXT( "Case 2: Start at middle of an arc, finish at arc startpoint" )
|
BOOST_TEST_CONTEXT( "Case 2: Start at middle of an arc, finish at arc startpoint" )
|
||||||
{
|
{
|
||||||
SHAPE_LINE_CHAIN sliceResult = chain.Slice( 5, 12 );
|
SHAPE_LINE_CHAIN sliceResult = chain.Slice( 5, 12, ARC_HIGH_DEF );
|
||||||
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
||||||
|
|
||||||
BOOST_CHECK_EQUAL( sliceResult.ArcCount(), 1 );
|
BOOST_CHECK_EQUAL( sliceResult.ArcCount(), 1 );
|
||||||
@ -998,7 +998,7 @@ BOOST_AUTO_TEST_CASE( Slice )
|
|||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
BOOST_TEST_CONTEXT( "Case 3: Full arc, nothing else" )
|
BOOST_TEST_CONTEXT( "Case 3: Full arc, nothing else" )
|
||||||
{
|
{
|
||||||
SHAPE_LINE_CHAIN sliceResult = chain.Slice( 3, 9 );
|
SHAPE_LINE_CHAIN sliceResult = chain.Slice( 3, 9, ARC_HIGH_DEF );
|
||||||
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
||||||
|
|
||||||
BOOST_CHECK_EQUAL( sliceResult.ArcCount(), 1 );
|
BOOST_CHECK_EQUAL( sliceResult.ArcCount(), 1 );
|
||||||
@ -1028,7 +1028,7 @@ BOOST_AUTO_TEST_CASE( Slice )
|
|||||||
//////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////
|
||||||
BOOST_TEST_CONTEXT( "Case 4: Full arc, and straight segments to next arc start" )
|
BOOST_TEST_CONTEXT( "Case 4: Full arc, and straight segments to next arc start" )
|
||||||
{
|
{
|
||||||
SHAPE_LINE_CHAIN sliceResult = chain.Slice( 3, 12 );
|
SHAPE_LINE_CHAIN sliceResult = chain.Slice( 3, 12, ARC_HIGH_DEF );
|
||||||
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
||||||
|
|
||||||
BOOST_CHECK_EQUAL( sliceResult.ArcCount(), 1 );
|
BOOST_CHECK_EQUAL( sliceResult.ArcCount(), 1 );
|
||||||
@ -1062,7 +1062,7 @@ BOOST_AUTO_TEST_CASE( Slice )
|
|||||||
SHAPE_LINE_CHAIN chainCopy = chain;
|
SHAPE_LINE_CHAIN chainCopy = chain;
|
||||||
chainCopy.Append( VECTOR2I( 400000, 400000 ) );
|
chainCopy.Append( VECTOR2I( 400000, 400000 ) );
|
||||||
|
|
||||||
SHAPE_LINE_CHAIN sliceResult = chainCopy.Slice( 11, -1 );
|
SHAPE_LINE_CHAIN sliceResult = chainCopy.Slice( 11, -1, ARC_HIGH_DEF );
|
||||||
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
||||||
BOOST_CHECK_EQUAL( sliceResult.GetPoint( -1 ), VECTOR2I( 400000, 400000 ) );
|
BOOST_CHECK_EQUAL( sliceResult.GetPoint( -1 ), VECTOR2I( 400000, 400000 ) );
|
||||||
}
|
}
|
||||||
@ -1071,7 +1071,7 @@ BOOST_AUTO_TEST_CASE( Slice )
|
|||||||
{
|
{
|
||||||
SHAPE_LINE_CHAIN chainCopy = SLC_CASES().OnePoint;
|
SHAPE_LINE_CHAIN chainCopy = SLC_CASES().OnePoint;
|
||||||
|
|
||||||
SHAPE_LINE_CHAIN sliceResult = chainCopy.Slice( 0, -1 );
|
SHAPE_LINE_CHAIN sliceResult = chainCopy.Slice( 0, -1, ARC_HIGH_DEF );
|
||||||
BOOST_CHECK_EQUAL( sliceResult.PointCount(), 1 );
|
BOOST_CHECK_EQUAL( sliceResult.PointCount(), 1 );
|
||||||
BOOST_CHECK_EQUAL( sliceResult.GetPoint( 0 ), VECTOR2I( 233450000, 228360000 ) );
|
BOOST_CHECK_EQUAL( sliceResult.GetPoint( 0 ), VECTOR2I( 233450000, 228360000 ) );
|
||||||
BOOST_CHECK_EQUAL( sliceResult.GetPoint( -1 ), VECTOR2I( 233450000, 228360000 ) ); // Same as index 0
|
BOOST_CHECK_EQUAL( sliceResult.GetPoint( -1 ), VECTOR2I( 233450000, 228360000 ) ); // Same as index 0
|
||||||
@ -1081,7 +1081,7 @@ BOOST_AUTO_TEST_CASE( Slice )
|
|||||||
{
|
{
|
||||||
SHAPE_LINE_CHAIN chainCopy = SLC_CASES().TwoPoints;
|
SHAPE_LINE_CHAIN chainCopy = SLC_CASES().TwoPoints;
|
||||||
|
|
||||||
SHAPE_LINE_CHAIN sliceResult = chainCopy.Slice( 0, -1 );
|
SHAPE_LINE_CHAIN sliceResult = chainCopy.Slice( 0, -1, ARC_HIGH_DEF );
|
||||||
BOOST_CHECK_EQUAL( sliceResult.PointCount(), 2 );
|
BOOST_CHECK_EQUAL( sliceResult.PointCount(), 2 );
|
||||||
BOOST_CHECK_EQUAL( sliceResult.GetPoint( 0 ), VECTOR2I( 233450000, 228360000 ) );
|
BOOST_CHECK_EQUAL( sliceResult.GetPoint( 0 ), VECTOR2I( 233450000, 228360000 ) );
|
||||||
BOOST_CHECK_EQUAL( sliceResult.GetPoint( 1 ), VECTOR2I( 263450000, 258360000 ) );
|
BOOST_CHECK_EQUAL( sliceResult.GetPoint( 1 ), VECTOR2I( 263450000, 258360000 ) );
|
||||||
@ -1090,7 +1090,7 @@ BOOST_AUTO_TEST_CASE( Slice )
|
|||||||
|
|
||||||
BOOST_TEST_CONTEXT( "Case 8: Full 2nd arc, nothing else" )
|
BOOST_TEST_CONTEXT( "Case 8: Full 2nd arc, nothing else" )
|
||||||
{
|
{
|
||||||
SHAPE_LINE_CHAIN sliceResult = chain.Slice( 12, 19 );
|
SHAPE_LINE_CHAIN sliceResult = chain.Slice( 12, 19, ARC_HIGH_DEF );
|
||||||
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
||||||
|
|
||||||
BOOST_CHECK_EQUAL( sliceResult.ArcCount(), 1 );
|
BOOST_CHECK_EQUAL( sliceResult.ArcCount(), 1 );
|
||||||
@ -1117,7 +1117,7 @@ BOOST_AUTO_TEST_CASE( Slice )
|
|||||||
|
|
||||||
BOOST_TEST_CONTEXT( "Case 9: Start at middle of a 2nd arc, finish at end" )
|
BOOST_TEST_CONTEXT( "Case 9: Start at middle of a 2nd arc, finish at end" )
|
||||||
{
|
{
|
||||||
SHAPE_LINE_CHAIN sliceResult = chain.Slice( 16, 19 );
|
SHAPE_LINE_CHAIN sliceResult = chain.Slice( 16, 19, ARC_HIGH_DEF );
|
||||||
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
||||||
|
|
||||||
BOOST_CHECK_EQUAL( sliceResult.ArcCount(), 1 );
|
BOOST_CHECK_EQUAL( sliceResult.ArcCount(), 1 );
|
||||||
@ -1153,7 +1153,7 @@ BOOST_AUTO_TEST_CASE( Slice )
|
|||||||
SHAPE_LINE_CHAIN chain10;
|
SHAPE_LINE_CHAIN chain10;
|
||||||
chain10.Append( firstArc, ARC_HIGH_DEF );
|
chain10.Append( firstArc, ARC_HIGH_DEF );
|
||||||
|
|
||||||
SHAPE_LINE_CHAIN sliceResult = chain10.Slice( 3, 6 );
|
SHAPE_LINE_CHAIN sliceResult = chain10.Slice( 3, 6, ARC_HIGH_DEF );
|
||||||
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
BOOST_CHECK( GEOM_TEST::IsOutlineValid( sliceResult ) );
|
||||||
|
|
||||||
BOOST_CHECK_EQUAL( sliceResult.ArcCount(), 1 );
|
BOOST_CHECK_EQUAL( sliceResult.ArcCount(), 1 );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user