2012-07-23 14:58:38 -05:00
|
|
|
import re, os, shutil, string, sys
|
2012-05-07 11:59:50 -05:00
|
|
|
|
2012-07-23 14:58:38 -05:00
|
|
|
def generateElements(elementFiles, outputCpp, outputH):
|
2012-05-07 11:59:50 -05:00
|
|
|
|
2012-05-12 12:11:20 -05:00
|
|
|
elementClasses = dict()
|
2012-05-07 11:59:50 -05:00
|
|
|
|
2012-05-12 12:11:20 -05:00
|
|
|
elementHeader = """#ifndef ELEMENTCLASSES_H
|
|
|
|
#define ELEMENTCLASSES_H
|
|
|
|
#include <vector>
|
|
|
|
#include "simulation/Element.h"
|
|
|
|
#include "simulation/elements/Element.h"
|
|
|
|
"""
|
2012-05-07 11:59:50 -05:00
|
|
|
|
2012-05-12 12:11:20 -05:00
|
|
|
directives = []
|
2012-05-07 11:59:50 -05:00
|
|
|
|
2012-05-12 12:11:20 -05:00
|
|
|
for elementFile in elementFiles:
|
2012-07-23 14:58:38 -05:00
|
|
|
f = open(elementFile, "r")
|
2012-05-12 12:11:20 -05:00
|
|
|
fileData = f.read()
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
directiveMatcher = '//#TPT-Directive\s+([^\r\n]+)'
|
|
|
|
matcher = re.compile(directiveMatcher)
|
|
|
|
directiveMatches = matcher.findall(fileData)
|
|
|
|
|
|
|
|
for match in directiveMatches:
|
|
|
|
directives.append(match.split(" "))
|
|
|
|
|
|
|
|
classDirectives = []
|
|
|
|
for d in directives:
|
|
|
|
if d[0] == "ElementClass":
|
|
|
|
elementClasses[d[1]] = []
|
|
|
|
elementHeader += "#define %s %s\n" % (d[2], d[3])
|
|
|
|
d[3] = string.atoi(d[3])
|
|
|
|
classDirectives.append(d)
|
|
|
|
|
|
|
|
for d in directives:
|
|
|
|
if d[0] == "ElementHeader":
|
|
|
|
elementClasses[d[1]].append(string.join(d[2:], " ")+";")
|
|
|
|
|
|
|
|
for className, classMembers in elementClasses.items():
|
|
|
|
elementHeader += """class {0}: public Element
|
|
|
|
{{
|
|
|
|
public:
|
|
|
|
{0}();
|
|
|
|
virtual ~{0}();
|
|
|
|
{1}
|
|
|
|
}};
|
|
|
|
""".format(className, string.join(classMembers, "\n"))
|
|
|
|
|
|
|
|
elementHeader += """std::vector<Element> GetElements();
|
|
|
|
#endif
|
|
|
|
"""
|
|
|
|
|
|
|
|
elementContent = """#include "ElementClasses.h"
|
|
|
|
std::vector<Element> GetElements()
|
|
|
|
{
|
|
|
|
std::vector<Element> elements;
|
|
|
|
""";
|
2012-05-07 11:59:50 -05:00
|
|
|
|
2012-05-12 12:11:20 -05:00
|
|
|
elementIDs = sorted(classDirectives, key=lambda directive: directive[3])
|
|
|
|
for d in elementIDs:
|
|
|
|
elementContent += """ elements.push_back(%s());
|
|
|
|
""" % (d[1])
|
2012-05-07 11:59:50 -05:00
|
|
|
|
2012-05-12 12:11:20 -05:00
|
|
|
elementContent += """ return elements;
|
|
|
|
}
|
|
|
|
""";
|
2012-05-07 11:59:50 -05:00
|
|
|
|
2012-07-23 14:58:38 -05:00
|
|
|
f = open(outputH, "w")
|
2012-05-12 12:11:20 -05:00
|
|
|
f.write(elementHeader)
|
|
|
|
f.close()
|
|
|
|
|
2012-07-23 14:58:38 -05:00
|
|
|
f = open(outputCpp, "w")
|
2012-05-12 12:11:20 -05:00
|
|
|
f.write(elementContent)
|
|
|
|
f.close()
|
|
|
|
|
2012-07-23 14:58:38 -05:00
|
|
|
def generateTools(toolFiles, outputCpp, outputH):
|
2012-05-12 12:11:20 -05:00
|
|
|
toolClasses = dict()
|
|
|
|
|
|
|
|
toolHeader = """#ifndef TOOLCLASSES_H
|
|
|
|
#define TOOLCLASSES_H
|
|
|
|
#include <vector>
|
|
|
|
#include "simulation/Tools.h"
|
|
|
|
#include "simulation/tools/SimTool.h"
|
|
|
|
"""
|
|
|
|
|
|
|
|
directives = []
|
2012-07-23 14:58:38 -05:00
|
|
|
|
2012-05-12 12:11:20 -05:00
|
|
|
for toolFile in toolFiles:
|
2012-07-23 14:58:38 -05:00
|
|
|
f = open(toolFile, "r")
|
2012-05-12 12:11:20 -05:00
|
|
|
fileData = f.read()
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
directiveMatcher = '//#TPT-Directive\s+([^\r\n]+)'
|
|
|
|
matcher = re.compile(directiveMatcher)
|
|
|
|
directiveMatches = matcher.findall(fileData)
|
|
|
|
|
|
|
|
for match in directiveMatches:
|
|
|
|
directives.append(match.split(" "))
|
|
|
|
|
|
|
|
classDirectives = []
|
|
|
|
for d in directives:
|
|
|
|
if d[0] == "ToolClass":
|
|
|
|
toolClasses[d[1]] = []
|
|
|
|
toolHeader += "#define %s %s\n" % (d[2], d[3])
|
|
|
|
d[3] = string.atoi(d[3])
|
|
|
|
classDirectives.append(d)
|
|
|
|
|
|
|
|
for d in directives:
|
|
|
|
if d[0] == "ToolHeader":
|
|
|
|
toolClasses[d[1]].append(string.join(d[2:], " ")+";")
|
|
|
|
|
|
|
|
for className, classMembers in toolClasses.items():
|
|
|
|
toolHeader += """class {0}: public SimTool
|
|
|
|
{{
|
|
|
|
public:
|
|
|
|
{0}();
|
|
|
|
virtual ~{0}();
|
|
|
|
virtual int Perform(Simulation * sim, Particle * cpart, int x, int y, float strength);
|
|
|
|
{1}
|
|
|
|
}};
|
|
|
|
""".format(className, string.join(classMembers, "\n"))
|
|
|
|
|
|
|
|
toolHeader += """std::vector<SimTool*> GetTools();
|
|
|
|
#endif
|
|
|
|
"""
|
|
|
|
|
|
|
|
toolContent = """#include "ToolClasses.h"
|
|
|
|
std::vector<SimTool*> GetTools()
|
|
|
|
{
|
|
|
|
std::vector<SimTool*> tools;
|
|
|
|
""";
|
|
|
|
|
|
|
|
toolIDs = sorted(classDirectives, key=lambda directive: directive[3])
|
|
|
|
for d in toolIDs:
|
|
|
|
toolContent += """ tools.push_back(new %s());
|
|
|
|
""" % (d[1])
|
|
|
|
|
|
|
|
toolContent += """ return tools;
|
|
|
|
}
|
|
|
|
""";
|
|
|
|
|
2012-07-23 14:58:38 -05:00
|
|
|
f = open(outputH, "w")
|
2012-05-12 12:11:20 -05:00
|
|
|
f.write(toolHeader)
|
|
|
|
f.close()
|
|
|
|
|
2012-07-23 14:58:38 -05:00
|
|
|
f = open(outputCpp, "w")
|
2012-05-12 12:11:20 -05:00
|
|
|
f.write(toolContent)
|
|
|
|
f.close()
|
|
|
|
|
2012-07-23 14:58:38 -05:00
|
|
|
if(sys.argv[1] == "elements"):
|
|
|
|
generateElements(sys.argv[4:], sys.argv[2], sys.argv[3])
|
|
|
|
elif(sys.argv[1] == "tools"):
|
|
|
|
generateTools(sys.argv[4:], sys.argv[2], sys.argv[3])
|