diff -r b67a5de5a24a -r 4fb225afddf4 Viewer.py --- 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: