Various grapher improvements.

This commit is contained in:
Eric S. Raymond 2022-04-19 17:51:10 -04:00
parent 67a887f432
commit 74b1589b57

View file

@ -59,6 +59,8 @@ def roomlabel(loc):
else: else:
short = short[0].upper() + short[1:] short = short[0].upper() + short[1:]
description += "\\n" + short description += "\\n" + short
if loc in startlocs:
description += "\\n(" + ",".join(startlocs[loc]).lower() + ")"
return description return description
# A forwarder is a location that you can't actually stop in - when you go there # A forwarder is a location that you can't actually stop in - when you go there
@ -124,29 +126,13 @@ if __name__ == "__main__":
else: else:
startlocs[location] = [objname] startlocs[location] = [objname]
startlocs = {} # Compute reachability, using forwards.
for obj in db["objects"]: # Dictionary ke6y is (from, to) iff its a valid link,
objname = obj[0] # value is correspoinding motion verbs.
location = obj[1].get("locations") links = {}
if "OBJ" not in objname and location != "LOC_NOWHERE" and ("immovable" not in obj[1] or not obj[1]["immovable"]): nodes = set()
if location in startlocs:
startlocs[location].append(objname)
else:
startlocs[location] = [objname]
print("digraph G {")
for (loc, attrs) in db["locations"]:
if is_forwarder(loc):
continue
if not subset(loc):
continue
node_label = roomlabel(loc)
if loc in startlocs:
node_label += "\\n" + ",".join(startlocs[loc]).lower()
print(' %s [shape=box,label="%s"]' % (loc[4:], node_label))
for (loc, attrs) in db["locations"]: for (loc, attrs) in db["locations"]:
nodes.add(loc)
travel = attrs["travel"] travel = attrs["travel"]
if len(travel) > 0: if len(travel) > 0:
for dest in travel: for dest in travel:
@ -158,8 +144,32 @@ if __name__ == "__main__":
dest = forward(action[1]) dest = forward(action[1])
if not (subset(loc) or subset(dest)): if not (subset(loc) or subset(dest)):
continue continue
arc = "%s -> %s" % (loc[4:], dest[4:]) links[(loc, dest)] = verbs
label=",".join(verbs).lower()
neighbors = set()
for loc in nodes:
for (f, t) in links:
if f == 'LOC_NOWHERE' or t == 'LOC_NOWHERE':
continue
if (f == loc and subset(t)) or (t == loc and subset(f)):
if loc not in neighbors:
neighbors.add(loc)
print("digraph G {")
for loc in nodes:
if is_forwarder(loc):
continue
node_label = roomlabel(loc)
if subset(loc):
print(' %s [shape=box,label="%s"]' % (loc[4:], node_label))
elif loc in neighbors:
print(' %s [label="%s"]' % (loc[4:], node_label))
# Draw arcs
for (f, t) in links:
arc = "%s -> %s" % (f[4:], t[4:])
label=",".join(links[(f, t)]).lower()
if len(label) > 0: if len(label) > 0:
arc += ' [label="%s"]' % label arc += ' [label="%s"]' % label
print(" " + arc) print(" " + arc)