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:
- Inicie o Aimsun Next.
- Crie uma nova Rede.
- Crie um novo Script Vazio em Python (a partir do Menu do Projeto). O novo script aparecerá na Janela do Projeto.
- Abra o Script em Python (clique duas vezes sobre ele).
- Escreva o aplicativo Olá Mundo. Note que o editor reconhece a sintaxe e colore o texto.
- Pressione o botão Executar.
- Veja na janela de Log.
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.