Skip to content

Script Básico

Olá Mundo

Todo programador começa escrevendo o mesmo programa: para imprimir "Olá Mundo!". Neste exemplo, imprimiremos isso na janela de Log do Aimsun Next. Os passos são:

  1. Inicie o Aimsun Next.
  2. Crie uma nova Rede.
  3. Crie um novo Script Vazio em Python (a partir do Menu do Projeto). O novo script aparecerá na Janela do Projeto.
  4. Abra o Script em Python (clique duas vezes sobre ele).
  5. Escreva o aplicativo Olá Mundo. Note que o editor reconhece a sintaxe e colore o texto.
  6. Pressione o botão Executar.
  7. Veja na janela de Log.


Script Olá Mundo

Procurando Tudo

"Olá Mundo" é apenas um texto estático, é mais interessante obter informações do modelo. Este exemplo imprime o identificador e o nome de todas as seções em uma rede. Isso requer iteração sobre todas as seções.

sectionType = model.getType( "GKSection" )
for types in model.getCatalog().getUsedSubTypesFromType( sectionType ):
    for s in types.values():
        print("ID da Seção: %i Nome: %s" % (s.getId(), s.getName()))

O Aimsun Next possui um catálogo (GKCatalog) em cada modelo que inclui todos os objetos nele, tanto gráficos quanto não gráficos, ordenados por tipo e identificador. Este catálogo é acessível usando o GKModel::getCatalog método.

Antes de iterar sobre o catálogo, o código busca o tipo dos objetos que serão usados. Neste caso, será GKSection.

sectionType = model.getType( "GKSection" )

O código então busca todos os tipos que são, ou derivados de, GKSection:

for types in model.getCatalog().getUsedSubTypesFromType( sectionType ):

E para cada tipo, o código busca todos os objetos desse tipo:

for s in types.values():

Neste exemplo, há dois pontos dignos de nota: por que iterar duas vezes e o acesso ao estilo de array.

Precisamos iterar sobre todos os tipos que derivam de GKSection, pois é possível que um desenvolvedor escrevendo um plug-in possa estender o tipo GKSection criando um novo tipo baseado em GKSection. Isso faz parte das capacidades de orientação a objetos do C++ e da extensibilidade do Aimsun Next. Portanto, sempre devemos escrever código para antecipar essa possibilidade.

O segundo ponto é o acesso ao estilo de array que está relacionado a como o Python lida com objetos de mapeamento. A variável types é um mapa de objetos (um dicionário) que usa o id de cada objeto como chave. Para iterar sobre os objetos no dicionário, o método values() é utilizado.

Procurando Algo

O catálogo também pode ser usado para encontrar um objeto particular por:

  • identificador (método GKCatalog::find).
  • identificador externo (método GKCatalog::findObjectByExternalId).
  • ou nome (método GKCatalog::findByName).

Observe que o Aimsun Next garante que o identificador é único, então uma busca encontrará um objeto ou nenhum, mas o nome e o identificador externo não são necessariamente únicos, então uma busca pode retornar múltiplos objetos.

Modificando um Objeto

Este exemplo é um script para reduzir a velocidade de todas as seções em 10%:

sectionType = model.getType( "GKSection" )
for types in model.getCatalog().getUsedSubTypesFromType( sectionType ):
    for section in types.values():
        section.setSpeed( section.getSpeed() * 0.9 )

model.getCommander().addCommand( None )

Este código estende a busca anterior para agora obter a velocidade da seção com GKSection::getSpeed(), modificá-la e reescrevê-la com GKSection::setSpeed(). O novo elemento neste código é esta linha:

model.getCommander().addCommand( None )

Isso informa ao Aimsun Next para limpar o buffer de desfazer porque uma modificação que não pode ser desfeita foi executada. No Aimsun Next, apenas operações realizadas chamando um GKCommand implementam métodos para reverter a modificação e, portanto, podem ser desfeitas (veja Referência da Classe GKCommand para uma lista). Como o script usa o método setSpeed() para modificar o modelo, esta operação não coloca um comando de reverter no buffer de desfazer. Nesta situação, se uma operação de desfazer for executada, ela reverterá não esta modificação, mas a última que pode ser desfeita, e também estará operando em um modelo que mudou nesse meio tempo. Para evitar erros, o buffer de desfazer deve, portanto, ser limpo.

Todos os scripts que modificam o modelo devem terminar com esta linha, a menos que realizem modificações apenas usando GKCommands.