Yet another approach to 45 degree constraints.
This commit is contained in:
parent
f9d5f584cb
commit
85e8b8bd87
|
@ -59,6 +59,15 @@ public:
|
||||||
*/
|
*/
|
||||||
virtual void Apply() = 0;
|
virtual void Apply() = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function Update()
|
||||||
|
*
|
||||||
|
* Updates contraint's traits.
|
||||||
|
*/
|
||||||
|
virtual void Update()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
EDIT_POINT& m_constrained; ///< Point that is constrained by rules implemented by Apply()
|
EDIT_POINT& m_constrained; ///< Point that is constrained by rules implemented by Apply()
|
||||||
};
|
};
|
||||||
|
|
|
@ -134,7 +134,8 @@ private:
|
||||||
|
|
||||||
|
|
||||||
POINT_EDITOR::POINT_EDITOR() :
|
POINT_EDITOR::POINT_EDITOR() :
|
||||||
TOOL_INTERACTIVE( "pcbnew.PointEditor" ), m_selectionTool( NULL ), m_dragPoint( NULL )
|
TOOL_INTERACTIVE( "pcbnew.PointEditor" ), m_selectionTool( NULL ), m_dragPoint( NULL ),
|
||||||
|
m_original( VECTOR2I( 0, 0 ) )
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,7 +176,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 );
|
||||||
EDIT_POINT constrainer( VECTOR2I( 0, 0 ) );
|
EDIT_POINT constrainer( VECTOR2I( 0, 0 ) );
|
||||||
bool degree45 = false; // 45 degree mode
|
boost::shared_ptr<EDIT_POINT_CONSTRAINT> degree45Constraint;
|
||||||
|
|
||||||
m_editPoints = EDIT_POINTS_FACTORY::Make( item );
|
m_editPoints = EDIT_POINTS_FACTORY::Make( item );
|
||||||
if( !m_editPoints )
|
if( !m_editPoints )
|
||||||
|
@ -232,27 +233,31 @@ int POINT_EDITOR::OnSelectionChange( TOOL_EVENT& aEvent )
|
||||||
editFrame->OnModify();
|
editFrame->OnModify();
|
||||||
editFrame->SaveCopyInUndoList( selection.items, UR_CHANGED );
|
editFrame->SaveCopyInUndoList( selection.items, UR_CHANGED );
|
||||||
controls->ForceCursorPosition( false );
|
controls->ForceCursorPosition( false );
|
||||||
|
m_original = *m_dragPoint; // Save the original position
|
||||||
modified = true;
|
modified = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !!evt->Modifier( MD_CTRL ) != degree45 ) // 45 degrees mode
|
if( !!evt->Modifier( MD_CTRL ) != (bool) degree45Constraint ) // 45 degrees mode
|
||||||
{
|
{
|
||||||
degree45 = evt->Modifier( MD_CTRL );
|
if( !degree45Constraint )
|
||||||
|
|
||||||
if( degree45 )
|
|
||||||
{
|
{
|
||||||
// Find a proper constraining point for 45 degrees mode
|
// Find a proper constraining point for 45 degrees mode
|
||||||
constrainer = get45DegConstrainer();
|
constrainer = get45DegConstrainer();
|
||||||
m_dragPoint->SetConstraint( new EPC_45DEGREE( *m_dragPoint, constrainer ) );
|
degree45Constraint.reset( new EPC_45DEGREE( *m_dragPoint, constrainer ) );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_dragPoint->ClearConstraint();
|
degree45Constraint.reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
m_dragPoint->SetPosition( controls->GetCursorPosition() );
|
m_dragPoint->SetPosition( controls->GetCursorPosition() );
|
||||||
m_dragPoint->ApplyConstraint();
|
|
||||||
|
if( degree45Constraint )
|
||||||
|
degree45Constraint->Apply();
|
||||||
|
else
|
||||||
|
m_dragPoint->ApplyConstraint();
|
||||||
|
|
||||||
updateItem();
|
updateItem();
|
||||||
updatePoints();
|
updatePoints();
|
||||||
|
|
||||||
|
@ -436,15 +441,15 @@ void POINT_EDITOR::updateItem() const
|
||||||
else if( isModified( (*m_editPoints)[2] ) )
|
else if( isModified( (*m_editPoints)[2] ) )
|
||||||
{
|
{
|
||||||
dimension->SetOrigin( wxPoint( m_dragPoint->GetPosition().x, m_dragPoint->GetPosition().y ) );
|
dimension->SetOrigin( wxPoint( m_dragPoint->GetPosition().x, m_dragPoint->GetPosition().y ) );
|
||||||
static_cast<EPC_LINE*>( (*m_editPoints)[0].GetConstraint() )->Update();
|
(*m_editPoints)[0].GetConstraint()->Update();
|
||||||
static_cast<EPC_LINE*>( (*m_editPoints)[1].GetConstraint() )->Update();
|
(*m_editPoints)[1].GetConstraint()->Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
else if( isModified( (*m_editPoints)[3] ) )
|
else if( isModified( (*m_editPoints)[3] ) )
|
||||||
{
|
{
|
||||||
dimension->SetEnd( wxPoint( m_dragPoint->GetPosition().x, m_dragPoint->GetPosition().y ) );
|
dimension->SetEnd( wxPoint( m_dragPoint->GetPosition().x, m_dragPoint->GetPosition().y ) );
|
||||||
static_cast<EPC_LINE*>( (*m_editPoints)[0].GetConstraint() )->Update();
|
(*m_editPoints)[0].GetConstraint()->Update();
|
||||||
static_cast<EPC_LINE*>( (*m_editPoints)[1].GetConstraint() )->Update();
|
(*m_editPoints)[1].GetConstraint()->Update();
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -538,7 +543,9 @@ EDIT_POINT POINT_EDITOR::get45DegConstrainer() const
|
||||||
{
|
{
|
||||||
EDA_ITEM* item = m_editPoints->GetParent();
|
EDA_ITEM* item = m_editPoints->GetParent();
|
||||||
|
|
||||||
if( item->Type() == PCB_LINE_T )
|
switch( item->Type() )
|
||||||
|
{
|
||||||
|
case PCB_LINE_T:
|
||||||
{
|
{
|
||||||
const DRAWSEGMENT* segment = static_cast<const DRAWSEGMENT*>( item );
|
const DRAWSEGMENT* segment = static_cast<const DRAWSEGMENT*>( item );
|
||||||
{
|
{
|
||||||
|
@ -555,8 +562,11 @@ EDIT_POINT POINT_EDITOR::get45DegConstrainer() const
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if( item->Type() == PCB_DIMENSION_T )
|
|
||||||
|
case PCB_DIMENSION_T:
|
||||||
{
|
{
|
||||||
// Constraint for crossbar
|
// Constraint for crossbar
|
||||||
if( isModified( (*m_editPoints)[2] ) )
|
if( isModified( (*m_editPoints)[2] ) )
|
||||||
|
@ -564,8 +574,17 @@ EDIT_POINT POINT_EDITOR::get45DegConstrainer() const
|
||||||
|
|
||||||
else if( isModified( (*m_editPoints)[3] ) )
|
else if( isModified( (*m_editPoints)[3] ) )
|
||||||
return (*m_editPoints)[2];
|
return (*m_editPoints)[2];
|
||||||
|
|
||||||
|
else
|
||||||
|
return EDIT_POINT( m_dragPoint->GetPosition() ); // no constraint
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// In any other case we may align item to the current cursor position.
|
default:
|
||||||
return EDIT_POINT( getViewControls()->GetCursorPosition() );
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// In any other case we may align item to the current cursor position. TODO wrong desc
|
||||||
|
return m_original;
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,6 +62,9 @@ private:
|
||||||
///> Currently edited point, NULL if there is none.
|
///> Currently edited point, NULL if there is none.
|
||||||
EDIT_POINT* m_dragPoint;
|
EDIT_POINT* m_dragPoint;
|
||||||
|
|
||||||
|
///> Original position for the current drag point.
|
||||||
|
EDIT_POINT m_original;
|
||||||
|
|
||||||
///> Currently available edit points.
|
///> Currently available edit points.
|
||||||
boost::shared_ptr<EDIT_POINTS> m_editPoints;
|
boost::shared_ptr<EDIT_POINTS> m_editPoints;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue