1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
|
#!/usr/bin/env python3
__version__="0.1"
import os, sys
from optparse import OptionParser
import pydot
config = dict({
'datPath': '../../dat/',
'verbose': True})
def planet_filter( p ):
details = assetsObj.getPlanetDetails( p )
return details and int(details['population']) > 0
if __name__ == "__main__":
from datreader import readers
# Load data
ssysObj = readers.ssys(**config)
assetsObj = readers.assets(**config)
# Create graph
print("Creating graph")
graph = pydot.Dot( 'Naev_Universe', graph_type='graph' )
# Iterate over systems and planets
ssys_added = []
jumps_added = []
i = 1
for ssysName, planets in ssysObj.assetsList.items():
# Create jumps
jumps = ssysObj.jumpgatesForSystem( ssysName )
jump_nodes = []
for j in jumps:
# Sort by name
jname = j['target']
if jname < ssysName:
name = '%s-%s' % (jname, ssysName)
else:
name = '%s-%s' % (ssysName, jname)
# First time addition
if name not in jumps_added:
node = pydot.Node( name, shape='diamond' )
graph.add_node( node )
jumps_added.append( name )
# Add edges between jumps for empty systems
for jn in jump_nodes:
edge = pydot.Edge( name, jn )
graph.add_edge( edge )
# Add node
jump_nodes.append( name )
# We don't want all the planets
planets_filtered = list(filter( planet_filter, planets ))
planets_added = list()
# Create cluster
if len(planets_filtered) > 0:
subg = pydot.Cluster( "sys_%d"%i, label=ssysName )
# Iterate to create maps
for p in planets_filtered:
# Add the node
node = pydot.Node( p )
subg.add_node( node )
graph.add_subgraph( subg )
for p in planets_filtered:
# Add planet links
for t in planets_filtered:
if p == t or t in planets_added:
continue
edge = pydot.Edge( p, t, style='dotted' )
graph.add_edge( edge )
# Add jump edges
for j in jump_nodes:
edge = pydot.Edge( p, j )
graph.add_edge( edge )
# Visited planet
planets_added.append(p)
ssys_added.append( ssysName )
i += 1
#graph.set_prog( 'neato' )
graph.set_simplify( False )
graph.set( 'aspect', 1 )
#graph.set( 'maxiter', 100000 )
#graph.set( 'overlap', False )
nodes = graph.get_nodes()
edges = graph.get_edges()
v = len(nodes)
e = len(edges)
sparse = float(e+v)/float(v**2)
print((" %d nodes and %d edges (%.3f%% sparse)" % (v, e, sparse*100)))
print("Outputting as naev_universe")
graph.write_raw('naev_universe.dot')
#graph.write_png('naev_universe.png', prog='neato', format='png')
graph.write('naev_universe.png', prog='neato', format='png')
|