B4A Class a simple DXF class

DXF is a text-based standard for CAD file exchange, featuring a well-organized format that's programmer-friendly.I've created this class for basic DXF file generation in my application. Currently it supports just three drawing methods: AddCircle, AddPolyline, and AddLine. Sample usage is provided within the class.This is just a simple and incomplete class that I throw at the bricks.


1000010750.jpg
 

Attachments

  • DxfHelperSimple.bas
    3.5 KB · Views: 106
Last edited:

peacemaker

Expert
Licensed User
Longtime User
Thanks ! This is example for B4J:

B4X:
'This event will be called once, before the page becomes visible.
Private Sub B4XPage_Created (Root1 As B4XView)
    Root = Root1
    Root.LoadLayout("MainPage")
   
    dxf.Initialize
    Dim m As ModelClass
    m.Initialize
    m.cncDuanBan = 10
    m.cncJiaGongMian = 20
    m.cncZuanTou = 15
    Dim L As List
    L.Initialize
    For i = 0 To 9
        Dim p As cPoint
        p.Initialize
        p.x = i * 10
        p.y = Rnd(20, 50)
        L.Add(p)
    Next
    m.cncPoints = L
    dxf.GenerateSampleDXF
    dxf.CreateDxf(m)
End Sub

B4X:
Sub Class_Globals
' Class global variables
    Type ModelClass (cncDuanBan As Double, cncJiaGongMian As Double, cncZuanTou As Double, cncPoints As List)
    Type cPoint (x As Double, y As Double)
End Sub


Public Sub Initialize
' Initialization method
End Sub

'Create DXF file
Public Sub CreateDxf(model As ModelClass)
    Dim writer As TextWriter
    writer.Initialize(File.OpenOutput( File.DirApp, "cnc.dxf", False))
    WriteHerader(writer)
    ' Add outlines
    AddCircle(writer, 0, 0, model.cncDuanBan/2)      ' End plate outer diameter
    AddCircle(writer, 0, 0, model.cncJiaGongMian/2)      ' Machinable surface circle
    'Add small circles
    For Each p As cPoint In model.cncPoints
        AddCircle(writer, p.x, p.y, model.cncZuanTou/2)      ' Center circle
    Next
    WriteFooter(writer)
    'Close file writer
    writer.Close
    Log(File.Combine(File.DirApp, "cnc.dxf"))
End Sub

'Write file header
Private Sub WriteHerader(writer As TextWriter)
    ' File header
    writer.WriteLine("0")
    writer.WriteLine("SECTION")
    writer.WriteLine("2")
    writer.WriteLine("ENTITIES")
End Sub

'Write file footer
Private Sub WriteFooter(writer As TextWriter)
    ' File footer
    writer.WriteLine("0")
    writer.WriteLine("ENDSEC")
    writer.WriteLine("0")
    writer.WriteLine("EOF")
End Sub

Public Sub GenerateSampleDXF
    Dim writer As TextWriter
    writer.Initialize(File.OpenOutput( File.DirApp, "sample.dxf", False))
   
    ' File header
    writer.WriteLine("0")
    writer.WriteLine("SECTION")
    writer.WriteLine("2")
    writer.WriteLine("ENTITIES")
   
    ' Add graphics - lines
    AddLine(writer, 0, 0, 100, 0)      ' Bottom horizontal line
    AddLine(writer, 100, 0, 100, 50)   ' Right vertical line
    AddLine(writer, 100, 50, 0, 50)    ' Top horizontal line
    AddLine(writer, 0, 50, 0, 0)       ' Left vertical line
   
    AddCircle(writer, 50, 25, 20)      ' Center circle
   
    Dim polyPoints() As Double =Array As Double (10,10, 90,10, 90,40, 10,40) ' Inner rectangle
    AddPolyline(writer, polyPoints)
   
    ' File footer
    writer.WriteLine("0")
    writer.WriteLine("ENDSEC")
    writer.WriteLine("0")
    writer.WriteLine("EOF")
   
    writer.Close
End Sub

Sub AddLine(writer As TextWriter, x1 As Double, y1 As Double, x2 As Double, y2 As Double)
    writer.WriteLine("0")
    writer.WriteLine("LINE")
    writer.WriteLine("8")     ' Layer group code
    writer.WriteLine("0")     ' Layer name (0 is default)
    writer.WriteLine("10")    ' Start point X
    writer.WriteLine(x1)
    writer.WriteLine("20")    ' Start point Y
    writer.WriteLine(y1)
    writer.WriteLine("11")    ' End point X
    writer.WriteLine(x2)
    writer.WriteLine("21")    ' End point Y
    writer.WriteLine(y2)
End Sub

Sub AddCircle(writer As TextWriter, cx As Double, cy As Double, radius As Double)
    writer.WriteLine("0")
    writer.WriteLine("CIRCLE")
    writer.WriteLine("8")
    writer.WriteLine("0")
    writer.WriteLine("10")    ' Center X
    writer.WriteLine(cx)
    writer.WriteLine("20")    ' Center Y
    writer.WriteLine(cy)
    writer.WriteLine("40")    ' Radius
    writer.WriteLine(radius)
End Sub

Sub AddPolyline(writer As TextWriter, points() As Double)
    ' points array format: [x1,y1, x2,y2, ...]
    writer.WriteLine("0")
    writer.WriteLine("LWPOLYLINE")
    writer.WriteLine("8")
    writer.WriteLine("0")
    writer.WriteLine("90")     ' Vertex count
    writer.WriteLine(points.Length / 2)
    writer.WriteLine("70")     ' Flag (1=closed)
    writer.WriteLine("1")
   
    For i = 0 To points.Length - 1 Step 2
        writer.WriteLine("10")  ' X coordinate
        writer.WriteLine(points(i))
        writer.WriteLine("20")  ' Y coordinate
        writer.WriteLine(points(i+1))
    Next
End Sub
 

Attachments

  • TempDownload.png
    TempDownload.png
    65.5 KB · Views: 122
Last edited:
Top