Gleitkommazahlen paarweise speichern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
BlackJack

Freitag 10. Oktober 2008, 21:01

Also bei mir funktioniert das mit der Datei, die unter der angegeben URL zu finden ist.

Die Fehlermeldung besagt, dass die Länge der Daten nicht durch die Länge eines einzelnen Floats teilbar ist. Also konkret, dass die Dateilänge nicht durch 4 teilbar ist.

Sind Floats auf Deiner Plattform vier Bytes gross? Nachprüfbar mit:

Code: Alles auswählen

In [203]: import array

In [204]: array.array('f').itemsize
Out[204]: 4
Nachtrag: Argh, eine Binärdatei sollte man natürlich auch im Binärmodus öffnen. Unter Windows macht das ja einen Unterschied. Also noch eine kleine Korrektur:

Code: Alles auswählen

    with open(filename, 'rb') as coordinate_file:
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Freitag 10. Oktober 2008, 21:07

@musikus:
Ich verstehe nicht, warum du nicht mit der Datei KOOR4.DAT herausrückst, die in deiner Prozedur INTERPOLIEREN.PAS eingelesen wird und deren Output dann erst die anscheinend nicht unproblematische Binärdatei KOOR4.INT ist.
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

Freitag 10. Oktober 2008, 21:52

BlackJack hat geschrieben:@farid: Das mit den 6-Byte-`Real`\s überrascht mich. Kann es sein, dass die Quelle sich da irrt? Wenn man sich die Datei im Hexeditor anschaut, würde ich auf den ersten Blick behaupten ein 4-Byte-Muster zu sehen.
Ich müsste da erst in meinen alten Turbo Pascal 6 Handbüchern nachschauen, aber die sind im Keller und tief verkramt... :? Aber daß das was mit 6 Bytes/Real war, da glaube ich mich ziemlich genau zu erinnern.

Auf jeden Fall spricht die Dateigröße von KOOR4.INT (97800) nicht dagegen, da sie genau durch 12 (6*2) teilbar ist. Sie ist auch durch 8 (4*2) genau teilbar, was für 4 Bytes/Real spricht, aber nicht durch 16 (8*2), also nicht 8 Bytes/Real... (vorausgesetzt dort sind ausschließlich Paare von Real drin und nichts anderes).

Noch was: wenn ich mich richtig erinnere, hatte auch UCSD-Pascal Reals zwar als 4 Bytes, aber nicht IEEE 754-konform gespeichert.
musikus
User
Beiträge: 14
Registriert: Donnerstag 9. Oktober 2008, 13:39
Kontaktdaten:

Freitag 10. Oktober 2008, 21:56

numerix hat geschrieben:@musikus:
Ich verstehe nicht, warum du nicht mit der Datei KOOR4.DAT herausrückst, die in deiner Prozedur INTERPOLIEREN.PAS eingelesen wird und deren Output dann erst die anscheinend nicht unproblematische Binärdatei KOOR4.INT ist.

Hi numerix, ein Stück der Datei KOOR4.DAT habe ich schon ganz am Anfang beigefügt.

Nach der letzten Änderung die mir BlackJack geschrieben hat funktioniert das Einlesen der Daten aus dem Binärfile, leider aber noch
nicht ganz so wie ich es brauche.

Hier noch einmal ein Auszug aus der Datei KOOR4.DAT
Die Bedeutung "Richtung, Grad, Minuten, Richtung, Grad, Minuten.
Es ist ein ganz normaler Textfile.


B RENNEL-INSEL
S 11 27 O 159 48
S 11 22 O 160 00
S 11 33 O 160 47
S 11 38 O 160 35
S 11 33 O 160 00
S 11 27 O 159 48
B SANTA CRUZ 1.INSEL
S 10 38 O 165 35
S 10 38 O 165 53
S 10 44 O 165 59
S 10 41 O 165 47
S 10 47 O 165 35
S 10 38 O 165 35
B 2.INSEL
S 11 11 O 166 34
B 3.INSEL
S 11 33 O 166 52
S 11 38 O 167 4
S 11 49 O 166 58
S 11 33 O 166 52
B NEUKALEDONIEN(FRA)
S 20 O 164 1
S 20 21 O 165 24
S 21 18 O 166 34
S 22 4 O 167 21
S 22 20 O 167 9
S 20 52 O 164 54
S 20 O 164 1
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

