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