# HG changeset patch # User lbessard # Date 1237482612 -3600 # Node ID 9106d66bd20469610b3deb5529bc9d5ca8f53efd # Parent d803ba077da05843ab7dbe8ffe751f0d20bf4759 Bug with Scaling, MiddleButton, Wire modifications fixed. Adding support for: - Adjust one or more elements to grid - Select All elements in a Viewer - Maximize Viewer in Window diff -r d803ba077da0 -r 9106d66bd204 GraphicViewer.py --- a/GraphicViewer.py Wed Mar 18 16:42:12 2009 +0100 +++ b/GraphicViewer.py Thu Mar 19 18:10:12 2009 +0100 @@ -194,6 +194,9 @@ def RefreshScaling(self, refresh=True): pass + def SelectAll(self): + pass + def AddPoint(self, tick, value): self.Datas.append((float(tick), {True:1., False:0.}.get(value, float(value)))) if self.CurrentValue + self.CurrentRange == len(self.Datas) - 1: diff -r d803ba077da0 -r 9106d66bd204 PLCOpenEditor.py --- a/PLCOpenEditor.py Wed Mar 18 16:42:12 2009 +0100 +++ b/PLCOpenEditor.py Thu Mar 19 18:10:12 2009 +0100 @@ -283,6 +283,8 @@ kind=wx.ITEM_NORMAL, text=u'Program') AppendMenu(addmenu, help='', id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION, kind=wx.ITEM_NORMAL, text=u'Configuration') + AppendMenu(parent, help='', id=wx.ID_SELECTALL, + kind=wx.ITEM_NORMAL, text=u'Select All\tCTRL+A') AppendMenu(parent, help='', id=wx.ID_DELETE, kind=wx.ITEM_NORMAL, text=u'Delete') self.Bind(wx.EVT_MENU, self.OnRefreshMenu, id=wx.ID_REFRESH) @@ -304,6 +306,7 @@ id=ID_PLCOPENEDITOREDITMENUADDPROGRAM) self.Bind(wx.EVT_MENU, self.OnAddConfigurationMenu, id=ID_PLCOPENEDITOREDITMENUADDCONFIGURATION) + self.Bind(wx.EVT_MENU, self.OnSelectAllMenu, id=wx.ID_SELECTALL) self.Bind(wx.EVT_MENU, self.OnDeleteMenu, id=wx.ID_DELETE) def _init_coll_HelpMenu_Items(self, parent): @@ -662,6 +665,11 @@ else: self.SetTitle(name) + def RefreshScaling(self): + for i in xrange(self.TabsOpened.GetPageCount()): + editor = self.TabsOpened.GetPage(i) + editor.RefreshScaling() + def ShowProperties(self): old_values = self.Controler.GetProjectProperties(self.Debug) dialog = ProjectDialog(self) @@ -675,9 +683,7 @@ self.RefreshFileMenu() self.RefreshEditMenu() self.RefreshTypesTree() - for i in xrange(self.TabsOpened.GetPageCount()): - editor = self.TabsOpened.GetPage(i) - editor.RefreshScaling() + self.RefreshScaling() dialog.Destroy() def OnCloseFrame(self, event): @@ -1002,21 +1008,31 @@ self.EditMenu.Enable(wx.ID_REDO, redo) self.EditMenu.Enable(wx.ID_ADD, True) self.EditMenu.Enable(wx.ID_DELETE, True) + if self.TabsOpened.GetPageCount() > 0: + self.EditMenu.Enable(wx.ID_CUT, True) + self.EditMenu.Enable(wx.ID_COPY, True) + if self.CopyBuffer is not None: + self.EditMenu.Enable(wx.ID_PASTE, True) + else: + self.EditMenu.Enable(wx.ID_PASTE, False) + self.EditMenu.Enable(wx.ID_SELECTALL, True) + else: + self.EditMenu.Enable(wx.ID_CUT, False) + self.EditMenu.Enable(wx.ID_COPY, False) + self.EditMenu.Enable(wx.ID_PASTE, False) + self.EditMenu.Enable(wx.ID_SELECTALL, False) else: self.EditMenu.Enable(wx.ID_REFRESH, False) if not self.Debug: self.EditMenu.Enable(wx.ID_UNDO, False) self.EditMenu.Enable(wx.ID_REDO, False) + self.EditMenu.Enable(wx.ID_CUT, False) + self.EditMenu.Enable(wx.ID_COPY, False) + self.EditMenu.Enable(wx.ID_PASTE, False) + self.EditMenu.Enable(wx.ID_SELECTALL, False) self.EditMenu.Enable(wx.ID_ADD, False) self.EditMenu.Enable(wx.ID_DELETE, False) - if not self.Debug: - self.EditMenu.Enable(wx.ID_CUT, True) - self.EditMenu.Enable(wx.ID_COPY, True) - if self.CopyBuffer is not None: - self.EditMenu.Enable(wx.ID_PASTE, True) - else: - self.EditMenu.Enable(wx.ID_PASTE, False) - + def OnRefreshMenu(self, event): selected = self.TabsOpened.GetSelection() if selected != -1: @@ -1049,6 +1065,7 @@ self.RefreshTypesTree() self.RefreshInstancesTree() self.RefreshLibraryTree() + self.RefreshScaling() event.Skip() def OnRedoMenu(self, event): @@ -1070,6 +1087,7 @@ self.RefreshTypesTree() self.RefreshInstancesTree() self.RefreshLibraryTree() + self.RefreshScaling() event.Skip() def OnCutMenu(self, event): @@ -1096,6 +1114,13 @@ control.ProcessEvent(event) event.Skip() + def OnSelectAllMenu(self, event): + selected = self.TabsOpened.GetSelection() + if selected != -1: + window = self.TabsOpened.GetPage(selected) + window.SelectAll() + event.Skip() + def OnDeleteMenu(self, event): window = self.FindFocus() if window == self.TypesTree: @@ -1242,6 +1267,16 @@ else: self.TabsOpened.SetPageText(idx, "-".join(words[1:])) + def GetTabsOpenedDClickFunction(self, window): + def OnTabsOpenedDClick(event): + pane = self.AUIManager.GetPane(self.TabsOpened) + if pane.IsMaximized(): + self.AUIManager.RestorePane(pane) + else: + self.AUIManager.MaximizePane(pane) + self.AUIManager.Update() + event.Skip() + return OnTabsOpenedDClick #------------------------------------------------------------------------------- # Types Tree Management Functions @@ -1604,6 +1639,9 @@ elif elementtype == ITEM_DATATYPE: new_window = DataTypeEditor(self.TabsOpened, tagname, self, self.Controler) self.TabsOpened.AddPage(new_window, "") + if wx.VERSION >= (2, 6, 0): + children = self.TabsOpened.GetChildren() + children[len(children) - 1].Bind(wx.EVT_LEFT_DCLICK, self.GetTabsOpenedDClickFunction(new_window)) self.VariablePanelIndexer.ChangeVariablePanel(tagname) openedidx = self.IsOpened(tagname) old_selected = self.TabsOpened.GetSelection() @@ -3918,7 +3956,7 @@ def _init_coll_MainSizer_Items(self, parent): parent.AddWindow(self.VariablesGrid, 0, border=0, flag=wx.GROW) - parent.AddSizer(self.ControlPanelSizer, 0, border=0, flag=wx.GROW) + parent.AddSizer(self.ControlPanelSizer, 0, border=5, flag=wx.GROW|wx.ALL) def _init_coll_MainSizer_Growables(self, parent): parent.AddGrowableCol(0) @@ -3954,9 +3992,9 @@ def _init_sizers(self): self.MainSizer = wx.FlexGridSizer(cols=2, hgap=10, rows=1, vgap=0) - self.ControlPanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=10) + self.ControlPanelSizer = wx.FlexGridSizer(cols=1, hgap=0, rows=2, vgap=5) self.ChoicePanelSizer = wx.GridSizer(cols=1, hgap=5, rows=4, vgap=5) - self.ButtonPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=0) + self.ButtonPanelSizer = wx.FlexGridSizer(cols=2, hgap=5, rows=2, vgap=5) self._init_coll_MainSizer_Items(self.MainSizer) self._init_coll_MainSizer_Growables(self.MainSizer) @@ -4084,7 +4122,7 @@ self.ReturnType.Enable(False) self.staticText1.Hide() self.ReturnType.Hide() - + self.VariablesGrid.SetTable(self.Table) self.VariablesGrid.SetRowLabelSize(0) for col in range(self.Table.GetNumberCols()): diff -r d803ba077da0 -r 9106d66bd204 SFCViewer.py --- a/SFCViewer.py Wed Mar 18 16:42:12 2009 +0100 +++ b/SFCViewer.py Thu Mar 19 18:10:12 2009 +0100 @@ -170,7 +170,7 @@ elif self.Mode == MODE_SELECTION: dc = self.GetLogicalDC() pos = event.GetLogicalPosition(dc) - if event.ShiftDown(): + if event.ShiftDown() and not event.ControlDown() and self.SelectedElement is not None: element = self.FindElement(pos, True) if element and not self.IsWire(element): if isinstance(self.SelectedElement, Graphic_Group): @@ -186,6 +186,7 @@ self.SelectedElement = element elif len(elements) == 1: self.SelectedElement = elements[0] + self.SelectedElement.SetSelected(True) else: element = self.FindElement(pos) if self.SelectedElement and self.SelectedElement != element: diff -r d803ba077da0 -r 9106d66bd204 Viewer.py --- a/Viewer.py Wed Mar 18 16:42:12 2009 +0100 +++ b/Viewer.py Thu Mar 19 18:10:12 2009 +0100 @@ -1068,6 +1068,14 @@ elements.append(element) return elements + def SelectAll(self): + if self.SelectedElement is not None: + self.SelectedElement.SetSelected(False) + self.SelectedElement = Graphic_Group(self) + for element in self.GetElements(): + self.SelectedElement.SelectElement(element) + self.SelectedElement.SetSelected(True) + #------------------------------------------------------------------------------- # Popup menu functions #------------------------------------------------------------------------------- @@ -1285,7 +1293,7 @@ if self.Mode == MODE_SELECTION: dc = self.GetLogicalDC() pos = event.GetLogicalPosition(dc) - if event.ShiftDown() and self.SelectedElement is not None: + if event.ShiftDown() and not event.ControlDown() and self.SelectedElement is not None: element = self.FindElement(pos, True) if element is not None: if isinstance(self.SelectedElement, Graphic_Group): @@ -1487,8 +1495,15 @@ if self.Mode == MODE_SELECTION and self.SelectedElement is not None: if self.Debug: Graphic_Element.OnLeftDClick(self.SelectedElement, event, self.GetLogicalDC(), self.Scaling) - elif event.ControlDown() and self.IsBlock(self.SelectedElement) and self.SelectedElement.GetType() in self.Controler.GetProjectPouNames(self.Debug): - self.ParentWindow.EditProjectElement(ITEM_POU, self.SelectedElement.GetType()) + elif event.ControlDown() and not event.ShiftDown(): + if self.IsBlock(self.SelectedElement) and self.SelectedElement.GetType() in self.Controler.GetProjectPouNames(self.Debug): + self.ParentWindow.EditProjectElement(ITEM_POU, self.SelectedElement.GetType()) + elif event.ControlDown() and event.ShiftDown(): + movex, movey = self.SelectedElement.AdjustToScaling(self.Scaling) + self.SelectedElement.RefreshModel() + self.RefreshBuffer() + if movex != 0 or movey != 0: + self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False) else: self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling) event.Skip() @@ -1502,8 +1517,8 @@ new_pos = event.GetPosition() xmax = self.GetScrollRange(wx.HORIZONTAL) - self.GetScrollThumb(wx.HORIZONTAL) ymax = self.GetScrollRange(wx.VERTICAL) - self.GetScrollThumb(wx.VERTICAL) - scrollx = max(0, self.StartScreenPos[0] + (new_pos[0] - self.StartMousePos[0]) * self.ViewScale[0] / SCROLLBAR_UNIT) - scrolly = max(0, self.StartScreenPos[1] + (new_pos[1] - self.StartMousePos[1]) * self.ViewScale[1] / SCROLLBAR_UNIT) + scrollx = max(0, self.StartScreenPos[0] - (new_pos[0] - self.StartMousePos[0]) / SCROLLBAR_UNIT) + scrolly = max(0, self.StartScreenPos[1] - (new_pos[1] - self.StartMousePos[1]) / SCROLLBAR_UNIT) if scrollx > xmax or scrolly > ymax: self.RefreshScrollBars(max(0, scrollx - xmax), max(0, scrolly - ymax)) self.Scroll(scrollx, scrolly) @@ -2692,8 +2707,10 @@ dc = self.GetLogicalDC() pos = event.GetLogicalPosition(dc) mouse_pos = event.GetPosition() - factor = 0.75 ** rotation - self.SetScale(self.ViewScale[0] * factor, self.ViewScale[1] * factor) + factor = 1.414 ** rotation + xscale = max(0.125, min(self.ViewScale[0] * factor, 8)) + yscale = max(0.125, min(self.ViewScale[0] * factor, 8)) + self.SetScale(xscale, yscale) self.Scroll(round(pos.x * self.ViewScale[0] - mouse_pos.x) / SCROLLBAR_UNIT, round(pos.y * self.ViewScale[1] - mouse_pos.y) / SCROLLBAR_UNIT) self.RefreshScrollBars() @@ -2731,17 +2748,17 @@ width, height = self.GetVirtualSize() width = int(max(width, xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[0]) height = int(max(height, ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[1]) - dc.DrawRectangle(0, 0, width, height) + dc.DrawRectangle(1, 1, width, height) if self.PageSize is not None and not printing: dc.SetPen(self.PagePen) xstart, ystart = self.GetViewStart() window_size = self.GetClientSize() - for x in xrange(self.PageSize[0] - (xstart * SCROLLBAR_UNIT) % self.PageSize[0], window_size[0], self.PageSize[0]): - dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, ystart * SCROLLBAR_UNIT, - xstart * SCROLLBAR_UNIT + x + 1, ystart * SCROLLBAR_UNIT + window_size[1]) - for y in xrange(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], window_size[1], self.PageSize[1]): - dc.DrawLine(xstart * SCROLLBAR_UNIT, ystart * SCROLLBAR_UNIT + y + 1, - xstart * SCROLLBAR_UNIT + window_size[0], ystart * SCROLLBAR_UNIT + y + 1) + for x in xrange(self.PageSize[0] - (xstart * SCROLLBAR_UNIT) % self.PageSize[0], int(window_size[0] / self.ViewScale[0]), self.PageSize[0]): + dc.DrawLine(xstart * SCROLLBAR_UNIT + x + 1, int(ystart * SCROLLBAR_UNIT / self.ViewScale[0]), + xstart * SCROLLBAR_UNIT + x + 1, int((ystart * SCROLLBAR_UNIT + window_size[1]) / self.ViewScale[0])) + for y in xrange(self.PageSize[1] - (ystart * SCROLLBAR_UNIT) % self.PageSize[1], int(window_size[1] / self.ViewScale[1]), self.PageSize[1]): + dc.DrawLine(int(xstart * SCROLLBAR_UNIT / self.ViewScale[0]), ystart * SCROLLBAR_UNIT + y + 1, + int((xstart * SCROLLBAR_UNIT + window_size[0]) / self.ViewScale[1]), ystart * SCROLLBAR_UNIT + y + 1) # Draw all elements for comment in self.Comments: diff -r d803ba077da0 -r 9106d66bd204 graphics/GraphicCommons.py --- a/graphics/GraphicCommons.py Wed Mar 18 16:42:12 2009 +0100 +++ b/graphics/GraphicCommons.py Thu Mar 19 18:10:12 2009 +0100 @@ -115,6 +115,16 @@ (2, 3) : 5 } +def round_scaling(x, n, constraint=0): + fraction = float(x) / float(n) + if constraint == - 1: + xround = int(fraction) + else: + xround = round(fraction) + if constraint == 1 and int(fraction) == xround: + xround += 1 + return xround * n + """ Basic vector operations for calculate wire points """ @@ -371,6 +381,10 @@ def GetSize(self): return self.Size.GetWidth(), self.Size.GetHeight() + # Returns the minimum element size + def GetMinSize(self): + return 0, 0 + # Refresh the element Bounding Box def RefreshBoundingBox(self): self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y, self.Size[0], self.Size[1]) @@ -566,6 +580,20 @@ self.Move(x, y) self.SetSize(width, height) + # Moves and Resizes the element for fitting scaling + def AdjustToScaling(self, scaling): + if scaling is not None: + movex = round_scaling(self.Pos.x, scaling[0]) - self.Pos.x + movey = round_scaling(self.Pos.y, scaling[1]) - self.Pos.y + min_width, min_height = self.GetMinSize() + width = max(round_scaling(min_width, scaling[0], 1), + round_scaling(self.Size.width, scaling[0])) + height = max(round_scaling(min_height, scaling[1], 1), + round_scaling(self.Size.height, scaling[1])) + self.Resize(movex, movey, width, height) + return movex, movey + return 0, 0 + # Refreshes the element state according to move defined and handle selected def ProcessDragging(self, movex, movey, event, scaling, width_fac = 1, height_fac = 1): handle_type, handle = self.Handle @@ -579,7 +607,7 @@ if handle[0] == 1: movex = max(-self.BoundingBox.x, movex) if scaling is not None: - movex = -(round(float(width - movex) / float(scaling[0])) * scaling[0] - width) + movex = -(round_scaling(width - movex, scaling[0]) - width) x = movex if event.ShiftDown(): width -= 2 * movex @@ -587,7 +615,7 @@ width -= movex elif handle[0] == 3: if scaling is not None: - movex = round(float(width + movex) / float(scaling[0])) * scaling[0] - width + movex = round_scaling(width + movex, scaling[0]) - width if event.ShiftDown(): x = -movex width += 2 * movex @@ -596,7 +624,7 @@ if handle[1] == 1: movey = max(-self.BoundingBox.y, movey) if scaling is not None: - movey = -(round(float(height - movey) / float(scaling[1])) * scaling[1] - height) + movey = -(round_scaling(height - movey, scaling[1]) - height) y = movey if event.ShiftDown(): height -= 2 * movey @@ -604,7 +632,7 @@ height -= movey elif handle[1] == 3: if scaling is not None: - movey = round(float(height + movey) / float(scaling[1])) * scaling[1] - height + movey = round_scaling(height + movey, scaling[1]) - height if event.ShiftDown(): y = -movey height += 2 * movey @@ -630,8 +658,8 @@ movex = max(-self.BoundingBox.x, movex) movey = max(-self.BoundingBox.y, movey) if scaling is not None: - movex = round(float(self.Pos.x + movex) / float(scaling[0])) * scaling[0] - self.Pos.x - movey = round(float(self.Pos.y + movey) / float(scaling[1])) * scaling[1] - self.Pos.y + movex = round_scaling(self.Pos.x + movex, scaling[0]) - self.Pos.x + movey = round_scaling(self.Pos.y + movey, scaling[1]) - self.Pos.y if event.ControlDown(): self.CurrentDrag.x = self.CurrentDrag.x + movex self.CurrentDrag.y = self.CurrentDrag.y + movey @@ -900,6 +928,15 @@ def GetSize(self): return self.BoundingBox.width, self.BoundingBox.height + # Moves and Resizes the group elements for fitting scaling + def AdjustToScaling(self, scaling): + movex_max = movey_max = 0 + for element in self.Elements: + movex, movey = element.AdjustToScaling(scaling) + movex_max = max(movex_max, abs(movex)) + movey_max = max(movey_max, abs(movey)) + return movex_max, movey_max + # Change the variable that indicates if this element is highlighted def SetHighlighted(self, highlighted): for element in self.Elements: @@ -1397,6 +1434,39 @@ def SetSize(width, height): pass + # Moves and Resizes the element for fitting scaling + def AdjustToScaling(self, scaling): + if scaling is not None: + movex_max = movey_max = 0 + for idx, point in enumerate(self.Points): + if 0 < idx < len(self.Points) - 1: + movex = round_scaling(point.x, scaling[0]) - point.x + movey = round_scaling(point.y, scaling[1]) - point.y + if idx == 1: + if self.Segments[0][0] == 0: + movex = 0 + elif (point.x + movex - self.Points[0].x) * self.Segments[0][0] < MIN_SEGMENT_SIZE: + movex = round_scaling(self.Points[0].x + MIN_SEGMENT_SIZE * self.Segments[0][0], scaling[0], self.Segments[0][0]) - point.x + if self.Segments[0][1] == 0: + movey = 0 + elif (point.y + movey - self.Points[0].y) * self.Segments[0][1] < MIN_SEGMENT_SIZE: + movey = round_scaling(self.Points[0].y + MIN_SEGMENT_SIZE * self.Segments[0][1], scaling[0], self.Segments[0][1]) - point.y + elif idx == len(self.Points) - 2: + if self.Segments[-1][0] == 0: + movex = 0 + elif (self.Points[-1].x - (point.x + movex)) * self.Segments[-1][0] < MIN_SEGMENT_SIZE: + movex = round_scaling(self.Points[-1].x + MIN_SEGMENT_SIZE * self.Segments[0][0], scaling[0], self.Segments[0][0]) - point.x + if self.Segments[-1][1] == 0: + movey = 0 + elif (self.Points[-1].y - (point.y + movey)) * self.Segments[-1][1] < MIN_SEGMENT_SIZE: + movey = round_scaling(self.Points[-1].y - MIN_SEGMENT_SIZE * self.Segments[-1][1], scaling[1], -self.Segments[-1][1]) - point.y + movex_max = max(movex_max, movex) + movey_max = max(movey_max, movey) + point.x += movex + point.y += movey + return movex_max, movey_max + return 0, 0 + # Returns connector to which start point is connected def GetStartConnected(self): return self.StartConnected @@ -2029,7 +2099,11 @@ if self.Segments[idx] in (NORTH, SOUTH): start_x = self.Points[idx].x if scaling is not None: - movex = round(float(self.Points[idx].x + movex) / float(scaling[0])) * scaling[0] - self.Points[idx].x + movex = round_scaling(self.Points[idx].x + movex, scaling[0]) - self.Points[idx].x + if idx == 1 and (self.Points[1].x + movex - self.Points[0].x) * self.Segments[0][0] < MIN_SEGMENT_SIZE: + movex = round_scaling(self.Points[0].x + MIN_SEGMENT_SIZE * self.Segments[0][0], scaling[0], self.Segments[0][0]) - self.Points[idx].x + elif idx == len(self.Segments) - 2 and (self.Points[-1].x - (self.Points[-2].x + movex)) * self.Segments[-1][0] < MIN_SEGMENT_SIZE: + movex = round_scaling(self.Points[-1].x - MIN_SEGMENT_SIZE * self.Segments[-1][0], scaling[0], -self.Segments[-1][0]) - self.Points[idx].x self.Points[idx].x += movex self.Points[idx + 1].x += movex self.GeneratePoints() @@ -2038,7 +2112,11 @@ elif self.Segments[idx] in (EAST, WEST): start_y = self.Points[idx].y if scaling is not None: - movey = round(float(self.Points[idx].y + movey) / float(scaling[1])) * scaling[1] - self.Points[idx].y + movey = round_scaling(self.Points[idx].y + movey, scaling[1]) - self.Points[idx].y + if idx == 1 and (self.Points[1].y + movey - self.Points[0].y) * self.Segments[0][1] < MIN_SEGMENT_SIZE: + movex = round_scaling(self.Points[0].y + MIN_SEGMENT_SIZE * self.Segments[0][1], scaling[0], self.Segments[0][1]) - self.Points[idx].y + elif idx == len(self.Segments) - 2 and (self.Points[-1].y - (self.Points[-2].y + movey)) * self.Segments[-1][1] < MIN_SEGMENT_SIZE: + movey = round_scaling(self.Points[idx].y - MIN_SEGMENT_SIZE * self.Segments[-1][1], scaling[1], -self.Segments[-1][1]) - self.Points[idx].y self.Points[idx].y += movey self.Points[idx + 1].y += movey self.GeneratePoints() @@ -2220,8 +2298,8 @@ movex = max(-self.Points[handle].x + POINT_RADIUS, movex) movey = max(-self.Points[handle].y + POINT_RADIUS, movey) if scaling is not None: - movex = round(float(self.Points[handle].x + movex) / float(scaling[0])) * scaling[0] - self.Points[handle].x - movey = round(float(self.Points[handle].y + movey) / float(scaling[1])) * scaling[1] - self.Points[handle].y + movex = round_scaling(self.Points[handle].x + movex, scaling[0]) - self.Points[handle].x + movey = round_scaling(self.Points[handle].y + movey, scaling[1]) - self.Points[handle].y # Try to connect point to a connector new_pos = wx.Point(self.Points[handle].x + movex, self.Points[handle].y + movey) connector = self.Parent.FindBlockConnector(new_pos, self.GetConnectionDirection())