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
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)
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)