text invoegen op bepaalde regels in txt bestand

Status
Niet open voor verdere reacties.

Slice396

Gebruiker
Lid geworden
11 jun 2012
Berichten
11
Hallo allemaal,

Ik heb een klein programma gemaakt die een .txt file leest en het aantal regels telt. Nou is het de bedoeling dat ie om de zoveel regels een nieuwe regel plaatst met een text. Nou heb ik al een tijdje gezocht maar kan het helaas niet vinden. Is er iemand die me de goede richting in kan wijzen? Ik werk in visual basic 2008.

Dus stap voor stap wat er gebeurt/ moet gebeuren. (het gaat om een code voor een nc gestuurde machine)

Programma vraagt om het bestand > Gebruiker bladert naar het bestand > Programma telt het aantal regels en deelt dit door 100 (ik wil 100 regels invoegen) > (Hier ben ik nu) Om de zoveel regels zet het programma een regeltje in (G93 R100, G93 R99, G93 R98 ...) > programma is klaar.

Daarna zou ik dit bestand zo de machine in moeten kunnen gooien. Iemand die hier een tip voor heeft?

groet
 
Hoi,

Kan je ook even laten zien wat je nu hebt? Anders zijn wij ook nog bezig met codes schrijven die jij toch ook al geschreven hebt...

Dan heb ik nog 1 vraagje: moet de tekst altijd hetzelfde zijn of moet de tekst iedere keer veranderen?

MartinJM
 
hallo,

Ja tuurlijk ik weet niet helemaal hoe je het wilt hebben dus plakt het gewoon hieronder. Is nog niet heel veel. Tot nu toe opent er een venster kan je het document selecteren en daarna is het klaar. En wanneer je op annuleren klikt stopt het programma. Zou niet weten hoe ik hem weer gewoon terug moet krijgen naar de start van het programma... (kan dat met een loop?)

