Getallen uit tekst inlezen

Status
Niet open voor verdere reacties.

Slice396

Gebruiker
Lid geworden
11 jun 2012
Berichten
11
Hallo,

Ik wil een programma maken die coordinaten in een txt bestand herkent. In het document staat bijvoorbeeld dit:

G0 F3000 X90.59 Y83.44 Z0.60

Nu is het doel dat hij het getal achter de Z dus 0.60 opslaat in een variabele. Heeft iemand een idee welke functie ik hiervoor moet hebben? Ben al een tijdje aan het zoeken geweest. Het lukt me wel om de tekst in een array te zetten maar het zoeken naar dat getal lukt nog niet...

Groet,

Slice396
 
Daar zijn best een aantal manieren voor. Dit is er 1 van:

Code:
    Function Coordinaat(ByVal corType As String, ByVal corRegel As String) As String
        Dim corArray() As String

        corArray = Split(corRegel)
        For i As Integer = 0 To UBound(corArray)
            If corArray(i).Chars(0) = corType Then
                Coordinaat = Mid(corArray(i), 2)
            End If
        Next

    End Function

Aanroepvoorbeeld is dan:
MsgBox(Coordinaat("Z", "G0 F3000 X90.59 Y83.44 Z0.60"))

En zo kun je hem ook voor X en Y gebruiken.
 
Laatst bewerkt:
Beste Edmoor,

Wilde even reageren op je bericht. Ben gisteren al een tijdje aan het puzzelen geweest met je code. Ga er nu weer mee door. Bedankt! Ben zelf nog een beginner op het gebied van programmeren dus ben nog wel even zoet :P

Groet,

slice
 
Laatst bewerkt:
Wat ik voor je gemaakt heb is niet moeilijk. Als je er problemen mee hebt dan geef maar een seintje.

Plak die functie in je code erbij en gebruik hem volgens het voorbeeld dat ik gaf.
 
Laatst bewerkt:
heey edmoor,

IIk wil het proberen toe te passen om regels uit een code te halen. De code is gelijk aan hierboven alleen staat er soms een extra regel tussen namelijk:

G93 R100

De R100 loopt langzaam af naar R0 en is dus niet altijd gelijk. Nou wil ik dat mijn programma deze regel overslaat. Dit is wat ik tot nu toe heb. Probleem is alleen dat hij inderdaad die G93 ziet alleen hij slaat niks op... Ben overigens nog bezig. Dus als ik ontdek wat er mist laat ik het weten.

For i As Integer = 0 To OldLines.Count - 1 Step 1
If OldLines.ToString = "G93" Then
OldLines.Skip(1)

End If
Next
MsgBox("No function yet")

Over jou code heb ik ook een vraagje klopt het dat hij enkel de regel G0 F3000 X90.59 Y83.44 Z0.60 ziet?
Het bestand bestaat namelijk uit ongeveer 400.000 regels waarin de waarde van de X Y en Z allemaal anders zijn...

bedankt!
 
Laatst bewerkt:
Over jou code heb ik ook een vraagje klopt het dat hij enkel de regel G0 F3000 X90.59 Y83.44 Z0.60 ziet?
Het bestand bestaat namelijk uit ongeveer 400.000 regels waarin de waarde van de X Y en Z allemaal anders zijn...
bedankt!

De functie ziet wat je opgeeft.
Als je Coordinaat("Z", "G0 F3000 X90.59 Y83.44 Z0.60") gebruikt ziet hij alleen G0 F3000 X90.59 Y83.44 Z0.60
Dat moet je uiteraard vervangen door wat je uit een regel hebt gelezen.
 
Maar het is niet mogelijk dat hij zoekt welke regels een Z bevatten en dat hij die waarde er achter opslaat. Uitijndelijk is het doel dat hij de hoogste waarde opslaat en uitrekend wat het verschil is per Z stap.

For i As Integer = 0 To OldLines.Count - 1 Step 1
If OldLines.ToString = "; generated by Slic3r 1.0.0RC3 on 2014-03-24 at 10:08:35" Then

Else
NewLines.Add(OldLines(i))


End If
Next

dit is mijn huidige code. Puur om te testen of hij de eerste zin uit het document verwijdert. Maar helaas gebeurt dat niet...
 
Laatst bewerkt:
Wat je nu vraagt is me niet echt duidelijk en de code maakt dat ook niet duidelijk. Daarnaast staat het helemaal los van je eerste vraag. Mijn functie doet wat je initieel vroeg en daar kun je de parameters zelf aan meegeven. Hoe en op welk moment in je code je dat doet is geheel aan jezelf. Als je problemen hebt met het lezen en analyseren van de gelezen regels is dat een heel ander probleem en zul je duidelijk moeten maken wat precies je bedoeling is zodat we daarbij kunnen assisteren.
 
Ik ben idd twee verschillende dingen aan het doen. De eerste post van vandaag leg ik ook uit wat ik nu probeer te doen.

Ik heb een code (Ik plak hier een klein stukje van de code)

; generated by Slic3r 1.0.0RC3 on 2014-03-24 at 10:08:35

