none
how to create a dxf file with vb2008 RRS feed

  • 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
    Donnerstag, 5. November 2009 17:17

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

    Samstag, 7. November 2009 07:53
  • 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
    Freitag, 6. November 2009 14:28
  • 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

    Samstag, 7. November 2009 23:03
  • 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
    Montag, 14. Dezember 2009 22:45

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
    Donnerstag, 5. November 2009 18:36
  • 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
    Donnerstag, 5. November 2009 20:05
  • Freitag, 6. November 2009 13:26
    Moderator
  • Hallo Robert,

    und bei MSDN Online in Amerika, dort allerdings in Deutsch.

    Schöne Grüße
    Oliver
    Freitag, 6. November 2009 13:45
  • 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

    Freitag, 6. November 2009 13:48
  • Freitag, 6. November 2009 13:55
    Moderator
  • 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
    Freitag, 6. November 2009 14:28
  • 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

    Samstag, 7. November 2009 07:53
  • 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

    Samstag, 7. November 2009 23:03
  • Hallo Peter,
    war gerade auf Deiner Website, da ist ja ganz schön viel Info da.
    Aber kannst Du vielleicht noch das Beispiel mit den dxf hochladen ? Wäre echt super.
    Danke für die Hilfe
    rabarberpapa
    Donnerstag, 19. November 2009 22:49
  • 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
    Donnerstag, 19. November 2009 22:50
  • 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
    Montag, 14. Dezember 2009 22:45