Parameter abfragen und einstellen

Dann wollen wir mal unser erstes Skript schreiben, mit dem wir Parameter abfragen können und dann im zweiten Schritt auch einstellen.

Dazu erstellen wir uns eine ganz simple Konstruktion, die nur aus einem einfachen Grundriss besteht.

Wenn wir auf diesen Grundriss klicken, können wir die Eigenschaften des Grundrisses sehen und verändern.

Per Doppelklick am Ende der letzen Spalte (Überschrift), kann man eine weitere Spalte einblenden. Diese zeigt uns die dazugehörigen Kennziffern.

Diese Parameter stehen uns in der API zur Verfügung. Wenn wir also den Parameter „998.200.0101“ abfragen, bekommen wir die breite des Grundrisses. Und wenn wir diesen Parameter einstellen, können wir damit die Breite festlegen.

Um eine Auflistung aller möglichen Parameter zu erhalten, schau mal in die Datei KKP-W\Systeme\KKP-Zubehoer\Ini\System.xml. Eventuell befinden sich weitere Parameter in der System.xml des Systemgebers in dem du dich gerade befindest.

Zuerst erstellen wir uns ein Basis-Skript. Wir nehmen wieder das PreSetupUsr.py Skript, denn das können wir bequem aktivieren, in dem wir das Zahnrad im 3D Bereich klicken.

# -*- coding: utf-8 -*-

import kkp

 

Nun nehmen wir uns das Modul kkp (also die Datei kkp-w\prg32\python32\kkp.py) zur Hilfe.

Dort finden wir die Funktion Get_Parameter

Mit dieser Funktion können wir einen beliebigen Parameter abfragen.

Als Eingabeparameter benötigt die Funktion eine Objektnummer für die Gruppe in der gesucht werden soll und die Kennziffer des Parameters nach dem wir suchen wollen.

Da wir keine Objektnummer zur Zeit kennen, suchen wir einfach mal ganz global in der gesamten Konstruktion. Denn die Objektnummer der kompletten Konstruktion ist immer 100.

Um die Funktion aus dem Modul aufzurufen müssen wir den Modulnamen gefolgt von einem Punkt und dann den Funktionsnamen angeben.

# -*- coding: utf-8 -*-

import kkp

kkp.Get_Parameter(100 , „998.200.0101“)

Das Skript könnten wir jetzt schon ausführen, aber wir haben ja noch keine Ausgabe programmiert, also könnten wir das Ergebnis nicht sehen. Wir müssen also das Ergebnis in einer Variablen speichern und dann mit einem print Befehl ausgeben.

# -*- coding: utf-8 -*-

import kkp

parameterWert = kkp.Get_Parameter(100 , „998.200.0101“)

print(parameterWert)

 

Und das können wir nun mal ausführen.

Den Python-Neuling verwundert diese Ausgabe nun vielleicht etwas. Der Wert 5000 stehen hier in Klammern und wenn man genau hinschaut, ist da auch noch ein Komma zu sehen.

In Python sind Werte, die in Klammen rund oder eckig angeben werden, Listen. Bei runden Klammern spricht man allerdings formal von einem Tupel. Für uns reicht erst einmal die Vorstellung einer Liste. Jeder Wert in einer Liste hat einen Index. Dieser beginnt bei 0.

Also in unserem Beispiel steckt der Wert 5000 im Index 0 des gezeigten Tupels (der Liste).

Wir sollten also unsere Variable etwas passender benennen und dann den echten Parameterwert aus dem Tupel herausholen.

import kkp

#paremterWert in parameterTupel umbenannt.

parameterTupel = kkp.Get_Parameter(100 , „998.200.0101“)

print(parameterTupel)

 

# -*- coding: utf-8 -*-

import kkp

#paremterWert in parameterTupel umbenannt.

parameterTupel = kkp.Get_Parameter(100 , „998.200.0101“)

print(parameterTupel)

#Der Wert des Parameter befindet sich im Index 0

parameterWert = parameterTupel[0]

print(parameterWert)

 

Wenn wir nun das Skript das Skript ausgeben, bekommen wir eine Ausgabe in der wir zuerst das Tupel ausgeben und dann den eigentlichen Wert.

Diese Schreibweise wird von uns gelegentlich auch abgekürzt.

# -*- coding: utf-8 -*-

import kkp

parameterWert = kkp.Get_Parameter(100 , „998.200.0101“)[0]

print(parameterWert)

Ich schreibe die Funktion kkp.Get_Parameter(…) und nehme von dem Ergebnis direkt den 1 Wert (Index 0).

