Benutzer mit den meisten Antworten
how to create a dxf file with vb2008

Frage
-
Hello, can anybody help me ? I want to create a dxf file out of vb2008. Does anybody know how to achieve this. I have calculated my coordinates in vb2008 and i show them in a picturebox, but i also want to make a dxf file to show the graphic in a cad program.
Thank you for helping me
rabarberpapa
Antworten
-
Der Aufwand für die wichtigsten Elemente ist recht einfach. Ich weiß nicht, ob Nemetschek nur mit einer Entities-Section klarkommt. Wenn das so ist, dann kann ich ja mal meine Klasse auf meine Homepage hochladen. Diese enthält Methoden für die Ausgane von Punkten, Linien, Kreisen, Polylinien und Blöcken.
--
Peter- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 17. November 2009 08:48
-
Hallo rabarberpapa,
>> gibt es also keine vorgefertigten Klassen in VB 2008
Gibt es schon, ist aber Shareware und kostet 109 Euro:
http://www.cadsofttools.de/products/cad_import_.net.html
Schöne Grüße
Oliver- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 17. November 2009 08:48
-
Hallo Peter,
also das mit den Klassen nur mal zur Ansicht wär super. Ich hab mir das Buch "dxf Standard" gekauft und denk auch das sowas möglich wäre. Hätte ich aber einen Anhaltspunkt, wär`s noch besser.
Oliver, danke für den Tip mit den gekauften Klassen. Mich packt nun aber der Ehrgeiz und wills selber machen.
Eine Sache ist da aber im Umkehrschluss wieder, die tatsächlich für eine gekaufte Klasse mit Darstellungsmöglichkeit spricht:
Wenn ich eine Grafik, eine technische Zeichnung mit Massen usw. in einer picturebox ausgeben möchte, tue ich mir ja schon fast leichter, diese Zeichnung in einer dxf Datei zu generieren, mit formatierten Masslinien und allem was dazu gehört, und diese dann wieder in einem dxf viewer im vb anzeigen zu lassen.
Masslinien udgl sind ja wirklich sehr schwer zu generieren in einer vb picturebox.
Robert, aus der Sache mit solidworks bin ich noch nicht richtig schlau geworden. Schau ich mir aber auch noch genauer an.
Danke nochmals vielmals für Euer Engagement
gruss Stefan alias rabarberpapa
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 17. November 2009 08:48
-
Hier mal ein paar Auszüge aus meiner Lösung.
Basis ein ein MustInherit-Klasse mit Farb- und Layerzuordnung und einer "Basis"-Koordinate:
Imports System.Text ''' <summary> ''' Drawing element base class ''' </summary> ''' <remarks></remarks> Public MustInherit Class DElement Private _color As Integer = Integer.MinValue ''' <summary> ''' Color, group code 62 ''' </summary> ''' <value> ''' ByLayer: Integer.MinValue, no output ''' ByBlock: 0 ''' </value> ''' <returns></returns> ''' <remarks></remarks> Public Property Color() As String Get If Me._color < 0 Then Return "ByLayer" ElseIf Me._color = 0 Then Return "ByBlock" Else Return Me._color.ToString End If End Get Set(ByVal value As String) Dim n As Integer = 0 If value = "ByLayer" Then Me._color = Integer.MinValue ElseIf value = "ByBlock" Then Me._color = 0 ElseIf IsNumeric(value) _ AndAlso Integer.TryParse(value, n) _ AndAlso n > 0 AndAlso n < 256 Then Me._color = n Else Throw New Exception("inavalid color") End If End Set End Property Private _layer As String = "0" ''' <summary> ''' Layer, group code 8 ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> Public Property Layer() As String Get Return _layer End Get Set(ByVal value As String) _layer = value End Set End Property Private _x As Double = 0 Public Property X() As Double Get Return _x End Get Set(ByVal value As Double) _x = value End Set End Property Private _y As Double = 0 Public Property Y() As Double Get Return _y End Get Set(ByVal value As Double) _y = value End Set End Property Private _z As Double = 0 Public Property Z() As Double Get Return _z End Get Set(ByVal value As Double) _z = value End Set End Property Public Overridable Function DXFOut() As String Dim sb As New StringBuilder ' Layer sb.Append(String.Format("8{0}{1}{0}", Environment.NewLine, Layer)) ' Color If Me._color >= 0 Then sb.Append(String.Format("62{0}{1}{0}", Environment.NewLine, Me._color)) End If Return sb.ToString End Function End Class
Danach kommt beispielsweise eine Linie:
Imports System.Text Public Class DLine Inherits DElement Private _x2 As Double = 0 Public Property X2() As Double Get Return _x2 End Get Set(ByVal value As Double) _x2 = value End Set End Property Private _y2 As Double = 0 Public Property Y2() As Double Get Return _y2 End Get Set(ByVal value As Double) _y2 = value End Set End Property Private _z2 As Double = 0 Public Property Z2() As Double Get Return _z2 End Get Set(ByVal value As Double) _z2 = value End Set End Property Public Overrides Function DXFOut() As String Dim sb As New StringBuilder ' Layer sb.Append(String.Format("0{0}LINE{0}", Environment.NewLine)) sb.Append(MyBase.DXFOut()) ' startpoint sb.Append(String.Format(System.Globalization.CultureInfo.InvariantCulture, _ "10{0}{1}{0}20{0}{2}{0}30{0}{3}{0}", _ Environment.NewLine, _ Me.X, Me.Y, Me.Z)) ' endpoint sb.Append(String.Format(System.Globalization.CultureInfo.InvariantCulture, _ "11{0}{1}{0}21{0}{2}{0}31{0}{3}{0}", _ Environment.NewLine, _ Me.X2, Me.Y2, Me.Z2)) Return sb.ToString End Function Public Overrides Function ToString() As String Return "Line" End Function End Class
Und ein Text:
Imports System.Text Public Class DText Inherits DElement Private _contents As String = "" ''' <summary> ''' text content group code 1 ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> Public Property Contents() As String Get Return _contents End Get Set(ByVal value As String) _contents = value End Set End Property Private _height As Double = 1 Public Property Height() As Double Get Return _height End Get Set(ByVal value As Double) _height = value End Set End Property Public Overrides Function DXFOut() As String Dim sb As New StringBuilder ' Layer sb.Append(String.Format("0{0}TEXT{0}", Environment.NewLine)) sb.Append(MyBase.DXFOut()) ' startpoint sb.Append(String.Format(System.Globalization.CultureInfo.InvariantCulture, _ "10{0}{1}{0}20{0}{2}{0}30{0}{3}{0}40{0}{4}{0}", _ Environment.NewLine, _ Me.X, Me.Y, Me.Z, Me._height)) sb.Append(String.Format("1{0}{1}{0}", Environment.NewLine, Me._contents)) Return sb.ToString End Function Public Overrides Function ToString() As String Return "Text" End Function End Class
Verwaltet werden die einzelnen Zeuíchnungsobjekte in einer DisplayList:
Imports System.Text Public Class DisplayList Inherits List(Of DElement) Public Function DXFOut() As String Dim sb As New StringBuilder ' Layer sb.Append(String.Format("0{0}SECTION{0}", Environment.NewLine)) sb.Append(String.Format("2{0}ENTITIES{0}", Environment.NewLine)) For Each de In Me sb.Append(de.DXFOut) Next sb.Append(String.Format("0{0}ENDSEC{0}", Environment.NewLine)) sb.Append(String.Format("0{0}EOF{0}", Environment.NewLine)) Return sb.ToString End Function End Class
Über die DXFOut-Methode wird das DXF als Zeichenkette erzeugt. Für große Dateien kann man auch mit einem IO.Stream arbeiten. Zur Verwaltung der DisplayList lann man eine ListBox und ein PropertyGrid nutzen.
--
Peter- Als Antwort vorgeschlagen Peter Fleischer Montag, 14. Dezember 2009 22:45
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 17. Dezember 2009 10:19
Alle Antworten
-
Hallo rabarberpapa,
diesmal bist Du im deutschen Forum gelandet, also bitte deutsch posten. Welches dxf - Format meinst Du (Autodesk, Addobe ...)? Dxf ist in der Regel ein ASCII File (also Text), kann aber auch als Binärformat vorkommen.
Schöne Grüße
Oliver -
Wie Oliver schon geschrieben hat, gibt es DXF auch im Textformat. Da braucht man nur entsprechend Spezifikation zu schreiben. Jedes Element besteht aus 2 Zeilen, einer "Nummer" entsprechend Typ in der ersten Zeile und dem dazugehörenden Wert in der 2. Zeile. Zeichenobjekte bestehen aus mehreren Elementen. Für einige Zeichnobjekte (Line, Polyline, Point usw.) habe ich mir einfach eine Bibliothek gebaut. der Aufwand wird erst größer, wenn mit Blöcken und 3D-Objekten gearbeitet wird.
--
Peter -
Gepostet auch hier: http://www.dreamincode.net/forums/showtopic135756.htm
-
Hallo Oliver,Peter und Robert
danke erstmal für Eure Hilfe. Ich möchte das dxf file in Nemetschek auslesen und dabei den dxf Standard von Autodesk verwenden.
Euren Antworten zu entnehmen, gibt es also keine vorgefertigten Klassen in VB 2008, so dass ich mir selber einen Parser entwickeln muss, der mir das dxf File erzeugt und die notwendigen ASCI Zeichenfolgen generiert und reinschreibt.
Ich bedanke mich sehr für Eure Hilfe
Gruss rabarberpapa
-
Hallo rabarberpapa,
Kann Dir das weiterhelfen?
https://forum.solidworks.com/thread/12186;jsessionid=C893AC24DFD676828D76FAB246AFE96E.node0?tstart=1
Grüße,
Robert
-
Hallo rabarberpapa,
>> gibt es also keine vorgefertigten Klassen in VB 2008
Gibt es schon, ist aber Shareware und kostet 109 Euro:
http://www.cadsofttools.de/products/cad_import_.net.html
Schöne Grüße
Oliver- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 17. November 2009 08:48
-
Der Aufwand für die wichtigsten Elemente ist recht einfach. Ich weiß nicht, ob Nemetschek nur mit einer Entities-Section klarkommt. Wenn das so ist, dann kann ich ja mal meine Klasse auf meine Homepage hochladen. Diese enthält Methoden für die Ausgane von Punkten, Linien, Kreisen, Polylinien und Blöcken.
--
Peter- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 17. November 2009 08:48
-
Hallo Peter,
also das mit den Klassen nur mal zur Ansicht wär super. Ich hab mir das Buch "dxf Standard" gekauft und denk auch das sowas möglich wäre. Hätte ich aber einen Anhaltspunkt, wär`s noch besser.
Oliver, danke für den Tip mit den gekauften Klassen. Mich packt nun aber der Ehrgeiz und wills selber machen.
Eine Sache ist da aber im Umkehrschluss wieder, die tatsächlich für eine gekaufte Klasse mit Darstellungsmöglichkeit spricht:
Wenn ich eine Grafik, eine technische Zeichnung mit Massen usw. in einer picturebox ausgeben möchte, tue ich mir ja schon fast leichter, diese Zeichnung in einer dxf Datei zu generieren, mit formatierten Masslinien und allem was dazu gehört, und diese dann wieder in einem dxf viewer im vb anzeigen zu lassen.
Masslinien udgl sind ja wirklich sehr schwer zu generieren in einer vb picturebox.
Robert, aus der Sache mit solidworks bin ich noch nicht richtig schlau geworden. Schau ich mir aber auch noch genauer an.
Danke nochmals vielmals für Euer Engagement
gruss Stefan alias rabarberpapa
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 17. November 2009 08:48
-
Hallo Oliver,
Was anderes noch, ich hab mich jetzt mal umgeschaut und finde als einziges preisgünstiges
dxf export Programm CadLib von WoutWare. Kann man so was kaufen, oder besser die
Finger weg lassen weil selber machen auch geht, wie Peter unten beschrieben hat.
Danke und Gruss
rabarberpapa -
Hier mal ein paar Auszüge aus meiner Lösung.
Basis ein ein MustInherit-Klasse mit Farb- und Layerzuordnung und einer "Basis"-Koordinate:
Imports System.Text ''' <summary> ''' Drawing element base class ''' </summary> ''' <remarks></remarks> Public MustInherit Class DElement Private _color As Integer = Integer.MinValue ''' <summary> ''' Color, group code 62 ''' </summary> ''' <value> ''' ByLayer: Integer.MinValue, no output ''' ByBlock: 0 ''' </value> ''' <returns></returns> ''' <remarks></remarks> Public Property Color() As String Get If Me._color < 0 Then Return "ByLayer" ElseIf Me._color = 0 Then Return "ByBlock" Else Return Me._color.ToString End If End Get Set(ByVal value As String) Dim n As Integer = 0 If value = "ByLayer" Then Me._color = Integer.MinValue ElseIf value = "ByBlock" Then Me._color = 0 ElseIf IsNumeric(value) _ AndAlso Integer.TryParse(value, n) _ AndAlso n > 0 AndAlso n < 256 Then Me._color = n Else Throw New Exception("inavalid color") End If End Set End Property Private _layer As String = "0" ''' <summary> ''' Layer, group code 8 ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> Public Property Layer() As String Get Return _layer End Get Set(ByVal value As String) _layer = value End Set End Property Private _x As Double = 0 Public Property X() As Double Get Return _x End Get Set(ByVal value As Double) _x = value End Set End Property Private _y As Double = 0 Public Property Y() As Double Get Return _y End Get Set(ByVal value As Double) _y = value End Set End Property Private _z As Double = 0 Public Property Z() As Double Get Return _z End Get Set(ByVal value As Double) _z = value End Set End Property Public Overridable Function DXFOut() As String Dim sb As New StringBuilder ' Layer sb.Append(String.Format("8{0}{1}{0}", Environment.NewLine, Layer)) ' Color If Me._color >= 0 Then sb.Append(String.Format("62{0}{1}{0}", Environment.NewLine, Me._color)) End If Return sb.ToString End Function End Class
Danach kommt beispielsweise eine Linie:
Imports System.Text Public Class DLine Inherits DElement Private _x2 As Double = 0 Public Property X2() As Double Get Return _x2 End Get Set(ByVal value As Double) _x2 = value End Set End Property Private _y2 As Double = 0 Public Property Y2() As Double Get Return _y2 End Get Set(ByVal value As Double) _y2 = value End Set End Property Private _z2 As Double = 0 Public Property Z2() As Double Get Return _z2 End Get Set(ByVal value As Double) _z2 = value End Set End Property Public Overrides Function DXFOut() As String Dim sb As New StringBuilder ' Layer sb.Append(String.Format("0{0}LINE{0}", Environment.NewLine)) sb.Append(MyBase.DXFOut()) ' startpoint sb.Append(String.Format(System.Globalization.CultureInfo.InvariantCulture, _ "10{0}{1}{0}20{0}{2}{0}30{0}{3}{0}", _ Environment.NewLine, _ Me.X, Me.Y, Me.Z)) ' endpoint sb.Append(String.Format(System.Globalization.CultureInfo.InvariantCulture, _ "11{0}{1}{0}21{0}{2}{0}31{0}{3}{0}", _ Environment.NewLine, _ Me.X2, Me.Y2, Me.Z2)) Return sb.ToString End Function Public Overrides Function ToString() As String Return "Line" End Function End Class
Und ein Text:
Imports System.Text Public Class DText Inherits DElement Private _contents As String = "" ''' <summary> ''' text content group code 1 ''' </summary> ''' <value></value> ''' <returns></returns> ''' <remarks></remarks> Public Property Contents() As String Get Return _contents End Get Set(ByVal value As String) _contents = value End Set End Property Private _height As Double = 1 Public Property Height() As Double Get Return _height End Get Set(ByVal value As Double) _height = value End Set End Property Public Overrides Function DXFOut() As String Dim sb As New StringBuilder ' Layer sb.Append(String.Format("0{0}TEXT{0}", Environment.NewLine)) sb.Append(MyBase.DXFOut()) ' startpoint sb.Append(String.Format(System.Globalization.CultureInfo.InvariantCulture, _ "10{0}{1}{0}20{0}{2}{0}30{0}{3}{0}40{0}{4}{0}", _ Environment.NewLine, _ Me.X, Me.Y, Me.Z, Me._height)) sb.Append(String.Format("1{0}{1}{0}", Environment.NewLine, Me._contents)) Return sb.ToString End Function Public Overrides Function ToString() As String Return "Text" End Function End Class
Verwaltet werden die einzelnen Zeuíchnungsobjekte in einer DisplayList:
Imports System.Text Public Class DisplayList Inherits List(Of DElement) Public Function DXFOut() As String Dim sb As New StringBuilder ' Layer sb.Append(String.Format("0{0}SECTION{0}", Environment.NewLine)) sb.Append(String.Format("2{0}ENTITIES{0}", Environment.NewLine)) For Each de In Me sb.Append(de.DXFOut) Next sb.Append(String.Format("0{0}ENDSEC{0}", Environment.NewLine)) sb.Append(String.Format("0{0}EOF{0}", Environment.NewLine)) Return sb.ToString End Function End Class
Über die DXFOut-Methode wird das DXF als Zeichenkette erzeugt. Für große Dateien kann man auch mit einem IO.Stream arbeiten. Zur Verwaltung der DisplayList lann man eine ListBox und ein PropertyGrid nutzen.
--
Peter- Als Antwort vorgeschlagen Peter Fleischer Montag, 14. Dezember 2009 22:45
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 17. Dezember 2009 10:19