verder is die regel altijd hetzelfde alleen het getal achter de R verandert. Het liefst zou ik hem zo hebben dat ie zelf doortelt van 0 naar 100 of andersom.
(ps. Grootste deel van deze code is gekopieerd van andere code's die ik onder andere in dit forum heb gevonden)

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

End Sub

Private Sub StartButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BrowseButton.Click
Dim fd As OpenFileDialog = New OpenFileDialog()
Dim strFileName As String

fd.Title = "Open File Dialog"
fd.InitialDirectory = "C:\"
fd.Filter = "All files (*.*)|*.*|All files (*.*)|*.*"
fd.FilterIndex = 2
fd.RestoreDirectory = True

If fd.ShowDialog() = DialogResult.OK Then
strFileName = fd.FileName
Else : MsgBox("Geen invoer, het programma stopt")
Stop

End If

Dim Tekstbestand As System.IO.TextReader = New System.IO.StreamReader("<pad naar tekstbestand>")
Dim Array As New ArrayList
Dim count As Integer

Do While Tekstbestand.Peek <> -1
Array.Add(Tekstbestand.ReadLine)
'Je kan iets doen met de huidige lijn. Voorbeeld:
'Listbox1.Items.Add(array(count))
count += 1
Loop

Tekstbestand.Close()
'Hier kan je de array uitlezen. bijvoorbeeld:
'label1.text = array(3)
'De telling begint bij 0, dus de 1e regel = 0, 2e regel = 1 enz.
Array.Clear()
End Sub

Private Sub StartButton_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StartButton.Click

End Sub
End Class

Mijn ervaring binnen visual basic is nog niet zo heel groot. Ben er nu net een paar dagen mee bezig en meer dan wat simpele rekenmachientjes etc heb ik nog niet gemaakt.

Groet,

Slice
 
Hoi,

Codes kan je plaatsen in de code-tags. Die zijn speciaal bedoelt voor codes.

Als je bij annuleren terug wil naar het begin van het programma kan je misschien het beste het volgende gebruiken:
Code:
Application.Restart()
Dat zal ervoor zorgen dat het programma opnieuw opstart.

Ik heb een voorbeeld voor je geschreven, maar bedenk hier wel bij dat codes overnemen geen zin heeft als je niet snapt wat er gebeurt...
[CPP] ''//Openfiledialog aanmaken
Dim fd As New OpenFileDialog

''//Title en Filter instellen
fd.Title = "Open bestand..."
fd.Filter = "Alle bestanden (*.*)|*.*"

''//De dialog weergeven
Dim Result As DialogResult = fd.ShowDialog()
If Not Result = DialogResult.OK Then
''//Als het resultaat niet OK is, stoppen
MsgBox("Geen invoer, het programma herstart.")
Application.Restart()
Exit Sub
End If

''//De bestandsnaam in een variable zetten
Dim strFileName As String = fd.FileName

''//Maak een stream aan om het bestand te kunnen gebruiken
Dim Stream As New IO.FileStream(strFileName, IO.FileMode.Open)
''//Maak een reader aan om het bestand te kunnen openen
Dim Reader As New IO.StreamReader(Stream)
''//Sla de gehele inhoud op in een variable
Dim Content As String = Reader.ReadToEnd
''//Zodat je de reader en de stream zo snel mogelijk weer kan sluiten
Reader.Close()
Stream.Close()

''//Zet alle regels in een array
Dim OldLines() As String = Content.Split(vbCr)
''//Hierin gaan we alle nieuwe regels zetten
Dim NewLines As New List(Of String)
''//Een extra counter om bij te houden of we weer 100 regels gehad hebben
Dim Counter As Integer = 0
''//Loop door alle oude regels heen
For i As Integer = 0 To OldLines.Count - 1 Step 1
If Counter = 99 Then
''//Als de counter 100 is moet er een extra lijn in
NewLines.Add("TextToAdd")
''//En moet de counter weer naar 0
Counter = 0
End If

''//En de oude lijn moet er sowieso weer in
NewLines.Add(OldLines(i))
''//En de counter moet 1 omhoog
Counter += 1
Next

''//Een list (of array) kunnen we niet naar een tekstbestand schrijven
''//dus we maken er weer een string van
Dim NewContent As String = Join(NewLines.ToArray, vbCr)

''//Om te schijven maken we weer een stream aan, alleen zorgen we nu
''//meteen dat het bestand helemaal leeg is ("IO.FileMode.Truncate")
Stream = New IO.FileStream(strFileName, IO.FileMode.Truncate)
''//En nu moeten we schrijven, dus geen reader maar een writer
Dim Writer As New IO.StreamWriter(Stream)
''//Het schrijven zelf
Writer.Write(NewContent)
''//En weer sluiten
Writer.Close()
Stream.Close()

MsgBox("Klaar!")[/CPP]

Als je er vragen over hebt mag je ze altijd stellen!

Succes!:thumb:
MartinJM
 
Heey Martin,

Bedankt voor je code ik begrijp grotendeels wat je doet maar ik heb wel enkele vraagjes.

In mijn code had ik ipv exit sub de functie return gezet. Die deed naar mijn idee hetzelfde. Nou is mijn vraag zit er verschil tussen die twee?

Je zegt in je code: ''//Zodat je de reader en de stream zo snel mogelijk weer kan sluiten
Nemen die twee veel geheugen in beslag ofzo? wat is zeg maar de rede dat je die twee zo snel mogelijk wil sluiten?

Ik ga weer een beetje puzzelen ik moet er volgens mij nog wel wat counters bijzetten voor onder andere het toevoegen van die regel etc.

Thx
 
Hoi,

Het toevoegen van de regel gebeurd nu al. Daarvoor loopt het programma door alle regels.

Dan over het sluiten van de stream, de reader en de writer: Als je ze niet afsluit en je probeert het bestand te openen in een ander programma (bijvoorbeeld kladblok), dan krijg je een melding dat het bestand al door een ander programma gebruikt wordt. Daarom heb ik er voor mezelf in ieder geval een gewoonte van gemaakt om ze zo snel mogelijk weer te sluiten.

De exit sub is er alleen nog maar zodat het programma niks meer gaat doen na het aanroepen van "Application.Restart()". Anders komt daar nog een foutmelding. Wat jij had gebruikt was "Stop", maar persoonlijk gebruik ik dat liever niet. Dat heeft een beetje met multithreading te maken, maar dat komt later wel.

MartinJM

[edit]
De loop is het "For ... Next" stukje.
[/edit]
 
Heey,

Als reactie op je vorige bericht. Hij plaatste inderdaad die regel maar ik wilde hem verdeeld hebben over het totale document. Hij deed nu elke 100 regels een regel bijvoegen. In de huidige versie heb ik dat aangepast zodat hij eerst het totaal aantal regels telt. Daarna deelt ie het aantal regels door 100. Het getal wat hieruit volgt moet hij daarna gaan gebruiken als stapgrootte.

Ik heb de stukjes die ik daarmee heb aangepast even ingevoegd om te laten zien wat ik bedoel

Code:
        Dim tussenstap As Integer
        tussenstap= tussenstap / 100
        ''Formaat van de tussenstapnaar een heel getal zetten
        Format(procent, "#0")
        ''nu de opdeelcyclus, startwaarde gelijkzetten aan de scrollbar
___________________________________________________________

 ''//Loop door alle oude regels heen
        For i As Integer = 0 To OldLines.Count - 1 Step 1
            If Counter = tussenstap Then
                ''//Als de counter gelijk is aan de tussenstap is moet er een extra lijn in
                NewLines.Add(vbCrLf & "G93 R" & colorcounter)
                colorcounter = colorcounter - waarde
                ''Als de colorcounter 0 is mag hij niet verder zakken anders gaan we 
                ''negatieve getallen invoeren. 
                If colorcounter = 0 Then
                    waarde = 0
                End If
                ''//En moet de counter weer naar 0
                Counter = 0
            End If
            ''//En de oude lijn moet er sowieso weer in
            NewLines.Add(OldLines(i))
            ''//En de counter moet 1 omhoog
            Counter += 1
        Next


Inmiddels ben ik weer aan het puzzelen geweest. Nou heb ik weer enkele vraagjes...

Is het mogelijk om in de bestanden getallen te herkennen? hij voegt nu eens in de zoveel tijd een regeltje toe. Nou wil ik dat ie gaat kijken of er een bepaald formaat in de regel staat. Als voorbeeld
G0 F3000 X122.65 Y117.62 Z0.50 Het gaat mij er dan om dat ie de Z hoogte gaat herkennen. In dit geval moet hij dus zien z = 0,5 mm

Uiteindelijk wil ik dat hij de totale z hoogte gaat berekenen. Dan weet ie dus hoe hoog hij komt. Dit kan ik dan ook weer gebruiken om te bepalen wat de overgang moet worden. Mijn huidige probeersel ziet er zo uit:

Code:
    Dim Tekstbestand As System.IO.TextReader = New System.IO.StreamReader(fd.FileName)
        Dim Array As New ArrayList
        Dim tussenstap As Integer
        Dim zteller As Integer
        Do While Tekstbestand.Peek <> -1
            Array.Add(Tekstbestand.ReadLine)
            tussenstap += 1
            'Je kan iets doen met de huidige lijn. Voorbeeld:
            Dim arraycontrole As String
            arraycontrole = Join(Array.ToArray, vbCr)

            If Format(arraycontrole, "#G0 F0000 X000.00 Y00.00 E00.00000") Then
                zteller = zteller + 1
                'Listbox1.Items.Add(array(count))

            End If
        Loop

probleem is dat ik deze foutmelding krijg:
De conversie van tekenreeks #G0 F0000 X000.00 Y00.00 E00.000 naar type Boolean is ongeldig.

Waar ligt dit aan? En denk je dat dit zo gaat werken of moet ik het anders aanpakken?

Groet
 
Hoi,

Ik heb als eerste een paar op/aanmerkingen op de eerste code die je gepost hebt:
  1. De "Format" die je erin hebt staan doet volgens mij helemaal niks omdat je het resultaat nergens opslaat
  2. Afronden kan ook met "Math.Round"
  3. Ik weet niet precies hoe je het aantal regels bepaalt, maar in de code die ik je al gegeven had is er een hele simpele manier om het aantal regels te bepalen: de lengte van de array is gelijk aan het aantal regels.
Als ik het zelf zou maken zou ik op het volgende uitkomen (gebaseerd op mijn vorige code, dus jouw aanpassingen zitten er niet in)(en ik heb het niet getest):
[CPP] ''//Openfiledialog aanmaken
Dim fd As New OpenFileDialog

''//Title en Filter instellen
fd.Title = "Open bestand..."
fd.Filter = "Alle bestanden (*.*)|*.*"

''//De dialog weergeven
Dim Result As DialogResult = fd.ShowDialog()
If Not Result = DialogResult.OK Then
''//Als het resultaat niet OK is, stoppen
MsgBox("Geen invoer, het programma herstart.")
Application.Restart()
Exit Sub
End If

''//De bestandsnaam in een variable zetten
Dim strFileName As String = fd.FileName

''//Maak een stream aan om het bestand te kunnen gebruiken
Dim Stream As New IO.FileStream(strFileName, IO.FileMode.Open)
''//Maak een reader aan om het bestand te kunnen openen
Dim Reader As New IO.StreamReader(Stream)
''//Sla de gehele inhoud op in een variable
Dim Content As String = Reader.ReadToEnd
''//Zodat je de reader en de stream zo snel mogelijk weer kan sluiten
Reader.Close()
Stream.Close()

''//Zet alle regels in een array
Dim OldLines() As String = Content.Split(vbCr)
''//Hierin gaan we alle nieuwe regels zetten
Dim NewLines As New List(Of String)
''//Om te bepalen of er al een nieuwe regel in moet
Dim MaxCounter As Integer = Math.Round(OldLines.Count / 100, 0)
''//Een extra counter om bij te houden of we weer MaxCounter regels gehad hebben
Dim Counter As Integer = 0
''//Loop door alle oude regels heen
For i As Integer = 0 To OldLines.Count - 1 Step 1
If Counter = MaxCounter Then
''//Als de counter MaxCounter is moet er een extra lijn in
NewLines.Add("TextToAdd")
''//En moet de counter weer naar 0
Counter = 0
End If

''//En de oude lijn moet er sowieso weer in
NewLines.Add(OldLines(i))
''//En de counter moet 1 omhoog
Counter += 1
Next

''//Een list (of array) kunnen we niet naar een tekstbestand schrijven
''//dus we maken er weer een string van
Dim NewContent As String = Join(NewLines.ToArray, vbCr)

''//Om te schijven maken we weer een stream aan, alleen zorgen we nu
''//meteen dat het bestand helemaal leeg is ("IO.FileMode.Truncate")
Stream = New IO.FileStream(strFileName, IO.FileMode.Truncate)
''//En nu moeten we schrijven, dus geen reader maar een writer
Dim Writer As New IO.StreamWriter(Stream)
''//Het schrijven zelf
Writer.Write(NewContent)
''//En weer sluiten
Writer.Close()
Stream.Close()

MsgBox("Klaar!")[/CPP]

Dan voor de tweede code:
Waar heb je dat precies vandaan? Of heb je zelf die comment erin gezet?

Voor de error moet je misschien even hiernaar kijken: http://msdn.microsoft.com/en-us/library/59bz1f0h(v=vs.90).aspx. Daarin staat precies wat de Format functie doet.
Kijk dan ook even naar wat je als style gebruikt. Dat komt in je code niet overeen met het voorbeeld. En dan vraag ik me ook nog af of het niet makkelijker is om te checken of er een "Z" in de regel staat. Maar het hangt van de andere regels af of dat werkt. (Als er in de andere regels ook "Z"-tekens voorkomen in een andere context zou het kunnen dat checken voor een "Z" niet werkt).

En dan valt mij het volgende lijntje nog op:
Code:
arraycontrole = Join(Array.ToArray, vbCr)
Hier maak je weer één string van alles wat er in het bestand staat... Dan kan je toch makkelijker (ipv het per regel uitlezen) het volgende gebruiken:
Code:
Dim Tekstbestand As System.IO.TextReader = New System.IO.StreamReader(fd.FileName)
Dim arraycontrole As String = Tekstbestand.ReadToEnd()
Of is het de bedoeling dat het samengaat met de code voor het toevoegen van de lijntjes?

En dan heb ik nog één vraag over:
Waarom zet je de hele inhoud van het bestand in een string en ga je die vervolgens gebruiken om de hoogte te berekenen? Waarom doe je dat niet gewoon per regel en tel je alles bij elkaar op?

MartinJM
 
Beste Martin,

Bedankt voor je antwoord. Ik ben nog niet helemaal thuis in visual basic dus vandaar. Als ik een manier heb gevonden dan gebruik ik die zeg maar ook. Momenteel als ik het zelf goed zie in mijn code lees ik 2 maal het bestand in en schrijf ik hem 1 maal. Ik heb van een ander forum af ook al een eerdere code gebruikt maar die werkte niet goed. het tellen van de regels deed hij maar de rest niet (schrijven etc) Dat deed jou code wel. En nu werken ze een soort van samen... Ik zal morgen even mijn gehele code posten (ben mijn usb stick kwijt met daarop de code, heel slim).

Verder dacht ik dat ik nu zeg maar een systeem had waarmee hij de code vergelijkt met dat format. Dus de regel:
If Format(arraycontrole, "#G0 F0000 X000.00 Y00.00 E00.00000") Then
Zou in mijn ogen moeten kijken of de regel die opstelling heeft. De waardes achter de getallen die hier 0 zijn. zijn in de code constant anders. Als ik die format dus zou gebruiken om de Z regels te herkennen zou hij die op kunnen slaan.

Misschien had ik het er overigens bij moeten zeggen. De eerste versie deed het heel goed. Ik heb hem meerdere malen toegepast met vrijwel altijd een goed resultaat. Maar wat hij nu doet is alle regels optellen. Ik wil het liefst dat hij de hoogte van de z as gewoon meet. Dan kan ik hem daarvan afhankelijk maken. Het programma is bedoeld voor mijn 3d printer. Die moet kleuren mixen. Wanneer hij iets print wat onderin heel dik is en boven heel dun. krijg je dat hij onderin heel snel overgaat van kleur (omdat daar veel regels in zitten) en bovenin gaat het verloop dan heel traag. Vandaar dat ik wil dat hij de hoogte gaat herkennen. Overigens is de processor niet zo snel in de gemiddelde besturingen. Ik gebruik melzi die uit me hoofd gezegd een 14 mhz processor heeft.

Wanneer hij dus heel veel (onzinnige) regels krijgt zal hij dus gaan haperen tijdens het printen. Dat wil ik voorkomen door hem zo min mogelijk extra regels te geven. De z as word alleen benoemd wanneer hij verandert. Dit gebeurt om de 0,2mm.

Mijn idee is dus als het programma dus het hoogste z punt kan zien. En die dan door 100 kan delen. Dan weet het programma hoe hoog het te printen object wordt. Daarmee kan die dus bepalen hoeveel hij per laag moet mixen. Hoe preciezer de overgang hoe beter. En het liefst heb ik dan dat hij enkel na de regel waarin de z hoogte wordt aangepast. dat extra regeltje plakt (G93 R(en dan een waarde tussen de 0 en 100%)) Dit zorgt voor een mooie overgang tussen de onderste en bovenste laag.

Natuurlijk verwacht ik niet van jou dat jij nu die gehele code gaat schrijven. Sterker nog ik wil het eigenlijk zelf leren voor als ik in de toekomst dit nog eens wil aanpassen/verbeteren. Of als ik natuurlijk een ander programma wil schrijven. Vandaar dat ik het probeer zo veel mogelijk zelf uit te vogelen. Wellicht dat mijn uiteindelijk code niet de meest voor de hand liggende is... maar zal heel eerlijk zijn dat ik op dit stukje code waarvan de 80% door onder andere jou is geschreven. Toch heel trots ben :p

Overigens heb ik al op google gezocht naar handleidingen van visual basic maar heb er nog niet echt een gevonden die je zeg maar praktisch laat werken. Heb jij misschien een advies of ervaring met een bepaalde site of boek waar je hebt leren programmeren?

Groet,

slice
 
Heey,

Ik heb weer wat aan de code gesleuteld. Heb hieronder de hele mikmak geplakt. Nu komt het programma met de vraag op welk punt hij moet beginnen met mixen en op welk punt hij moet stoppen.

Code:
Private Sub Start_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Start.Click
        'eerst het bestand openen wat we nodig hebben
        'Declareren van gcode als OpenFile Dialog
        Dim Gcode As New OpenFileDialog


        'Titel en filter instellen
        Gcode.Title = "Geef gcode in..."
        Gcode.Filter = "Gcode (*.gcode*)|*.gcode|Alle bestanden (*.*)|*.*"


        'Het venster oproepen
        Dim locatie As DialogResult = Gcode.ShowDialog()
        'even tegengaan dat het programma stilvalt als iemand het dialoogvenster wegklikt
        If Not locatie = DialogResult.OK Then
            MsgBox("Invoeren geannuleerd programma stopt")
            Return
            Exit Sub
        End If


        'tekstbestand declareren als SteamReader
        Dim tekstbestand As System.IO.TextReader = New System.IO.StreamReader(Gcode.FileName)
        'Arraylist aanmaken om het tekstbestand in op te slaan
        Dim Array As New ArrayList
        'tussenstap declaren om uit te zoeken hoeveel regels er over moeten worden geslagen
        Dim tussenstap As Integer
        'een stukje tekst van internet die zover ik begrijp ervoor zorgt dat het programma gaat tellen tot
        'hij het eind van het document aantikt
        Do While tekstbestand.Peek <> -1
            Array.Add(tekstbestand.ReadLine)
            tussenstap += 1
        Loop


        'Nou willen we weten wanneer er gestart moet worden met het overgaan van kleur
        'Ook gaan we vragen hoe vaak de kleur moet overspringen
        Dim startpunt As Integer
        startpunt = 21
        'een leuk stukkie waarmee de waarde niet onder de 0 en boven de 100 kan komen
        Do Until startpunt >= 0 And startpunt <= 20
            startpunt = InputBox("Op welk punt moet er begonnen worden met de overgang? (tussen de 0 en 20%)")
            If startpunt > 20 Then
                MsgBox("gegeven waarde is te hoog")
            ElseIf startpunt < 0 Then
                MsgBox("gegeven waarde is te laag")
            End If
        Loop

        'en nu voor de bovengrens
        Dim eindpunt As Integer
        Do Until eindpunt >= 80 And eindpunt <= 100
            eindpunt = InputBox("Op welk punt moet de overgang gestopt zijn? (tussen de 80 en 100%)")
            If eindpunt > 100 Then
                MsgBox("gegeven waarde is te hoog")
            ElseIf eindpunt < 80 Then
                MsgBox("gegeven waarde is te laag")
            End If
        Loop

        'nu moeten de regels opgedeeld worden
        'een stukje om te bepalen bij welke regel er gestart moet worden
        'natuurlijk is er opgelet of er uberhaupt een regel moet worden overgeslagen
        Dim startregel As Integer
        If startpunt = 0 Then
            startregel = 0
        Else
            startregel = (tussenstap / 100) * startpunt
        End If


        'een stukje om te bepalen bij welke regel er gestopt moet worden
        Dim eindregel As Integer
        If eindpunt = 100 Then
            eindregel = 0
        Else
            eindregel = tussenstap
            eindregel = (tussenstap / 100) * (100 - eindpunt)
        End If



        'counter toevoegen die bijhoud wanneer er moet worden gestart met schrijven
        Dim startcounter As Integer
        startcounter = startregel

        'nu moet de nieuwe waarde van de tussenstap achterhaald worden
        'dit gebreurt heel simpel door de waarden start en eindregels van de tussenstap af te trekken
        If startpunt = 0 Then
            tussenstap = tussenstap - eindregel
        Else
            tussenstap = tussenstap - startregel - eindregel
        End If


        'Hier is de waarde van de tussenstap bekend.
        'Nu wordt die in stukken gedeel zodat er 100 regels in passen. 
        tussenstap = tussenstap / 101
        'nu zijn er precies 100 openingen deze kunnen we weer vullen met de regel
        'G93 R100 t/m R0
        'eerst de tussenstap afronden naar gehele getallen
        Array.Clear()
        tekstbestand.Close()



        ''//De bestandsnaam in een variable zetten
        Dim strFileName As String = Gcode.FileName
        ''//Maak een stream aan om het bestand te kunnen gebruiken
        Dim Stream As New IO.FileStream(strFileName, IO.FileMode.Open)
        ''//Maak een reader aan om het bestand te kunnen openen
        Dim Reader As New IO.StreamReader(Stream)
        ''//Sla de gehele inhoud op in een variable
        Dim Content As String = Reader.ReadToEnd
        ''//Zodat je de reader en de stream zo snel mogelijk weer kan sluiten.
        Reader.Close()
        Stream.Close()

        ''//Zet alle regels in een array
        Dim OldLines() As String = Content.Split(vbCr)
        ''//Hierin gaan we alle nieuwe regels zetten
        Dim NewLines As New List(Of String)
        ''//Een counter toevoegen die bijhoudt of de nieuwe regel ingevoegd moet worden
        Dim Counter As Integer = 0
        ''//Een counter die bijhoudt welke getal er in de regel moet worden gezet
        Dim colorcounter As Integer
        colorcounter = 100
        ''//Een extra functie die op 0 springt als R0 is
        Dim waarde As Integer
        waarde = 1


        'hier moet nu de nieuwe counter komen die het startpunt doorgeeft
        Dim linestartcounter As Integer
        linestartcounter = startcounter


        ''//Loop door alle oude regels heen
        For i As Integer = 0 To OldLines.Count - 1 Step 1

            'startpunt bepalen door hem eerst linstartcounter naa 0 te laten brengen
            If linestartcounter > 0 Then
                linestartcounter = linestartcounter - 1
                NewLines.Add(OldLines(i))
            Else
                'nu is hij daarmee klaar en zou hij het oude deel weer op moeten pakken
                If Counter = tussenstap Then
                    ''//Als de counter gelijk is aan de tussenstap is moet er een extra lijn in
                    NewLines.Add(vbCrLf & "G93 R" & colorcounter)
                    colorcounter = colorcounter - waarde
                    ''Als de colorcounter 0 is mag hij niet verder zakken anders gaan we 
                    ''negatieve getallen invoeren. 
                    If colorcounter = 0 Then
                        waarde = 0
                    End If
                    ''//En moet de counter weer naar 0
                    Counter = 0
                End If
                ''//En de oude lijn moet er sowieso weer in
                NewLines.Add(OldLines(i))
                ''//En de counter moet 1 omhoog
                Counter += 1
            End If
        Next

        ''//Een list (of array) kunnen we niet naar een tekstbestand schrijven
        ''//dus we maken er weer een string van
        Dim NewContent As String = Join(NewLines.ToArray, vbCr)

        ''//Om te schijven maken we weer een stream aan, alleen zorgen we nu
        ''//meteen dat het bestand helemaal leeg is ("IO.FileMode.Truncate")
        Dim fe As New SaveFileDialog
        ''//Title en Filter instellen
        fe.Title = "Open File..."
        fe.Filter = "All Files (*.*)|*.*"

        ''//De dialog weergeven
        Dim Savepoint As DialogResult = fe.ShowDialog()
        If Not Savepoint = DialogResult.OK Then
            ''//Als het resultaat niet OK is, stoppen
            MsgBox("No save location set, program is restarting")
            Application.Restart()
            Exit Sub

        End If
        MsgBox("Writing file, please wait a second")
        ''//De bestandsnaam in een variable zetten
        Dim strNewFileName As String = fe.FileName
        strNewFileName = strNewFileName + (".gcode")

        Dim filepath As String = strNewFileName
        If Not System.IO.File.Exists(filepath) Then
            System.IO.File.Create(filepath).Dispose()
        End If

        Stream = New IO.FileStream(strNewFileName, IO.FileMode.Truncate)
        ''//En nu moeten we schrijven, dus geen reader maar een writer
        Dim Writer As New IO.StreamWriter(Stream)
        ''//Het schrijven zelf
        Writer.Write(NewContent)
        ''//En weer sluiten
        Writer.Close()
        Stream.Close()

        MsgBox("Done!")
        Return
    End Sub

In iedergeval bedankt voor je tijd. Ik denk dat ik dit programma zo laat. Nu ga ik aan een nieuwe versie beginnen die op de hoogte van het z as af gaat. Eventueel kan ik wel een keer een gcode en foto uploaden van wat het programma precies doet.

Groet,

Slice
 
Laatst bewerkt:
Hoi,

Persoonlijk zou ik de 2 codes combineren. Dan hoef je niet 2x door alle regels te lopen. En je moet toch nog eens goed kijken naar de documentatie van Format... Je gebruikt het nu op een manier die niet werkt...

Ik heb zelf het grootste deel van vb.net geleerd met behulp van dit boek en internet. Maar ook juist vooral door goed naar voorbeelden te kijken en zelf dingen te proberen. (Ik zou nu zelf zeggen dat een boek niet perse nodig is, als je maar genoeg oefening krijgt en er mensen zijn die je helpen).

Als ik jou was zou ik ook nog even goed kijken naar de code die je nu hebt. Er zijn een aantal dingen die er dubbel in zitten, wat helemaal niet nodig is (in dit geval). Ook zou ik als ik jou was nog even kijken naar waar de comments nu precies staan, vooral ook omdat je later misschien nog van plan bent een soortgelijk programma te maken en het dan dus wel handig kan zijn als je goed weet welke code wat doet.

Voor je nieuwe code: Bedenk eerst goed wat er moet gebeuren en wanneer het het handigst is om te hebben. Dus dat je niet in een situatie komt waarin 2 loops staan waar er slechts een nodig is.

MartinJM

PS: Van naar je eigen code kijken kan je ook veel leren. Dan kan je goed leren van je eigen fouten.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan