示例#1
0
def calcul_date_fin_cycle_PDF(network, cdf):
    """
	Méthode utilitaire pour déterminer la date de fin du cycle courant d'un plan de feux
	"""
    # récupération du plan de feux actif
    timeSpan = symuvia.STimeSpan()
    pdf = cdf.GetTrafficLightCycle(network.InstSimu, timeSpan)

    # Calcul de l'instant de fin d'une séquence du plan de feux actuel ...
    heure_debut_pdf_actuel = pdf.GetStartTime()
    instant_debut_PDF = heure_debut_pdf_actuel.second + 60 * heure_debut_pdf_actuel.minute + 3600 * heure_debut_pdf_actuel.hour
    inst_debut_simu = network.GetSimuStartTime()
    instant_debut_SIMU = inst_debut_simu.second + 60 * inst_debut_simu.minute + 3600 * inst_debut_simu.hour
    nb_secondes_ecoulees_PDF = network.InstSimu + instant_debut_SIMU - instant_debut_PDF
    duree_cycle_restante = pdf.GetCycleLength() - (nb_secondes_ecoulees_PDF %
                                                   pdf.GetCycleLength())

    # nombre de sécondes correspondant à l'instant à créer
    nb_secondes = instant_debut_PDF + nb_secondes_ecoulees_PDF + duree_cycle_restante
    # création du STime de début du nouveau plan de feux
    time_debut_pdf = symuvia.STime()
    time_debut_pdf.seconde = int(nb_secondes % 60)
    reste = nb_secondes / 60
    time_debut_pdf.minute = int(reste % 60)
    reste = reste / 60
    if reste > 23:
        raise Exception(
            "Attention, dépassement de l'heure sur le jour suivant non gérée par SymuVia"
        )
    time_debut_pdf.hour = int(reste % 24)

    return time_debut_pdf
示例#2
0
def change_traffic_light_cycle(conditions, context, network, parameters):
    """
	Change de plan de feux pour le contrôleur spécifié
	"""
    cdf = network.GetTrafficLightControllerFromID(parameters["cdf"])

    # index de la tranche
    index_tranche = conditions.values()[0]["tranche"]

    # construction du plan de feux à partir des paramètres reçus
    lstPlans = parameters["PLANS_DE_FEUX"][0]["PLAN_DE_FEUX"]
    for plan in lstPlans:
        if int(plan["index_tranche"]) == index_tranche:
            paramsPlan = plan
            break

    print u"plan a mettre en place : " + paramsPlan["id"]

    # instanciation de l'objet plan de feux à mettre en place
    pdf = symuvia.CreateTrafficLightCycle(str(paramsPlan["id"]),
                                          symuvia.STime())
    # ajout de chaque séquence
    seqNum = 0
    for sequence in plan["SEQUENCES"][0]["SEQUENCE"]:

        newSeq = symuvia.CreateSequence(float(sequence["duree_totale"]),
                                        seqNum)
        # définition de la séquence ...
        for signal in sequence["SIGNAUX_ACTIFS"][0]["SIGNAL_ACTIF"]:
            tuyau_entree = network.GetLinkFromLabel(signal["troncon_entree"])
            tuyau_sortie = network.GetLinkFromLabel(signal["troncon_sortie"])
            newSignal = symuvia.CreateActiveSignal(
                tuyau_entree, tuyau_sortie, float(signal["duree_vert"]), 0.0,
                float(signal["duree_retard_allumage"]))
            newSeq.AddActiveSignal(newSignal)

        pdf.AddSequence(newSeq)
        seqNum = seqNum + 1

    # détermination de la date à laquelle démarrer le nouveau plan de feux
    time_debut_pdf = symuviautils.calcul_date_fin_cycle_PDF(network, cdf)

    # mise en place du plan de feux
    cdf.GetLstTrafficLightCycles().AddVariation(time_debut_pdf, pdf)
示例#3
0
def change_sequence_length(conditions, context, network, parameters):
    """
	Change la durée d'une séquence
	"""
    if len(context) == 0:
        context["index_sequence"] = int(parameters["num_sequence"]) - 1
        context["nouvelle_duree"] = float(parameters["nouvelle_duree"])

    cdf = network.GetTrafficLightControllerFromID(parameters["cdf"])

    # récupération du plan de feux actif
    timeSpan = symuvia.STimeSpan()
    pdf = cdf.GetTrafficLightCycle(network.InstSimu, timeSpan)

    # recopie du plan de feux en modifiant la durée de la nouvelle séquence
    new_pdf = symuvia.CreateTrafficLightCycle("", symuvia.STime())
    seqNum = 0
    for seq in pdf.GetLstSequences():

        if seqNum == context["index_sequence"]:
            duree_seq = context["nouvelle_duree"]
        else:
            duree_seq = seq.GetTotalLength()
        newSeq = symuvia.CreateSequence(duree_seq, seqNum)

        # création des signaux
        for signal in seq.GetLstActiveSignals():
            newSignal = symuvia.CreateActiveSignal(signal.GetInputLink(),
                                                   signal.GetOutputLink(),
                                                   signal.GreenDuration,
                                                   signal.OrangeDuration,
                                                   signal.ActivationDelay)
            newSeq.AddActiveSignal(newSignal)

        new_pdf.AddSequence(newSeq)
        seqNum = seqNum + 1

    # détermination de la date à laquelle démarrer le nouveau plan de feux
    time_debut_pdf = symuviautils.calcul_date_fin_cycle_PDF(network, cdf)

    # mise en place du plan de feux
    cdf.GetLstTrafficLightCycles().AddVariation(time_debut_pdf, new_pdf)