Freitag 10. Oktober 2008, 22:00

musikus hat geschrieben:Nach der letzten Änderung die mir BlackJack geschrieben hat funktioniert das Einlesen der Daten aus dem Binärfile, leider aber noch
nicht ganz so wie ich es brauche.
Kannst Du bestätigen, daß diese Datei mit Turbo Pascal erstellt wurde (und nicht etwa mit einem anderen Pascal-Compiler/Interpreter)? Dann suche ich mal das genaue Bitmuster aus der Borland-Doku heraus.
musikus
User
Beiträge: 14
Registriert: Donnerstag 9. Oktober 2008, 13:39
Kontaktdaten:

Freitag 10. Oktober 2008, 22:11

BlackJack hat geschrieben:Also bei mir funktioniert das mit der Datei, die unter der angegeben URL zu finden ist.

Die Fehlermeldung besagt, dass die Länge der Daten nicht durch die Länge eines einzelnen Floats teilbar ist. Also konkret, dass die Dateilänge nicht durch 4 teilbar ist.

Sind Floats auf Deiner Plattform vier Bytes gross? Nachprüfbar mit:

Code: Alles auswählen

In [203]: import array

In [204]: array.array('f').itemsize
Out[204]: 4
Nachtrag: Argh, eine Binärdatei sollte man natürlich auch im Binärmodus öffnen. Unter Windows macht das ja einen Unterschied. Also noch eine kleine Korrektur:

Hi BlackJack, nach der letzten kleinen Änderung "with open(filename, 'rb') as coordinate_file:" funktioniert das Einlesen.

Es wird aber der ganze File eingelesen, da die Daten aber noch umgerechnet werden müssen (Grad in Bogen), sollte die Funktion aber jeweils nur
einen Satz Daten einlesen und beim nächsten Aufruf den Nächsten.

Die Sache ist für mich noch so undurchsichtig das ich im Moment nicht
in der Lage bin das selber zu modifizieren, ich verstehe es einfach nicht :-(

Auf jeden Fall schon mal an Alle vielen Dank für Eure Hilfe, das ist schon
ein großer Schritt in die richtige Richtung.

Gruß musikus




Code: Alles auswählen

    with open(filename, 'rb') as coordinate_file:
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Freitag 10. Oktober 2008, 22:19

Schau dir doch einfach die Dokus zu den einzelnen Funktionen an und probier nen bischen in der Shell rum.

Code: Alles auswählen

In [1]: l = range(20)

In [2]: itr = iter(l)

In [3]: itr.next()
Out[3]: 0

In [4]: itr.next()
Out[4]: 1

In [5]: l
Out[5]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

In [6]: for i in itr:
   ...:     print i
   ...:     
   ...:     
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

In [7]: itr.next()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)

/home/dax/<ipython console> in <module>()

StopIteration: 

In [8]: itr = iter(l)

In [9]: zip(itr, itr)
Out[9]: 
[(0, 1),
 (2, 3),
 (4, 5),
 (6, 7),
 (8, 9),
 (10, 11),
 (12, 13),
 (14, 15),
 (16, 17),
 (18, 19)]
Schau dir einfach die Hilfe zu iter() an.
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

Freitag 10. Oktober 2008, 22:24

farid hat geschrieben:Kannst Du bestätigen, daß diese Datei mit Turbo Pascal erstellt wurde (und nicht etwa mit einem anderen Pascal-Compiler/Interpreter)? Dann suche ich mal das genaue Bitmuster aus der Borland-Doku heraus.
Okay, ich antworte auf meine eigene Frage.

Laut Doku von TP 6.0, gibt es folgende interne Darstellungen:

* Real: belegt 6 Bytes (48 Bit), die so angeordnet sind:

MSB -> LSB

v (1 bit): Vorzeichenbit
f (39 bit): Mantisse
e (8 bit): Exponent

if 0 < e <= 255 then w = (-1)^v * 2^(e-129) * (1.f)
if e = 0 then w = 0

NaNs und denormalisierte Zahlen können nicht im Format Real gespeichert werden: denormalisierte Zahlen werden gleich 0 gesetzt, NaNs und Unendlichkeiten erzeugen einen Überlauf.

* Single: belegt 4 Bytes (32 bit), die so angeordnet sind:

MSB -> LSB

v (1 bit): Vorzeichenbit
e (8 bit): Exponent
f (23 bit): Mantisse

if 0 < e and e < 255 then w = (-1)^v * 2^(e-127) * (1.f)
if e = 0 and f <> 0 then w = (-1)^v * 2^(-126) * (0.f)
if e = 0 and f = 0 then w = (-1)^v * 0
if e = 255 and f = 0 then w = (-1)^v * Inf
if e = 255 and f <> 0 then w = NaN

* Double: belegt 8 Bytes (64 bit), die so angeordnet sind:

MSB -> LSB

v (1 bit): Vorzeichenbit
e (11 bit): Exponent
f (52 bit): Mantisse

if 0 < e and e < 2047 then w = (-1)^v * 2^(e-1023) * (1.f)
if e = 0 and f <> 0 then w = (-1)^v * 2^(-1022) * (0.f)
if e = 0 and f = 0 then w = (-1)^v * 0
if e = 2047 and f = 0 then w = (-1)^v * Inf
if e = 2047 and f <> 0 then w = NaN

* Extended: belegt 10 Bytes (80 bit), die so angeordnet sind:

MSB -> LSB

v (1 bit): Vorzeichenbit
e (15 bit): Exponent
i (1 bit): (siehe Formel unten)
f (63 bit): Mantisse

if 0 <= e and e < 32767 then w = (-1)^v * 2^(e-16383) * (i.f)
if e = 32767 and f = 0 then w= (-1)^v * Inf
if e = 32767 and f <> 0 then w = NaN

Das müßte man jetzt nur noch zu einem Python-Modul umschreiben (z.B. indem man sich an 'struct' oder 'array' anlehnt, und schon kann man dann die Turbo Pascal Binärdaten lesen.

Hoffentlich habe ich da keine Tippfehler drin. ;)
BlackJack

Freitag 10. Oktober 2008, 22:27

@musikus: Was funktioniert denn jetzt genau nicht? Also bei mir sehen die Daten (gekürzt) so aus:

Code: Alles auswählen

[(-9.6499996185302734, 79.266670227050781),
 (-9.5333328247070312, 78.949996948242188),
 (-9.4166669845581055, 78.633331298828125),
 (-9.2119045257568359, 78.352378845214844),
 (-9.0071430206298828, 78.071426391601562),
 (-8.8023815155029297, 77.790473937988281),
 (-8.5976190567016602, 77.509521484375),
 (-8.3928565979003906, 77.228569030761719),
 (-8.1880950927734375, 76.947616577148438),
 (-7.9833331108093262, 76.666664123535156),
 (-8.2460784912109375, 76.367645263671875),
 (-8.5088233947753906, 76.068626403808594),
 (-8.7715682983398438, 75.769607543945312),
# ...
 (-76.55853271484375, -64.778045654296875),
 (-76.602027893066406, -65.080490112304688),
 (-76.645523071289062, -65.382926940917969),
 (-76.689018249511719, -65.68536376953125),
 (-76.732521057128906, -65.987808227539062),
 (-76.776016235351562, -66.290245056152344),
 (-76.819511413574219, -66.592681884765625),
 (-76.863006591796875, -66.895118713378906),
 (-76.906501770019531, -67.197563171386719),
 (-76.949996948242188, -67.5),
 (200.0, 200.0)]
In wiefern weichen die die vom erwarteten Ergebnis ab?

Und was versuchst Du eigentlich genau zu machen? Hoffentlich keine 1:1-Umsetzung der Pascal-Programme? Denn dieses Zwischenformat ist ziemlich ekelig. Nicht nur, dass man mit solchen Binärdaten Probleme mit der Portabilität bekommen kann, sondern auch, dass ganz normale Koordinaten wie (100.0, 100.0) und (200.0, 200.0) besondere Bedeutungen haben, ist extrem unschön. Wenn irgend wann einmal so eine Koordinate ganz regulär in den Daten vorkommt, fällt man damit auf die Nase.

