DXF-Dateien erstellen

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von Beppo.

    DXF-Dateien erstellen

    Hallo alle zusammen!

    In unserem Betrieb haben wir ein selbst gestricktes Programm welches für verschiedene
    Körper Abwicklungen im DXF-Format ausgibt. Die DXF-Dateien können von einem
    Zeichenprogramm (ProFirst) geöffnet und bearbeitet werden und letztendlich in der
    Werkstatt vom Plasmaschneider automatisch zugeschnitten werden.

    Da das Programm mit Visual Basic 6.0 geschrieben wurde und wir der Zeit nicht ganz
    hinterher sein wollen, habe ich begonnen dass Programm in Visual Basic 2010 neu zu schreiben.
    Momentan als Versuch mit der Express-Version.

    Die DXF-Dateien werden relativ simpel generiert: Der Anfang der Datei liegt in einer Text-Datei und wird
    vom Programm eingelesen und in die zu erstellende Datei kopiert. Dann folgen Linien, Kreise etc. gemäß der
    Abwicklung und zum Schluss wird das DXF-Ende wieder aus einer Datei gelesen und kopiert.

    Das Problem: Die erstellte DXF lässt sich mit dem Zeichenprogramm fehlerfrei öffnen und kann bearbeitet werden.
    NACH dem speichern, lässt sie sich auch in das Zuschnittsprogramm für den Plasmaschneider einlesen.
    Allerdings erst nach dem speichern. Wenn (wie in den meisten Fällen) die Datei unverändert bleiben kann,
    muss ich sie trotzdem zuerst öffnen und neu speichern.

    Das kuriose und weshalb ich gar keine Logik dahinter entdecken kann:
    Wenn mein Programm eine DXF generiert und ich diese mit dem Zeichenprogramm neu abspeichere mit anderem Namen und
    aus der neu abgespeicherten Datei den kompletten Inhalt kopiere und in die ursprüngliche Datei kopiere, kann ich die
    Datei dennoch nicht für die Werkstatt einlesen (mit dem Zeichenprogramm lässt sie sich aber noch öffnen).
    Die Dateien haben dann exakt den gleichen Inhalt und trotzdem geht die ursprüngliche Datei nicht und DXF-Dateien sind
    doch nur Text-Dateien .... ???!!!

    Kann sich jemand vorstellen was das sein könnten? Ideeen?

    Und mittlerweile noch das:
    Jetzt habe ich mir ein kleines Programm gestrickt, das mir zwei Dateien Zeile für
    Zeile vergleicht und wenn Unterschiede auftreten auflistet. Und siehe da,
    zwischen funktionierender Datei aus meinem VB6-Programm und der nicht funktionierenden
    Datei aus meinem VB 2010-Programm gibt es keinerlei Unterschied.

    Confused Wo soll denn dann der Unterschied sein, der die funktionierende Datei zur anderen
    unterscheidet?



    Vielen Dank schonmal,

    Gruß Beppo


    DXF-Anfang einlesen:

    Quellcode

    1. Public Sub dxfanfang(ByVal dateiname As String)
    2. 'dxf-anfang aus datei laden
    3. Dim dxfanfang As String
    4. dxfanfang = My.Computer.FileSystem.ReadAllText(Hauptmenü.txtdxf.Text & "dxf-anfang.txt")
    5. 'dxf-anfang schreiben
    6. My.Computer.FileSystem.WriteAllText(Hauptmenü.txtdateien.Text & dateiname & ".dxf", dxfanfang & vbCrLf, False)
    7. End Sub


    DXF-Linie:

    Quellcode

    1. Dim file As System.IO.StreamWriter
    2. file = My.Computer.FileSystem.OpenTextFileWriter(Hauptmenü.txtdateien.Text & dateiname & ".dxf", True)
    3. file.WriteLine(" 0")
    4. file.WriteLine("LINE")
    5. file.WriteLine(" 5")
    6. file.WriteLine(n) 'nummer
    7. file.WriteLine("100")
    8. file.WriteLine("AcDbEntity")
    9. file.WriteLine(" 8")
    10. file.WriteLine("0")
    11. file.WriteLine("100")
    12. file.WriteLine("AcDbLine")
    13. file.WriteLine(" 62")
    14. file.WriteLine("93")
    15. file.WriteLine(" 6")
    16. file.WriteLine("CONTINUOUS")
    17. file.WriteLine(" 10")
    18. file.WriteLine(Replace(x1, ",", ".")) 'x-koordinate start
    19. file.WriteLine(" 20")
    20. file.WriteLine(Replace(y1, ",", ".")) 'y-koordinate start
    21. file.WriteLine(" 11")
    22. file.WriteLine(Replace(x2, ",", ".")) 'x-koordinate ziel
    23. file.WriteLine(" 21")
    24. file.WriteLine(Replace(y2, ",", ".")) 'y-koordinate ziel
    25. file.Close()


    DXF-Ende:

    Quellcode

    1. Public Sub dxfende(ByVal dateiname As String)
    2. 'dxf-ende aus datei laden
    3. Dim dxfende As String
    4. dxfende = My.Computer.FileSystem.ReadAllText(Hauptmenü.txtdxf.Text & "dxf-ende.txt")
    5. 'dxf-ende schreiben
    6. My.Computer.FileSystem.WriteAllText(Hauptmenü.txtdateien.Text & dateiname & ".dxf", dxfende, True)
    7. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Beppo“ ()

    verwende doch für alles einen StreamWriter...:

    VB.NET-Quellcode

    1. 'Aufruf:
    2. Dim file As System.IO.StreamWriter
    3. file = New IO.StreamWriter(IO.Path.Combine(IO.Path.Combine(Hauptmenü.txtdateien.Text, dateiname), ".dxf"), True,System.Text.Encoding.ASCII) ' Hier wurde erweitert
    4. dxfanfang(file)
    5. Line(file)
    6. dxfende(file)
    7. '##############################################
    8. Sub Line(file As IO.StreamWriter)'Methode um Parameter erweitern - aussehen der Linie festlegen
    9. file.WriteLine(" 0")
    10. file.WriteLine("LINE")
    11. file.WriteLine(" 5")
    12. file.WriteLine(n) 'nummer
    13. file.WriteLine("100")
    14. file.WriteLine("AcDbEntity")
    15. file.WriteLine(" 8")
    16. file.WriteLine("0")
    17. file.WriteLine("100")
    18. file.WriteLine("AcDbLine")
    19. file.WriteLine(" 62")
    20. file.WriteLine("93")
    21. file.WriteLine(" 6")
    22. file.WriteLine("CONTINUOUS")
    23. file.WriteLine(" 10")
    24. file.WriteLine(Replace(x1, ",", ".")) 'x-koordinate start
    25. file.WriteLine(" 20")
    26. file.WriteLine(Replace(y1, ",", ".")) 'y-koordinate start
    27. file.WriteLine(" 11")
    28. file.WriteLine(Replace(x2, ",", ".")) 'x-koordinate ziel
    29. file.WriteLine(" 21")
    30. file.WriteLine(Replace(y2, ",", ".")) 'y-koordinate ziel
    31. End Sub
    32. Sub dxfende(str As IO.StreamWriter)
    33. Dim dxfende As String
    34. dxfende = My.Computer.FileSystem.ReadAllText(IO.Path.Combine(Hauptmenü.txtdxf.Text, "dxf-ende.txt"))
    35. str.Write(dxfende);
    36. str.Close()
    37. End Sub
    38. Sub dxfanfang(str As IO.StreamWriter)
    39. 'dxf-anfang aus datei laden
    40. Dim dxfanfang As String
    41. dxfanfang = My.Computer.FileSystem.ReadAllText(IO.Path.Combine(Hauptmenü.txtdxf.Text, "dxf-anfang.txt"))
    42. str.WriteLine(dxfanfang)
    43. End Sub

    Das ganze könnte man nachher noch schön in einer Klasse aufbauen, dann hätte man überall einen Parameter weniger...
    Und dann interessiert mich der Inhalt von dem hier:
    Hauptmenü.txtdxf.Text

    dxfanfang und ende würde ich nicht in einer extra Datei speichern.
    Außerdem verwendet man IO.Path.Combine um Pfade zusammenzufügen...

    Ich sag dem StreamWriter hier, dass er ASCII verwenden soll(Quelle: en.wikipedia.org/wiki/AutoCAD_DXF)

    DXF sind ganz normale ASCII-Dateien.

    Wäre (im Normalfall) ANSI :P bzw. ISO 8859, was der Windows Editor Standardmäßig verwendet
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Hallo und riesen Dank für die beiden Antworten.

    Es lag tatsächlich an der Kodierung und mit dem Zusatz, dass ASCII-Dateien erzeugt werden sollen,
    kann ich die DXF-Dateien sowohl mit dem CAD-Programm als auch mit dem Programm für die Plasmamaschine verwenden :)

    jvbsl:

    Wie man sicher an meinem Code-Ausschnitt erkennt, bin ich kein Meister der Programmierung :)
    Ich habe jetzt eine Muster-DXF, aus der ich sowohl den Anfang als auch das Ende einlese und weiter verwende.

    Beim alten Programm in VB6 hatte ich die komplette DXF im Code mit eingebunden. Aber das waren ja an die 1500 Zeilen und
    von daher finde ich die Lösung mit Dateien wesentlich "schöner".

    Danke für den überarbeiteten Quellcode. Den werde ich mir morgen noch genauer vornehmen. Mein Programmier-Stil ist da
    sicher ausbaufähig :D

    Der Vollständigkeit halber:
    Hauptmenü.txtdxf.Text beinhaltet den Pfad der DXF-Datei, die als Muster für die neue DXF dient. Sie liegt am Server und
    wenn ich irgendwann einen anderen Speicherort für diese Datei bevorzugen sollte, kann ich so ohne Programmänderung "umziehen".

    Also nochmal danke! Da wär ich nicht drauf gekommen und es wäre VB6 geblieben.

    Gruß Beppo