void CRunwayDetailExitResult::Draw3DChart(CARC3DChart& chartWnd, CParameters *pParameter) { if(pParameter == NULL) return ; C2DChartData c2dGraphData; c2dGraphData.m_strChartTitle.Format(_T("Runway Exit Detail Delay")) ; c2dGraphData.m_strYtitle = _T("Number of aircrafts"); c2dGraphData.m_strXtitle = _T("Date and time") ; //set footer CString strFooter(_T("")); strFooter.Format(_T("%s %s,%s "),_T("Runway Exit Detail Delay"), pParameter->getStartTime().printTime(), pParameter->getEndTime().printTime()); bool bCommaFlag = true; c2dGraphData.m_strFooter = strFooter; int intervalSize = 0 ; ElapsedTime IntervalTime ; IntervalTime = (pParameter->getEndTime() - pParameter->getStartTime()) ; intervalSize = IntervalTime.asSeconds() / pParameter->getInterval() ; CTimeIntervalFlightData* PTimeIntervalData = NULL ; IntervalTime = pParameter->getStartTime() ; CString timeInterval ; ElapsedTime startTime = pParameter->getStartTime(); ElapsedTime endtime ; for (int i = 0 ; i < intervalSize ;i++) { endtime = startTime + ElapsedTime(pParameter->getInterval()) ; timeInterval.Format(_T("%s-%s"),startTime.printTime(),endtime.printTime()) ; startTime = endtime ; c2dGraphData.m_vrXTickTitle.push_back(timeInterval) ; } CRunwayExitRepDataItem* RunwayExitRepDataItem = NULL ; CString Strval ; int size = (int)( m_ReportBaseData->GetData()->size() ); for (int i = 0 ; i < size; i++) { RunwayExitRepDataItem = m_ReportBaseData->GetData()->at(i) ; Strval.Format(_T("%s %s"),RunwayExitRepDataItem->m_RunwayName,RunwayExitRepDataItem->m_RunwayExitName) ; c2dGraphData.m_vrLegend.push_back(Strval); std::vector<double> segmentData ; CTimeIntervalFlightData* TimerIntervalData = NULL ; for (int j = 0 ; j < (int)RunwayExitRepDataItem->GetData()->size() ;j++) { TimerIntervalData = RunwayExitRepDataItem->GetData()->at(j) ; segmentData.push_back((long)TimerIntervalData->m_FlightData.size()) ; } c2dGraphData.m_vr2DChartData.push_back(segmentData); } chartWnd.DrawChart(c2dGraphData); }
//called by updateApproachingPerson() // put a person from wait location to it's destination slot void CLoader::putBagToSlot( Person *aPerson, ElapsedTime curTime) { TerminalMobElementBehavior* spTerminalBehavior = aPerson->getTerminalBehavior(); if (spTerminalBehavior == NULL) { return; } int _iDestSlot = spTerminalBehavior->GetDestinationSlot(); assert( _iDestSlot!= -1 ); if( m_pSlots[ _iDestSlot ].first != NULL ) { writeLogEvent (aPerson, curTime, BeginService); aPerson->kill(curTime); throw new ARCConveyorSimultaneousServiceError( aPerson->getPersonErrorMsg(), getID()->GetIDString(),_T(""), curTime.printTime() ); } startUpIfNeed( curTime+1l ); // remove from approaching list int index = m_approaching.findItem (aPerson); assert( index != INT_MAX ); m_approaching.removeItem (index); spTerminalBehavior->SetDestinationSlot( -1 ); // add the element to the processor m_iOccapuiedCount++; m_pSlots[_iDestSlot].first = aPerson; m_pSlots[_iDestSlot].second = curTime+1l; // write the element's log aPerson->setTerminalDestination( slotsPath.getSlotPoint( _iDestSlot ) ); aPerson->setState( MovingInConveyor ); aPerson->writeLogEntry( curTime+1l, false ); writeLogEvent (aPerson, curTime+1l, BeginService); }
void FltConflictChartResultByLocationAndTimeOfDay::Draw3DChart(CARC3DChart& chartWnd, CParameters *pParameter) { if (m_pData == NULL || pParameter == NULL) return; CString strLabel = _T(""); C2DChartData c2dGraphData; c2dGraphData.m_strChartTitle = _T(" Conflicts by location and time of day "); c2dGraphData.m_strYtitle = _T("Number of conflicts"); c2dGraphData.m_strXtitle = _T("Time of day"); AirsideFlightConflictPara* pConflictPara = (AirsideFlightConflictPara*)pParameter; ElapsedTime tTimeInterval = ElapsedTime(pConflictPara->getInterval()); ElapsedTime tStartTime = pConflictPara->getStartTime(); ElapsedTime tEndTime = pConflictPara->getEndTime(); //calculate interval count int nIntCount = (tEndTime.asSeconds() - tStartTime.asSeconds())/pConflictPara->getInterval(); if ((tEndTime.asSeconds() - tStartTime.asSeconds())%pConflictPara->getInterval() > 0) nIntCount++; //statistic count std::map< int,std::vector<double> > vACLocationConflicts; std::map< int,std::vector<double> > vGSELocationConflicts; m_pData->SortItemsByLocationType(); std::vector<double> vACConflictCount; std::vector<double> vGSEConflictCount; int nACLocation = -1; int nGSELocation = -1; vACConflictCount.clear(); vACConflictCount.resize(nIntCount,0); vGSEConflictCount.clear(); vGSEConflictCount.resize(nIntCount,0); int nItemCount = m_pData->m_vDataItemList.size(); for (int i = 0; i < nItemCount; i++) { FlightConflictReportData::ConflictDataItem* pItem = m_pData->m_vDataItemList.at(i); int nConfType = pItem->m_nConflictType; if (nConfType == 0 &&(pItem->m_nLocationType > nACLocation || pItem->m_nLocationType < nACLocation)) //a new ac-ac operation type { //record conflict count if (nACLocation >=0) vACLocationConflicts.insert(std::map< int,std::vector<double> > ::value_type(nACLocation,vACConflictCount)); //clear for new statistic vACConflictCount.clear(); vACConflictCount.resize(nIntCount,0); nACLocation = pItem->m_nLocationType; } if (nConfType == 1 &&(pItem->m_nLocationType > nGSELocation || pItem->m_nLocationType < nGSELocation)) //a new ac-gse operation type { if (nGSELocation >=0 ) vGSELocationConflicts.insert(std::map< int,std::vector<double> > ::value_type(nGSELocation,vGSEConflictCount)); vGSEConflictCount.clear(); vGSEConflictCount.resize(nIntCount,0); nGSELocation = pItem->m_nLocationType; } int nIntervalIdx = pItem->GetInIntervalIndex(pParameter); vector<double>::pointer ptr; if (nConfType ==0) { ptr = &vACConflictCount[nIntervalIdx]; (*ptr) +=1; } else { ptr = &vGSEConflictCount[nIntervalIdx]; (*ptr) +=1; } } if (nACLocation >=0) //need add the last statistic data vACLocationConflicts.insert(std::map< int,std::vector<double> > ::value_type(nACLocation,vACConflictCount)); if (nGSELocation >=0) vGSELocationConflicts.insert(std::map< int,std::vector<double> > ::value_type(nGSELocation,vGSEConflictCount)); //draw ElapsedTime tRangeStart = tStartTime; for(int i = 0; i < nIntCount; i++) { CString strTimeRange; ElapsedTime tRangeEnd = tRangeStart + ElapsedTime(pConflictPara->getInterval()) - 1L; if (tRangeEnd > pConflictPara->getEndTime()) tRangeEnd = pConflictPara->getEndTime(); strTimeRange.Format("%s -%s", tRangeStart.printTime(),tRangeEnd.printTime()); c2dGraphData.m_vrXTickTitle.push_back(strTimeRange); tRangeStart = tRangeEnd + 1L; } //legend std::vector<CString> vLegend; for (int i = 0; i < FlightConflict::LOCATION_FIELD; i++) { CString strName = FlightConflict::LOCATIONTYPE[i]; CString strLegend; std::vector<double> vConflicts; vConflicts = vACLocationConflicts[i]; if (!vConflicts.empty()) { strLegend.Format("%s AC-AC Conflicts",strName); vLegend.push_back(strLegend); c2dGraphData.m_vr2DChartData.push_back(vConflicts); } vConflicts = vGSELocationConflicts[i]; if (!vConflicts.empty()) { strLegend.Format("%s AC-GSE Conflicts", strName); vLegend.push_back(strLegend); c2dGraphData.m_vr2DChartData.push_back(vConflicts); } } c2dGraphData.m_vrLegend = vLegend; chartWnd.DrawChart(c2dGraphData); }
int FlightInHoldEvent::Process() { if (m_pCFlight->GetMode() == OnTerminate) return 0; //ASSERT(m_pCFlight->GetUID() != 34); double totalLength = m_pHold->GetPath().GetTotalLength(); double dist = 0.0; if (m_pCFlight->GetResource() == m_pHold) //already enter hold dist = m_pCFlight->GetDistInResource() + double(time - m_pCFlight->GetTime())* m_pCFlight->GetSpeed(); CPoint2008 pos = m_pHold->GetDistancePoint(((int)dist)% ((int)totalLength)); if (pos == m_pCFlight->GetPosition()) pos.setZ(m_pCFlight->GetCurState().m_dAlt); else { //flight down to next height level, the descend angle must no more than 3 degree double dAlt = m_pHold->getAvailableHeight(m_pCFlight); if (dAlt != m_pCFlight->GetCurState().m_dAlt) { double dStep = m_pHold->getAvailableHeight(m_pCFlight) - m_pCFlight->GetCurState().m_dAlt; double dStepHeight = (dist-m_pCFlight->GetDistInResource())*tan(ARCMath::DegreesToRadians(3.0)); if (dStep >0) dAlt = m_pCFlight->GetCurState().m_dAlt + (dStepHeight<dStep?dStepHeight:dStep); else dAlt = m_pCFlight->GetCurState().m_dAlt - (dStepHeight<-dStep?dStepHeight:-dStep); } pos.setZ(dAlt); } ClearanceItem nextItem(m_pHold,OnWaitInHold,((int)dist)% ((int)totalLength)); nextItem.SetPosition(pos); nextItem.SetTime(time); nextItem.SetSpeed(m_pCFlight->GetSpeed()); nextItem.SetAltitude(pos.getZ()); m_pCFlight->PerformClearanceItem(nextItem); if (m_pHold != NULL) //the flight max holding time cannot exceed 24h { AirWayPointInSim* pWaypoint = m_pHold->GetWaypointInSim(); ElapsedTime tEnter = m_pHold->GetOccupyInstance(m_pCFlight).GetEnterTime(); if (tEnter + MAXHOLDINGTIME <= time) { CString strWarn; strWarn.Format("The Flight's holding time in %s too long",m_pHold->PrintResource()) ; CString strError = _T("AIRCRAFT TERMINATE"); AirsideSimErrorShown::SimWarning(m_pCFlight,strWarn,strError); ClearanceItem newItem(NULL, OnTerminate,0); nextItem.SetTime(time); nextItem.SetSpeed(0); m_pCFlight->PerformClearanceItem(newItem); return 0; } ElapsedTime tMinLap = ElapsedTime((0.33*totalLength)/m_pCFlight->GetSpeed()); if (m_tHoldTime >= 0L && (m_tHoldTime - tEnter) < tMinLap) { m_tHoldTime = tEnter + tMinLap; } } if(m_pHold->GetHeadFlightCount(m_pCFlight)>0) //the flight is not at the lowest level in hold { double stepLength = totalLength/8.0; ElapsedTime nextTime = time + ElapsedTime(stepLength/m_pCFlight->GetSpeed()); if (m_tHoldTime > 0L && nextTime > m_tHoldTime ) m_tHoldTime = (nextTime + 10L); //ASSERT(m_pCFlight->GetUID() != 31); FlightInHoldEvent* pNextEvent = new FlightInHoldEvent(m_pCFlight,m_pHold, m_tHoldTime); pNextEvent->setTime(nextTime); pNextEvent->addEvent(); return 0; } CPoint2008 WPpos = m_pHold->GetDistancePoint(0.0); // ElapsedTime dTime = ElapsedTime(pos.distance(WPpos)/m_pCFlight->GetSpeed()); double dMoveDist = totalLength - m_pCFlight->GetDistInResource(); ElapsedTime dTime = ElapsedTime(dMoveDist/m_pCFlight->GetSpeed()); if ((m_tHoldTime >0L && (time+dTime) >= m_tHoldTime)) { ClearanceItem newItem((AirsideResource*)m_pHold->GetWaypointInSim() ,OnWaitInHold, 0.0); WPpos.setZ(pos.getZ()); newItem.SetPosition(WPpos); newItem.SetTime(time+dTime); newItem.SetSpeed(m_pCFlight->GetSpeed()); newItem.SetAltitude(pos.getZ()); Clearance nextClearance; ClearanceItem newItemCopy = newItem; bool bExit = m_pHold->GetAirRouteNetwork()->IsFlightNeedHolding(m_pCFlight,m_pHold,newItemCopy,nextClearance); if (bExit) { if (m_pCFlight->GetCurDelayLog()->mConflictLocation == FlightConflict::RUNWAY ) { ElapsedTime tAvailableTime = newItem.GetTime(); ElapsedTime tDelay = m_pCFlight->GetCurDelayLog()->mDelayTime; ElapsedTime tStartTime = tAvailableTime - tDelay; ResourceDesc resDesc; m_pCFlight->GetLandingRunway()->getDesc(resDesc); AirsideFlightRunwayDelayLog* pLog = new AirsideFlightRunwayDelayLog(resDesc, tStartTime.asSeconds(), OnLanding, tAvailableTime.asSeconds(), tDelay.asSeconds(), FlightRunwayDelay::LandingRoll); pLog->sReasonDetail = "Wave crossings"; m_pCFlight->LogEventItem(pLog); } m_pCFlight->EndDelay(newItem); //end holding delay if (nextClearance.GetItemCount()) { ClearanceItem& firstItem = nextClearance.ItemAt(0); ElapsedTime startTime = time; ElapsedTime endTime = firstItem.GetTime(); ElapsedTime detaTime = endTime - startTime; CString strStartTime = startTime.printTime(); CString strEndTime = endTime.printTime(); if (detaTime > 0l && firstItem.GetPosition() == newItem.GetPosition()) { double dHeight = 0.0; if (firstItem.GetTime() == newItem.GetTime()) { double stepLength = totalLength/8.0; ElapsedTime nextTime = ElapsedTime(stepLength/m_pCFlight->GetSpeed()); startTime += nextTime; CPoint2008 pt; for (; startTime < endTime; startTime += nextTime) { stepIt(startTime,pt); } stepIt(endTime,pt); dHeight = pt.getZ(); } else { double stepLength = totalLength/8.0; ElapsedTime nextTime = ElapsedTime(stepLength/m_pCFlight->GetSpeed()); startTime += nextTime; CPoint2008 pt; ElapsedTime tPreTime; ElapsedTime tNextTime; for (; startTime < endTime; startTime += nextTime) { double dRouteDist = m_pCFlight->GetDistInResource(); CPoint2008 flightPos = m_pHold->GetDistancePoint(((int)dRouteDist)% ((int)totalLength)); ElapsedTime dMoveTime = ElapsedTime(flightPos.distance(WPpos)/m_pCFlight->GetSpeed()); ElapsedTime tSumTime = startTime + dMoveTime; if (tSumTime >= endTime) { tNextTime = tSumTime - endTime; break; } else { tPreTime = endTime - tSumTime; } stepIt(startTime,pt); } if (tPreTime.getPrecisely() || tNextTime.getPrecisely()) { double dRate = tPreTime / (tPreTime + tNextTime); ElapsedTime tMoveTime = nextTime * dRate; stepIt(startTime + tMoveTime - nextTime,pt); } //step end item { CPoint2008 WPpos = m_pHold->GetDistancePoint(0.0); ClearanceItem newItem((AirsideResource*)m_pHold->GetWaypointInSim() ,OnWaitInHold, 0.0); //WPpos.setZ(pt.getZ()); double dAlt = m_pHold->getAvailableHeight(m_pCFlight); if (dAlt != m_pCFlight->GetCurState().m_dAlt) { double dStep = m_pHold->getAvailableHeight(m_pCFlight) - m_pCFlight->GetCurState().m_dAlt; double dStepHeight = (dist-m_pCFlight->GetDistInResource())*tan(ARCMath::DegreesToRadians(3.0)); if (dStep >0) dAlt = m_pCFlight->GetCurState().m_dAlt + (dStepHeight<dStep?dStepHeight:dStep); else dAlt = m_pCFlight->GetCurState().m_dAlt - (dStepHeight<-dStep?dStepHeight:-dStep); } dHeight = dAlt; WPpos.setZ(dAlt); newItem.SetPosition(WPpos); newItem.SetTime(endTime); newItem.SetSpeed(m_pCFlight->GetSpeed()); // newItem.SetAltitude(pt.getZ()); newItem.SetAltitude(dAlt); m_pCFlight->PerformClearanceItem(newItem); } } firstItem.SetPosition(WPpos); // firstItem.SetAltitude(pt.getZ()); firstItem.SetAltitude(dHeight); } else { m_pCFlight->PerformClearanceItem(newItem); } } else { m_pCFlight->PerformClearanceItem(newItem); } m_pCFlight->PerformClearance(nextClearance); FlightWakeupEvent* pEvent = new FlightWakeupEvent(m_pCFlight); pEvent->setTime(m_pCFlight->GetTime()); pEvent->addEvent(); } return 0; } double stepLength = totalLength/8.0; ElapsedTime nextTime = time + ElapsedTime(stepLength/m_pCFlight->GetSpeed()); if ( m_tHoldTime > 0L && nextTime > m_tHoldTime) nextTime = m_tHoldTime; //ASSERT(m_pCFlight->GetUID() != 31); FlightInHoldEvent* pNextEvent = new FlightInHoldEvent(m_pCFlight,m_pHold, m_tHoldTime); pNextEvent->setTime(nextTime); pNextEvent->addEvent(); return 0; }
bool EnrouteQueueCapacityInSim::PushBackExitEnrouteQCapacity( const ElapsedTime& eTime, AirsideFlightInSim* pFlight ) { TaxiRouteInSim* pTaxiRoute = pFlight->GetAndAssignOutBoundRoute(); if (pTaxiRoute == NULL) return true; pTaxiRoute->InitRoute(pFlight,eTime); FlightHoldListInTaxiRoute& taxiRouteList = pTaxiRoute->GetHoldList(); CString strTime = eTime.printTime(); for (int i = 0; i < taxiRouteList.GetCount(); i++) { const HoldInTaxiRoute& theHold = taxiRouteList.ItemAt(i); if (theHold.m_pNode->GetNodeInput().GetRunwayIntersectItemList().size() == 0) continue; RunwayIntersectItem* pRwItem = theHold.m_pNode->GetNodeInput().GetRunwayIntersectItemList()[0]; int nRwID = pRwItem->GetObjectID(); RunwayInSim* pRunway = pFlight->GetAirTrafficController()->GetAirsideResourceManager()->GetAirportResource()->getRunwayResource()->GetRunwayByID(nRwID); HoldPositionInSim* pCrossHold = pRunway->GetHoldPosition( theHold.m_nHoldId ); if (pCrossHold == NULL) continue; size_t nCount = m_pEnrouteQueueCapacity->GetElementCount(); for (size_t i = 0; i < nCount; i++) { AirsideEnrouteQCapacityTimeRange* pQCapacityTimeRange = m_pEnrouteQueueCapacity->GetItem(i); TimeRange* pTimeRange = pQCapacityTimeRange->getTimeRange(); if (eTime < pTimeRange->GetStartTime() || eTime > pTimeRange->GetEndTime()) continue; size_t iEnrouteCount = pQCapacityTimeRange->getEnrouteQCapacity()->GetElementCount(); for (size_t j = 0; j < iEnrouteCount; j++) { AirsideEnrouteQCapacityItem* pCapacityItem = pQCapacityTimeRange->getEnrouteQCapacity()->GetItem(j); int nExitID = pCapacityItem->getTakeOffPosition()->GetID(); if(nExitID < 0) continue; LogicRunwayInSim* pRwyPort = m_pAirportres->getRunwayResource()->GetLogicRunway(pCapacityItem->getTakeOffPosition()->GetRunwayID(),pCapacityItem->getTakeOffPosition()->GetRunwayMark()); if(!pRwyPort) continue; RunwayExitInSim* pRwyExit = pRwyPort->GetExitByID(nExitID); if(!pRwyExit) continue; HoldPositionInSim* pHold = pRwyExit->getHoldPosition(); if(!pHold) continue; if (pCrossHold != pHold) continue; if(!pHold->IsFlightInQueue(pFlight)) { double dQueueLength = pHold->GetTakeoffQueueLength(); double dMaxQueue = pCapacityItem->getMaxLength() * 100; if (dQueueLength > dMaxQueue ) { pHold->AddEnrouteWaitList(pFlight); return false; } } } } } return true; }