Diese verkürzte Schreibweise hat aber auch einen wichtigen Nachteil, den wir uns nun anschauen. Und dabei werden wir auch sehen, warum wir ein Tupel zurückgeben, anstatt einfach den echten Wert.

Fragen wir mal einen anderen Parameter ab, den es in der Zeichnung gar nicht gibt.

# -*- coding: utf-8 -*-

import kkp

parameterWert = kkp.Get_Parameter(100 , „998.200.0000“)[0]

print(parameterWert)

Wenn wir das Skript nun ausgeben, bekommen wir eine unschöne Fehlermeldung.

Schauen wir uns das Ergebnis der Abfrage mal genauer an.

# -*- coding: utf-8 -*-

import kkp

parameterTupel = kkp.Get_Parameter(100 , „998.200.0000“)

print(parameterTupel)

Wir haben ein leeres Tupel erhalten.

Also wenn wir einen Parameter abfragen, der in der Zeichnung nicht vorhanden ist, bekommen wir ein leeres Tupel zurück, ansonsten hat das Tupel einen Wert.

Also können wir nach der Länge des Tupels fragen, um zu prüfen, ob ein Parameter überhaupt vorhanden ist. Um die Länge einer beliebigen Liste abzufragen, verwendet Python die Funktion len(l). Als Parameter (l) muss die Liste übergeben werden.

# -*- coding: utf-8 -*-

import kkp

parameterTupel = kkp.Get_Parameter(100 , „998.200.0000“)

laengedesTupel = len(parameterTupel)

print(laengedesTupel)

Tragen wir wieder den gültigen Parameter „998.200.0101“ ein.

# -*- coding: utf-8 -*-

import kkp

parameterTupel = kkp.Get_Parameter(100 , „998.200.0101“)

laengedesTupel = len(parameterTupel)

print(laengedesTupel)

Okay. Nun können wir Parameter abfragen, dann wollen wir mal einen einstellen. Dazu schauen wir wieder in die Datei kkp.py und finden dort die Funktion Set_Parameter(…)

Diese Funktion erwartet wieder eine Objektnummer, die Kennziffer des Parameters und den Wert, den der Parameter annehmen soll. Als Objektnummer nehmen wir wieder die 100 (gesamte Zeichnung). Der Wert muss, und das ist absolut notwendig als Fließkommazahl übergeben werden, ansonsten wird eine Fehlermeldung ausgeben.

# -*- coding: utf-8 -*-

import kkp

kkp.Set_Parameter(100 , „998.200.0101“ , 2000.0)

dWert = kkp.Get_Parameter(100 , „998.200.0101“)[0]

print(dWert)

 

Führen wir das Skript aus, sehen wir die Ausgabe 2000.0. Die Zeichnung scheint aber noch unverändert. Das liegt daran, dass KKP zwar den neuen Wert schon verwendet, die 3D Darstellung aber noch nicht aktualisiert hat.

Wenn wir das Fenster schließen, wir das aber nachgeholt.

Und schon ist unser Grundriss nur noch 2000.0 mm breit.

If Bedingungen

Hier wird sich der Python erfahrene Programmierer langweilen, aber ich möchte dem Anfänger auch die Möglichkeit geben eine Bedingung zu programmieren.

Also lass uns doch mal das Skript zum Spaß ein bisschen anpassen.

Wir sagen einfach mal, dass eine Konstruktion, die kleiner ist als 1000mm nicht erlaubt ist. Das heißt für uns, wir sollten fragen, ob die Breite kleiner ist als 1000mm. Wenn ja, dann geben wir eine Message-Box aus (wie man das macht, werden die „Profis“ einfach überlesen und deshalb nicht mitbekommen) und korrigieren den Grundriss auf das benötigte Mindestmaß von 1000mm.

Also brauchen wir eine If-Bedingung. In Python wird diese immer nach folgendem Muster aufgeschrieben:

if bedingung:

dann

else:

der Else Teil ist optional

Das, was ich hier Bedingung genannt habe, muss etwas sein, dass man immer mit „Wahr“ oder „Falsch“ beantworten kann (bzw. Ja oder Nein). Also beispielsweise ist die Breite kleiner als 1 Meter? Was aber nicht geht ist die Frage: „Wie viel ist 2 + 3?“. Man könnte höchstens Fragen „ist 2+3 das Gleiche wie 5?“ Die Frage muss also immer mit Ja oder Nein beantwortet werden können (In der Programmierung reden wir von Wahr oder Falsch). In Python wird das über die Worte True und False gemacht. Am Ende der Bedingung muss immer ein Doppelpunkt folgen.

