рдзреАрд░реЗ-рдзреАрд░реЗ рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВ WxPython рдкрд░ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВ, рдЬрд╣рд╛рдВ рдореИрдВ рдЦрд░реЛрдВрдЪ рд╕реЗ рдиреЛрдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдиреЗ рдФрд░ рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдкрд┐рдЫрд▓реЗ рднрд╛рдЧреЛрдВ рдореЗрдВ рдпрд╣ рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИ рдХрд┐ рдиреЛрдбреНрд╕ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕реА рднрд╛рдЧ рдореЗрдВ, рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдпрд╣ рдЪрд┐рддреНрд░ рдЙрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛:

рдЕрднреА рднреА рд╕рд╣реА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рдФрд░ рдХрд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдкрд┐рдЫрд▓реЗ рднрд╛рдЧ рдпрд╣рд╛рдВ рд░рд╣рддреЗ рд╣реИрдВ:
рднрд╛рдЧ 1: рдбреНрд░рд╛ рдХрд░рдирд╛ рд╕реАрдЦрдирд╛рднрд╛рдЧ 2: рдорд╛рдЙрд╕ рдИрд╡реЗрдВрдЯреНрд╕ рдХреЛ рд╣реИрдВрдбрд▓ рдХрд░рдирд╛рднрд╛рдЧ 3: рд╕реБрд╡рд┐рдзрд╛рдУрдВ + рдХреАрдмреЛрд░реНрдб рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рд░реА рд╣реИрднрд╛рдЧ 4: рдбреНрд░реИрдЧ рдПрдВрдб рдбреНрд░реЙрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛рднрд╛рдЧ 5: рдиреЛрдб рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ13. рд╕рд░рд▓рддрдо рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рдПрдВ
рдиреЛрдб рдХрдиреЗрдХреНрд╢рди рдХреА рдЦреЛрдЬ рдореЗрдВ, рд╣рдо рдПрдХ рдкреНрд░рдореБрдЦ рдШрдЯрдХ, рдПрдХ рдХрдиреЗрдХреНрд╢рди рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдЕрдкрдиреЗ рд╕рд░рд▓рддрдо рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
class Connection(CanvasObject): def __init__(self, source, destination, **kwargs): super(Connection, self).__init__(**kwargs) self.source = source self.destination = destination def Render(self, gc): gc.SetPen(wx.Pen('#000000', 1, wx.SOLID)) gc.DrawLines([self.source.position, self.destination.position]) def RenderHighlighting(self, gc): return def ReturnObjectUnderCursor(self, pos): return None
рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рдФрд░ рддреБрдЪреНрдЫ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╢реБрд░реБрдЖрддреА рдФрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ рдФрд░ рд╣рдо рд╕рд┐рд░реНрдл рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмреАрдЪ рдПрдХ рд░реЗрдЦрд╛ рдЦреАрдВрдЪрддреЗ рд╣реИрдВред рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХреЗ рдмрдЬрд╛рдп, рд╕реНрдЯрдмреНрд╕ рдЕрднреА рднреА рдЙрдкрдпреЛрдЧ рдореЗрдВ рд╣реИрдВред
рдЕрдм рд╣рдореЗрдВ рдиреЛрдбреНрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕рд░рд▓ рд╣реЛрдЧрд╛: Shift рдкрдХрдбрд╝рддреЗ рд╕рдордп, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрд░реЛрдд рдиреЛрдб рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рдПрдХ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдЦреАрдВрдЪрддрд╛ рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП, рдЬрдм рд╣рдо рдЙрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕реНрд░реЛрдд рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВрдЧреЗ, рдирд┐рдореНрди рдХреЛрдб рдХреЛ "OnMouseLeftDown" рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ:
if evt.ShiftDown() and self._objectUnderCursor.connectableSource: self._connectionStartObject = self._objectUnderCursor
рдЬрдм рдЖрдк рдмрдЯрди рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдпрд╣ рднреА рдЬрд╛рдВрдЪреЗрдВрдЧреЗ рдХрд┐ рдХрд░реНрд╕рд░ рдХреЗ рдиреАрдЪреЗ рдХреА рд╡рд╕реНрддреБ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ рдпрджрд┐ рд╕рдм рдареАрдХ рд╣реИ рддреЛ рдЙрдиреНрд╣реЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреА рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, "OnMouseLeftUp" рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╣рдо рдЙрдЪрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝реЗрдВрдЧреЗ:
if (self._connectionStartObject and self._objectUnderCursor and self._connectionStartObject != self._objectUnderCursor and self._objectUnderCursor.connectableDestination): self.ConnectNodes(self._connectionStartObject, self._objectUnderCursor)
ConnectNodes рд╡рд┐рдзрд┐ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдмрдирд╛рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рджреЛрдиреЛрдВ рдЬреБрдбрд╝реЗ рдиреЛрдбреНрд╕ рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреА рд╣реИ:
def ConnectNodes(self, source, destination): newConnection = Connection(source, destination) self._connectionStartObject.AddOutcomingConnection(newConnection) self._objectUnderCursor.AddIncomingConnection(newConnection)
рдпрд╣ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдиреЛрдбреНрд╕ рд╕рд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЙрдкрдпреБрдХреНрдд рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗ, рди рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдмрд▓реНрдХрд┐ 3. "ConnectableObject" рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реЛрдЧрд╛ рдЬреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕реЗ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдмрд┐рдВрджреБ рдФрд░ рдПрдХ рдиреЛрдб рдХреЗрдВрджреНрд░ (рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж, рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ) рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
class ConnectableObject(CanvasObject): def __init__(self, **kwargs): super(ConnectableObject, self).__init__(**kwargs) def GetConnectionPortForTargetPoint(self, targetPoint): """ GetConnectionPortForTargetPoint method should return an end point position for a connection object. """ raise NotImplementedError() def GetCenter(self): """ GetCenter method should return a center of this object. It is used during a connection process as a preview of a future connection. """ raise NotImplementedError()
рдЖрд╡рдХ рдФрд░ рдЬрд╛рд╡рдХ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ "ConnectableObject" рд╕реЗ рджреЛ рд╡рд░реНрдЧ рднреА рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ:
class ConnectableDestination(ConnectableObject): def __init__(self, **kwargs): super(ConnectableDestination, self).__init__(**kwargs) self.connectableDestination = True self._incomingConnections = [] def AddIncomingConnection(self, connection): self._incomingConnections.append(connection) def DeleteIncomingConnection(self, connection): self._incomingConnections.remove(connection) class ConnectableSource(ConnectableObject): def __init__(self, **kwargs): super(ConnectableSource, self).__init__(**kwargs) self.connectableSource = True self._outcomingConnections = [] def AddOutcomingConnection(self, connection): self._outcomingConnections.append(connection) def DeleteOutcomingConnection(self, connection): self._outcomingConnections.remove(connection) def GetOutcomingConnections(self): return self._outcomingConnections
рдпреЗ рджреЛрдиреЛрдВ рдХрдХреНрд╖рд╛рдПрдВ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдХреНрд░рдорд╢рдГ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдФрд░ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдиреЗрдХреНрд╢рдиреЛрдВ рдХреА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рдЙрдЪрд┐рдд рдЭрдВрдбреЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХреИрдирд╡рд╛рд╕ рдХреЛ рдкрддрд╛ рдЪрд▓реЗ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдВрддрд┐рдо рдЪрд░рдг рд╢реЗрд╖ рд╣реИ: рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдЖрдзрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╣рдорд╛рд░реА рдиреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ рдФрд░ рдкреНрд░рддрд┐рдкрд╛рджрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВред рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдЖрдк рдХреИрдирд╡рд╛рд╕ рдореЗрдВ рдиреЛрдбреНрд╕ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрд╕реА рд╕реНрдерд╛рди рдкрд░ рд░реЗрдВрдбрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рдиреЛрдб рдХреЛ рд╕реМрдВрдк рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рдХрдиреЗрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдиреЛрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗ:
for connection in self.GetOutcomingConnections(): connection.Render(gc)
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдЗрд╕ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдереЛрдбрд╝рд╛ рдЦреЗрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рд░реНрдпрд╢реАрд▓ :) рдХреЛрдб рдХрд╛ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг
рдпрд╣рд╛рдВ рд░рд╣рддрд╛
рд╣реИ ред
14. рд╕реБрдВрджрд░ рддреАрд░ рдмрдирд╛рдирд╛
рдиреЛрдбреНрд╕ рдХреЗ рдХреЛрдиреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реА рд░реЗрдЦрд╛рдПрдВ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рд╕реБрдВрджрд░ рдФрд░ рд╕реМрдВрджрд░реНрдпрд╡рд╛рджреА рд░реВрдк рд╕реЗ рдкреНрд░рд╕рдиреНрди рдирд╣реАрдВ рд╣реИрдВред рдЦреИрд░, рдпрд╣ рдбрд░рд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ, рдЕрдм рд╣рдо рд╕реБрдВрджрд░ рдФрд░ рд╕реМрдВрджрд░реНрдпрдкреВрд░реНрдг рддреАрд░ рдмрдирд╛рдПрдВрдЧреЗред рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рддреАрд░ рдЦреАрдВрдЪрдиреЗ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЬрд▓реНрджреА рд╕реЗ рд╕реНрдХреВрд▓ рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП рдФрд░ NumPy рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд▓рд┐рдЦрд╛ рдерд╛:
def RenderArrow(self, gc, sourcePoint, destinationPoint): gc.DrawLines([sourcePoint, destinationPoint])
рдпрд╣рд╛рдБ рд╣рдо рддреАрд░ рдХреЗ рдЕрдВрдд рд╕реЗ рд╢реБрд░реБрдЖрдд рддрдХ "self.arrowLength" рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рджреВрд░реА рдХреЗ рд╕рд╛рде рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВ "self.arrowWidth"ред рдЗрд╕рд▓рд┐рдП рд╣рдо рддреАрд░ рдХреЗ рдЫреЛрд░ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдЦрдВрдбреЛрдВ рдХреЗ рд╕рд┐рд░реЛрдВ рдХреЗ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкрд╛рддреЗ рд╣реИрдВ ... рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕реЗ рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВ, рдЯрд┐рдк рдХреЗ рд╕рд┐рд░реЛрдВ рдХреЗ рд╕рд╛рде рдпрд╛ рдХреБрдЫ рдФрд░ред
рдпрд╣ рдПрд░реЛ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдбреНрд░рд╛рдЗрдВрдЧ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдореЗрдВ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд┐рддреНрд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛:

