Arquitetura do Aimsun Next¶
Aimsun Next é dividido em duas partes principais: o Kernel e a UI. O Kernel contém todas as classes que fazem parte do domínio da aplicação. A UI contém todas as classes necessárias para implementar a interface do usuário (como diálogos, painéis, controles…). No paradigma Model-View-Controller, o Kernel abriga o Modelo e a UI abriga a Visão e o Controlador.
O domínio da aplicação do Aimsun Next é o transporte. O sistema foi projetado para suportar aplicações relacionadas ao transporte (como simuladores de tráfego, problemas de localização ou modelos de atribuição). Esta especialização do modelo oferece ao desenvolvedor facilidades que não são encontradas em outros sistemas mais gerais, como ruas/vias, matrizes OD, planos de controle e informações de topologia. Isso também oferece suporte para aplicações GIS gerais (como a capacidade de importar shapefiles, adicionar informações semânticas a esses arquivos gráficos usando consultas de banco de dados ou representar qualquer atributo de qualquer objeto no modelo de várias maneiras). De qualquer forma, o objetivo do Aimsun Next não é substituir um GIS, mas oferecer todas as funcionalidades GIS que um engenheiro de tráfego precisará, mas em um ambiente mais focado.
O Kernel¶
O Kernel é dividido em três componentes principais:
- Classes genéricas não gráficas
- Classes gráficas genéricas
- Classes de Transporte (tanto gráficas quanto não-gráficas).
As classes genéricas definem as bases fundamentais do Aimsun Next. As classes de transporte são construídas usando essas classes básicas.
Em particular, as classes genéricas oferecem:
- Um ambiente extensível no qual novos plug-ins podem ser adicionados para fornecer mais funcionalidades (seja adicionando novas classes, novos editores, novos atributos, etc. ou alterando as classes disponíveis).
- Desfazer e refazer ilimitados.
- Armazenar e restaurar o modelo em um arquivo.
- Representação gráfica em 2D e 3D.
- Suporte à internacionalização.
- Suporte multiplataforma.
Classes Genéricas Não Gráficas ¶
A figura abaixo mostra as principais classes não gráficas do Kernel.
As classes base são:
- GKSystem: Uma classe singleton (apenas uma instância desta classe existe) que contém dados que são comuns a qualquer documento em uma sessão, sendo estes principalmente os tipos, os plug-ins e os filtros; isso significa que quaisquer dois documentos carregados no Aimsun Next podem conter dados diferentes, mas compartilharão os mesmos tipos.
- GKModel: Uma classe que contém dados dos documentos.
- GKObject: Uma classe herdada por qualquer objeto no sistema (seja gráfico ou não).
Para acessar a única instância de GKSystem, o seguinte código é utilizado:
system = GKSystem.getSystem();
Todo o modelo de dados é organizado em torno da classe GKModel. Esta classe contém todos os dados em um modelo - neste contexto, um modelo é um documento. Por exemplo, um mapa CAD de uma cidade será o documento, ou modelo, em uma aplicação CAD.
Cada vez que um novo documento é criado ou aberto, uma instância de GKModel é criada. Cada vez que o documento é salvo em disco, todos os dados no GKModel são salvos.
O modelo ativo pode ser acessado usando a variável model, que é inicializada automaticamente para referenciar o modelo ativo:
model = GKSystem.getSystem().getActiveModel()
Um modelo é uma coleção de instâncias de GKObject (na verdade, de subclasses de GKObject). Uma linha, uma via, uma matriz OD, etc., são todas instâncias de uma subclasse de GKObject. Uma instância de um GKObject tem um tipo e um identificador de modelo único que é atribuído quando o objeto é criado pela primeira vez e imutável durante a vida do objeto.
O modelo contém todos os dados em um catálogo (uma instância de GKCatalog). Este catálogo mantém os dados organizados por tipo (classe) e identificador (único). Objetos dentro do catálogo podem ser acessados iterando sobre objetos de um dado tipo, como mostrado usando um código como:
for s in type.values():
print "ID: %i Nome: %s" % (s.getId(), s.getName())
Isso é expandido ainda mais no Exemplo Básico de Scripting.
Cada instância de um objeto tem um GKType que contém informações sobre o tipo. Uma instância de GKType é compartilhada entre todos os objetos do mesmo tipo. Esta classe contém informações sobre o nome da classe (um nome interno usado para identificar exclusivamente a classe e um nome externo a ser apresentado ao usuário) e todos os atributos visíveis.
Plug-ins¶
Plug-ins são DLLs (no Windows) ou bibliotecas compartilhadas (no UNIX/LINUX e MacOS X) que são carregadas quando o Aimsun Next inicia e que implementam novas funcionalidades. O microsimulador e o mesosimulador são dois exemplos de plug-ins. Um plug-in é sempre uma subclasse de GKPlugin.
Filtros¶
Filtros são classes usadas para importar e exportar dados de ou para um modelo Aimsun. Eles são instâncias de GKFilter. Exemplos de filtros incluem aqueles para importação e exportação DXF, importação de Shapefiles ESRI ou exportação HTML.
Organização de Objetos Não Gráficos¶
Objetos não gráficos são organizados em pastas (instâncias de GKFolder), agrupados por tipo ou funcionalidade. Esta organização aparece na Janela do Projeto. Cada pasta tem um nome interno usado para identificá-la exclusivamente e um nome externo a ser apresentado ao usuário. Use o nome interno para localizar uma pasta, por exemplo, ao adicionar um novo objeto.
Classes Gráficas Genéricas¶
A próxima figura mostra as principais classes gráficas do Kernel. GKGeoObject é a classe da qual herda qualquer classe gráfica, enquanto GKGeoModel é um holder para todos os objetos gráficos.
As classes gráficas básicas são:
- GKDPoint para pontos únicos.
- GKPolyline para uma coleção de segmentos conectados.
- GKPolygon para polylines fechadas.
- GKBezierCurve para curvas de Bezier.
Como esses objetos são desenhados é responsabilidade dos desenhistas definidos no código da UI. No entanto, os dados para uma representação genérica são armazenados usando as classes GKViewMode e GKViewModeStyle. Essas classes contêm modificações sobre como os pontos, linhas, curvas e polígonos serão desenhados com base nos valores de alguns de seus atributos. Elas contêm, por exemplo, instruções para os desenhistas desenharem uma linha em vermelho quando o comprimento é menor que 20 metros.
Organização de Objetos Gráficos¶
Objetos gráficos são organizados em camadas (instâncias de GKLayer). Uma camada pode conter um ou mais objetos de qualquer tipo. Uma camada pode conter objetos de tipos diferentes, mas geralmente serão usados para agrupar objetos do mesmo tipo. Camadas também são usadas nas visões em 2D para priorizar a ordem de desenho (o que é desenhado sobre o que).
As camadas são armazenadas no modelo geo. Um objeto gráfico estará no modelo geo, mas outra referência a ele é colocada no catálogo do modelo. Se o usuário decidir ocultar um objeto gráfico, uma possível solução será removê-lo do modelo geo ou, mais precisamente, da camada que o contém. Para excluir um objeto gráfico, ele deve ser removido tanto da camada quanto do catálogo.
Classes de Transporte¶
As classes de transporte são construídas sobre as classes genéricas. A figura abaixo mostra as principais classes gráficas de transporte: seções (chamadas de links em outras aplicações), nós, curvas, centróides e rotas.
Tanto seções quanto curvas são curvas de Bezier. Um nó tem uma posição, mas também tem uma geometria complexa (um conjunto de polígonos) que é definida pela geometria de suas curvas.
Uma rota é uma coleção ordenada de seções, enquanto uma linha pública adiciona informações para paradas.
O Aimsun Next também inclui classes de transporte não gráficas:
- Matrizes OD, estados de tráfego (demanda com base em fluxos de entrada e proporções de curvas).
- planos de controle.
- ações de gerenciamento de tráfego, etc.
Módulos Python¶
Um subconjunto de classes está disponível para scripts através de um conjunto de módulos Python. Esses módulos fornecem vinculações Python para os objetos e métodos originais em C++.
No início de cada script, todos os módulos que fornecem o acesso às classes que serão usadas devem ser importados. Por exemplo, para usar os recursos da modelagem macroscópica em um script, use o seguinte código
from PyMacroToolPlugin import *
PyANGBasic, PyANGKernel e PyANGGui são importados automaticamente durante a inicialização do ambiente de script, então não precisam ser listados novamente em scripts que serão executados a partir do Aimsun Next. Eles fornecem todas as funções fundamentais da Plataforma Aimsun Next. Isso significa que para edição de modelo, nenhuma importação adicional é necessária.
Classes incluídas em diferentes módulos Python ¶
Módulo | Classes | Funcionalidade |
---|---|---|
PyANGBasic | Classes Q*, PyQt, QtCore | Plataforma Aimsun Next |
PyANGKernel | Classes GK* (exceto GKAimsunExtension e GKGuiSystem) | "" |
PyANGGui | GAnyObjectChooser, Editor GAnyObjectChooser, GDrawer, GDrawerHit, GEditor, GGui, GKGUISystem, GView, G2DDrawer, G2DView, GViewWindow, G2DViewWindow, G2DViewLayer | "" |
PyANGDTA | DTAManager, DTASimulator, DTACentroid, DTAPossiblePath, DTASection, DTATurning, DTAUserClass, DTAVehicleType, DTAIterativeSimulationResultData | Simuladores Dinâmicos |
PyMacroKernelPlugin | MacroExperiment, MacroScenario, CMacroStatsManager, MacroIterationInfo, MacroExperimentParams, CMacroSection, CMacroTurning, MacroModelPlugin, CMacroConnection, CMacroUserClass, MacroScenarioOutputData, CMacroTrajectory | Kernel Macroscópico |
PyMacroToolPlugin | MacroTraversalPars, MacroTraversal, MacroToolsPlugin, DetectorLocation | Ferramentas Macroscópicas |
PyFrankWolfe | CFrankWolfeParams | Frank&Wolfe |
PyMacroAdjustmentPlugin | MacroAdjustment, MacroAdjustmentExperiment, MacroAdjustmentPlugin, MacroAdjustmentScenario, MacroAdjustmentScenarioParams,MacroAdjustmentScenarioUserClassParams, PerCentroidData, PerVehData,ODMaxDeviation | Ajuste Macroscópico |
PyMacroPTPlugin | MacroPTStop, MacroPublicLine, MacroPTSection, MacroPTStation | Atribuição de Transporte Público |
PyPTAdjustmentPlugin | MacroPTAdjustmentExperiment, MacroPTAdjustmentResult, AdjustmentMeasurementContextPT, PTResultObservation | Ajuste de Transporte Público |
PyLandUsePlugin | GKGenerationAttractionFactor, GKGenerationAttractionData, GKGenerationAttractionScenario, GKGenerationAttractionCentroidType, GKTimePeriod, GKTransportationMode, GKTimePeriodNewCmd, GKGenerationAttractionDataSet, CentroidGenerationAttractionData, ExternalData, CentroidDistributionData, GKDistributionDataSet, GenerationAttractionOutput, GKGenerationAttractionExperiment, GKDistributionCentroidType, GKParkingCentroidType, GKGenerationAttractionDataSetAttributeNewCmd | Modelagem da Demanda de Viagem |
PyANGConsole | ANGConsole | Console Aimsun Next |
PyANGApp | ANGApp | Carregar Aimsun Next do Python |