Page 1 of 1

CSV to DXF Converter

Posted: Wed Dec 23, 2009 10:54 pm
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

Re: CSV to DXF Converter

Posted: Thu Dec 24, 2009 6:17 am
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