etisserant@12: import os etisserant@12: from DEFControler import DEFControler etisserant@12: from defeditor import EditorFrame lbessard@11: etisserant@13: class _EditorFramePlug(EditorFrame): etisserant@12: def OnClose(self, event): etisserant@13: self.OnPlugClose() etisserant@12: event.Skip() etisserant@12: etisserant@13: class _DEFControlerPlug(DEFControler): etisserant@12: etisserant@13: ViewClass = _EditorFramePlug etisserant@12: etisserant@12: def __init__(self, buspath): etisserant@12: filepath = os.path.join(buspath, "gui.def") etisserant@12: if os.path.isfile(filepath): etisserant@12: self.OpenXMLFile(filepath) etisserant@13: else: etisserant@12: self.CreateRootElement() etisserant@12: self.SetFilePath(filepath) etisserant@12: etisserant@12: def ReqSave(self): etisserant@12: self.SaveXMLFile() etisserant@12: return True etisserant@12: etisserant@12: def Generate_C(self, dirpath, locations): etisserant@12: self.GenerateProgram(filepath) etisserant@12: return {"headers":["program.h"],"sources":["program.cpp"]} etisserant@12: lbessard@11: TYPECONVERSION = {"BOOL" : "X", "SINT" : "B", "INT" : "W", "DINT" : "D", "LINT" : "L", lbessard@11: "USINT" : "B", "UINT" : "W", "UDINT" : "D", "ULINT" : "L", "REAL" : "D", "LREAL" : "L", lbessard@11: "STRING" : "B", "BYTE" : "B", "WORD" : "W", "DWORD" : "D", "LWORD" : "L", "WSTRING" : "W"} lbessard@11: etisserant@13: class RootClass: etisserant@13: etisserant@13: ChildsType = _DEFControlerPlug etisserant@13: etisserant@12: def BlockTypesFactory(self): etisserant@12: def generate_svgui_block(generator, block, body, link): etisserant@12: controller = generator.GetController() etisserant@12: name = block.getInstanceName() etisserant@12: type = block.getTypeName() etisserant@12: block_infos = GetBlockType(type) etisserant@12: bus_id, name = [word for word in name.split("_") if word != ""] etisserant@13: block_id = self.PlugChilds[bus_id].GetElementIdFromName(name) etisserant@12: if block_id == None: etisserant@12: raise ValueError, "No corresponding block found" etisserant@12: if not generator.ComputedBlocks.get(name, False): etisserant@12: for num, variable in enumerate(block.inputVariables.getVariable()): etisserant@12: connections = variable.connectionPointIn.getConnections() etisserant@12: if connections and len(connections) == 1: etisserant@12: parameter = "__I%s%d_%d_%d"%(TYPECONVERSION[block_infos["inputs"][num][1]], bus_id, block_id, num) etisserant@12: value = generator.ComputeFBDExpression(body, connections[0]) etisserant@12: generator.Program += (" %s := %s;\n"%(parameter, generator.ExtractModifier(variable, value))) etisserant@12: generator.ComputedBlocks[name] = True etisserant@12: if link: etisserant@12: connectionPoint = link.getPosition()[-1] etisserant@12: for num, variable in enumerate(block.outputVariables.getVariable()): etisserant@12: blockPointx, blockPointy = variable.connectionPointOut.getRelPosition() etisserant@12: if block.getX() + blockPointx == connectionPoint.getX() and block.getY() + blockPointy == connectionPoint.getY(): etisserant@12: return "__Q%s%d_%d_%d"%(TYPECONVERSION[block_infos["outputs"][num][1]], bus_id, block_id, num) etisserant@12: raise ValueError, "No output variable found" etisserant@12: else: etisserant@12: return None lbessard@11: etisserant@12: return [{"name" : "SVGUI function blocks", "list" : etisserant@12: [{"name" : "Container", "type" : "functionBlock", "extensible" : False, etisserant@12: "inputs" : [("X","FLOAT","none"),("SetX","BOOL","none"),("Y","FLOAT","none"),("SetY","BOOL","none"),("Angle","FLOAT","none"),("SetAngle","BOOL","none")], etisserant@12: "outputs" : [("X","FLOAT","none"),("X Changed","BOOL","none"),("Y","FLOAT","none"),("Y Changed","BOOL","none"),("Angle","FLOAT","none"),("Angle Changed","BOOL","none")], etisserant@12: "comment" : "SVGUI Container", "generate": generate_svgui_block}, etisserant@12: {"name" : "Button", "type" : "functionBlock", "extensible" : False, etisserant@12: "inputs" : [("Show","BOOL","none"),("Toggle","BOOL","none")], etisserant@12: "outputs" : [("Visible","BOOL","none"),("State","BOOL","none")], etisserant@12: "comment" : "SVGUI Button", "generate": generate_svgui_block}, etisserant@12: {"name" : "TextCtrl", "type" : "functionBlock", "extensible" : False, etisserant@12: "inputs" : [("Text","STRING","none"),("Set Text","BOOL","none")], etisserant@12: "outputs" : [("Text","STRING","none"),("Text Changed","BOOL","none")], etisserant@12: "comment" : "SVGUI Text Control", "generate": generate_svgui_block}, etisserant@12: {"name" : "ScrollBar", "type" : "functionBlock", "extensible" : False, etisserant@12: "inputs" : [("Position","UINT","none"),("Set Position","BOOL","none")], etisserant@12: "outputs" : [("Position","UINT","none"),("Position Changed","BOOL","none")], etisserant@12: "comment" : "SVGUI ScrollBar", "generate": generate_svgui_block}, etisserant@12: {"name" : "NoteBook", "type" : "functionBlock", "extensible" : False, etisserant@12: "inputs" : [("Selected","UINT","none"),("Set Selected","BOOL","none")], etisserant@12: "outputs" : [("Selected","UINT","none"),("Selected Changed","BOOL","none")], etisserant@12: "comment" : "SVGUI Notebook", "generate": generate_svgui_block}, etisserant@12: {"name" : "RotatingCtrl", "type" : "functionBlock", "extensible" : False, etisserant@12: "inputs" : [("Angle","FLOAT","none"),("Set Angle","BOOL","none")], etisserant@12: "outputs" : [("Angle","FLOAT","none"),("Angle changed","BOOL","none")], etisserant@12: "comment" : "SVGUI Rotating Control", "generate": generate_svgui_block} etisserant@12: ]}] etisserant@12: etisserant@12: etisserant@12: etisserant@12: etisserant@12: etisserant@12: etisserant@12: etisserant@12: etisserant@12: