Pular para o conteúdo

Modelo de metadados extensível

O modelo de metadados fornece recursos normalmente indisponíveis em linguagens como C++. Em C++, uma vez que uma classe tenha sido definida, não é possível adicionar atributos; os atributos devem ser conhecidos em tempo de compilação e não é possível descobrir atributos em tempo de execução. Algumas linguagens fornecem essa funcionalidade, e muito mais, por exemplo Java por meio de sua interface Reflection.

No Aimsun Next, scripting; o metamodelo extensível permite que atributos sejam adicionados a um objeto e que sejam descobertos dinamicamente à medida que os scripts são executados. O modelo de dados fornece:

  • Extensibilidade: adicionar novos atributos a qualquer classe, para permitir a adição de novas informações a qualquer instância de objeto.
  • Descoberta: detecção da existência de novos atributos em tempo de execução.

Tipos e colunas

O modelo de Meta Data é baseado em Types e Columns. Type é sinônimo de classe, enquanto Column é sinônimo de atributo.

Criar um Type pode ser entendido como definir uma tabela, cujas colunas representam Type Columns e cujas linhas representam instâncias (objetos) de Type.

TypeA:
ID  Column1 Column2 Column3 Column4
1465    ####    ####    ####    ####
3566    ####    ####    ####    ####

Acessar o Type de um objeto informa se o objeto é uma seção, um centroide, um veículo etc.

Exemplo de Código

Para obter o tipo de um objeto, chame o método getType()

t = myObject.getType()
print t.getName()

Onde t é uma instância da classe GKType. Se myObject é uma seção viária, chamando getName() ligado t retornará a string "GKSection".

Para obter a lista de colunas em um tipo:

cols = t.getColumns( GKType.eSearchOnlyThisType )

e para obter todos os nomes e valores de atributos do objeto:

for col in cols:
    if col.getColumnType() != GKColumn._GKTimeSerie and myObject.getDataValue(col)[0] != None:
        print col.getName()+": "+myObject.getDataValue(col)[0].toString()

Se um método get específico estiver disponível para acessar o atributo de um objeto, é mais conveniente chamá-lo

speed = section.getSpeed()

em vez de usar o modelo de metadados:

attr = section.getType().getColumn( "GKSection::speedAtt", GKType.eSearchThisAndParentTypes )
speed = section.getDataValueDouble( attr )

Em resumo, o metamodelo deve ser acessado quando:

  • não existe um método específico para recuperar os dados, ou
  • os dados foram adicionados em tempo de execução, portanto não existe método get.

Deve-se observar que nem todos os atributos de um objeto são acessíveis por meio dos metadados.

Edição de metadados por script

Para ver quais colunas estão disponíveis em um Type, um método seria usar um script como segue:

sectionType = model.getType( "GKSection" )
attributes = sectionType.getColumns( GKType.eSearchOnlyThisType )
for x in attributes:
    print "Name :" + str(x.getName())
    print "External Name: " + str(x.getExternalName())
    print "Column Type: " + str(x.getColumnType())
    print "Description: " +str(x.getDescription())

Para adicionar uma coluna:

sectionType.addExternalColumn( "GKSection::roadNoiseFactor", "Road Noise Factor", GKColumn.Double )

Metaedição no Aimsun Next

Um método alternativo é usar a janela Aimsun Next Types e o Type Editor. Selecione a opção de menu Janela/Janelas/Tipos. O Tipos a janela então mostrará todos os tipos no sistema.


O Navegador de Tipos

Adição de um novo Atributo

Clique duas vezes em um tipo para acessar seu editor.


Editor de Tipo

Para adicionar um novo atributo ao tipo, selecione o Adicionar botão no editor.


Editando um novo atributo

Ao definir um novo nome único, use a convenção TypeName::Attribute. Isso garantirá que ele seja único em todo o modelo e não possa ser duplicado inadvertidamente em diferentes tipos.

