Respect 45-degree mode when set from zone dialog.

Fixes: lp:1655073
* https://bugs.launchpad.net/kicad/+bug/1655073
This commit is contained in:
Jeff Young 2018-02-20 14:51:40 +00:00 committed by Maciej Suminski
parent 4d5e1489fb
commit cd81254262
7 changed files with 24 additions and 14 deletions

View File

@ -36,7 +36,7 @@ bool POLYGON_GEOM_MANAGER::AddPoint( const VECTOR2I& aPt )
{ {
// if this is the first point, make sure the client is happy // if this is the first point, make sure the client is happy
// for us to continue // for us to continue
if( !IsPolygonInProgress() && !m_client.OnFirstPoint() ) if( !IsPolygonInProgress() && !m_client.OnFirstPoint( *this ) )
return false; return false;
if( m_leaderPts.size() > 1 ) if( m_leaderPts.size() > 1 )
@ -69,9 +69,9 @@ void POLYGON_GEOM_MANAGER::SetLeaderMode( LEADER_MODE aMode )
} }
void POLYGON_GEOM_MANAGER::SetCursorPosition( const VECTOR2I& aPos ) void POLYGON_GEOM_MANAGER::SetCursorPosition( const VECTOR2I& aPos, LEADER_MODE aModifier )
{ {
updateLeaderPoints( aPos ); updateLeaderPoints( aPos, aModifier );
} }
@ -114,11 +114,11 @@ void POLYGON_GEOM_MANAGER::Reset()
} }
void POLYGON_GEOM_MANAGER::updateLeaderPoints( const VECTOR2I& aEndPoint ) void POLYGON_GEOM_MANAGER::updateLeaderPoints( const VECTOR2I& aEndPoint, LEADER_MODE aModifier )
{ {
SHAPE_LINE_CHAIN newChain; SHAPE_LINE_CHAIN newChain;
if( m_leaderMode == 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( m_lockedPoints.back() - aEndPoint );

View File

@ -52,7 +52,7 @@ public:
* *
* @return false to veto start of new polygon * @return false to veto start of new polygon
*/ */
virtual bool OnFirstPoint() = 0; virtual bool OnFirstPoint( POLYGON_GEOM_MANAGER& aMgr ) = 0;
///> Sent when the polygon geometry changes ///> Sent when the polygon geometry changes
virtual void OnGeometryChange( const POLYGON_GEOM_MANAGER& aMgr ) = 0; virtual void OnGeometryChange( const POLYGON_GEOM_MANAGER& aMgr ) = 0;
@ -99,7 +99,7 @@ public:
/** /**
* Set the current cursor position * Set the current cursor position
*/ */
void SetCursorPosition( const VECTOR2I& aPos ); void SetCursorPosition( const VECTOR2I& aPos, LEADER_MODE aModifier );
/** /**
* @return true if the polygon in "in progress", i.e. it has at least * @return true if the polygon in "in progress", i.e. it has at least
@ -141,7 +141,8 @@ private:
* Update the leader line points based on a new endpoint (probably * Update the leader line points based on a new endpoint (probably
* a cursor position) * a cursor position)
*/ */
void updateLeaderPoints( const VECTOR2I& aEndPoint ); void updateLeaderPoints( const VECTOR2I& aEndPoint,
LEADER_MODE aModifier = LEADER_MODE::DIRECT );
///> The "user" of the polygon data that is informed when the geometry changes ///> The "user" of the polygon data that is informed when the geometry changes
CLIENT& m_client; CLIENT& m_client;

View File

@ -658,6 +658,8 @@ public:
const std::vector<SEG>& GetHatchLines() const { return m_HatchLines; } const std::vector<SEG>& GetHatchLines() const { return m_HatchLines; }
bool GetHV45() const { return m_hv45; }
void SetHV45( bool aConstrain ) { m_hv45 = aConstrain; }
#if defined(DEBUG) #if defined(DEBUG)
virtual void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); } virtual void Show( int nestLevel, std::ostream& os ) const override { ShowDummy( os ); }
@ -739,6 +741,8 @@ private:
std::vector<SEG> m_HatchLines; // hatch lines std::vector<SEG> m_HatchLines; // hatch lines
std::vector<int> m_insulatedIslands; std::vector<int> m_insulatedIslands;
bool m_hv45; // constrain edges to horizontal, vertical or 45º
/** /**
* Union to handle conversion between references to wxPoint and to VECTOR2I. * Union to handle conversion between references to wxPoint and to VECTOR2I.
* *

View File

@ -1325,10 +1325,9 @@ void DRAWING_TOOL::runPolygonEventLoop( POLYGON_GEOM_MANAGER& polyGeomMgr )
else if( polyGeomMgr.IsPolygonInProgress() else if( polyGeomMgr.IsPolygonInProgress()
&& ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) ) && ( evt->IsMotion() || evt->IsDrag( BUT_LEFT ) ) )
{ {
bool draw45 = evt->Modifier( MD_CTRL ); polyGeomMgr.SetCursorPosition( cursorPos, evt->Modifier( MD_CTRL )
polyGeomMgr.SetLeaderMode( draw45 ? POLYGON_GEOM_MANAGER::LEADER_MODE::DEG45 ? POLYGON_GEOM_MANAGER::LEADER_MODE::DEG45
: POLYGON_GEOM_MANAGER::LEADER_MODE::DIRECT ); : POLYGON_GEOM_MANAGER::LEADER_MODE::DIRECT );
polyGeomMgr.SetCursorPosition( cursorPos );
} }
} // end while } // end while
} }

View File

@ -189,7 +189,7 @@ void ZONE_CREATE_HELPER::commitZone( std::unique_ptr<ZONE_CONTAINER> aZone )
} }
bool ZONE_CREATE_HELPER::OnFirstPoint() bool ZONE_CREATE_HELPER::OnFirstPoint( POLYGON_GEOM_MANAGER& aMgr )
{ {
// if we don't have a zone, create one // if we don't have a zone, create one
// the user's choice here can affect things like the colour // the user's choice here can affect things like the colour
@ -211,6 +211,10 @@ bool ZONE_CREATE_HELPER::OnFirstPoint()
m_previewItem.SetFillColor( color.WithAlpha( 0.2 ) ); m_previewItem.SetFillColor( color.WithAlpha( 0.2 ) );
m_parentView.SetVisible( &m_previewItem, true ); m_parentView.SetVisible( &m_previewItem, true );
aMgr.SetLeaderMode( m_zone.get()->GetHV45()
? POLYGON_GEOM_MANAGER::LEADER_MODE::DEG45
: POLYGON_GEOM_MANAGER::LEADER_MODE::DIRECT );
} }
} }

View File

@ -73,7 +73,7 @@ public:
void OnGeometryChange( const POLYGON_GEOM_MANAGER& aMgr ) override; void OnGeometryChange( const POLYGON_GEOM_MANAGER& aMgr ) override;
bool OnFirstPoint() override; bool OnFirstPoint( POLYGON_GEOM_MANAGER& aMgr ) override;
void OnComplete( const POLYGON_GEOM_MANAGER& aMgr ) override; void OnComplete( const POLYGON_GEOM_MANAGER& aMgr ) override;

View File

@ -88,6 +88,7 @@ ZONE_SETTINGS& ZONE_SETTINGS::operator << ( const ZONE_CONTAINER& aSource )
m_keepoutDoNotAllowCopperPour = aSource.GetDoNotAllowCopperPour(); m_keepoutDoNotAllowCopperPour = aSource.GetDoNotAllowCopperPour();
m_keepoutDoNotAllowVias = aSource.GetDoNotAllowVias(); m_keepoutDoNotAllowVias = aSource.GetDoNotAllowVias();
m_keepoutDoNotAllowTracks = aSource.GetDoNotAllowTracks(); m_keepoutDoNotAllowTracks = aSource.GetDoNotAllowTracks();
m_Zone_45_Only = aSource.GetHV45();
m_CurrentZone_Layer = aSource.GetLayer(); m_CurrentZone_Layer = aSource.GetLayer();
m_Layers = aSource.GetLayerSet(); m_Layers = aSource.GetLayerSet();
@ -111,6 +112,7 @@ void ZONE_SETTINGS::ExportSetting( ZONE_CONTAINER& aTarget, bool aFullExport ) c
aTarget.SetDoNotAllowCopperPour( GetDoNotAllowCopperPour() ); aTarget.SetDoNotAllowCopperPour( GetDoNotAllowCopperPour() );
aTarget.SetDoNotAllowVias( GetDoNotAllowVias() ); aTarget.SetDoNotAllowVias( GetDoNotAllowVias() );
aTarget.SetDoNotAllowTracks( GetDoNotAllowTracks() ); aTarget.SetDoNotAllowTracks( GetDoNotAllowTracks() );
aTarget.SetHV45( m_Zone_45_Only );
if( aFullExport ) if( aFullExport )
{ {