Forum: PC-Programmierung PROGRAMMIERER gesucht - aus gcode autom. Zeilen löschen


von Franz S. (jufrasalzburg)


Angehängte Dateien:

Lesenswert?

Die Files sind für 3D-Drucker - gcode
Meine Slicersoftware schafft es leider nicht so wie ich will.

Kurze Erklärung:
zB: Ein Bauteil wird mit 2 Materialien gedruckt!
Im heißen Hotend (Druckkopf) schmilzt der Kunststoff (Filament)- und
rotzt etwas herunter.
Heißt im Hotend verschwindet etwas Material.
Fährt das Hotend wieder zum Bauteil um zu drucken - fährt es vorher zum
Prime Pillar oder Wipe Tower genannt - druckt diesen - um wieder
Material zu haben.

Diese Funktion brauche ich aber nur so lange, wie dieses Material
gebraucht wird.
Deshalb hätte ich gerne, daß der Tower nur so lange gedruckt wird, bis
ich ihn nicht mehr brauche... Dann Temperatur im nicht mehr benötigtem
Hotend senken und das Tower nicht mehr drucken.

Das Programm kann dies leider nicht!
Mein Ansatz - aus dem gcode File dieses nicht gewünschte Tower Ding
löschen!

Im Anhang ein paar Fotos zum Verständnis.

Der Code beginnt mit
G1 X160.522 Y144.132 F3600
G92 E0
G1 E-5.0000 F3600
G1 Z10.210 F1200
; prime pillar <------------ START
G1 x109....

und endet mit
; layer 16, ...
oder
; tool H0.200 ...
oder ähnlichem

Aber auf alle Fälle mit ";"

Kann mir jemand ein Programm schreiben das diese Bereiche löscht?
Heißt zB ab Zeile 34515
Ein paar Zeilen vor ";prime pillar" - also von inkl. "G92 E0" bis zum
nächsten ";" löschen!
oder alle Zeilen mit ";" beginnend markieren...

ev. noch einen Retract wie "G1 E-5.0000 F3600" einfügen...

die Files können schon um die 40MB haben...

: Bearbeitet durch User
von POSIX über Alles! (Gast)


Lesenswert?

man awk

von Nop (Gast)


Lesenswert?

Franz S. schrieb:

Das ist doch inkonsistent oder zumindest schlecht erklärt. Der Code:

> ; prime pillar <------------ START

Die Erklärung:

> Ein paar Zeilen vor ";prime pillar" - also von inkl. "G92 E0" bis zum
> nächsten ";" löschen!

Also ist "; prime pillar" eben NICHT der Start, sondern das Ende der 
Löschaktion? Und woher bestimmt sich nun der Start? Was an "G92 E0" ist 
so speziell? Oder soll immer von "G2 E0" bis zur nächsten Zeile gelöscht 
werden, die mit ";" startet? Oder sollen jeweils vor einem Semikolon die 
vorherigen N Zeilen gelöscht werden?

von Franz S. (jufrasalzburg)


Angehängte Dateien:

Lesenswert?

hast recht - war unverständlich...
der markierte Teil würde gelöscht gehören...

Also ab einer gewünschten Zeile - oder ab dem Keyword "Layer 59" immer 
dieses Muster löschen...

Jetzt besser erklärt? ;-)

von Gerd E. (robberknight)


Lesenswert?

Franz S. schrieb:
> Also ab einer gewünschten Zeile - oder ab dem Keyword "Layer 59" immer
> dieses Muster löschen...
>
> Jetzt besser erklärt? ;-)

Naja, was ist "dieses Muster" genau?

Woran genau erkennt man das Ende des zu löschenden Bereichs genau?

von Nop (Gast)


Lesenswert?

Franz S. schrieb:

> Also ab einer gewünschten Zeile - oder ab dem Keyword "Layer 59" immer
> dieses Muster löschen...
>
> Jetzt besser erklärt? ;-)

Nee.. weder geht daraus hervor, was das spezielle Kennzeichen des Starts 
ist, noch, wieso es beim einen Semikolon 17517 nicht endet, dafür aber 
beim nächsten, obwohl das auch nur Zufall sein kann.

