--- a/Viewer.py Fri Jan 04 17:49:17 2008 +0100
+++ b/Viewer.py Fri Jan 11 17:51:56 2008 +0100
@@ -68,6 +68,7 @@
def OnDropText(self, x, y, data):
x, y = self.ParentWindow.CalcUnscrolledPosition(x, y)
+ scaling = self.ParentWindow.Scaling
values = eval(data)
if values[1] == "program":
message = wx.MessageDialog(self.ParentWindow, "Programs can't be used by other POUs!", "Error", wx.OK|wx.ICON_ERROR)
@@ -96,15 +97,20 @@
dialog.Destroy()
id = self.ParentWindow.GetNewId()
block = FBD_Block(self.ParentWindow, values[0], blockname, id)
+ width, height = block.GetMinSize()
+ if scaling is not None:
+ x = round(float(x) / float(scaling[0])) * scaling[0]
+ y = round(float(y) / float(scaling[1])) * scaling[1]
+ width = round(float(width) / float(scaling[0]) + 0.5) * scaling[0]
+ height = round(float(height) / float(scaling[1]) + 0.5) * scaling[1]
block.SetPosition(x, y)
- width, height = block.GetMinSize()
block.SetSize(width, height)
self.ParentWindow.AddBlock(block)
self.ParentWindow.Controler.AddEditedElementBlock(self.ParentWindow.GetTagName(), id, values[0], blockname)
self.ParentWindow.RefreshBlockModel(block)
self.ParentWindow.RefreshBuffer()
self.ParentWindow.RefreshScrollBars()
- self.ParentWindow.ParentWindow.RefreshVariablePanel(self.TagName)
+ self.ParentWindow.ParentWindow.RefreshVariablePanel(self.ParentWindow.GetTagName())
self.ParentWindow.Refresh()
elif values[1] != "location":
if values[3] == self.ParentWindow.GetTagName():
@@ -116,11 +122,16 @@
else:
var_type = INPUT
variable = FBD_Variable(self.ParentWindow, var_type, values[0], values[2], id)
+ width, height = variable.GetMinSize()
+ if scaling is not None:
+ x = round(float(x) / float(scaling[0])) * scaling[0]
+ y = round(float(y) / float(scaling[1])) * scaling[1]
+ width = round(float(width) / float(scaling[0]) + 0.5) * scaling[0]
+ height = round(float(height) / float(scaling[1]) + 0.5) * scaling[1]
variable.SetPosition(x, y)
- width, height = variable.GetMinSize()
variable.SetSize(width, height)
self.ParentWindow.AddBlock(variable)
- self.ParentWindow.Controler.AddEditedElementVariable(self.ParentWindow.TagName, id, var_type)
+ self.ParentWindow.Controler.AddEditedElementVariable(self.ParentWindow.GetTagName(), id, var_type)
self.ParentWindow.RefreshVariableModel(variable)
self.ParentWindow.RefreshBuffer()
self.ParentWindow.RefreshScrollBars()
@@ -269,8 +280,8 @@
self.SetBackgroundColour(wx.Colour(255,255,255))
self.ResetView()
self.Scaling = None
- #self.Scaling = (8, 8)
self.DrawGrid = True
+ self.GridBrush = wx.TRANSPARENT_BRUSH
self.DrawingWire = False
self.current_id = 0
self.TagName = tagname
@@ -293,6 +304,7 @@
self.Bind(wx.EVT_LEFT_DOWN, self.OnViewerLeftDown)
self.Bind(wx.EVT_LEFT_UP, self.OnViewerLeftUp)
self.Bind(wx.EVT_LEFT_DCLICK, self.OnViewerLeftDClick)
+ self.Bind(wx.EVT_RIGHT_DOWN, self.OnViewerRightDown)
self.Bind(wx.EVT_RIGHT_UP, self.OnViewerRightUp)
self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveViewer)
self.Bind(wx.EVT_MOTION, self.OnViewerMotion)
@@ -304,6 +316,9 @@
rect.x, rect.y = self.CalcScrolledPosition(rect.x, rect.y)
return rect
+ def GetScaling(self):
+ return self.Scaling
+
def SetTagName(self, tagname):
self.TagName = tagname
@@ -423,6 +438,29 @@
self.ParentWindow.RefreshTitle()
self.ParentWindow.RefreshEditMenu()
+ # Refresh the current scaling
+ def RefreshScaling(self, refresh=True):
+ properties = self.Controler.GetProjectProperties()
+ scaling = properties["scaling"][self.CurrentLanguage]
+ if scaling != (0, 0):
+ self.Scaling = scaling
+ if self.DrawGrid:
+ bitmap = wx.EmptyBitmap(*scaling)
+ dc = wx.MemoryDC(bitmap)
+ dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
+ dc.Clear()
+ dc.SetPen(wx.Pen(wx.Colour(180, 180, 180)))
+ dc.DrawPoint(0, 0)
+ self.GridBrush = wx.BrushFromBitmap(bitmap)
+ else:
+ self.GridBrush = wx.TRANSPARENT_BRUSH
+ else:
+ self.Scaling = None
+ self.GridBrush = wx.TRANSPARENT_BRUSH
+ if refresh:
+ self.Refresh()
+
+
#-------------------------------------------------------------------------------
# Refresh functions
#-------------------------------------------------------------------------------
@@ -571,6 +609,7 @@
contact_type = CONTACT_NORMAL
contact = LD_Contact(self, contact_type, instance["name"], instance["id"])
contact.SetPosition(instance["x"], instance["y"])
+ contact.SetSize(instance["width"], instance["height"])
self.AddBlock(contact)
connectors = contact.GetConnectors()
connectors["input"].SetPosition(wx.Point(*instance["connectors"]["input"]["position"]))
@@ -595,6 +634,7 @@
coil_type = COIL_NORMAL
coil = LD_Coil(self, coil_type, instance["name"], instance["id"])
coil.SetPosition(instance["x"], instance["y"])
+ coil.SetSize(instance["width"], instance["height"])
self.AddBlock(coil)
connectors = coil.GetConnectors()
connectors["input"].SetPosition(wx.Point(*instance["connectors"]["input"]["position"]))
@@ -624,6 +664,7 @@
elif instance["type"] == "transition":
transition = SFC_Transition(self, instance["condition_type"], instance["condition"], instance["priority"], instance["id"])
transition.SetPosition(instance["x"], instance["y"])
+ transition.SetSize(instance["width"], instance["height"])
self.AddBlock(transition)
connectors = transition.GetConnectors()
connectors["input"].SetPosition(wx.Point(*instance["connectors"]["input"]["position"]))
@@ -658,6 +699,7 @@
elif instance["type"] == "jump":
jump = SFC_Jump(self, instance["target"], instance["id"])
jump.SetPosition(instance["x"], instance["y"])
+ jump.SetSize(instance["width"], instance["height"])
self.AddBlock(jump)
connector = jump.GetConnector()
connector.SetPosition(wx.Point(*instance["connector"]["position"]))
@@ -877,36 +919,42 @@
if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
self.SelectedElement.AlignElements(ALIGN_LEFT, None)
self.RefreshBuffer()
+ self.Refresh()
event.Skip()
def OnAlignCenterMenu(self, event):
if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
self.SelectedElement.AlignElements(ALIGN_CENTER, None)
self.RefreshBuffer()
+ self.Refresh()
event.Skip()
def OnAlignRightMenu(self, event):
if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
self.SelectedElement.AlignElements(ALIGN_RIGHT, None)
self.RefreshBuffer()
+ self.Refresh()
event.Skip()
def OnAlignTopMenu(self, event):
if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
self.SelectedElement.AlignElements(None, ALIGN_TOP)
self.RefreshBuffer()
+ self.Refresh()
event.Skip()
def OnAlignMiddleMenu(self, event):
if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
self.SelectedElement.AlignElements(None, ALIGN_MIDDLE)
self.RefreshBuffer()
+ self.Refresh()
event.Skip()
def OnAlignBottomMenu(self, event):
if self.SelectedElement and isinstance(self.SelectedElement, Graphic_Group):
self.SelectedElement.AlignElements(None, ALIGN_BOTTOM)
self.RefreshBuffer()
+ self.Refresh()
event.Skip()
def OnNoModifierMenu(self, event):
@@ -1004,7 +1052,10 @@
self.SelectedElement.SetSelected(True)
else:
element = self.FindElement(pos)
- connector = self.FindBlockConnector(pos)
+ if element is None or element.TestHandle(pos) == (0, 0):
+ connector = self.FindBlockConnector(pos)
+ else:
+ connector = None
if self.DrawingWire:
self.DrawingWire = False
if connector:
@@ -1020,6 +1071,7 @@
else:
rect = self.SelectedElement.GetRedrawRect()
self.SelectedElement.Delete()
+ self.SelectedElement = None
element = None
self.RefreshRect(self.GetScrolledRect(rect))
elif connector:
@@ -1031,7 +1083,7 @@
wire = Wire(self, [wx.Point(pos.x, pos.y), WEST], [wx.Point(pos.x, pos.y), EAST])
wire.oldPos = pos
wire.Handle = (HANDLE_POINT, 0)
- wire.ProcessDragging(0, 0)
+ wire.ProcessDragging(0, 0, self.Scaling)
wire.Handle = (HANDLE_POINT, 1)
self.AddWire(wire)
if self.SelectedElement:
@@ -1104,10 +1156,17 @@
connector = self.FindBlockConnector(pos)
if self.SelectedElement.EndConnected is not None:
self.DrawingWire = False
+ self.SelectedElement.StartConnected.HighlightParentBlock(False)
+ self.SelectedElement.EndConnected.HighlightParentBlock(False)
self.SelectedElement.ResetPoints()
self.SelectedElement.OnMotion(event, dc, self.Scaling)
self.SelectedElement.GeneratePoints()
self.SelectedElement.RefreshModel()
+ if self.HighlightedElement is not None:
+ self.HighlightedElement.SetHighlighted(False)
+ self.HighlightedElement = None
+ self.SelectedElement.SetHighlighted(True)
+ self.HighlightedElement = self.SelectedElement
self.SelectedElement.SetSelected(True)
self.RefreshBuffer()
elif connector is None or self.SelectedElement.GetDragging():
@@ -1124,17 +1183,26 @@
wx.CallAfter(self.ParentWindow.ResetCurrentMode)
event.Skip()
+ def OnViewerRightDown(self, event):
+ if self.Mode == MODE_SELECTION:
+ dc = self.GetLogicalDC()
+ pos = event.GetLogicalPosition(dc)
+ element = self.FindElement(pos)
+ if self.SelectedElement and self.SelectedElement != element:
+ self.SelectedElement.SetSelected(False)
+ self.SelectedElement = None
+ if element:
+ self.SelectedElement = element
+ self.SelectedElement.OnRightDown(event, dc, self.Scaling)
+ self.SelectedElement.Refresh()
+ event.Skip()
+
def OnViewerRightUp(self, event):
dc = self.GetLogicalDC()
- pos = event.GetLogicalPosition(dc)
- element = self.FindElement(pos)
- if element:
- if self.SelectedElement and self.SelectedElement != element:
- self.SelectedElement.SetSelected(False)
- self.SelectedElement = element
- self.SelectedElement.SetSelected(True)
- self.SelectedElement.OnRightUp(event, self.GetLogicalDC(), self.Scaling)
+ if self.SelectedElement:
+ self.SelectedElement.OnRightUp(event, dc, self.Scaling)
wx.CallAfter(self.SetCursor, wx.NullCursor)
+ self.SelectedElement.Refresh()
else:
self.PopupDefaultMenu(False)
event.Skip()
@@ -1154,7 +1222,6 @@
if not event.Dragging():
highlighted = self.FindElement(pos)
if self.HighlightedElement is not None and self.HighlightedElement != highlighted:
- rect = self.HighlightedElement.GetRedrawRect()
self.HighlightedElement.SetHighlighted(False)
self.HighlightedElement = None
if highlighted is not None and self.HighlightedElement != highlighted:
@@ -1284,6 +1351,12 @@
# Model adding functions
#-------------------------------------------------------------------------------
+ def GetScaledSize(self, width, height):
+ if self.Scaling is not None:
+ width = round(float(width) / float(self.Scaling[0]) + 0.4) * self.Scaling[0]
+ height = round(float(height) / float(self.Scaling[1]) + 0.4) * self.Scaling[1]
+ return width, height
+
def AddNewBlock(self, bbox):
dialog = BlockPropertiesDialog(self.ParentWindow)
dialog.SetBlockList(self.Controler.GetBlockTypes(self.TagName))
@@ -1298,7 +1371,7 @@
else:
block = FBD_Block(self, values["type"], "", id, values["extension"], values["inputs"])
block.SetPosition(bbox.x, bbox.y)
- block.SetSize(values["width"], values["height"])
+ block.SetSize(*self.GetScaledSize(values["width"], values["height"]))
self.AddBlock(block)
self.Controler.AddEditedElementBlock(self.TagName, id, values["type"], values.get("name", None))
self.RefreshBlockModel(block)
@@ -1326,7 +1399,7 @@
values = dialog.GetValues()
variable = FBD_Variable(self, values["type"], values["name"], values["value_type"], id)
variable.SetPosition(bbox.x, bbox.y)
- variable.SetSize(values["width"], values["height"])
+ variable.SetSize(*self.GetScaledSize(values["width"], values["height"]))
self.AddBlock(variable)
self.Controler.AddEditedElementVariable(self.TagName, id, values["type"])
self.RefreshVariableModel(variable)
@@ -1343,7 +1416,7 @@
values = dialog.GetValues()
connection = FBD_Connector(self, values["type"], values["name"], id)
connection.SetPosition(bbox.x, bbox.y)
- connection.SetSize(values["width"], values["height"])
+ connection.SetSize(*self.GetScaledSize(values["width"], values["height"]))
self.AddBlock(connection)
self.Controler.AddEditedElementConnection(self.TagName, id, values["type"])
self.RefreshConnectionModel(connection)
@@ -1363,7 +1436,7 @@
comment = Comment(self, value, id)
comment.SetPosition(bbox.x, bbox.y)
min_width, min_height = comment.GetMinSize()
- comment.SetSize(max(min_width,bbox.width),max(min_height,bbox.height))
+ comment.SetSize(*self.GetScaledSize(max(min_width,bbox.width),max(min_height,bbox.height)))
self.AddComment(comment)
self.Controler.AddEditedElementComment(self.TagName, id)
self.RefreshCommentModel(comment)
@@ -1388,7 +1461,7 @@
values = dialog.GetValues()
contact = LD_Contact(self, values["type"], values["name"], id)
contact.SetPosition(bbox.x, bbox.y)
- contact.SetSize(values["width"], values["height"])
+ contact.SetSize(*self.GetScaledSize(values["width"], values["height"]))
self.AddBlock(contact)
self.Controler.AddEditedElementContact(self.TagName, id)
self.RefreshContactModel(contact)
@@ -1416,7 +1489,7 @@
values = dialog.GetValues()
coil = LD_Coil(self, values["type"], values["name"], id)
coil.SetPosition(bbox.x, bbox.y)
- coil.SetSize(values["width"], values["height"])
+ coil.SetSize(*self.GetScaledSize(values["width"], values["height"]))
self.AddBlock(coil)
self.Controler.AddEditedElementCoil(self.TagName, id)
self.RefreshCoilModel(coil)
@@ -1433,7 +1506,7 @@
values = dialog.GetValues()
powerrail = LD_PowerRail(self, values["type"], id, [True for i in xrange(values["number"])])
powerrail.SetPosition(bbox.x, bbox.y)
- powerrail.SetSize(values["width"], values["height"])
+ powerrail.SetSize(*self.GetScaledSize(values["width"], values["height"]))
self.AddBlock(powerrail)
self.Controler.AddEditedElementPowerRail(self.TagName, id, values["type"])
self.RefreshPowerRailModel(powerrail)
@@ -1466,7 +1539,7 @@
step.RemoveAction()
step.SetPosition(bbox.x, bbox.y)
min_width, min_height = step.GetMinSize()
- step.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
+ step.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
self.AddBlock(step)
self.Controler.AddEditedElementStep(self.TagName, id)
self.RefreshStepModel(step)
@@ -1484,7 +1557,7 @@
transition = SFC_Transition(self, values["type"], values["value"], values["priority"], id)
transition.SetPosition(bbox.x, bbox.y)
min_width, min_height = transition.GetMinSize()
- transition.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
+ transition.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
self.AddBlock(transition)
self.Controler.AddEditedElementTransition(self.TagName, id)
self.RefreshTransitionModel(transition)
@@ -1502,7 +1575,7 @@
divergence = SFC_Divergence(self, values["type"], values["number"], id)
divergence.SetPosition(bbox.x, bbox.y)
min_width, min_height = divergence.GetMinSize(True)
- divergence.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
+ divergence.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
self.AddBlock(divergence)
self.Controler.AddEditedElementDivergence(self.TagName, id, values["type"])
self.RefreshDivergenceModel(divergence)
@@ -1523,7 +1596,7 @@
jump = SFC_Jump(self, value, id)
jump.SetPosition(bbox.x, bbox.y)
min_width, min_height = jump.GetMinSize()
- jump.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
+ jump.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
self.AddBlock(jump)
self.Controler.AddEditedElementJump(self.TagName, id)
self.RefreshJumpModel(jump)
@@ -1543,7 +1616,7 @@
actionblock = SFC_ActionBlock(self, actions, id)
actionblock.SetPosition(bbox.x, bbox.y)
min_width, min_height = actionblock.GetMinSize()
- actionblock.SetSize(max(bbox.width, min_width), max(bbox.height, min_height))
+ actionblock.SetSize(*self.GetScaledSize(max(bbox.width, min_width), max(bbox.height, min_height)))
self.AddBlock(actionblock)
self.Controler.AddEditedElementActionBlock(self.TagName, id)
self.RefreshActionBlockModel(actionblock)
@@ -1572,7 +1645,7 @@
new_values = dialog.GetValues()
if "name" in new_values:
block.SetName(new_values["name"])
- block.SetSize(new_values["width"], new_values["height"])
+ block.SetSize(*self.GetScaledSize(new_values["width"], new_values["height"]))
block.SetType(new_values["type"], new_values["extension"])
block.SetExecutionOrder(new_values["executionOrder"])
self.RefreshBlockModel(block)
@@ -1604,7 +1677,7 @@
new_values = dialog.GetValues()
variable.SetName(new_values["name"])
variable.SetType(new_values["type"], new_values["value_type"])
- variable.SetSize(new_values["width"], new_values["height"])
+ variable.SetSize(*self.GetScaledSize(new_values["width"], new_values["height"]))
variable.SetExecutionOrder(new_values["executionOrder"])
if old_values["type"] != new_values["type"]:
id = variable.GetId()
@@ -1628,7 +1701,7 @@
values = dialog.GetValues()
connection.SetName(values["name"])
connection.SetType(values["type"])
- connection.SetSize(values["width"], values["height"])
+ connection.SetSize(*self.GetScaledSize(values["width"], values["height"]))
if old_type != values["type"]:
id = connection.GetId()
self.Controler.RemoveEditedElementInstance(self.TagName, id)
@@ -1655,7 +1728,7 @@
values = dialog.GetValues()
contact.SetName(values["name"])
contact.SetType(values["type"])
- contact.SetSize(values["width"], values["height"])
+ contact.SetSize(*self.GetScaledSize(values["width"], values["height"]))
self.RefreshContactModel(contact)
self.RefreshBuffer()
self.RefreshScrollBars()
@@ -1681,7 +1754,7 @@
values = dialog.GetValues()
coil.SetName(values["name"])
coil.SetType(values["type"])
- coil.SetSize(values["width"], values["height"])
+ coil.SetSize(*self.GetScaledSize(values["width"], values["height"]))
self.RefreshCoilModel(coil)
self.RefreshBuffer()
self.RefreshScrollBars()
@@ -1695,7 +1768,7 @@
old_type = powerrail.GetType()
values = dialog.GetValues()
powerrail.SetType(values["type"], [True for i in xrange(values["number"])])
- powerrail.SetSize(values["width"], values["height"])
+ powerrail.SetSize(*self.GetScaledSize(values["width"], values["height"]))
if old_type != values["type"]:
id = powerrail.GetId()
self.Controler.RemoveEditedElementInstance(self.TagName, id)
@@ -1733,7 +1806,7 @@
step.AddAction()
else:
step.RemoveAction()
- step.UpdateSize(values["width"], values["height"])
+ step.UpdateSize(*self.GetScaledSize(values["width"], values["height"]))
step.RefreshModel()
self.RefreshBuffer()
self.RefreshScrollBars()
@@ -1779,6 +1852,7 @@
if dialog.ShowModal() == wx.ID_OK:
actions = dialog.GetValues()
actionblock.SetActions(actions)
+ actionblock.SetSize(*self.GetScaledSize(*actionblock.GetSize()))
actionblock.RefreshModel()
self.RefreshBuffer()
self.RefreshScrollBars()
@@ -1793,6 +1867,7 @@
if dialog.ShowModal() == wx.ID_OK:
value = dialog.GetValue()
comment.SetContent(value)
+ comment.SetSize(*self.GetScaledSize(*comment.GetSize()))
comment.RefreshModel()
self.RefreshBuffer()
self.RefreshScrollBars()
@@ -1808,7 +1883,8 @@
infos = {}
infos["type"] = block.GetType()
infos["name"] = block.GetName()
- infos["executionOrder"] = block.GetExecutionOrder()
+ if self.CurrentLanguage == "FBD":
+ infos["executionOrder"] = block.GetExecutionOrder()
infos["x"], infos["y"] = block.GetPosition()
infos["width"], infos["height"] = block.GetSize()
infos["connectors"] = block.GetConnectors()
@@ -1818,7 +1894,8 @@
variableid = variable.GetId()
infos = {}
infos["name"] = variable.GetName()
- infos["executionOrder"] = variable.GetExecutionOrder()
+ if self.CurrentLanguage == "FBD":
+ infos["executionOrder"] = variable.GetExecutionOrder()
infos["x"], infos["y"] = variable.GetPosition()
infos["width"], infos["height"] = variable.GetSize()
infos["connectors"] = variable.GetConnectors()
@@ -1828,7 +1905,6 @@
connectionid = connection.GetId()
infos = {}
infos["name"] = connection.GetName()
- infos["executionOrder"] = connection.GetExecutionOrder()
infos["x"], infos["y"] = connection.GetPosition()
infos["width"], infos["height"] = connection.GetSize()
infos["connector"] = connection.GetConnector()
@@ -2163,15 +2239,14 @@
def OnPaint(self, event):
dc = self.GetLogicalDC(True)
+ dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
dc.Clear()
- dc.SetPen(wx.Pen(wx.Colour(230, 230, 230)))
dc.BeginDrawing()
if self.Scaling and self.DrawGrid:
- width, height = dc.GetSize()
- for i in xrange(1, width / self.Scaling[0] + 1):
- dc.DrawLine(i * self.Scaling[0], 0, i * self.Scaling[0], height)
- for i in xrange(1, height / self.Scaling[1] + 1):
- dc.DrawLine(0, i * self.Scaling[1], width, i * self.Scaling[1])
+ dc.SetPen(wx.TRANSPARENT_PEN)
+ dc.SetBrush(self.GridBrush)
+ width, height = self.GetVirtualSize()
+ dc.DrawRectangle(0, 0, width, height)
# Draw all elements
for comment in self.Comments: