예제 #1
0
 def createNewTraffic(self, spawn_coords, spawn_hdg):
     dialog = CreateTrafficDialog(spawn_coords, spawn_hdg, parent=self.gui)
     dialog.exec()
     if dialog.result() > 0:
         params = dialog.acftInitParams()
         params.XPDR_mode = new_traffic_XPDR_mode
         acft = ControlledAircraft(dialog.acftCallsign(), dialog.acftType(),
                                   params, None)
         acft.spawned = False
         acft.frozen = dialog.startFrozen()
         acft.tickOnce()
         self.aircraft_list.append(acft)
         if dialog.createStrip():
             strip = Strip()
             strip.writeDetail(FPL.CALLSIGN, acft.identifier)
             strip.writeDetail(FPL.ACFT_TYPE, acft.aircraft_type)
             strip.writeDetail(FPL.WTC, wake_turb_cat(acft.aircraft_type))
             strip.linkAircraft(acft)
             signals.receiveStrip.emit(strip)
         selection.selectAircraft(acft)
예제 #2
0
    def generateAircraftAndStrip(self):
        start_angle = uniform(0, 360)
        start_pos = env.radarPos().moved(Heading(start_angle, True),
                                         settings.solo_CTR_range_dist)
        end_pos = env.radarPos().moved(
            Heading(start_angle + 90 + uniform(1, 179), True),
            settings.solo_CTR_range_dist)
        transit_hdg = start_pos.headingTo(end_pos)
        dep_ad = world_navpoint_db.findClosest(env.radarPos().moved(transit_hdg.opposite(), \
          uniform(1.2 * settings.map_range, 5000)), types=[Navpoint.AD])
        dest_ad = world_navpoint_db.findClosest(env.radarPos().moved(transit_hdg, \
          uniform(1.2 * settings.map_range, 5000)), types=[Navpoint.AD])
        if env.pointOnMap(dep_ad.coordinates) or env.pointOnMap(
                dest_ad.coordinates):
            return None, None

        candidate_midpoints = [p for code in settings.solo_CTR_routing_points \
          for p in env.navpoints.findAll(code, types=[Navpoint.NDB, Navpoint.VOR, Navpoint.FIX]) \
          if start_pos.distanceTo(p.coordinates) < start_pos.distanceTo(end_pos)]
        midpoint = None if candidate_midpoints == [] else choice(
            candidate_midpoints)

        FLd10 = randint(settings.solo_CTR_floor_FL // 10,
                        settings.solo_CTR_ceiling_FL // 10)
        if settings.solo_CTR_semi_circular_rule == SemiCircRule.E_W and (FLd10 % 2 == 0) != (transit_hdg.magneticAngle() >= 180) \
         or settings.solo_CTR_semi_circular_rule == SemiCircRule.N_S and (FLd10 % 2 == 1) != (90 <= transit_hdg.magneticAngle() < 270):
            FLd10 += 1
            if 10 * FLd10 > settings.solo_CTR_ceiling_FL:
                return None, None
        p_alt = StdPressureAlt.fromFL(10 * FLd10)
        if not self.airbornePositionFullySeparated(start_pos, p_alt):
            return None, None
        acft_type = choice(self.playable_aircraft_types)
        hdg = start_pos.headingTo(some(midpoint, dest_ad).coordinates)
        params = SoloParams(Status(Status.AIRBORNE), start_pos, p_alt, hdg,
                            cruise_speed(acft_type))
        params.XPDR_code = env.nextSquawkCodeAssignment(XPDR_range_IFR_transit)
        new_acft = self.mkAiAcft(acft_type, params, dest_ad)
        dist_key = lambda atc: env.ATCs.getATC(atc).position.distanceTo(
            start_pos)
        received_from = min(env.ATCs.knownATCs(), key=dist_key)

        strip = Strip()
        strip.writeDetail(FPL.CALLSIGN, new_acft.identifier)
        strip.writeDetail(FPL.ACFT_TYPE, new_acft.aircraft_type)
        strip.writeDetail(FPL.WTC, wake_turb_cat(new_acft.aircraft_type))
        strip.writeDetail(FPL.FLIGHT_RULES, 'IFR')
        strip.writeDetail(FPL.ICAO_DEP, dep_ad.code)
        strip.writeDetail(FPL.ICAO_ARR, dest_ad.code)
        strip.writeDetail(FPL.CRUISE_ALT,
                          env.readStdAlt(new_acft.params.altitude))
        strip.writeDetail(assigned_altitude_detail,
                          strip.lookup(FPL.CRUISE_ALT))
        strip.writeDetail(assigned_SQ_detail, new_acft.params.XPDR_code)
        strip.writeDetail(received_from_detail, received_from)
        if midpoint != None:
            strip.insertRouteWaypoint(midpoint)

        new_acft.instructions.append(
            Instruction(Instruction.FOLLOW_ROUTE,
                        arg=strip.lookup(parsed_route_detail).dup()))
        return new_acft, strip
def acft_bulk_radius(acft_type):
    return bulk_radii_metres.get(wake_turb_cat(acft_type),
                                 default_bulk_radius) * m2NM
예제 #4
0
 def generateAircraftAndStrip(self):
     new_acft = received_from = None
     is_arrival = random() >= settings.solo_ARRvsDEP_balance
     if is_arrival:
         dep_ad = choose_dep_dest_AD(True)
         dest_ad = env.airport_data.navpoint
         midpoint = local_ee_point_closest_to(dest_ad,
                                              False)  # None if none found
         if settings.solo_role_APP:
             new_acft = self.new_arrival_APP(midpoint)
             received_from = 'CTR'
         elif settings.solo_role_TWR:
             new_acft = self.new_arrival_TWR()
             received_from = 'APP'
         elif settings.solo_role_GND:
             new_acft = self.new_arrival_GND()
             received_from = 'TWR'
     else:  # Create a departure
         dep_ad = env.airport_data.navpoint
         dest_ad = choose_dep_dest_AD(False)
         midpoint = local_ee_point_closest_to(dep_ad,
                                              True)  # None if none found
         if settings.solo_role_GND:
             new_acft = self.new_departure_GND(midpoint)
             received_from = 'DEL'
         elif settings.solo_role_TWR:
             new_acft = self.new_departure_TWR(midpoint)
             received_from = 'GND'
         elif settings.solo_role_DEP:
             new_acft = self.new_departure_DEP(midpoint)
             received_from = 'TWR'
     if new_acft == None:
         return None, None
     else:
         strip = Strip()
         strip.writeDetail(FPL.CALLSIGN, new_acft.identifier)
         strip.writeDetail(FPL.ACFT_TYPE, new_acft.aircraft_type)
         strip.writeDetail(FPL.WTC, wake_turb_cat(new_acft.aircraft_type))
         strip.writeDetail(FPL.FLIGHT_RULES, 'IFR')
         strip.writeDetail(assigned_SQ_detail, new_acft.params.XPDR_code)
         strip.writeDetail(received_from_detail, received_from)
         if received_from == 'CTR':
             strip.writeDetail(assigned_altitude_detail,
                               env.readStdAlt(new_acft.params.altitude))
         elif received_from == 'TWR' and not settings.solo_role_GND:
             strip.writeDetail(assigned_altitude_detail,
                               settings.solo_initial_climb_reading)
         # routing details
         strip.writeDetail(FPL.ICAO_DEP, dep_ad.code)
         strip.writeDetail(FPL.ICAO_ARR, dest_ad.code)
         if is_arrival and midpoint != None:  # arrival with local entry point
             try:
                 strip.writeDetail(
                     FPL.ROUTE,
                     world_routing_db.shortestRouteStr(dep_ad, midpoint) +
                     ' ' + midpoint.code)
             except ValueError:
                 strip.writeDetail(FPL.ROUTE, 'DCT %s' % midpoint.code)
         elif not is_arrival and midpoint != None:  # departure with local exit point
             try:
                 strip.writeDetail(
                     FPL.ROUTE, midpoint.code + ' ' +
                     world_routing_db.shortestRouteStr(midpoint, dest_ad))
             except ValueError:
                 strip.writeDetail(FPL.ROUTE, '%s DCT' % midpoint.code)
         return new_acft, strip
예제 #5
0
 def autoFillWTCfromType(self, dez):
     if self.autoFillWTC_button.isChecked():
         self.wakeTurbCat_select.setCurrentText(some(
             wake_turb_cat(dez), ''))