JointFactory.cpp

#include "StdAfx.h"
#include "JointFactory.h"


#include "Joint.h"


using namespace Core;
using namespace Robotics;

using namespace System;
using namespace System::Diagnostics;


/// @note
/// LinkFactoryと形式を統一するために、
/// このようなクラスデザインとなっている。


/// XMLから生成する [ Constructor ]
JointFactory::JointFactory( System::Xml::XmlElement^ root ) :
    m_element( root )
{
}


/// 生成する
Joint^ JointFactory::Create()
{
    // インスタンスを生成する
    return FactoryMethod();
}

/// インスタンスを生成して返す
Joint^ JointFactory::FactoryMethod()
{
    // 関節を生成する
    Joint^ result = gcnew Joint(
        gcnew PositionVector( m_element ),  // 相対位置
        AxisVector::Create( m_element ),    // 軸方向
        Angle( m_element[ "angle" ] )       // 回転角
        );


    // 角度の要素を取得する
    Xml::XmlElement^ angleElement = m_element[ "angle" ];
    if( angleElement != nullptr )
    {
        double minimumDegree;
        double maximumDegree;

        // 要素を取得できたならば、範囲を取得する
        Trace::Assert( Double::TryParse( angleElement->GetAttribute( "minimum" ), minimumDegree ), "数値として有効である" );
        Trace::Assert( Double::TryParse( angleElement->GetAttribute( "maximum" ), maximumDegree ), "数値として有効である" );

        result->AngleRange = AngleRange(            // 角度の範囲
            Angle::CalculateRadian( minimumDegree ),
            Angle::CalculateRadian( maximumDegree )
        );
    }

    // 角速度の要素を取得する
    Xml::XmlElement^ angularVelocityElement = m_element[ "angularVelocity" ];
    if( angularVelocityElement != nullptr )
    {
        // 要素を取得できたならば、範囲を取得する
        double maximumDegree = Double::Parse( angularVelocityElement->GetAttribute( "maximum" ) );

        result->AngularVelocityRange = AngleRange(  // 角速度の範囲
            0.0,
            Angle::CalculateRadian( maximumDegree )
        );
    }

    // トルク定数の要素を取得する
    Xml::XmlElement^ torqueConstantElement = m_element[ "torqueConstant" ];
    if( torqueConstantElement != nullptr )
    {
        result->TorqueConstant = Double::Parse( torqueConstantElement->InnerText ); // トルク定数
    }
    return result;
}