Ken Patrick - Visual Basic 6 Code Samples

Rhumb-Line Algorithm (VB 6)

'Kenneth Patrick UNCLASSIFIED 06 Jan 1999

Public Const YD_NM As Single = 0.0004937365
Public Const YD_MTRS As Single = 0.9144
Public Const KM_NM As Single = 0.54
Public Const MTRS_YD As Single = 1.094
Public Const MTRS_FT As Single = 3.281
Public Const FT_MTRS As Single = 0.3048
Public Const Pi As Single = 3.1415926535897
Public Const RAD_DGRS As Single = 57.2957795130823
Public Const DGRS_RAD As Single = 0.0174532925199

'32 Bit Sleep Function
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Public Function fnctn_RHUMB(START_LAT As Single, START_LON As Single, CRS As Single, DST As Single, OUTPUT_FRMT As String) As String

'Author Kenneth Patrick AD&D Inc. UNCLASSIFIED
'fnctn_RHUMB
'Created: 06 Jan 1999
'Last Update 16 Apr 1999
'RHUMB LINE ALGORITHM Mid-Latitude sailing Formula From "Dutton's Navigation and Piloting" Adapted to Code
'Equation: (L = DST X cosCRS) (p = DST X sinCRS) (Dlo = p / cosLM)
'Input: "Start LAT (+NORTH/-SOUTH single),Start LON (+EAST/-WEST single), COURSE in Degree's, DISTANCE in Nautical Miles,OUTPUT FORMAT: String"
'Output Formats: "Lat(+/- Single)", "Lon(+/- Single)", "Lon@Lat", "Lon,Lat"

On Error GoTo errorhandler

Dim L As Single
Dim P As Single
Dim LM As Single
Dim COS_LM As Single
Dim DLO As Single
Dim END_LAT As Single
Dim END_LON As Single

L = (DST / 60) * Cos(CRS / RAD_DGRS) 'L used in the equation to figure END_LAT / DLO
P = (DST / 60) * Sin(CRS / RAD_DGRS) 'P used in the equation to Figure DLO
LM = ((L / 2) + START_LAT) / RAD_DGRS 'DLO (step 1)
COS_LM = Cos(LM) 'DLO (step 2)
DLO = P / COS_LM 'DLO (step 3)
END_LAT = Format(START_LAT + L, "###.##########") ' format the Destination Latitude in decimal degrees

Dim v_LAT As Variant
v_LAT = END_LAT
v_LAT = CDec(v_LAT)

If START_LON < 0 Then 'Added to resolve the positive and negative issue with Longitudes
END_LON = Format(DLO + START_LON, "###.##########") ' format the Destination Longitude in decimal degrees
Else
END_LON = Format(START_LON + DLO, "###.##########") ' format the Destination Longitude in decimal degrees
End If

Dim v_LON As Variant
v_LON = END_LON
v_LON = CDec(v_LON)


Select Case OUTPUT_FRMT 'select output type based on input parameter passed to this function
Case "AT"
fnctn_RHUMB = v_LON & "@" & v_LAT 'output 75.56005@12.22208
Case "COMMA"
fnctn_RHUMB = v_LON & "," & v_LAT 'output 75.56005,12.22208
Case "LON"
fnctn_RHUMB = v_LON 'output 75.56005
Case "LAT"
fnctn_RHUMB = v_LAT 'output 12.22208
Case Else
fnctn_RHUMB = ""

End Select
Exit Function

errorhandler:

If Err.Number > 0 Then
Call LogErr("Errorhandler-FUNCTION functn_RHUMB Error Number: " & Err.Description)
End If

End Function


Read from and write to the Registry (I didn't write this but it's handy) (VB6)

Private Function getRegSetting(ByVal Major_Keyname As String,
ByVal Minor_Keyname As String, ByVal entity_name As String) As String
Try
Dim key As Microsoft.Win32.RegistryKey
Dim key_inst As Microsoft.Win32.RegistryKey
Dim key_val As String
key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(Major_Keyname, True)
key_inst = key.OpenSubKey(Minor_Keyname, True)
key_val = key_inst.GetValue(entity_name, "")
Return key_val
Catch ex As Exception
Return ""
Finally

End Try

End Function

Private Function setRegSetting(ByVal Major_Keyname As String,
ByVal Minor_Keyname As String, ByVal entity_name As String,
ByVal val_To_set As String) As Boolean
Try
Dim key As Microsoft.Win32.RegistryKey
Dim key_inst As Microsoft.Win32.RegistryKey
key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(Major_Keyname, True)
key_inst = key.OpenSubKey(Minor_Keyname, True)
key_inst.SetValue(entity_name, val_To_set)
Return True 'value set no casualties
Catch ex As Exception
Return False 'value could not be set
Finally

End Try

End Function


NAVAL Message Line Extraction Function (VB 6)

Public Function fnctn_line_parser(MSGString As String, SRCHString As String, ENDCHAR As String, STARTPOS As Integer) As String

'Author: Kenneth Patrick UNCLASSIFIED 17 September, 1998
'General fnctn to return any formatted line or string from a NAVAL message
'The line is taken verbatim from the message string , work is done on that string by the calling routine

On Error GoTo error_Handler

