Druckskripte

Druckskripte sind deutlich umfangreicher und komplexer als Setup-Skripte. Du solltest also am besten erst Erfahrungen mit dem Abfragen von Parametern und Profilen erhalten haben, bevor du dich an Druckskripte wagst.

Druckskripte werden im Texteditor in eine Formularvorlage eingebunden. Das ist allerdings schon fast eine Kunst für sich. Daher zeige ich das hier einmal Schritt für Schritt.

Zuerst sollten wir unbedingt das KKP schließen. Das wird nachher noch wichtig.

Dann müssen wir ein Druckskript vorbereiten.

Druckskripte sollten nur an bestimmten Orten abgelegt werden, damit das KKP diese auch als solche erkennt. Zusätzlich müssen Druckskripte einige Kopfinformationen enthalten, damit das KKP diese auch als Druckskript akzeptiert.

Druckskripte liegen immer im Ordner eines Systemgebers (bzw. KKP-Zubehoer) im Unterverzeichnis python32\rtf oder (nur in bestimmten Situationen) in einem weiteren Unterverzeichnis.

Ich habe eine Skript im Verzeichnis kkp-zubehoer\python32\rtf angelegt.

In dem Skript wird ein bestimmter Header erwartet. Dieser wird einem mehrzeiligen (Kommentar-) String erwartet.

Der Header besteht aus einer XML Struktur in der unter anderem definiert wird in welchem Bereich und unter welchem Namen das Skript aufgeführt werden soll.

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

„““—————————————————————————–

<KKP_Pythonheader Version= „1“ Python=“Intern32″ Datum=“31.07.2023″ Autor=“Achim“ TYP=“RTF“ Systemgeber=““ Profilsystem=““ >

 

<Info>

<DE>

Demonstration von Druckskripten

</DE>

</Info>

 

<Menu  Pos=“1″ Ein=“1″ >

<DE>Bereich;Name</DE>

</Menu>

 

</KKP_Pythonheader>

—————————————————————————–„““

Das Druckskript wird nicht unter dem Dateinamen aufgelistet, sondern eben durch die Angaben in dem Header definiert.

Ich benenne mein Beispiel als Sonstige;Mein Druckskripte

<DE>Sonstige;Mein Druckskript</DE>

Wenn ich aber jetzt das KKP starte in ein Skript in eine Dokumentvorlage einsetzen möchte, wird mir dieses Skript nicht aufgeführt. Das passiert, weil das KKP die verfügbaren Skripte in einer Cache-Datei ablegt. Diese muss gelöscht werden, damit die neu eingelesen wird. Erst danach steht uns das neu erstelle Skript auch zur Auswahl. Die Erstellung der Cache-Datei erfordert den Neustart des KKP, deshalb ich anfangs darum gebeten zuerst das KKP zu beenden.

Nun müssen wir im betreffenden Systemgeber (hier also KKP-Zubehör) die Datei python32.cache.xml löschen (kkp-w\systeme\{systemgeber}\python32.cache.xml)

Danach können wir das KKP starten und ein neues Projekt erstellen oder ein bestehendes Projekt öffnen.

Im Projekt wechseln wir in den Bereich Dokumente. Dort haben wir nun ein „weißes Blatt“ vor uns.

Über das Menü sage ich diesem Dokument, dass es eine Vorlage sein soll. Für unser Beispiel wähle ich den Typ Angebote und sonstige, man kann aber jeden beliebigen Typ wählen.

Jetzt da mein Dokument eine Vorlage ist, kann ich unser Skript über das Menü einfügen.

Per Doppelklick wird das Skript dann eingefügt.

Nun muss ich die Vorlage nur noch Speichern.

Über das Menü „neu aus Vorlage“ kann ich dann das Formular auswählen und erzeugen. Das Skript wird dabei ausgewertet.

Da wir aber noch keinen echten Inhalt haben, können wir auch nichts außer einer leeren Seite sehen.

Nun haben wir aber wenigstens die Vorbereitungen getroffen um ein Druckskript mit Leben füllen zu können.

