Commit 5de41eab authored by Maciej Suminski's avatar Maciej Suminski

Added EC_SNAPLINE to make possible snapping EDIT_LINES by their ends rather than by its center.

parent 23392ce8
...@@ -131,8 +131,8 @@ EC_CONVERGING::~EC_CONVERGING() ...@@ -131,8 +131,8 @@ EC_CONVERGING::~EC_CONVERGING()
void EC_CONVERGING::Apply( EDIT_LINE& aHandle ) void EC_CONVERGING::Apply( EDIT_LINE& aHandle )
{ {
// The dragged segment endpoints // The dragged segment endpoints
EDIT_POINT& origin = m_constrained.GetOrigin(); EDIT_POINT& origin = aHandle.GetOrigin();
EDIT_POINT& end = m_constrained.GetEnd(); EDIT_POINT& end = aHandle.GetEnd();
if( m_colinearConstraint ) if( m_colinearConstraint )
{ {
...@@ -173,3 +173,17 @@ void EC_CONVERGING::Apply( EDIT_LINE& aHandle ) ...@@ -173,3 +173,17 @@ void EC_CONVERGING::Apply( EDIT_LINE& aHandle )
end.SetPosition( *originEndIntersect ); end.SetPosition( *originEndIntersect );
} }
} }
EC_SNAPLINE::EC_SNAPLINE( EDIT_LINE& aLine, V2D_TRANSFORM_FUN aSnapFun ) :
EDIT_CONSTRAINT<EDIT_LINE>( aLine ), m_snapFun( aSnapFun )
{}
void EC_SNAPLINE::Apply( EDIT_LINE& aHandle )
{
VECTOR2D delta = aHandle.GetEnd().GetPosition() - aHandle.GetOrigin().GetPosition();
aHandle.GetOrigin().SetPosition( m_snapFun( aHandle.GetOrigin().GetPosition() ) );
aHandle.GetEnd().SetPosition( aHandle.GetOrigin().GetPosition() + delta );
}
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
#define EDIT_CONSTRAINTS_H_ #define EDIT_CONSTRAINTS_H_
#include <math/vector2d.h> #include <math/vector2d.h>
#include <boost/function.hpp>
class EDIT_POINT; class EDIT_POINT;
class EDIT_LINE; class EDIT_LINE;
...@@ -236,4 +237,31 @@ private: ...@@ -236,4 +237,31 @@ private:
VECTOR2I m_draggedVector; VECTOR2I m_draggedVector;
}; };
/**
* Class EC_SNAPLINE
*
* EDIT_CONSTRAINT for a EDIT_LINE, one of the ends is snapped to a spot determined by a
* transform function passed as parameter (e.g. it can be snapped to a grid), instead of having
* the line center snapped to a point.
*/
class EC_SNAPLINE : public EDIT_CONSTRAINT<EDIT_LINE>
{
public:
///> Typedef for a function that determines snapping point.
typedef boost::function<VECTOR2D (const VECTOR2D&)> V2D_TRANSFORM_FUN;
EC_SNAPLINE( EDIT_LINE& aLine, V2D_TRANSFORM_FUN aSnapFun );
virtual ~EC_SNAPLINE()
{}
///> @copydoc EDIT_CONSTRAINT::Apply()
virtual void Apply( EDIT_LINE& aHandle );
private:
///> Function that determines snapping point.
V2D_TRANSFORM_FUN m_snapFun;
};
#endif /* EDIT_CONSTRAINTS_H_ */ #endif /* EDIT_CONSTRAINTS_H_ */
...@@ -418,15 +418,25 @@ public: ...@@ -418,15 +418,25 @@ public:
} }
/** /**
* Function Size() * Function PointsSize()
* *
* Returns number of stored points. * Returns number of stored EDIT_POINTs.
*/ */
unsigned int Size() const unsigned int PointsSize() const
{ {
return m_points.size(); return m_points.size();
} }
/**
* Function LinesSize()
*
* Returns number of stored EDIT_LINEs.
*/
unsigned int LinesSize() const
{
return m_lines.size();
}
///> @copydoc VIEW_ITEM::ViewBBox() ///> @copydoc VIEW_ITEM::ViewBBox()
virtual const BOX2I ViewBBox() const virtual const BOX2I ViewBBox() const
{ {
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
*/ */
#include <boost/make_shared.hpp> #include <boost/make_shared.hpp>
#include <boost/bind.hpp>
#include <tool/tool_manager.h> #include <tool/tool_manager.h>
#include <view/view_controls.h> #include <view/view_controls.h>
...@@ -64,16 +65,11 @@ enum DIMENSION_POINTS ...@@ -64,16 +65,11 @@ enum DIMENSION_POINTS
DIM_FEATUREDO, DIM_FEATUREDO,
}; };
/**
* Class POINT_EDITOR
*
* Tool that displays edit points allowing to modify items by dragging the points.
*/
class EDIT_POINTS_FACTORY class EDIT_POINTS_FACTORY
{ {
public: public:
static boost::shared_ptr<EDIT_POINTS> Make( EDA_ITEM* aItem ) static boost::shared_ptr<EDIT_POINTS> Make( EDA_ITEM* aItem, KIGFX::GAL* aGal )
{ {
boost::shared_ptr<EDIT_POINTS> points = boost::make_shared<EDIT_POINTS>( aItem ); boost::shared_ptr<EDIT_POINTS> points = boost::make_shared<EDIT_POINTS>( aItem );
...@@ -126,10 +122,18 @@ public: ...@@ -126,10 +122,18 @@ public:
// Lines have to be added after creating edit points, // Lines have to be added after creating edit points,
// as they use EDIT_POINT references // as they use EDIT_POINT references
for( int i = 0; i < cornersCount - 1; ++i ) for( int i = 0; i < cornersCount - 1; ++i )
{
points->AddLine( points->Point( i ), points->Point( i + 1 ) ); points->AddLine( points->Point( i ), points->Point( i + 1 ) );
points->Line( i ).SetConstraint(
new EC_SNAPLINE( points->Line( i ),
boost::bind( &KIGFX::GAL::GetGridPoint, aGal, _1 ) ) );
}
// The last missing line, connecting the last and the first polygon point // The last missing line, connecting the last and the first polygon point
points->AddLine( points->Point( cornersCount - 1 ), points->Point( 0 ) ); points->AddLine( points->Point( cornersCount - 1 ), points->Point( 0 ) );
points->Line( points->LinesSize() - 1 ).SetConstraint(
new EC_SNAPLINE( points->Line( points->LinesSize() - 1 ),
boost::bind( &KIGFX::GAL::GetGridPoint, aGal, _1 ) ) );
break; break;
} }
...@@ -208,7 +212,7 @@ int POINT_EDITOR::OnSelectionChange( TOOL_EVENT& aEvent ) ...@@ -208,7 +212,7 @@ int POINT_EDITOR::OnSelectionChange( TOOL_EVENT& aEvent )
PCB_EDIT_FRAME* editFrame = getEditFrame<PCB_EDIT_FRAME>(); PCB_EDIT_FRAME* editFrame = getEditFrame<PCB_EDIT_FRAME>();
EDA_ITEM* item = selection.items.GetPickedItem( 0 ); EDA_ITEM* item = selection.items.GetPickedItem( 0 );
m_editPoints = EDIT_POINTS_FACTORY::Make( item ); m_editPoints = EDIT_POINTS_FACTORY::Make( item, m_toolMgr->GetView()->GetGAL() );
if( !m_editPoints ) if( !m_editPoints )
{ {
setTransitions(); setTransitions();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment