Pular para o conteúdo

Interação do Usuário e Tratamento de Erros

Interação do usuário

Há três classes na interface Script usadas para mostrar ao usuário uma janela interativa durante a execução do script. Elas são usadas para obter uma entrada ou para escolher entre opções:

  • QInputDialog: Usado para obter entrada.
  • GAnyObjectChooser: Usado para escolher uma opção em uma lista.
  • GKTask: Usado para mostrar o progresso em uma tarefa longa.

QInputDialog

A classe QInputDialog tem métodos que exibem uma caixa de diálogo para obter entrada do usuário. Cada método é apropriado para um tipo de dado que o usuário deve fornecer e produz um tipo diferente de caixa de diálogo de entrada:

  • getDouble: produz uma caixa de incremento para editar um número de ponto flutuante.
  • getInt: produz uma caixa de rotação para editar um número inteiro.
  • getItem: produz uma lista suspensa.
  • getText: produz uma caixa de entrada de texto.

Todos os métodos retornam uma tupla cujo primeiro elemento é a entrada do usuário e o segundo é True se o usuário pressionou OK e False se o usuário pressionou Cancel ou fechou a janela. É uma boa prática verificar se o usuário pressionou OK, em vez de ter cancelado a seleção, antes de usar o valor obtido.

Um exemplo que produz a caixa de diálogo de entrada abaixo é mostrado aqui.

dialog = QInputDialog.getText( None, "Geocode", "Project location:" )
if dialog[1] == True:
    location = str(dialog[0])


Diálogo produzido por QInputDialog::getText

GAnyObjectChooser

GAnyObjectChooser apresenta uma lista de todos os objetos de um determinado tipo presentes no modelo para que o usuário possa escolher um ou mais objetos.

Crie um novo objeto GAnyObjectChooser chamando o construtor; em seguida, defina os tipos de objetos a serem exibidos e se o usuário poderá escolher apenas um ou mais usando o setType método.

Em seguida, mostre a caixa de diálogo chamando execDialog. Este método retorna 1 se o usuário pressionou OK e 0 se o usuário pressionou Cancel ou fechou a janela. É uma boa prática verificar se o usuário pressionou OK e interromper a execução do código caso contrário.

Por fim, obtenha a entrada do usuário chamando getObject ou getObjects. Observe que uma das opções apresentadas ao usuário é None e essa opção deve ser incluída nas ações executadas.

Um exemplo que produz a caixa de diálogo de entrada abaixo é mostrado aqui:

dialog = GAnyObjectChooserEditor()
type = model.getType( "GKODMatrix" )
dialog.getChooser().setType( model, type, GAnyObjectChooser.ChooserMode.eOneObject )
if dialog.execDialog():
    matrix = dialog.getObject()
    if matrix != None:
        # A matrix was chosen ( i.e. not the none option)
        # We can now do whatever was intended with the *matrix* object


Caixa de diálogo produzida por GAnyObjectChooser

GKTask

Se um script executar uma sequência de operações que leva algum tempo, crie uma tarefa (GKTask) para mostrar uma caixa de diálogo de progresso que forneça ao usuário feedback sobre o tempo necessário para concluir a operação e permita que o processo seja cancelado.

Um exemplo que produz a caixa de diálogo abaixo é mostrado aqui.

task=GKSystem.getSystem().createTask(model)
task.setName("MyTask")
totSteps = 10000000
task.setTotalSteps(totSteps)

task.start()
step=0
cancelled=False

while step < totSteps and not cancelled:
    # Do something that takes some time
    step+=1
    cancelled=task.stepTask( step )

task.end()


Diálogo produzido por GKTask

Erros e registro

Para relatar erros críticos, o GKModel::reportError método pode ser usado. Quando houver uma GUI presente, uma caixa de mensagem será exibida. Se não houver GUI presente (ao usar o modo Aimsun Next Console), a mensagem será escrita na janela do prompt de comando.

model.reportError("Aaaargh!", "Something bad has happened")


Relatar um Erro

Uma funcionalidade mais geral de registro em log está disponível por meio de GKLog. Tanto o modelo quanto o sistema mantêm seus próprios logs. O registro em log está disponível em quatro níveis, sendo eles Text, Info, Warning e Error

#log info in the model log
model.getLog().addInfo("Task Done")

#log an error in the model log
model.getLog().addError("Something is wrong")

#place a warning system log
GKSystem.getSystem().getLog().addWarning("Error logged in the model")

O log do sistema está sempre disponível (assim como o log ANGConsole); o log do modelo só está disponível quando um modelo foi carregado

Solução de problemas

Se o erro a seguir, ou um semelhante, for exibido ao iniciar um script:

Python Error (): No module named xlrd

Adicione o seguinte código antes da linha de import.

SITEPACKAGES = "C:\\Python37\\lib\\site-packages"

if SITEPACKAGES not in sys.path:
sys.path.append(SITEPACKAGES)

from xlrd import *
from win32com.client import Dispatch