CSV to DXF Converter

Developed or developing a new product in PureBasic? Tell the world about it.
mrjiles
Enthusiast
Enthusiast
Posts: 238
Joined: Fri Aug 18, 2006 7:21 pm
Location: IL

CSV to DXF Converter

Post by mrjiles »

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

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
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4954
Joined: Sun Apr 12, 2009 6:27 am

Re: CSV to DXF Converter

Post by RASHAD »

@mrjiles Hi
I presume you are a Civil Engineer right?
Happy new year mate
Keep in touch and let us hear about your progress in your project
And do't forget any new snippets like this one

RASHAD
Egypt my love
Post Reply