//---------------------------------------------------------------------------
//  nnNodeAttribute.mel
//
//  Copyright (C) 2002 - 2011 SEGA Corporation CS R&D Support Department
//  All Rights Reserved.
//
//  Module  : nnNodeAttribute
//  File    : nnNodeAttribute.mel
//  Create  : 2002/12/03
//  Modify  : 2003/10/07
//          : 2003/10/21 : XBOX対応
//          : 2003/12/27 : Maya6.0対応
//          : 2004/01/27 : TRIGGERスペルミス修正
//          : 2004/03/22 : Node Name Attribute対応。
//          : 2004/03/30 : No Break Attribute追加。
//          : 2004/09/27 : Custom Rotation Epsilon Id追加。
//          : 2005/03/16 : 多機種対応
//          : 2008/07/28 : DirectX G2.0版対応
//          : 2009/10/28 : OpenGL ES 1.1 版対応
//          : 2010/09/29 : Qt UI対応。
//          : 2011/06/29 : OpenGL ES 2.0, PS Vita版追加。
//  Version : 1.20.00
//  Note    : nnNodeAttribute
//
//---------------------------------------------------------------------------

global string $nnNodeAttributeVersion = "1.20.00";

// NN プラグインロード情報取得
global proc int nnGetPluginInfoMayaNNExporter()
{
	int $info
			// HND2 Exporter
		= (	`pluginInfo -query -loaded "MAYA2011toHND2"`        ||
			`pluginInfo -query -loaded "MAYA2011toHND2"`        ||
			`pluginInfo -query -loaded "MAYA2012toHND2"`        ||
			`pluginInfo -query -loaded "MAYA2012toHND2"`        ||
			// HND2 Importer
			`pluginInfo -query -loaded "HND2toMAYA2011"`        ||
			`pluginInfo -query -loaded "HND2toMAYA2011x64"`     ||
			`pluginInfo -query -loaded "HND2toMAYA2012"`        ||
			`pluginInfo -query -loaded "HND2toMAYA2012x64"`     ||
			// Playstation2
			`pluginInfo -query -loaded "MAYA2011toNNPS2"`       ||
			`pluginInfo -query -loaded "MAYA2011x64toNNPS2"`    ||
			`pluginInfo -query -loaded "MAYA2012toNNPS2"`       ||
			`pluginInfo -query -loaded "MAYA2012x64toNNPS2"`    ||
			// GAMECUBE & WII
			`pluginInfo -query -loaded "MAYA2011toNNGC"`        ||
			`pluginInfo -query -loaded "MAYA2012toNNGC"`        ||
			// XBOX & DirectX G1.1
			`pluginInfo -query -loaded "MAYA2011toNNXB"`        ||
			`pluginInfo -query -loaded "MAYA2011x64toNNXB"`     ||
			`pluginInfo -query -loaded "MAYA2012toNNXB"`        ||
			`pluginInfo -query -loaded "MAYA2012x64toNNXB"`     ||
			// LINDBERGH
			`pluginInfo -query -loaded "MAYA2011toNNLB"`        ||
			`pluginInfo -query -loaded "MAYA2011x64toNNLB"`     ||
			`pluginInfo -query -loaded "MAYA2012toNNLB"`        ||
			`pluginInfo -query -loaded "MAYA2012x64toNNLB"`     ||
			// PSP
			`pluginInfo -query -loaded "MAYA2011toNNPSP"`       ||
			`pluginInfo -query -loaded "MAYA2011x64toNNPSP"`    ||
			`pluginInfo -query -loaded "MAYA2012toNNPSP"`       ||
			`pluginInfo -query -loaded "MAYA2012x64toNNPSP"`    ||
			// XBOX360
			`pluginInfo -query -loaded "MAYA2011toNNXB360"`     ||
			`pluginInfo -query -loaded "MAYA2011x64toNNXB360"`  ||
			`pluginInfo -query -loaded "MAYA2012toNNXB360"`     ||
			`pluginInfo -query -loaded "MAYA2012x64toNNXB360"`  ||
			// Playstation3
			`pluginInfo -query -loaded "MAYA2011toNNPS3"`       ||
			`pluginInfo -query -loaded "MAYA2011x64toNNPS3"`    ||
			`pluginInfo -query -loaded "MAYA2012toNNPS3"`       ||
			`pluginInfo -query -loaded "MAYA2012x64toNNPS3"`    ||
			// DirecX G2.0
			`pluginInfo -query -loaded "MAYA2011toNNDXG2"`      ||
			`pluginInfo -query -loaded "MAYA2011x64toNNDXG2"`   ||
			`pluginInfo -query -loaded "MAYA2012toNNDXG2"`      ||
			`pluginInfo -query -loaded "MAYA2012x64toNNDXG2"`   ||
			// OpenGL ES1.1
			`pluginInfo -query -loaded "MAYA2011toNNGLES11"`    ||
			`pluginInfo -query -loaded "MAYA2011x64toNNGLES11"` ||
			`pluginInfo -query -loaded "MAYA2012toNNGLES11"`    ||
			`pluginInfo -query -loaded "MAYA2012x64toNNGLES11"` ||
			// OpenGL ES2.0
			`pluginInfo -query -loaded "MAYA2011toNNGLES20"`    ||
			`pluginInfo -query -loaded "MAYA2011x64toNNGLES20"` ||
			`pluginInfo -query -loaded "MAYA2012toNNGLES20"`    ||
			`pluginInfo -query -loaded "MAYA2012x64toNNGLES20"` ||
			// PS Vita
			`pluginInfo -query -loaded "MAYA2011toNNGLES20"`    ||
			`pluginInfo -query -loaded "MAYA2011x64toNNGLES20"` ||
			`pluginInfo -query -loaded "MAYA2012toNNGLES20"`    ||
			`pluginInfo -query -loaded "MAYA2012x64toNNGLES20"`  );

	return $info;
}

//--------------------------------------------------------------------------//
//			nnNodeAttributeVersion											//
//--------------------------------------------------------------------------//
global proc nnNodeAttributeVersionNew( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list );
	// アトリビュート名を取得
	string $attr 		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( `attributeQuery -exists -node $nodeName $attr` == false ) {
		global string $nnNodeAttributeVersion;
		addAttr
			-dataType		"string"
			-longName		$attr
			-hidden			true
			$nodeName;
		// バージョン情報をセット
		setAttr $attrName -type "string" $nnNodeAttributeVersion;
		setAttr $attrName -lock true;
	}
	// hiddenフラグがTRUEでなければ一度アトリビュートを削除する
	else if( `addAttr -query -hidden $attrName` == false ) {
		deleteAttr $attrName;
		nnNodeAttributeVersionNew( $attrName );
	}
}

global proc nnNodeAttributeVersionReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list );
	// アトリビュート名を取得
	string $attr 		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( `attributeQuery -exists -node $nodeName $attr` == false ) {
		nnNodeAttributeVersionNew( $attrName );
	}
	// hiddenフラグがTRUEでなければ一度アトリビュートを削除する
	else if( `addAttr -query -hidden $attrName` == false ) {
		deleteAttr $attrName;
		nnNodeAttributeVersionNew( $attrName );
	}
}

