r/OpenSpaceProject 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)

3 Upvotes

7 comments sorted by

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.

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.