mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-05-12 22:39:09 -05:00
Merge pull request #1066 from OpenSpace/feature/iss-asset
Feature/iss asset
This commit is contained in:
@@ -3,6 +3,10 @@
|
||||
|
||||
#Asset
|
||||
scene/solarsystem/planets/earth/earth required
|
||||
scene/solarsystem/planets/earth/satellites/satellites required
|
||||
|
||||
#Property
|
||||
setPropertyValue {earth_satellites}.Renderable.Enabled false
|
||||
|
||||
#Time
|
||||
relative -1d
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
asset.require('./base')
|
||||
|
||||
local earthAsset = asset.require('scene/solarsystem/planets/earth/earth')
|
||||
asset.request('scene/solarsystem/planets/earth/satellites/satellites.asset')
|
||||
|
||||
asset.onInitialize(function ()
|
||||
local now = openspace.time.currentWallTime()
|
||||
@@ -10,6 +11,8 @@ asset.onInitialize(function ()
|
||||
openspace.globebrowsing.goToGeo("Earth", 58.5877, 16.1924, 20000000)
|
||||
|
||||
openspace.markInterestingNodes({ "Earth", "Mars", "Moon", "Sun" })
|
||||
|
||||
openspace.setPropertyValue("{earth_satellites}.Renderable.Enabled", false)
|
||||
end)
|
||||
|
||||
asset.onDeinitialize(function ()
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Amateur Radio",
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Experimental",
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Geostationary",
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "GlobalStar",
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Gorizont",
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Intelsat",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Iridium",
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Iridium NEXT",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Molniya",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Orbcomm",
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Other comm",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Raduga",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "SES",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../debris_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Indian ASAT test Debris",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../debris_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Breeze-M Breakup",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../debris_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Fengyun Debris",
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../debris_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Iridium 33 Debris",
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../debris_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Kosmos 2251 Debris",
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
local transforms = asset.require('scene/solarsystem/planets/earth/transforms')
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
|
||||
function downloadTLEFile(sceneAsset, url, name)
|
||||
local identifier = name
|
||||
identifier = identifier:gsub(" ", "")
|
||||
identifier = identifier:gsub("&", "")
|
||||
identifier = identifier:gsub("-", "")
|
||||
return sceneAsset.syncedResource({
|
||||
Name = "Satellite TLE Data (" .. name .. ")",
|
||||
Type = "UrlSynchronization",
|
||||
Identifier = "satellite_tle_data_" .. identifier,
|
||||
Url = url
|
||||
})
|
||||
end
|
||||
|
||||
local registerSatelliteGroupObjects = function(containingAsset, group, tleFolder, shouldAddDuplicates)
|
||||
local filename = group.Url:match("([^/]+)$")
|
||||
local filenameSansExt = filename:gsub(filename:match("(%.%w+)$"), "")
|
||||
|
||||
local path = tleFolder .. "/" .. filename
|
||||
|
||||
function numLinesInFile(filename)
|
||||
local ctr = 0
|
||||
for _ in io.lines(filename) do ctr = ctr + 1 end
|
||||
return ctr
|
||||
end
|
||||
|
||||
-- Check format of a set of 3 TLE file lines and return nonzero if there is a format error
|
||||
function isValidTLEFileFormat(lineArr)
|
||||
function isEmpty(s) return s == nil or s == '' end
|
||||
|
||||
if isEmpty(lineArr[1]) or isEmpty(lineArr[2]) or isEmpty(lineArr[3]) then
|
||||
return false
|
||||
end
|
||||
if string.sub(lineArr[2], 1, 2) ~= "1 " then
|
||||
return false
|
||||
end
|
||||
if string.sub(lineArr[3], 1, 2) ~= "2 " then
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
function debris(title, file, color)
|
||||
return {
|
||||
Identifier = title,
|
||||
Parent = transforms.EarthInertial.Identifier,
|
||||
Renderable = {
|
||||
Type = "RenderableSatellites",
|
||||
Path = file,
|
||||
Segments = 160,
|
||||
Color = color,
|
||||
Fade = 0.5
|
||||
},
|
||||
GUI = {
|
||||
Path = "/Solar System/Planets/Earth/Satellites"
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
local Debris = debris(filenameSansExt, path, group.TrailColor)
|
||||
assetHelper.registerSceneGraphNodesAndExport(containingAsset, { Debris })
|
||||
end
|
||||
|
||||
asset.export("downloadTLEFile", downloadTLEFile)
|
||||
asset.export("registerSatelliteGroupObjects", registerSatelliteGroupObjects)
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "100 Brightest",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "CubeSat",
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local satelliteHelper = asset.require('util/tle_helper')
|
||||
local transforms = asset.require('scene/solarsystem/planets/earth/transforms')
|
||||
local sunTransforms = asset.require('scene/solarsystem/sun/transforms')
|
||||
|
||||
local url = "https://celestrak.com/satcat/tle.php?CATNR=25544"
|
||||
local identifier = "ISS"
|
||||
local filename = "ISS.txt"
|
||||
local nodes = {}
|
||||
local tle = satelliteHelper.downloadTLEFile(asset, url, identifier, filename)
|
||||
|
||||
local modelsLocation = asset.syncedResource({
|
||||
Name = "ISS Models",
|
||||
Type = "HttpSynchronization",
|
||||
Identifier = "iss_model",
|
||||
Version = 1
|
||||
})
|
||||
|
||||
local initializeAndAddNodes = function()
|
||||
|
||||
local lineElement = satelliteHelper.makeSingleLineElement(tle, filename)
|
||||
local period = satelliteHelper.getPeriodFromElement(lineElement)
|
||||
local path = tle .. "\\" .. filename
|
||||
|
||||
-- TLE data is only relevant in EarthInertial frame which means the model
|
||||
-- will inherit some irrelevant rotations from its parent. To get around that
|
||||
-- we perform the reverse rotation back to EarthBarycenter frame after applying
|
||||
-- the TLE translation
|
||||
local iss = {
|
||||
Identifier = identifier,
|
||||
Parent = transforms.EarthInertial.Identifier,
|
||||
Transform = {
|
||||
Translation = {
|
||||
Type = "TLETranslation",
|
||||
Body = identifier,
|
||||
Observer = transforms.EarthInertial.Identifier,
|
||||
File = path,
|
||||
LineNumber = 1
|
||||
},
|
||||
Rotation = {
|
||||
Type = "SpiceRotation",
|
||||
SourceFrame = "GALACTIC",
|
||||
DestinationFrame = "J2000",
|
||||
}
|
||||
},
|
||||
Tag = { "earth_satellite", "ISS" },
|
||||
GUI = {
|
||||
Path = "/Solar System/Planets/Earth/Satellites/ISS",
|
||||
Hiden = true
|
||||
}
|
||||
}
|
||||
|
||||
local issModel = {
|
||||
Identifier = identifier .. "_model",
|
||||
Parent = iss.Identifier,
|
||||
Transform = {
|
||||
Rotation = {
|
||||
Type = "FixedRotation",
|
||||
Attached = "ISS_model",
|
||||
XAxis = { 1.0, 0.0, 0.0 },
|
||||
XAxisOrthogonal = true,
|
||||
ZAxis = transforms.EarthInertial.Identifier
|
||||
}
|
||||
},
|
||||
Renderable = {
|
||||
Type = "RenderableModel",
|
||||
Geometry = {
|
||||
Type = "MultiModelGeometry",
|
||||
GeometryFile = modelsLocation .. "/iss.obj"
|
||||
},
|
||||
ColorTexture = modelsLocation .. "/gray.png",
|
||||
LightSources = assetHelper.getDefaultLightSources(sunTransforms.SolarSystemBarycenter.Identifier)
|
||||
},
|
||||
Tag = { "earth_satellite", "ISS" },
|
||||
GUI = {
|
||||
Path = "/Solar System/Planets/Earth/Satellites/ISS"
|
||||
}
|
||||
}
|
||||
|
||||
local issTrail = {
|
||||
Identifier = identifier .. "_trail",
|
||||
Parent = transforms.EarthInertial.Identifier,
|
||||
Renderable = {
|
||||
Type = "RenderableTrailOrbit",
|
||||
Translation = {
|
||||
Type = "TLETranslation",
|
||||
Body = identifier,
|
||||
Observer = transforms.EarthInertial.Identifier,
|
||||
File = path,
|
||||
LineNumber = 1
|
||||
},
|
||||
Color = { 0.9, 0.6715, 0.0 },
|
||||
Fade = 1.5,
|
||||
Period = period,
|
||||
Resolution = 320
|
||||
},
|
||||
Tag = { "earth_satellite", "ISS" },
|
||||
GUI = {
|
||||
Path = "/Solar System/Planets/Earth/Satellites/ISS"
|
||||
}
|
||||
}
|
||||
|
||||
local myNodes = { iss, issModel, issTrail }
|
||||
|
||||
for _, node in ipairs(myNodes) do
|
||||
openspace.addSceneGraphNode(node)
|
||||
end
|
||||
|
||||
return myNodes
|
||||
end
|
||||
|
||||
asset.onInitialize(function ()
|
||||
nodes = initializeAndAddNodes()
|
||||
end)
|
||||
|
||||
asset.onDeinitialize(function ()
|
||||
openspace.removeSceneGraphNode(nodes[3].Identifier) -- Removing trail
|
||||
openspace.removeSceneGraphNode(nodes[1].Identifier) -- Removing ISS and model recursively
|
||||
end)
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Military",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Other",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Radar Calibration",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "SpaceStations",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Last 30 Days",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Beidou",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Galileo",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Glosnass",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "GPS",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Russian LEO Navigation",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Navy Navigation Satellite System",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Satellite Based Augmentation System",
|
||||
|
||||
@@ -2,4 +2,5 @@ asset.request('./misc/brightest')
|
||||
asset.request('./communications/geostationary')
|
||||
asset.request('./navigation/gps')
|
||||
asset.request('./misc/spacestations')
|
||||
asset.request('./misc/iss')
|
||||
asset.request('./misc/tle-new')
|
||||
|
||||
@@ -1,68 +0,0 @@
|
||||
local transforms = asset.require('scene/solarsystem/planets/earth/transforms')
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
|
||||
function downloadTLEFile(sceneAsset, url, name)
|
||||
local identifier = name
|
||||
identifier = identifier:gsub(" ", "")
|
||||
identifier = identifier:gsub("&", "")
|
||||
identifier = identifier:gsub("-", "")
|
||||
return sceneAsset.syncedResource({
|
||||
Name = "Satellite TLE Data (" .. name .. ")",
|
||||
Type = "UrlSynchronization",
|
||||
Identifier = "satellite_tle_data_" .. identifier,
|
||||
Url = url
|
||||
})
|
||||
end
|
||||
|
||||
local registerSatelliteGroupObjects = function(containingAsset, group, tleFolder, shouldAddDuplicates)
|
||||
local filename = group.Url:match("([^/]+)$")
|
||||
local filenameSansExt = filename:gsub(filename:match("(%.%w+)$"), "")
|
||||
|
||||
local path = tleFolder .. "/" .. filename
|
||||
|
||||
function numLinesInFile(filename)
|
||||
local ctr = 0
|
||||
for _ in io.lines(filename) do ctr = ctr + 1 end
|
||||
return ctr
|
||||
end
|
||||
|
||||
-- Check format of a set of 3 TLE file lines and return nonzero if there is a format error
|
||||
function isValidTLEFileFormat(lineArr)
|
||||
function isEmpty(s) return s == nil or s == '' end
|
||||
|
||||
if isEmpty(lineArr[1]) or isEmpty(lineArr[2]) or isEmpty(lineArr[3]) then
|
||||
return false
|
||||
end
|
||||
if string.sub(lineArr[2], 1, 2) ~= "1 " then
|
||||
return false
|
||||
end
|
||||
if string.sub(lineArr[3], 1, 2) ~= "2 " then
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
function satellites(title, file, color)
|
||||
return {
|
||||
Identifier = title,
|
||||
Parent = transforms.EarthInertial.Identifier,
|
||||
Renderable = {
|
||||
Type = "RenderableSatellites",
|
||||
Path = file,
|
||||
Segments = 120,
|
||||
Color = color,
|
||||
Fade = 0.5
|
||||
},
|
||||
--Tag = { "earth_satellite_" .. group, "earth_satellite_" .. group .. "_trail"},
|
||||
GUI = {
|
||||
Path = "/Solar System/Planets/Earth/Satellites"
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
local SatelliteBatch = satellites(filenameSansExt, path, group.TrailColor)
|
||||
assetHelper.registerSceneGraphNodesAndExport(containingAsset, { SatelliteBatch })
|
||||
end
|
||||
|
||||
asset.export("downloadTLEFile", downloadTLEFile)
|
||||
asset.export("registerSatelliteGroupObjects", registerSatelliteGroupObjects)
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Education",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Engineering",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Geodect",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Space & Earth Science",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "ARGOS",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Disaster Monitoring",
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Earth Resources",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "GOES",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "NOAA",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Planet",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Search & Rescue (SARSAT)",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Spire",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Tracking and Data Relay Satellite System (TDRSS)",
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
local shared = asset.require('../satellites_shared')
|
||||
local shared = asset.require('util/tle_helper')
|
||||
|
||||
local group = {
|
||||
Title = "Weather",
|
||||
|
||||
@@ -0,0 +1,110 @@
|
||||
local transforms = asset.require('scene/solarsystem/planets/earth/transforms')
|
||||
local assetHelper = asset.require('util/asset_helper')
|
||||
|
||||
function downloadTLEFile(sceneAsset, url, name, filename)
|
||||
local identifier = name
|
||||
identifier = identifier:gsub(" ", "")
|
||||
identifier = identifier:gsub("&", "")
|
||||
identifier = identifier:gsub("-", "")
|
||||
|
||||
local urlSyncTable = {
|
||||
Name = "Satellite TLE Data (" .. name .. ")",
|
||||
Type = "UrlSynchronization",
|
||||
Identifier = "satellite_tle_data_" .. identifier,
|
||||
Url = url
|
||||
}
|
||||
|
||||
if (filename ~= '') then
|
||||
urlSyncTable.Filename = filename
|
||||
end
|
||||
|
||||
return sceneAsset.syncedResource(urlSyncTable)
|
||||
end
|
||||
|
||||
-- Check format of a set of 3 TLE file lines and return nonzero if there is a format error
|
||||
function isValidTLEFileFormat(lineArr)
|
||||
function isEmpty(s) return s == nil or s == '' end
|
||||
|
||||
if isEmpty(lineArr[1]) or isEmpty(lineArr[2]) or isEmpty(lineArr[3]) then
|
||||
return false
|
||||
end
|
||||
if string.sub(lineArr[2], 1, 2) ~= "1 " then
|
||||
return false
|
||||
end
|
||||
if string.sub(lineArr[3], 1, 2) ~= "2 " then
|
||||
return false
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
local makeSingleLineElement = function(tle, filename)
|
||||
local path = tle .. "\\" .. filename
|
||||
local file = io.open(path, "r")
|
||||
assert(file, "File not found: " .. path)
|
||||
|
||||
local line = {
|
||||
file:read('*l'), --title line
|
||||
file:read('*l'),
|
||||
file:read('*l')
|
||||
}
|
||||
|
||||
assert(isValidTLEFileFormat(line), "TLE file syntax error on line " .. 1 .. ": " .. path)
|
||||
|
||||
-- Trim string
|
||||
line[1] = line[1]:gsub("^%s*(.-)%s*$", "%1")
|
||||
line[1] = line[1]:gsub("%s+", "_")
|
||||
line[1] = line[1]:gsub("[%-()]", "")
|
||||
--local title = line[1]
|
||||
|
||||
return line
|
||||
end
|
||||
|
||||
function numLinesInFile(filename)
|
||||
local ctr = 0
|
||||
for _ in io.lines(filename) do ctr = ctr + 1 end
|
||||
return ctr
|
||||
end
|
||||
|
||||
local getPeriodFromElement = function(element)
|
||||
-- Get period from correct location of the string
|
||||
local per = tonumber(string.sub(element[3], 53, 63))
|
||||
-- Trail for 2x a single revolution
|
||||
per = 1.0 / per
|
||||
|
||||
return per
|
||||
end
|
||||
|
||||
function satellites(title, file, color, group)
|
||||
return {
|
||||
Identifier = title,
|
||||
Parent = transforms.EarthInertial.Identifier,
|
||||
Renderable = {
|
||||
Type = "RenderableSatellites",
|
||||
Path = file,
|
||||
Segments = 120,
|
||||
Color = color,
|
||||
Fade = 1.5
|
||||
},
|
||||
Tag = { "earth_satellites" },
|
||||
GUI = {
|
||||
Path = "/Solar System/Planets/Earth/Satellites"
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
local registerSatelliteGroupObjects = function(containingAsset, group, tleFolder, shouldAddDuplicates)
|
||||
local filename = group.Url:match("([^/]+)$")
|
||||
local filenameSansExt = filename:gsub(filename:match("(%.%w+)$"), "")
|
||||
|
||||
local path = tleFolder .. "/" .. filename
|
||||
|
||||
local SatelliteBatch = satellites(filenameSansExt, path, group.TrailColor, group)
|
||||
assetHelper.registerSceneGraphNodesAndExport(containingAsset, { SatelliteBatch })
|
||||
end
|
||||
|
||||
asset.export("downloadTLEFile", downloadTLEFile)
|
||||
asset.export("isValidTLEFileFormat", isValidTLEFileFormat)
|
||||
asset.export("numLinesInFile", numLinesInFile)
|
||||
asset.export("makeSingleLineElement", makeSingleLineElement)
|
||||
asset.export("getPeriodFromElement", getPeriodFromElement)
|
||||
asset.export("registerSatelliteGroupObjects", registerSatelliteGroupObjects)
|
||||
@@ -71,6 +71,11 @@ namespace {
|
||||
"Color",
|
||||
"This value determines the RGB main color for the lines and points of the trail."
|
||||
};
|
||||
constexpr openspace::properties::Property::PropertyInfo TrailFadeInfo = {
|
||||
"TrailFade",
|
||||
"Trail Fade",
|
||||
"This value determines how fast the trail fades and is an appearance property. "
|
||||
};
|
||||
|
||||
constexpr const char* KeyFile = "Path";
|
||||
constexpr const char* KeyLineNum = "LineNumber";
|
||||
@@ -321,15 +326,24 @@ RenderableSatellites::RenderableSatellites(const ghoul::Dictionary& dictionary)
|
||||
if (dictionary.hasKeyAndValue<glm::vec3>(LineColorInfo.identifier)) {
|
||||
_appearance.lineColor = dictionary.value<glm::vec3>(LineColorInfo.identifier);
|
||||
}
|
||||
if (dictionary.hasKeyAndValue<double>("FadeInfo")) {
|
||||
if (dictionary.hasKeyAndValue<double>(TrailFadeInfo.identifier)) {
|
||||
_appearance.lineFade = static_cast<float>(
|
||||
dictionary.value<double>("FadeInfo")
|
||||
dictionary.value<double>(TrailFadeInfo.identifier)
|
||||
);
|
||||
}
|
||||
else {
|
||||
_appearance.lineFade = 20;
|
||||
}
|
||||
|
||||
if (dictionary.hasKeyAndValue<double>(LineWidthInfo.identifier)) {
|
||||
_appearance.lineWidth = static_cast<float>(
|
||||
dictionary.value<double>(LineWidthInfo.identifier)
|
||||
);
|
||||
}
|
||||
else {
|
||||
_appearance.lineWidth = 2.0;
|
||||
}
|
||||
|
||||
auto reinitializeTrailBuffers = [this]() {
|
||||
initializeGL();
|
||||
};
|
||||
|
||||
@@ -43,8 +43,10 @@ namespace {
|
||||
constexpr const char* KeyIdentifier = "Identifier";
|
||||
constexpr const char* KeyOverride = "Override";
|
||||
constexpr const char* KeyUseHash = "UseHash";
|
||||
constexpr const char* KeyFilename = "Filename";
|
||||
|
||||
constexpr const char* TempSuffix = ".tmp";
|
||||
constexpr const char* FileSuffix = ".txt";
|
||||
} // namespace
|
||||
|
||||
namespace openspace {
|
||||
@@ -90,6 +92,13 @@ documentation::Documentation UrlSynchronization::Documentation() {
|
||||
"circumstances. If this is not desired, the URLSynchronization use the "
|
||||
"bare directory name alone if this value is 'false'. If this value is "
|
||||
"'false', the identifier has to be specified."
|
||||
},
|
||||
{
|
||||
KeyFilename,
|
||||
new StringVerifier,
|
||||
Optional::Yes,
|
||||
"Optional to provide filename to override the one which is otherwise "
|
||||
"automatically created from the url. "
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -117,6 +126,14 @@ UrlSynchronization::UrlSynchronization(const ghoul::Dictionary& dict,
|
||||
}
|
||||
}
|
||||
|
||||
if (dict.hasValue<std::string>(KeyFilename)) {
|
||||
_filename = dict.value<std::string>(KeyFilename);
|
||||
std::size_t foundExt = _filename.find(FileSuffix);
|
||||
if (foundExt == std::string::npos) {
|
||||
_filename += FileSuffix;
|
||||
}
|
||||
}
|
||||
|
||||
bool useHash = true;
|
||||
if (dict.hasValue<bool>(KeyUseHash)) {
|
||||
useHash = dict.value<bool>(KeyUseHash);
|
||||
@@ -181,11 +198,22 @@ void UrlSynchronization::start() {
|
||||
std::vector<std::unique_ptr<AsyncHttpFileDownload>> downloads;
|
||||
|
||||
for (const std::string& url : _urls) {
|
||||
const size_t lastSlash = url.find_last_of('/');
|
||||
const std::string filename = url.substr(lastSlash + 1);
|
||||
|
||||
if (_filename.empty()) {
|
||||
const size_t lastSlash = url.find_last_of('/');
|
||||
std::string lastPartOfUrl = url.substr(lastSlash + 1);
|
||||
|
||||
// We can not create filenames with questionmarks
|
||||
lastPartOfUrl.erase(std::remove(lastPartOfUrl.begin(), lastPartOfUrl.end(), '?'), lastPartOfUrl.end());
|
||||
|
||||
std::size_t foundExt = lastPartOfUrl.find(FileSuffix);
|
||||
if (foundExt == std::string::npos) {
|
||||
lastPartOfUrl += FileSuffix;
|
||||
}
|
||||
_filename = lastPartOfUrl;
|
||||
}
|
||||
std::string fileDestination = directory() +
|
||||
ghoul::filesystem::FileSystem::PathSeparator + filename + TempSuffix;
|
||||
ghoul::filesystem::FileSystem::PathSeparator + _filename + TempSuffix;
|
||||
|
||||
std::unique_ptr<AsyncHttpFileDownload> download =
|
||||
std::make_unique<AsyncHttpFileDownload>(
|
||||
|
||||
@@ -58,6 +58,7 @@ private:
|
||||
bool _forceOverride = false;
|
||||
std::string _synchronizationRoot;
|
||||
std::string _identifier;
|
||||
std::string _filename;
|
||||
|
||||
std::atomic_bool _nTotalBytesKnown = false;
|
||||
std::atomic_size_t _nTotalBytes = 0;
|
||||
|
||||
Reference in New Issue
Block a user