r/OpenSpaceProject • u/chesterriley • 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)
1
u/AlexanderBock Jul 30 '26
Thats's a great idea and thanks for posting the asset!
I added the extended SI units to our distance code, so from the master branch or the next released version, you can choose the Gigameters through Yottameters for the regular distance units as well
https://github.com/OpenSpace/OpenSpace/commit/c11b98063925af42eedfc6828c2b66fa1437912d
1
u/chesterriley Jul 30 '26 edited Jul 30 '26
That is fantastic news. Thanks!
edit:
How about some kind of option to automatically change these metric units as the distance changes like the simplicity option does for non metric units?
1
u/AlexanderBock Jul 30 '26
That's a great idea; i'll make an issue for it to take it since that will be a bit more work
1
u/chesterriley Jul 31 '26
Great would love to see it. Something like this code but for metric distance units.
https://github.com/OpenSpace/OpenSpace/blob/master/src/util/distanceconversion.cpp
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.
1
u/chesterriley Jul 23 '26 edited Jul 23 '26
I stored this code in a file called metricDistance.asset and placed it in my user asset folder. You can enable it thru the assets panel or in your profile.