Loading pcbnew/tools/edit_points.h +9 −0 Original line number Original line Diff line number Diff line Loading @@ -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() }; }; Loading pcbnew/tools/point_editor.cpp +36 −17 Original line number Original line Diff line number Diff line Loading @@ -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 ) ) { { } } Loading Loading @@ -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 ) Loading Loading @@ -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() ); if( degree45Constraint ) degree45Constraint->Apply(); else m_dragPoint->ApplyConstraint(); m_dragPoint->ApplyConstraint(); updateItem(); updateItem(); updatePoints(); updatePoints(); Loading Loading @@ -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; Loading Loading @@ -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 ); { { Loading @@ -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] ) ) Loading @@ -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; } default: break; } } // In any other case we may align item to the current cursor position. // In any other case we may align item to the current cursor position. TODO wrong desc return EDIT_POINT( getViewControls()->GetCursorPosition() ); return m_original; } } pcbnew/tools/point_editor.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -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 Loading
pcbnew/tools/edit_points.h +9 −0 Original line number Original line Diff line number Diff line Loading @@ -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() }; }; Loading
pcbnew/tools/point_editor.cpp +36 −17 Original line number Original line Diff line number Diff line Loading @@ -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 ) ) { { } } Loading Loading @@ -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 ) Loading Loading @@ -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() ); if( degree45Constraint ) degree45Constraint->Apply(); else m_dragPoint->ApplyConstraint(); m_dragPoint->ApplyConstraint(); updateItem(); updateItem(); updatePoints(); updatePoints(); Loading Loading @@ -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; Loading Loading @@ -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 ); { { Loading @@ -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] ) ) Loading @@ -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; } default: break; } } // In any other case we may align item to the current cursor position. // In any other case we may align item to the current cursor position. TODO wrong desc return EDIT_POINT( getViewControls()->GetCursorPosition() ); return m_original; } }
pcbnew/tools/point_editor.h +3 −0 Original line number Original line Diff line number Diff line Loading @@ -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