Als ersten Test starte ich einmal mit einer Messagebox.

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

„““—————————————————————————–

<KKP_Pythonheader Version= „1“ Python=“Intern32″ Datum=“31.07.2023″ Autor=“Achim“ TYP=“RTF“ Systemgeber=““ Profilsystem=““ >

 

<Info>

<DE>

Demonstration von Druckskripten

</DE>

</Info>

 

<Menu  Pos=“1″ Ein=“1″ >

<DE>Sonstige;Mein Druckskript</DE>

</Menu>

 

</KKP_Pythonheader>

—————————————————————————–„““

 

import kkp

 

kkp.MsgBox(„Hallo Druckskript“ , 0)

Als Ausgabe bekomme ich dann meine Messagebox.

Aus Platzgründen, werde ich im folgenden nicht mehr das gesamte Skript einfügen, sondern nur noch die relevanten Abschnitte.

Nun wollen wir aber in der Regel keine Message-Boxen in einem Druckskript ausgeben, sondern das Formular mit Leben füllen. Dafür bietet die KKP-API das Modul „rtf“ an (Datei: kkp-w\prg32\python32\rtf.py)

Also importieren wir das Modul.

import kkp

import rtf

Das Modul rtf bietet eine Klasse namens RtfText an. Bei Klassen muss man sich immer erst ein Klassenobjekt erstellen, mit dem man dann auf die Funktionen der Klasse zugreifen kann.

Bei uns ist es meistens so, dass wir das Objekt zur Erzeugung von Rtf-Text einfach „R“ nennen.

import kkp

import rtf

 

R = rtf.RtfText()

Okay. Nun können wir über das Objekt R die Funktionen aus der Klasse RtfText verwenden.

Zum Beispiel können wir einfach einen Text schreiben.

import kkp

import rtf

 

R = rtf.RtfText()

 

R._T(„Hallo. Dies ist ein einfacher Text.“)

Achtung! Wenn wir das Skript so ausführen, bleibt der Inhalt leer.

Wir müssen unbedingt am Ende der Verwendung von R den Befehl „close“ verwenden. Damit Bestätigen wir quasi die Eingabe.

import kkp

import rtf

 

R = rtf.RtfText()

 

R._T(„Hallo. Dies ist ein einfacher Text.“)

R.Close()

Als Ergebnis bekommen wir dann:

Nicht schlecht oder?

Und nun können wir unser Wissen aus den Setup-Skripten verwenden, um die Ausgabe auf die Konstruktion anzupassen.  So kann ich beispielsweise die Größe des Grundrisses oder auch die Dachneigung abfragen und im Formular ausgeben.

Hier habe ich mal Funktionen geschrieben, um die Breite und Ausladung abzufragen. Zudem habe ich eine Funktion geschrieben, die das Schreiben der Texte in das Dokument in eine eigene Funktion kapselt.

import kkp

import rtf

 

def getParam(tag):

paramTpl = kkp.Get_Parameter(100 , tag)

if len(paramTpl) > 0:

dValue = paramTpl[0]

else:

dValue = 0

return dValue

 

def getTotalWidth():

dValue = getParam(„998.200.0101“)

return dValue

 

def getTotalDepth():

dValue = getParam(„998.200.0111“)

return dValue

 

def generateRtf():

R = rtf.RtfText()

R._T

(„Hallo. Dies ist ein einfacher Text.“)

R.Close()

 

generateRtf()

Dann wollen wir das mal Leben füllen.

def generateRtf():

R = rtf.RtfText()

sWidth = str(getTotalWidth()) #Breite als String

sDepth = str(getTotalDepth()) #Tiefe als String

R._T(„Breite: “ + sWidth + „mm\n“)

R._T(„Ausladung: “ + sDepth + „mm\n“)

R.Close()

 

generateRtf()

Die Ausgabe ist zwar wirklich nicht hübsch, aber immerhin:

Nun wäre es ja vielleicht deutlich übersichtlicher, wenn wir eine Tabelle erstellen könnten in der wir die Daten unterbringen. Und das werden wir uns auch als nächstes anschauen.