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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Naj 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 Naj 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 Naj 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 Naj H. (janiiix3)


Lesenswert?

Ich danke euch beiden.
Habe es endlich geschafft!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.