Wird diese Zwischendatei wirklich benötigt? Kann man die Interpolation nicht einfach als Schritt vor dem Zeichenen in das Programm einbauen? Die Zeiten, dass man bei so etwas Rechenzeit oder Speicher sparen musste, sind ja mittlerweile vorbei. Zumindest bei diesen kleinen Datenmengen, denn 12k interpolierte Koordinaten sind ja ein Witz.

Und die beiden Prozeduren die wir kennen, sehen nicht nach gutem Programmierstil nach heutigen Massstäben aus. Das sind ja wirklich Prozeduren, also Namen für Code-Abschnitte die auf globalen Daten operieren und keine in sich abgeschlossenen Funktionen.
BlackJack

Freitag 10. Oktober 2008, 22:36

@farid: Ich denke das mit dem Fliesskommaformat ist jetzt erledigt, es sind TurboPascal-`Single` also C-`float`\s und die sind kein Problem. Und problematisch wäre eigentlich auch nur TurboPascal's `Real` weil das kein IEEE-Format ist, sondern etwas selbst gebackenes von Borland.

@musikus: Wie schon gesagt, die Zeiten von zu wenig Speicher sind vorbei, 12k Koordinaten passen problemlos in den Speicher, auch mehrfach.

Ansonsten kann man natürlich auch immer 8-Byte-Blöcke lesen und die dekodieren:

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import with_statement
import struct
from functools import partial


def iter_coordinates_file(data_file):
    return (struct.unpack('ff', block)
            for block in iter(partial(data_file.read, 8), ''))


def main():
    with open('KOOR4.INT', 'rb') as data_file:
        for x, y in iter_coordinates_file(data_file):
            print x, y


if __name__ == '__main__' :
    main()
musikus
User
Beiträge: 14
Registriert: Donnerstag 9. Oktober 2008, 13:39
Kontaktdaten:

Freitag 10. Oktober 2008, 22:58

BlackJack hat geschrieben:@musikus: Was funktioniert denn jetzt genau nicht? Also bei mir sehen die Daten (gekürzt) so aus:

Code: Alles auswählen

[(-9.6499996185302734, 79.266670227050781),
 (-9.5333328247070312, 78.949996948242188),
 (-9.4166669845581055, 78.633331298828125),
 (-9.2119045257568359, 78.352378845214844),
 (-9.0071430206298828, 78.071426391601562),
 (-8.8023815155029297, 77.790473937988281),
 (-8.5976190567016602, 77.509521484375),
 (-8.3928565979003906, 77.228569030761719),
 (-8.1880950927734375, 76.947616577148438),
 (-7.9833331108093262, 76.666664123535156),
 (-8.2460784912109375, 76.367645263671875),
 (-8.5088233947753906, 76.068626403808594),
 (-8.7715682983398438, 75.769607543945312),
# ...
 (-76.55853271484375, -64.778045654296875),
 (-76.602027893066406, -65.080490112304688),
 (-76.645523071289062, -65.382926940917969),
 (-76.689018249511719, -65.68536376953125),
 (-76.732521057128906, -65.987808227539062),
 (-76.776016235351562, -66.290245056152344),
 (-76.819511413574219, -66.592681884765625),
 (-76.863006591796875, -66.895118713378906),
 (-76.906501770019531, -67.197563171386719),
 (-76.949996948242188, -67.5),
 (200.0, 200.0)]

In wiefern weichen die die vom erwarteten Ergebnis ab?

Bei mir sehen die Daten inzwischen auch so aus,
ich brauche aber nur immer einen Datensatz weil die Daten
noch umgerechnet werden müssen.


Und was versuchst Du eigentlich genau zu machen? Hoffentlich keine 1:1-Umsetzung der Pascal-Programme? Denn dieses Zwischenformat ist ziemlich ekelig. Nicht nur, dass man mit solchen Binärdaten Probleme mit der Portabilität bekommen kann, sondern auch, dass ganz normale Koordinaten wie (100.0, 100.0) und (200.0, 200.0) besondere Bedeutungen haben, ist extrem unschön. Wenn irgend wann einmal so eine Koordinate ganz regulär in den Daten vorkommt, fällt man damit auf die Nase.

Wird diese Zwischendatei wirklich benötigt?

Das sind die Koordinaten mit denen eine Winkelgetreue Abbildung
der Welt erzeugt werden soll und zwar um jeden X beliebigen Punkt. Wenn das Format so schlecht ist, könnte man auch aus den Rohdaten "KOOR4.DAT" ein anderes Format erzeugen.


Kann man die Interpolation nicht einfach als Schritt vor dem Zeichenen in das Programm einbauen? Die Zeiten, dass man bei so etwas Rechenzeit oder Speicher sparen musste, sind ja mittlerweile vorbei. Zumindest bei diesen kleinen Datenmengen, denn 12k interpolierte Koordinaten sind ja ein Witz.

Und die beiden Prozeduren die wir kennen, sehen nicht nach gutem Programmierstil nach heutigen Massstäben aus. Das sind ja wirklich Prozeduren, also Namen für Code-Abschnitte die auf globalen Daten operieren und keine in sich abgeschlossenen Funktionen.


Das ist wohl wahr, wie schon gesagt ist das ein uraltes Programm und mit heißer Nadel gestrickt.

Für heut möchte ich mich verabschieden und bedanke mich noch
einmal bei Allen für die freundliche Hilfe, werde mir das alles in Ruhe ansehen und vielleicht komme ich jetzt schon alleine zurecht.

Gute Nacht musikus
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Samstag 11. Oktober 2008, 07:12

Also du scheiterst gerade echt daran, dass du immer nur einen Datensatz brauchst?

Das meinst du nicht ganz ernst, oder? Arbeite das Tutorial durch!
musikus
User
Beiträge: 14
Registriert: Donnerstag 9. Oktober 2008, 13:39
Kontaktdaten:

Samstag 11. Oktober 2008, 09:56

audax hat geschrieben:Also du scheiterst gerade echt daran, dass du immer nur einen Datensatz brauchst?

Das meinst du nicht ganz ernst, oder? Arbeite das Tutorial durch!

Hallo audax, nein das meine ich nicht im Ernst, war gestern schon zu kaputt um noch einmal zu Antworten,
es ist alles ok und es funktioniert so wie ich es mir vorgestellt habe.

Das Problem was für Euch keines war ist gelöst und ich bedanke mich
noch einmal recht herzlich für die Hilfestellung, vielen Dank an Alle

Gruß musikus
BlackJack

Samstag 11. Oktober 2008, 10:20

Kann es sein, dass die Daten in der `*.DAT`-Datei an festen Spalten ausgerichtet sind? Sonst kann die `Interpolieren.pas` so nicht funktionieren. Und bei dem zweiten Beispiel aus der Datei ist die letzte Insel nicht eindeutig weil bei der ersten und letzten Koordinate bei der Breitenangabe entweder die Grad- oder die Minutenangabe fehlt.

Hier ist mal eine Umsetzung vom Interpolieren: http://paste.pocoo.org/show/87675/

Das Eingabeformat entspricht dem, was Du hier gezeigt hast. In dem auskommentierten Block in `parse_coordinate()` ist (natürlich ungetesteter) Code für ein Format mit festen Spalten, basierend auf dem Pascal-Quelltext.

Die Lösung ist "lazy", d.h. es wird immer nur eine Zeile gelesen und verarbeitet. Aber wie gesagt, die Grenzen von TurboPascal sind heutzutage überholt, man kann auch mehr als 64 KiB in eine Datenstruktur stecken. :-) In Python würde man da wahrscheinlich eher mit OOP heran gehen und das Eingabeformat in eine Liste mit Polygon-Objekten umwandeln und im Speicher halten. Sollten die Datenmengen zu gross für den Speicher werden, weil man heutzutage natürlich auch viel mehr Punkte für eine höhere Auflösung verarbeiten kann, dann könnte man die Daten in eine Datenbank stecken.
musikus
User
Beiträge: 14
Registriert: Donnerstag 9. Oktober 2008, 13:39
Kontaktdaten:

Sonntag 12. Oktober 2008, 10:35

