--- a/Viewer.py Thu Apr 09 15:36:37 2009 +0200
+++ b/Viewer.py Thu Apr 09 15:39:45 2009 +0200
@@ -531,7 +531,34 @@
wire.TestVisible(screen)
for block in self.Blocks:
block.TestVisible(screen)
-
+
+ def GetElementIECPath(self, element):
+ iec_path = None
+ if isinstance(element, Wire) and element.EndConnected is not None:
+ block = element.EndConnected.GetParentBlock()
+ if isinstance(block, FBD_Block):
+ blockname = block.GetName()
+ connectorname = element.EndConnected.GetName()
+ if blockname != "":
+ iec_path = "%s.%s.%s"%(self.InstancePath, blockname, connectorname)
+ else:
+ if connectorname == "":
+ iec_path = "%s.%s%d"%(self.InstancePath, block.GetType(), block.GetId())
+ else:
+ iec_path = "%s.%s%d_%s"%(self.InstancePath, block.GetType(), block.GetId(), connectorname)
+ elif isinstance(block, FBD_Variable):
+ iec_path = "%s.%s"%(self.InstancePath, block.GetName())
+ elif isinstance(element, (LD_Contact, LD_Coil)):
+ iec_path = "%s.%s"%(self.InstancePath, element.GetName())
+ elif isinstance(element, SFC_Step):
+ iec_path = "%s.%s.X"%(self.InstancePath, element.GetName())
+ elif isinstance(element, SFC_Transition):
+ connectors = element.GetConnectors()
+ previous_steps = self.GetPreviousSteps(connectors["input"])
+ next_steps = self.GetNextSteps(connectors["output"])
+ iec_path = "%s.%s->%s"%(self.InstancePath, ",".join(previous_steps), ",".join(next_steps))
+ return iec_path
+
#-------------------------------------------------------------------------------
# Reset functions
#-------------------------------------------------------------------------------
@@ -636,7 +663,7 @@
for wire in self.Wires:
if not wire.IsConnectedCompatible():
- wire.MarkAsInvalid()
+ wire.SetValid(False)
if self.Debug:
block = wire.EndConnected.GetParentBlock()
if isinstance(block, LD_PowerRail):
@@ -645,7 +672,7 @@
blockname = block.GetName()
connectorname = wire.EndConnected.GetName()
if blockname != "":
- iec_path = "%s.%s.%s"%(self.InstancePath, block.GetName(), connectorname)
+ iec_path = "%s.%s.%s"%(self.InstancePath, blockname, connectorname)
else:
if connectorname == "":
iec_path = "%s.%s%d"%(self.InstancePath, block.GetType(), block.GetId())
@@ -667,20 +694,10 @@
if self.Debug:
for block in self.Blocks.keys():
block.SpreadCurrent()
- if isinstance(block, LD_Contact):
- iec_path = "%s.%s"%(self.InstancePath, block.GetName())
- if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block) is not None:
- self.Subscribed[block] = iec_path.upper()
- elif isinstance(block, SFC_Step):
- iec_path = "%s.%s.X"%(self.InstancePath, block.GetName())
- if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block) is not None:
- self.Subscribed[block] = iec_path.upper()
- elif isinstance(block, SFC_Transition):
- connectors = block.GetConnectors()
- previous_steps = self.GetPreviousSteps(connectors["input"])
- next_steps = self.GetNextSteps(connectors["output"])
- iec_path = "%s.%s->%s"%(self.InstancePath, ",".join(previous_steps), ",".join(next_steps))
- if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block) is not None:
+ iec_path = self.GetElementIECPath(block)
+ if iec_path is not None:
+ result = self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block)
+ if result is not None:
self.Subscribed[block] = iec_path.upper()
self.RefreshVisibleElements()
@@ -1370,6 +1387,7 @@
if element is not None:
self.SelectedElement = element
if self.Debug:
+ self.StartMousePos = event.GetPosition()
Graphic_Element.OnLeftDown(self.SelectedElement, event, dc, self.Scaling)
else:
self.SelectedElement.OnLeftDown(event, dc, self.Scaling)
@@ -1385,6 +1403,7 @@
event.Skip()
def OnViewerLeftUp(self, event):
+ self.StartMousePos = None
if self.rubberBand.IsShown():
if self.Mode == MODE_SELECTION:
elements = self.SearchElements(self.rubberBand.GetCurrentExtent())
@@ -1503,10 +1522,21 @@
def OnViewerLeftDClick(self, event):
if self.Mode == MODE_SELECTION and self.SelectedElement is not None:
if self.Debug:
- Graphic_Element.OnLeftDClick(self.SelectedElement, event, self.GetLogicalDC(), self.Scaling)
+ iec_path = self.GetElementIECPath(self.SelectedElement)
+ if iec_path is not None:
+ if isinstance(self.SelectedElement, Wire):
+ if self.SelectedElement.EndConnected is not None:
+ var_type = self.SelectedElement.EndConnected.GetType()
+ if self.Controler.IsOfType(var_type, "ANY_NUM", self.Debug) or\
+ self.Controler.IsOfType(var_type, "ANY_BIT", self.Debug):
+ self.ParentWindow.OpenGraphicViewer(iec_path)
+ else:
+ self.ParentWindow.OpenGraphicViewer(iec_path)
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())
+ else:
+ self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling)
elif event.ControlDown() and event.ShiftDown():
movex, movey = self.SelectedElement.AdjustToScaling(self.Scaling)
self.SelectedElement.RefreshModel()
@@ -1537,19 +1567,22 @@
self.RefreshVisibleElements()
else:
if not event.Dragging():
+ if self.Debug:
+ tooltip_pos = self.ClientToScreen(event.GetPosition())
+ tooltip_pos.x += 10
+ tooltip_pos.y += 10
highlighted = self.FindElement(pos)
if self.HighlightedElement is not None and self.HighlightedElement != highlighted:
- if isinstance(self.HighlightedElement, Wire):
+ if self.Debug and isinstance(self.HighlightedElement, Wire):
self.HighlightedElement.ClearToolTip()
self.HighlightedElement.SetHighlighted(False)
self.HighlightedElement = None
if highlighted is not None and self.HighlightedElement != highlighted:
- if isinstance(highlighted, Wire):
- pos = self.ClientToScreen(event.GetPosition())
- pos.x += 10
- pos.y += 10
- highlighted.CreateToolTip(pos)
+ if self.Debug and isinstance(highlighted, Wire):
+ highlighted.CreateToolTip(tooltip_pos)
highlighted.SetHighlighted(True)
+ elif self.Debug and highlighted is not None and isinstance(highlighted, Wire):
+ highlighted.MoveToolTip(tooltip_pos)
self.HighlightedElement = highlighted
if self.rubberBand.IsShown():
self.rubberBand.OnMotion(event, dc, self.Scaling)
@@ -1566,10 +1599,26 @@
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)
+ 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:
+ iec_path = self.GetElementIECPath(self.SelectedElement)
+ if iec_path is not None:
+ self.StartMousePos = None
+ if self.HighlightedElement is not None:
+ if isinstance(self.HighlightedElement, Wire):
+ self.HighlightedElement.ClearToolTip()
+ self.HighlightedElement.SetHighlighted(False)
+ self.HighlightedElement = None
+ data = wx.TextDataObject(str((iec_path, "debug")))
+ dragSource = wx.DropSource(self)
+ dragSource.SetData(data)
+ dragSource.DoDragDrop()
self.UpdateScrollPos(event)
event.Skip()
def OnLeaveViewer(self, event):
+ self.StartMousePos = None
if self.SelectedElement is not None and self.SelectedElement.GetDragging():
event.Skip()
elif self.HighlightedElement is not None:
@@ -2606,13 +2655,13 @@
else:
new_pos = wx.Point(max(30, x), max(30, y))
block = self.CopyBlock(element, new_pos)
+ self.RefreshVisibleElements()
if self.SelectedElement is not None:
self.SelectedElement.SetSelected(False)
self.SelectedElement = block
self.SelectedElement.SetSelected(True)
self.RefreshBuffer()
self.RefreshScrollBars()
- self.RefreshVisibleElements()
self.ParentWindow.RefreshVariablePanel(self.TagName)
self.ParentWindow.RefreshInstancesTree()
else:
@@ -2631,15 +2680,16 @@
return True
return False
- def GenerateNewName(self, element):
+ def GenerateNewName(self, element, exclude={}):
+ names = exclude.copy()
if isinstance(element, FBD_Block):
- names = [varname.upper() for varname in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)]
+ names.update(dict([(varname.upper(), True) for varname in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)]))
format = "Block%d"
elif isinstance(element, SFC_Step):
- names = [block.GetName().upper() for block in self.Blocks if isinstance(block, SFC_Step)]
+ names.update(dict([block.GetName().upper() for block in self.Blocks if isinstance(block, SFC_Step)]))
format = "Step%d"
i = 1
- while (format%i).upper() in names:
+ while names.get((format%i).upper(), False):
i += 1
return format%i