.gx (3D Drucker) Datei kopieren -> c#

OP #6526460
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?
Angehängte Dateien:
Gast #6526476
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.
Gast #6526638
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.
OP #6527657
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
    }
Gast #6528105
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?)
Gast #6528283
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.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren