529 comment.TestVisible(screen) |
529 comment.TestVisible(screen) |
530 for wire in self.Wires: |
530 for wire in self.Wires: |
531 wire.TestVisible(screen) |
531 wire.TestVisible(screen) |
532 for block in self.Blocks: |
532 for block in self.Blocks: |
533 block.TestVisible(screen) |
533 block.TestVisible(screen) |
534 |
534 |
|
535 def GetElementIECPath(self, element): |
|
536 iec_path = None |
|
537 if isinstance(element, Wire) and element.EndConnected is not None: |
|
538 block = element.EndConnected.GetParentBlock() |
|
539 if isinstance(block, FBD_Block): |
|
540 blockname = block.GetName() |
|
541 connectorname = element.EndConnected.GetName() |
|
542 if blockname != "": |
|
543 iec_path = "%s.%s.%s"%(self.InstancePath, blockname, connectorname) |
|
544 else: |
|
545 if connectorname == "": |
|
546 iec_path = "%s.%s%d"%(self.InstancePath, block.GetType(), block.GetId()) |
|
547 else: |
|
548 iec_path = "%s.%s%d_%s"%(self.InstancePath, block.GetType(), block.GetId(), connectorname) |
|
549 elif isinstance(block, FBD_Variable): |
|
550 iec_path = "%s.%s"%(self.InstancePath, block.GetName()) |
|
551 elif isinstance(element, (LD_Contact, LD_Coil)): |
|
552 iec_path = "%s.%s"%(self.InstancePath, element.GetName()) |
|
553 elif isinstance(element, SFC_Step): |
|
554 iec_path = "%s.%s.X"%(self.InstancePath, element.GetName()) |
|
555 elif isinstance(element, SFC_Transition): |
|
556 connectors = element.GetConnectors() |
|
557 previous_steps = self.GetPreviousSteps(connectors["input"]) |
|
558 next_steps = self.GetNextSteps(connectors["output"]) |
|
559 iec_path = "%s.%s->%s"%(self.InstancePath, ",".join(previous_steps), ",".join(next_steps)) |
|
560 return iec_path |
|
561 |
535 #------------------------------------------------------------------------------- |
562 #------------------------------------------------------------------------------- |
536 # Reset functions |
563 # Reset functions |
537 #------------------------------------------------------------------------------- |
564 #------------------------------------------------------------------------------- |
538 |
565 |
539 # Resets Viewer lists |
566 # Resets Viewer lists |
634 self.loadInstance(instance, ids) |
661 self.loadInstance(instance, ids) |
635 self.RefreshScrollBars() |
662 self.RefreshScrollBars() |
636 |
663 |
637 for wire in self.Wires: |
664 for wire in self.Wires: |
638 if not wire.IsConnectedCompatible(): |
665 if not wire.IsConnectedCompatible(): |
639 wire.MarkAsInvalid() |
666 wire.SetValid(False) |
640 if self.Debug: |
667 if self.Debug: |
641 block = wire.EndConnected.GetParentBlock() |
668 block = wire.EndConnected.GetParentBlock() |
642 if isinstance(block, LD_PowerRail): |
669 if isinstance(block, LD_PowerRail): |
643 wire.SetValue(True) |
670 wire.SetValue(True) |
644 if isinstance(block, FBD_Block): |
671 if isinstance(block, FBD_Block): |
645 blockname = block.GetName() |
672 blockname = block.GetName() |
646 connectorname = wire.EndConnected.GetName() |
673 connectorname = wire.EndConnected.GetName() |
647 if blockname != "": |
674 if blockname != "": |
648 iec_path = "%s.%s.%s"%(self.InstancePath, block.GetName(), connectorname) |
675 iec_path = "%s.%s.%s"%(self.InstancePath, blockname, connectorname) |
649 else: |
676 else: |
650 if connectorname == "": |
677 if connectorname == "": |
651 iec_path = "%s.%s%d"%(self.InstancePath, block.GetType(), block.GetId()) |
678 iec_path = "%s.%s%d"%(self.InstancePath, block.GetType(), block.GetId()) |
652 else: |
679 else: |
653 iec_path = "%s.%s%d_%s"%(self.InstancePath, block.GetType(), block.GetId(), connectorname) |
680 iec_path = "%s.%s%d_%s"%(self.InstancePath, block.GetType(), block.GetId(), connectorname) |
665 wire.SetValue("undefined") |
692 wire.SetValue("undefined") |
666 |
693 |
667 if self.Debug: |
694 if self.Debug: |
668 for block in self.Blocks.keys(): |
695 for block in self.Blocks.keys(): |
669 block.SpreadCurrent() |
696 block.SpreadCurrent() |
670 if isinstance(block, LD_Contact): |
697 iec_path = self.GetElementIECPath(block) |
671 iec_path = "%s.%s"%(self.InstancePath, block.GetName()) |
698 if iec_path is not None: |
672 if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block) is not None: |
699 result = self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block) |
673 self.Subscribed[block] = iec_path.upper() |
700 if result is not None: |
674 elif isinstance(block, SFC_Step): |
|
675 iec_path = "%s.%s.X"%(self.InstancePath, block.GetName()) |
|
676 if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block) is not None: |
|
677 self.Subscribed[block] = iec_path.upper() |
|
678 elif isinstance(block, SFC_Transition): |
|
679 connectors = block.GetConnectors() |
|
680 previous_steps = self.GetPreviousSteps(connectors["input"]) |
|
681 next_steps = self.GetNextSteps(connectors["output"]) |
|
682 iec_path = "%s.%s->%s"%(self.InstancePath, ",".join(previous_steps), ",".join(next_steps)) |
|
683 if self.Controler.SubscribeDebugIECVariable(iec_path.upper(), block) is not None: |
|
684 self.Subscribed[block] = iec_path.upper() |
701 self.Subscribed[block] = iec_path.upper() |
685 |
702 |
686 self.RefreshVisibleElements() |
703 self.RefreshVisibleElements() |
687 self.ShowErrors() |
704 self.ShowErrors() |
688 self.Refresh(False) |
705 self.Refresh(False) |
1368 self.SelectedElement.SetSelected(False) |
1385 self.SelectedElement.SetSelected(False) |
1369 self.SelectedElement = None |
1386 self.SelectedElement = None |
1370 if element is not None: |
1387 if element is not None: |
1371 self.SelectedElement = element |
1388 self.SelectedElement = element |
1372 if self.Debug: |
1389 if self.Debug: |
|
1390 self.StartMousePos = event.GetPosition() |
1373 Graphic_Element.OnLeftDown(self.SelectedElement, event, dc, self.Scaling) |
1391 Graphic_Element.OnLeftDown(self.SelectedElement, event, dc, self.Scaling) |
1374 else: |
1392 else: |
1375 self.SelectedElement.OnLeftDown(event, dc, self.Scaling) |
1393 self.SelectedElement.OnLeftDown(event, dc, self.Scaling) |
1376 self.SelectedElement.Refresh() |
1394 self.SelectedElement.Refresh() |
1377 else: |
1395 else: |
1383 self.rubberBand.Reset() |
1401 self.rubberBand.Reset() |
1384 self.rubberBand.OnLeftDown(event, self.GetLogicalDC(), self.Scaling) |
1402 self.rubberBand.OnLeftDown(event, self.GetLogicalDC(), self.Scaling) |
1385 event.Skip() |
1403 event.Skip() |
1386 |
1404 |
1387 def OnViewerLeftUp(self, event): |
1405 def OnViewerLeftUp(self, event): |
|
1406 self.StartMousePos = None |
1388 if self.rubberBand.IsShown(): |
1407 if self.rubberBand.IsShown(): |
1389 if self.Mode == MODE_SELECTION: |
1408 if self.Mode == MODE_SELECTION: |
1390 elements = self.SearchElements(self.rubberBand.GetCurrentExtent()) |
1409 elements = self.SearchElements(self.rubberBand.GetCurrentExtent()) |
1391 self.rubberBand.OnLeftUp(event, self.GetLogicalDC(), self.Scaling) |
1410 self.rubberBand.OnLeftUp(event, self.GetLogicalDC(), self.Scaling) |
1392 if len(elements) == 1: |
1411 if len(elements) == 1: |
1501 event.Skip() |
1520 event.Skip() |
1502 |
1521 |
1503 def OnViewerLeftDClick(self, event): |
1522 def OnViewerLeftDClick(self, event): |
1504 if self.Mode == MODE_SELECTION and self.SelectedElement is not None: |
1523 if self.Mode == MODE_SELECTION and self.SelectedElement is not None: |
1505 if self.Debug: |
1524 if self.Debug: |
1506 Graphic_Element.OnLeftDClick(self.SelectedElement, event, self.GetLogicalDC(), self.Scaling) |
1525 iec_path = self.GetElementIECPath(self.SelectedElement) |
|
1526 if iec_path is not None: |
|
1527 if isinstance(self.SelectedElement, Wire): |
|
1528 if self.SelectedElement.EndConnected is not None: |
|
1529 var_type = self.SelectedElement.EndConnected.GetType() |
|
1530 if self.Controler.IsOfType(var_type, "ANY_NUM", self.Debug) or\ |
|
1531 self.Controler.IsOfType(var_type, "ANY_BIT", self.Debug): |
|
1532 self.ParentWindow.OpenGraphicViewer(iec_path) |
|
1533 else: |
|
1534 self.ParentWindow.OpenGraphicViewer(iec_path) |
1507 elif event.ControlDown() and not event.ShiftDown(): |
1535 elif event.ControlDown() and not event.ShiftDown(): |
1508 if self.IsBlock(self.SelectedElement) and self.SelectedElement.GetType() in self.Controler.GetProjectPouNames(self.Debug): |
1536 if self.IsBlock(self.SelectedElement) and self.SelectedElement.GetType() in self.Controler.GetProjectPouNames(self.Debug): |
1509 self.ParentWindow.EditProjectElement(ITEM_POU, self.SelectedElement.GetType()) |
1537 self.ParentWindow.EditProjectElement(ITEM_POU, self.SelectedElement.GetType()) |
|
1538 else: |
|
1539 self.SelectedElement.OnLeftDClick(event, self.GetLogicalDC(), self.Scaling) |
1510 elif event.ControlDown() and event.ShiftDown(): |
1540 elif event.ControlDown() and event.ShiftDown(): |
1511 movex, movey = self.SelectedElement.AdjustToScaling(self.Scaling) |
1541 movex, movey = self.SelectedElement.AdjustToScaling(self.Scaling) |
1512 self.SelectedElement.RefreshModel() |
1542 self.SelectedElement.RefreshModel() |
1513 self.RefreshBuffer() |
1543 self.RefreshBuffer() |
1514 if movex != 0 or movey != 0: |
1544 if movex != 0 or movey != 0: |
1535 self.Scroll(scrollx, scrolly) |
1565 self.Scroll(scrollx, scrolly) |
1536 self.RefreshScrollBars() |
1566 self.RefreshScrollBars() |
1537 self.RefreshVisibleElements() |
1567 self.RefreshVisibleElements() |
1538 else: |
1568 else: |
1539 if not event.Dragging(): |
1569 if not event.Dragging(): |
|
1570 if self.Debug: |
|
1571 tooltip_pos = self.ClientToScreen(event.GetPosition()) |
|
1572 tooltip_pos.x += 10 |
|
1573 tooltip_pos.y += 10 |
1540 highlighted = self.FindElement(pos) |
1574 highlighted = self.FindElement(pos) |
1541 if self.HighlightedElement is not None and self.HighlightedElement != highlighted: |
1575 if self.HighlightedElement is not None and self.HighlightedElement != highlighted: |
1542 if isinstance(self.HighlightedElement, Wire): |
1576 if self.Debug and isinstance(self.HighlightedElement, Wire): |
1543 self.HighlightedElement.ClearToolTip() |
1577 self.HighlightedElement.ClearToolTip() |
1544 self.HighlightedElement.SetHighlighted(False) |
1578 self.HighlightedElement.SetHighlighted(False) |
1545 self.HighlightedElement = None |
1579 self.HighlightedElement = None |
1546 if highlighted is not None and self.HighlightedElement != highlighted: |
1580 if highlighted is not None and self.HighlightedElement != highlighted: |
1547 if isinstance(highlighted, Wire): |
1581 if self.Debug and isinstance(highlighted, Wire): |
1548 pos = self.ClientToScreen(event.GetPosition()) |
1582 highlighted.CreateToolTip(tooltip_pos) |
1549 pos.x += 10 |
|
1550 pos.y += 10 |
|
1551 highlighted.CreateToolTip(pos) |
|
1552 highlighted.SetHighlighted(True) |
1583 highlighted.SetHighlighted(True) |
|
1584 elif self.Debug and highlighted is not None and isinstance(highlighted, Wire): |
|
1585 highlighted.MoveToolTip(tooltip_pos) |
1553 self.HighlightedElement = highlighted |
1586 self.HighlightedElement = highlighted |
1554 if self.rubberBand.IsShown(): |
1587 if self.rubberBand.IsShown(): |
1555 self.rubberBand.OnMotion(event, dc, self.Scaling) |
1588 self.rubberBand.OnMotion(event, dc, self.Scaling) |
1556 elif not self.Debug and self.Mode == MODE_SELECTION and self.SelectedElement is not None: |
1589 elif not self.Debug and self.Mode == MODE_SELECTION and self.SelectedElement is not None: |
1557 if self.DrawingWire: |
1590 if self.DrawingWire: |
1564 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False) |
1597 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False) |
1565 else: |
1598 else: |
1566 movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling) |
1599 movex, movey = self.SelectedElement.OnMotion(event, dc, self.Scaling) |
1567 if movex != 0 or movey != 0: |
1600 if movex != 0 or movey != 0: |
1568 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False) |
1601 self.RefreshRect(self.GetScrolledRect(self.SelectedElement.GetRedrawRect(movex, movey)), False) |
|
1602 elif self.Debug and self.StartMousePos is not None and event.Dragging(): |
|
1603 pos = event.GetPosition() |
|
1604 if abs(self.StartMousePos.x - pos.x) > 5 or abs(self.StartMousePos.y - pos.y) > 5: |
|
1605 iec_path = self.GetElementIECPath(self.SelectedElement) |
|
1606 if iec_path is not None: |
|
1607 self.StartMousePos = None |
|
1608 if self.HighlightedElement is not None: |
|
1609 if isinstance(self.HighlightedElement, Wire): |
|
1610 self.HighlightedElement.ClearToolTip() |
|
1611 self.HighlightedElement.SetHighlighted(False) |
|
1612 self.HighlightedElement = None |
|
1613 data = wx.TextDataObject(str((iec_path, "debug"))) |
|
1614 dragSource = wx.DropSource(self) |
|
1615 dragSource.SetData(data) |
|
1616 dragSource.DoDragDrop() |
1569 self.UpdateScrollPos(event) |
1617 self.UpdateScrollPos(event) |
1570 event.Skip() |
1618 event.Skip() |
1571 |
1619 |
1572 def OnLeaveViewer(self, event): |
1620 def OnLeaveViewer(self, event): |
|
1621 self.StartMousePos = None |
1573 if self.SelectedElement is not None and self.SelectedElement.GetDragging(): |
1622 if self.SelectedElement is not None and self.SelectedElement.GetDragging(): |
1574 event.Skip() |
1623 event.Skip() |
1575 elif self.HighlightedElement is not None: |
1624 elif self.HighlightedElement is not None: |
1576 if isinstance(self.HighlightedElement, Wire): |
1625 if isinstance(self.HighlightedElement, Wire): |
1577 self.HighlightedElement.ClearToolTip() |
1626 self.HighlightedElement.ClearToolTip() |
2604 max(round_scaling(30, self.Scaling[1], 1), |
2653 max(round_scaling(30, self.Scaling[1], 1), |
2605 round_scaling(y, self.Scaling[1]))) |
2654 round_scaling(y, self.Scaling[1]))) |
2606 else: |
2655 else: |
2607 new_pos = wx.Point(max(30, x), max(30, y)) |
2656 new_pos = wx.Point(max(30, x), max(30, y)) |
2608 block = self.CopyBlock(element, new_pos) |
2657 block = self.CopyBlock(element, new_pos) |
|
2658 self.RefreshVisibleElements() |
2609 if self.SelectedElement is not None: |
2659 if self.SelectedElement is not None: |
2610 self.SelectedElement.SetSelected(False) |
2660 self.SelectedElement.SetSelected(False) |
2611 self.SelectedElement = block |
2661 self.SelectedElement = block |
2612 self.SelectedElement.SetSelected(True) |
2662 self.SelectedElement.SetSelected(True) |
2613 self.RefreshBuffer() |
2663 self.RefreshBuffer() |
2614 self.RefreshScrollBars() |
2664 self.RefreshScrollBars() |
2615 self.RefreshVisibleElements() |
|
2616 self.ParentWindow.RefreshVariablePanel(self.TagName) |
2665 self.ParentWindow.RefreshVariablePanel(self.TagName) |
2617 self.ParentWindow.RefreshInstancesTree() |
2666 self.ParentWindow.RefreshInstancesTree() |
2618 else: |
2667 else: |
2619 message = wx.MessageDialog(self, "You can't paste the element in buffer here!", "Error", wx.OK|wx.ICON_ERROR) |
2668 message = wx.MessageDialog(self, "You can't paste the element in buffer here!", "Error", wx.OK|wx.ICON_ERROR) |
2620 message.ShowModal() |
2669 message.ShowModal() |
2629 return True |
2678 return True |
2630 elif self.CurrentLanguage == "FBD" and isinstance(block, (FBD_Block, FBD_Variable, FBD_Connector, Comment)): |
2679 elif self.CurrentLanguage == "FBD" and isinstance(block, (FBD_Block, FBD_Variable, FBD_Connector, Comment)): |
2631 return True |
2680 return True |
2632 return False |
2681 return False |
2633 |
2682 |
2634 def GenerateNewName(self, element): |
2683 def GenerateNewName(self, element, exclude={}): |
|
2684 names = exclude.copy() |
2635 if isinstance(element, FBD_Block): |
2685 if isinstance(element, FBD_Block): |
2636 names = [varname.upper() for varname in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)] |
2686 names.update(dict([(varname.upper(), True) for varname in self.Controler.GetEditedElementVariables(self.TagName, self.Debug)])) |
2637 format = "Block%d" |
2687 format = "Block%d" |
2638 elif isinstance(element, SFC_Step): |
2688 elif isinstance(element, SFC_Step): |
2639 names = [block.GetName().upper() for block in self.Blocks if isinstance(block, SFC_Step)] |
2689 names.update(dict([block.GetName().upper() for block in self.Blocks if isinstance(block, SFC_Step)])) |
2640 format = "Step%d" |
2690 format = "Step%d" |
2641 i = 1 |
2691 i = 1 |
2642 while (format%i).upper() in names: |
2692 while names.get((format%i).upper(), False): |
2643 i += 1 |
2693 i += 1 |
2644 return format%i |
2694 return format%i |
2645 |
2695 |
2646 def IsNamedElement(self, element): |
2696 def IsNamedElement(self, element): |
2647 return isinstance(element, FBD_Block) and element.GetName() != "" or isinstance(element, SFC_Step) |
2697 return isinstance(element, FBD_Block) and element.GetName() != "" or isinstance(element, SFC_Step) |