' Converts IsoMap format ASCII grid file exported by Kingdom Suite ' into Surfer binary format grid. ' Optionally binary formatted fault file can be concatenated onto the grid file Sub Main 'Get existing Surfer instance, or create a new one If none exists. Dim SurferRunning As Boolean On Error Resume Next 'Turn off error reporting. Set surf = GetObject(,"Surfer.Application") SurferRunning = True If Err.Number<>0 Then Set surf = CreateObject("Surfer.Application") SurferRunning = False End If On Error GoTo 0 'Turn on error reporting. surf.Visible = False ' Declare string variables to hold file paths Dim InGridFileName As String Dim InFaultFileName As String Dim InFileStem As String Dim TempFile1Name As String Dim TempFile2Name As String Dim OutGridFileName As String Dim FileNamePath As String ' Get name for input grid file InGridFileName = GetFilePath(,"grd",,"Open Kingdom Suite ISOMAP FORMAT Grid File",0) If InGridFileName = "" Then Debug.Print "No file name entered. Programme exiting..." End End If Debug.Print vbCrLf; "STARTING PROCESSING OF "; InGridFileName; vbCrLf;"==========================";Time;"=========================" InFileStem = Left$(InGridFileName,InStrRev(InGridFileName,".")-1) ' Extract default directory from InGridFileName FileNamePath = Left$(InGridFileName,InStrRev(InGridFileName,"\")) ' Get name for input fault file InFaultFileName = GetFilePath(,"*",FileNamePath,"Open BINARY CODED Fault File to use with grid",0) Dim AreFaults As Boolean If InFaultFileName = "" Then AreFaults = False Else AreFaults = True End If ' Create file names TempFile1Name = FileNamePath + "tempout1.grd" TempFile2Name = FileNamePath + "tempout2.grd" OutGridFileName = InFileStem + "_srf7.grd" 'Debug.Print FileNamePath 'Debug.Print TempFile1Name 'Debug.Print TempFile2Name 'Debug.Print OutGridFileName Debug.Print "Fault file name: " + InFaultFileName ' Replacing header of Kingdom Format grid file Dim params(6) As String Dim xmin As Double, xmax As Double, ymin As Double, ymax As Double Dim nrows, ncols As Long Dim cntr As Integer Dim Read_Record As String ' Open SMT IsoMap format grid file and extract parameters from header Open InGridFileName For Input As #1 ' Skip first six lines and parse 7th For i = 1 To 7 Line Input #1,Read_Record Next nrows = CInt(Split(Read_Record,",")(0)) ncols = CInt(Split(Read_Record,",")(1)) xmin = CDbl(Split(Read_Record,",")(2)) xmax = CDbl(Split(Read_Record,",")(3)) ymin = CDbl(Split(Read_Record,",")(4)) ymax = CDbl(Split(Read_Record,",")(5)) ' Read next two lines to get to start of data Line Input #1,Read_Record Line Input #1,Read_Record ' Open Temporary file to write GSI header Open TempFile2Name For Output As #2 Dim Written_Record As String Written_Record = "DSAA" Print #2, Written_Record Written_Record = CStr(nrows) + " " + CStr(ncols) Print #2, Written_Record Written_Record = CStr(ymin) + " " + CStr(ymax) Print #2, Written_Record Written_Record = CStr(xmin) + " " + CStr(xmax) Print #2, Written_Record Print #2, "0 1E+30" ' Output rest of the file to temporary output file While Not EOF(1) Line Input #1,Read_Record Print #2, Read_Record Wend Close #1 Close #2 Set GridIn1 = surf.NewGrid GridIn1.LoadFile(TempFile2Name, HeaderOnly:=False) ' Rotate grid by 270degrees Debug.Print "Rotating grid..." surf.GridTransform(InGrid:=TempFile2Name, Operation:=srfGridTransRotate, _ Rotation:=270, OutGrid:=TempFile1Name, OutFmt:=srfGridFmtS7) ' Load first temporary grid Set GridIn2 = surf.NewGrid GridIn2.LoadFile(TempFile1Name, HeaderOnly:=False) 'Substitute SMT null 1E30 for GSI null 1.70141e+038 Debug.Print "Replacing NULL values..." surf.GridMath(Function:="C = if(A=0.1E+31, 1.70141e+038,A)", InGridA:=TempFile1Name, _ OutGridC:= OutGridFileName, OutFmt:=srfGridFmtS7) ' Append binary coded faults to grid file If AreFaults Then Debug.Print "Appending binary faults" Dim PosPointer As Long Dim FaultLen As Long ReDim BinFaults(FileLen(InFaultFileName)) As Byte Open OutGridFileName For Binary As #3 Open InFaultFileName For Binary As #4 ' Set pointer to end of file PosPointer = FileLen(OutGridFileName) + 1 Seek #3, PosPointer 'Read to end of faults file into byte array BinFaults Get #4, , BinFaults Put #3, , BinFaults Close #3 Close #4 End If Wait 5 Kill TempFile1Name Kill TempFile2Name If SurferRunning = False Then surf.Quit Else surf.Visible = True End If Debug.Print "Finished." End Sub