O armazenamento de atributos pode ser definido pelo usuário como:

  • External: O Aimsun Next fornecerá armazenamento na memória e no arquivo ANG.
  • Temporal: o Aimsun Next fornecerá armazenamento na memória.
  • Função Python: uma função escrita em Python.

O tipo de dado pode ser:

  • Integer
  • Unsigned Integer
  • Boolean
  • Double
  • String
  • CString
  • Lista de Strings
  • Object
  • Séries Temporais
  • Tempo
  • Data
  • Data e hora
  • Cor
  • Duração de Tempo

Observe, no entanto, que os valores do tipo Time Series não serão salvos no arquivo ANG, mesmo se o armazenamento estiver definido como externo; portanto, quando o arquivo ANG for fechado e reaberto, o atributo ainda estará presente, mas estará vazio. Se os valores tiverem sido salvos em banco de dados, elas poderão então ser recuperadas a qualquer momento. Se a coluna for externa, ela precisará ser recuperada ou calculada novamente.

Para acessar o valor dos dados acima, o código seria o seguinte:

attr = model.getColumn( "GKSection::roadNoiseFactor" )
roadNoiseFactor = section.getDataValue( attr )

Todos os atributos definidos nativamente nas classes do Aimsun Next têm um tipo de armazenamento Interno e, como tal, não são editáveis. Observe também Externo atributos não podem ser excluídos nem editados; portanto, quando tal atributo é criado, não é possível fazer alterações usando a janela Type Editor, embora ele possa ser editado usando scripting.

Se o tipo de dados selecionado for Object, um novo menu suspenso aparecerá para escolher o tipo de objeto, e a configuração Permitir 'None' indica se o valor pode estar vazio ou não.


Editor de Tipo

O tipo de armazenamento Função permite definir um atributo cujo conteúdo é calculado dinamicamente toda vez que é acessado (lido via GUI ou script Python). O cálculo é definido pela função Python fornecida no diálogo código caixa de texto.

A função deve ser definida como:

def eval_attr( object ):
    # compute the value
    return res

Onde object é uma referência ao objeto para o qual o atributo é avaliado; res é o valor retornado pela função, que será o valor do atributo para o objeto. O tipo deve ser coerente com aquele selecionado como Data Type.

-; a implementação atual suporta apenas Integer, Unsigned Integer, Boolean, Double e String. TODO_DOC cuál es la lista actualizada

Por exemplo, para comparar os fluxos de dois cenários de microssimulação, cujos IDs de médias são 2880 e 2890, defina um novo atributo conforme mostrado abaixo.


Editando um novo atributo

-; TODO_DOC o exemplo da imagem não é bom, queremos que os usuários usem os conteúdos, não o nome interno

Observe que séries temporais não podem ser armazenadas em um atributo definido como função; o valor agregado da série temporal de fluxo das médias deve ser calculado.

O Por área a opção atualmente não é usada. O Dinâmico opção é usada para especificar que o valor do atributo pode mudar mesmo se não for modificado manualmente pelo usuário; somente atributos dinâmicos podem ser usados para definir um gatilho.

Exclusão de colunas

Há uma ferramenta para excluir quaisquer colunas externas indesejadas. É altamente recomendável excluir colunas que não estão mais em uso, pois, caso contrário, essas colunas consumirão desnecessariamente recursos de memória, espaço e tempo de carregamento. Este recurso está disponível no menu Análise de Dados > Excluir Colunas.


Caixa de Diálogo Remover Colunas

Para facilitar a localização de um grupo específico de colunas na lista, há um filtro disponível. O usuário pode filtrar os resultados por tipo de objeto, nome da coluna e tipo de armazenamento (se é uma coluna temporária ou não). O Selecionar Tudo botão seleciona todas as colunas na lista atual e o Excluir remove todas as colunas selecionadas. O Não Excluir Colunas em Uso opção impede a exclusão de colunas que estão em uso no momento, mesmo que estejam marcadas para serem excluídas.