BlackJack hat geschrieben:Kann es sein, dass die Daten in der `*.DAT`-Datei an festen Spalten ausgerichtet sind? Sonst kann die `Interpolieren.pas` so nicht funktionieren.

Hallo BlackJack, ja, die Daten der KOOR4.DAT sollten an feste Spalten
gebunden sein. Die Daten wurden von Hand (nicht von mir) aus Landkarten übertragen und danach von einer Sekrätärin eingetippt.
Aus diesen Daten sollte diese spezielle projektion der Welt erzeugt werden. Das sich da hunderte Fehler eingeschlichen haben liegt an
der Sache, die ersten Ergebnisse erinnerten eher an einen Schnittmusterbogen und nicht an eine Weltkarte. Nachdem die meisten
Fehler behoben waren stellte sich herraus das wie nicht anders zu erwarten die Koordinaten zu unregelmäßig und zu spärlich waren.
Das war der Grund um ein Hilfsprogramm zu erstellen um mit diesen
die Daten etwas aufzupäppeln. Das zu der Entstehungsgeschichte
dieses Programms.



Und bei dem zweiten Beispiel aus der Datei ist die letzte Insel nicht eindeutig weil bei der ersten und letzten Koordinate bei der Breitenangabe entweder die Grad- oder die Minutenangabe fehlt.


Das kann gut sein, habe einfach jeweils ein Stück aus der Datei
kopiert an der man die Struktur erkennen kann, muss wohl in
den sauren Apfel beißen und versuchen diese Fehler noch zu
korrigieren, das kann ich mir aber auch sparen denn das Programm
wird nicht gebraucht, mache das einfach aus reinem Interesse.


Hier ist mal eine Umsetzung vom Interpolieren: http://paste.pocoo.org/show/87675/

Bin wirklich beeindruckt wie Du so etwas einfach aus dem Ärmel schüttelst,
leider funktioniert das Programm bei mir auch wieder
nicht, ich habe zwar erkannt das einiges fehlt (KOOR4.DAT) wird
nicht geöffnet und es wird auch keine neue Datei erzeugt aber
das ist auch nicht so wichtig denn das "Interpolieren" ist nur
ein Hilfsprogramm und wird nur einmal gebraucht, da ich auch
das Turbopascal wieder installiert habe kann ich die Datei nötigenfalls
auch mit dem Pascalprogramm verbessern.


Das Eingabeformat entspricht dem, was Du hier gezeigt hast. In dem auskommentierten Block in `parse_coordinate()` ist (natürlich ungetesteter) Code für ein Format mit festen Spalten, basierend auf dem Pascal-Quelltext.

Die Lösung ist "lazy", d.h. es wird immer nur eine Zeile gelesen und verarbeitet. Aber wie gesagt, die Grenzen von TurboPascal sind heutzutage überholt, man kann auch mehr als 64 KiB in eine Datenstruktur stecken. :-) In Python würde man da wahrscheinlich eher mit OOP heran gehen und das Eingabeformat in eine Liste mit Polygon-Objekten umwandeln und im Speicher halten. Sollten die Datenmengen zu gross für den Speicher werden, weil man heutzutage natürlich auch viel mehr Punkte für eine höhere Auflösung verarbeiten kann, dann könnte man die Daten in eine Datenbank stecken.

Für dich ist das alles ganz einfach, für mich sehr undurchsichtig, hätte
nicht gedacht das es so kompliziert ist, habe schon fast bedauert das
ich mich auf die alten Tage noch einmal mit Programmieren befasse :-)

Habe auch schon nach den "Weltkoordinaten" im Internet gesucht, leider bis heute vergeblich.
Da es sich bei dem endgültigen Ergebnis des Programms um eine Vektorgrafik handelt,
müsste die Anzahl der Koordinaten nicht sehr viel größer sein.
Vor 20 Jahren wurde die "Welt"mit einem HP 7574A Flachbettplotter ausgegeben,
ich habe ein Programm mit dem ich die Plottdatei anzeigen und unter anderem auch in eine PDF
Datei umwandeln kann. Wie gesagt für mich ist das alles nur Spielerei, trotzdem noch eimal vielen Dank

Gruß musikus
Antworten