Esempio n. 1
0
	// ********************************
	//@name 操作
	// ********************************
void CentDedRosen::insert( 
	const CentDedRosen& rosenToAdd_enter ,
	int iEkiIndexToInsert ) 
{
	CentDedRosen rosenToAdd = rosenToAdd_enter ;
	//○組入れ先駅Index小(起点側)・組入れ先Index大(終点側)を決定
	//	○[組入れ先が始発駅]
	//  	○組入れ先駅Index小=-1
	//  	○組入れ先駅Index大=入力された組入れ先の駅Index
	//	○[組入れ先が中間駅]
	//  	○組入れ先駅Index小=入力された組入れ先の駅Index
	//  	○組入れ先駅Index大=入力された組入れ先の駅Index
	//	○[組入れ先が終着駅]
	//  	○組入れ先駅Index小=駅数-1
	//  	○組入れ先駅Index大=駅数
	int iEkiIndexToInsertMin = -1 ;
	int iEkiIndexToInsertMax = -1 ;
	{
		//○[組入れ先が始発駅]
		if ( iEkiIndexToInsert == 0 )
		{
			iEkiIndexToInsertMin = -1 ;
			iEkiIndexToInsertMax = iEkiIndexToInsert ;
		}
		//○[組入れ先が中間駅]
		//	○組入れ先駅Index小=入力された組入れ先の駅Index
		//	○組入れ先駅Index大=入力された組入れ先の駅Index
		else if ( 0 < iEkiIndexToInsert &&
			iEkiIndexToInsert < getCentDedEkiCont()->size() - 1 )
		{
			iEkiIndexToInsertMin = iEkiIndexToInsert ;
			iEkiIndexToInsertMax = iEkiIndexToInsert ;
		}
		//○[組入れ先が終着駅]
		//	○組入れ先駅Index小=駅数-1
		//	○組入れ先駅Index大=駅数
		else
		{
			iEkiIndexToInsertMin = getCentDedEkiCont()->size() - 1 ;
			iEkiIndexToInsertMax = getCentDedEkiCont()->size() ;
		}
	}
	//○[組入れ先が中間駅]なら、その駅を分割
	if ( 0 < iEkiIndexToInsertMin &&
			iEkiIndexToInsertMax < getCentDedEkiCont()->size() - 1 )
	{
		// ○組入れ先駅Index小=入力された組入れ先の駅Index
		// │組入れ先駅Index大=入力された組入れ先の駅Index+1
		iEkiIndexToInsertMax = iEkiIndexToInsertMin + 1 ;

		// ○組入れ先駅Index小と同名駅を、組入れ先駅Index+1の位置に追加
		// │組入れ先駅Index小の駅は下り着時刻
		// │組入れ先駅Index大の駅は上り着時刻
		{
			CentDedEkiCont* pCentDedEkiCont = getCentDedEkiCont() ;
			CentDedEki*	pDedEkiInsertMin = pCentDedEkiCont->getMuPtr()->get( iEkiIndexToInsertMin ) ;
			pCentDedEkiCont->insert( *pDedEkiInsertMin , iEkiIndexToInsertMax ) ;
			CentDedEki*	pDedEkiInsertMax = pCentDedEkiCont->getMuPtr()->get( iEkiIndexToInsertMax ) ;
			pDedEkiInsertMin->setEkijikokukeisiki( CentDedEki::Jikokukeisiki_KudariChaku ) ;
			pDedEkiInsertMax->setEkijikokukeisiki( CentDedEki::Jikokukeisiki_NoboriChaku ) ;
		}

		//○全ダイヤのループ
		CentDedDiaCont* pCentDedDiaCont = &m_CentDedDiaCont ;
		int idxDia ;
		for ( idxDia = 0 ; idxDia < pCentDedDiaCont->size() ; idxDia ++ )
		{
			CentDedDia* pCentDedDia = pCentDedDiaCont->getMuPtr()->get( idxDia ) ;
			//○下り列車全列車のループ
			//│ ○組入れ先駅Order小・組入れ先駅Order大を求める
			{
				CentDedRessyaCont* pCentDedRessyaCont = pCentDedDia->getCentDedRessyaCont( Ressyahoukou_Kudari ) ;
				int iEkiOrderToInsertMin = -1 ;
				int iEkiOrderToInsertMax = -1 ;
				{
					int iEkiOrder1 = pCentDedRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMin ) ;
					int iEkiOrder2 = pCentDedRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMax ) ;
					iEkiOrderToInsertMin = min( iEkiOrder1 , iEkiOrder2 ) ;
					iEkiOrderToInsertMax = max( iEkiOrder1 , iEkiOrder2 ) ;
				}

				for ( int idxRessya = 0 ; idxRessya < pCentDedRessyaCont->size() ; idxRessya ++ )
				{
					CentDedRessya* pCentDedRessya = pCentDedRessyaCont->getMuPtr()->get( idxRessya ) ;
					CentDedEkiJikoku aEkiJikokuToInserMin = pCentDedRessya->getCentDedEkiJikoku( iEkiOrderToInsertMin ) ;
					CentDedEkiJikoku aEkiJikokuToInserMax = pCentDedRessya->getCentDedEkiJikoku( iEkiOrderToInsertMax ) ;

					//│ ○[組入れ先駅Order小が始発駅の列車]
					//│ │組入れ先駅Order大に、組入れ先Order小をコピー
					//│ ↓組入れ先駅Order小は、運行なしとする。
					if ( pCentDedRessya->getSihatsuEki() == iEkiOrderToInsertMin )
					{
						aEkiJikokuToInserMax = aEkiJikokuToInserMin ;
						aEkiJikokuToInserMin.setEkiatsukai( CentDedEkiJikoku::Ekiatsukai_None ) ;
					}
					//│ ○[組入れ先駅Index小が中間駅の列車]
					//│ │ ○組入れ先駅Order大に、組入れ先駅Order小の駅時刻をコピー
					else if ( pCentDedRessya->getSihatsuEki() < iEkiOrderToInsertMin && 
						iEkiOrderToInsertMin < pCentDedRessya->getSyuuchakuEki() ) 
					{
						aEkiJikokuToInserMax = aEkiJikokuToInserMin ;
					}
					//│ ○[組入れ先駅Order小が終着駅の列車]
					//│  組入れ先駅Order小は、そのままとする。
					//│  組入れ先駅Order大は、運行なしとする。
					else if ( pCentDedRessya->getSyuuchakuEki() == iEkiOrderToInsertMin )
					{
						aEkiJikokuToInserMax.setEkiatsukai( CentDedEkiJikoku::Ekiatsukai_None ) ;
					}

					pCentDedRessya->setCentDedEkiJikoku( iEkiOrderToInsertMin , aEkiJikokuToInserMin ) ;
					pCentDedRessya->setCentDedEkiJikoku( iEkiOrderToInsertMax , aEkiJikokuToInserMax ) ;
				}
			}

			//○上り列車全列車のループ
			//   ○組入れ先駅Order小・組入れ先駅Order大を求める
			{
				CentDedRessyaCont* pCentDedRessyaCont = pCentDedDia->getCentDedRessyaCont( Ressyahoukou_Nobori ) ;
				int iEkiOrderToInsertMin = pCentDedRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMin ) ;
				int iEkiOrderToInsertMax = pCentDedRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMax ) ;
				for ( int idxRessya = 0 ; idxRessya < pCentDedRessyaCont->size() ; idxRessya ++ )
				{
					CentDedRessya* pCentDedRessya = pCentDedRessyaCont->getMuPtr()->get( idxRessya ) ;
					CentDedEkiJikoku aEkiJikokuToInserMin = pCentDedRessya->getCentDedEkiJikoku( iEkiOrderToInsertMax ) ;
					CentDedEkiJikoku aEkiJikokuToInserMax = pCentDedRessya->getCentDedEkiJikoku( iEkiOrderToInsertMin ) ;

					//○[組入れ先駅Order大が始発駅の列車]
					//│組入れ先駅Order小は、そのままとする。
					//↓組入れ先駅Order大は、運行なしとする。
					if ( pCentDedRessya->getSihatsuEki() == iEkiOrderToInsertMax )
					{
						aEkiJikokuToInserMax.setEkiatsukai( CentDedEkiJikoku::Ekiatsukai_None ) ;
					}
					//○[組入れ先駅Index大が中間駅の列車]
					//│ ○組入れ先駅Index小に、組入れ先駅Index大の駅時刻をコピー
					//│ ○組入れ先駅Index小の駅時刻を駅時刻形式(着時刻のみ)に合わせて補正
					//│ ○(組入れ先駅Index小の発時刻をNULLに変更)
					//│ ○組入れ先駅Index大の駅時刻を駅時刻形式(発時刻のみ)に合わせて補正
					//↓ ○(組入れ先駅Index大の着時刻をNULLに変更)
					else if ( pCentDedRessya->getSihatsuEki() < iEkiOrderToInsertMax && 
						iEkiOrderToInsertMax < pCentDedRessya->getSyuuchakuEki() ) 
					{
						aEkiJikokuToInserMin = aEkiJikokuToInserMax ;
					}
					//○[組入れ先駅Index大が終着駅の列車]
					//│組入れ先駅Index小に、駅時刻をコピー
					//↓組入れ先駅Index大は、運行なしとする。
					else if ( pCentDedRessya->getSyuuchakuEki() == iEkiOrderToInsertMax )
					{
						aEkiJikokuToInserMin = aEkiJikokuToInserMax ;
						aEkiJikokuToInserMax.setEkiatsukai( CentDedEkiJikoku::Ekiatsukai_None ) ;
					}

					pCentDedRessya->setCentDedEkiJikoku( iEkiOrderToInsertMin , aEkiJikokuToInserMin ) ;
					pCentDedRessya->setCentDedEkiJikoku( iEkiOrderToInsertMax , aEkiJikokuToInserMax ) ;
				}
			}
		}
		//○組入れ先駅Index小の駅時刻を駅時刻形式に合わせて補正
		//│ ◎駅時刻を駅時刻形式に合わせて補正
		//│   ○[駅時刻形式に着時刻あり・発時刻なし、
		//│    │駅時刻に着時刻なし、発時刻あり]
		//│    ↓着時刻には発時刻をコピー、発時刻はNULL。
		//│    ○[駅時刻形式に着時刻なし・発時刻あり
		//│    │駅時刻に着時刻あり、発時刻なし]
		//│    ↓発時刻には着時刻をコピー、着時刻はNULL。
		//│    ○[駅が始発駅・
		//│    │駅時刻形式に着時刻あり・発時刻あり、
		//│    │駅時刻に着時刻あり、発時刻なし]
		//│    ↓発時刻には着時刻をコピー、着時刻はNULL。
		//│    ○[駅が終着駅・
		//│     駅時刻形式に着時刻あり・発時刻あり
		//│     駅時刻に着時刻なし、発時刻あり]
		//│     着時刻には発時刻をコピー、発時刻はNULL。
		//○組入れ先駅Index大の駅時刻を駅時刻形式に合わせて補正
		adjustByEkijikokukeisiki( iEkiIndexToInsertMin ) ;
		adjustByEkijikokukeisiki( iEkiIndexToInsertMax ) ;
	}
	//○[組入れ先が起点駅]なら、その駅の駅時刻形式は[上り着時刻]とする
	//  ○[組入れ先駅Index小=-1,組入れ先駅Index大=0]
	//    組入れ先駅Index大を上り着時刻とする
	//   ○組入れ先駅Index大の駅時刻を駅時刻形式に合わせて補正
	else if ( iEkiIndexToInsertMin == -1 &&
			iEkiIndexToInsertMax == 0 )
	{
		CentDedEkiCont* pCentDedEkiCont = getCentDedEkiCont() ;
		CentDedEki*	pDedEkiInsert = pCentDedEkiCont->getMuPtr()->get( iEkiIndexToInsertMax ) ;
		pDedEkiInsert->setEkijikokukeisiki( CentDedEki::Jikokukeisiki_NoboriChaku ) ;
		adjustByEkijikokukeisiki( iEkiIndexToInsertMax ) ;
	}
	//○[組入れ先が終点駅]なら、その駅の駅時刻形式は[下り着時刻]とする
	//  ○[組入れ先がIndex小=駅数-1 AND 組入れ先駅Index大=駅数]
	//    組入れ先駅Index小を下り着時刻とする
	//   ○組入れ先駅Index小の駅時刻を駅時刻形式に合わせて補正
	else if ( iEkiIndexToInsertMin == getCentDedEkiCont()->size() - 1 &&
			iEkiIndexToInsertMax == getCentDedEkiCont()->size() ) 
	{
		CentDedEkiCont* pCentDedEkiCont = getCentDedEkiCont() ;
		CentDedEki*	pDedEkiInsert = pCentDedEkiCont->getMuPtr()->get( iEkiIndexToInsertMin ) ;
		pDedEkiInsert->setEkijikokukeisiki( CentDedEki::Jikokukeisiki_KudariChaku ) ;
		adjustByEkijikokukeisiki( iEkiIndexToInsertMin ) ;
	}




	//○駅を追加
	//  ○組入れる路線ファイルの駅をすべて追加する。
	//   追加する駅Indexは、組入れ先駅Index小+1。
	//		○[組入れる路線ファイルの起点駅の駅時刻形式が発着以外]
	//		  その駅の駅時刻形式は[上り着時刻]とする
	//		○[組入れる路線ファイルの終点駅の駅時刻形式が発着以外]
	//		  その駅の駅時刻形式は[下り着時刻]とする
	//  ○組入れ先駅Index大に、追加した駅数を加算
	{
		CentDedEkiCont* pCentDedEkiCont = m_pCentDedEkiCont ;
		const CentDedEkiCont* pCentDedEkiContToAdd = rosenToAdd.getCentDedEkiCont() ;
		for ( int idxEki = 0 ; idxEki < pCentDedEkiContToAdd->size() ; idxEki ++ )
		{
			CentDedEki aEki = *pCentDedEkiContToAdd->getMuPtr()->get( idxEki ) ;
			if ( idxEki == 0 && aEki.getEkijikokukeisiki() != CentDedEki::Jikokukeisiki_Hatsuchaku )
			{
				aEki.setEkijikokukeisiki( CentDedEki::Jikokukeisiki_NoboriChaku ) ;
			}
			else if ( idxEki == pCentDedEkiContToAdd->size() - 1 && 
				aEki.getEkijikokukeisiki() != CentDedEki::Jikokukeisiki_Hatsuchaku )
			{
				aEki.setEkijikokukeisiki( CentDedEki::Jikokukeisiki_KudariChaku ) ;
			}

			pCentDedEkiCont->insert( 
				aEki ,
				iEkiIndexToInsertMin + 1 + idxEki ) ;


			iEkiIndexToInsertMax ++ ;

		}
	}

	//○[組入れ先が中間駅]なら、組入れ先駅Indexが途中駅となる列車は、
	//          追加された駅の駅時刻を経由なしにする。
	if ( 0 < iEkiIndexToInsertMin &&
			iEkiIndexToInsertMax < getCentDedEkiCont()->size() - 1 )
	{
		//  ○全列車のループ
		//    ○下り・上りのループ
		//       ○組入れ先駅Order小・組入れ先駅Order大を求める
		//      ○[始発駅が組入れ先駅Order小より前 AND 
		//       終着駅が組入れ先駅Order大より後]
		//       組入れ先駅Order小+1~組入れ先駅Order大-1の駅扱いを
		//       経由なしにする。
		CentDedDiaCont* pCentDedDiaCont = &m_CentDedDiaCont ;
		int idxDia ;
		for ( idxDia = 0 ; idxDia < pCentDedDiaCont->size() ; idxDia ++ )
		{
			CentDedDia* pCentDedDia = pCentDedDiaCont->getMuPtr()->get( idxDia ) ;
			//○下り列車全列車のループ
			//│ ○組入れ先駅Order小・組入れ先駅Order大を求める
			for ( int iRessyahoukou = Ressyahoukou_Kudari ;
				iRessyahoukou <= Ressyahoukou_Nobori ;
				iRessyahoukou ++ )
			{
				ERessyahoukou eRessyahoukou = (ERessyahoukou)iRessyahoukou ;

				CentDedRessyaCont* pCentDedRessyaCont = pCentDedDia->getCentDedRessyaCont( eRessyahoukou ) ;
				int iEkiOrderToInsertMin = -1 ;
				int iEkiOrderToInsertMax = -1 ;
				{
					int iEkiOrder1 = pCentDedRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMin ) ;
					int iEkiOrder2 = pCentDedRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMax ) ;
					iEkiOrderToInsertMin = min( iEkiOrder1 , iEkiOrder2 ) ;
					iEkiOrderToInsertMax = max( iEkiOrder1 , iEkiOrder2 ) ;
				}

				for ( int idxRessya = 0 ; idxRessya < pCentDedRessyaCont->size() ; idxRessya ++ )
				{
					//      ○[始発駅が組入れ先駅Order小より前 AND 
					//       終着駅が組入れ先駅Order大より後]
					//       組入れ先駅Order小+1~組入れ先駅Order大-1の駅扱いを
					//       経由なしにする。
					CentDedRessya* pCentDedRessya = pCentDedRessyaCont->getMuPtr()->get( idxRessya ) ;
					if ( pCentDedRessya->getSihatsuEki() < iEkiOrderToInsertMin && 
						iEkiOrderToInsertMax < pCentDedRessya->getSyuuchakuEki() )
					{

						CentDedEkiJikoku aEkijikokuKeiyunasi( 
							CentDedEkiJikoku::Ekiatsukai_Keiyunasi ,
							CdDedJikoku() , CdDedJikoku() ) ;
						for ( int iEkiOrder = iEkiOrderToInsertMin + 1 ;
							iEkiOrder <= iEkiOrderToInsertMax - 1 ;
							iEkiOrder ++ )
						{
							pCentDedRessya->setCentDedEkiJikoku( iEkiOrder ,aEkijikokuKeiyunasi ) ; 
						}
					}
				}
			}
		}
	}
	//○列車種別のマージ
	//  ○組入れる路線ファイルの列車種別によるループ
	//    ○[同名の列車種別が編集中の路線ファイルに存在しない]列車種別を
	//     編集中の路線ファイルに追加
	//    ○列車種別対照表(組入れる路線ファイルの列車種別Index→
	//     組入れる路線ファイルの列車種別Index の対照表を作成
	deque<int>	arRessyasyubetsuIdx_AddedToThis ;
	{
		CentDedRessyasyubetsuCont* pCentDedRessyasyubetsuCont = this->getCentDedRessyasyubetsuCont() ;
		const CentDedRessyasyubetsuCont* pCentDedRessyasyubetsuContToAdd = rosenToAdd.getCentDedRessyasyubetsuCont() ;
		

		const Mu<const CentDedRessyasyubetsu*>* muCentDedRessyasyubetsuToAdd =
				pCentDedRessyasyubetsuContToAdd->getMuPtr() ;
		for ( int idxToAdd = 0 ; idxToAdd < muCentDedRessyasyubetsuToAdd->size() ; idxToAdd ++ )
		{
			const CentDedRessyasyubetsu* pCentDedRessyasyubetsuToAdd = 
				muCentDedRessyasyubetsuToAdd->get( idxToAdd ) ;

			Mu<CentDedRessyasyubetsu*>* muCentDedRessyasyubetsuThis =
				pCentDedRessyasyubetsuCont->getMuPtr() ;
			int idxThis = 0 ;
			for ( idxThis = 0 ; idxThis < muCentDedRessyasyubetsuThis->size() ; idxThis ++ )
			{
				const CentDedRessyasyubetsu* pCentDedRessyasyubetsuThis = muCentDedRessyasyubetsuThis->get( idxThis ) ;
				if ( pCentDedRessyasyubetsuThis->getSyubetsumei() == 
					pCentDedRessyasyubetsuToAdd->getSyubetsumei() )
				{
					break ;
				}
			}
			//idxThis = 『追加する路線ファイル』の列車種別[idxToAdd] と同名の
			//	thisの列車種別のインデクス。
			//	なければ、  muCentDedRessyasyubetsuThis->size()

			if ( idxThis == muCentDedRessyasyubetsuThis->size() )
			{
				//	同名の種別がない場合は、
				//	this に追加します。
				pCentDedRessyasyubetsuCont->insert( *pCentDedRessyasyubetsuToAdd ) ;
			}
			arRessyasyubetsuIdx_AddedToThis.push_back( idxThis ) ;
		}

	}
	//arRessyasyubetsuIdx_AddedToThis[追加する路線ファイル』の列車種別インデクス] = 
	//	thisの列車種別インデクス

	//○ダイヤのマージ
	//  ○組入れる路線ファイルのダイヤによるループ
	//    ○[同名のダイヤが編集中の路線ファイルに存在しない]空のダイヤを
	//     編集中の路線ファイルに追加
	//    ○ダイヤ対照表(組入れる路線ファイルのダイヤIndex→
	//     組入れる路線ファイルのダイヤIndex の対照表を作成

	deque<int>	arDiaIdx_AddedToThis ;
	{
		CentDedDiaCont* pCentDedDiaCont = this->getCentDedDiaCont() ;
		const CentDedDiaCont* pCentDedDiaContToAdd = rosenToAdd.getCentDedDiaCont() ;
		
		const Mu<const CentDedDia*>* muCentDedDiaToAdd =
				pCentDedDiaContToAdd->getMuPtr() ;
		for ( int idxToAdd = 0 ; idxToAdd < muCentDedDiaToAdd->size() ; idxToAdd ++ )
		{
			const CentDedDia* pCentDedDiaToAdd = 
				muCentDedDiaToAdd->get( idxToAdd ) ;

			Mu<CentDedDia*>* muCentDedDiaThis =
				pCentDedDiaCont->getMuPtr() ;
			int idxThis = 0 ;
			for ( idxThis = 0 ; idxThis < muCentDedDiaThis->size() ; idxThis ++ )
			{
				const CentDedDia* pCentDedDiaThis = muCentDedDiaThis->get( idxThis ) ;
				if ( pCentDedDiaThis->getName() == 
					pCentDedDiaToAdd->getName() )
				{
					break ;
				}
			}
			//idxThis = 『追加する路線ファイル』の列車種別[idxToAdd] と同名の
			//	thisの列車種別のインデクス。
			//	なければ、  muCentDedDiaThis->size()

			if ( idxThis == muCentDedDiaThis->size() )
			{
				//	同名の種別がない場合は、
				//	this に
				//	列車が空のダイヤを追加します。
				//	(ダイヤオブジェクトを直接追加すると、列車も追加されるため、
				//	うまくいきません) 
				CentDedEkiCont* pCentDedEkiCont = this->getCentDedEkiCont() ;
				CentDedRessyasyubetsuCont* pCentDedRessyasyubetsuCont = this->getCentDedRessyasyubetsuCont() ;
				CentDedDia	diaNew( pCentDedEkiCont->size() , pCentDedRessyasyubetsuCont->size() ) ;
				diaNew.setName( pCentDedDiaToAdd->getName() ) ;
				pCentDedDiaCont->insert( diaNew ) ;
			}
			arDiaIdx_AddedToThis.push_back( idxThis ) ;
		}

	}
	//arDiaIdx_AddedToThis[追加する路線ファイル』のダイヤインデクス] = 
	//	thisのダイヤインデクス

	//○組入れる路線ファイルの列車を、編集中の路線ファイルに追加
	//  ○組入れる路線ファイルのダイヤによるループ
	//    ○全列車のループ
	//      ○列車を追加。
	//       追加するダイヤは、ダイヤ対照表にしたがって変換
	//       列車種別Indexは、列車種別対照表に従って変換
	//
	{
		const Mu<const CentDedDia*>* muCentDedDiaToAdd =
			((const CentDedDiaCont*)rosenToAdd.getCentDedDiaCont())->getMuPtr() ;

		for ( int idxDiaToAdd = 0 ; idxDiaToAdd < muCentDedDiaToAdd->size() ; idxDiaToAdd ++ )
		{
			const CentDedDia* pCentDedDiaToAdd = muCentDedDiaToAdd->get( idxDiaToAdd ) ;

			Mu<CentDedDia*>* muCentDedDiaThis =	this->getCentDedDiaCont()->getMuPtr() ;
			CentDedDia* pCentDedDiaThis = muCentDedDiaThis->get( arDiaIdx_AddedToThis[idxDiaToAdd] ) ;
			//pCentDedDiaThis = 列車のコピー先となる CentDedDia ;

			//下り列車→上り列車
			for ( int idxRessyahoukou = (int)Ressyahoukou_Kudari ;
				idxRessyahoukou <= (int)Ressyahoukou_Nobori ;
				idxRessyahoukou ++ )
			{

				ERessyahoukou eRessyahoukou = (ERessyahoukou)idxRessyahoukou ;
				const CentDedRessyaCont* pCentDedRessyaContToAdd = pCentDedDiaToAdd->getCentDedRessyaCont( eRessyahoukou ) ;
				const Mu<const CentDedRessya*>* muCentDedRessyaToAdd = pCentDedRessyaContToAdd->getMuPtr() ;
				CentDedRessyaCont* pCentDedRessyaContThis = pCentDedDiaThis->getCentDedRessyaCont( eRessyahoukou ) ;

				int iEkiOrderToInsert = -1 ;
				if ( eRessyahoukou == Ressyahoukou_Kudari )
				{
					iEkiOrderToInsert = pCentDedRessyaContThis->EkiOrderOfEkiIndex( iEkiIndexToInsertMin + 1 ) ;
				}
				else
				{
					iEkiOrderToInsert = pCentDedRessyaContThis->EkiOrderOfEkiIndex( iEkiIndexToInsertMax - 1 ) ;
				}
				//iEkiOrderToInsert = 組入れる路線ファイルの駅Order0の列車を挿入する、
				//	thisの駅Order

				for ( int idxRessyaToAdd = 0 ; idxRessyaToAdd < muCentDedRessyaToAdd->size() ; idxRessyaToAdd ++ )
				{
					//	現在編集中の路線ファイルに、組入れる路線ファイルの列車を挿入
					//	列車種別・駅時刻は、このあとに修正
					const CentDedRessya* pRessyaToAdd = muCentDedRessyaToAdd->get( idxRessyaToAdd ) ;
					pCentDedRessyaContThis->insert( *pRessyaToAdd ) ;
					CentDedRessya* pRessyaAdded = pCentDedRessyaContThis->getMuPtr()->get( INT_MAX ) ;
					//pRessyaAdded = 組入れる路線ファイルに追加された列車
					//	列車種別・駅時刻は、このあとに修正

					//	列車種別インデクスを、
					//	現在編集中の路線ファイルに合わせて更新。
					pRessyaAdded->setRessyasyubetsuIndex( 
						arRessyasyubetsuIdx_AddedToThis[ pRessyaToAdd->getRessyasyubetsuIndex() ] ) ;

					//	駅時刻を修正
					for ( int iEkiOrder = 0 ; iEkiOrder < pCentDedRessyaContThis->getEkiCount() ; iEkiOrder ++ )
					{
						int iEkiOrderToAdd = iEkiOrder - iEkiOrderToInsert ;
						//iEkiOrderToAdd = thisのiEkiOrderに対応する、
						//	組入れる路線ファイルの駅Order

						if ( 0 <= iEkiOrderToAdd && iEkiOrderToAdd < pCentDedRessyaContToAdd->getEkiCount() )
						{
							//	組入れる路線ファイルの駅Orderに対応する場合は、
							//	組入れる路線ファイルの駅時刻をコピー
							CentDedEkiJikoku aEkiJikokuToAdd = pRessyaToAdd->getCentDedEkiJikoku( iEkiOrderToAdd ) ; 
							pRessyaAdded->setCentDedEkiJikoku( iEkiOrder , aEkiJikokuToAdd ) ; 
						}
						else
						{
							//	組入れる路線ファイルの駅Orderに対応しない駅に対しては、
							//	運行なしを設定
							pRessyaAdded->setCentDedEkiJikoku( iEkiOrder , CentDedEkiJikoku() ) ; 
						}
					}


				}
			}	
		}
	}


	//○[組入れ先駅Index小と組入れ先駅Index小+1で、駅名が同一]駅を併合
	if ( 0 <= iEkiIndexToInsertMin )
	{
		CentDedEkiCont* pCentDedEkiContThis = getCentDedEkiCont() ;
		CentDedEki*	pEkiToInsertMin = pCentDedEkiContThis->getMuPtr()->get( iEkiIndexToInsertMin ) ;
		CentDedEki*	pEkiToInsertMin_1 = pCentDedEkiContThis->getMuPtr()->get( iEkiIndexToInsertMin + 1 ) ;
		if ( pEkiToInsertMin->getEkimei() == pEkiToInsertMin_1->getEkimei() )
		{
			//  ○組入れ先駅Index小の駅時刻形式を発着に変更
			pEkiToInsertMin->setEkijikokukeisiki( CentDedEki::Jikokukeisiki_Hatsuchaku ) ;

			//  ○全ダイヤのループ
			//        ○全下り列車のループ
			//      ○[組入れ先駅Index小が運行なし]
			//       組入れ先駅Index小+1の駅時刻を組入れ先駅Index小にコピー
			//    ○全上り列車のループ
			//      ○[組入れ先駅Index小が運行なし]
			//       組入れ先駅Index小+1の駅時刻を組入れ先駅Index小にコピー
			CentDedDiaCont* pCentDedDiaCont = this->getCentDedDiaCont() ;
			for ( int idxDia = 0 ; idxDia < pCentDedDiaCont->size() ; idxDia ++ )
			{
				CentDedDia* pDia = pCentDedDiaCont->getMuPtr()->get( idxDia ) ;
				for ( int iRessyahoukou = Ressyahoukou_Kudari ;
					iRessyahoukou <= Ressyahoukou_Nobori ;
					iRessyahoukou ++ )
				{
					ERessyahoukou eRessyahoukou = (ERessyahoukou)iRessyahoukou ;

					CentDedRessyaCont* pRessyaCont = pDia->getCentDedRessyaCont( eRessyahoukou ) ;
					int iEkiOrderToInsertMin = pRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMin ) ;
					int iEkiOrderToInsertMin_1 = pRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMin + 1 ) ;
					for ( int idxRessya = 0 ; idxRessya < pRessyaCont->size() ; idxRessya ++ )
					{
						CentDedRessya* pRessya = pRessyaCont->getMuPtr()->get( idxRessya ) ;
						
						CentDedEkiJikoku aEkijikoku = pRessya->getCentDedEkiJikoku( iEkiOrderToInsertMin ) ;
						if ( aEkijikoku.getEkiatsukai() == CentDedEkiJikoku::Ekiatsukai_None )
						{
							aEkijikoku = pRessya->getCentDedEkiJikoku( iEkiOrderToInsertMin_1 ) ;
							pRessya->setCentDedEkiJikoku( iEkiOrderToInsertMin ,aEkijikoku ) ;
						}
					}
				}
			}
			//  ○組入れ先駅Index小+1の駅を削除
			pCentDedEkiContThis->erase( iEkiIndexToInsertMin + 1 ) ;
			iEkiIndexToInsertMax -- ;
		}
	}

	//○[組入れ先駅Index大と組入れ先駅Index大-1で、駅名が同一]駅を併合
	if ( iEkiIndexToInsertMax < getCentDedEkiCont()->size() - 1 )
	{
		CentDedEkiCont* pCentDedEkiContThis = getCentDedEkiCont() ;
		CentDedEki*	pEkiToInsertMax = pCentDedEkiContThis->getMuPtr()->get( iEkiIndexToInsertMax ) ;
		CentDedEki*	pEkiToInsertMax_1 = pCentDedEkiContThis->getMuPtr()->get( iEkiIndexToInsertMax - 1 ) ;
		if ( pEkiToInsertMax->getEkimei() == pEkiToInsertMax_1->getEkimei() )
		{
			//○組入れ先駅Index大の駅時刻形式を発着に変更
			pEkiToInsertMax->setEkijikokukeisiki( CentDedEki::Jikokukeisiki_Hatsuchaku ) ;
			//○全ダイヤのループ
			//  ○全下り列車のループぴ
			//    ○[組入れ先駅Index大が運行なし]
			//     組入れ先駅Index大-1の駅時刻を組入れ先駅Index大にコピー
			//  ○全上り列車のループぴ
			//    ○[組入れ先駅Index大が運行なし]
			//     組入れ先駅Index大-1の駅時刻を組入れ先駅Index大にコピー
			CentDedDiaCont* pCentDedDiaCont = this->getCentDedDiaCont() ;
			for ( int idxDia = 0 ; idxDia < pCentDedDiaCont->size() ; idxDia ++ )
			{
				CentDedDia* pDia = pCentDedDiaCont->getMuPtr()->get( idxDia ) ;
				for ( int iRessyahoukou = Ressyahoukou_Kudari ;
					iRessyahoukou <= Ressyahoukou_Nobori ;
					iRessyahoukou ++ )
				{
					ERessyahoukou eRessyahoukou = (ERessyahoukou)iRessyahoukou ;

					CentDedRessyaCont* pRessyaCont = pDia->getCentDedRessyaCont( eRessyahoukou ) ;
					int iEkiOrderToInsertMax = pRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMax ) ;
					int iEkiOrderToInsertMax_1 = pRessyaCont->EkiOrderOfEkiIndex( iEkiIndexToInsertMax - 1 ) ;
					for ( int idxRessya = 0 ; idxRessya < pRessyaCont->size() ; idxRessya ++ )
					{
						CentDedRessya* pRessya = pRessyaCont->getMuPtr()->get( idxRessya ) ;
						
						CentDedEkiJikoku aEkijikoku = pRessya->getCentDedEkiJikoku( iEkiOrderToInsertMax ) ;
						if ( aEkijikoku.getEkiatsukai() == CentDedEkiJikoku::Ekiatsukai_None )
						{
							aEkijikoku = pRessya->getCentDedEkiJikoku( iEkiOrderToInsertMax_1 ) ;
							pRessya->setCentDedEkiJikoku( iEkiOrderToInsertMax ,aEkijikoku ) ;
						}
					}
				}
			}
			//  ○組入れ先駅Index大-1の駅を削除
			pCentDedEkiContThis->erase( iEkiIndexToInsertMax - 1 ) ;
			iEkiIndexToInsertMax -- ;
		}
	}
	//○、『追加する路線ファイル』のコメントを、『現在編集している路線ファイル』のコメントの末尾に追加。
	{
		string strComment = this->getComment() ;
		strComment += "\n\n" ;
		strComment += rosenToAdd.getComment() ;
		this->setComment( strComment ) ;
	}
}
Esempio n. 2
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 ) ;
}
Esempio n. 3
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 ) ;
	}
}