//--------------------------------------------------------------------------//
//			nnNodeAttributeMainFrameLayout									//
//--------------------------------------------------------------------------//
global proc nnNodeAttributeMainFrameLayoutNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list );
	// アトリビュート名を取得
	string $attr 		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `frameLayout -exists $grpName` == false ) {
		// NnNodeAttributeEditorTemplateをセット
		setUITemplate -pushTemplate attributeEditorTemplate;
			frameLayout
				-collapsable	true
				-collapse		true
				-label 			"NN Node Attributes"
				-borderVisible 	true
				-borderStyle	"etchedIn"
				-marginWidth	5
				-marginHeight	5
				$grpName;
		setUITemplate -popTemplate;
	}
	// GUIの表示設定を変更
	int $nnPluginLoaded = nnGetPluginInfoMayaNNExporter();
	frameLayout -edit -visible ( $nnPluginLoaded ) $grpName;
}

global proc nnNodeAttributeMainFrameLayoutReplace( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `frameLayout -exists $grpName` == false ) {
		nnNodeAttributeMainFrameLayoutNew( $attrName );
	}
	// GUIの表示設定を変更
	int $nnPluginLoaded = nnGetPluginInfoMayaNNExporter();
	frameLayout -edit -visible ( $nnPluginLoaded ) $grpName;
}

//--------------------------------------------------------------------------//
//			nnNodeAttributeMainColumnLayout									//
//--------------------------------------------------------------------------//
global proc nnNodeAttributeMainColumnLayoutNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `columnLayout -exists $grpName` == false ) {
		setUITemplate -pushTemplate attributeEditorTemplate;
			setParent ( "nnNodeAttributeMainFrameLayout" + $nodeType );
				columnLayout
					-adjustableColumn true
					$grpName;
			setParent ..;
		setUITemplate -popTemplate;
	}
}

global proc nnNodeAttributeMainColumnLayoutReplace( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `columnLayout -exists $grpName` == false ) {
		nnNodeAttributeMainColumnLayoutNew( $attrName );
	}
}

//--------------------------------------------------------------------------//
//			nnModelAttributeFrameLayout										//
//--------------------------------------------------------------------------//
global proc nnModelAttributeFrameLayoutNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list );
	// アトリビュート名を取得
	string $attr 		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `frameLayout -exists $grpName` == false ) {
		// NnNodeAttributeEditorTemplateをセット
		setUITemplate -pushTemplate attributeEditorTemplate;
		setParent ("nnNodeAttributeMainColumnLayout" + $nodeType);
			frameLayout
				-label 			"Node Attributes"
				-borderStyle	"etchedIn"
				-collapsable	true
				-collapse		false
				-borderVisible 	true
				-marginWidth	5
				-marginHeight	5
				$grpName;
		setParent ..;
		setUITemplate -popTemplate;
	}
}

global proc nnModelAttributeFrameLayoutReplace( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `frameLayout -exists $grpName` == false ) {
		nnModelAttributeFrameLayoutNew( $attrName );
	}
}

//--------------------------------------------------------------------------//
//			nnModelAttributeColumnLayout									//
//--------------------------------------------------------------------------//
global proc nnModelAttributeColumnLayoutNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `columnLayout -exists $grpName` == false ) {
		setUITemplate -pushTemplate attributeEditorTemplate;
			setParent ( "nnModelAttributeFrameLayout" + $nodeType );
				columnLayout
					-adjustableColumn true
					$grpName;
			setParent ..;
		setUITemplate -popTemplate;
	}
}

global proc nnModelAttributeColumnLayoutReplace( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `columnLayout -exists $grpName` == false ) {
		nnModelAttributeColumnLayoutNew( $attrName );
	}
}

//----------------------------------------------------------------------------
//			nnNodeBreak
//----------------------------------------------------------------------------
global proc nnNodeBreakNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	int   $initCheck;

	// デフォルト値をセット
	if( $nodeType == "aimConstraint"		||
		$nodeType == "geometryConstraint"	||
		$nodeType == "hairConstraint"		||
		$nodeType == "normalConstraint"		||
		$nodeType == "orientConstraint"		||
		$nodeType == "parentConstraint"		||
		$nodeType == "pointConstraint"		||
		$nodeType == "poleVectorConstraint"	||
		$nodeType == "rigidConstraint"		||
		$nodeType == "scaleConstraint"		||
		$nodeType == "tangentConstraint"	) {
		$initCheck = true;
	}
	else {
		$initCheck = false;
	}

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		addAttr
			-attributeType	bool
			-longName		$attr
			$nodeName;
		// デフォルト値をセット
		setAttr $attrName $initCheck;
	}
	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName` ) {
		setParent ( "nnModelAttributeColumnLayout" + $nodeType );
			setUITemplate -pushTemplate attributeEditorTemplate;
				checkBoxGrp
					-label 				""
					-numberOfCheckBoxes 1
					-label1 			"Break (BK)"
					-value1 			$initCheck
					$grpName;
			setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName $attrName;
}

global proc nnNodeBreakReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName`) {
		nnNodeBreakNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		nnNodeBreakNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	else {
		connectControl -index 2 $grpName $attrName;
	}
}

//----------------------------------------------------------------------------
//			nnNodeNoBreak
//----------------------------------------------------------------------------
global proc nnNodeNoBreakNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		addAttr
			-attributeType	bool
			-longName		$attr
			$nodeName;
		// デフォルト値をセット
		setAttr $attrName false;
	}
	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName` ) {
		setParent ( "nnModelAttributeColumnLayout" + $nodeType );
			setUITemplate -pushTemplate attributeEditorTemplate;
				checkBoxGrp
					-label 				""
					-numberOfCheckBoxes 1
					-label1 			"No Break (Nb)"
					-value1 			false
					$grpName;
			setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName $attrName;
}

global proc nnNodeNoBreakReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName`) {
		nnNodeNoBreakNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		nnNodeNoBreakNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	else {
		connectControl -index 2 $grpName $attrName;
	}
}

//----------------------------------------------------------------------------
//			nnNodeSkip
//----------------------------------------------------------------------------
global proc nnNodeSkipNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		addAttr
			-attributeType	bool
			-longName		$attr
			$nodeName;
		// デフォルト値をセット
		setAttr $attrName false;
	}
	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName` ) {
		setParent ( "nnModelAttributeColumnLayout" + $nodeType );
			setUITemplate -pushTemplate attributeEditorTemplate;
				checkBoxGrp
					-label 				""
					-numberOfCheckBoxes 1
					-label1 			"Skip (Sp)"
					-value1 			false
					$grpName;
			setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName $attrName;
}

global proc nnNodeSkipReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName`) {
		nnNodeSkipNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		nnNodeSkipNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	else {
		connectControl -index 2 $grpName $attrName;
	}
}

