Skip to content

Instantly share code, notes, and snippets.

@rikusalminen
Created February 13, 2013 10:53
Show Gist options
  • Save rikusalminen/4943830 to your computer and use it in GitHub Desktop.
Save rikusalminen/4943830 to your computer and use it in GitHub Desktop.
A python script for mating Kerbal Space Program spacecraft with launch vehicle stages. Work in progress, doesn't do anything yet.
import re
from pprint import PrettyPrinter
pprint = PrettyPrinter().pprint
def load_craft(filename):
stack = [(None, [], [])]
with open(filename) as f:
prev = None
for line in f:
line = line.strip()
match = re.match('(\w+)\s*=\s*(.*)', line)
if match:
stack[-1][1].append(match.groups())
elif re.match('\s*{', line):
new = (prev, [], [])
stack[-1][2].append(new)
stack.append(new)
elif re.match('\s*}', line):
stack = stack[:-1]
prev = line
return stack[-1]
def write_node(node, out, depth=0):
indent = '\t' * depth
for key, value in node[1]:
out.write('%s%s = %s' % (indent, key, value))
for child in node[2]:
out.write('%s%s\n%s{\n' % (indent, child[0], indent));
write_node(child, out, depth+1)
out.write('%s}\n' % indent)
def craft_str(craft):
from StringIO import StringIO
io = StringIO()
write_node(craft, io)
return io.getvalue()
def save_craft(craft, filename):
with open(filename, 'w') as f:
write_node(craft, f)
def part_attachments(part):
assert part[0] == 'PART'
return [val.split(',')[-1] for (key, val) in part[1] if key == 'attN']
def part_links(part):
assert part[0] == 'PART'
return [val for (key, val) in part[1] if key == 'link']
def part_dfs(part_names, root_part_name):
visited = set()
queue = [root_part_name]
while queue:
part_name = queue.pop()
part = part_names[part_name]
visited.add(part_name)
attns = [attn for attn in part_attachments(part) if attn not in visited]
queue = queue + attns
print part_name, 'leaf' if not attns else ''
def part_name(part):
for key, value in part[1]:
if key == 'part':
return value
def part_index(craft):
for part in craft[2]:
yield part_name(part), part
def deal_with_craft(craft):
part_names = dict(part_index(craft))
#pprint(part_names)
part_dfs(part_names, part_name(craft[2][0]))
if __name__ == '__main__':
import sys
crafts = map(load_craft, sys.argv[1:])
pprint(crafts)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment