/********************************************************************/
/* Copyright (c) 2019 System fugen G.K. and Yuzi Mizuno          */
/* All rights reserved.                                             */
/********************************************************************/

/**
 * @file EvalCurveRadius.h
 * @brief class MGEvalCurveRadiusTool の宣言
 */
#pragma once

#include "Common/LocateState.h"

class MGCurve;
class MGEllipse;

/** 解析＞半径 メニューアイテムに対応するコマンドクラス。
 *
 *  コマンドの振る舞いは、マウスが曲線にスナップしたときに、
 *  その位置での曲率 (T, N, B) を評価する。
 *  そして曲率円を描画する。これを延々繰り返す。
 *
 *  マウスをクリックしたとき (OnLocated) に、
 *  その曲率半径を出力ウィンドウにシンプルに出力して、
 *  コマンドを終了する。
 */
class MGEvalCurveRadiusTool : public MGLocateState{
public:
	explicit MGEvalCurveRadiusTool(fugenDoc* pDoc);
	virtual MGCommandBase* initial_clone(fugenDoc* pDoc)const;
	virtual bool initiate_tool();

///Invoked when command is to terminate as a nomal end.
///display normal end message.
virtual bool OnCommandEnd(
	UINT nIDS,
	bool erase_temporary_display=true
);


	/// マウスカーソル位置の近くに曲線がある場合、
	/// 動的に曲線の曲率円を評価し、それを描画する。
	virtual void do_make_temporary_display(mgSysGL& sgl,fugenView* pView);

	/// 半径の値を出力ウィンドウに出力して、コマンドを終了する。
	virtual bool OnLocated(const MGLocateInfo& info);

private:
	/// locate されたcircle と line を求める
	void UpdatePreviewData(
		std::unique_ptr<MGEllipse>& circle,
		std::unique_ptr<MGCurve>& line
	);
};
