--- a/editors/Viewer.py Wed Jul 31 10:45:07 2013 +0900
+++ b/editors/Viewer.py Mon Nov 18 12:12:31 2013 +0900
@@ -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.name,
+ specific_values.value_type,
id,
- 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)),
CONTACT_NORMAL)
- 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)),
COIL_NORMAL)
- 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:
step.AddAction()
connector = step.GetActionConnector()
- connector.SetPosition(wx.Point(*specific_values["action"]["position"]))
+ connector.SetPosition(wx.Point(*specific_values.action.position))
return step
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)
return transition
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),
@@ -330,7 +332,7 @@
var_class = INPUT
else:
var_class = INPUT
- tree = dict([(var["Name"], var["Tree"]) for var in self.ParentWindow.Controler.GetEditedElementInterfaceVars(tagname, self.ParentWindow.Debug)]).get(values[0], None)
+ tree = dict([(var.Name, var.Tree) for var in self.ParentWindow.Controler.GetEditedElementInterfaceVars(tagname, True, self.ParentWindow.Debug)]).get(values[0], None)
if tree is not None:
if len(tree[0]) > 0:
menu = wx.Menu(title='')
@@ -568,6 +570,7 @@
self.Editor.SetBackgroundColour(wx.Colour(255,255,255))
self.Editor.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
self.ResetView()
+ self.LastClientSize = None
self.Scaling = None
self.DrawGrid = True
self.GridBrush = wx.TRANSPARENT_BRUSH
@@ -1050,22 +1053,21 @@
self.ElementRefreshList.append(element)
self.ElementRefreshList_lock.release()
- def RefreshNewData(self):
- refresh_rect = None
- self.ElementRefreshList_lock.acquire()
- for element in self.ElementRefreshList:
- if refresh_rect is None:
- refresh_rect = element.GetRedrawRect()
- else:
- refresh_rect.Union(element.GetRedrawRect())
- self.ElementRefreshList = []
- self.ElementRefreshList_lock.release()
-
- if refresh_rect is not None:
- self.RefreshRect(self.GetScrolledRect(refresh_rect), False)
- else:
- DebugViewer.RefreshNewData(self)
-
+ def NewDataAvailable(self, ticks, *args, **kwargs):
+ if self.IsShown():
+ refresh_rect = None
+ self.ElementRefreshList_lock.acquire()
+ for element in self.ElementRefreshList:
+ if refresh_rect is None:
+ refresh_rect = element.GetRedrawRect()
+ else:
+ refresh_rect.Union(element.GetRedrawRect())
+ self.ElementRefreshList = []
+ self.ElementRefreshList_lock.release()
+
+ if refresh_rect is not None:
+ self.RefreshRect(self.GetScrolledRect(refresh_rect), False)
+
def SubscribeAllDataConsumers(self):
self.RefreshView()
DebugViewer.SubscribeAllDataConsumers(self)
@@ -1074,7 +1076,7 @@
def RefreshView(self, variablepanel=True, selection=None):
EditorPanel.RefreshView(self, variablepanel)
- if self.TagName.split("::")[0] == "A":
+ if self.TagName.split("::")[0] == "A" and self.Debug:
self.AddDataConsumer("%s.Q" % self.InstancePath.upper(), self)
if self.ToolTipElement is not None:
@@ -1089,12 +1091,10 @@
self.ResetBuffer()
instance = {}
# List of ids of already loaded blocks
- ids = []
+ instances = self.Controler.GetEditedElementInstancesInfos(self.TagName, debug = self.Debug)
# Load Blocks until they are all loaded
- while instance is not None:
- instance = self.Controler.GetEditedElementInstanceInfos(self.TagName, exclude = ids, 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)):
@@ -1220,124 +1220,133 @@
self.SelectedElement = group
# Load instance from given informations
- def loadInstance(self, instance, ids, selection):
- ids.append(instance["id"])
- 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:
element.AddInput()
else:
element.RemoveInput()
- if len(instance["outputs"]) > 0:
+ if len(instance.outputs) > 0:
element.AddOutput()
- 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)
else:
executionControl = False
- for input in instance["inputs"]:
- if input["negated"]:
- connectors["inputs"].append((input["name"], None, "negated"))
- elif input["edge"]:
- connectors["inputs"].append((input["name"], None, input["edge"]))
+ for input in instance.inputs:
+ input_edge = MODIFIER_VALUE(input.edge)
+ if input.negated:
+ connectors["inputs"].append((input.name, None, "negated"))
+ elif input_edge:
+ connectors["inputs"].append((input.name, None, input_edge))
else:
- connectors["inputs"].append((input["name"], None, "none"))
- for output in instance["outputs"]:
- if output["negated"]:
- connectors["outputs"].append((output["name"], None, "negated"))
- elif output["edge"]:
- 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)
+ if output.negated:
+ connectors["outputs"].append((output.name, None, "negated"))
+ elif output_edge:
+ connectors["outputs"].append((output.name, None, output_edge))
else:
- 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)
executionControl = True
if len(connectors["outputs"]) > 0 and connectors["outputs"][0][0] == "ENO":
connectors["outputs"].pop(0)
executionControl = True
- 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):
self.AddComment(element)
else:
self.AddBlock(element)
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]
else:
connector = None
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]
else:
connector = None
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.RefreshModel()
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):
links_connected = True
for link in links:
- refLocalId = link["refLocalId"]
+ refLocalId = link.refLocalId
if refLocalId is None:
links_connected = False
continue
- if refLocalId not in ids:
- 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)
if connected is None:
links_connected = False
continue
- points = link["points"]
- end_connector = connected.GetConnector(wx.Point(points[-1][0], points[-1][1]), link["formalParameter"])
+ points = link.points
+ end_connector = connected.GetConnector(
+ 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:
- wire = Wire(self)
- wire.SetPoints(points)
- start_connector.Connect((wire, 0), False)
- end_connector.Connect((wire, -1), False)
- wire.ConnectStartPoint(None, start_connector)
- wire.ConnectEndPoint(None, end_connector)
+ if len(points) > 0:
+ wire = Wire(self)
+ wire.SetPoints(points)
+ else:
+ wire = Wire(self,
+ [wx.Point(*start_connector.GetPosition()),
+ start_connector.GetDirection()],
+ [wx.Point(*end_connector.GetPosition()),
+ end_connector.GetDirection()])
+ start_connector.Wires.append((wire, 0))
+ end_connector.Wires.append((wire, -1))
+ wire.StartConnected = start_connector
+ wire.EndConnected = end_connector
connected.RefreshConnectors()
self.AddWire(wire)
if selection is not None and (\
@@ -2214,7 +2223,6 @@
movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling)
if movex != 0 or movey != 0:
self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False)
- self.RefreshVisibleElements()
elif self.Debug and self.StartMousePos is not None and event.Dragging():
pos = event.GetPosition()
if abs(self.StartMousePos.x - pos.x) > 5 or abs(self.StartMousePos.y - pos.y) > 5:
@@ -2423,11 +2431,12 @@
executionOrder = values["executionOrder"])
self.Controler.AddEditedElementBlock(self.TagName, id, values["type"], values.get("name", None))
connector = None
- for input_connector in block.GetConnectors()["inputs"]:
- if input_connector.IsCompatible(
- wire.GetStartConnectedType()):
- connector = input_connector
- break
+ if wire is not None:
+ for input_connector in block.GetConnectors()["inputs"]:
+ if input_connector.IsCompatible(
+ wire.GetStartConnectedType()):
+ connector = input_connector
+ break
self.AddNewElement(block, bbox, wire, connector)
dialog.Destroy()
@@ -2610,7 +2619,7 @@
dialog = ActionBlockDialog(self.ParentWindow)
dialog.SetQualifierList(self.Controler.GetQualifierTypes())
dialog.SetActionList(self.Controler.GetEditedElementActions(self.TagName, self.Debug))
- dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
+ dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug))
if dialog.ShowModal() == wx.ID_OK:
id = self.GetNewId()
actionblock = SFC_ActionBlock(self, dialog.GetValues(), id)
@@ -2860,7 +2869,7 @@
dialog = ActionBlockDialog(self.ParentWindow)
dialog.SetQualifierList(self.Controler.GetQualifierTypes())
dialog.SetActionList(self.Controler.GetEditedElementActions(self.TagName, self.Debug))
- dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, self.Debug))
+ dialog.SetVariableList(self.Controler.GetEditedElementInterfaceVars(self.TagName, debug=self.Debug))
dialog.SetValues(actionblock.GetActions())
if dialog.ShowModal() == wx.ID_OK:
actions = dialog.GetValues()
@@ -3458,8 +3467,11 @@
self.Scroll(x, yp)
def OnMoveWindow(self, event):
- self.RefreshScrollBars()
- self.RefreshVisibleElements()
+ client_size = self.GetClientSize()
+ if self.LastClientSize != client_size:
+ self.LastClientSize = client_size
+ self.RefreshScrollBars()
+ self.RefreshVisibleElements()
event.Skip()
def DoDrawing(self, dc, printing = False):