Converted zone drawing tools to store points in a SHAPE_LINE_CHAIN

Simplifies the code a bit, removes redundant conversions to/from
std::vector.
This commit is contained in:
Maciej Suminski 2018-02-19 11:20:52 +01:00
parent 997d4dee4f
commit 7775f59eec
6 changed files with 59 additions and 60 deletions

View File

@ -39,17 +39,17 @@ bool POLYGON_GEOM_MANAGER::AddPoint( const VECTOR2I& aPt )
if( !IsPolygonInProgress() && !m_client.OnFirstPoint( *this ) ) if( !IsPolygonInProgress() && !m_client.OnFirstPoint( *this ) )
return false; return false;
if( m_leaderPts.size() > 1 ) if( m_leaderPts.PointCount() > 1 )
{ {
// there are enough leader points - the next // there are enough leader points - the next
// locked-in point is the end of the first leader // locked-in point is the end of the first leader
// segment // segment
m_lockedPoints.push_back( m_leaderPts[1] ); m_lockedPoints.Append( m_leaderPts.CPoint( 1 ) );
} }
else else
{ {
// no leader lines, directly add the cursor // no leader lines, directly add the cursor
m_lockedPoints.push_back( aPt ); m_lockedPoints.Append( aPt );
} }
m_client.OnGeometryChange( *this ); m_client.OnGeometryChange( *this );
@ -77,28 +77,28 @@ void POLYGON_GEOM_MANAGER::SetCursorPosition( const VECTOR2I& aPos, LEADER_MODE
bool POLYGON_GEOM_MANAGER::IsPolygonInProgress() const bool POLYGON_GEOM_MANAGER::IsPolygonInProgress() const
{ {
return m_lockedPoints.size() > 0; return m_lockedPoints.PointCount() > 0;
} }
bool POLYGON_GEOM_MANAGER::NewPointClosesOutline( const VECTOR2I& aPt ) const bool POLYGON_GEOM_MANAGER::NewPointClosesOutline( const VECTOR2I& aPt ) const
{ {
return m_lockedPoints.size() && m_lockedPoints[0] == aPt; return m_lockedPoints.PointCount() > 0 && m_lockedPoints.CPoint( 0 ) == aPt;
} }
void POLYGON_GEOM_MANAGER::DeleteLastCorner() void POLYGON_GEOM_MANAGER::DeleteLastCorner()
{ {
if( m_lockedPoints.size() > 0 ) if( m_lockedPoints.PointCount() > 0 )
{ {
m_lockedPoints.pop_back(); m_lockedPoints.Remove( m_lockedPoints.PointCount() - 1 );
} }
// update the new last segment (was previously // update the new last segment (was previously
// locked in), reusing last constraints // locked in), reusing last constraints
if( m_lockedPoints.size() > 0 ) if( m_lockedPoints.PointCount() > 0 )
{ {
updateLeaderPoints( m_leaderPts.back() ); updateLeaderPoints( m_leaderPts.CLastPoint() );
} }
m_client.OnGeometryChange( *this ); m_client.OnGeometryChange( *this );
@ -107,8 +107,8 @@ void POLYGON_GEOM_MANAGER::DeleteLastCorner()
void POLYGON_GEOM_MANAGER::Reset() void POLYGON_GEOM_MANAGER::Reset()
{ {
m_lockedPoints.clear(); m_lockedPoints.Clear();
m_leaderPts.clear(); m_leaderPts.Clear();
m_client.OnGeometryChange( *this ); m_client.OnGeometryChange( *this );
} }
@ -116,13 +116,16 @@ void POLYGON_GEOM_MANAGER::Reset()
void POLYGON_GEOM_MANAGER::updateLeaderPoints( const VECTOR2I& aEndPoint, LEADER_MODE aModifier ) void POLYGON_GEOM_MANAGER::updateLeaderPoints( const VECTOR2I& aEndPoint, LEADER_MODE aModifier )
{ {
wxCHECK( m_lockedPoints.PointCount() > 0, /*void*/ );
SHAPE_LINE_CHAIN newChain; SHAPE_LINE_CHAIN newChain;
const VECTOR2I& lastPt = m_lockedPoints.CLastPoint();
if( m_leaderMode == LEADER_MODE::DEG45 || aModifier == LEADER_MODE::DEG45 ) if( m_leaderMode == LEADER_MODE::DEG45 || aModifier == LEADER_MODE::DEG45 )
{ {
// get a restricted 45/H/V line from the last fixed point to the cursor // get a restricted 45/H/V line from the last fixed point to the cursor
DIRECTION_45 direction( m_lockedPoints.back() - aEndPoint ); DIRECTION_45 direction( lastPt - aEndPoint );
newChain = direction.BuildInitialTrace( m_lockedPoints.back(), aEndPoint ); m_leaderPts = direction.BuildInitialTrace( lastPt, aEndPoint );
// Can also add chain back to start, but this rearely produces // Can also add chain back to start, but this rearely produces
// usable result // usable result
@ -132,28 +135,8 @@ void POLYGON_GEOM_MANAGER::updateLeaderPoints( const VECTOR2I& aEndPoint, LEADER
else else
{ {
// direct segment // direct segment
newChain = SHAPE_LINE_CHAIN( m_lockedPoints.back(), aEndPoint ); m_leaderPts = SHAPE_LINE_CHAIN( lastPt, aEndPoint );
}
// rebuild leader point list from the chain
m_leaderPts.clear();
for( int i = 0; i < newChain.PointCount(); ++i )
{
m_leaderPts.push_back( newChain.Point( i ) );
} }
m_client.OnGeometryChange( *this ); m_client.OnGeometryChange( *this );
} }
const std::vector<VECTOR2I>& POLYGON_GEOM_MANAGER::GetLockedInPoints() const
{
return m_lockedPoints;
}
const std::vector<VECTOR2I>& POLYGON_GEOM_MANAGER::GetLeaderLinePoints() const
{
return m_leaderPts;
}

View File

@ -37,26 +37,21 @@ POLYGON_ITEM::POLYGON_ITEM():
{ {
} }
void POLYGON_ITEM::SetPoints( const std::vector<VECTOR2I>& aLockedPts,
const std::vector<VECTOR2I>& aLeaderPts ) void POLYGON_ITEM::SetPoints( const SHAPE_LINE_CHAIN& aLockedInPts,
const SHAPE_LINE_CHAIN& aLeaderPts )
{ {
m_lockedChain.Clear(); m_lockedChain = aLockedInPts;
m_leaderChain.Clear(); m_leaderChain = aLeaderPts;
m_polyfill.RemoveAllContours(); m_polyfill.RemoveAllContours();
m_polyfill.NewOutline(); m_polyfill.NewOutline();
for( auto& pt: aLockedPts ) for( int i = 0; i < aLockedInPts.PointCount(); ++i )
{ m_polyfill.Append( aLockedInPts.CPoint( i ) );
m_lockedChain.Append( pt, false );
m_polyfill.Append( pt );
}
for( auto& pt: aLeaderPts ) for( int i = 0; i < aLeaderPts.PointCount(); ++i )
{ m_polyfill.Append( aLeaderPts.CPoint( i ) );
m_leaderChain.Append( pt, false );
m_polyfill.Append( pt );
}
} }

View File

@ -260,6 +260,22 @@ public:
return m_points[aIndex]; return m_points[aIndex];
} }
/**
* Returns the last point in the line chain.
*/
VECTOR2I& LastPoint()
{
return m_points[PointCount() - 1];
}
/**
* Returns the last point in the line chain.
*/
const VECTOR2I& CLastPoint() const
{
return m_points[PointCount() - 1];
}
/// @copydoc SHAPE::BBox() /// @copydoc SHAPE::BBox()
const BOX2I BBox( int aClearance = 0 ) const override const BOX2I BBox( int aClearance = 0 ) const override
{ {

View File

@ -24,8 +24,7 @@
#ifndef PREVIEW_POLYGON_GEOM_MANAGER__H_ #ifndef PREVIEW_POLYGON_GEOM_MANAGER__H_
#define PREVIEW_POLYGON_GEOM_MANAGER__H_ #define PREVIEW_POLYGON_GEOM_MANAGER__H_
#include <vector> #include <geometry/shape_line_chain.h>
#include <math/vector2d.h>
/** /**
* Class that handles the drawing of a polygon, including * Class that handles the drawing of a polygon, including
@ -48,7 +47,7 @@ public:
/** /**
* Called before the first point is added - clients can do * Called before the first point is added - clients can do
* initialisation here, and can veto the start of the process * initialisation here, and can veto the start of the process
* (eg if user cancels a dialog) * (e.g. if user cancels a dialog)
* *
* @return false to veto start of new polygon * @return false to veto start of new polygon
*/ */
@ -125,7 +124,10 @@ public:
/** /**
* Get the "locked-in" points that describe the polygon itself * Get the "locked-in" points that describe the polygon itself
*/ */
const std::vector<VECTOR2I>& GetLockedInPoints() const; const SHAPE_LINE_CHAIN& GetLockedInPoints() const
{
return m_lockedPoints;
}
/** /**
* Get the points comprising the leader line (the line from the * Get the points comprising the leader line (the line from the
@ -133,7 +135,10 @@ public:
* *
* How this is drawn will depend on the LEADER_MODE * How this is drawn will depend on the LEADER_MODE
*/ */
const std::vector<VECTOR2I>& GetLeaderLinePoints() const; const SHAPE_LINE_CHAIN& GetLeaderLinePoints() const
{
return m_leaderPts;
}
private: private:
@ -151,10 +156,10 @@ private:
LEADER_MODE m_leaderMode; LEADER_MODE m_leaderMode;
///> Point that have been "locked in" ///> Point that have been "locked in"
std::vector<VECTOR2I> m_lockedPoints; SHAPE_LINE_CHAIN m_lockedPoints;
///> Points in the temporary "leader" line(s) ///> Points in the temporary "leader" line(s)
std::vector<VECTOR2I> m_leaderPts; SHAPE_LINE_CHAIN m_leaderPts;
}; };
#endif // PREVIEW_POLYGON_GEOM_MANAGER__H_ #endif // PREVIEW_POLYGON_GEOM_MANAGER__H_

View File

@ -62,8 +62,8 @@ public:
* @param aLeaderPts - the lines from the last fixed point to * @param aLeaderPts - the lines from the last fixed point to
* another point, eg the cursor. * another point, eg the cursor.
*/ */
void SetPoints( const std::vector<VECTOR2I>& aLockedInPts, void SetPoints( const SHAPE_LINE_CHAIN& aLockedInPts,
const std::vector<VECTOR2I>& aLeaderPts ); const SHAPE_LINE_CHAIN& aLeaderPts );
private: private:

View File

@ -239,7 +239,7 @@ void ZONE_CREATE_HELPER::OnComplete( const POLYGON_GEOM_MANAGER& aMgr )
{ {
auto& finalPoints = aMgr.GetLockedInPoints(); auto& finalPoints = aMgr.GetLockedInPoints();
if( finalPoints.size() < 3 ) if( finalPoints.PointCount() < 3 )
{ {
// just scrap the zone in progress // just scrap the zone in progress
m_zone = nullptr; m_zone = nullptr;
@ -250,9 +250,9 @@ void ZONE_CREATE_HELPER::OnComplete( const POLYGON_GEOM_MANAGER& aMgr )
// will be merged to the existing zone as a new hole. // will be merged to the existing zone as a new hole.
m_zone->Outline()->NewOutline(); m_zone->Outline()->NewOutline();
for( const auto& pt : finalPoints ) for( int i = 0; i < finalPoints.PointCount(); ++i )
{ {
m_zone->Outline()->Append( pt ); m_zone->Outline()->Append( finalPoints.CPoint( i ) );
} }
m_zone->Outline()->Outline( 0 ).SetClosed( true ); m_zone->Outline()->Outline( 0 ).SetClosed( true );