Construindo uma API Microscópica Aimsun Next¶
O módulo Aimsun Next API pode ser implementado como uma biblioteca dinâmica escrita em C++ ou como um arquivo de script escrito em Python (versão 3.7 para Ubuntu, versão 3.10 para Mac e Windows) (para mais informações sobre esta linguagem de script, visite http://www.python.org)
Construindo uma API Aimsun Next Micro usando C++¶
Uma Extensão Aimsun Next API em C++ é uma biblioteca dinâmica que contém o código desejado que interagirá com o simulador microscópico. O Aimsun Next carregará esta biblioteca dinâmica, se selecionada no Editor de Cenários, quando uma simulação começar.
Para ajudar a desenvolver esta biblioteca, os seguintes arquivos são fornecidos:
- Arquivos de Cabeçalho:
- AKIProxie.h
- CIProxie.h
- ANGConProxie.h
- AAPI_Util.h
- Bibliotecas:
- Versão Windows 64 bits: a2kernel24.lib e acontrol24.lib
- Versões Linux 64 bits: liba2kernel22.so e libacontrol22.so (localizadas na pasta Aimsun Next Home)
- Versão Mac: liba2kernel22.1.0.dylib e libacontrol22.1.0.dylib (localizadas na pasta Aimsun Next.app/Contents/PlugIns)
- Arquivos de Exemplo:
- AAPI.h
- AAPI.cxx
Somente o arquivo de exemplo AAPI.cxx pode ser modificado, preencha as rotinas AAPILoad(), AAPIInit(), AAPISimulationReady(), AAPIManage(… ), AAPIPostManage(… ), AAPIFinish() e AAPIUnLoad() e adicione outros arquivos, se necessário.
Com a versão do Windows de 64 bits, há um projeto de exemplo do Visual C++ 2013 pronto para compilar e construir a DLL. O projeto do Visual C++ 2013 tem duas configurações disponíveis: a configuração de Depuração que constrói a AAPI_D.dll por padrão e as configurações de Liberação que constroem a AAPI_R.dll por padrão.
Um exemplo muito simples do Módulo Aimsun Next API é mostrado no seguinte arquivo AAPI.cxx:
#include "AKIProxie.h"
#include "CIProxie.h"
#include "ANGConProxie.h"
#include "AAPI.h"
#include <stdio.h>
// Procedimentos que podem ser modificados pelo usuário
int AAPILoad()
{
AKIPrintString("CARREGAR");
return 0;
}
int AAPIInit()
{
AKIPrintString(" Inicializar");
return 0;
}
int AAPISimulationReady()
{
AKIPrintString(" AAPISimulationReady");
return 0;
}
int AAPIManage(double time, double timeSta, double timeTrans, double acycle)
{
return 0;
}
int AAPIPostManage(double time, double timeSta, double timeTrans, double acycle)
{
return 0;
}
int AAPIFinish()
{
AKIPrintString(" Finalizar");
return 0;
}
int AAPIUnLoad()
{
AKIPrintString("DESCARREGAR");
return 0;
}
Construindo uma API Aimsun Next Micro usando um Script Python¶
A Extensão Aimsun Next API pode ser implementada utilizando um script Python. Este script Python é um arquivo ASCII com a extensão PY e pode ser criado em qualquer editor de texto.
Um script Python deve definir as quatorze funções de alto nível: AAPILoad(), AAPIInit(), AAPIManage(…), AAPIPostManage(…), AAPIFinish(), AAPIUnLoad(), AAPIPreRouteChoiceCalculation(...), AAPIVehicleStartParking(...), AAPIEnterVehicle(...), AAPIEnterVehicle(...), AAPIExitVehicle(...), AAPIEnterPedestrian(...), AAPIExitPedestrian(...), AAPIEnterVehicleSection(...) e AAPIExitVehicleSection(...). Todas as funções de alto nível devem ser definidas no arquivo para que ele seja executado com sucesso.
Um exemplo muito simples do Módulo Aimsun Next API com os seguintes conteúdos é fornecido no arquivo sample.py:
from AAPI import *
def AAPILoad():
AKIPrintString( "AAPILoad" )
return 0
def AAPIInit():
AKIPrintString( "AAPIInit" )
return 0
def AAPISimulationReady():
AKIPrintString( "AAPISimulationReady" )
return 0
def AAPIManage(time, timeSta, timeTrans, acycle):
AKIPrintString( "AAPIManage" )
return 0
def AAPIPostManage(time, timeSta, timeTrans, acycle):
AKIPrintString( "AAPIPostManage" )
return 0
def AAPIFinish():
AKIPrintString( "AAPIFinish" )
return 0
def AAPIUnLoad():
AKIPrintString( "AAPIUnLoad" )
return 0
def AAPIPreRouteChoiceCalculation(time, timeSta):
AKIPrintString( "AAPIPreRouteChoiceCalculation" )
return 0
def AAPIVehicleStartParking (idveh, idsection, time):
return 0
def AAPIEnterVehicle(idveh, idsection):
return 0
def AAPIExitVehicle(idveh, idsection):
return 0
def AAPIEnterPedestrian(idPedestrian, originCentroid):
return 0
def AAPIExitPedestrian(idPedestrian, destinationCentroid):
return 0
def AAPIEnterVehicleSection(idveh, idsection, atime):
return 0
def AAPIExitVehicleSection(idveh, idsection, atime):
return 0
Existem algumas funções que precisam passar parâmetros por referência. Em Python, não é possível passar parâmetros por referência, mas existem algumas funções extras para habilitar isso.
No código a seguir, existe um exemplo de como funções com parâmetros de referência podem ser usadas em um script Python. A função calcula a duração do ciclo de um cruzamento.
def getCycleTime(junctionId , numPhases, t):
cycle = 0
pdur = doublep()
pcmax = doublep()
pcmin = doublep()
for i in range(1, numPhases):
ECIGetDurationsPhase(junctionId, i, t, pdur, pcmax, pcmin)
cycle = cycle + pdur.value()
del pdur
del pcmax
del pcmin
return cycle
Construindo uma Aplicação de API Mesoscópica Aimsun Next¶
O módulo Aimsun Next API pode ser implementado como uma biblioteca dinâmica escrita em C++ ou como um arquivo de script escrito em Python (versão 3.7 para Ubuntu, versão 3.10 para Mac e Windows) (para mais informações sobre esta linguagem de script, visite http://www.python.org)
Construindo uma API Aimsun Next Meso usando C++¶
Uma Extensão Aimsun Next API em C++ é uma biblioteca dinâmica que contém o código desejado que interagirá com o simulador mesoscópico. O Aimsun Next carregará esta biblioteca dinâmica, se selecionada no Editor de Cenários, quando uma simulação começar.
Para desenvolver esta biblioteca, os seguintes arquivos são fornecidos:
- Arquivos de Cabeçalho:
- AMesoAPIHelper.h
- CIProxie.h
- AAPI_Util.h
- Bibliotecas:
- Versão Windows 64 bits: aimsunmesoplugin24.lib, acontrol24.lib
- Arquivos de Exemplo:
- AAPI.h
- AAPI.cxx
Somente o arquivo de exemplo AAPI.cxx deve ser modificado para preencher as rotinas MesoAPILoad(…), MesoAPIInit(…), MesoAPISimulationReady(…), MesoAPIFinish(…), MesoAPIUnLoad(…), MesoAPINewVehicleSystem(…), MesoAPINewVehicleNetwork(…), MesoAPIEnterVehicleSection(…) e MesoAPIExitVehicleSection(…), MesoAPIPostManageControl(…), MesoAPIPreManageRouteChoice(…) e outros arquivos incluídos, se necessário.
Com a versão do Windows de 64 bits, há um projeto de exemplo do Visual C++ 2013 pronto para compilar e construir a DLL. O projeto do Visual C++ 2013 tem duas configurações disponíveis: a configuração de Depuração que constrói a AAPI_D.dll por padrão e as configurações de Liberação que constroem a AAPI_R.dll por padrão.
Um exemplo muito simples do Módulo Aimsun Next API pode ser definido pelos seguintes conteúdos de AAPI.cxx:
#include "AMesoAPIHelper.h"
#include "AAPI.h"
#include <stdio.h>
// Procedimentos que podem ser modificados pelo usuário
int MesoAPILoad()
{
return 0;
}
int MesoAPIUnLoad(void * handler)
{
AMesoPrintString(handler, "Descarregar");
return 0;
}
int MesoAPIInit(void * handler, int iterationNumber, bool statisticsAllowed)
{
AMesoPrintString(handler, " Inicializar");
return 0;
}
int MesoAPISimulationReady(void * handler) { AMesoPrintString(handler, " Simulação Pronta"); return 0; }
int MesoAPIFinish(void * handler)
{
AMesoPrintString(handler, " Finalizar");
return 0;
}
int MesoAPINewVehicleSystem(void * simhandler, void * vehhandler)
{
return 0;
}
int MesoAPINewVehicleNetwork(void * simhandler, void * vehhandler)
{
return 0;
}
int MesoAPIFinishVehicleNetwork(void * simhandler, void * vehhandler, bool normalOut)
{
//AMesoPrintString(simhandler, " Finalizar sistema");
return 0;
}
int MesoAPIEnterVehicleSection(void * simhandler, void * vehhandler, int fromSection, int toSection)
{
AMesoVehicleInfo vehInf = AMesoGetVehicleInfo(simhandler, vehhandler);
return 0;
}
int MesoAPIExitVehicleSection(void * simhandler, void * vehhandler, int section)
{
AMesoVehicleInfo vehInf = AMesoGetVehicleInfo(simhandler, vehhandler);
return 0;
}
int MesoAPIVehicleReadyForSection(void * simhandler, void * vehhandler, int section)
{
AMesoVehicleInfo vehInf = AMesoGetVehicleInfo(simhandler, vehhandler);
return 0;
}
int MesoAPIPostManageControl(void * simhandler)
{
std::cout << "Controle da Gestão Pós" << '
';
return 0;
}
int MesoAPIPreManageRouteChoice(void * simhandler)
{
std::cout << "Controle da Gestão Pré da Escolha de Rota" << '
';
return 0;
}
Construindo uma API Aimsun Next Meso usando um Script Python¶
A Extensão Aimsun Next API pode ser implementada usando um script Python. Este script Python é um arquivo ASCII com a extensão PY e pode ser criado em qualquer editor de texto.
Um script Python deve ser escrito para definir as seis funções de alto nível: MesoAPILoad(…), MesoAPIInit(…), MesoAPISimulationReady(…), MesoAPIUnLoad(…), MesoAPIFinish(…), MesoAPINewVehicleSystem(…), MesoAPINewVehicleNetwork(…), MesoAPIFinishVehicleNetwork(…), MesoAPIEnterVehicleSection(…), MesoAPIExitVehicleSection(…) e MesoAPIPostManageControl(…), MesoAPIPreManageRouteChoice(…).
Um exemplo muito simples do Módulo Aimsun Next API com os seguintes conteúdos é fornecido no arquivo sample.py:
from AMesoAPI import *
def MesoAPILoad():
print("AMesoAPILoad" )
return 0
def MesoAPIInit(simhandler, iterationNumber, statisticsActivated):
AMesoPrintString( simhandler, "AMesoAPIInit" )
return 0
def MesoAPISimulationReady(simhandler):
AMesoPrintString( simhandler, "AMesoSimulationReady" )
return 0
def MesoAPIUnLoad(simhandler):
AMesoPrintString(simhandler, "AMesoUnAPILoad" )
return 0
def MesoAPIFinish(simhandler):
AMesoPrintString(simhandler, "AMesoFinish" )
return 0
def MesoAPINewVehicleSystem(simhandler, vehhandler):
vehInf = AMesoGetVehicleInfo(simhandler, vehhandler)
AMesoPrintString(simhandler, "ID do sistema do veículo %d"%vehInf.id)
return 0
def MesoAPINewVehicleNetwork(simhandler, vehhandler):
vehInf = AMesoGetVehicleInfo(simhandler, vehhandler)
AMesoPrintString(simhandler, "ID da rede do veículo %d"%vehInf.id)
return 0
def MesoAPIFinishVehicleNetwork(simhandler, vehhandler, normalOut):
vehInf = AMesoGetVehicleInfo(simhandler, vehhandler)
AMesoPrintString(simhandler, "Veículo finalizado id %d"%vehInf.id)
return 0
def MesoAPIEnterVehicleSection(simhandler, vehhandler, fromSection, toSection):
vehInf = AMesoGetVehicleInfo(simhandler, vehhandler)
AMesoPrintString(simhandler, "Veículo entrou id %d %f %d %d"%(vehInf.id, AMesoGetCurrentTime(simhandler), fromSection, toSection))
return 0
def MesoAPIExitVehicleSection(simhandler, vehhandler, section):
vehInf = AMesoGetVehicleInfo(simhandler, vehhandler)
AMesoPrintString(simhandler, "Veículo saiu id %d %f %d"%(vehInf.id, AMesoGetCurrentTime(simhandler), section))
return 0
def MesoAPIVehicleReadyForSection(simhandler, vehhandler, section):
vehInf = AMesoGetVehicleInfo(simhandler, vehhandler)
AMesoPrintString(simhandler, "Veículo pronto para a seção id %d %f %d"%(vehInf.id, AMesoGetCurrentTime(simhandler), section))
return 0
def MesoAPIPostManageControl(simhandler):
return 0
def MesoAPIPreManageRouteChoice(simhandler):
return 0
def MesoAPIVehicleAtDestination(simhandler, vehhandler, nodeid):
return 0
def MesoAPIVehicleAtPTStop(simhandler, vehhandler, section, transitstop):
return 0
Existem algumas funções que precisam passar parâmetros por referência. Em Python, não é possível passar parâmetros por referência, mas existem algumas funções extras que habilitam isso.
No código a seguir, existe um exemplo de como funções com parâmetros de referência podem ser usadas em um script Python. A função calcula a duração do ciclo de um cruzamento.
def getCycleTime(junctionId , numPhases, t):
cycle = 0
pdur = doublep()
pcmax = doublep()
pcmin = doublep()
for i in range(1, numPhases):
ECIGetDurationsPhase(junctionId, i, t, pdur, pcmax, pcmin)
cycle = cycle + pdur.value()
del pdur
del pcmax
del pcmin
return cycle
Como habilitar e carregar uma Extensão Aimsun Next API do Aimsun Next¶
Para habilitar uma Extensão Aimsun Next API definida pelo usuário, adicione-a na definição do Cenário. Clique no Cenário selecionando a aba API quando o seguinte diálogo aparecer:
Neste diálogo, use o botão Adicionar ou Remover para carregar ou descarregar um conjunto de Extensões Aimsun Next (Bibliotecas dinâmicas ou scripts Python).