From 5061ca54e799fa69a0c4604e3941c4f667751a6d Mon Sep 17 00:00:00 2001 From: Josue Date: Sat, 24 Jun 2023 06:30:17 -0500 Subject: [PATCH] add length and angle properties to segment --- common/eda_shape.cpp | 27 ++ include/eda_shape.h | 9 + .../dialog_graphic_item_properties.cpp | 71 ++++ .../dialog_graphic_item_properties_base.cpp | 22 + .../dialog_graphic_item_properties_base.fbp | 390 ++++++++++++++++++ .../dialog_graphic_item_properties_base.h | 6 + 6 files changed, 525 insertions(+) diff --git a/common/eda_shape.cpp b/common/eda_shape.cpp index f4514a4164..b9a789e310 100644 --- a/common/eda_shape.cpp +++ b/common/eda_shape.cpp @@ -137,6 +137,25 @@ double EDA_SHAPE::GetLength() const } } +void EDA_SHAPE::SetLength( const double& aLength ) +{ + switch( m_shape ) + { + case SHAPE_T::SEGMENT: m_segmentLength = aLength; break; + + default: UNIMPLEMENTED_FOR( SHAPE_T_asString() ); + } +} + +void EDA_SHAPE::SetAngle( const EDA_ANGLE& aAngle ) +{ + switch( m_shape ) + { + case SHAPE_T::SEGMENT: m_segmentAngle = aAngle; break; + + default: UNIMPLEMENTED_FOR( SHAPE_T_asString() ); + } +} bool EDA_SHAPE::IsClosed() const { @@ -576,6 +595,14 @@ void EDA_SHAPE::SetArcGeometry( const VECTOR2I& aStart, const VECTOR2I& aMid, co } } +EDA_ANGLE EDA_SHAPE::GetSegmentAngle() const +{ + EDA_ANGLE angle( atan2( (double)( GetStart().y - GetEnd().y ), + (double)( GetEnd().x - GetStart().x ) ), RADIANS_T ); + + return angle; +} + EDA_ANGLE EDA_SHAPE::GetArcAngle() const { diff --git a/include/eda_shape.h b/include/eda_shape.h index eb297c2027..60c558b783 100644 --- a/include/eda_shape.h +++ b/include/eda_shape.h @@ -192,6 +192,8 @@ public: EDA_ANGLE GetArcAngle() const; + EDA_ANGLE GetSegmentAngle() const; + /** * Have the start and end points been swapped since they were set? * @return true if they have @@ -297,6 +299,10 @@ public: void ShapeGetMsgPanelInfo( EDA_DRAW_FRAME* aFrame, std::vector& aList ); + void SetLength( const double& aLength ); + + void SetAngle( const EDA_ANGLE& aLength ); + /** * Return the length of the track using the hypotenuse calculation. * @@ -366,6 +372,9 @@ protected: FILL_T m_fill; COLOR4D m_fillColor; + double m_segmentLength; + EDA_ANGLE m_segmentAngle; + VECTOR2I m_start; // Line start point or Circle center VECTOR2I m_end; // Line end point or Circle 3 o'clock point diff --git a/pcbnew/dialogs/dialog_graphic_item_properties.cpp b/pcbnew/dialogs/dialog_graphic_item_properties.cpp index 9fc61d9e5f..825017b6ad 100644 --- a/pcbnew/dialogs/dialog_graphic_item_properties.cpp +++ b/pcbnew/dialogs/dialog_graphic_item_properties.cpp @@ -83,6 +83,8 @@ private: UNIT_BINDER m_endX, m_endY; UNIT_BINDER m_angle; UNIT_BINDER m_thickness; + UNIT_BINDER m_segmentLength; + UNIT_BINDER m_segmentAngle; UNIT_BINDER m_bezierCtrl1X, m_bezierCtrl1Y; UNIT_BINDER m_bezierCtrl2X, m_bezierCtrl2Y; @@ -98,6 +100,8 @@ DIALOG_GRAPHIC_ITEM_PROPERTIES::DIALOG_GRAPHIC_ITEM_PROPERTIES( PCB_BASE_EDIT_FR m_startY( aParent, m_startYLabel, m_startYCtrl, m_startYUnits ), m_endX( aParent, m_endXLabel, m_endXCtrl, m_endXUnits ), m_endY( aParent, m_endYLabel, m_endYCtrl, m_endYUnits ), + m_segmentLength( aParent, m_segmentLengthLabel, m_segmentLengthCtrl, m_segmentLengthUnits ), + m_segmentAngle( aParent, m_segmentAngleLabel, m_segmentAngleCtrl, m_segmentAngleUnits ), m_angle( aParent, m_angleLabel, m_angleCtrl, m_angleUnits ), m_thickness( aParent, m_thicknessLabel, m_thicknessCtrl, m_thicknessUnits ), m_bezierCtrl1X( aParent, m_BezierPointC1XLabel, m_BezierC1X_Ctrl, m_BezierPointC1XUnit ), @@ -116,6 +120,8 @@ DIALOG_GRAPHIC_ITEM_PROPERTIES::DIALOG_GRAPHIC_ITEM_PROPERTIES( PCB_BASE_EDIT_FR m_bezierCtrl2X.SetCoordType( ORIGIN_TRANSFORMS::ABS_X_COORD ); m_bezierCtrl2Y.SetCoordType( ORIGIN_TRANSFORMS::ABS_Y_COORD ); + m_segmentLength.SetUnits( EDA_UNITS::MILLIMETRES ); + m_segmentAngle.SetUnits( EDA_UNITS::DEGREES ); m_angle.SetUnits( EDA_UNITS::DEGREES ); // Do not allow locking items in the footprint editor @@ -221,6 +227,13 @@ bool DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataToWindow() if( !m_item ) return false; + // Only a segment has this format + if( m_item->GetShape() != SHAPE_T::SEGMENT ) + { + m_segmentLength.Show( false ); + m_segmentAngle.Show( false ); + } + // Only an arc has a angle parameter. So do not show this parameter for other shapes if( m_item->GetShape() != SHAPE_T::ARC ) m_angle.Show( false ); @@ -281,6 +294,9 @@ bool DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataToWindow() else m_flipStartEnd = m_item->GetStart().x > m_item->GetEnd().x; + m_segmentLength.SetValue( m_item->GetLength() ); + m_segmentAngle.SetAngleValue( m_item->GetSegmentAngle() ); + m_filledCtrl->Show( false ); break; @@ -354,6 +370,12 @@ bool DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow() return true; int layer = m_LayerSelectionCtrl->GetLayerSelection(); + + VECTOR2I begin_point = m_item->GetStart(); + VECTOR2I end_point = m_item->GetEnd(); + long long int segment_length = m_item->GetLength(); + EDA_ANGLE segment_angle = m_item->GetSegmentAngle(); + BOARD_COMMIT commit( m_parent ); commit.Modify( m_item ); @@ -384,6 +406,55 @@ bool DIALOG_GRAPHIC_ITEM_PROPERTIES::TransferDataFromWindow() m_item->SetEndY( m_endY.GetValue() ); } + if( m_item->GetShape() == SHAPE_T::SEGMENT ) + { + bool change_begin = ( begin_point != m_item->GetStart() ); + bool change_end = ( end_point != m_item->GetEnd() ); + bool change_length = ( segment_length != m_segmentLength.GetValue() ); + EDA_ANGLE difference = segment_angle - m_segmentAngle.GetAngleValue(); + + if( difference.AsRadians() < 0 ) + difference = -difference; + + bool change_angle = + ( difference > EDA_ANGLE( 0.00001, TENTHS_OF_A_DEGREE_T ) ); + + if( !( change_begin && change_end ) ) + { + segment_length = m_segmentLength.GetValue(); + segment_angle = m_segmentAngle.GetAngleValue(); + + if( change_length || change_angle ) + { + if( change_end ) + { + m_item->SetStartX( m_item->GetEndX() + - segment_length * segment_angle.Cos() ); + m_item->SetStartY( m_item->GetEndY() + + segment_length * segment_angle.Sin() ); + } + else + { + m_item->SetEndX( m_item->GetStartX() + + segment_length * segment_angle.Cos() ); + m_item->SetEndY( m_item->GetStartY() + - segment_length * segment_angle.Sin() ); + } + } + } + + if( change_length ) + m_item->SetLength( m_segmentLength.GetValue() ); + else + m_item->SetLength( m_item->GetLength() ); + + if( change_angle ) + m_item->SetAngle( m_segmentAngle.GetAngleValue() ); + else + m_item->SetAngle( m_item->GetSegmentAngle() ); + + } + // For Bezier curve: Set the two control points if( m_item->GetShape() == SHAPE_T::BEZIER ) { diff --git a/pcbnew/dialogs/dialog_graphic_item_properties_base.cpp b/pcbnew/dialogs/dialog_graphic_item_properties_base.cpp index 3f70082661..cc75970a52 100644 --- a/pcbnew/dialogs/dialog_graphic_item_properties_base.cpp +++ b/pcbnew/dialogs/dialog_graphic_item_properties_base.cpp @@ -78,6 +78,28 @@ DIALOG_GRAPHIC_ITEM_PROPERTIES_BASE::DIALOG_GRAPHIC_ITEM_PROPERTIES_BASE( wxWind m_endYUnits->Wrap( -1 ); m_sizerLeft->Add( m_endYUnits, wxGBPosition( 2, 5 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_segmentLengthLabel = new wxStaticText( this, wxID_ANY, _("Length:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_segmentLengthLabel->Wrap( -1 ); + m_sizerLeft->Add( m_segmentLengthLabel, wxGBPosition( 3, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_segmentLengthCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_sizerLeft->Add( m_segmentLengthCtrl, wxGBPosition( 3, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + + m_segmentLengthUnits = new wxStaticText( this, wxID_ANY, _("unit"), wxDefaultPosition, wxDefaultSize, 0 ); + m_segmentLengthUnits->Wrap( -1 ); + m_sizerLeft->Add( m_segmentLengthUnits, wxGBPosition( 3, 2 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + + m_segmentAngleLabel = new wxStaticText( this, wxID_ANY, _("Angle:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_segmentAngleLabel->Wrap( -1 ); + m_sizerLeft->Add( m_segmentAngleLabel, wxGBPosition( 3, 3 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ); + + m_segmentAngleCtrl = new wxTextCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0 ); + m_sizerLeft->Add( m_segmentAngleCtrl, wxGBPosition( 3, 4 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + + m_segmentAngleUnits = new wxStaticText( this, wxID_ANY, _("deg"), wxDefaultPosition, wxDefaultSize, 0 ); + m_segmentAngleUnits->Wrap( -1 ); + m_sizerLeft->Add( m_segmentAngleUnits, wxGBPosition( 3, 5 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ); + m_bezierCtrlPt1Label = new wxStaticText( this, wxID_ANY, _("Bezier Control Pt"), wxDefaultPosition, wxDefaultSize, 0 ); m_bezierCtrlPt1Label->Wrap( -1 ); m_sizerLeft->Add( m_bezierCtrlPt1Label, wxGBPosition( 4, 0 ), wxGBSpan( 1, 3 ), wxALIGN_CENTER_HORIZONTAL|wxRIGHT|wxLEFT, 5 ); diff --git a/pcbnew/dialogs/dialog_graphic_item_properties_base.fbp b/pcbnew/dialogs/dialog_graphic_item_properties_base.fbp index 716dab4ece..5e8c0f5686 100644 --- a/pcbnew/dialogs/dialog_graphic_item_properties_base.fbp +++ b/pcbnew/dialogs/dialog_graphic_item_properties_base.fbp @@ -1010,6 +1010,396 @@ -1 + + 5 + 1 + 0 + wxALIGN_CENTER_VERTICAL|wxLEFT + 3 + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Length: + 0 + + 0 + + + 0 + + 1 + m_segmentLengthLabel + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 5 + 1 + 1 + wxALIGN_CENTER_VERTICAL + 3 + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_segmentLengthCtrl + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 5 + 1 + 2 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 3 + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + unit + 0 + + 0 + + + 0 + + 1 + m_segmentLengthUnits + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 5 + 1 + 3 + wxALIGN_CENTER_VERTICAL|wxLEFT + 3 + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Angle: + 0 + + 0 + + + 0 + + 1 + m_segmentAngleLabel + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + + + 5 + 1 + 4 + wxALIGN_CENTER_VERTICAL + 3 + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + + 0 + + + + 0 + + 1 + m_segmentAngleCtrl + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + + + + 5 + 1 + 5 + wxALIGN_CENTER_VERTICAL|wxRIGHT + 3 + 1 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + deg + 0 + + 0 + + + 0 + + 1 + m_segmentAngleUnits + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + + + -1 + + 5 3 diff --git a/pcbnew/dialogs/dialog_graphic_item_properties_base.h b/pcbnew/dialogs/dialog_graphic_item_properties_base.h index 82ae2a26ee..0c7958d197 100644 --- a/pcbnew/dialogs/dialog_graphic_item_properties_base.h +++ b/pcbnew/dialogs/dialog_graphic_item_properties_base.h @@ -54,6 +54,12 @@ class DIALOG_GRAPHIC_ITEM_PROPERTIES_BASE : public DIALOG_SHIM wxStaticText* m_endYLabel; wxTextCtrl* m_endYCtrl; wxStaticText* m_endYUnits; + wxStaticText* m_segmentLengthLabel; + wxTextCtrl* m_segmentLengthCtrl; + wxStaticText* m_segmentLengthUnits; + wxStaticText* m_segmentAngleLabel; + wxTextCtrl* m_segmentAngleCtrl; + wxStaticText* m_segmentAngleUnits; wxStaticText* m_bezierCtrlPt1Label; wxStaticText* m_BezierPointC1XLabel; wxTextCtrl* m_BezierC1X_Ctrl;