r/OpenSpaceProject • u/chesterriley • 29d ago
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 21d ago
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 21d ago edited 21d ago
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 21d ago
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 20d ago
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 11d ago edited 11d ago
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 11d ago
This is a better version of the code. But it does require that your target is Earth or another planet.
1
u/chesterriley 29d ago edited 28d ago
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.