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): |