рдпрд╣рд╛рдВ рдХреЛрдб рд░рд╣рддрд╛
рд╣реИ ред
15. рд╣рдореЗрдВ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╕рд┐рд░реЛрдВ рдХреЗ рд╕рд╣реА рдмрд┐рдВрджреБ рдорд┐рд▓рддреЗ рд╣реИрдВ
рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЗрд╣рддрд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддреАрд░ рдХреЗ рдЫреЛрд░ рдЕрд╕реНрдкрд╖реНрдЯ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХрдиреЗрдХреНрд╢рди рдХреЗ рд╡рд░реНрдЧ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрдиреЗрдХреНрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рдмрд┐рдВрджреБрдУрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:
def SourcePoint(self): return np.array(self.source.GetConnectionPortForTargetPoint(self.destination.GetCenter())) def DestinationPoint(self): return np.array(self.destination.GetConnectionPortForTargetPoint(self.source.GetCenter()))
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб рдХреЛ рдпрд╣ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрдиреЗрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рдХрд╣рд╛рдВ рд╣реИ, рджреВрд╕рд░реЗ рдЫреЛрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдкрд░реАрдд рдиреЛрдб рдХреЗ рдХреЗрдВрджреНрд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ред рдпрд╣ рдПрдХ рдЖрджрд░реНрд╢ рдФрд░ рд╕рдмрд╕реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд░реЗрдЧрд╛ред рдХрдиреЗрдХреНрд╢рди рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
def Render(self, gc): gc.SetPen(wx.Pen('#000000', 1, wx.SOLID)) self.RenderArrow(gc, self.SourcePoint(), self.DestinationPoint())
рдпрд╣ рдиреЛрдб рдкрд░ GetConnectionPortForTargetPoint рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ, рдЬреЛ рдЙрд╕ рдиреЛрдб рдХреА рд╕реАрдорд╛ рдкрд░ рдмрд┐рдВрджреБ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ рдЬрд╣рд╛рдВ рдХрдиреЗрдХреНрд╢рди рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЧреЛрд▓ рдХреЛрдиреЛрдВ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЖрдпрдд рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
def GetConnectionPortForTargetPoint(self, targetPoint): targetPoint = np.array(targetPoint) center = np.array(self.GetCenter()) direction = targetPoint - center if direction[0] > 0:
рдпрд╣рд╛рдВ рд╣рдо рдиреЛрдб рдХреЗ рдХреЗрдВрджреНрд░ рд╕реЗ рдЧрдВрддрд╡реНрдп рдмрд┐рдВрджреБ рдФрд░ рдЖрдпрдд рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдЖрдиреЗ рд╡рд╛рд▓реА рдХрд┐рд░рдг рдХреЗ рдмреАрдЪ рдирд┐рдХрдЯрддрдо рдЪреМрд░рд╛рд╣рд╛ рдкрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдпрд╣ рдмрд┐рдВрджреБ рдЖрдпрдд рдХреА рд╕реАрдорд╛ рдкрд░ рд╕реНрдерд┐рдд рд╣реИ, рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рд╣рдореЗрдВ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред рддреЛ рд╣рдо рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдпрд╛ рд▓реЗрдЦ рдХреЗ рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЪрд┐рддреНрд░ рдХреЗ рд╕рдорд╛рди рдХреБрдЫ, рдЬреЛ рдПрдХ рдкрд╛рда рдиреЛрдб рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рд╣реИ, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рдХреБрдЫ рдХреЗ рдХрд░реАрдм рд╣реИред
рдпрд╣рд╛рдВ рдХреЛрдб рд░рд╣рддрд╛
рд╣реИ ред
рдкреБрдирд╢реНрдЪ: рдЯрд╛рдЗрдкреЛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдореЗрдВ рд▓рд┐рдЦреЗрдВред