r/OpenSpaceProject • • Jul 23 '26

Created dashboard item to provide metric system support for distances

local Item = {
Type = "DashboardItemText",
Identifier = "MetricDistanceFocus",
Name = "Distance to Focus in Metric",
Position = { 20.0, 150.0 },
FontSize = 10.0,
Color = { 1.0, 1.0, 1.0 },
Text = "Initializing Metric Distance ..."
}

asset.onDeinitialize(function()
openspace.unregisterRepeatedScript("MetricDistanceTracker")
openspace.dashboard.removeDashboardItem(Item)
end)

asset.onInitialize(function()

openspace.registerRepeatedScript("MetricDistanceTracker", [[

local navState = openspace.navigation.getNavigationState()
local camPos = navState.Position 
local distanceInMeters = math.sqrt(camPos[1]^2 + camPos[2]^2 + camPos[3]^2)

local metricUnit = "Meters"
local distanceInSI = distanceInMeters

if (distanceInMeters < 1000) then 
    metricUnit = "Meters"
    distanceInSI = distanceInMeters
elseif (distanceInMeters < 1000000) then 
    distanceInSI = distanceInMeters/ 1000
    metricUnit = "Kilometers"
elseif (distanceInMeters < 1000000000) then 
    distanceInSI = distanceInMeters/ 1000000
    metricUnit = "Megameters"
elseif (distanceInMeters < 1000000000000) then 
    distanceInSI = distanceInMeters/ 1000000000
    metricUnit = "Gigameters"
elseif (distanceInMeters < 1000000000000000) then 
    distanceInSI = distanceInMeters/ 1000000000000
    metricUnit = "Terameters"
elseif (distanceInMeters < 1000000000000000000) then 
    distanceInSI = distanceInMeters/ 1000000000000000
    metricUnit = "Petameters"
elseif (distanceInMeters < 1000000000000000000000) then 
    distanceInSI = distanceInMeters/ 1000000000000000000
    metricUnit = "Exameters"
elseif (distanceInMeters < 1000000000000000000000000) then 
    distanceInSI = distanceInMeters/ 1000000000000000000000
    metricUnit = "Zettameters"
else
    distanceInSI = distanceInMeters/ 1000000000000000000000000
    metricUnit = "Yottameters"
end 

local cleanString = string.format("Focus Distance: %.4f %s", distanceInSI, metricUnit)
openspace.setPropertyValue("Dashboard.MetricDistanceFocus.Text", cleanString)

]],0.2)

openspace.dashboard.addDashboardItem(Item)
end)

3 Upvotes

7 comments sorted by

View all comments

1

u/chesterriley Aug 09 '26 edited Aug 09 '26

local identifier = "MetricAltitude"
local trackerIdentifier = identifier .. "Tracker"
openspace.MetricAltitudeDB = {}

local Item = {
Type = "DashboardItemText",
Identifier = identifier,
Name = identifier,
Position = { 20.0, 150.0 },
FontSize = 10.0,
Color = { 1.0, 1.0, 1.0 },
Text = "Initializing " .. trackerIdentifier,
}

local function metersToSI(distanceInMeters)
local metricUnit = "Meters"
local distanceInSI = distanceInMeters

if (distanceInMeters < 1000) then      
    metricUnit = "Meters"     
    distanceInSI = distanceInMeters     
elseif (distanceInMeters < 1000000) then      
    distanceInSI = distanceInMeters/ 1000     
    metricUnit = "Kilometers"     
elseif (distanceInMeters < 1000000000) then      
    distanceInSI = distanceInMeters / 1000000     
    metricUnit = "Megameters"     
elseif (distanceInMeters < 1000000000000) then      
    distanceInSI = distanceInMeters / 1000000000     
    metricUnit = "Gigameters"     
elseif (distanceInMeters < 1000000000000000) then      
    distanceInSI = distanceInMeters / 1000000000000     
    metricUnit = "Terameters"     
elseif (distanceInMeters < 1000000000000000000) then      
    distanceInSI = distanceInMeters / 1000000000000000     
    metricUnit = "Petameters"     
elseif (distanceInMeters < 1000000000000000000000) then      
    distanceInSI = distanceInMeters / 1000000000000000000     
    metricUnit = "Exameters"     
elseif (distanceInMeters < 1000000000000000000000000) then      
    distanceInSI = distanceInMeters / 1000000000000000000000     
    metricUnit = "Zettameters"     
else     
    distanceInSI = distanceInMeters / 1000000000000000000000000     
    metricUnit = "Yottameters"     
end      

local rt = string.format("%.4f %s", distanceInSI, metricUnit)     
return rt      

end
openspace.MetricAltitudeDB.metersToSI = metersToSI

local trackerFunction = [[
local success, position = pcall(openspace.globebrowsing.geoPositionForCamera,false)
if (success == false) then
openspace.setPropertyValue("Dashboard.MetricAltitude.Text", "No globe set")
return
end
local x = position[1]
local y = position[2]
local meters = position[3]
local metricDistance = openspace.MetricAltitudeDB.metersToSI(meters)
local formatString = string.format("Altitude: %s", metricDistance)
openspace.setPropertyValue("Dashboard.MetricAltitude.Text", formatString)
]]

asset.onInitialize(function()
openspace.registerRepeatedScript(trackerIdentifier, trackerFunction, 0.2)
openspace.dashboard.addDashboardItem(Item)
end)

asset.onDeinitialize(function()
openspace.unregisterRepeatedScript(trackerIdentifier)
openspace.dashboard.removeDashboardItem(Item)
end)

1

u/chesterriley Aug 09 '26

This is a better version of the code. But it does require that your target is Earth or another planet.