Forum: PC-Programmierung .gx (3D Drucker) Datei kopieren -> c#


von Jan H. (janiiix3)


Angehängte Dateien:

Lesenswert?

Hallo Forum,

habe mal eine Frage an euch:
Ich schaffe es nicht die Steuerzeichen aus den ersten Zeilen der 
beigefügten Datei 1:1 zu kopieren.
Die Datei bearbeite ich (in meiner c# GUI) und speichere diese 
bearbeitete dann wieder ab.

Das klappt soweit auch, bis auf das die Steuerzeichen anscheind nicht 
mit kopiert werden.

Auch wenn ich die original Datei öffne und diese nicht verändere sondern 
wieder 1 zu 1 im gleichen Format speichere kann meine Slicer Software 
diese nicht mehr laden..
Woran liegt das?

von c-hater (Gast)


Lesenswert?

Naj H. schrieb:

> Auch wenn ich die original Datei öffne und diese nicht verändere sondern
> wieder 1 zu 1 im gleichen Format speichere kann meine Slicer Software
> diese nicht mehr laden..
> Woran liegt das?

Du bearbeitest die Datei wahrscheinlich als "Text". Es ist aber kein 
Text, jedenfalls nicht vollständig.

Wenn du sie als Text bearbeiten möchtest, dann musst du erstmal die 
Steuerzeichen "escapen" und am Ende der Bearbeitung wieder "de-escapen". 
Escapen bedeutet in erster Näherung: Ersatz durch eine Darstellung, die 
im Text-Teil nicht vorkommt. Wenn man das nicht garantieren kann, dann 
muss in zweiter Näherung auch jedes Vorkommen des Excape-Zeichens in den 
Textdaten seinerseits escaped werden. Hier allerdings, um zu notieren, 
dass es gerade KEIN Escape-Zeichen ist. So ungefähr funktioniert das.

von Jan H. (janiiix3)


Lesenswert?

Jetzt hast Du mich noch mehr verwirrt.
Ich soll diese Steuerzeichen "auskommentieren"?

von Franz-Xaver (Gast)


Lesenswert?

Gleich vorweg: Ich habe absolut keine Ahnung von diesem Dateiformat und 
orientiere mich nur an der Beispieldatei. Es gibt darin (mindestens) 
drei Bereiche.
"xgcode 1.0" gefolgt von 0xA0 und irgendwas anderem. An Index 20 steht 
evtl. eine Adresse (0xB0, 0x38, 0x00, 0x00). Wenn es so ist, wäre es 
wahrscheinlich 14512 (dec), denn genau an diesem Index beginnt der 
ASCII-Teil der Datei (";generated by ffslicer" ...). Dazwischen befinden 
sich die Daten, die dir vermutlich Probleme bereiten (abgesehen von ein 
paar Bytes im Header).

Falls das kein kompletter Blödsinn ist, könntest du evtl.:
- Den Anfang der Datei (als Binärdaten) einlesen und zumindest grob 
validieren (also Start mit "xgcode" und Sinnhaftigkeit des Dateiindex 
des ASCII-Teils).
- Alles bis zu diesem Index als Binärdaten einlesen.
- Den Rest als Text einlesen und editieren.
- Den Binärteil als solchen in eine Datei schreiben.
- Den veränderten ASCII-Teil als solchen anhängen.

Du müsstest dann nur beachten, dass die Trenner im ASCII-Teil als LF 
(0x0A) geschrieben werden, nicht als "Windows-Newline" (CR LF, also 0x0D 
0x0A), falls dies bei diesem Dateiformat eine Rolle spielt.

Ich gehe hier natürlich (naiverweise) davon aus, dass du nur Werte im 
ASCII-Teil änderst und diese Änderungen keinen Einfluss auf den 
Binärteil haben.

von Jan H. (janiiix3)


Lesenswert?

Hallo Community,

habe jetzt echt einiges probiert..
Es werden immer noch einige Zeichen nicht richtig interpretiert bzw. 
Encoded..

Das ist mein aktueller Code (nur zum testen..)
1
  public sGFormat ParseGXFormat( string sPath )
2
    {
3
    sGFormat sFile = new sGFormat();
4
5
    int iIndex = 0;
6
    string sGCode = "";
7
    sFile.sFormat = "gx";
8
    byte[] bFile = new byte[14501];
9
10
    
11
    BinaryReader oBR = new BinaryReader(File.Open(sPath, FileMode.Open), Encoding.GetEncoding("ISO-8859-1"));
12
    oBR.ReadString(); // Dieser String ist unbrauchbar! Muss aber gelesen werden..
13
    
14
    int iCnt = 0;
15
    for( iCnt = 0; iCnt < 14501; iCnt++)
16
      bFile[iCnt] = oBR.ReadByte();
17
18
    oBR.Close();
19
20
    StreamReader sr = new StreamReader(sPath);
21
    sLines = new string[CountNewLines(sPath)];
22
23
    sGCode = sr.ReadLine(); // xgcode 1.0
24
25
    while (sGCode != null)
26
    {
27
                        /* Code entfernt..*/
28
      sLines[iIndex] = sGCode;
29
      sGCode = sr.ReadLine();
30
      iIndex++;
31
    }
32
33
    sr.Close();
34
35
    for(int x = 0 ; x < 14501;x++ )
36
        {
37
      sLines[1] += bFile[x];
38
    }
39
40
    return sFile;
41
    }

von bluppdidupp (Gast)


Lesenswert?

Hier hat das Dateiformat scheinbar jemand beschrieben:
https://github.com/slic3r/Slic3r/issues/4869

Der BinaryReader dürfte für deine Zwecke nicht geeignet sein.
Das Ding wird eigentlich eher intern von z.B. BinaryFormatter genutzt 
und laut Doku gilt bei ReadString() z.B.:
"Reads a string from the current stream. The string is prefixed with the 
length, encoded as an integer seven bits at a time."
...das ist bei diesem *.gx-Format aber nicht der Fall (bzw. 
wahrscheinlich generell bei praktisch nichts, was nicht zufällig auch 
via BinaryWriter/BinaryFormatter erzeugt wurde ;D)

Verwende besser direkt nur FileStream.Read() / .ReadByte() und lies dir 
damit relevante* String-Sektionen z.B. jeweils in eigene byte[]-Arrays 
und konvertiere dir das dann z.B. via
string 
result=Encoding.GetEncoding("ISO-8859-1").GetString(quellByteArray);
jeweils in einen String.

(*vermutlich nur der Teil wo der tatsächliche gcode los geht? Und davor 
wird nichts editiert?)

von Franz-Xaver (Gast)


Angehängte Dateien:

Lesenswert?

Naj H. schrieb:
> habe jetzt echt einiges probiert..
> Es werden immer noch einige Zeichen nicht richtig interpretiert bzw.

Ich meinte es wie im Anhang - einfach die Binärteile (Header und Bitmap; 
danke an bluppdidupp für den Link) speichern und danach den Textteil 
(G-Code) drankleben.
Das Beispielprogramm lädt die Datei, hängt an die erste G-Code-Zeile 
etwas an und speichert das Ganze wieder (Vorsicht, sollte die Zieldatei 
existieren, wird sie überschrieben).
gxsav in.gx out.gx

Falls Du mit dem Bitmap nichts machen willst - z.B. anzeigen oder 
speichern -, werden GxBitmap.cs (und damit System.Drawing) und die 
gekennzeichneten Zeilen in GxFile nicht benötigt.

von Jan H. (janiiix3)


Lesenswert?

Ich danke euch beiden.
Habe es endlich geschafft!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.