Wirst Du wohl manuell machen müssen, denn programmiert bräuchte man 
schon eine klare Vorstellung. Mit "dieses Muster" wird das nichts.

von Franz S. (jufrasalzburg)


Lesenswert?

es beginnt mit "G92 E0"
3 Zeilen vor "; prime pillar"
und endet mit dem nächsten ";"
zB "; layer 26"

von Danish B. (danishbelal)


Lesenswert?

Wurde der Thread nicht schon gelöscht?

von Nop (Gast)


Lesenswert?

Franz S. schrieb:

> und endet mit dem nächsten ";"

Nein, tut es nicht.

von Franz S. (jufrasalzburg)


Angehängte Dateien:

Lesenswert?

das Muster startet mit
"G92 E0" drei Zeilen vor "; prime pillar"
dann kommt das ";" von "; prime pillar"
und endet mit dem nächsten ";"

als Beispiel die Datei im Anhang.
hier wäre es ab Zeile 6449 zum löschen.

von hp-freund (Gast)


Lesenswert?

Franz S. schrieb:
> hier wäre es ab Zeile 6449 zum löschen.

Meinst Du nicht 6446 bis 6548 ?
Oder vielleicht 6446 bis 6545 ?

von Franz S. (jufrasalzburg)


Lesenswert?

gott sei dank bin ich kein lehrer... ;-)

von 6446 bis einschließlich 6548

von hp-freund (Gast)


Lesenswert?

Na dann ist es doch einfach:

1. suche in original Datei: ; prime pillar
2. speichere Zeilennummer-3 als Anfang1
3. suche nächstes ; nach Zeilennummer
4. speichere als Ende1
5. wiederholen

entweder als Hilfsdatei oder als Liste.

Dann Datei noch mal durchlaufen.
1. beginne mit Zeile 1 speichere diese in neue Datei bis Anfang1
2. speichere nicht in neue Datei bis Ende1
3. wiederholen bis zum Ende der Originaldatei

von Franz S. (jufrasalzburg)


Angehängte Dateien:

Lesenswert?

könnten aber auch 4 Zeilen sein... es sollte also bei "G92 E0" beginnen 
bzw. gesucht werden.

siehe Zeile  247348 bis 247352
(File im Anhang).
bei diesem File müßte ab Zeile 247348 die Automation angewendet 
werden...

G1 X144.478 Y158.802 E5.2207
G1 X150.121 Y153.159 E5.3288
G1 X150.121 Y157.685 E5.3900
G1 X140.184 Y167.621 E5.5804
G1 X144.710 Y167.621 E5.6417
G1 X150.120 Y162.211 E5.7453
G92 E0
G1 E-4.0000 F2400
G1 Z44.900 F1200
; layer 448, Z = 44.85
; prime pillar
G1 X43.260 Y184.240 F12000
G1 Z44.850 F1200
G1 E0.0000 F2400
G92 E0
G1 X43.260 Y198.761 E0.1967 F600
G1 X28.740 Y198.761 E0.3933
G1 X28.740 Y184.240 E0.5900
G1 X43.260 Y184.240 E0.7866
G92 E0
G1 E-4.0000 F2400

von Nop (Gast)


Lesenswert?

Also wenn G92 E0 kommt, ohne daß 3 oder 4 Zeilen danach das prime pillar 
kommt, dann leitet das keine Löschsequenz ein, richtig?

von hp-freund (Gast)


Lesenswert?

Also wenn Zeile mit "; prime pillar" gefunden, suche Rückwärts bis 
"G92".
Speichere als AnfangX.

von Nop (Gast)


Lesenswert?

ne grundsätzliche Frage.. wie soll denn das mit dem Programm überhaupt 
gehen? Irgendwelche Linux-Tools für Skripte wirste ja wohl kaum 
installiert haben, und von irgendwelchen Fremden ein ausführbares 
Programm zu nehmen wäre schon arg leichtsinnig, kann ja sonstwas 
drinsein.

von Franz S. (jufrasalzburg)