Dim lMLINE_Start As Long
Dim lMLINE_End As Long
Dim lMLINE_Len As Long
Dim tMLINE_Line As String

lMLINE_Start = InStr(STARTPOS, MSGString, SRCHString) 'Position of the message line within the message string
lMLINE_End = InStr(lMLINE_Start, MSGString, ENDCHAR) 'Find the position of the end of the line by locating the ending charecter
lMLINE_Len = lMLINE_End - lMLINE_Start + 2 'Length of the message line
tMLINE_Line = Mid(MSGString, lMLINE_Start, lMLINE_Len) 'the message line

fnctn_line_parser = tMLINE_Line
Exit function

error_Handler:

If Err.Number > 0 Then
Debug.Print "Errorhandler-fnctn_line_parser Error Number: " & Err.Number & " " & Err.Description
fnctn_line_parser = " " 'return an empty string on an error
End If

End Function


Ellipse function which writes an Arcview Ellipse Polyline string (VB 6)

Public Function fnctn_ELLIPSE(Lat As Single, Lon As Single, Major As Single, Minor As Single, Orient As Single) As String
'
'Author Kenneth Patrick UNCLASSIFIED
'fnctn_ELLIPSE
'Created: 16 may 1998
'Last Update 17 March 1999
'ELLIPSE ALGORITHM - Writes an ARCVIEW Ellipse Polyline Shape String, based on input

On Error GoTo errorhandler

Dim X As Single 'Variable to figure for first X (LON), X is the X offset from the origon of the ELLIPSE
Dim Y As Single 'Variable to figure for first Y (LAT), Y is the Y offset from the origon of the ELLIPSE
Dim New_X As Single 'Variable to figure for NEW X (LON), X is the X offset (USING the Axis Orientation) from the origon
Dim New_Y As Single 'Variable to figure for NEW Y (LAT), Y is the Y offset (USING the Axis Orientation) from the origon
Dim Angle As Integer 'Angle from 1 to 361 used to run in the DO LOOP
Dim CSign_Orient As Single 'COS of the AXIS ORIENTATION (Orient) used to fig NEW_X and NEW_Y
Dim SSign_Orient As Single 'SIN of the AXIS ORIENTATION (Orient) used to fig NEW_X and NEW_Y
Dim Neg_X As Single ' Negative of the X used to figure NEW_Y
Dim New_Script_Str As String 'Holds the New Script calculated with Axis Orientation

Major = Major / 60
Minor = Minor / 60

Angle = 1

'reverse the Orientation, positive numbers rotate the origional axis counterclockwise, I use
'negative numbers to coincide with the clockwise direction of increasing bearings
Orient = -(Orient)

'Main Do loop...overlaps past 360 degrees because ARCVIEW drops the last point whether or not the graphic shape is a complete unit

Do Until Angle >= 370
'Sin the major and Cos the minor
'Figure initial X and Y offset (orientation axis offset) based off of these figured points.
X = Sin(Angle * DGRS_RAD) * Major 'Figure X (Longitude) based off Major Ellipse (.01745 = the radian to angle ratio)
Y = Cos(Angle * DGRS_RAD) * Minor 'Figure Y (Latitude) based off Minor Ellipse (.01745 = the radian to angle ratio)

START_LON = Lon ' utilize the Lon value passed to it...must be a single
START_LAT = Lat ' utilize the Lat value passed to it...must be a single

'Prerequisite figures to perform the NEW_X and NEW_Y
CSign_Orient = Cos(Orient * DGRS_RAD)
SSign_Orient = Sin(Orient * DGRS_RAD)
Neg_X = -(X)

New_X = (X * CSign_Orient) + (Y * SSign_Orient)
New_Y = (Neg_X * SSign_Orient) + (Y * CSign_Orient)
New_X = New_X + START_LAT 'Add the offset to the origon point
New_Y = New_Y + START_LON 'Add the offset to the origon point
Dim My_Y As Variant
My_Y = New_Y
My_Y = CDec(My_Y)

Select Case Angle
Case 1
'First Point for the ELLIPSE script, needs the opening "( {{"
New_Script_Str = "thepolyLine = PolyLine.Make ( {{" & My_Y & "@" & New_X & ","
Case 361
'Last Point for the ELLIPSE script, needs the "}} )"
New_Script_Str = New_Script_Str & My_Y & "@" & New_X & "}} )" 'Format the ARCVIEW SCRIPT using Axis Rotation
Case Else
'The remainder of points get the standard formatting "Lon@Lat,"
New_Script_Str = New_Script_Str & My_Y & "@" & New_X & "," 'Format the ARCVIEW SCRIPT using Axis Rotation

End Select

Angle = Angle + 10 'increment the loop by 10 degrees, clockwise
'Changed 11/15/99
Angle = Angle + 5 'increment the loop by 5 degrees, clockwise

Loop

'Assign the script as the output of this function
fnctn_ELLIPSE = New_Script_Str

errorhandler:

If Err.Number > 0 Then
Debug.Print "Errorhandler-MODULE1.functn_ELLIPSE Error Number: " & Err.Description
End If

End Function

Code Samples
VB 6 VB.Net PL/SQL C#
Social Bookmarks        Copyright © by Kenneth Patrick 2000 - 2008      Host your .Net Website with Brinkster.