//----------------------------------------------------------------------------
//			nnNodeFreeze
//----------------------------------------------------------------------------
global proc nnNodeFreezeNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		addAttr
			-attributeType	short
			-longName		$attr
			-minValue		0
			-maxValue		2
			$nodeName;
		// デフォルト値をセット
		setAttr $attrName 0;
	}
	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`optionMenuGrp -exists $grpName` ) {
		setParent ( "nnModelAttributeColumnLayout" + $nodeType );
			setUITemplate -pushTemplate attributeEditorTemplate;
				optionMenuGrp -label "Freeze" $grpName;
					menuItem -label "NONE"						-data 0;
					menuItem -label "FREEZE (Fz)"				-data 1;
					menuItem -label "FREEZE TO PARENT (Fzp)"	-data 2;
				setParent -menu ..;
			setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName $attrName;
}

global proc nnNodeFreezeReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`optionMenuGrp -exists $grpName`) {
		nnNodeFreezeNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		nnNodeFreezeNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	else {
		connectControl -index 2 $grpName $attrName;
	}
}

//----------------------------------------------------------------------------
//			nnNodeCircumsphere
//----------------------------------------------------------------------------
global proc nnNodeCircumsphereNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		addAttr
			-attributeType	bool
			-longName		$attr
			$nodeName;
		// デフォルト値をセット
		setAttr $attrName false;
	}

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
//	if ( !`checkBox -exists $grpName` ) {
	if ( !`checkBoxGrp -exists $grpName` ) {
		setParent ( "nnModelAttributeColumnLayout" + $nodeType );
			setUITemplate -pushTemplate attributeEditorTemplate;
				// columnLayout [[
				columnLayout
					-width					400;
					checkBoxGrp
						-label 				""
						-numberOfCheckBoxes 1
						-label1 			"Circumsphere (Cs)"
						-value1 			false
						$grpName;
				// ]] columnLayout
				setParent ..;
				rowLayout
					-columnWidth2		150 200
					-numberOfColumns	2;
					text
						-label "";
					text
						-align	"left"
						-label "( Available child node only. )";
				// ]] rowLayout
				setParent ..;
			setUITemplate -popTemplate;
		setParent ..;
	}

	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName $attrName;
}

global proc nnNodeCircumsphereReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName`) {
//	if ( !`checkBox -exists $grpName`) {
		nnNodeCircumsphereNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		nnNodeCircumsphereNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	else {
		connectControl -index 2 $grpName $attrName;
	}
}

//----------------------------------------------------------------------------
//			nnNodeResetRotation
//----------------------------------------------------------------------------
global proc nnNodeResetRotationNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		addAttr
			-attributeType	bool
			-longName		$attr
			$nodeName;
		// デフォルト値をセット
		setAttr $attrName false;
	}

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName` ) {
		setParent ( "nnModelAttributeColumnLayout" + $nodeType );
			setUITemplate -pushTemplate attributeEditorTemplate;
				checkBoxGrp
					-label 				""
					-numberOfCheckBoxes 1
					-label1 			"Reset Rotation (Rr)"
					-value1 			false
					$grpName;
			setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName $attrName;
}

global proc nnNodeResetRotationReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName`) {
		nnNodeResetRotationNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		nnNodeResetRotationNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	else {
		connectControl -index 2 $grpName $attrName;
	}
}

//----------------------------------------------------------------------------
// 			nnNodeUserData
//----------------------------------------------------------------------------
global string $nnBeforeNodeUserData;
global proc nnNodeUserDataNew( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		addAttr
			-dataType		"string"
			-longName		$attr
			$nodeName;
		// デフォルト値をセット
		setAttr $attrName -type "string" "0x00000000";
	}
	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`textField -exists $grpName`) {
		setParent ( "nnModelAttributeColumnLayout" + $nodeType );
			setUITemplate -pushTemplate attributeEditorTemplate;
				rowLayout
					-numberOfColumns	3
					-columnWidth		2 70
					-columnWidth		3 200
					-columnAlign3		right center right
					("nnNodeUserDataRowLayout"+$nodeType);
					text
						-label "User Data (X)";
					textField
						-text	"0x00000000"
						-changeCommand ( "nnCheckNodeUserData " + $attrName )
						-receiveFocusCommand ( "nnSaveNodeUserData " + $attrName )
						$grpName;
					text
						-label "HEX ( 0x======== ) / DEC ( ======== )";
				setParent ..;

				separator -style "in";

			setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName $attrName;
}
global proc nnNodeUserDataReplace( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`textField -exists $grpName`) {
		nnNodeUserDataNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		nnNodeUserDataNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	else {
		connectControl -index 2 $grpName $attrName;
	}
}

global proc nnCheckNodeUserData( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// 現在のUserDataの値を取得
	string $userdata	= `textField -query -text $grpName`;

	int $startindex;
	string $matchdata;
	// HEX
	if( substring( $userdata, 1, 1 ) == "0" && substring( $userdata, 2, 2 ) == "x" ) {
		$startindex = 3;
		$matchdata = "0123456789abcdefABCDEF";
	}
	// DEC
	else {
		$startindex = 1;
		$matchdata = "0123456789";
	}

	int $i;
	global string $nnBeforeNodeUserData;
	// 入力されたUserDataをチェック
	for( $i = $startindex; $i <= (size($userdata)); $i++ ) {
		// 8桁以上の場合
		if( $i >= $startindex + 8 ) {
			warning( "nnCheckNodeUserData : input UserData [" + $userdata + "] is over eight figures [========]!\n" );
			setAttr $attrName -type "string" $nnBeforeNodeUserData;
			return;
		}
		string $charactor = substring( $userdata, $i, $i );
		// 不正な文字が入力された場合
		if( match( $charactor, $matchdata ) == "" ) {
			warning( "nnCheckNodeUserData : input UserData [" + $userdata + "] is invalid valuable!\n" );
			setAttr $attrName -type "string" $nnBeforeNodeUserData;
			return;
		}
	}
}

global proc nnSaveNodeUserData( string $attrName )
{
	global string $nnBeforeNodeUserData;
	// UserDataをセット
	$nnBeforeNodeUserData = `getAttr $attrName`;
}

//----------------------------------------------------------------------------
//			nnNodeHide
//----------------------------------------------------------------------------
global proc nnNodeHideNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		addAttr
			-attributeType	short
			-longName		$attr
			-minValue		0
			-maxValue		2
			$nodeName;
		// デフォルト値をセット
		setAttr $attrName 0;
	}
	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`optionMenuGrp -exists $grpName` ) {
		setParent ( "nnModelAttributeColumnLayout" + $nodeType );
			setUITemplate -pushTemplate attributeEditorTemplate;
				optionMenuGrp -label "Hide" $grpName;
					menuItem -label "NONE"				-data 0;
					menuItem -label "HIDE (Hd)"			-data 1;
					menuItem -label "HIDE BRANCH (Hdb)"	-data 2;
				setParent -menu ..;
			setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName $attrName;
}

global proc nnNodeHideReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`optionMenuGrp -exists $grpName`) {
		nnNodeHideNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		nnNodeHideNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	else {
		connectControl -index 2 $grpName $attrName;
	}
}

//----------------------------------------------------------------------------
//			nnNodeDisableFogging
//----------------------------------------------------------------------------
global proc nnNodeDisableFoggingNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		addAttr
			-attributeType	bool
			-longName		$attr
			$nodeName;
		// デフォルト値をセット
		setAttr $attrName false;
	}

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName` ) {
		setParent ( "nnModelAttributeColumnLayout" + $nodeType );
			setUITemplate -pushTemplate attributeEditorTemplate;
				// columnLayout [[
				columnLayout
					-width					400;
					checkBoxGrp
						-label 				""
						-numberOfCheckBoxes 1
						-label1 			"Disable Fogging (Df)"
						-value1 			false
						$grpName;
				// ]] columnLayout
				setParent ..;
				rowLayout
					-columnWidth2		150 200
					-numberOfColumns	2;
					text
						-label "";
					text
						-align	"left"
						-label "( Available root node only. )";
				// ]] rowLayout
				setParent ..;
			setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName $attrName;
}

global proc nnNodeDisableFoggingReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName`) {
		nnNodeDisableFoggingNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		nnNodeDisableFoggingNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	else {
		connectControl -index 2 $grpName $attrName;
	}
}

//----------------------------------------------------------------------------
//			nnNodeSeparateSkinModel
//----------------------------------------------------------------------------
global proc nnNodeSeparateSkinModelNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		addAttr
			-attributeType	bool
			-longName		$attr
			$nodeName;
		// デフォルト値をセット
		setAttr $attrName false;
	}

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName` ) {
		setParent ( "nnModelAttributeColumnLayout" + $nodeType );
			setUITemplate -pushTemplate attributeEditorTemplate;
				// columnLayout [[
				columnLayout
					-width					400;
					checkBoxGrp
						-label 				""
						-numberOfCheckBoxes 1
						-label1 			"Separate Skin Model (Sm)"
						-value1 			false
						$grpName;
				// ]] columnLayout
				setParent ..;
				rowLayout
					-columnWidth2		150 200
					-numberOfColumns	2;
					text
						-label "";
					text
						-align	"left"
						-label "( Available root node only. )";
				// ]] rowLayout
				setParent ..;
			setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName $attrName;
}

global proc nnNodeSeparateSkinModelReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName`) {
		nnNodeSeparateSkinModelNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		nnNodeSeparateSkinModelNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	else {
		connectControl -index 2 $grpName $attrName;
	}
}

//----------------------------------------------------------------------------
//			nnNodeSeparateNodeTree
//----------------------------------------------------------------------------
global proc nnNodeSeparateNodeTreeNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		addAttr
			-attributeType	bool
			-longName		$attr
			$nodeName;
		// デフォルト値をセット
		setAttr $attrName false;
	}

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName` ) {
		setParent ( "nnModelAttributeColumnLayout" + $nodeType );
			setUITemplate -pushTemplate attributeEditorTemplate;
				// columnLayout [[
				columnLayout
					-width					400;
					checkBoxGrp
						-label 				""
						-numberOfCheckBoxes 1
						-label1 			"Separate Node Tree (St)"
						-value1 			false
						$grpName;
					// ]] columnLayout
					setParent ..;
				rowLayout
					-columnWidth2		150 200
					-numberOfColumns	2;
					text
						-label "";
					text
						-align	"left"
						-label "( Available root node only. )";
				// ]] rowLayout
				setParent ..;
			setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName $attrName;
}

global proc nnNodeSeparateNodeTreeReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`checkBoxGrp -exists $grpName`) {
		nnNodeSeparateNodeTreeNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		nnNodeSeparateNodeTreeNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	else {
		connectControl -index 2 $grpName $attrName;
	}
}

//----------------------------------------------------------------------------
//			nnRotEpsilonId
//----------------------------------------------------------------------------
global proc nnRotEpsilonIdNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		addAttr
			-attributeType	short
			-longName		$attr
			-minValue		0
			-maxValue		4
			$nodeName;
		// デフォルト値をセット
		setAttr $attrName 0;
	}
	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`optionMenuGrp -exists $grpName` ) {
		setParent ( "nnModelAttributeColumnLayout" + $nodeType );
			setUITemplate -pushTemplate attributeEditorTemplate;
				optionMenuGrp -label "Rotation Epsilon" $grpName;
					menuItem -label "NORMAL"					-data 0;
					menuItem -label "CUSTOM ROTATION 1 (Re1)"	-data 1;
					menuItem -label "CUSTOM ROTATION 2 (Re2)"	-data 2;
					menuItem -label "CUSTOM ROTATION 3 (Re3)"	-data 3;
					menuItem -label "CUSTOM ROTATION 4 (Re4)"	-data 4;
				setParent -menu ..;
			setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName $attrName;
}

global proc nnRotEpsilonIdReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`optionMenuGrp -exists $grpName`) {
		nnRotEpsilonIdNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		nnRotEpsilonIdNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	else {
		connectControl -index 2 $grpName $attrName;
	}
}


//--------------------------------------------------------------------------//
//			nnMorphAttributeFrameLayout										//
//--------------------------------------------------------------------------//
global proc nnMorphAttributeFrameLayoutNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list );
	// アトリビュート名を取得
	string $attr 		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `frameLayout -exists $grpName` == false ) {
		// NnNodeAttributeEditorTemplateをセット
		setUITemplate -pushTemplate attributeEditorTemplate;
		setParent ("nnNodeAttributeMainColumnLayout" + $nodeType);
			frameLayout
				-label 			"Morph Attributes"
				-borderStyle	"etchedIn"
				-collapsable	true
				-collapse		true
				-borderVisible 	true
				-marginWidth	5
				-marginHeight	5
				$grpName;
		setParent ..;
		setUITemplate -popTemplate;
	}
}

global proc nnMorphAttributeFrameLayoutReplace( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `frameLayout -exists $grpName` == false ) {
		nnMorphAttributeFrameLayoutNew( $attrName );
	}
}

//--------------------------------------------------------------------------//
//			nnMorphAttributeColumnLayout									//
//--------------------------------------------------------------------------//
global proc nnMorphAttributeColumnLayoutNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `columnLayout -exists $grpName` == false ) {
		setUITemplate -pushTemplate attributeEditorTemplate;
			setParent ( "nnMorphAttributeFrameLayout" + $nodeType );
				columnLayout
					-adjustableColumn true
					$grpName;
			setParent ..;
		setUITemplate -popTemplate;
	}
}

global proc nnMorphAttributeColumnLayoutReplace( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `columnLayout -exists $grpName` == false ) {
		nnMorphAttributeColumnLayoutNew( $attrName );
	}
}

