diff --git a/common/eda_shape.cpp b/common/eda_shape.cpp index 4d375578fe..5634d4f0ae 100644 --- a/common/eda_shape.cpp +++ b/common/eda_shape.cpp @@ -1958,25 +1958,61 @@ static struct EDA_SHAPE_DESC return false; }; + auto isNotPolygonOrCircle = []( INSPECTABLE* aItem ) -> bool + { + // Polygons, unlike other shapes, have no meaningful start or end coordinates + if( EDA_SHAPE* shape = dynamic_cast( aItem ) ) + return shape->GetShape() != SHAPE_T::POLY && shape->GetShape() != SHAPE_T::CIRCLE; + + return false; + }; + + auto isCircle = []( INSPECTABLE* aItem ) -> bool + { + // Polygons, unlike other shapes, have no meaningful start or end coordinates + if( EDA_SHAPE* shape = dynamic_cast( aItem ) ) + return shape->GetShape() == SHAPE_T::CIRCLE; + + return false; + }; + auto shape = new PROPERTY_ENUM( _HKI( "Shape" ), NO_SETTER( EDA_SHAPE, SHAPE_T ), &EDA_SHAPE::GetShape ); propMgr.AddProperty( shape ); + propMgr.AddProperty( new PROPERTY( _HKI( "Start X" ), &EDA_SHAPE::SetStartX, &EDA_SHAPE::GetStartX, PROPERTY_DISPLAY::PT_COORD, ORIGIN_TRANSFORMS::ABS_X_COORD ) ) - .SetAvailableFunc( isNotPolygon ); + .SetAvailableFunc( isNotPolygonOrCircle ); propMgr.AddProperty( new PROPERTY( _HKI( "Start Y" ), &EDA_SHAPE::SetStartY, &EDA_SHAPE::GetStartY, PROPERTY_DISPLAY::PT_COORD, ORIGIN_TRANSFORMS::ABS_Y_COORD ) ) - .SetAvailableFunc( isNotPolygon ); + .SetAvailableFunc( isNotPolygonOrCircle ); + + propMgr.AddProperty( new PROPERTY( _HKI( "Center X" ), + &EDA_SHAPE::SetStartX, &EDA_SHAPE::GetStartX, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_X_COORD ) ) + .SetAvailableFunc( isCircle ); + + propMgr.AddProperty( new PROPERTY( _HKI( "Center Y" ), + &EDA_SHAPE::SetStartY, &EDA_SHAPE::GetStartY, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_Y_COORD ) ) + .SetAvailableFunc( isCircle ); + + propMgr.AddProperty( new PROPERTY( _HKI( "Radius" ), + &EDA_SHAPE::SetRadius, &EDA_SHAPE::GetRadius, PROPERTY_DISPLAY::PT_SIZE, + ORIGIN_TRANSFORMS::NOT_A_COORD ) ) + .SetAvailableFunc( isCircle ); + propMgr.AddProperty( new PROPERTY( _HKI( "End X" ), &EDA_SHAPE::SetEndX, &EDA_SHAPE::GetEndX, PROPERTY_DISPLAY::PT_COORD, ORIGIN_TRANSFORMS::ABS_X_COORD ) ) - .SetAvailableFunc( isNotPolygon ); + .SetAvailableFunc( isNotPolygonOrCircle ); + propMgr.AddProperty( new PROPERTY( _HKI( "End Y" ), &EDA_SHAPE::SetEndY, &EDA_SHAPE::GetEndY, PROPERTY_DISPLAY::PT_COORD, ORIGIN_TRANSFORMS::ABS_Y_COORD ) ) - .SetAvailableFunc( isNotPolygon ); + .SetAvailableFunc( isNotPolygonOrCircle ); propMgr.AddProperty( new PROPERTY( _HKI( "Line Width" ), &EDA_SHAPE::SetWidth, &EDA_SHAPE::GetWidth, PROPERTY_DISPLAY::PT_SIZE ) ); diff --git a/include/eda_shape.h b/include/eda_shape.h index e807c13970..ff07a81689 100644 --- a/include/eda_shape.h +++ b/include/eda_shape.h @@ -158,18 +158,23 @@ public: m_endsSwapped = false; } - void SetEndY( int y ) + void SetEndY( int aY ) { - m_end.y = y; + m_end.y = aY; m_endsSwapped = false; } - void SetEndX( int x ) + void SetEndX( int aX ) { - m_end.x = x; + m_end.x = aX; m_endsSwapped = false; } + void SetRadius( int aX ) + { + m_end = m_start + VECTOR2I( aX, 0 ); + } + virtual VECTOR2I GetTopLeft() const { return GetStart(); } virtual VECTOR2I GetBotRight() const { return GetEnd(); } diff --git a/pcbnew/dialogs/dialog_shape_properties.cpp b/pcbnew/dialogs/dialog_shape_properties.cpp index b99b66c5a3..4d4169d403 100644 --- a/pcbnew/dialogs/dialog_shape_properties.cpp +++ b/pcbnew/dialogs/dialog_shape_properties.cpp @@ -385,7 +385,7 @@ bool DIALOG_SHAPE_PROPERTIES::TransferDataFromWindow() if( m_item->GetShape() == SHAPE_T::CIRCLE ) { - m_item->SetEnd( m_item->GetStart() + VECTOR2I( m_endX.GetIntValue(), 0 ) ); + m_item->SetRadius( m_endX.GetIntValue() ); } else if( m_flipStartEnd && m_item->GetShape() != SHAPE_T::ARC ) {