diff --git a/common/eda_shape.cpp b/common/eda_shape.cpp index 1d79603153..771818aac2 100644 --- a/common/eda_shape.cpp +++ b/common/eda_shape.cpp @@ -1636,13 +1636,17 @@ static struct EDA_SHAPE_DESC 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 ) ); + &EDA_SHAPE::SetStartX, &EDA_SHAPE::GetStartX, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_X_COORD ) ); propMgr.AddProperty( new PROPERTY( _HKI( "Start Y" ), - &EDA_SHAPE::SetStartY, &EDA_SHAPE::GetStartY, PROPERTY_DISPLAY::PT_COORD ) ); + &EDA_SHAPE::SetStartY, &EDA_SHAPE::GetStartY, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_Y_COORD ) ); propMgr.AddProperty( new PROPERTY( _HKI( "End X" ), - &EDA_SHAPE::SetEndX, &EDA_SHAPE::GetEndX, PROPERTY_DISPLAY::PT_COORD ) ); + &EDA_SHAPE::SetEndX, &EDA_SHAPE::GetEndX, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_X_COORD ) ); propMgr.AddProperty( new PROPERTY( _HKI( "End Y" ), - &EDA_SHAPE::SetEndY, &EDA_SHAPE::GetEndY, PROPERTY_DISPLAY::PT_COORD ) ); + &EDA_SHAPE::SetEndY, &EDA_SHAPE::GetEndY, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_Y_COORD ) ); // TODO: m_arcCenter, m_bezierC1, m_bezierC2, m_poly propMgr.AddProperty( new PROPERTY( _HKI( "Line Width" ), &EDA_SHAPE::SetWidth, &EDA_SHAPE::GetWidth, PROPERTY_DISPLAY::PT_SIZE ) ); diff --git a/common/pg_properties.cpp b/common/pg_properties.cpp index 44950a4ff6..f360fc196c 100644 --- a/common/pg_properties.cpp +++ b/common/pg_properties.cpp @@ -49,6 +49,7 @@ wxPGProperty* PGPropertyFactory( const PROPERTY_BASE* aProperty ) case PROPERTY_DISPLAY::PT_COORD: ret = new PGPROPERTY_COORD(); + static_cast( ret )->SetCoordType( aProperty->CoordType() ); break; case PROPERTY_DISPLAY::PT_DECIDEGREE: @@ -123,7 +124,9 @@ wxPGProperty* PGPropertyFactory( const PROPERTY_BASE* aProperty ) } -PGPROPERTY_DISTANCE::PGPROPERTY_DISTANCE( const wxString& aRegEx ) +PGPROPERTY_DISTANCE::PGPROPERTY_DISTANCE( const wxString& aRegEx, + ORIGIN_TRANSFORMS::COORD_TYPES_T aCoordType ) : + m_coordType( aCoordType ) { m_regExValidator.reset( new REGEX_VALIDATOR( aRegEx ) ); } @@ -134,7 +137,8 @@ PGPROPERTY_DISTANCE::~PGPROPERTY_DISTANCE() } -bool PGPROPERTY_DISTANCE::StringToDistance( wxVariant& aVariant, const wxString& aText, int aArgFlags ) const +bool PGPROPERTY_DISTANCE::StringToDistance( wxVariant& aVariant, const wxString& aText, + int aArgFlags ) const { wxRegEx regDimension( m_regExValidator->GetRegEx(), wxRE_ICASE ); wxASSERT( regDimension.IsValid() ); @@ -198,6 +202,14 @@ bool PGPROPERTY_DISTANCE::StringToDistance( wxVariant& aVariant, const wxString& break; } + ORIGIN_TRANSFORMS* transforms = PROPERTY_MANAGER::Instance().GetTransforms(); + + if( transforms ) + { + newValueIU = transforms->FromDisplay( static_cast( newValueIU ), + m_coordType ); + } + if( aVariant.IsNull() || newValueIU != aVariant.GetLong() ) { aVariant = newValueIU; @@ -212,19 +224,26 @@ wxString PGPROPERTY_DISTANCE::DistanceToString( wxVariant& aVariant, int aArgFla { wxCHECK( aVariant.GetType() == wxPG_VARIANT_TYPE_LONG, wxEmptyString ); + long distanceIU = aVariant.GetLong(); + + ORIGIN_TRANSFORMS* transforms = PROPERTY_MANAGER::Instance().GetTransforms(); + + if( transforms ) + distanceIU = transforms->ToDisplay( static_cast( distanceIU ), m_coordType ); + switch( PROPERTY_MANAGER::Instance().GetUnits() ) { case EDA_UNITS::INCHES: - return wxString::Format( wxT( "%d in" ), pcbIUScale.IUToMils( aVariant.GetLong() ) / 1000.0 ); + return wxString::Format( wxT( "%d in" ), pcbIUScale.IUToMils( distanceIU ) / 1000.0 ); case EDA_UNITS::MILS: - return wxString::Format( wxT( "%d mils" ), pcbIUScale.IUToMils( aVariant.GetLong() ) ); + return wxString::Format( wxT( "%d mils" ), pcbIUScale.IUToMils( distanceIU ) ); case EDA_UNITS::MILLIMETRES: - return wxString::Format( wxT( "%g mm" ), pcbIUScale.IUTomm( aVariant.GetLong() ) ); + return wxString::Format( wxT( "%g mm" ), pcbIUScale.IUTomm( distanceIU ) ); case EDA_UNITS::UNSCALED: - return wxString::Format( wxT( "%li" ), aVariant.GetLong() ); + return wxString::Format( wxT( "%li" ), distanceIU ); default: // DEGREEs are handled by PGPROPERTY_ANGLE @@ -250,8 +269,9 @@ wxValidator* PGPROPERTY_SIZE::DoGetValidator() const PGPROPERTY_COORD::PGPROPERTY_COORD( const wxString& aLabel, const wxString& aName, - long aValue ) - : wxIntProperty( aLabel, aName, aValue ), PGPROPERTY_DISTANCE( REGEX_SIGNED_DISTANCE ) + long aValue, ORIGIN_TRANSFORMS::COORD_TYPES_T aCoordType ) : + wxIntProperty( aLabel, aName, aValue ), + PGPROPERTY_DISTANCE( REGEX_SIGNED_DISTANCE, aCoordType ) { } diff --git a/common/widgets/properties_panel.cpp b/common/widgets/properties_panel.cpp index dc4e9b67db..baa88f368b 100644 --- a/common/widgets/properties_panel.cpp +++ b/common/widgets/properties_panel.cpp @@ -95,6 +95,7 @@ void PROPERTIES_PANEL::update( const SELECTION& aSelection ) PROPERTY_MANAGER& propMgr = PROPERTY_MANAGER::Instance(); propMgr.SetUnits( m_frame->GetUserUnits() ); + propMgr.SetTransforms( &m_frame->GetOriginTransforms() ); std::set commonProps; const PROPERTY_LIST& allProperties = propMgr.GetProperties( *types.begin() ); diff --git a/include/pg_properties.h b/include/pg_properties.h index e29b7240a3..4b6ad8db78 100644 --- a/include/pg_properties.h +++ b/include/pg_properties.h @@ -25,6 +25,7 @@ #include #include #include +#include class PROPERTY_BASE; class REGEX_VALIDATOR; @@ -35,14 +36,18 @@ wxPGProperty* PGPropertyFactory( const PROPERTY_BASE* aProperty ); class PGPROPERTY_DISTANCE { public: - PGPROPERTY_DISTANCE( const wxString& aRegEx ); + PGPROPERTY_DISTANCE( const wxString& aRegEx, + ORIGIN_TRANSFORMS::COORD_TYPES_T aCoordType = ORIGIN_TRANSFORMS::NOT_A_COORD ); virtual ~PGPROPERTY_DISTANCE() = 0; + void SetCoordType( ORIGIN_TRANSFORMS::COORD_TYPES_T aType ) { m_coordType = aType; } + protected: bool StringToDistance( wxVariant& aVariant, const wxString& aText, int aArgFlags = 0 ) const; wxString DistanceToString( wxVariant& aVariant, int aArgFlags = 0 ) const; std::unique_ptr m_regExValidator; + ORIGIN_TRANSFORMS::COORD_TYPES_T m_coordType; }; @@ -70,7 +75,8 @@ class PGPROPERTY_COORD : public wxIntProperty, public PGPROPERTY_DISTANCE { public: PGPROPERTY_COORD( const wxString& aLabel = wxPG_LABEL, const wxString& aName = wxPG_LABEL, - long aValue = 0 ); + long aValue = 0, + ORIGIN_TRANSFORMS::COORD_TYPES_T aCoordType = ORIGIN_TRANSFORMS::NOT_A_COORD ); bool StringToValue( wxVariant& aVariant, const wxString& aText, int aArgFlags = 0 ) const override { diff --git a/include/property.h b/include/property.h index 9f512ecfe3..20ecf9087a 100644 --- a/include/property.h +++ b/include/property.h @@ -39,6 +39,8 @@ #include #include +#include + class wxPGProperty; class INSPECTABLE; class PROPERTY_BASE; @@ -177,9 +179,11 @@ private: ///< Used to generate unique IDs. Must come up front so it's initialized before ctor. public: -PROPERTY_BASE( const wxString& aName, PROPERTY_DISPLAY aDisplay = PT_DEFAULT ) : +PROPERTY_BASE( const wxString& aName, PROPERTY_DISPLAY aDisplay = PT_DEFAULT, + ORIGIN_TRANSFORMS::COORD_TYPES_T aCoordType = ORIGIN_TRANSFORMS::NOT_A_COORD ) : m_name( aName ), m_display( aDisplay ), + m_coordType( aCoordType ), m_availFunc( [](INSPECTABLE*)->bool { return true; } ) { } @@ -258,6 +262,8 @@ PROPERTY_BASE( const wxString& aName, PROPERTY_DISPLAY aDisplay = PT_DEFAULT ) : return m_display; } + ORIGIN_TRANSFORMS::COORD_TYPES_T CoordType() const { return m_coordType; } + protected: template void set( void* aObject, T aValue ) @@ -284,6 +290,7 @@ private: private: const wxString m_name; const PROPERTY_DISPLAY m_display; + const ORIGIN_TRANSFORMS::COORD_TYPES_T m_coordType; std::function m_availFunc; ///< Eval to determine if prop is available @@ -300,18 +307,20 @@ public: template PROPERTY( const wxString& aName, void ( Base::*aSetter )( SetType ), GetType( Base::*aGetter )(), - PROPERTY_DISPLAY aDisplay = PT_DEFAULT ) + PROPERTY_DISPLAY aDisplay = PT_DEFAULT, + ORIGIN_TRANSFORMS::COORD_TYPES_T aCoordType = ORIGIN_TRANSFORMS::NOT_A_COORD ) : PROPERTY( aName, METHOD::Wrap( aSetter ), - METHOD::Wrap( aGetter ), aDisplay ) + METHOD::Wrap( aGetter ), aDisplay, aCoordType ) { } template PROPERTY( const wxString& aName, void ( Base::*aSetter )( SetType ), GetType( Base::*aGetter )() const, - PROPERTY_DISPLAY aDisplay = PT_DEFAULT ) + PROPERTY_DISPLAY aDisplay = PT_DEFAULT, + ORIGIN_TRANSFORMS::COORD_TYPES_T aCoordType = ORIGIN_TRANSFORMS::NOT_A_COORD ) : PROPERTY( aName, METHOD::Wrap( aSetter ), - METHOD::Wrap( aGetter ), aDisplay ) + METHOD::Wrap( aGetter ), aDisplay, aCoordType ) { } @@ -337,8 +346,8 @@ public: protected: PROPERTY( const wxString& aName, SETTER_BASE* s, GETTER_BASE* g, - PROPERTY_DISPLAY aDisplay ) - : PROPERTY_BASE( aName, aDisplay ), m_setter( s ), m_getter( g ), + PROPERTY_DISPLAY aDisplay, ORIGIN_TRANSFORMS::COORD_TYPES_T aCoordType ) + : PROPERTY_BASE( aName, aDisplay, aCoordType ), m_setter( s ), m_getter( g ), m_ownerHash( TYPE_HASH( Owner ) ), m_baseHash( TYPE_HASH( Base ) ), m_typeHash( TYPE_HASH( BASE_TYPE ) ) { @@ -403,9 +412,10 @@ public: template PROPERTY_ENUM( const wxString& aName, void ( Base::*aSetter )( SetType ), GetType( Base::*aGetter )() const, - PROPERTY_DISPLAY aDisplay = PT_DEFAULT ) + PROPERTY_DISPLAY aDisplay = PT_DEFAULT, + ORIGIN_TRANSFORMS::COORD_TYPES_T aCoordType = ORIGIN_TRANSFORMS::NOT_A_COORD ) : PROPERTY( aName, METHOD::Wrap( aSetter ), - METHOD::Wrap( aGetter ), aDisplay ) + METHOD::Wrap( aGetter ), aDisplay, aCoordType ) { if ( std::is_enum::value ) { diff --git a/include/property_mgr.h b/include/property_mgr.h index 4a5d3078c8..2a45a59ae2 100644 --- a/include/property_mgr.h +++ b/include/property_mgr.h @@ -37,6 +37,7 @@ class PROPERTY_BASE; class TYPE_CAST_BASE; +class ORIGIN_TRANSFORMS; ///< Unique type identifier using TYPE_ID = size_t; @@ -170,6 +171,9 @@ public: m_units = aUnits; } + ORIGIN_TRANSFORMS* GetTransforms() const { return m_originTransforms; } + void SetTransforms( ORIGIN_TRANSFORMS* aTransforms ) { m_originTransforms = aTransforms; } + /** * Rebuild the list of all registered properties. Needs to be called * once before GetProperty()/GetProperties() are used. @@ -190,8 +194,10 @@ public: std::vector GetMatchingClasses( PROPERTY_BASE* aProperty ); private: - PROPERTY_MANAGER() - : m_dirty( false ), m_units( EDA_UNITS::MILLIMETRES ) + PROPERTY_MANAGER() : + m_dirty( false ), + m_units( EDA_UNITS::MILLIMETRES ), + m_originTransforms( nullptr ) { } @@ -241,6 +247,8 @@ private: bool m_dirty; EDA_UNITS m_units; + + ORIGIN_TRANSFORMS* m_originTransforms; }; diff --git a/pcbnew/board_item.cpp b/pcbnew/board_item.cpp index 9c1e34222b..22910d0e9e 100644 --- a/pcbnew/board_item.cpp +++ b/pcbnew/board_item.cpp @@ -254,9 +254,11 @@ static struct BOARD_ITEM_DESC propMgr.InheritsAfter( TYPE_HASH( BOARD_ITEM ), TYPE_HASH( EDA_ITEM ) ); propMgr.AddProperty( new PROPERTY( _HKI( "Position X" ), - &BOARD_ITEM::SetX, &BOARD_ITEM::GetX, PROPERTY_DISPLAY::PT_COORD ) ); + &BOARD_ITEM::SetX, &BOARD_ITEM::GetX, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_X_COORD) ); propMgr.AddProperty( new PROPERTY( _HKI( "Position Y" ), - &BOARD_ITEM::SetY, &BOARD_ITEM::GetY, PROPERTY_DISPLAY::PT_COORD ) ); + &BOARD_ITEM::SetY, &BOARD_ITEM::GetY, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_Y_COORD) ); propMgr.AddProperty( new PROPERTY_ENUM( _HKI( "Layer" ), &BOARD_ITEM::SetLayer, &BOARD_ITEM::GetLayer ) ); propMgr.AddProperty( new PROPERTY( _HKI( "Locked" ), diff --git a/pcbnew/pcb_track.cpp b/pcbnew/pcb_track.cpp index 918fe0df66..44f930974e 100644 --- a/pcbnew/pcb_track.cpp +++ b/pcbnew/pcb_track.cpp @@ -1234,14 +1234,18 @@ static struct TRACK_VIA_DESC &PCB_TRACK::SetWidth, &PCB_TRACK::GetWidth, PROPERTY_DISPLAY::PT_SIZE ) ); propMgr.ReplaceProperty( TYPE_HASH( BOARD_ITEM ), _HKI( "Position X" ), new PROPERTY( _HKI( "Origin X" ), - &PCB_TRACK::SetX, &PCB_TRACK::GetX, PROPERTY_DISPLAY::PT_COORD ) ); + &PCB_TRACK::SetX, &PCB_TRACK::GetX, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_X_COORD) ); propMgr.ReplaceProperty( TYPE_HASH( BOARD_ITEM ), _HKI( "Position Y" ), new PROPERTY( _HKI( "Origin Y" ), - &PCB_TRACK::SetY, &PCB_TRACK::GetY, PROPERTY_DISPLAY::PT_COORD ) ); + &PCB_TRACK::SetY, &PCB_TRACK::GetY, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_Y_COORD ) ); propMgr.AddProperty( new PROPERTY( _HKI( "End X" ), - &PCB_TRACK::SetEndX, &PCB_TRACK::GetEndX, PROPERTY_DISPLAY::PT_COORD ) ); + &PCB_TRACK::SetEndX, &PCB_TRACK::GetEndX, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_X_COORD) ); propMgr.AddProperty( new PROPERTY( _HKI( "End Y" ), - &PCB_TRACK::SetEndY, &PCB_TRACK::GetEndY, PROPERTY_DISPLAY::PT_COORD ) ); + &PCB_TRACK::SetEndY, &PCB_TRACK::GetEndY, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_Y_COORD) ); // Arc REGISTER_TYPE( PCB_ARC ); @@ -1251,14 +1255,18 @@ static struct TRACK_VIA_DESC &PCB_ARC::SetWidth, &PCB_ARC::GetWidth, PROPERTY_DISPLAY::PT_SIZE ) ); propMgr.ReplaceProperty( TYPE_HASH( BOARD_ITEM ), _HKI( "Position X" ), new PROPERTY( _HKI( "Origin X" ), - &PCB_TRACK::SetX, &PCB_ARC::GetX, PROPERTY_DISPLAY::PT_COORD ) ); + &PCB_TRACK::SetX, &PCB_ARC::GetX, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_X_COORD) ); propMgr.ReplaceProperty( TYPE_HASH( BOARD_ITEM ), _HKI( "Position Y" ), new PROPERTY( _HKI( "Origin Y" ), - &PCB_TRACK::SetY, &PCB_ARC::GetY, PROPERTY_DISPLAY::PT_COORD ) ); + &PCB_TRACK::SetY, &PCB_ARC::GetY, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_Y_COORD) ); propMgr.AddProperty( new PROPERTY( _HKI( "End X" ), - &PCB_TRACK::SetEndX, &PCB_ARC::GetEndX, PROPERTY_DISPLAY::PT_COORD ) ); + &PCB_TRACK::SetEndX, &PCB_ARC::GetEndX, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_X_COORD) ); propMgr.AddProperty( new PROPERTY( _HKI( "End Y" ), - &PCB_TRACK::SetEndY, &PCB_ARC::GetEndY, PROPERTY_DISPLAY::PT_COORD ) ); + &PCB_TRACK::SetEndY, &PCB_ARC::GetEndY, PROPERTY_DISPLAY::PT_COORD, + ORIGIN_TRANSFORMS::ABS_Y_COORD) ); // Via REGISTER_TYPE( PCB_VIA );