//----------------------------------------------------------------------------
//			nnOutputMorphType
//----------------------------------------------------------------------------
global proc nnOutputMorphTypeNew( string $attrName1, string $attrName2, string $attrName3, string $attrName4 )
{
	string $list[];
	string $attr[];

	// アトリビュート名1を"."で文字列を分割する。
	tokenize( $attrName1, ".", $list );
	// アトリビュート名を取得
	$attr[0] = $list[1];
	// アトリビュート名2を"."で文字列を分割する。
	tokenize( $attrName2, ".", $list );
	// アトリビュート名を取得
	$attr[1] = $list[1];
	// アトリビュート名3を"."で文字列を分割する。
	tokenize( $attrName3, ".", $list );
	// アトリビュート名を取得
	$attr[2] = $list[1];
	// アトリビュート名4を"."で文字列を分割する。
	tokenize( $attrName4, ".", $list );
	// アトリビュート名を取得
	$attr[3] = $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName[];
	$grpName[0] 	= "nnOutputMorphType1" + $nodeType;
	// コントロール名を作成
	$grpName[1] 	= "nnOutputMorphType2" + $nodeType;

	int $i;
	for( $i = 0; $i < 4; $i++ ){
		// ノードにアトリビュートがなければ新規にアトリビュート作成
		if ( `attributeQuery -exists -node $nodeName $attr[$i]` == false ) {
			addAttr
				-attributeType	bool
				-longName		$attr[$i]
				$nodeName;
			// デフォルト値をセット
			if( $attr[$i] == "nnMorphVtx" ) {
				setAttr ($nodeName+"."+$attr[$i]) true;
			}
			else {
				setAttr ($nodeName+"."+$attr[$i]) false;
			}
		}
	}

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( `checkBoxGrp -exists $grpName[0]` == false ) {
		setUITemplate -pushTemplate attributeEditorTemplate;
		setParent ("nnMorphAttributeColumnLayout" + $nodeType);
			checkBoxGrp
				-numberOfCheckBoxes	2
				-label				"Output Component"
				-label1				"Position"
				-label2				"Normal"
				$grpName[0];
		setParent ..;
		setUITemplate -popTemplate;
	}
	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( `checkBoxGrp -exists $grpName[1]` == false ) {
		setUITemplate -pushTemplate attributeEditorTemplate;
		setParent ("nnMorphAttributeColumnLayout" + $nodeType);
			checkBoxGrp
				-numberOfCheckBoxes	2
				-label				""
				-label1				"Color"
				-label2				"UV"
				$grpName[1];
		setParent ..;
		setUITemplate -popTemplate;
	}
	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName[0] $attrName1;
	connectControl -index 3 $grpName[0] $attrName2;
	connectControl -index 2 $grpName[1] $attrName3;
	connectControl -index 3 $grpName[1] $attrName4;
}

global proc nnOutputMorphTypeReplace( string $attrName1, string $attrName2, string $attrName3, string $attrName4 )
{
	string $list[];
	string $attr[];

	// アトリビュート名1を"."で文字列を分割する。
	tokenize( $attrName1, ".", $list );
	// アトリビュート名を取得
	$attr[0] = $list[1];
	// アトリビュート名2を"."で文字列を分割する。
	tokenize( $attrName2, ".", $list );
	// アトリビュート名を取得
	$attr[1] = $list[1];
	// アトリビュート名3を"."で文字列を分割する。
	tokenize( $attrName3, ".", $list );
	// アトリビュート名を取得
	$attr[2] = $list[1];
	// アトリビュート名4を"."で文字列を分割する。
	tokenize( $attrName4, ".", $list );
	// アトリビュート名を取得
	$attr[3] = $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	// コントロール名を作成
	string $grpName[];
	$grpName[0] 	= "nnOutputMorphType1" + $nodeType;
	// コントロール名を作成
	$grpName[1] 	= "nnOutputMorphType2" + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if		( `checkBoxGrp -exists $grpName[0]` == false ) {
		nnOutputMorphTypeNew( $attrName1, $attrName2, $attrName3, $attrName4 );
	}
	else if ( `checkBoxGrp -exists $grpName[1]` == false ) {
		nnOutputMorphTypeNew( $attrName1, $attrName2, $attrName3, $attrName4 );
	}
	// ノードにアトリビュート(nnMorphVtx)がなければ新規にアトリビュート作成
	else if ( `attributeQuery -exists -node $nodeName $attr[0]` == false ) {
		nnOutputMorphTypeNew( $attrName1, $attrName2, $attrName3, $attrName4 );
	}
	// ノードにアトリビュート(nnMorphVtxNrm)がなければ新規にアトリビュート作成
	else if ( `attributeQuery -exists -node $nodeName $attr[1]` == false ) {
		nnOutputMorphTypeNew( $attrName1, $attrName2, $attrName3, $attrName4 );
	}
	// ノードにアトリビュート(nnMorphVtxCol)がなければ新規にアトリビュート作成
	else if ( `attributeQuery -exists -node $nodeName $attr[2]` == false ) {
		nnOutputMorphTypeNew( $attrName1, $attrName2, $attrName3, $attrName4 );
	}
	// ノードにアトリビュート(nnMorphUV)がなければ新規にアトリビュート作成
	else if ( `attributeQuery -exists -node $nodeName $attr[3]` == false ) {
		nnOutputMorphTypeNew( $attrName1, $attrName2, $attrName3, $attrName4 );
	}
	// アトリビュートとコントロールを接続する
	else {
		// アトリビュートとコントロールを接続する
		connectControl -index 2 $grpName[0] $attrName1;
		connectControl -index 3 $grpName[0] $attrName2;
		connectControl -index 2 $grpName[1] $attrName3;
		connectControl -index 3 $grpName[1] $attrName4;
	}
}

//--------------------------------------------------------------------------//
//			nnShapeAttributeFrameLayout										//
//--------------------------------------------------------------------------//
global proc nnShapeAttributeFrameLayoutNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list );
	// アトリビュート名を取得
	string $attr 		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `frameLayout -exists $grpName` == false ) {
		// NnNodeAttributeEditorTemplateをセット
		setUITemplate -pushTemplate attributeEditorTemplate;
		setParent ("nnNodeAttributeMainColumnLayout" + $nodeType);
			frameLayout
				-label 			"Shape Attributes"
				-borderStyle	"etchedIn"
				-collapsable	true
				-collapse		true
				-borderVisible 	true
				-marginWidth	5
				-marginHeight	5
				$grpName;
		setParent ..;
		setUITemplate -popTemplate;
	}
}

global proc nnShapeAttributeFrameLayoutReplace( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `frameLayout -exists $grpName` == false ) {
		nnShapeAttributeFrameLayoutNew( $attrName );
	}
}

//--------------------------------------------------------------------------//
//			nnShapeAttributeColumnLayout									//
//--------------------------------------------------------------------------//
global proc nnShapeAttributeColumnLayoutNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `columnLayout -exists $grpName` == false ) {
		setUITemplate -pushTemplate attributeEditorTemplate;
			setParent ( "nnShapeAttributeFrameLayout" + $nodeType );
				columnLayout
					-adjustableColumn true
					$grpName;
			setParent ..;
		setUITemplate -popTemplate;
	}
}

global proc nnShapeAttributeColumnLayoutReplace( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `columnLayout -exists $grpName` == false ) {
		nnShapeAttributeColumnLayoutNew( $attrName );
	}
}

//----------------------------------------------------------------------------
//			nnShapeKey
//----------------------------------------------------------------------------
global proc nnShapeKeyNew( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( `attributeQuery -exists -node $nodeName $attr` == false ) {
		addAttr
			-attributeType	long
			-longName		$attr
			-keyable		true
			$nodeName;
	}
	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( `attrFieldSliderGrp -exists $grpName` == false ) {
		setParent ("nnShapeAttributeColumnLayout" + $nodeType);
		setUITemplate -pushTemplate attributeEditorTemplate;
			attrFieldSliderGrp
				-label			"Shape Key"
				-minValue 		0
				-maxValue		0
				$grpName;
			separator -style "in";
		setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	attrFieldSliderGrp -edit -attribute $attrName $grpName;
}

global proc nnShapeKeyReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( `attrFieldSliderGrp -exists $grpName` == false ) {
		nnShapeKeyNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( `attributeQuery -exists -node $nodeName $attr` == false ) {
		nnShapeKeyNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	attrFieldSliderGrp -edit -attribute $attrName $grpName;
}

//----------------------------------------------------------------------------
//			nnOutputShapeType
//----------------------------------------------------------------------------
global proc nnOutputShapeTypeNew( string $attrName1, string $attrName2, string $attrName3, string $attrName4 )
{
	string $list[];
	string $attr[];

	// アトリビュート名1を"."で文字列を分割する。
	tokenize( $attrName1, ".", $list );
	// アトリビュート名を取得
	$attr[0] = $list[1];
	// アトリビュート名2を"."で文字列を分割する。
	tokenize( $attrName2, ".", $list );
	// アトリビュート名を取得
	$attr[1] = $list[1];
	// アトリビュート名3を"."で文字列を分割する。
	tokenize( $attrName3, ".", $list );
	// アトリビュート名を取得
	$attr[2] = $list[1];
	// アトリビュート名4を"."で文字列を分割する。
	tokenize( $attrName4, ".", $list );
	// アトリビュート名を取得
	$attr[3] = $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName[];
	$grpName[0] 	= "nnOutputShapeType1" + $nodeType;
	// コントロール名を作成
	$grpName[1] 	= "nnOutputShapeType2" + $nodeType;

	int $i;
	for( $i = 0; $i < 4; $i++ ){
		// ノードにアトリビュートがなければ新規にアトリビュート作成
		if ( !`attributeQuery -exists -node $nodeName $attr[$i]` ) {
			addAttr
				-attributeType	bool
				-longName		$attr[$i]
				$nodeName;
			// デフォルト値をセット
			if( $attr[$i] == "nnShapeVtx" || $attr[$i] == "nnShapeVtxNrm" ) {
				setAttr ($nodeName+"."+$attr[$i]) true;
			}
			else {
				setAttr ($nodeName+"."+$attr[$i]) false;
			}
		}
	}

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( `checkBoxGrp -exists $grpName[0]` == false ) {
		setUITemplate -pushTemplate attributeEditorTemplate;
		setParent ("nnShapeAttributeColumnLayout" + $nodeType);
			checkBoxGrp
				-numberOfCheckBoxes	2
				-label				"Output Component"
				-label1				"Position"
				-label2				"Normal"
				$grpName[0];
		setParent ..;
		setUITemplate -popTemplate;
	}
	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( `checkBoxGrp -exists $grpName[1]` == false ) {
		setUITemplate -pushTemplate attributeEditorTemplate;
		setParent ("nnShapeAttributeColumnLayout" + $nodeType);
			checkBoxGrp
				-numberOfCheckBoxes	2
				-label				""
				-label1				"Color"
				-label2				"UV"
				$grpName[1];
		setParent ..;
		setUITemplate -popTemplate;
	}
	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName[0] $attrName1;
	connectControl -index 3 $grpName[0] $attrName2;
	connectControl -index 2 $grpName[1] $attrName3;
	connectControl -index 3 $grpName[1] $attrName4;
}

global proc nnOutputShapeTypeReplace( string $attrName1, string $attrName2, string $attrName3, string $attrName4 )
{
	string $list[];
	string $attr[];

	// アトリビュート名1を"."で文字列を分割する。
	tokenize( $attrName1, ".", $list );
	// アトリビュート名を取得
	$attr[0] = $list[1];
	// アトリビュート名2を"."で文字列を分割する。
	tokenize( $attrName2, ".", $list );
	// アトリビュート名を取得
	$attr[1] = $list[1];
	// アトリビュート名3を"."で文字列を分割する。
	tokenize( $attrName3, ".", $list );
	// アトリビュート名を取得
	$attr[2] = $list[1];
	// アトリビュート名4を"."で文字列を分割する。
	tokenize( $attrName4, ".", $list );
	// アトリビュート名を取得
	$attr[3] = $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName[];
	$grpName[0] 	= "nnOutputShapeType1" + $nodeType;
	// コントロール名を作成
	$grpName[1] 	= "nnOutputShapeType2" + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if		( `checkBoxGrp -exists $grpName[0]` == false ) {
		nnOutputShapeTypeNew( $attrName1, $attrName2, $attrName3, $attrName4 );
	}
	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	else if ( `checkBoxGrp -exists $grpName[1]` == false ) {
		nnOutputShapeTypeNew( $attrName1, $attrName2, $attrName3, $attrName4 );
	}
	// ノードにアトリビュート(nnShapeVtx)がなければ新規にアトリビュート作成
	else if ( `attributeQuery -exists -node $nodeName $attr[0]` == false ) {
		nnOutputShapeTypeNew( $attrName1, $attrName2, $attrName3, $attrName4 );
	}
	// ノードにアトリビュート(nnShapeVtxNrm)がなければ新規にアトリビュート作成
	else if ( `attributeQuery -exists -node $nodeName $attr[1]` == false ) {
		nnOutputShapeTypeNew( $attrName1, $attrName2, $attrName3, $attrName4 );
	}
	// ノードにアトリビュート(nnShapeVtxNrm)がなければ新規にアトリビュート作成
	else if ( `attributeQuery -exists -node $nodeName $attr[2]` == false ) {
		nnOutputShapeTypeNew( $attrName1, $attrName2, $attrName3, $attrName4 );
	}
	// ノードにアトリビュート(nnShapeVtxCol)がなければ新規にアトリビュート作成
	else if ( `attributeQuery -exists -node $nodeName $attr[3]` == false ) {
		nnOutputShapeTypeNew( $attrName1, $attrName2, $attrName3, $attrName4 );
	}
	// アトリビュートとコントロールを接続する
	else {
		// アトリビュートとコントロールを接続する
		connectControl -index 2 $grpName[0] $attrName1;
		connectControl -index 3 $grpName[0] $attrName2;
		connectControl -index 2 $grpName[1] $attrName3;
		connectControl -index 3 $grpName[1] $attrName4;
	}
}
//--------------------------------------------------------------------------//
//			nnUserKeyAttributeFrameLayout												//
//--------------------------------------------------------------------------//
global proc nnUserKeyAttributeFrameLayoutNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list );
	// アトリビュート名を取得
	string $attr 		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `frameLayout -exists $grpName` == false ) {
		// NnNodeAttributeEditorTemplateをセット
		setUITemplate -pushTemplate attributeEditorTemplate;
		setParent ("nnNodeAttributeMainColumnLayout" + $nodeType);
			frameLayout
				-label 			"Node User Data Key Motion Attributes"
				-borderStyle	"etchedIn"
				-collapsable	true
				-collapse		true
				-borderVisible 	true
				-marginWidth	5
				-marginHeight	5
				$grpName;
		setParent ..;
		setUITemplate -popTemplate;
	}
}

