Python: von der Funktion zum Attribut

Technische Anmerkung #17

August 2016
Von Grant MacKinnon

Die meisten Benutzer sind mit der Erstellung eigener Attribute innerhalb von Objekten innerhalb eines Aimsun-Modells vertraut. Dabei handelt es sich in der Regel um Zahlen oder Zeichenketten, aber es ist auch möglich, eine Spalte zu einem Objekt hinzuzufügen, in der ein Wert auf der Basis von Python-Code zurückgegeben wird, so dass ein Wert on the fly berechnet werden kann.

Ein einfaches Beispiel ist ein Etikett, das einen Buchstaben auf einer Kurve anbringt, der angibt, ob es sich um Links-, Durchgangs-, Rechts- oder U-Turn handelt.



Aimsun Python function attribute Showing the attribute in the network

Zum Vergrößern anklicken: Anzeige des Attributs im Netz


Zuerst könnten wir diese Spalte mit dem Typen-Editor erstellen (indem wir den entsprechenden Objekttyp im Fenster Typen auswählen) und dann eine neue Spalte mit der Funktion Spaltentyp hinzufügen, in diesem Fall eine, die als Ergebnis eine Zeichenfolge zurückgibt.



Aimsu Python function attribute Showing the attribute in the network

Zum Vergrößern anklicken: Erstellen Sie die Spalte mit dem Typen-Editor


Die Funktion muss eine Python-Funktion mit Signatur des Formulars enthalten:

def eval_attr(object):

die mit dem Ergebnis einen Wert zurückgibt.

Hier ist der Code, den wir innerhalb der Spalte speichern

def determineTurningLetterForAngle(angle):
	dirString = ""
	if abs(angle)<30.0: dirString+="T" elif abs(angle)>150.0:< dirString+="U" elif angle>0.0:
		dirString+="L"
	else:
		dirString+="R"
	return dirString

def retrieveTurningLetterForTurning(turning):
	angle = turning.calcAngleSections()
	directionString = determineTurningLetterForAngle(angle)
	return directionString
	
def eval_attr(object):
	res = retrieveTurningLetterForTurning(object)
	return res


Wir können all dies jedoch aus einem Skript erstellen, das die Spalte erstellt und den Code auffüllt.
Der Code zum Einrichten der Spalte direkt aus einem Python-Skript heraus lautet wie folgt:


def main():
	turnLetterAttr = model.getColumn("GKTurning::TurnLetter")
	if turnLetterAttr == None:
		turningType = model.getType("GKTurning")
		turnLetterAttr = 
turningType.addColumn("GKTurning::TurnLetter","TurnLetter", 
GKColumn.String, GKColumn.ePython)
	turnLetterAttr.setPythonCode(PYTHON_CODE_STRING)

main()

PYTHON_CODE_STRING enthält die Definition der Funktion.

Python-Skript zur Erstellung eines Drehklassifizierungsetiketts herunterladen

  • Hast du eine Frage? Nimm Kontakt auf.
  • Hast du eine Frage? Nimm Kontakt auf.

TEILEN

Share on linkedin
Share on twitter
Share on email