Dann kommt ein (eingerückter!) Block mit Befehlen, was alles zu tun ist wenn das Ergebnis der Beding Ja = Wahr = True ist.

Optional kann man auch ein „else“ hinzufügen. Alles in dem Else-Block wir dann ausgeführt, wenn das Ergebnis der Bedingung Nein = Falsch = False ist.

Okay. Soviel erst einmal zum allgemeinen Aufbau einer If-Bedingung.

Nun wollen wir zuerst einmal den Wert der Breite des Grundrisses abfragen. Das habe ich weiter oben ja bereits gezeigt.

# -*- coding: utf-8 -*-

import kkp

paramWidth = kkp.Get_Parameter(100 , „998.200.0101“)

lenTuple = len(paramWidth)

 

Hier machen wir schon unsere erste If-Klausel und fragen nach, ob der Parameter überhaupt da ist, also ob die Länge des Tupels größer ist als 0.

# -*- coding: utf-8 -*-

import kkp

paramWidth = kkp.Get_Parameter(100 , „998.200.0101“)

lenTuple = len(paramWidth)

if lenTuple > 0:

print(„der Parameter existiert“)

 

Mal testen:

Dann können wir den eigentlichen Wert abfragen und fragen, ob der Wert kleiner als 1000.0 ist.

# -*- coding: utf-8 -*-

import kkp

paramWidth = kkp.Get_Parameter(100 , „998.200.0101“)

lenTuple = len(paramWidth)

if lenTuple > 0:

print(„der Parameter existiert“)

dWert = paramWidth[0]

if dWert < 1000.0:

print(„Der Wert ist kleiner als 1000“)

else:

print(„Der Wert ist GRÖßER als 1000“)

 

Wenn nun der Wert kleiner ist als 1000, dann stellen wir ganz einfach auf 1000.

# -*- coding: utf-8 -*-

import kkp

paramWidth = kkp.Get_Parameter(100 , „998.200.0101“)

lenTuple = len(paramWidth)

if lenTuple > 0:

print(„der Parameter existiert“)

dWert = paramWidth[0]

if dWert < 1000.0:

print(„Der Wert ist kleiner als 1000“)

kkp.Set_Parameter(100 , „998.200.0101“ , 1000.0)

else:

print(„Der Wert ist GRÖßER als 1000“)

 

Zum Test habe ich den Grundriss in der Zeichnung mal auf den Wert 500 gestellt.

Als Ausgabe bekomme ich zuerst diese Nachricht:

Und die Breite wird auf 1000mm gestellt.

Nun passen wir das Skript noch etwas und setzen anstelle des Print Befehls eine Message-Box ein.

Print Befehle werden immer erst gesammelt und dann alle zusammen ausgegeben, wenn des Skript vollständig durchgelaufen ist. Wenn das Skript aber (z.B. wegen eines Fehlers in der Programmierung) nicht durchläuft, gibt es auch keine Print-Ausgabe. Eine Message-Box hingegen, wird immer genau dann direkt ausgeführt, wenn sie aufgerufen wird. Eine Message-Box hält das Skript auch an der Zeile an, solange es geöffnet ist. Eine Print Anweisung läuft einfach weiter.

Eine MessageBox kann man in Python selbst programmieren oder man nimmt einfach die aus dem kkp Modul.

# -*- coding: utf-8 -*-

import kkp

paramWidth = kkp.Get_Parameter(100 , „998.200.0101“)

lenTuple = len(paramWidth)

if lenTuple > 0:

print(„Der Parameter existiert“)

dWert = paramWidth[0]

if dWert < 1000.0:

kkp.MsgBox(„Der Wert ist kleiner als 1000.0“ , 0)

kkp.Set_Parameter(100 , „998.200.0101“ , 1000.0)

Wir bekommen nun 2 Ausgaben. Da die Message-Box direkt ausgeben wird, die print Anweisung aber erst nach dem Beenden des Skriptes, kommt die Message-Box zuerst, obwohl die Print-Anweisung früher im Quellcode steht.

Der zweite Parameter  (… , 0) braucht uns derweil nicht weiter zu interessieren. Er gibt an, welcher Knopf / welche Knöpfe zur Bestätigung zur Verfügung stehen. 0 besagt, da soll ein einfacher „OK“-Knopf erscheinen.

Und so können wir beliebige Parameter abfragen und auch einstellen.

Anmerkung: Wir können einen Parameter auch „auf gut Glück“ einstellen. Wenn wir den Wert eines Parameters einstellen, der gar nicht existiert, ignoriert KKP den Befehl einfach und geht zum nächsten weiter.