Motion.h

#pragma once


namespace Core
{
    ref class Model;
    ref class Pose;

    typedef array< Robotics::AngularVelocity > AngularVelocities;
    typedef System::Collections::Generic::List< Pose^ > Poses;


    /// モーション
    public ref class Motion
    {
    // Construction --------------------------------------------------------
    public:
        Motion( Model^ model );


    // Operation -----------------------------------------------------------
    public:
        void AddToTypicalPose( Pose^ pose );
        int GetPoseIndex( Pose^ pose );

        Pose^ GetTypicalPoseJustBefore( Pose^ pose );
        Pose^ GetTypicalPoseJustAfter( Pose^ pose );

        AngularVelocities^ GetAngularVelocities( int poseIndex );
        Robotics::PositionVector^ GetDisplacementOfLink( int poseIndex, int linkIndex );
        Robotics::PositionVector^ GetVelocityOfLink( int poseIndex, int linkIndex );

        System::Xml::XmlElement^ SaveSettings( System::Xml::XmlDocument^ document );
        void LoadSettings( System::Xml::XmlDocument^ document );

    private:
        void InitializePose();

        int GetTypicalPoseIndex( Pose^ pose );
        void ComplementBetweenPoses( Pose^ before, Pose^ after );


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


    // Event ---------------------------------------------------------------
    public:
        event System::EventHandler^ Changed;   ///< 変更イベント


    // Attribute ===========================================================
    private:
        System::String^ m_name; ///< 名称

        Poses^ m_poses;         ///< ポーズ
        Poses^ m_typicalPoses;  ///< 特徴ポーズ

        int m_currentPoseIndex; ///< 現在のポーズのインデックス
        Model^ m_model;         ///< モデル


    // static
    public:
        literal double UnitTime = 0.1;  ///< 単位時間[ sec ]


    // Property ------------------------------------------------------------
    public:
        /// Indexer
        property Pose^ default[ int ]
        {
            Pose^ get( int index )
            {
                return m_poses[ index ];
            }
        }

        /// 名称
        property System::String^ Name
        {
            System::String^ get()
            {
                return m_name;
            }
            void set( System::String^ value )
            {
                m_name = value;
            }
        }


        /// 現在のポーズのインデックス
        property int CurrentPoseIndex
        {
            int get()
            {
                return m_currentPoseIndex;
            }
            void set(int value);
        }

        /// 現在のポーズ
        property Pose^ CurrentPose
        {
            Pose^ get()
            {
                return m_poses[ m_currentPoseIndex ];
            }
        }

        /// ポーズ数
        property int PoseCount
        {
            int get()
            {
                return m_poses->Count;
            }
        }


        /// 現在の時間[ sec ]
        property double CurrentTime
        {
            double get()
            {
                return m_currentPoseIndex * UnitTime;
            }
        }
    };
}