Локальная переменная 'Veh_C2X_attributes', на которую ссылались до назначения Source? - PullRequest
0 голосов
/ 13 марта 2019

Я пытался запустить этот скрипт из программного обеспечения для микросимуляции PTV VISSIM.и получаю эту ошибку.Локальная переменная 'Veh_C2X_attributes', на которую ссылались до назначения Source ??В моем сценарии я создал список с именем Veh_C2X_attributes, используя понимание списка.Любая помощь по этому вопросу будет принята с благодарностью.Спасибо

Сценарий.

def Init():
    #Global Parameters
    global distDistr
    global Vehicle_Type_C2X_no_message
    global Vehicle_Type_C2X_HasCurrentMessage
    Veh_attributes = None

    distDistr = 1 # number of Distance distribution used for sending out a C2X message
    Vehicle_Type_C2X_no_message = '101' # number of C2X vehicle type (no active message) has to be a string!
    Vehicle_Type_C2X_HasCurrentMessage = '102' # number of C2X vehicle type with active message has to be a string!
    return



def Main():
    # Get several attributes of all vehicles:
    Veh_attributes = Vissim.Net.Vehicles.GetMultipleAttributes(('Pos', 'VehType', 'No'))
    if len(Veh_attributes) > 0: # Check if there are any vehicles in the network:
       # Filter by VehType C2X:
        Veh_C2X_attributes = None
        Veh_C2X_attributes = [item for item in Veh_attributes if item[1] == Vehicle_Type_C2X_no_message or item[1] == Vehicle_Type_C2X_HasCurrentMessage]    #Getting Error here
#Check if the Vehicle is in the range
    for C2X_Veh in range(len(Veh_C2X_attributes)):
        if Veh_C2X_attributes[C2X_Veh][0]==300:
            Veh_sending_Msg = Vissim.Net.Vehicles.ItemByKey(Veh_C2X_attributes[C2X_Veh][3])
            Coord_Veh = Veh_sending_Msg.AttValue('CoordFront') # reading the world coordinates (x y z) of the vehicle
            PositionXYZ = Coord_Veh.split(" ")
            Pos_Veh_SM = Veh_sending_Msg.AttValue('Pos') # relative position on the current link
            Veh_sending_Msg.SetAttValue('C2X_HasCurrentMessage', 1)
            Veh_sending_Msg.SetAttValue('C2X_SendingMessage', 1)
            Veh_sending_Msg.SetAttValue('C2X_MessageOrigin', Pos_Veh_SM)
            # Getting vehicles which receive the message:
            Veh_Rec_Message = Vissim.Net.Vehicles.GetByLocation(PositionXYZ[0], PositionXYZ[1], distDistr)
    return

1 Ответ

0 голосов
/ 13 марта 2019

Что ж, ваш if len(Veh_attributes) > 0: терпит неудачу и, следовательно, Veh_C2X_attributes не определен.

Один из способов убедиться в этом - ввести print в if len(Veh_attributes) > 0:, чтобы проверить, выполняется ли это условие.

Также лучшей практикой было бы определение Veh_C2X_attributes раньше.

Например:

def Main():
    # Get several attributes of all vehicles:
    Veh_C2X_attributes = [] # this will prevent code from failing
    Veh_attributes = Vissim.Net.Vehicles.GetMultipleAttributes(('Pos', 'VehType', 'No'))
    if len(Veh_attributes) > 0: # Check if there are any vehicles in the network:
       # Filter by VehType C2X:
        Veh_C2X_attributes = [item for item in Veh_attributes if item[1] == Vehicle_Type_C2X_no_message or item[1] == Vehicle_Type_C2X_HasCurrentMessage]    #Getting Error here
#Check if the Vehicle is in the range
    for C2X_Veh in range(len(Veh_C2X_attributes)):
        if Veh_C2X_attributes[C2X_Veh][0]==300:
            Veh_sending_Msg = Vissim.Net.Vehicles.ItemByKey(Veh_C2X_attributes[C2X_Veh][3])
            Coord_Veh = Veh_sending_Msg.AttValue('CoordFront') # reading the world coordinates (x y z) of the vehicle
            PositionXYZ = Coord_Veh.split(" ")
            Pos_Veh_SM = Veh_sending_Msg.AttValue('Pos') # relative position on the current link
            Veh_sending_Msg.SetAttValue('C2X_HasCurrentMessage', 1)
            Veh_sending_Msg.SetAttValue('C2X_SendingMessage', 1)
            Veh_sending_Msg.SetAttValue('C2X_MessageOrigin', Pos_Veh_SM)
            # Getting vehicles which receive the message:
            Veh_Rec_Message = Vissim.Net.Vehicles.GetByLocation(PositionXYZ[0], PositionXYZ[1], distDistr)
    return
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...