318 |
318 |
319 # Returns if the point given is in the bounding box |
319 # Returns if the point given is in the bounding box |
320 def HitTest(self, pt): |
320 def HitTest(self, pt): |
321 rect = self.BoundingBox |
321 rect = self.BoundingBox |
322 return rect.InsideXY(pt.x, pt.y) |
322 return rect.InsideXY(pt.x, pt.y) |
|
323 |
|
324 # Returns if the point given is in the bounding box |
|
325 def IsInSelection(self, rect): |
|
326 return rect.InsideXY(self.BoundingBox.x, self.BoundingBox.y) and rect.InsideXY(self.BoundingBox.x + self.BoundingBox.width, self.BoundingBox.y + self.BoundingBox.height) |
323 |
327 |
324 # Override this method for refreshing the bounding box |
328 # Override this method for refreshing the bounding box |
325 def RefreshBoundingBox(self): |
329 def RefreshBoundingBox(self): |
326 pass |
330 pass |
327 |
331 |
513 |
517 |
514 # Create a new group of graphic elements |
518 # Create a new group of graphic elements |
515 def __init__(self, parent): |
519 def __init__(self, parent): |
516 Graphic_Element.__init__(self, parent) |
520 Graphic_Element.__init__(self, parent) |
517 self.Elements = [] |
521 self.Elements = [] |
|
522 self.RefreshWireExclusion() |
518 self.RefreshBoundingBox() |
523 self.RefreshBoundingBox() |
519 |
524 |
520 # Destructor |
525 # Destructor |
521 def __del__(self): |
526 def __del__(self): |
522 self.Elements = [] |
527 self.Elements = [] |
|
528 |
|
529 # Refresh the list of wire excluded |
|
530 def RefreshWireExclusion(self): |
|
531 self.WireExcluded = [] |
|
532 for element in self.Elements: |
|
533 if isinstance(element, Wire): |
|
534 startblock = element.StartConnected.GetParentBlock() |
|
535 endblock = element.EndConnected.GetParentBlock() |
|
536 if startblock in self.Elements and endblock in self.Elements: |
|
537 self.WireExcluded.append(element) |
523 |
538 |
524 # Make a clone of this group |
539 # Make a clone of this group |
525 def Clone(self): |
540 def Clone(self): |
526 clone = Graphic_Group(self.Parent) |
541 clone = Graphic_Group(self.Parent) |
527 elements = [] |
542 elements = [] |
540 # Delete this group of elements |
555 # Delete this group of elements |
541 def Delete(self): |
556 def Delete(self): |
542 # Delete all the elements of the group |
557 # Delete all the elements of the group |
543 for element in self.Elements: |
558 for element in self.Elements: |
544 element.Delete() |
559 element.Delete() |
|
560 self.WireExcluded = [] |
545 |
561 |
546 # Returns if the point given is in the bounding box of one of the elements of this group |
562 # Returns if the point given is in the bounding box of one of the elements of this group |
547 def HitTest(self, pt): |
563 def HitTest(self, pt): |
548 result = False |
564 result = False |
549 for element in self.Elements: |
565 for element in self.Elements: |
555 return element in self.Elements |
571 return element in self.Elements |
556 |
572 |
557 # Change the elements of the group |
573 # Change the elements of the group |
558 def SetElements(self, elements): |
574 def SetElements(self, elements): |
559 self.Elements = elements |
575 self.Elements = elements |
|
576 self.RefreshWireExclusion() |
560 self.RefreshBoundingBox() |
577 self.RefreshBoundingBox() |
561 |
578 |
562 # Returns the elements of the group |
579 # Returns the elements of the group |
563 def GetElements(self): |
580 def GetElements(self): |
564 return self.Elements |
581 return self.Elements |
567 def SelectElement(self, element): |
584 def SelectElement(self, element): |
568 if element in self.Elements: |
585 if element in self.Elements: |
569 self.Elements.remove(element) |
586 self.Elements.remove(element) |
570 else: |
587 else: |
571 self.Elements.append(element) |
588 self.Elements.append(element) |
|
589 self.RefreshWireExclusion() |
572 self.RefreshBoundingBox() |
590 self.RefreshBoundingBox() |
573 |
591 |
574 # Move this group of elements |
592 # Move this group of elements |
575 def Move(self, movex, movey): |
593 def Move(self, movex, movey): |
576 exclude = [] |
|
577 for element in self.Elements: |
|
578 if isinstance(element, Wire): |
|
579 exclude.append(element) |
|
580 # Move all the elements of the group |
594 # Move all the elements of the group |
581 for element in self.Elements: |
595 for element in self.Elements: |
582 if isinstance(element, Wire): |
596 if not isinstance(element, Wire): |
|
597 element.Move(movex, movey, self.WireExcluded) |
|
598 elif element in self.WireExcluded: |
583 element.Move(movex, movey, True) |
599 element.Move(movex, movey, True) |
584 else: |
|
585 element.Move(movex, movey, exclude) |
|
586 self.RefreshBoundingBox() |
600 self.RefreshBoundingBox() |
587 |
601 |
588 # Refreshes the bounding box of this group of elements |
602 # Refreshes the bounding box of this group of elements |
589 def RefreshBoundingBox(self): |
603 def RefreshBoundingBox(self): |
590 if len(self.Elements) > 0: |
604 if len(self.Elements) > 0: |
649 self.Wires = [] |
663 self.Wires = [] |
650 self.Negated = negated |
664 self.Negated = negated |
651 self.Edge = edge |
665 self.Edge = edge |
652 self.OneConnected = onlyone |
666 self.OneConnected = onlyone |
653 self.Pen = wxBLACK_PEN |
667 self.Pen = wxBLACK_PEN |
|
668 self.RefreshNameSize() |
654 |
669 |
655 # Change the connector pen |
670 # Change the connector pen |
656 def SetPen(self, pen): |
671 def SetPen(self, pen): |
657 self.Pen = pen |
672 self.Pen = pen |
658 |
673 |
659 # Make a clone of the connector |
674 # Make a clone of the connector |
660 def Clone(self): |
675 def Clone(self): |
661 return Connector(self.Parent, self.Name, self.Type, wxPoint(self.Pos[0], self.Pos[1]), |
676 return Connector(self.ParentBlock, self.Name, self.Type, wxPoint(self.Pos[0], self.Pos[1]), |
662 self.Direction, self.Negated) |
677 self.Direction, self.Negated) |
663 |
678 |
664 # Returns the connector parent block |
679 # Returns the connector parent block |
665 def GetParentBlock(self): |
680 def GetParentBlock(self): |
666 return self.ParentBlock |
681 return self.ParentBlock |
678 return self.Name |
693 return self.Name |
679 |
694 |
680 # Changes the connector name |
695 # Changes the connector name |
681 def SetName(self, name): |
696 def SetName(self, name): |
682 self.Name = name |
697 self.Name = name |
|
698 self.RefreshNameSize() |
|
699 |
|
700 # Changes the connector name size |
|
701 def RefreshNameSize(self): |
|
702 if self.Name != "": |
|
703 dc = wxClientDC(self.ParentBlock.Parent) |
|
704 self.NameSize = dc.GetTextExtent(self.Name) |
|
705 else: |
|
706 self.NameSize = 0, 0 |
|
707 |
|
708 # Returns the connector name size |
|
709 def GetNameSize(self): |
|
710 return self.NameSize |
683 |
711 |
684 # Returns the wires connected to the connector |
712 # Returns the wires connected to the connector |
685 def GetWires(self): |
713 def GetWires(self): |
686 return self.Wires |
714 return self.Wires |
687 |
715 |
854 dc.DrawLine(xstart, ystart, xstart + 4, ystart - 4) |
882 dc.DrawLine(xstart, ystart, xstart + 4, ystart - 4) |
855 dc.DrawLine(xstart, ystart, xstart + 4, ystart + 4) |
883 dc.DrawLine(xstart, ystart, xstart + 4, ystart + 4) |
856 xend = xstart + CONNECTOR_SIZE * self.Direction[0] |
884 xend = xstart + CONNECTOR_SIZE * self.Direction[0] |
857 yend = ystart + CONNECTOR_SIZE * self.Direction[1] |
885 yend = ystart + CONNECTOR_SIZE * self.Direction[1] |
858 dc.DrawLine(xstart + self.Direction[0], ystart + self.Direction[1], xend, yend) |
886 dc.DrawLine(xstart + self.Direction[0], ystart + self.Direction[1], xend, yend) |
859 # Calculate the position of the text |
|
860 text_size = dc.GetTextExtent(self.Name) |
|
861 if self.Direction[0] != 0: |
887 if self.Direction[0] != 0: |
862 ytext = parent_pos[1] + self.Pos.y - text_size[1] / 2 |
888 ytext = parent_pos[1] + self.Pos.y - self.NameSize[1] / 2 |
863 if self.Direction[0] < 0: |
889 if self.Direction[0] < 0: |
864 xtext = parent_pos[0] + self.Pos.x + 5 |
890 xtext = parent_pos[0] + self.Pos.x + 5 |
865 else: |
891 else: |
866 xtext = parent_pos[0] + self.Pos.x - (text_size[0] + 5) |
892 xtext = parent_pos[0] + self.Pos.x - (self.NameSize[0] + 5) |
867 if self.Direction[1] != 0: |
893 if self.Direction[1] != 0: |
868 xtext = parent_pos[0] + self.Pos.x - text_size[0] / 2 |
894 xtext = parent_pos[0] + self.Pos.x - self.NameSize[0] / 2 |
869 if self.Direction[1] < 0: |
895 if self.Direction[1] < 0: |
870 ytext = parent_pos[1] + self.Pos.y + 5 |
896 ytext = parent_pos[1] + self.Pos.y + 5 |
871 else: |
897 else: |
872 ytext = parent_pos[1] + self.Pos.y - (text_size[1] + 5) |
898 ytext = parent_pos[1] + self.Pos.y - (self.NameSize[1] + 5) |
873 # Draw the text |
899 # Draw the text |
874 dc.DrawText(self.Name, xtext, ytext) |
900 dc.DrawText(self.Name, xtext, ytext) |
875 |
901 |
876 |
902 |
877 #------------------------------------------------------------------------------- |
903 #------------------------------------------------------------------------------- |
1137 # Returns the id of the block connected to the first or the last wire point |
1163 # Returns the id of the block connected to the first or the last wire point |
1138 def GetConnectedInfos(self, index): |
1164 def GetConnectedInfos(self, index): |
1139 if index == 0 and self.StartConnected: |
1165 if index == 0 and self.StartConnected: |
1140 return self.StartConnected.GetBlockId(), self.StartConnected.GetName() |
1166 return self.StartConnected.GetBlockId(), self.StartConnected.GetName() |
1141 elif index == -1 and self.EndConnected: |
1167 elif index == -1 and self.EndConnected: |
1142 return self.EndConnected.GetBlockId(), self.StartConnected.GetName() |
1168 return self.EndConnected.GetBlockId(), self.EndConnected.GetName() |
1143 return None |
1169 return None |
1144 |
1170 |
1145 # Update the wire points position by keeping at most possible the current positions |
1171 # Update the wire points position by keeping at most possible the current positions |
1146 def GeneratePoints(self, realpoints = True): |
1172 def GeneratePoints(self, realpoints = True): |
1147 i = 0 |
1173 i = 0 |