Joint.h

#pragma once


#include "Distinction.h"    // < BaseClass >


namespace Core
{
    /// 関節
    [ System::ComponentModel::TypeConverter( CustomProperty::DisplayNameTypeConverter::typeid ) ]   // プロパティ表示の変換
    public ref class Joint : public Distinction
    {
    // Construction --------------------------------------------------------
    public:
        Joint( Robotics::PositionVector^ relativePosition, Robotics::AxisVector^ axialDirection, Robotics::Angle angle );


    // Operation -----------------------------------------------------------
    public:
        void AddAngleWithinRange( double value );
        void InitializeAngle();

        virtual System::String^ ToString() override;

        void CreateFigure( Microsoft::DirectX::Direct3D::Device^ device );
        void Render( Microsoft::DirectX::Direct3D::Device^ device );

        void RotateAroundAxis( Microsoft::DirectX::Direct3D::Device^ device );


    // Event Handler -------------------------------------------------------
    private:
        void OnMechanicsChanged( System::Object^ sender, System::EventArgs^ e );


    // Event ---------------------------------------------------------------
    public:
        event System::EventHandler^ AbsolutePositionChanged;    ///< 絶対位置の変更イベント

    // static
        static event System::EventHandler^ AngleChanged;        ///< 回転角の変更イベント
        static event System::EventHandler^ MechanicsChanged;    ///< 構造変化イベント


    // Attribute ===========================================================
    private:
        Robotics::PositionVector^ m_absolutePosition; ///< 絶対位置[ m ] (ワールド座標系)
        Robotics::PositionVector^ m_relativePosition; ///< 相対(他の関節に対する)位置[ m ] (ローカル座標系)

        Robotics::Angle m_angle;                      ///< 回転角[ rad ]
        Robotics::AngleRange m_angleRange;            ///< 回転角 範囲[ rad ]
        Robotics::AngleRange m_angularVelocityRange;  ///< 回転角速度 範囲[ rad/sec ]

        Robotics::Angle m_initialAngle;               ///< 初期回転角[ rad ]

        Robotics::AxisVector^ m_axialDirection;       ///< 軸方向 (ローカル座標系)

        double m_torqueConstant;                      ///< トルク定数[ Nm/A ]


    // Property ------------------------------------------------------------
    public:
        /// 絶対位置[ m ] (ワールド座標系)
        [ System::ComponentModel::Browsable( false ) ]  // 参照不可
        property Robotics::PositionVector^ AbsolutePosition
        {
            Robotics::PositionVector^ get()
            {
                return m_absolutePosition;
            }
            void set( Robotics::PositionVector^ value );
        }

        /// 相対(他の関節に対する)位置[ m ] (ローカル座標系)
        [ CustomProperty::DisplayName( "相対位置" ) ]
        [ System::ComponentModel::Description( "接続元の関節に対する相対位置を表します。" ) ]
        property Robotics::PositionVector^ RelativePosition
        {
            Robotics::PositionVector^ get()
            {
                return m_relativePosition;
            }
        }


        /// 回転角[ rad ]
        [ System::ComponentModel::Browsable( false ) ]  // 参照不可
        property Robotics::Angle Angle
        {
            Robotics::Angle get()
            {
                return m_angle;
            }
            void set( Robotics::Angle value );
        }

        /// 回転角 範囲[ rad ]
        [ CustomProperty::DisplayName( "回転角 範囲" ) ]
        [ System::ComponentModel::Description( "関節の動作角度を表します。" ) ]
        property Robotics::AngleRange AngleRange
        {
            Robotics::AngleRange get()
            {
                return m_angleRange;
            }
            void set( Robotics::AngleRange value )
            {
                m_angleRange = value;
            }
        }


        /// 回転角速度 範囲[ rad/sec ]
        [ CustomProperty::DisplayName( "回転角速度 範囲" ) ]
        property Robotics::AngleRange AngularVelocityRange
        {
            Robotics::AngleRange get()
            {
                return m_angularVelocityRange;
            }
            void set( Robotics::AngleRange value )
            {
                m_angularVelocityRange = value;
            }
        }


        /// 軸方向 (ローカル座標系)
        [ CustomProperty::DisplayName( "軸方向" ) ]
        [ System::ComponentModel::Description( "軸方向をベクトルで表します。" ) ]
        property Robotics::AxisVector^ AxialDirection
        {
            Robotics::AxisVector^ get()
            {
                return m_axialDirection;
            }
        }

        /// トルク定数[ Nm/A ]
        [ CustomProperty::DisplayName( "トルク定数" ) ]
        property double TorqueConstant
        {
            double get()
            {
                return m_torqueConstant;
            }
            void set( double value )
            {
                m_torqueConstant = value;
            }
        }
    };
}