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;
}