Lesenswert?

hp-freund schrieb:
> Also wenn Zeile mit "; prime pillar" gefunden, suche Rückwärts bis
> "G92".
> Speichere als AnfangX.

würde ich auch so sehen.


Aber wartet mal kurz Leute.
Werde morgen mal ein paar Tests machen.
Bin gerade beim überlegen warum das löschen von
"; prime pillar" bis wirklich zum nächsten ";" nicht vernünftiger 
wäre...

Sollte - glaube ich zumindest - auch gehen.
Werde mal manuell löschen und einen Testlauf machen.

Wird dann so aussehen:
G1 X109.820 Y140.794 E0.5760 // Druckbefehle
G1 X109.872 Y140.847 E0.5770 // Druckbefehle
G1 X109.872 Y136.321 E0.6383 // Druckbefehle
G1 X107.179 Y133.628 E0.6899 // Druckbefehle
G92 E0 // Filamentzähler auf 0
G1 E-4.0000 F2400 // Retract -4mm
G1 Z5.900 F1200 // Bett senken
; prime pillar
; layer 30, Z = 6.05
; inner perimeter
G1 X99.720 Y147.202 F12000 // neue Position anfahren
G1 Z6.050 F1200 // Bett heben
G1 E0.0000 F2400 // Retract auf 0 - also +4mm
G92 E0 // Filamentzähler auf 0
G1 X99.720 Y133.798 E0.1815 F2415 // Druckbefehle
G1 X100.298 Y133.220 E0.1926 // Druckbefehle
G1 X109.702 Y133.220 E0.3200 // Druckbefehle

außer ich habe einen Denkfehler - sollte aber so funktionieren...

Werd es morgen testen - Meld mich wieder!
Danke vorerst mal für eure Hilfsbereitschaft!!!

von temp (Gast)


Lesenswert?

für solche kleinen Aufgaben ist JavaScript und node.js ganz gut 
geeignet.
Hier ein Beispiel für deine Anforderung:

1
var fs = require("fs");
2
var contents = fs.readFileSync("craddle.gcode").toString();
3
var a=contents.split("\r\n");
4
5
var ioffs=0;   // Anzahl gelöschter Zeilen als Offset für die Ausgabe
6
7
var istart=0;  // Index von 'G92 E0'
8
var istart2=0; // Index von '; prime pillar'
9
for (var i=0; i<a.length; i++)
10
{
11
  if (a[i]=="G92 E0" && istart2==0) 
12
    {
13
    // Anfang gefunden und merken
14
    istart=i;  
15
    continue;
16
    }  
17
18
  if (   istart>0 
19
      && istart2==0 
20
      && a[i]=="; prime pillar")
21
    {
22
    if (i<(istart+5))
23
      {   
24
      istart2=i;
25
      continue;
26
      }
27
    }
28
29
  if (istart>0 && istart2>0 && a[i][0]==';')
30
    {
31
    console.log("-----------------------------------"); 
32
    console.log("cut from line " + (istart+ioffs) + " to " + (i+ioffs));
33
    for (var n=istart; n<i; n++)
34
      console.log("  " + a[n]); 
35
    console.log();
36
    
37
    // Bereich löschen und i anpassen
38
    a.splice(istart, i-istart);
39
    ioffs+=i-istart;
40
    i=istart;
41
    istart=0;    
42
    istart2=0;    
43
    }    
44
}  
45
46
// das Array als neue Datei schreiben
47
var out="";
48
for (var i=0; i<a.length; i++)
49
  out+=a[i]+"\r\n";
50
fs.writeFileSync("craddle2.gcode", out);

von Franz S. (jufrasalzburg)


Lesenswert?

hey super, vielen herzlichen Dank!

genau nach Wunsch... und sogar zum Anpassen.

Habs auch schon getestet - funktioniert!

Danke nochmal an alle...

von temp (Gast)


Lesenswert?

Ich melde mich dann bei dir wenn ich mal was aus dem 3D-Drucker 
brauche...

von Franz S. (jufrasalzburg)


Lesenswert?

Bitte gerne!

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.