int CentDedDgrRessya::updateRessyasenCont_01_calcRessyasenKiten( int iEkiOrder , int* piRessyasenKitenEkiOrder ) { // 『列車線起点駅Order』の条件は、 // 「着時刻・発時刻のいずれかが指定されている AND // 次の『駅Order』の駅扱が『停車』か『通過』」 Mu<CentDedDgrEkiJikoku*>* pMuCentDedDgrEkiJikoku = this->getMuCentDedDgrEkiJikoku() ; for ( ; iEkiOrder < pMuCentDedDgrEkiJikoku->size() - 1 ; iEkiOrder ++ ) { CentDedDgrEkiJikoku* pEkiJikokuCurr = pMuCentDedDgrEkiJikoku->get( iEkiOrder ) ; CentDedDgrEkiJikoku* pEkiJikokuNext = pMuCentDedDgrEkiJikoku->get( iEkiOrder + 1 ) ; int iDgrXPosHatsu = pEkiJikokuCurr->getDgrXPosHatsu( true ) ; if ( iDgrXPosHatsu != INT_MIN && ( pEkiJikokuNext->getEkiatsukai() == CentDedEkiJikoku::Ekiatsukai_Teisya || pEkiJikokuNext->getEkiatsukai() == CentDedEkiJikoku::Ekiatsukai_Tsuuka ) ){ *piRessyasenKitenEkiOrder = iEkiOrder ; return ( 0 ) ; } } return -1 ; // iEkiOrder 以降で、列車線起点駅がありません。 }
int CentDedDiaCont::eraseRessyasyubetsuIndex( int iRessyasyubetsuIndex ) { int iRv = 0 ; if ( iRv >= 0 ){ if ( iRessyasyubetsuIndex == INT_MAX ){ iRessyasyubetsuIndex = getRessyasyubetsuCount() - 1 ; } if ( !( 0 <= iRessyasyubetsuIndex && iRessyasyubetsuIndex < getRessyasyubetsuCount() ) ){ iRv = -1 ; // インデクスが不正 } } if ( iRv >= 0 ){ if ( isExistRessyaOfRessyasyubetsu( iRessyasyubetsuIndex , NULL , NULL , NULL ) > 0 ){ iRv = -3 ; // 『列車種別』が iRessyasyubtsuIndex の列車が存在します。 } } // -------------------------------- // iRessyasyubetsuIndex 以上の『列車種別Index』をもつ // 列車の『列車種別Index』を、-1 if ( iRv >= 0 ){ Mu<CentDedDia*>* pIfContGet = getMuPtr() ; int iDiaIndex ; for ( iDiaIndex = 0 ; iDiaIndex < pIfContGet->size() ; iDiaIndex ++ ){ CentDedDia* pCentDedDia = pIfContGet->get( iDiaIndex ) ; iRv = pCentDedDia->eraseRessyasyubetsuIndex( iRessyasyubetsuIndex ); } } if ( iRv >= 0 ){ m_iRessyasyubetsuCount -- ; } return ( iRv ) ; }
// ******************************** //@name CentDedDiaCont-操作 駅の増減 // ******************************** int CentDedDiaCont::onSetCentDedEki( const CentDedEkiCont* pCentDedEkiCont , int iEkiIndex ) { int iRv = 0 ; if ( iRv >= 0 ){ int iDiaIndex ; Mu< CentDedDia* >* pIfContGet = getMuPtr() ; for ( iDiaIndex = 0 ; iDiaIndex < pIfContGet->size() ; iDiaIndex ++ ){ pIfContGet->get( iDiaIndex )->onSetCentDedEki( pCentDedEkiCont , iEkiIndex ) ; } } return ( iRv ) ; }
int CentDedDiaCont::eraseCentDedEkiJikoku( int iEkiIndex ) { int iRv = 0 ; if ( iRv >= 0 ){ m_iEkiCount -- ; int iDiaIndex ; Mu< CentDedDia* >* pIfContGet = getMuPtr() ; for ( iDiaIndex = 0 ; iDiaIndex < pIfContGet->size() ; iDiaIndex ++ ){ pIfContGet->get( iDiaIndex )->eraseCentDedEkiJikoku( iEkiIndex ) ; } } return ( iRv ) ; }
// ******************************** //@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 ) ; } }
// ******************************** //@name 包含-CentDedRessyasyubetsu // ******************************** int CentDedRosen::swapRessyasyubetsu( int iRessyasyubetsuIndexA , int iRessyasyubetsuIndexB ) { int iRv = 0 ; // -------------------------------- if ( iRv >= 0 ){ if ( iRessyasyubetsuIndexA == INT_MAX ){ iRessyasyubetsuIndexA = m_pCentDedRessyasyubetsuCont->size() - 1 ; } if ( !( 0 <= iRessyasyubetsuIndexA && iRessyasyubetsuIndexA < m_pCentDedRessyasyubetsuCont->size() ) ){ iRv = -1 ; // インデクスが不正 } } if ( iRv >= 0 ){ if ( iRessyasyubetsuIndexB == INT_MAX ){ iRessyasyubetsuIndexB = m_pCentDedRessyasyubetsuCont->size() - 1 ; } if ( !( 0 <= iRessyasyubetsuIndexB && iRessyasyubetsuIndexB < m_pCentDedRessyasyubetsuCont->size() ) ){ iRv = -1 ; // インデクスが不正 } } if ( iRv >= 0 ){ if ( iRessyasyubetsuIndexA == iRessyasyubetsuIndexB ){ iRv = -1 ; // インデクスが不正 } } // -------------------------------- //m_CentDedRessyasyubetsuCont の入れ替え if ( iRv >= 0 ){ Mu<CentDedRessyasyubetsu*>* pIfContGet = m_pCentDedRessyasyubetsuCont->getMuPtr() ; CentDedRessyasyubetsu aCentDedRessyasyubetsuA = *pIfContGet->get( iRessyasyubetsuIndexA ) ; CentDedRessyasyubetsu aCentDedRessyasyubetsuB = *pIfContGet->get( iRessyasyubetsuIndexB ) ; *pIfContGet->get( iRessyasyubetsuIndexA ) = aCentDedRessyasyubetsuB ; *pIfContGet->get( iRessyasyubetsuIndexB ) = aCentDedRessyasyubetsuA ; // -------------------------------- // 列車の入れ替え // -------------------------------- int iDiaIndex ; for ( iDiaIndex = 0 ; iDiaIndex < m_CentDedDiaCont.size() ; iDiaIndex ++ ){ CentDedDia* pCentDedDia = m_CentDedDiaCont.getMuPtr()->get( iDiaIndex ) ; int iRessyahoukou = 0 ; for ( iRessyahoukou = Ressyahoukou_Kudari ; iRessyahoukou <= Ressyahoukou_Nobori ; iRessyahoukou ++ ){ ERessyahoukou eRessyahoukou = (ERessyahoukou)iRessyahoukou ; CentDedRessyaCont* pCentDedRessyaCont = pCentDedDia->getCentDedRessyaCont( eRessyahoukou ) ; Mu< CentDedRessya* >* pCentDedRessyaContGet = pCentDedRessyaCont->getMuPtr() ; int iRessyaCount = pCentDedRessyaContGet->size() ; int iRessyaIndex ; // iRessyasyubetsuIndexA -> -1 (仮の値) // iRessyasyubetsuIndexB -> iRessyasyubetsuIndexA (仮の値) for ( iRessyaIndex = 0 ; iRessyaIndex < iRessyaCount ; iRessyaIndex ++ ){ CentDedRessya* pCentDedRessya = pCentDedRessyaContGet->get( iRessyaIndex ) ; int iRessyasyubetsuIndexCurr = pCentDedRessya->getRessyasyubetsuIndex() ; if ( iRessyasyubetsuIndexCurr == iRessyasyubetsuIndexA ){ iRessyasyubetsuIndexCurr = -1 ; // 仮の値 } else if ( iRessyasyubetsuIndexCurr == iRessyasyubetsuIndexB ){ iRessyasyubetsuIndexCurr = iRessyasyubetsuIndexA ; } pCentDedRessya->setRessyasyubetsuIndex( iRessyasyubetsuIndexCurr ) ; } // -1 (仮の値) ->iRessyasyubetsuIndexA for ( iRessyaIndex = 0 ; iRessyaIndex < iRessyaCount ; iRessyaIndex ++ ){ CentDedRessya* pCentDedRessya = pCentDedRessyaContGet->get( iRessyaIndex ) ; int iRessyasyubetsuIndexCurr = pCentDedRessya->getRessyasyubetsuIndex() ; if ( iRessyasyubetsuIndexCurr == -1 ){ // 仮の値 iRessyasyubetsuIndexCurr = iRessyasyubetsuIndexB ; } pCentDedRessya->setRessyasyubetsuIndex( iRessyasyubetsuIndexCurr ) ; } } } } return ( iRv ) ; }
CentDedRosen CentDedRosen::createSubRosen( int iEkiIndex , int iEkiCount )const { CentDedRosen rosenNew = *this ; /* (1) 新しく生成される路線ファイルは、 『現在編集している路線ファイル』から、 指定された範囲以外の駅を削除したものになります。 */ { // 『新しく生成される路線ファイル』の終点側の駅を削除 rosenNew.getCentDedEkiCont()->erase( iEkiIndex + iEkiCount , INT_MAX ) ; // 『新しく生成される路線ファイル』の起点側の駅を削除 rosenNew.getCentDedEkiCont()->erase( 0 , iEkiIndex ) ; } /* (2) 新しく生成される路線が運転区間に含まれない列車は、削除します。 */ { Mu<CentDedDia*>* muCentDedDia = rosenNew.getCentDedDiaCont()->getMuPtr() ; for ( int idxDia = 0 ; idxDia < muCentDedDia->size() ; idxDia ++ ) { CentDedDia* pCentDedDia = muCentDedDia->get( idxDia ) ; //pCentDedDia = 対象となるダイヤ //下り列車→上り列車 for ( int idxRessyahoukou = (int)Ressyahoukou_Kudari ; idxRessyahoukou <= (int)Ressyahoukou_Nobori ; idxRessyahoukou ++ ) { ERessyahoukou eRessyahoukou = (ERessyahoukou)idxRessyahoukou ; CentDedRessyaCont* pCentDedRessyaCont = pCentDedDia->getCentDedRessyaCont( eRessyahoukou ) ; for ( int idxRessya = 0 ; idxRessya < pCentDedRessyaCont->size() ; idxRessya ++ ) { bool bErase = false ; CentDedRessya* pRessya = pCentDedRessyaCont->getMuPtr()->get( idxRessya ) ; // 列車が運行している区間が一つもない列車は、 // 削除します。 if ( !bErase ) { // 列車が運行している区間の最初の駅Orderを // 検索します。 int iEkiOrder = 0 ; for ( iEkiOrder = 0 ; iEkiOrder < pRessya->getCentDedEkiJikokuCount() ; iEkiOrder ++ ) { if ( pRessya->isRunBetweenNextEki( iEkiOrder ) ) { break ; } } //iEkiOrder = 列車が運行している区間の最初の駅Order // 見つからなかった場合は、 // pRessya->getCentDedEkiJikokuCount() と等しくなります。 if ( iEkiOrder == pRessya->getCentDedEkiJikokuCount() ) { bErase = true ; } } // 列車を削除 if ( bErase ) { pCentDedRessyaCont->erase( idxRessya ) ; idxRessya -- ; } } } } } return rosenNew ; }
int CentDedDgrRessya::updateRessyasenCont_02_calcRessyasenSyuuten( int iRessyasenKitenEkiOrder , int* piRessyasenSyuutenEkiOrder ) { int iRv = 0 ; Mu<CentDedDgrEkiJikoku*>* pMuCentDedDgrEkiJikoku = this->getMuCentDedDgrEkiJikoku() ; int iSyuuchakuEki = getSyuuchakuEki() ; int iRessyasenSyuutenEkiOrder = -1 ; // (1) 『列車線終点駅Order』の条件は、 //「着時刻・発時刻の両方が指定されている」 OR //「 次の駅の駅扱いが『運行なし』 」 OR //「「『駅Order』が、その列車におけるの終着駅」 // 対象駅がみつからなければ、列車線終点駅Orderの決定は失敗となります // (経由なしの直前は、列車線の終点にはなりません // (この時点での列車線起点と終点は、経由なしをまたぐことがあります。) if ( iRv >= 0 ) { for ( int iEkiOrder = iRessyasenKitenEkiOrder + 1 ; iRessyasenSyuutenEkiOrder < 0 && iEkiOrder <= iSyuuchakuEki ; iEkiOrder ++ ) { CentDedDgrEkiJikoku aEkiJikokuCurr = *pMuCentDedDgrEkiJikoku->get( iEkiOrder ) ; CentDedDgrEkiJikoku aEkiJikokuNext ; if ( iEkiOrder + 1 < pMuCentDedDgrEkiJikoku->size() ) { aEkiJikokuNext = *pMuCentDedDgrEkiJikoku->get( iEkiOrder + 1 ) ; } //aEkijikokuCurr = iEkiOrder の駅時刻 //aEkiJikokuNext = iEkiOder の次の駅の駅時刻。 // iEkiOrderが終着駅の場合は、NULLとなります。 int jikokuChaku = aEkiJikokuCurr.getDgrXPosChaku( false ) ; int jikokuHatsu = aEkiJikokuCurr.getDgrXPosHatsu( false ) ; if ( jikokuChaku != INT_MIN && jikokuHatsu != INT_MIN ) { //「着時刻・発時刻の両方が指定されている」 iRessyasenSyuutenEkiOrder = iEkiOrder ; } else if ( aEkiJikokuNext.getEkiatsukai() == CentDedEkiJikoku::Ekiatsukai_None ) { // 「次の駅の駅扱いが『運行なし』」 iRessyasenSyuutenEkiOrder = iEkiOrder ; } else if ( iEkiOrder == iSyuuchakuEki ) { // 「「『駅Order』が、その列車におけるの終着駅」 iRessyasenSyuutenEkiOrder = iEkiOrder ; } } if ( iRessyasenSyuutenEkiOrder < 0 ) { iRv = -1 ; // 列車線終点が決定できません。(通常は発生しません) } } // iRessyasenSyuutenEkiOrder = 仮決定した列車線終点駅Order // (2) この時点で、『列車線終点駅Order』に着時刻も発時刻も // 設定されていない場合は、 // 始発駅方向に向かって、着時刻・発時刻のいずれかが指定されている // 駅を検索します。 // この結果『列車線終点駅Order』に相当する駅がない場合は、 // 列車線終点駅Orderの決定は失敗となります。 if ( iRv >= 0 ) { for ( ; iRessyasenSyuutenEkiOrder > iRessyasenKitenEkiOrder ; iRessyasenSyuutenEkiOrder -- ) { CentDedDgrEkiJikoku aEkiJikokuCurr = *pMuCentDedDgrEkiJikoku->get( iRessyasenSyuutenEkiOrder ) ; int jikokuChaku = aEkiJikokuCurr.getDgrXPosChaku( false ) ; int jikokuHatsu = aEkiJikokuCurr.getDgrXPosHatsu( false ) ; if ( jikokuChaku != INT_MIN || jikokuHatsu != INT_MIN ) { //「着時刻・発時刻のどちらかが指定されている」 break ; } } if ( iRessyasenSyuutenEkiOrder == iRessyasenKitenEkiOrder ) { iRv = -1 ; // 列車線終点が決定できません。 } //iRessyasenSyuutenEkiOrder = // 着時刻・発時刻のいずれかが指定された、『列車線終点駅Order』 } // -------------------------------- if ( iRv >= 0 ) { *piRessyasenSyuutenEkiOrder = iRessyasenSyuutenEkiOrder ; } return ( iRv ) ; }