示例#1
0
// ****************************************************************
//	CentDedRessya_EkijikokuModifyOperation2
// ****************************************************************
// ********************************
//	CentDedRessya_EkijikokuModifyOperation2-操作
// ********************************
int CentDedRessya_EkijikokuModifyOperation2::
	execute( CentDedRessya* pCentDedRessya , CdDedJikokuOrder aJikokuOrder ) 
{
	int iRv = 0 ;
	
	// --------------------------------
	CentDedRessya	aCentDedRessya( *pCentDedRessya ) ;
	if ( aJikokuOrder.getEkiOrder() == INT_MAX )
	{
		aJikokuOrder.setEkiOrder( pCentDedRessya->getCentDedEkiJikokuCount() - 1 , CdDedJikokuOrder::EkiJikokuItem_Hatsu ) ;
	}
	if ( !( 0 <= aJikokuOrder.getEkiOrder() && 
		aJikokuOrder.getEkiOrder() < pCentDedRessya->getCentDedEkiJikokuCount() ) )
	{
		iRv = -1 ;	//	aJikokuOrder が範囲外です。
	}
	//aCentDedRessya = 操作対象となる列車
	//aJikokuOrder = 時刻Order

	// --------------------------------
	//	1.新しい駅扱を決定
	// --------------------------------
	if ( iRv >= 0 )
	{
		if ( m_bSetEkiatsukai )	//	駅扱の変更
		{
			CentDedEkiJikoku aCentDedEkiJikoku = aCentDedRessya.getCentDedEkiJikoku( aJikokuOrder.getEkiOrder() ) ;
			CentDedEkiJikoku::EEkiatsukai eEkiatsukai = m_eEkiatsukai ;
			{
				//駅扱の変更
				aCentDedEkiJikoku.setEkiatsukai( eEkiatsukai ) ;
				aCentDedRessya.setCentDedEkiJikoku( aJikokuOrder.getEkiOrder() , aCentDedEkiJikoku ) ;
			}
		}


	}
	//aCentDedRessya = 駅扱が変更されました。
	
	// --------------------------------
	//	2.時刻の変更
	// --------------------------------
	if ( iRv >= 0 )
	{
		if ( m_eOperation == OperationModify )
		{
			CdDedJikan	aCdDedJikan( m_iSeconds * 60 ) ;
			aCentDedRessya.modifyRessyaJikoku( 
				aCdDedJikan , 
				aJikokuOrder ) ;
		}
		else if ( m_eOperation == OperationCopy )
		{
			CdDedJikoku aCdDedJikokuSrc = 
				aCentDedRessya.getEkiJikoku( m_iJikokuOrderCopySrc ) ;
			CdDedJikoku aCdDedJikokuDst = 
				aCentDedRessya.getEkiJikoku( aJikokuOrder ) ;

			//	時刻は、単純に代入します。
			{
				CentDedEkiJikoku aCentDedEkiJikoku = 
					aCentDedRessya.getCentDedEkiJikoku( aJikokuOrder.getEkiOrder() ) ;
				aCdDedJikokuSrc.addSeconds( m_iSeconds * 60 ) ;
				if ( aJikokuOrder.getEkiJikokuItem() == CdDedJikokuOrder::EkiJikokuItem_Chaku)
				{
					aCentDedEkiJikoku.setChakujikoku( aCdDedJikokuSrc ) ;
				}
				else
				{
					aCentDedEkiJikoku.setHatsujikoku( aCdDedJikokuSrc ) ;
				}
				aCentDedRessya.setCentDedEkiJikoku( 
					aJikokuOrder.getEkiOrder() , aCentDedEkiJikoku  ) ;
			}
		}
		else if ( m_eOperation == OperationToNull )
		{
			//	NULL を設定
			aCentDedRessya.setEkiJikoku( CdDedJikoku()  , aJikokuOrder ) ;
		}
	}
	//aCentDedRessya = 駅時刻が変更されました。



	


	// --------------------------------
	//	駅扱・着時刻・発時刻を変更
	// --------------------------------
	if ( iRv >= 0 )
	{
		*pCentDedRessya = aCentDedRessya ;
	}	
	return ( iRv ) ;
}
示例#2
0
	/*
		readCentDedRessya() の下請関数
		(02)CentDedDgrEkiJikoku を生成し、 CentDedEkiJikoku で決まる属性を決定。
	*/