global proc nnUserKeyAttributeFrameLayoutReplace( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `frameLayout -exists $grpName` == false ) {
		nnUserKeyAttributeFrameLayoutNew( $attrName );
	}
}


//--------------------------------------------------------------------------//
//			nnUserKeyAttributeColumnLayout												//
//--------------------------------------------------------------------------//
global proc nnUserKeyAttributeColumnLayoutNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `columnLayout -exists $grpName` == false ) {
		setUITemplate -pushTemplate attributeEditorTemplate;
			setParent ( "nnUserKeyAttributeFrameLayout" + $nodeType );
				columnLayout
					-adjustableColumn true
					$grpName;
			setParent ..;
		setUITemplate -popTemplate;
	}
}

global proc nnUserKeyAttributeColumnLayoutReplace( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// レイアウト名を作成
	string $grpName 	= $attr + $nodeType;
	// レイアウトがなければ新規にレイアウトを作成
	if ( `columnLayout -exists $grpName` == false ) {
		nnUserKeyAttributeColumnLayoutNew( $attrName );
	}
}

//----------------------------------------------------------------------------
//			nnUserFloatKey
//----------------------------------------------------------------------------
global proc nnUserFloatKeyNew( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( `attributeQuery -exists -node $nodeName $attr` == false ) {
		addAttr
			-attributeType	"float"
			-longName		$attr
			-keyable		true
			$nodeName;
	}
	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( `attrFieldSliderGrp -exists $grpName` == false ) {
		setParent ("nnUserKeyAttributeColumnLayout" + $nodeType);
		setUITemplate -pushTemplate attributeEditorTemplate;
			attrFieldSliderGrp
				-label			"Float Key"
				$grpName;
			separator -style "in";
		setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	attrFieldSliderGrp -edit -attribute $attrName $grpName;
}

global proc nnUserFloatKeyReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( `attrFieldSliderGrp -exists $grpName` == false ) {
		nnUserFloatKeyNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( `attributeQuery -exists -node $nodeName $attr` == false ) {
		nnUserFloatKeyNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	attrFieldSliderGrp -edit -attribute $attrName $grpName;
}

//----------------------------------------------------------------------------
//			nnUserIntegerInterpType
//----------------------------------------------------------------------------
global proc nnUserIntegerInterpTypeNew( string $attrName )
{
	string $list[];
	// アトリビュート名を"."で文字列を分割する。
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		addAttr
			-attributeType	short
			-longName		$attr
			-minValue		0
			-maxValue		2
			$nodeName;
		// デフォルト値をセット
		setAttr $attrName 0;
	}
	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`optionMenuGrp -exists $grpName` ) {
		setParent ( "nnUserKeyAttributeColumnLayout" + $nodeType );
			setUITemplate -pushTemplate attributeEditorTemplate;
				optionMenuGrp -label "Interporation Type" $grpName;
//					menuItem -label "NONE"			-data 0;
					menuItem -label "CONSTANT"		-data 1;
					menuItem -label "TRIGGER"		-data 2;
				setParent -menu ..;
			setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	connectControl -index 2 $grpName $attrName;
}

global proc nnUserIntegerInterpTypeReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( !`optionMenuGrp -exists $grpName`) {
		nnUserIntegerInterpTypeNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( !`attributeQuery -exists -node $nodeName $attr` ) {
		nnUserIntegerInterpTypeNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	else {
		connectControl -index 2 $grpName $attrName;
	}
}

//----------------------------------------------------------------------------
//			nnUserIntegerKey
//----------------------------------------------------------------------------
global proc nnUserIntegerKeyNew( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// ノードにアトリビュートがなければ新規にアトリビュート作成
	if ( `attributeQuery -exists -node $nodeName $attr` == false ) {
		addAttr
			-attributeType	long
			-longName		$attr
			-keyable		true
			$nodeName;
	}
	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( `attrFieldSliderGrp -exists $grpName` == false ) {
		setParent ("nnUserKeyAttributeColumnLayout" + $nodeType);
		setUITemplate -pushTemplate attributeEditorTemplate;
			attrFieldSliderGrp
				-label			"Integer Key"
				$grpName;
		setUITemplate -popTemplate;
		setParent ..;
	}
	// アトリビュートとコントロールを接続する
	attrFieldSliderGrp -edit -attribute $attrName $grpName;
}

global proc nnUserIntegerKeyReplace( string $attrName )
{
	// アトリビュート名を"."で文字列を分割する。
	string $list[];
	tokenize( $attrName, ".", $list);
	// アトリビュート名を取得
	string $attr		= $list[1];
	// ノード名を取得
	string $nodeName 	= $list[0];
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;
	// コントロール名を作成
	string $grpName 	= $attr + $nodeType;

	// アトリビュートに接続するコントロールがなければ新規にコントロール作成
	if ( `attrFieldSliderGrp -exists $grpName` == false ) {
		nnUserIntegerKeyNew( $attrName );
	}
	// ノードにアトリビュートがなければ新規にアトリビュート作成
	else if ( `attributeQuery -exists -node $nodeName $attr` == false ) {
		nnUserIntegerKeyNew( $attrName );
	}
	// アトリビュートとコントロールを接続する
	attrFieldSliderGrp -edit -attribute $attrName $grpName;
}

//--------------------------------------------------------------------------//
//																			//
//			nnNodeAttribute													//
//																			//
//--------------------------------------------------------------------------//
global proc nnNodeAttribute( string $nodeName )
{
	// ノードタイプを取得
	string $nodeType 	= `nodeType $nodeName`;

	// nnNodeAttributeVersion
	editorTemplate
		-callCustom "nnNodeAttributeVersionNew"
					"nnNodeAttributeVersionReplace"
					"nnNodeAttributeVersion";

	// nnNodeAttributeMainFrameLayout
	editorTemplate
		-callCustom "nnNodeAttributeMainFrameLayoutNew"
					"nnNodeAttributeMainFrameLayoutReplace"
					"nnNodeAttributeMainFrameLayout";
	// nnNodeAttributeMainColumnLayout
	editorTemplate
		-callCustom "nnNodeAttributeMainColumnLayoutNew"
					"nnNodeAttributeMainColumnLayoutReplace"
					"nnNodeAttributeMainColumnLayout";

	// nnModelAttributeFrameLayout
	editorTemplate
		-callCustom "nnModelAttributeFrameLayoutNew"
					"nnModelAttributeFrameLayoutReplace"
					"nnModelAttributeFrameLayout";
	// nnModelAttributeColumnLayout
	editorTemplate
		-callCustom "nnModelAttributeColumnLayoutNew"
					"nnModelAttributeColumnLayoutReplace"
					"nnModelAttributeColumnLayout";

	// nnNodeBreak
	editorTemplate
		-callCustom	"nnNodeBreakNew"
					"nnNodeBreakReplace"
					"nnNodeBreak";
	editorTemplate
		-suppress	"nnNodeBreak";

	// nnNodeBreak
	editorTemplate
		-callCustom	"nnNodeNoBreakNew"
					"nnNodeNoBreakReplace"
					"nnNodeNoBreak";
	editorTemplate
		-suppress	"nnNodeNoBreak";

	// nnNodeSkip
	editorTemplate
		-callCustom	"nnNodeSkipNew"
					"nnNodeSkipReplace"
					"nnNodeSkip";
	editorTemplate
		-suppress	"nnNodeSkip";

	// nnNodeFreeze
	editorTemplate
		-callCustom	"nnNodeFreezeNew"
					"nnNodeFreezeReplace"
					"nnNodeFreeze";
	editorTemplate
		-suppress	"nnNodeFreeze";

	// nnNodeCircumsphere
	editorTemplate
		-callCustom	"nnNodeCircumsphereNew"
					"nnNodeCircumsphereReplace"
					"nnNodeCircumsphere";
	editorTemplate
		-suppress	"nnNodeCircumsphere";

	// nnNodeResetRotation
	editorTemplate
		-callCustom	"nnNodeResetRotationNew"
					"nnNodeResetRotationReplace"
					"nnNodeResetRotation";
	editorTemplate
		-suppress	"nnNodeResetRotation";

	// nnNodeUserData
	editorTemplate
		-callCustom	"nnNodeUserDataNew"
					"nnNodeUserDataReplace"
					"nnNodeUserData";
	editorTemplate
		-suppress	"nnNodeUserData";

	// nnNodeHideNew
	editorTemplate
		-callCustom	"nnNodeHideNew"
					"nnNodeHideReplace"
					"nnNodeHide";
	editorTemplate
		-suppress	"nnNodeHide";

	// nnNodeDisableFogging
	editorTemplate
		-callCustom	"nnNodeDisableFoggingNew"
					"nnNodeDisableFoggingReplace"
					"nnNodeDisableFogging";
	editorTemplate
		-suppress	"nnNodeDisableFogging";

	// nnNodeSeparateSkinModel
	editorTemplate
		-callCustom	"nnNodeSeparateSkinModelNew"
					"nnNodeSeparateSkinModelReplace"
					"nnNodeSeparateSkinModel";
	editorTemplate
		-suppress	"nnNodeSeparateSkinModel";

	// nnNodeSeparateNodeTree
	editorTemplate
		-callCustom	"nnNodeSeparateNodeTreeNew"
					"nnNodeSeparateNodeTreeReplace"
					"nnNodeSeparateNodeTree";
	editorTemplate
		-suppress	"nnNodeSeparateNodeTree";

	// nnRotEpsilonId
	editorTemplate
		-callCustom	"nnRotEpsilonIdNew"
					"nnRotEpsilonIdReplace"
					"nnRotEpsilonId";
	editorTemplate
		-suppress	"nnRotEpsilonId";

	// メッシュタイプ以外はこれ以降の処理をしない。
	if( $nodeType != "mesh" ) return;

	// nnMorphAttributeFrameLayout
	editorTemplate
		-callCustom "nnMorphAttributeFrameLayoutNew"
					"nnMorphAttributeFrameLayoutReplace"
					"nnMorphAttributeFrameLayout";
	// nnMorphAttributeColumnLayout
	editorTemplate
		-callCustom "nnMorphAttributeColumnLayoutNew"
					"nnMorphAttributeColumnLayoutReplace"
					"nnMorphAttributeColumnLayout";
	// nnOutputMorphType
	editorTemplate
		-callCustom "nnOutputMorphTypeNew"
					"nnOutputMorphTypeReplace"
					"nnMorphVtx"
					"nnMorphVtxNrm"
					"nnMorphVtxCol"
					"nnMorphUV";
	editorTemplate
		-suppress	"nnMorphVtx";
	editorTemplate
		-suppress	"nnMorphVtxNrm";
	editorTemplate
		-suppress	"nnMorphVtxCol";
	editorTemplate
		-suppress	"nnMorphUV";

	// nnShapeAttributeFrameLayout
	editorTemplate
		-callCustom "nnShapeAttributeFrameLayoutNew"
					"nnShapeAttributeFrameLayoutReplace"
					"nnShapeAttributeFrameLayout";
	// nnShapeAttributeColumnLayout
	editorTemplate
		-callCustom "nnShapeAttributeColumnLayoutNew"
					"nnShapeAttributeColumnLayoutReplace"
					"nnShapeAttributeColumnLayout";

	// nnShapeKey
	editorTemplate
		-callCustom "nnShapeKeyNew"
					"nnShapeKeyReplace"
					"nnShapeKey";
	editorTemplate
		-suppress	"nnShapeKey";
	// nnOutputShapeType
	editorTemplate
		-callCustom "nnOutputShapeTypeNew"
					"nnOutputShapeTypeReplace"
					"nnShapeVtx"
					"nnShapeVtxNrm"
					"nnShapeVtxCol"
					"nnShapeUV";
	editorTemplate
		-suppress	"nnShapeVtx";
	editorTemplate
		-suppress	"nnShapeVtxNrm";
	editorTemplate
		-suppress	"nnShapeVtxCol";
	editorTemplate
		-suppress	"nnShapeUV";

	// nnUserKeyAttributeFrameLayout
	editorTemplate
		-callCustom "nnUserKeyAttributeFrameLayoutNew"
					"nnUserKeyAttributeFrameLayoutReplace"
					"nnUserKeyAttributeFrameLayout";
	// nnUserKeyAttributeColumnLayout
	editorTemplate
		-callCustom "nnUserKeyAttributeColumnLayoutNew"
					"nnUserKeyAttributeColumnLayoutReplace"
					"nnUserKeyAttributeColumnLayout";

	// nnUserFloatKey
	editorTemplate
		-callCustom "nnUserFloatKeyNew"
					"nnUserFloatKeyReplace"
					"nnUserFloatKey";
	editorTemplate
		-suppress	"nnUserFloatKey";

	// nnUserIntegerKey
	editorTemplate
		-callCustom "nnUserIntegerKeyNew"
					"nnUserIntegerKeyReplace"
					"nnUserIntegerKey";
	editorTemplate
		-suppress	"nnUserIntegerKey";


	// nnUserIntegerInterpType
	editorTemplate
		-callCustom "nnUserIntegerInterpTypeNew"
					"nnUserIntegerInterpTypeReplace"
					"nnUserIntegerInterpType";
	editorTemplate
		-suppress	"nnUserIntegerInterpType";

}

// End of file
