--- a/PLCControler.py Tue Oct 01 09:24:02 2013 +0200
+++ b/PLCControler.py Wed Oct 02 01:21:35 2013 +0200
@@ -29,6 +29,7 @@
from time import localtime
+from collections import OrderedDict, namedtuple from graphics.GraphicCommons import *
@@ -308,7 +309,6 @@
self.process_children(context, tagname_infos)
tagname = etree.Element('tagname')
tagname.text = self.GetTagName(tagname_infos)
- print etree.tostring(tagname)
output_parent.append(tagname)
@@ -346,6 +346,158 @@
os.path.join(ScriptDirectory, "plcopen", "instance_tagname.xslt"))
#-------------------------------------------------------------------------------
+# Helpers object for generating pou block instances list +#------------------------------------------------------------------------------- +_BoolValue = lambda x: x in ["true", "0"] +_Point = namedtuple("Point", ["x", "y"]) +_BlockInstanceInfos = namedtuple("BlockInstanceInfos", + ["type", "id", "x", "y", "width", "height", "specific_values", "inputs", "outputs"]) +_BlockSpecificValues = ( + namedtuple("BlockSpecificValues", + ["name", "execution_order"]), +_VariableSpecificValues = ( + namedtuple("VariableSpecificValues", + ["name", "value_type", "execution_order"]), +_ConnectionSpecificValues = ( + namedtuple("ConnectionSpecificValues", ["name"]), +_PowerRailSpecificValues = ( + namedtuple("PowerRailSpecificValues", ["connectors"]), +_LDElementSpecificValues = ( + namedtuple("LDElementSpecificValues", + ["name", "negated", "edge", "storage", "execution_order"]), + [str, _BoolValue, str, str, int]) +_DivergenceSpecificValues = ( + namedtuple("DivergenceSpecificValues", ["connectors"]), +_SpecificValuesTuples = { + namedtuple("CommentSpecificValues", ["content"]), + "input": _VariableSpecificValues, + "output": _VariableSpecificValues, + "inout": _VariableSpecificValues, + "connector": _ConnectionSpecificValues, + "continuation": _ConnectionSpecificValues, + "leftPowerRail": _PowerRailSpecificValues, + "rightPowerRail": _PowerRailSpecificValues, + "contact": _LDElementSpecificValues, + "coil": _LDElementSpecificValues, + namedtuple("StepSpecificValues", ["name", "initial", "action"]), + [str, _BoolValue, lambda x: x]), + namedtuple("TransitionSpecificValues", + ["priority", "condition_type", "condition", "connection"]), + [int, str, str, lambda x: x]), + "selectionDivergence": _DivergenceSpecificValues, + "selectionConvergence": _DivergenceSpecificValues, + "simultaneousDivergence": _DivergenceSpecificValues, + "simultaneousConvergence": _DivergenceSpecificValues, + namedtuple("JumpSpecificValues", ["target"]), + namedtuple("ActionBlockSpecificValues", ["actions"]), +_InstanceConnectionInfos = namedtuple("InstanceConnectionInfos", + ["name", "negated", "edge", "position", "links"]) +_ConnectionLinkInfos = namedtuple("ConnectionLinkInfos", + ["refLocalId", "formalParameter", "points"]) +_ActionInfos = namedtuple("ActionInfos", + ["qualifier", "type", "value", "duration", "indicator"]) +def _translate_args(translations, args): + return [translate(arg[0]) if len(arg) > 0 else None + zip(translations, args)] +class BlockInstanceFactory: + def __init__(self, block_instances): + self.BlockInstances = block_instances + self.CurrentInstance = None + self.SpecificValues = None + self.CurrentConnection = None + self.CurrentLink = None + def SetSpecificValues(self, context, *args): + self.SpecificValues = list(args) + self.CurrentInstance = None + self.CurrentConnection = None + self.CurrentLink = None + def AddBlockInstance(self, context, *args): + specific_values_tuple, specific_values_translation = \ + _SpecificValuesTuples.get(args[0][0], _BlockSpecificValues) + if (args[0][0] == "step" and len(self.SpecificValues) < 3 or + args[0][0] == "transition" and len(self.SpecificValues) < 4): + self.SpecificValues.append([None]) + elif args[0][0] == "actionBlock" and len(self.SpecificValues) < 1: + self.SpecificValues.append([[]]) + specific_values = specific_values_tuple(*_translate_args( + specific_values_translation, self.SpecificValues)) + self.SpecificValues = None + self.CurrentInstance = _BlockInstanceInfos( + *(_translate_args([str] + [int] * 5, args) + + [specific_values, [], []])) + self.BlockInstances[self.CurrentInstance.id] = self.CurrentInstance + def AddInstanceConnection(self, context, *args): + connection_args = _translate_args( + [str, str, _BoolValue, str, int, int], args) + self.CurrentConnection = _InstanceConnectionInfos( + *(connection_args[1:4] + [ + _Point(*connection_args[4:6]), []])) + if self.CurrentInstance is not None: + if connection_args[0] == "input": + self.CurrentInstance.inputs.append(self.CurrentConnection) + self.CurrentInstance.outputs.append(self.CurrentConnection) + self.SpecificValues.append([self.CurrentConnection]) + def AddConnectionLink(self, context, *args): + self.CurrentLink = _ConnectionLinkInfos( + *(_translate_args([int, str], args) + [[]])) + self.CurrentConnection.links.append(self.CurrentLink) + def AddLinkPoint(self, context, *args): + self.CurrentLink.points.append(_Point( + *_translate_args([int, int], args))) + def AddAction(self, context, *args): + if len(self.SpecificValues) == 0: + self.SpecificValues.append([[]]) + translated_args = _translate_args([str] * 5, args) + if translated_args[0] is None: + translated_args[0] = "" + self.SpecificValues[0][0].append(_ActionInfos(*translated_args)) +pou_block_instances_xslt = etree.parse( + os.path.join(ScriptDirectory, "plcopen", "pou_block_instances.xslt")) +#------------------------------------------------------------------------------- # Undo Buffer for PLCOpenEditor
#-------------------------------------------------------------------------------
@@ -636,7 +788,6 @@
def GetPouVariables(self, tagname, debug = False):
project = self.GetProject(debug)
@@ -1616,8 +1767,8 @@
basetype_type = basetype.getLocalTag()
return (basetype.getname() if basetype_type == "derived"
else basetype_type.upper())
- elif basetype_content_type == "derived":
- return basetype_content_type.getname()
+ return (basetype_content.getname() if basetype_content_type == "derived" + else basetype_content_type.upper()) # Return Base Type of given possible derived type
@@ -2289,25 +2440,22 @@
return new_id, connections
- # Return the current pou editing instances idx
- def GetEditedElementInstancesIds(self, tagname, debug = False):
+ def GetEditedElementInstancesInfos(self, tagname, debug = False): + element_instances = OrderedDict() element = self.GetEditedElement(tagname, debug)
- return element.getinstancesIds()
- # Return the current pou editing informations
- def GetEditedElementInstanceInfos(self, tagname, id, debug = False):
- element = self.GetEditedElement(tagname, debug)
- if element is not None:
- instance = element.getinstance(id)
- if instance is not None:
- infos = instance.getinfos()
- if infos["type"] in ["input", "output", "inout"]:
- var_type = self.GetEditedElementVarValueType(tagname, infos["specific_values"]["name"], debug)
- infos["specific_values"]["value_type"] = var_type
+ factory = BlockInstanceFactory(element_instances) + pou_block_instances_xslt_tree = etree.XSLT( + pou_block_instances_xslt, + ("pou_block_instances_ns", name): getattr(factory, name) + for name in ["AddBlockInstance", "SetSpecificValues", + "AddInstanceConnection", "AddConnectionLink", + "AddLinkPoint", "AddAction"]}) + pou_block_instances_xslt_tree(element) + return element_instances def ClearEditedElementExecutionOrder(self, tagname):
element = self.GetEditedElement(tagname)
@@ -2319,29 +2467,6 @@
element.compileexecutionOrder()
- # Return the variable type of the given pou
- def GetEditedElementVarValueType(self, tagname, varname, debug = False):
- project = self.GetProject(debug)
- if project is not None:
- words = tagname.split("::")
- if words[0] in ["P","T","A"]:
- pou = self.Project.getpou(words[1])
- if words[0] == "T" and varname == words[2]:
- if words[1] == varname:
- return self.GetPouInterfaceReturnType(pou)[0]
- for type, varlist in pou.getvars():
- for var in varlist.getvariable():
- if var.getname() == varname:
- vartype_content = var.gettype().getcontent()
- vartype_content_type = vartype_content.getLocalTag()
- if vartype_content_type == "derived":
- return vartype_content.getname()
- return vartype_content_type.upper()
def SetConnectionWires(self, connection, connector):
wires = connector.GetWires()
--- a/editors/Viewer.py Tue Oct 01 09:24:02 2013 +0200
+++ b/editors/Viewer.py Wed Oct 02 01:21:35 2013 +0200
@@ -84,36 +84,38 @@
def GetVariableCreationFunction(variable_type):
def variableCreationFunction(viewer, id, specific_values):
return FBD_Variable(viewer, variable_type,
- specific_values["name"],
- specific_values["value_type"],
+ specific_values.value_type, - specific_values["executionOrder"])
+ specific_values.execution_order) return variableCreationFunction
def GetConnectorCreationFunction(connector_type):
def connectorCreationFunction(viewer, id, specific_values):
return FBD_Connector(viewer, connector_type,
- specific_values["name"], id)
+ specific_values.name, id) return connectorCreationFunction
def commentCreationFunction(viewer, id, specific_values):
- return Comment(viewer, specific_values["content"], id)
+ return Comment(viewer, specific_values.content, id) def GetPowerRailCreationFunction(powerrail_type):
def powerRailCreationFunction(viewer, id, specific_values):
return LD_PowerRail(viewer, powerrail_type, id,
- specific_values["connectors"])
+ specific_values.connectors) return powerRailCreationFunction
+MODIFIER_VALUE = lambda x: x if x is not None else 'none' CONTACT_TYPES = {(True, "none"): CONTACT_REVERSE,
(False, "rising"): CONTACT_RISING,
(False, "falling"): CONTACT_FALLING}
def contactCreationFunction(viewer, id, specific_values):
- contact_type = CONTACT_TYPES.get((specific_values.get("negated", False),
- specific_values.get("edge", "none")),
+ contact_type = CONTACT_TYPES.get((specific_values.negated, + MODIFIER_VALUE(specific_values.edge)), - return LD_Contact(viewer, contact_type, specific_values["name"], id)
+ return LD_Contact(viewer, contact_type, specific_values.name, id) COIL_TYPES = {(True, "none", "none"): COIL_REVERSE,
(False, "none", "set"): COIL_SET,
@@ -122,38 +124,38 @@
(False, "falling", "none"): COIL_FALLING}
def coilCreationFunction(viewer, id, specific_values):
- coil_type = COIL_TYPES.get((specific_values.get("negated", False),
- specific_values.get("edge", "none"),
- specific_values.get("storage", "none")),
+ coil_type = COIL_TYPES.get((specific_values.negated, + MODIFIER_VALUE(specific_values.edge), + MODIFIER_VALUE(specific_values.storage)), - return LD_Coil(viewer, coil_type, specific_values["name"], id)
+ return LD_Coil(viewer, coil_type, specific_values.name, id) def stepCreationFunction(viewer, id, specific_values):
- step = SFC_Step(viewer, specific_values["name"],
- specific_values.get("initial", False), id)
- if specific_values.get("action", None):
+ step = SFC_Step(viewer, specific_values.name, + specific_values.initial, id) + if specific_values.action is not None: connector = step.GetActionConnector()
- connector.SetPosition(wx.Point(*specific_values["action"]["position"]))
+ connector.SetPosition(wx.Point(*specific_values.action.position)) def transitionCreationFunction(viewer, id, specific_values):
- transition = SFC_Transition(viewer, specific_values["condition_type"],
- specific_values.get("condition", None),
- specific_values["priority"], id)
+ transition = SFC_Transition(viewer, specific_values.condition_type, + specific_values.condition, + specific_values.priority, id) def GetDivergenceCreationFunction(divergence_type):
def divergenceCreationFunction(viewer, id, specific_values):
return SFC_Divergence(viewer, divergence_type,
- specific_values["connectors"], id)
+ specific_values.connectors, id) return divergenceCreationFunction
def jumpCreationFunction(viewer, id, specific_values):
- return SFC_Jump(viewer, specific_values["target"], id)
+ return SFC_Jump(viewer, specific_values.target, id) def actionBlockCreationFunction(viewer, id, specific_values):
- return SFC_ActionBlock(viewer, specific_values["actions"], id)
+ return SFC_ActionBlock(viewer, specific_values.actions, id) ElementCreationFunctions = {
"input": GetVariableCreationFunction(INPUT),
@@ -1089,13 +1091,10 @@
# List of ids of already loaded blocks
- ids = self.Controler.GetEditedElementInstancesIds(self.TagName, debug = self.Debug)
+ instances = self.Controler.GetEditedElementInstancesInfos(self.TagName, debug = self.Debug) # Load Blocks until they are all loaded
- instance = self.Controler.GetEditedElementInstanceInfos(
- self.TagName, ids.popitem(0)[0], debug = self.Debug)
- if instance is not None:
- self.loadInstance(instance, ids, selection)
+ while len(instances) > 0: + self.loadInstance(instances.popitem(0)[1], instances, selection) if (selection is not None and
isinstance(self.SelectedElement, Graphic_Group)):
@@ -1221,119 +1220,119 @@
self.SelectedElement = group
# Load instance from given informations
- def loadInstance(self, instance, ids, selection):
- self.current_id = max(self.current_id, instance["id"])
- creation_function = ElementCreationFunctions.get(instance["type"], None)
+ def loadInstance(self, instance, remaining_instances, selection): + self.current_id = max(self.current_id, instance.id) + creation_function = ElementCreationFunctions.get(instance.type, None) connectors = {"inputs" : [], "outputs" : []}
- specific_values = instance["specific_values"]
+ specific_values = instance.specific_values if creation_function is not None:
- element = creation_function(self, instance["id"], specific_values)
+ element = creation_function(self, instance.id, specific_values) if isinstance(element, SFC_Step):
- if len(instance["inputs"]) > 0:
+ if len(instance.inputs) > 0: - if len(instance["outputs"]) > 0:
+ if len(instance.outputs) > 0: - if isinstance(element, SFC_Transition) and specific_values["condition_type"] == "connection":
+ if isinstance(element, SFC_Transition) and specific_values.condition_type == "connection": connector = element.GetConditionConnector()
- self.CreateWires(connector, instance["id"], specific_values["connection"]["links"], ids, selection)
+ self.CreateWires(connector, instance.id, specific_values.connection.links, remaining_instances, selection) - for input in instance["inputs"]:
- connectors["inputs"].append((input["name"], None, "negated"))
- connectors["inputs"].append((input["name"], None, input["edge"]))
+ for input in instance.inputs: + input_edge = MODIFIER_VALUE(input.edge) + connectors["inputs"].append((input.name, None, "negated")) + connectors["inputs"].append((input.name, None, input_edge)) - connectors["inputs"].append((input["name"], None, "none"))
- for output in instance["outputs"]:
- connectors["outputs"].append((output["name"], None, "negated"))
- connectors["outputs"].append((output["name"], None, output["edge"]))
+ connectors["inputs"].append((input.name, None, "none")) + for output in instance.outputs: + output_edge = MODIFIER_VALUE(output.edge) + connectors["outputs"].append((output.name, None, "negated")) + connectors["outputs"].append((output.name, None, output_edge)) - connectors["outputs"].append((output["name"], None, "none"))
+ connectors["outputs"].append((output.name, None, "none")) if len(connectors["inputs"]) > 0 and connectors["inputs"][0][0] == "EN":
connectors["inputs"].pop(0)
if len(connectors["outputs"]) > 0 and connectors["outputs"][0][0] == "ENO":
connectors["outputs"].pop(0)
- if specific_values["name"] is None:
- specific_values["name"] = ""
- element = FBD_Block(self, instance["type"], specific_values["name"],
- instance["id"], len(connectors["inputs"]),
+ block_name = specific_values.name if specific_values.name is not None else "" + element = FBD_Block(self, instance.type, block_name, + instance.id, len(connectors["inputs"]), connectors=connectors, executionControl=executionControl,
- executionOrder=specific_values["executionOrder"])
+ executionOrder=specific_values.execution_order) if isinstance(element, Comment):
connectors = element.GetConnectors()
- element.SetPosition(instance["x"], instance["y"])
- element.SetSize(instance["width"], instance["height"])
- for i, output_connector in enumerate(instance["outputs"]):
+ element.SetPosition(instance.x, instance.y) + element.SetSize(instance.width, instance.height) + for i, output_connector in enumerate(instance.outputs): + connector_pos = wx.Point(*output_connector.position) if isinstance(element, FBD_Block):
- connector = element.GetConnector(
- wx.Point(*output_connector["position"]),
- output_name = output_connector["name"])
+ connector = element.GetConnector(connector_pos, + output_name = output_connector.name) elif i < len(connectors["outputs"]):
connector = connectors["outputs"][i]
if connector is not None:
- if output_connector.get("negated", False):
+ if output_connector.negated: connector.SetNegated(True)
- if output_connector.get("edge", "none") != "none":
- connector.SetEdge(output_connector["edge"])
+ if output_connector.edge is not None: + connector.SetEdge(output_connector.edge) if connectors["outputs"].index(connector) == i:
- connector.SetPosition(wx.Point(*output_connector["position"]))
- for i, input_connector in enumerate(instance["inputs"]):
+ connector.SetPosition(connector_pos) + for i, input_connector in enumerate(instance.inputs): + connector_pos = wx.Point(*input_connector.position) if isinstance(element, FBD_Block):
- connector = element.GetConnector(
- wx.Point(*input_connector["position"]),
- input_name = input_connector["name"])
+ connector = element.GetConnector(connector_pos, + input_name = input_connector.name) elif i < len(connectors["inputs"]):
connector = connectors["inputs"][i]
if connector is not None:
if connectors["inputs"].index(connector) == i:
- connector.SetPosition(wx.Point(*input_connector["position"]))
- if input_connector.get("negated", False):
+ connector.SetPosition(connector_pos) + if input_connector.negated: connector.SetNegated(True)
- if input_connector.get("edge", "none") != "none":
- connector.SetEdge(input_connector["edge"])
- if not self.CreateWires(connector, instance["id"], input_connector["links"], ids, selection):
+ if input_connector.edge is not None: + connector.SetEdge(input_connector.edge) + if not self.CreateWires(connector, instance.id, input_connector.links, remaining_instances, selection): element.RefreshConnectors()
- if selection is not None and selection[0].get(instance["id"], False):
+ if selection is not None and selection[0].get(instance.id, False): self.SelectInGroup(element)
- def CreateWires(self, start_connector, id, links, ids, selection=None):
+ def CreateWires(self, start_connector, id, links, remaining_instances, selection=None): - refLocalId = link["refLocalId"]
+ refLocalId = link.refLocalId - if ids.pop(refLocalId, False):
- new_instance = self.Controler.GetEditedElementInstanceInfos(self.TagName, refLocalId, debug = self.Debug)
- if new_instance is not None:
- self.loadInstance(new_instance, ids, selection)
+ new_instance = remaining_instances.pop(refLocalId, None) + if new_instance is not None: + self.loadInstance(new_instance, remaining_instances, selection) connected = self.FindElementById(refLocalId)
- points = link["points"]
end_connector = connected.GetConnector(
- wx.Point(points[-1][0], points[-1][1])
+ wx.Point(points[-1].x, points[-1].y) if len(points) > 0 else wx.Point(0, 0),
- link["formalParameter"])
if end_connector is not None:
--- a/graphics/SFC_Objects.py Tue Oct 01 09:24:02 2013 +0200
+++ b/graphics/SFC_Objects.py Wed Oct 02 01:21:35 2013 +0200
@@ -1894,18 +1894,18 @@
for action in self.Actions:
- width, height = self.Parent.GetTextExtent(action["qualifier"])
+ width, height = self.Parent.GetTextExtent(action.qualifier) self.ColSize[0] = max(self.ColSize[0], width + 10)
- if action.has_key("duration"):
- width, height = self.Parent.GetTextExtent(action["duration"])
+ if action.duration is not None: + width, height = self.Parent.GetTextExtent(action.duration) row_height = max(row_height, height)
self.ColSize[0] = max(self.ColSize[0], width + 10)
- width, height = self.Parent.GetTextExtent(action["value"])
+ width, height = self.Parent.GetTextExtent(action.value) row_height = max(row_height, height)
self.ColSize[1] = max(self.ColSize[1], width + 10)
- if action.get("indicator", "") != "":
- width, height = self.Parent.GetTextExtent(action["indicator"])
+ if action.indicator is not None: + width, height = self.Parent.GetTextExtent(action.indicator) row_height = max(row_height, height)
self.ColSize[2] = max(self.ColSize[2], width + 10)
min_height += row_height + 5
@@ -2022,39 +2022,39 @@
dc.DrawLine(self.Pos.x, self.Pos.y + i * line_size,
self.Pos.x + self.Size[0], self.Pos.y + i * line_size)
- qualifier_size = dc.GetTextExtent(action["qualifier"])
- if action.has_key("duration"):
+ qualifier_size = dc.GetTextExtent(action.qualifier) + if action.duration is not None: qualifier_pos = (self.Pos.x + (colsize[0] - qualifier_size[0]) / 2,
self.Pos.y + i * line_size + line_size / 2 - qualifier_size[1])
- duration_size = dc.GetTextExtent(action["duration"])
+ duration_size = dc.GetTextExtent(action.duration) duration_pos = (self.Pos.x + (colsize[0] - duration_size[0]) / 2,
self.Pos.y + i * line_size + line_size / 2)
- dc.DrawText(action["duration"], duration_pos[0], duration_pos[1])
+ dc.DrawText(action.duration, duration_pos[0], duration_pos[1]) qualifier_pos = (self.Pos.x + (colsize[0] - qualifier_size[0]) / 2,
self.Pos.y + i * line_size + (line_size - qualifier_size[1]) / 2)
- dc.DrawText(action["qualifier"], qualifier_pos[0], qualifier_pos[1])
- content_size = dc.GetTextExtent(action["value"])
+ dc.DrawText(action.qualifier, qualifier_pos[0], qualifier_pos[1]) + content_size = dc.GetTextExtent(action.value) content_pos = (self.Pos.x + colsize[0] + (colsize[1] - content_size[0]) / 2,
self.Pos.y + i * line_size + (line_size - content_size[1]) / 2)
- dc.DrawText(action["value"], content_pos[0], content_pos[1])
- if action.has_key("indicator"):
- indicator_size = dc.GetTextExtent(action["indicator"])
+ dc.DrawText(action.value, content_pos[0], content_pos[1]) + if action.indicator is not None: + indicator_size = dc.GetTextExtent(action.indicator) indicator_pos = (self.Pos.x + colsize[0] + colsize[1] + (colsize[2] - indicator_size[0]) / 2,
self.Pos.y + i * line_size + (line_size - indicator_size[1]) / 2)
- dc.DrawText(action["indicator"], indicator_pos[0], indicator_pos[1])
+ dc.DrawText(action.indicator, indicator_pos[0], indicator_pos[1]) if not getattr(dc, "printing", False):
action_highlights = self.Highlights.get(i, {})
for name, attribute_highlights in action_highlights.iteritems():
- DrawHighlightedText(dc, action["qualifier"], attribute_highlights, qualifier_pos[0], qualifier_pos[1])
+ DrawHighlightedText(dc, action.qualifier, attribute_highlights, qualifier_pos[0], qualifier_pos[1]) - DrawHighlightedText(dc, action["duration"], attribute_highlights, duration_pos[0], duration_pos[1])
+ DrawHighlightedText(dc, action.duration, attribute_highlights, duration_pos[0], duration_pos[1]) elif name in ["reference", "inline"]:
- DrawHighlightedText(dc, action["value"], attribute_highlights, content_pos[0], content_pos[1])
+ DrawHighlightedText(dc, action.value, attribute_highlights, content_pos[0], content_pos[1]) elif name == "indicator":
- DrawHighlightedText(dc, action["indicator"], attribute_highlights, indicator_pos[0], indicator_pos[1])
+ DrawHighlightedText(dc, action.indicator, attribute_highlights, indicator_pos[0], indicator_pos[1]) --- a/plcopen/plcopen.py Tue Oct 01 09:24:02 2013 +0200
+++ b/plcopen/plcopen.py Wed Oct 02 01:21:35 2013 +0200
@@ -1874,145 +1874,8 @@
setattr(cls, "Search", _SearchInElement)
-def _getexecutionOrder(instance, specific_values):
- executionOrder = instance.getexecutionOrderId()
- if executionOrder is None:
- specific_values["executionOrder"] = executionOrder
-def _getdefaultmodifiers(instance, infos):
- infos["negated"] = instance.getnegated()
- infos["edge"] = instance.getedge()
-def _getinputmodifiers(instance, infos):
- infos["negated"] = instance.getnegatedIn()
- infos["edge"] = instance.getedgeIn()
-def _getoutputmodifiers(instance, infos):
- infos["negated"] = instance.getnegatedOut()
- infos["edge"] = instance.getedgeOut()
-MODIFIERS_FUNCTIONS = {"default": _getdefaultmodifiers,
- "input": _getinputmodifiers,
- "output": _getoutputmodifiers}
-def _getconnectioninfos(instance, connection, links=False, modifiers=None, parameter=False):
- infos = {"position": connection.getrelPositionXY()}
- infos["name"] = instance.getformalParameter()
- MODIFIERS_FUNCTIONS.get(modifiers, lambda x, y: None)(instance, infos)
- connections = connection.getconnections()
- if connections is not None:
- for link in connections:
- dic = {"refLocalId": link.getrefLocalId(),
- "points": link.getpoints(),
- "formalParameter": link.getformalParameter()}
- infos["links"].append(dic)
-def _getelementinfos(instance):
- return {"id": instance.getlocalId(),
- "height": instance.getheight(),
- "width": instance.getwidth(),
-def _getvariableinfosFunction(type, input, output):
- def getvariableinfos(self):
- infos = _getelementinfos(self)
- specific_values = infos["specific_values"]
- specific_values["name"] = self.getexpression()
- _getexecutionOrder(self, specific_values)
- infos["inputs"].append(_getconnectioninfos(self, self.connectionPointIn, True, "input"))
- infos["outputs"].append(_getconnectioninfos(self, self.connectionPointOut, False, "output"))
- infos["inputs"].append(_getconnectioninfos(self, self.connectionPointIn, True, "default"))
- infos["outputs"].append(_getconnectioninfos(self, self.connectionPointOut, False, "default"))
- return getvariableinfos
-def _getconnectorinfosFunction(type):
- def getconnectorinfos(self):
- infos = _getelementinfos(self)
- infos["specific_values"]["name"] = self.getname()
- if type == "connector":
- infos["inputs"].append(_getconnectioninfos(self, self.connectionPointIn, True))
- elif type == "continuation":
- infos["outputs"].append(_getconnectioninfos(self, self.connectionPointOut))
- return getconnectorinfos
-def _getpowerrailinfosFunction(type):
- def getpowerrailinfos(self):
- infos = _getelementinfos(self)
- if type == "rightPowerRail":
- for connectionPointIn in self.getconnectionPointIn():
- infos["inputs"].append(_getconnectioninfos(self, connectionPointIn, True))
- infos["specific_values"]["connectors"] = len(infos["inputs"])
- elif type == "leftPowerRail":
- for connectionPointOut in self.getconnectionPointOut():
- infos["outputs"].append(_getconnectioninfos(self, connectionPointOut))
- infos["specific_values"]["connectors"] = len(infos["outputs"])
- return getpowerrailinfos
-def _getldelementinfosFunction(ld_element_type):
- def getldelementinfos(self):
- infos = _getelementinfos(self)
- infos["type"] = ld_element_type
- specific_values = infos["specific_values"]
- specific_values["name"] = self.getvariable()
- _getexecutionOrder(self, specific_values)
- specific_values["negated"] = self.getnegated()
- specific_values["edge"] = self.getedge()
- if ld_element_type == "coil":
- specific_values["storage"] = self.getstorage()
- infos["inputs"].append(_getconnectioninfos(self, self.connectionPointIn, True))
- infos["outputs"].append(_getconnectioninfos(self, self.connectionPointOut))
- return getldelementinfos
-DIVERGENCE_TYPES = {(True, True): "simultaneousDivergence",
- (True, False): "selectionDivergence",
- (False, True): "simultaneousConvergence",
- (False, False): "selectionConvergence"}
-def _getdivergenceinfosFunction(divergence, simultaneous):
- def getdivergenceinfos(self):
- infos = _getelementinfos(self)
- infos["type"] = DIVERGENCE_TYPES[(divergence, simultaneous)]
- infos["inputs"].append(_getconnectioninfos(self, self.connectionPointIn, True))
- for connectionPointOut in self.getconnectionPointOut():
- infos["outputs"].append(_getconnectioninfos(self, connectionPointOut))
- infos["specific_values"]["connectors"] = len(infos["outputs"])
- for connectionPointIn in self.getconnectionPointIn():
- infos["inputs"].append(_getconnectioninfos(self, connectionPointIn, True))
- infos["outputs"].append(_getconnectioninfos(self, self.connectionPointOut))
- infos["specific_values"]["connectors"] = len(infos["inputs"])
- return getdivergenceinfos
cls = _initElementClass("comment", "commonObjects")
- infos = _getelementinfos(self)
- infos["type"] = "comment"
- infos["specific_values"]["content"] = self.getcontentText()
- setattr(cls, "getinfos", getinfos)
def setcontentText(self, text):
self.content.setanyText(text)
setattr(cls, "setcontentText", setcontentText)
@@ -2042,19 +1905,6 @@
setattr(cls, "getBoundingBox", getBoundingBox)
- infos = _getelementinfos(self)
- infos["type"] = self.gettypeName()
- specific_values = infos["specific_values"]
- specific_values["name"] = self.getinstanceName()
- _getexecutionOrder(self, specific_values)
- for variable in self.inputVariables.getvariable():
- infos["inputs"].append(_getconnectioninfos(variable, variable.connectionPointIn, True, "default", True))
- for variable in self.outputVariables.getvariable():
- infos["outputs"].append(_getconnectioninfos(variable, variable.connectionPointOut, False, "default", True))
- setattr(cls, "getinfos", getinfos)
def updateElementName(self, old_name, new_name):
if self.typeName == old_name:
@@ -2092,14 +1942,6 @@
setattr(cls, "Search", Search)
-cls = _initElementClass("leftPowerRail", "ldObjects")
- setattr(cls, "getinfos", _getpowerrailinfosFunction("leftPowerRail"))
-cls = _initElementClass("rightPowerRail", "ldObjects", "multiple")
- setattr(cls, "getinfos", _getpowerrailinfosFunction("rightPowerRail"))
def _UpdateLDElementName(self, old_name, new_name):
if self.variable == old_name:
@@ -2114,60 +1956,24 @@
cls = _initElementClass("contact", "ldObjects", "single")
- setattr(cls, "getinfos", _getldelementinfosFunction("contact"))
setattr(cls, "updateElementName", _UpdateLDElementName)
setattr(cls, "updateElementAddress", _UpdateLDElementAddress)
setattr(cls, "Search", _getSearchInLDElement("contact"))
cls = _initElementClass("coil", "ldObjects", "single")
- setattr(cls, "getinfos", _getldelementinfosFunction("coil"))
setattr(cls, "updateElementName", _UpdateLDElementName)
setattr(cls, "updateElementAddress", _UpdateLDElementAddress)
setattr(cls, "Search", _getSearchInLDElement("coil"))
cls = _initElementClass("step", "sfcObjects", "single")
- infos = _getelementinfos(self)
- specific_values = infos["specific_values"]
- specific_values["name"] = self.getname()
- specific_values["initial"] = self.getinitialStep()
- if self.connectionPointIn is not None:
- infos["inputs"].append(_getconnectioninfos(self, self.connectionPointIn, True))
- if self.connectionPointOut is not None:
- infos["outputs"].append(_getconnectioninfos(self, self.connectionPointOut))
- if self.connectionPointOutAction is not None:
- specific_values["action"] = _getconnectioninfos(self, self.connectionPointOutAction)
- setattr(cls, "getinfos", getinfos)
def Search(self, criteria, parent_infos=[]):
return _Search([("name", self.getname())], criteria, parent_infos + ["step", self.getlocalId()])
setattr(cls, "Search", Search)
cls = _initElementClass("transition", "sfcObjects")
- infos = _getelementinfos(self)
- infos["type"] = "transition"
- specific_values = infos["specific_values"]
- priority = self.getpriority()
- specific_values["priority"] = priority
- condition = self.getconditionContent()
- specific_values["condition_type"] = condition["type"]
- if specific_values["condition_type"] == "connection":
- specific_values["connection"] = _getconnectioninfos(self, condition["value"], True)
- specific_values["condition"] = condition["value"]
- infos["inputs"].append(_getconnectioninfos(self, self.connectionPointIn, True))
- infos["outputs"].append(_getconnectioninfos(self, self.connectionPointOut))
- setattr(cls, "getinfos", getinfos)
def setconditionContent(self, condition_type, value):
if self.condition is None:
@@ -2278,32 +2084,8 @@
setattr(cls, "Search", Search)
-cls = _initElementClass("selectionDivergence", "sfcObjects", "single")
- setattr(cls, "getinfos", _getdivergenceinfosFunction(True, False))
-cls = _initElementClass("selectionConvergence", "sfcObjects", "multiple")
- setattr(cls, "getinfos", _getdivergenceinfosFunction(False, False))
-cls = _initElementClass("simultaneousDivergence", "sfcObjects", "single")
- setattr(cls, "getinfos", _getdivergenceinfosFunction(True, True))
-cls = _initElementClass("simultaneousConvergence", "sfcObjects", "multiple")
- setattr(cls, "getinfos", _getdivergenceinfosFunction(False, True))
cls = _initElementClass("jumpStep", "sfcObjects", "single")
- infos = _getelementinfos(self)
- infos["specific_values"]["target"] = self.gettargetName()
- infos["inputs"].append(_getconnectioninfos(self, self.connectionPointIn, True))
- setattr(cls, "getinfos", getinfos)
def Search(self, criteria, parent_infos):
return _Search([("target", self.gettargetName())], criteria, parent_infos + ["jump", self.getlocalId()])
setattr(cls, "Search", Search)
@@ -2361,14 +2143,6 @@
cls = _initElementClass("actionBlock", "commonObjects", "single")
- infos = _getelementinfos(self)
- infos["type"] = "actionBlock"
- infos["specific_values"]["actions"] = self.getactions()
- infos["inputs"].append(_getconnectioninfos(self, self.connectionPointIn, True))
- setattr(cls, "getinfos", getinfos)
def setactions(self, actions):
@@ -2440,21 +2214,18 @@
cls = _initElementClass("inVariable", "fbdObjects")
- setattr(cls, "getinfos", _getvariableinfosFunction("input", False, True))
setattr(cls, "updateElementName", _UpdateIOElementName)
setattr(cls, "updateElementAddress", _UpdateIOElementAddress)
setattr(cls, "Search", _SearchInIOVariable)
cls = _initElementClass("outVariable", "fbdObjects", "single")
- setattr(cls, "getinfos", _getvariableinfosFunction("output", True, False))
setattr(cls, "updateElementName", _UpdateIOElementName)
setattr(cls, "updateElementAddress", _UpdateIOElementAddress)
setattr(cls, "Search", _SearchInIOVariable)
cls = _initElementClass("inOutVariable", "fbdObjects", "single")
- setattr(cls, "getinfos", _getvariableinfosFunction("inout", True, True))
setattr(cls, "updateElementName", _UpdateIOElementName)
setattr(cls, "updateElementAddress", _UpdateIOElementAddress)
setattr(cls, "Search", _SearchInIOVariable)
@@ -2465,7 +2236,6 @@
cls = _initElementClass("continuation", "commonObjects")
- setattr(cls, "getinfos", _getconnectorinfosFunction("continuation"))
setattr(cls, "Search", _SearchInConnector)
def updateElementName(self, old_name, new_name):
@@ -2475,7 +2245,6 @@
cls = _initElementClass("connector", "commonObjects", "single")
- setattr(cls, "getinfos", _getconnectorinfosFunction("connector"))
setattr(cls, "Search", _SearchInConnector)
def updateElementName(self, old_name, new_name):