graphics/GraphicCommons.py
changeset 42 4a8400732001
parent 28 fc23e1f415d8
child 56 7187e1c00975
equal deleted inserted replaced
41:0688db995ddf 42:4a8400732001
   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