; layer_height = 0.2
; perimeters = 3
; top_solid_layers = 3
; bottom_solid_layers = 3
; fill_density = 0.4
; perimeter_speed = 60
; infill_speed = 100
; travel_speed = 180
; nozzle_diameter = 0.4
; filament_diameter = 1.75
; extrusion_multiplier = 1
; perimeters extrusion width = 0.40mm
; infill extrusion width = 0.67mm
; solid infill extrusion width = 0.67mm
; top infill extrusion width = 0.67mm
; first layer extrusion width = 0.70mm

G21 ; set units to millimeters
M104 S210 ; set temperature
G28 ; home all axes
G1 Z5 F5000 ; lift nozzle
M109 S210 ; wait for temperature to be reached
G90 ; use absolute coordinates
G92 E0
M82 ; use absolute distances for extrusion
M106 S255
G1 F900.000 E-1.00000
G92 E0
G1 Z0.350 F10800.000
G1 X19.008 Y9.614 F10800.000
G1 E1.00000 F900.000
G1 X19.328 Y9.114 E1.05491 F1080.000
G1 X19.938 Y8.244 E1.15318
G1 X20.298 Y7.774 E1.20794
G1 X20.708 Y7.334 E1.26356
G1 X21.468 Y6.584 E1.36232
G1 X22.278 Y5.904 E1.46014
G1 X23.658 Y4.944 E1.61562
G1 X24.208 Y4.664 E1.67271
G1 X25.178 Y4.214 E1.77161
G1 X25.718 Y3.994 E1.82554
G1 X26.288 Y3.814 E1.88082
G1 X27.318 Y3.544 E1.97931
G1 X28.428 Y3.354 E2.08347
G1 X30.048 Y3.234 E2.23371
G1 X126.058 Y3.234 E11.11377
G1 X174.278 Y4.134 E15.57446
G1 X174.938 Y4.174 E15.63561
G1 X175.278 Y4.214 E15.66728
G1 X176.198 Y4.394 E15.75398
G1 X176.538 Y4.484 E15.78651
G1 X195.908 Y10.414 E17.66014
G1 X196.528 Y10.634 E17.72099
G1 X196.958 Y10.814 E17.76410
G1 X197.848 Y11.264 E17.85634
G1 X198.258 Y11.514 E17.90076
G1 X199.058 Y12.084 E17.99161
G1 X199.418 Y12.384 E18.03495
G1 X200.198 Y13.154 E18.13633
G1 X200.508 Y13.514 E18.18027
G1 X201.108 Y14.324 E18.27350
G1 X201.358 Y14.724 E18.31713
G1 X201.868 Y15.734 E18.42178
G1 X202.048 Y16.174 E18.46575
G1 X202.358 Y17.144 E18.55993

Mijn huidige code voegt een regeltje in namelijk G93 R100 waarbij de 100 iedere keer 1 stap omlaag gaat. Wanneer hij de 0 heeft gehaald staat hij aan het eind document. Dus hij maakt variabele stappen. Dat deel werkt en daar heb ik dus ook geen vragen over.

Nu wil ik het omgekeerde ook toepassen. Dus ik heb een Gcode waar eens in de zoveel tijd de regel G93 R... is neergezet. Nou wil ik dat het programma deze regel verwijdert. Wat ik nu denk te hebben gedaan met het stukje code wat ik hiervoor plaatste is dat hij de tekst; generated by Slic3r 1.0.0RC3 on 2014-03-24 at 10:08:35 verwijdert.

Het tekstbestand heb ik als array ingeladen in de variabele oldlines. wat ik denk dat het programma nu doet (zeg het maar als het niet klopt wat niet zo zal zijn want het werkt niet...)

For i As Integer = 0 To OldLines.Count - 1 Step 1
Het programma loopt door de regels in Oldlines heen. tot hij bij de laatste is. 1 stap per keer.

If OldLines.ToString = "; generated by Slic3r 1.0.0RC3 on 2014-03-24 at 10:08:35" Then
Als de regel in de code ; generated by Slic3r 1.0.0RC3 on 2014-03-24 at 10:08:35 = dan moet hij niks doen dus heb ik leeg gelaten...

Else
NewLines.Add(OldLines(i))
En als dat niet zo is moet hij de regel toevoegen aan NewLines.

End If
Next

Hierna schrijf ik NewLines naar het tekstbestand en zou ik dus een document moet hebben waarbij de eerste regel:
; generated by Slic3r 1.0.0RC3 on 2014-03-24 at 10:08:35

Weg is. Zie de voorbeeld Gcode. Als dit werkt is het voor mij een kleine moeite om:
; generated by Slic3r 1.0.0RC3 on 2014-03-24 at 10:08:35

te veranderen in:
G93

Snapt u mijn doel? Het stukje code moet dus ongedaan kunnen maken dat die regel is toegevoegd.

Thx
 
Ik denk dat hje veel te moeilijk doet, als ik je doel goed begrijp. Je kunt lezen in 1 bestand terwijl je in een ander bestand schrijft. Als je dat doet heb je helemaal geen arrays nodig. Je schrijft dan alle regels naar het tweede bestand behalve de regels waarvan de 1e 11 posities gelijk zijn aan "; generated".
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan