graphics/GraphicCommons.py
changeset 2618 4eca95f91cba
parent 2617 93ad3db5f9df
child 2625 e5ce6c4a8672
equal deleted inserted replaced
2614:6b4061f6ced6 2618:4eca95f91cba
  1962                 if rect.InsideXY(pt.x, pt.y):
  1962                 if rect.InsideXY(pt.x, pt.y):
  1963                     return i, self.Segments[i]
  1963                     return i, self.Segments[i]
  1964         return None
  1964         return None
  1965 
  1965 
  1966     # Define the wire points
  1966     # Define the wire points
  1967     def SetPoints(self, points, verify=True):
  1967     def SetPoints(self, points, merge_segments=True):
  1968         if len(points) > 1:
  1968         if len(points) > 1:
  1969             self.Points = [wx.Point(x, y) for x, y in points]
  1969 
       
  1970             # filter duplicates, add corner to diagonals
       
  1971             self.Points = []
       
  1972             lx,ly = None,None
       
  1973             for x, y in points:
       
  1974                 ex, ey = lx == x, ly == y
       
  1975                 if ex and ey:
       
  1976                     # duplicate
       
  1977                     continue
       
  1978                 if (lx,ly) != (None,None) and not ex and not ey:
       
  1979                     # diagonal
       
  1980                     self.Points.append(wx.Point(lx, y))
       
  1981                 self.Points.append(wx.Point(x, y))
       
  1982                 lx,ly = x,y
       
  1983 
  1970             # Calculate the start and end directions
  1984             # Calculate the start and end directions
  1971             self.StartPoint = [None, vector(self.Points[0], self.Points[1])]
  1985             self.StartPoint = [None, vector(self.Points[0], self.Points[1])]
  1972             self.EndPoint = [None, vector(self.Points[-1], self.Points[-2])]
  1986             self.EndPoint = [None, vector(self.Points[-1], self.Points[-2])]
  1973             # Calculate the start and end points
  1987             # Calculate the start and end points
  1974             self.StartPoint[0] = wx.Point(self.Points[0].x + CONNECTOR_SIZE * self.StartPoint[1][0],
  1988             self.StartPoint[0] = wx.Point(self.Points[0].x + CONNECTOR_SIZE * self.StartPoint[1][0],
  1978             self.Points[0] = self.StartPoint[0]
  1992             self.Points[0] = self.StartPoint[0]
  1979             self.Points[-1] = self.EndPoint[0]
  1993             self.Points[-1] = self.EndPoint[0]
  1980             # Calculate the segments directions
  1994             # Calculate the segments directions
  1981             self.Segments = []
  1995             self.Segments = []
  1982             i = 0
  1996             i = 0
  1983             while i < len(self.Points) - 1:
  1997             while True:
  1984                 if verify and 0 < i < len(self.Points) - 2 and \
  1998                 l = len(self.Points)
  1985                    self.Points[i] == self.Points[i + 1] and \
  1999                 if i > l - 2:
  1986                    self.Segments[-1] == vector(self.Points[i + 1], self.Points[i + 2]):
  2000                     break
  1987                     for dummy in xrange(2):
  2001 
  1988                         self.Points.pop(i)
  2002                 segment = vector(self.Points[i], self.Points[i + 1])
  1989                 else:
  2003 
  1990                     segment = vector(self.Points[i], self.Points[i + 1])
  2004                 # merge segment if requested
  1991                     if is_null_vector(segment) and i > 0:
  2005                 if merge_segments and 0 < i and \
  1992                         segment = (self.Segments[-1][1], self.Segments[-1][0])
  2006                    self.Segments[-1] == segment:
  1993                     if i < len(self.Points) - 2:
  2007                     self.Points.pop(i)
  1994                         next = vector(self.Points[i + 1], self.Points[i + 2])
  2008                     # Rollback
  1995                         if next == segment or is_null_vector(add_vectors(segment, next)):
  2009                     self.Segments.pop()
  1996                             self.Points.insert(i + 1, wx.Point(self.Points[i + 1].x, self.Points[i + 1].y))
  2010                     i -= 1
  1997                     self.Segments.append(segment)
  2011                     continue
  1998                     i += 1
  2012 
       
  2013                 # remove corner when two segments are in opposite direction
       
  2014                 if i < l - 2:
       
  2015                     next = vector(self.Points[i + 1], self.Points[i + 2])
       
  2016                     if is_null_vector(add_vectors(segment, next)):
       
  2017                         self.Points.pop(i+1)
       
  2018                         continue
       
  2019 
       
  2020                 self.Segments.append(segment)
       
  2021 
       
  2022                 i += 1
       
  2023 
  1999             self.RefreshBoundingBox()
  2024             self.RefreshBoundingBox()
  2000             self.RefreshRealPoints()
  2025             self.RefreshRealPoints()
  2001 
  2026 
  2002     # Returns the position of the point indicated
  2027     # Returns the position of the point indicated
  2003     def GetPoint(self, index):
  2028     def GetPoint(self, index):