CSV to DXF Converter
Posted: Wed Dec 23, 2009 10:54 pm
This is a small tool I made today to convert CSV into AutoCAD DXF files. Currently it converts only points. It's not the greatest code in the world, but if you can use it that's awesome.
Todo:
1. Add layer selection
2. Add optional text attributes
3. Better error trapping
Todo:
1. Add layer selection
2. Add optional text attributes
3. Better error trapping
Code: Select all
Enumeration
#Window
#Browse
#Select
#Convert
#Input
#Output
#Header
#Northing
#Easting
#TxtNorthing
#TxtEasting
#Progress
EndEnumeration
Declare BrowseFile()
Declare SelectFile()
Declare Convert()
Declare UpdateComboBoxes(CSVFile$)
Declare.s StartDXF()
Declare.s CloseDXF()
If OpenWindow(#Window, 0, 0, 405, 340, "CSV to DXF Converter", #PB_Window_ScreenCentered | #PB_Window_SystemMenu)
Frame3DGadget(#PB_Any, 15, 15, 375, 105, "Input File")
StringGadget(#Input, 35, 45, 250, 25, "")
ButtonGadget(#Browse, 290, 45, 80, 25, "Browse")
CheckBoxGadget(#Header, 35, 85, 120, 20, "First row is heading")
Frame3DGadget(#PB_Any, 15, 135, 375, 125, "Output File")
StringGadget(#Output, 35, 165, 250, 25, "")
ButtonGadget(#Select, 290, 165, 80, 25, "Select")
TextGadget(#TxtNorthing, 35, 205, 100, 15, "Northing")
TextGadget(#TxtEasting, 150, 205, 100, 15, "Easting")
ComboBoxGadget(#Northing, 35, 220, 100, 20)
ComboBoxGadget(#Easting, 150, 220, 100, 20)
ProgressBarGadget(#Progress, 15, 305, 200, 20, 0, 100)
ButtonGadget(#Convert, 310, 300, 80, 25, "Convert")
DisableGadget(#Input, #True)
DisableGadget(#Output, #True)
HideGadget(#Progress, #True)
Repeat
Event.l = WaitWindowEvent()
Select Event.l
Case #PB_Event_CloseWindow
Quit.l = #True
Case #PB_Event_Gadget
Select EventGadget()
Case #Browse: BrowseFile()
Case #Select: SelectFile()
Case #Convert: Convert()
EndSelect
EndSelect
Until Quit.l = #True
End
EndIf
Procedure BrowseFile()
Protected File$
File$ = OpenFileRequester("Select Input File", "", "CSV Files (*.csv)|*.csv;", 0)
If File$
SetGadgetText(#Input, File$)
UpdateComboBoxes(File$)
EndIf
EndProcedure
Procedure SelectFile()
Protected File$
File$ = SaveFileRequester("Select Output File", "", "DXF Files (*.dxf)|*.dxf;", 0)
If File$
SetGadgetText(#Output, File$)
EndIf
EndProcedure
Procedure Convert()
Protected OpenFile.l, SaveFile.l, Line$, ErrorVal.l = 0, FileLength.l, TotalRead.l, Result.l, Error$
If GetGadgetText(#Input) = ""
Error$ + "- No input file specified" + Chr(10)
EndIf
If GetGadgetText(#Output) = ""
Error$ + "- No output file specified" + Chr(10)
EndIf
If GetGadgetState(#Northing) = -1
Error$ + "- Northing coordinate mapping" + Chr(10)
EndIf
If GetGadgetState(#easting) = -1
Error$ + "- Easting coordinate mapping" + Chr(10)
EndIf
If Error$
MessageRequester("Error", "Please correct the following errors:" + Chr(10) + Chr(10) + Error$, #MB_ICONERROR)
ProcedureReturn
EndIf
OpenFile.l = ReadFile(#PB_Any, GetGadgetText(#Input))
SaveFile.l = CreateFile(#PB_Any, GetGadgetText(#Output))
If OpenFile.l
While Eof(OpenFile.l) = #False
FileLength.l + 1
ReadString(OpenFile.l)
Wend
FileSeek(OpenFile.l, 0)
SetGadgetAttribute(#Progress, #PB_ProgressBar_Minimum, 0)
SetGadgetAttribute(#Progress, #PB_ProgressBar_Maximum, FileLength.l)
HideGadget(#Progress, #False)
If SaveFile.l
WriteStringN(SaveFile.l, StartDXF())
If GetGadgetState(#Header)
Line$ = ReadString(OpenFile.l)
TotalRead.l = Len(Line$)
SetGadgetState(#Progress, TotalRead.l)
EndIf
While Eof(OpenFile.l) = #False
Line$ = ReadString(OpenFile.l)
TotalRead.l = TotalRead.l + 1
WriteStringN(SaveFile.l, "0")
WriteStringN(SaveFile.l, "POINT")
WriteStringN(SaveFile.l, "8")
WriteStringN(SaveFile.l, "New")
WriteStringN(SaveFile.l, "10")
WriteStringN(SaveFile.l, StringField(Line$, GetGadgetState(#Northing) + 1, ","))
WriteStringN(SaveFile.l, "20")
WriteStringN(SaveFile.l, StringField(Line$, GetGadgetState(#Easting) + 1, ","))
SetGadgetState(#Progress, TotalRead.l)
Wend
WriteString(SaveFile.l, CloseDXF())
CloseFile(SaveFile.l)
MessageRequester("Done", "File conversion was successful!", #MB_ICONINFORMATION)
HideGadget(#Progress, #True)
SetGadgetText(#Input, "")
SetGadgetText(#Output, "")
ClearGadgetItems(#Northing)
ClearGadgetItems(#Easting)
EndIf
CloseFile(OpenFile.l)
EndIf
EndProcedure
Procedure UpdateComboBoxes(CSVFile$)
Protected File.l, Line$, Num.l
ClearGadgetItems(#Northing)
ClearGadgetItems(#Easting)
File.l = ReadFile(#PB_Any, CSVFile$)
If File.l
Line$ = ReadString(File.l)
Num.l = CountString(Line$, ",")
For x = 1 To Num.l + 1
AddGadgetItem(#Northing, -1, StringField(Line$, x, ","))
AddGadgetItem(#Easting, -1, StringField(Line$, x, ","))
Next
CloseFile(File.l)
EndIf
EndProcedure
Procedure.s StartDXF()
ProcedureReturn "0" + Chr(10) + "SECTION" + Chr(10) + "2" + Chr(10) + "ENTITIES"
EndProcedure
Procedure.s CloseDXF()
ProcedureReturn "0" + Chr(10) + "ENDSEC" + Chr(10) + "0" + Chr(10) + "EOF"
EndProcedure