summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabriel Pérez-Cerezo <gabriel@gpcf.eu>2020-07-02 02:04:10 +0200
committerGabriel Pérez-Cerezo <gabriel@gpcf.eu>2020-07-02 02:04:10 +0200
commit2ba5a52fe2d4be16ccd84bf48f04cc08d04479ac (patch)
treed7e67ef602dc4de6da69c3a1de508c4f790bd06d
parent49a47330b383ae9bceeac6b74b5b0ce36dc3b034 (diff)
downloadadvtrains_netmapper-2ba5a52fe2d4be16ccd84bf48f04cc08d04479ac.tar.gz
advtrains_netmapper-2ba5a52fe2d4be16ccd84bf48f04cc08d04479ac.tar.bz2
advtrains_netmapper-2ba5a52fe2d4be16ccd84bf48f04cc08d04479ac.zip
add small script to create json files for use with lifomapserver
These json files can then be used to help with train routing through the network
-rwxr-xr-xroutes.lua131
1 files changed, 131 insertions, 0 deletions
diff --git a/routes.lua b/routes.lua
new file mode 100755
index 0000000..25b4293
--- /dev/null
+++ b/routes.lua
@@ -0,0 +1,131 @@
+-- Small script to generate json files for lifomapserver to use for routing
+
+advtrains = {}
+minetest = {}
+core = minetest
+
+math.hypot = function(a,b) return math.sqrt(a*a + b*b) end
+function attrans(str) return str end
+
+dofile("vector.lua")
+dofile("serialize.lua")
+dofile("helpers.lua")
+
+
+function parse_args(argv)
+ local i = 1
+ local no_trains = false
+ local datapath, mappath, worldimage
+ while i <= #argv do
+ local a = argv[i]
+ if (a == "-m") or (a == "--map-file") then
+ -- only draw trains – requires specifying an already drawn file
+ i = i+1
+ if not argv[i] then
+ error(("missing filename after `%s'"):format(a))
+ end
+ mappath = argv[i]
+ elseif (a == "-t") or (a == "--no-trains") then
+ -- do not draw trains
+ no_trains = true
+ elseif (a == "-w") or (a == "--world-image") then
+ -- overlay over world image
+ i = i+1
+ if not argv[i] then
+ error(("missing filename after `%s'"):format(a))
+ end
+ worldimage = argv[i]
+ else
+ datapath = a
+ end
+
+ i = i + 1
+ end
+ return datapath, mappath, no_trains, worldimage
+end
+
+datapath, mappath, no_trains, worldimage = parse_args(arg)
+
+function ars_to_text(arstab)
+ if not arstab then
+ return "{}"
+ end
+
+ local txt = {}
+ local ln = {}
+ local rc = {}
+ for i, arsent in ipairs(arstab) do
+ local n = ""
+ if arsent.n then
+ n = "!"
+ end
+ if arsent.ln then
+ ln[#ln+1] = '"'..n..arsent.ln..'"'
+ elseif arsent.rc then
+ rc[#ln+1] = '"'..n..arsent.rc..'"'
+ elseif arsent.c then
+ txt[#txt+1] = "#"..arsent.c
+ end
+ end
+
+ return '{"LN": ['..table.concat(ln,',')..'], "RC" : ['..table.concat(rc,",")..']'.. ',"default": '..(arstab.default and "true" or "false").."}\n"
+end
+
+
+local file = io.open(datapath.."advtrains_interlocking_tcbs", "r")
+local tbl = minetest.deserialize(file:read("*a"))
+advtrains.tcbs = tbl
+file:close()
+
+local jsonfile = io.open(datapath.."signals.json", "w")
+
+
+tcbstr = {}
+for k,v in pairs(advtrains.tcbs) do
+ local routes = v[1].routes or {}
+ if v[2].routes then
+ for a,b in ipairs(v[2].routes) do
+ routes[#routes+1] = b
+ end
+ end
+ local pos = k:sub(2,-2)
+ local sp = {}
+ for j in (pos..","):gmatch("([^,]+),") do
+ sp[#sp+1] = j
+ end
+ local sigpos = sp[1]..","..-sp[3].." "
+
+ local routestr = {}
+ for i,r in pairs(routes) do
+ local pl = sigpos
+
+ local tcbps = {}
+ -- svgfile:write("<circle cx=\""..sp[1].."\" cy=\""..-sp[3].."\" r=\"3\" stroke=\"".."purple".."\" stroke-width=\"1\" fill=\"none\" />")
+ for ind,ps in ipairs(r) do
+ if ps.next then
+ local tcb = ps.next.p
+ -- print(minetest.serialize(ps.next))
+ if tcb and tcb.x then
+ tcbps[#tcbps+1] = tcb.x..","..tcb.y..","..tcb.z
+ pl = pl.." "..tcb.x..","..-tcb.z
+ end
+ end
+ end
+
+ if #tcbps > 0 then
+ routestr[#routestr+1] = '{ "name": "'..r.name..'",\n"endpoint": "'..tcbps[#tcbps]..'",\n"ars": '..ars_to_text(r.ars)..' }'
+ end
+ color = "blue"
+ if r.ars and r.ars.default then
+ color = "green"
+ end
+ if pl~="" then
+ -- svgfile:write("<polyline points=\""..pl.."\" fill=\"none\" stroke=\""..color.."\" />")
+ end
+ end
+ if #routestr > 0 then
+ tcbstr[#tcbstr+1] = '"'..pos..'": { "type" : "Feature", "geometry": { "type": "Point", "coordinates": [ '..sp[1]..","..sp[3]..']}, "properties" : { "pos": "'..pos..'", "routes" : [\n'..table.concat(routestr,",\n").."]}}"
+ end
+end
+jsonfile:write("{"..table.concat(tcbstr,",\n").."}")
+jsonfile:close()