void CentDedDgrRessya::readCentDedRessya_02_CreateCentDedEkiJikoku( 
		const CentDedRessya* pCentDedRessya ) 
{
	//	直前の駅の駅時刻。
	CdDedJikoku	aCdDedJikokuLastStation ;


	//	直前の駅の駅時刻でのX座標。aCdDedJikokuLastStation がNULLの場合は
	//	無効です。
	//	最初の「NULLでない駅時刻」を見つかった場合は、その駅時刻から導出された
	//	X座標になります。
	//	2箇所目以降の「NULLでない駅時刻」以降は、
	//	前の駅時刻からの経過時間を加算します。
	//
	//	iXZahyouLastStation = iXZahyouLastStation 
	//		+ ( その駅の駅時刻 - aCdDedJikokuLastStation ) 
	//
	//	これにより、24:00をまたがって走る列車では、
	//	24:00以降の駅時刻に対応する X座標は 24:00 相当(24*60*60=86400) 以上
	//	になります。
	int	iXZahyouLastStation = 0 ;

	for ( int iEkiOrder = 0 ; 
		iEkiOrder < pCentDedRessya->getCentDedEkiJikokuCount() ; 
		iEkiOrder ++ )
	{
		CentDedEkiJikoku aCentDedEkiJikoku 
			= pCentDedRessya->getCentDedEkiJikoku( iEkiOrder ) ;

		//	駅時刻から、X座標を計算	
		int iDgrXZahyou[2] = { INT_MIN , INT_MIN } ;
		for ( int iChakuHatsu = 0 ; iChakuHatsu < 2 ; iChakuHatsu ++ )
		{
			int iX = INT_MIN ;
			CdDedJikokuOrder::EEkiJikokuItem eEkiJikokuItem = CdDedJikokuOrder::EkiJikokuItem_Chaku ;
			if ( iChakuHatsu == 1 )
			{
				eEkiJikokuItem = CdDedJikokuOrder::EkiJikokuItem_Hatsu ; 
			}


			CdDedJikokuOrder	aCdDedJikokuOrder ;
			aCdDedJikokuOrder.setEkiOrder( iEkiOrder , 
				eEkiJikokuItem ) ;
			CdDedJikoku	aCdDedJikoku 
				= pCentDedRessya->getEkiJikoku( aCdDedJikokuOrder ) ;

			if ( aCdDedJikoku.isNull() )
			{
				//	NULL 時刻なら、処理なし
			}
			else if ( aCdDedJikokuLastStation.isNull() )
			{
				//	1回目以降の、非NULL時刻
				iX = aCdDedJikoku.getTotalSeconds() ;	//	最初の、非NULL時刻
			}
			else
			{
				//	2回目以降の、非NULL時刻
				CdDedJikan	aCdDedJikan 
					= aCdDedJikoku.subJikoku( aCdDedJikokuLastStation ) ;
				iX = iXZahyouLastStation + aCdDedJikan.getTotalSeconds() ;
			}
			// --------------------------------
			if ( iX != INT_MIN )
			{
				aCdDedJikokuLastStation = aCdDedJikoku ;
				iXZahyouLastStation = iX ;
			}
			iDgrXZahyou[iChakuHatsu] = iX ;
		}

		CentDedDgrEkiJikoku	aCentDedDgrEkiJikoku( 
			aCentDedEkiJikoku.getEkiatsukai() ,
			iDgrXZahyou[0] ,
			iDgrXZahyou[1] ) ;
		
		m_MuCentDedDgrEkiJikoku.insert( aCentDedDgrEkiJikoku ) ;
	}
}