author | Laurent Bessard |
Mon, 25 Jun 2012 20:03:53 +0200 | |
changeset 714 | 131ea7f237b9 |
parent 652 | 676307069508 |
child 759 | 264637370f8f |
permissions | -rw-r--r-- |
0 | 1 |
#!/usr/bin/env python |
2 |
# -*- coding: utf-8 -*- |
|
3 |
||
4 |
#This file is part of PLCOpenEditor, a library implementing an IEC 61131-3 editor |
|
5 |
#based on the plcopen standard. |
|
6 |
# |
|
58 | 7 |
#Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD |
0 | 8 |
# |
9 |
#See COPYING file for copyrights details. |
|
10 |
# |
|
11 |
#This library is free software; you can redistribute it and/or |
|
5 | 12 |
#modify it under the terms of the GNU General Public |
0 | 13 |
#License as published by the Free Software Foundation; either |
14 |
#version 2.1 of the License, or (at your option) any later version. |
|
15 |
# |
|
16 |
#This library is distributed in the hope that it will be useful, |
|
17 |
#but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
18 |
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
58 | 19 |
#General Public License for more details. |
0 | 20 |
# |
5 | 21 |
#You should have received a copy of the GNU General Public |
0 | 22 |
#License along with this library; if not, write to the Free Software |
23 |
#Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
24 |
||
25 |
import wx |
|
26 |
||
27 |
from GraphicCommons import * |
|
28 |
from plcopen.structures import * |
|
29 |
||
30 |
def GetWireSize(block): |
|
31 |
if isinstance(block, SFC_Step): |
|
32 |
return SFC_WIRE_MIN_SIZE + block.GetActionExtraLineNumber() * SFC_ACTION_MIN_SIZE[1] |
|
33 |
else: |
|
34 |
return SFC_WIRE_MIN_SIZE |
|
35 |
||
36 |
#------------------------------------------------------------------------------- |
|
37 |
# Sequencial Function Chart Step |
|
38 |
#------------------------------------------------------------------------------- |
|
39 |
||
40 |
""" |
|
41 |
Class that implements the graphic representation of a step |
|
42 |
""" |
|
43 |
||
361
62570186dad4
Adding support for synchronize refreshing with tick and limit it to a defined period
greg
parents:
327
diff
changeset
|
44 |
class SFC_Step(Graphic_Element, DebugDataConsumer): |
0 | 45 |
|
46 |
# Create a new step |
|
47 |
def __init__(self, parent, name, initial = False, id = None): |
|
48 |
Graphic_Element.__init__(self, parent) |
|
361
62570186dad4
Adding support for synchronize refreshing with tick and limit it to a defined period
greg
parents:
327
diff
changeset
|
49 |
DebugDataConsumer.__init__(self) |
213 | 50 |
self.SetName(name) |
0 | 51 |
self.Initial = initial |
52 |
self.Id = id |
|
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
53 |
self.Highlights = [] |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
54 |
self.Size = wx.Size(SFC_STEP_DEFAULT_SIZE[0], SFC_STEP_DEFAULT_SIZE[1]) |
0 | 55 |
# Create an input and output connector |
56 |
if not self.Initial: |
|
108 | 57 |
self.Input = Connector(self, "", None, wx.Point(self.Size[0] / 2, 0), NORTH) |
0 | 58 |
else: |
59 |
self.Input = None |
|
60 |
self.Output = None |
|
61 |
self.Action = None |
|
253 | 62 |
self.PreviousValue = None |
63 |
self.PreviousSpreading = False |
|
0 | 64 |
|
249 | 65 |
def Flush(self): |
66 |
if self.Input is not None: |
|
67 |
self.Input.Flush() |
|
68 |
self.Input = None |
|
69 |
if self.Output is not None: |
|
70 |
self.Output.Flush() |
|
71 |
self.Output = None |
|
72 |
if self.Output is not None: |
|
73 |
self.Action.Flush() |
|
74 |
self.Action = None |
|
0 | 75 |
|
478
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
76 |
def SetForced(self, forced): |
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
77 |
if self.Forced != forced: |
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
78 |
self.Forced = forced |
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
79 |
if self.Visible: |
634 | 80 |
self.Parent.ElementNeedRefresh(self) |
478
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
81 |
|
253 | 82 |
def SetValue(self, value): |
83 |
self.PreviousValue = self.Value |
|
84 |
self.Value = value |
|
85 |
if self.Value != self.PreviousValue: |
|
368 | 86 |
if self.Visible: |
634 | 87 |
self.Parent.ElementNeedRefresh(self) |
253 | 88 |
self.SpreadCurrent() |
89 |
||
90 |
def SpreadCurrent(self): |
|
91 |
if self.Parent.Debug: |
|
92 |
spreading = self.Value |
|
93 |
if spreading and not self.PreviousSpreading: |
|
263 | 94 |
if self.Output is not None: |
95 |
self.Output.SpreadCurrent(True) |
|
253 | 96 |
if self.Action is not None: |
97 |
self.Action.SpreadCurrent(True) |
|
98 |
elif not spreading and self.PreviousSpreading: |
|
263 | 99 |
if self.Output is not None: |
100 |
self.Output.SpreadCurrent(False) |
|
253 | 101 |
if self.Action is not None: |
102 |
self.Action.SpreadCurrent(False) |
|
103 |
self.PreviousSpreading = spreading |
|
104 |
||
112 | 105 |
# Make a clone of this SFC_Step |
162 | 106 |
def Clone(self, parent, id = None, name = "Step", pos = None): |
107 |
step = SFC_Step(parent, name, self.Initial, id) |
|
112 | 108 |
step.SetSize(self.Size[0], self.Size[1]) |
109 |
if pos is not None: |
|
110 |
step.SetPosition(pos.x, pos.y) |
|
283 | 111 |
else: |
112 |
step.SetPosition(self.Pos.x, self.Pos.y) |
|
144 | 113 |
if self.Input: |
114 |
step.Input = self.Input.Clone(step) |
|
115 |
if self.Output: |
|
116 |
step.Output = self.Output.Clone(step) |
|
117 |
if self.Action: |
|
118 |
step.Action = self.Action.Clone(step) |
|
112 | 119 |
return step |
120 |
||
283 | 121 |
def GetConnectorTranslation(self, element): |
122 |
connectors = {} |
|
123 |
if self.Input is not None: |
|
287 | 124 |
connectors[self.Input] = element.Input |
283 | 125 |
if self.Output is not None: |
126 |
connectors[self.Output] = element.Output |
|
127 |
if self.Action is not None: |
|
128 |
connectors[self.Action] = element.Action |
|
129 |
return connectors |
|
130 |
||
144 | 131 |
# Returns the RedrawRect |
132 |
def GetRedrawRect(self, movex = 0, movey = 0): |
|
133 |
rect = Graphic_Element.GetRedrawRect(self, movex, movey) |
|
134 |
if self.Input: |
|
135 |
rect = rect.Union(self.Input.GetRedrawRect(movex, movey)) |
|
136 |
if self.Output: |
|
137 |
rect = rect.Union(self.Output.GetRedrawRect(movex, movey)) |
|
138 |
if self.Action: |
|
139 |
rect = rect.Union(self.Action.GetRedrawRect(movex, movey)) |
|
140 |
if movex != 0 or movey != 0: |
|
141 |
if self.Input and self.Input.IsConnected(): |
|
142 |
rect = rect.Union(self.Input.GetConnectedRedrawRect(movex, movey)) |
|
143 |
if self.Output and self.Output.IsConnected(): |
|
144 |
rect = rect.Union(self.Output.GetConnectedRedrawRect(movex, movey)) |
|
145 |
if self.Action and self.Action.IsConnected(): |
|
146 |
rect = rect.Union(self.Action.GetConnectedRedrawRect(movex, movey)) |
|
147 |
return rect |
|
148 |
||
0 | 149 |
# Delete this step by calling the appropriate method |
150 |
def Delete(self): |
|
151 |
self.Parent.DeleteStep(self) |
|
152 |
||
153 |
# Unconnect input and output |
|
154 |
def Clean(self): |
|
155 |
if self.Input: |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
156 |
self.Input.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) |
0 | 157 |
if self.Output: |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
158 |
self.Output.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) |
0 | 159 |
if self.Action: |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
160 |
self.Action.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) |
0 | 161 |
|
213 | 162 |
# Refresh the size of text for name |
163 |
def RefreshNameSize(self): |
|
164 |
self.NameSize = self.Parent.GetTextExtent(self.Name) |
|
165 |
||
0 | 166 |
# Add output connector to step |
71 | 167 |
def AddInput(self): |
168 |
if not self.Input: |
|
108 | 169 |
self.Input = Connector(self, "", None, wx.Point(self.Size[0] / 2, 0), NORTH) |
71 | 170 |
self.RefreshBoundingBox() |
171 |
||
172 |
# Remove output connector from step |
|
173 |
def RemoveInput(self): |
|
174 |
if self.Input: |
|
154 | 175 |
self.Input.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) |
71 | 176 |
self.Input = None |
177 |
self.RefreshBoundingBox() |
|
178 |
||
179 |
# Add output connector to step |
|
0 | 180 |
def AddOutput(self): |
181 |
if not self.Output: |
|
145 | 182 |
self.Output = Connector(self, "", None, wx.Point(self.Size[0] / 2, self.Size[1]), SOUTH, onlyone = True) |
0 | 183 |
self.RefreshBoundingBox() |
184 |
||
185 |
# Remove output connector from step |
|
186 |
def RemoveOutput(self): |
|
187 |
if self.Output: |
|
154 | 188 |
self.Output.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) |
0 | 189 |
self.Output = None |
190 |
self.RefreshBoundingBox() |
|
191 |
||
192 |
# Add action connector to step |
|
193 |
def AddAction(self): |
|
194 |
if not self.Action: |
|
145 | 195 |
self.Action = Connector(self, "", None, wx.Point(self.Size[0], self.Size[1] / 2), EAST, onlyone = True) |
0 | 196 |
self.RefreshBoundingBox() |
197 |
||
198 |
# Remove action connector from step |
|
199 |
def RemoveAction(self): |
|
200 |
if self.Action: |
|
154 | 201 |
self.Action.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) |
0 | 202 |
self.Action = None |
203 |
self.RefreshBoundingBox() |
|
204 |
||
205 |
# Refresh the step bounding box |
|
206 |
def RefreshBoundingBox(self): |
|
207 |
# Calculate the bounding box size |
|
208 |
if self.Action: |
|
209 |
bbx_width = self.Size[0] + CONNECTOR_SIZE |
|
210 |
else: |
|
211 |
bbx_width = self.Size[0] |
|
212 |
if self.Initial: |
|
213 |
bbx_y = self.Pos.y |
|
214 |
bbx_height = self.Size[1] |
|
215 |
if self.Output: |
|
216 |
bbx_height += CONNECTOR_SIZE |
|
217 |
else: |
|
218 |
bbx_y = self.Pos.y - CONNECTOR_SIZE |
|
219 |
bbx_height = self.Size[1] + CONNECTOR_SIZE |
|
220 |
if self.Output: |
|
221 |
bbx_height += CONNECTOR_SIZE |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
222 |
#self.BoundingBox = wx.Rect(self.Pos.x, bbx_y, bbx_width + 1, bbx_height + 1) |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
223 |
self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1) |
0 | 224 |
|
225 |
# Refresh the positions of the step connectors |
|
226 |
def RefreshConnectors(self): |
|
145 | 227 |
scaling = self.Parent.GetScaling() |
228 |
horizontal_pos = self.Size[0] / 2 |
|
229 |
vertical_pos = self.Size[1] / 2 |
|
230 |
if scaling is not None: |
|
231 |
horizontal_pos = round(float(self.Pos.x + horizontal_pos) / float(scaling[0])) * scaling[0] - self.Pos.x |
|
232 |
vertical_pos = round(float(self.Pos.y + vertical_pos) / float(scaling[1])) * scaling[1] - self.Pos.y |
|
0 | 233 |
# Update input position if it exists |
234 |
if self.Input: |
|
145 | 235 |
self.Input.SetPosition(wx.Point(horizontal_pos, 0)) |
0 | 236 |
# Update output position |
237 |
if self.Output: |
|
145 | 238 |
self.Output.SetPosition(wx.Point(horizontal_pos, self.Size[1])) |
0 | 239 |
# Update action position if it exists |
240 |
if self.Action: |
|
145 | 241 |
self.Action.SetPosition(wx.Point(self.Size[0], vertical_pos)) |
0 | 242 |
self.RefreshConnected() |
243 |
||
244 |
# Refresh the position of wires connected to step |
|
245 |
def RefreshConnected(self, exclude = []): |
|
246 |
if self.Input: |
|
247 |
self.Input.MoveConnected(exclude) |
|
248 |
if self.Output: |
|
249 |
self.Output.MoveConnected(exclude) |
|
250 |
if self.Action: |
|
251 |
self.Action.MoveConnected(exclude) |
|
252 |
||
253 |
# Returns the step connector that starts with the point given if it exists |
|
27 | 254 |
def GetConnector(self, position, name = None): |
255 |
# if a name is given |
|
633
3536f4469cde
Fixing ToolTip behavior and bug with INOUT interface variables in Function Blocks and adding support for display connection point between wire and connector when mouse passing over.
laurent
parents:
566
diff
changeset
|
256 |
if name is not None: |
27 | 257 |
# Test input, output and action connector if they exists |
633
3536f4469cde
Fixing ToolTip behavior and bug with INOUT interface variables in Function Blocks and adding support for display connection point between wire and connector when mouse passing over.
laurent
parents:
566
diff
changeset
|
258 |
#if self.Input and name == self.Input.GetName(): |
3536f4469cde
Fixing ToolTip behavior and bug with INOUT interface variables in Function Blocks and adding support for display connection point between wire and connector when mouse passing over.
laurent
parents:
566
diff
changeset
|
259 |
# return self.Input |
27 | 260 |
if self.Output and name == self.Output.GetName(): |
261 |
return self.Output |
|
262 |
if self.Action and name == self.Action.GetName(): |
|
263 |
return self.Action |
|
537
a31bf722aa82
Fix wire disappearing when wire tip and connector are not exactly at the same position fixed.
laurent
parents:
478
diff
changeset
|
264 |
connectors = [] |
0 | 265 |
# Test input connector if it exists |
266 |
if self.Input: |
|
537
a31bf722aa82
Fix wire disappearing when wire tip and connector are not exactly at the same position fixed.
laurent
parents:
478
diff
changeset
|
267 |
connectors.append(self.Input) |
0 | 268 |
# Test output connector if it exists |
269 |
if self.Output: |
|
537
a31bf722aa82
Fix wire disappearing when wire tip and connector are not exactly at the same position fixed.
laurent
parents:
478
diff
changeset
|
270 |
connectors.append(self.Output) |
0 | 271 |
# Test action connector if it exists |
272 |
if self.Action: |
|
537
a31bf722aa82
Fix wire disappearing when wire tip and connector are not exactly at the same position fixed.
laurent
parents:
478
diff
changeset
|
273 |
connectors.append(self.Action) |
a31bf722aa82
Fix wire disappearing when wire tip and connector are not exactly at the same position fixed.
laurent
parents:
478
diff
changeset
|
274 |
return self.FindNearestConnector(position, connectors) |
0 | 275 |
|
383
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
276 |
# Returns action step connector |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
277 |
def GetActionConnector(self): |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
278 |
return self.Action |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
279 |
|
0 | 280 |
# Returns input and output step connectors |
281 |
def GetConnectors(self): |
|
383
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
282 |
connectors = {"inputs": [], "outputs": []} |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
283 |
if self.Input: |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
284 |
connectors["inputs"].append(self.Input) |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
285 |
if self.Output: |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
286 |
connectors["outputs"].append(self.Output) |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
287 |
return connectors |
0 | 288 |
|
289 |
# Test if point given is on step input or output connector |
|
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
290 |
def TestConnector(self, pt, direction = None, exclude=True): |
0 | 291 |
# Test input connector if it exists |
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
292 |
if self.Input and self.Input.TestPoint(pt, direction, exclude): |
0 | 293 |
return self.Input |
294 |
# Test output connector |
|
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
295 |
if self.Output and self.Output.TestPoint(pt, direction, exclude): |
0 | 296 |
return self.Output |
108 | 297 |
# Test action connector |
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
298 |
if self.Action and self.Action.TestPoint(pt, direction, exclude): |
108 | 299 |
return self.Action |
0 | 300 |
return None |
301 |
||
302 |
# Changes the step name |
|
303 |
def SetName(self, name): |
|
304 |
self.Name = name |
|
213 | 305 |
self.RefreshNameSize() |
0 | 306 |
|
307 |
# Returns the step name |
|
308 |
def GetName(self): |
|
309 |
return self.Name |
|
310 |
||
311 |
# Returns the step initial property |
|
312 |
def GetInitial(self): |
|
313 |
return self.Initial |
|
314 |
||
315 |
# Returns the connector connected to input |
|
316 |
def GetPreviousConnector(self): |
|
317 |
if self.Input: |
|
318 |
wires = self.Input.GetWires() |
|
319 |
if len(wires) == 1: |
|
145 | 320 |
return wires[0][0].GetOtherConnected(self.Input) |
0 | 321 |
return None |
322 |
||
323 |
# Returns the connector connected to output |
|
324 |
def GetNextConnector(self): |
|
325 |
if self.Output: |
|
326 |
wires = self.Output.GetWires() |
|
327 |
if len(wires) == 1: |
|
145 | 328 |
return wires[0][0].GetOtherConnected(self.Output) |
0 | 329 |
return None |
330 |
||
331 |
# Returns the connector connected to action |
|
383
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
332 |
def GetActionConnected(self): |
0 | 333 |
if self.Action: |
334 |
wires = self.Action.GetWires() |
|
335 |
if len(wires) == 1: |
|
145 | 336 |
return wires[0][0].GetOtherConnected(self.Action) |
0 | 337 |
return None |
338 |
||
339 |
# Returns the number of action line |
|
340 |
def GetActionExtraLineNumber(self): |
|
341 |
if self.Action: |
|
342 |
wires = self.Action.GetWires() |
|
343 |
if len(wires) != 1: |
|
344 |
return 0 |
|
145 | 345 |
action_block = wires[0][0].GetOtherConnected(self.Action).GetParentBlock() |
0 | 346 |
return max(0, action_block.GetLineNumber() - 1) |
347 |
return 0 |
|
348 |
||
349 |
# Returns the step minimum size |
|
350 |
def GetMinSize(self): |
|
165 | 351 |
text_width, text_height = self.Parent.GetTextExtent(self.Name) |
0 | 352 |
if self.Initial: |
353 |
return text_width + 14, text_height + 14 |
|
354 |
else: |
|
355 |
return text_width + 10, text_height + 10 |
|
356 |
||
357 |
# Updates the step size |
|
358 |
def UpdateSize(self, width, height): |
|
359 |
diffx = self.Size.GetWidth() / 2 - width / 2 |
|
360 |
diffy = height - self.Size.GetHeight() |
|
361 |
self.Move(diffx, 0) |
|
362 |
Graphic_Element.SetSize(self, width, height) |
|
108 | 363 |
if self.Parent.GetDrawingMode() == FREEDRAWING_MODE: |
364 |
self.RefreshConnected() |
|
365 |
else: |
|
366 |
self.RefreshOutputPosition((0, diffy)) |
|
0 | 367 |
|
368 |
# Align input element with this step |
|
369 |
def RefreshInputPosition(self): |
|
370 |
if self.Input: |
|
371 |
current_pos = self.Input.GetPosition(False) |
|
372 |
input = self.GetPreviousConnector() |
|
373 |
if input: |
|
374 |
input_pos = input.GetPosition(False) |
|
375 |
diffx = current_pos.x - input_pos.x |
|
376 |
input_block = input.GetParentBlock() |
|
377 |
if isinstance(input_block, SFC_Divergence): |
|
378 |
input_block.MoveConnector(input, diffx) |
|
379 |
else: |
|
380 |
if isinstance(input_block, SFC_Step): |
|
381 |
input_block.MoveActionBlock((diffx, 0)) |
|
382 |
input_block.Move(diffx, 0) |
|
383 |
input_block.RefreshInputPosition() |
|
384 |
||
385 |
# Align output element with this step |
|
386 |
def RefreshOutputPosition(self, move = None): |
|
387 |
if self.Output: |
|
388 |
wires = self.Output.GetWires() |
|
389 |
if len(wires) != 1: |
|
390 |
return |
|
391 |
current_pos = self.Output.GetPosition(False) |
|
145 | 392 |
output = wires[0][0].GetOtherConnected(self.Output) |
0 | 393 |
output_pos = output.GetPosition(False) |
394 |
diffx = current_pos.x - output_pos.x |
|
395 |
output_block = output.GetParentBlock() |
|
396 |
wire_size = SFC_WIRE_MIN_SIZE + self.GetActionExtraLineNumber() * SFC_ACTION_MIN_SIZE[1] |
|
397 |
diffy = wire_size - output_pos.y + current_pos.y |
|
398 |
if diffy != 0: |
|
399 |
if isinstance(output_block, SFC_Step): |
|
400 |
output_block.MoveActionBlock((diffx, diffy)) |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
401 |
wires[0][0].SetPoints([wx.Point(current_pos.x, current_pos.y + wire_size), |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
402 |
wx.Point(current_pos.x, current_pos.y)]) |
0 | 403 |
if not isinstance(output_block, SFC_Divergence) or output_block.GetConnectors()["inputs"].index(output) == 0: |
404 |
output_block.Move(diffx, diffy, self.Parent.Wires) |
|
405 |
output_block.RefreshOutputPosition((diffx, diffy)) |
|
406 |
else: |
|
407 |
output_block.RefreshPosition() |
|
408 |
elif move: |
|
409 |
if isinstance(output_block, SFC_Step): |
|
410 |
output_block.MoveActionBlock(move) |
|
411 |
wires[0][0].Move(move[0], move[1], True) |
|
412 |
if not isinstance(output_block, SFC_Divergence) or output_block.GetConnectors()["inputs"].index(output) == 0: |
|
413 |
output_block.Move(move[0], move[1], self.Parent.Wires) |
|
414 |
output_block.RefreshOutputPosition(move) |
|
415 |
else: |
|
416 |
output_block.RefreshPosition() |
|
417 |
elif isinstance(output_block, SFC_Divergence): |
|
418 |
output_block.MoveConnector(output, diffx) |
|
419 |
else: |
|
420 |
if isinstance(output_block, SFC_Step): |
|
421 |
output_block.MoveActionBlock((diffx, 0)) |
|
422 |
output_block.Move(diffx, 0) |
|
423 |
output_block.RefreshOutputPosition() |
|
424 |
||
425 |
# Refresh action element with this step |
|
426 |
def MoveActionBlock(self, move): |
|
427 |
if self.Action: |
|
428 |
wires = self.Action.GetWires() |
|
429 |
if len(wires) != 1: |
|
430 |
return |
|
145 | 431 |
action_block = wires[0][0].GetOtherConnected(self.Action).GetParentBlock() |
0 | 432 |
action_block.Move(move[0], move[1], self.Parent.Wires) |
433 |
wires[0][0].Move(move[0], move[1], True) |
|
434 |
||
435 |
# Resize the divergence from position and size given |
|
436 |
def Resize(self, x, y, width, height): |
|
27 | 437 |
if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: |
438 |
self.UpdateSize(width, height) |
|
439 |
else: |
|
440 |
Graphic_Element.Resize(self, x, y, width, height) |
|
0 | 441 |
|
442 |
# Method called when a LeftDClick event have been generated |
|
42 | 443 |
def OnLeftDClick(self, event, dc, scaling): |
0 | 444 |
# Edit the step properties |
445 |
self.Parent.EditStepContent(self) |
|
446 |
||
447 |
# Method called when a RightUp event have been generated |
|
27 | 448 |
def OnRightUp(self, event, dc, scaling): |
0 | 449 |
# Popup the menu with special items for a step |
450 |
self.Parent.PopupDefaultMenu() |
|
451 |
||
452 |
# Refreshes the step state according to move defined and handle selected |
|
327
7fd5233ce5ce
Adding support for contraining move to only one direction when control down
lbessard
parents:
320
diff
changeset
|
453 |
def ProcessDragging(self, movex, movey, event, scaling): |
0 | 454 |
handle_type, handle = self.Handle |
455 |
if handle_type == HANDLE_MOVE: |
|
138
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
456 |
movex = max(-self.BoundingBox.x, movex) |
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
457 |
movey = max(-self.BoundingBox.y, movey) |
145 | 458 |
if scaling is not None: |
459 |
movex = round(float(self.Pos.x + movex) / float(scaling[0])) * scaling[0] - self.Pos.x |
|
460 |
movey = round(float(self.Pos.y + movey) / float(scaling[1])) * scaling[1] - self.Pos.y |
|
0 | 461 |
action_block = None |
27 | 462 |
if self.Parent.GetDrawingMode() == FREEDRAWING_MODE: |
463 |
self.Move(movex, movey) |
|
464 |
self.RefreshConnected() |
|
138
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
465 |
return movex, movey |
27 | 466 |
elif self.Initial: |
0 | 467 |
self.MoveActionBlock((movex, movey)) |
468 |
self.Move(movex, movey, self.Parent.Wires) |
|
469 |
self.RefreshOutputPosition((movex, movey)) |
|
138
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
470 |
return movex, movey |
0 | 471 |
else: |
472 |
self.MoveActionBlock((movex, 0)) |
|
473 |
self.Move(movex, 0) |
|
474 |
self.RefreshInputPosition() |
|
475 |
self.RefreshOutputPosition() |
|
138
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
476 |
return movex, 0 |
110
29b6b70e1721
Bug that makes element resizing acting strongly fixed
lbessard
parents:
108
diff
changeset
|
477 |
else: |
327
7fd5233ce5ce
Adding support for contraining move to only one direction when control down
lbessard
parents:
320
diff
changeset
|
478 |
return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling) |
0 | 479 |
|
480 |
# Refresh input element model |
|
481 |
def RefreshInputModel(self): |
|
482 |
if self.Input: |
|
483 |
input = self.GetPreviousConnector() |
|
484 |
if input: |
|
485 |
input_block = input.GetParentBlock() |
|
486 |
input_block.RefreshModel(False) |
|
487 |
if not isinstance(input_block, SFC_Divergence): |
|
488 |
input_block.RefreshInputModel() |
|
489 |
||
490 |
# Refresh output element model |
|
491 |
def RefreshOutputModel(self, move=False): |
|
492 |
if self.Output: |
|
493 |
output = self.GetNextConnector() |
|
494 |
if output: |
|
495 |
output_block = output.GetParentBlock() |
|
496 |
output_block.RefreshModel(False) |
|
497 |
if not isinstance(output_block, SFC_Divergence) or move: |
|
498 |
output_block.RefreshOutputModel(move) |
|
499 |
||
500 |
# Refreshes the step model |
|
501 |
def RefreshModel(self, move=True): |
|
502 |
self.Parent.RefreshStepModel(self) |
|
503 |
if self.Action: |
|
383
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
504 |
action = self.GetActionConnected() |
0 | 505 |
if action: |
506 |
action_block = action.GetParentBlock() |
|
507 |
action_block.RefreshModel(False) |
|
508 |
# If step has moved, refresh the model of wires connected to output |
|
509 |
if move: |
|
27 | 510 |
if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: |
511 |
self.RefreshInputModel() |
|
512 |
self.RefreshOutputModel(self.Initial) |
|
513 |
elif self.Output: |
|
514 |
self.Output.RefreshWires() |
|
0 | 515 |
|
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
516 |
# Adds an highlight to the connection |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
517 |
def AddHighlight(self, infos, start, end, highlight_type): |
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
518 |
if infos[0] == "name" and start[0] == 0 and end[0] == 0: |
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
519 |
AddHighlight(self.Highlights, (start, end, highlight_type)) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
520 |
|
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
521 |
# Removes an highlight from the connection |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
522 |
def RemoveHighlight(self, infos, start, end, highlight_type): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
523 |
if infos[0] == "name": |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
524 |
RemoveHighlight(self.Highlights, (start, end, highlight_type)) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
525 |
|
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
526 |
# Removes all the highlights of one particular type from the connection |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
527 |
def ClearHighlight(self, highlight_type=None): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
528 |
ClearHighlights(self.Highlights, highlight_type) |
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
529 |
|
0 | 530 |
# Draws step |
531 |
def Draw(self, dc): |
|
144 | 532 |
Graphic_Element.Draw(self, dc) |
253 | 533 |
if self.Value: |
478
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
534 |
if self.Forced: |
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
535 |
dc.SetPen(MiterPen(wx.CYAN)) |
478
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
536 |
else: |
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
537 |
dc.SetPen(MiterPen(wx.GREEN)) |
478
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
538 |
elif self.Forced: |
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
539 |
dc.SetPen(MiterPen(wx.BLUE)) |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
540 |
else: |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
541 |
dc.SetPen(MiterPen(wx.BLACK)) |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
542 |
dc.SetBrush(wx.WHITE_BRUSH) |
213 | 543 |
|
544 |
if getattr(dc, "printing", False): |
|
545 |
name_size = dc.GetTextExtent(self.Name) |
|
546 |
else: |
|
547 |
name_size = self.NameSize |
|
548 |
||
0 | 549 |
# Draw two rectangles for representing the step |
550 |
dc.DrawRectangle(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1) |
|
551 |
if self.Initial: |
|
552 |
dc.DrawRectangle(self.Pos.x + 2, self.Pos.y + 2, self.Size[0] - 3, self.Size[1] - 3) |
|
553 |
# Draw step name |
|
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
554 |
name_pos = (self.Pos.x + (self.Size[0] - name_size[0]) / 2, |
213 | 555 |
self.Pos.y + (self.Size[1] - name_size[1]) / 2) |
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
556 |
dc.DrawText(self.Name, name_pos[0], name_pos[1]) |
0 | 557 |
# Draw input and output connectors |
558 |
if self.Input: |
|
559 |
self.Input.Draw(dc) |
|
560 |
if self.Output: |
|
561 |
self.Output.Draw(dc) |
|
562 |
if self.Action: |
|
563 |
self.Action.Draw(dc) |
|
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
564 |
|
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
565 |
if not getattr(dc, "printing", False): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
566 |
DrawHighlightedText(dc, self.Name, self.Highlights, name_pos[0], name_pos[1]) |
140
06d28f03f6f4
Adding highlighting on group or element when mouse is over
lbessard
parents:
138
diff
changeset
|
567 |
|
0 | 568 |
|
569 |
#------------------------------------------------------------------------------- |
|
570 |
# Sequencial Function Chart Transition |
|
571 |
#------------------------------------------------------------------------------- |
|
572 |
||
573 |
""" |
|
574 |
Class that implements the graphic representation of a transition |
|
575 |
""" |
|
576 |
||
361
62570186dad4
Adding support for synchronize refreshing with tick and limit it to a defined period
greg
parents:
327
diff
changeset
|
577 |
class SFC_Transition(Graphic_Element, DebugDataConsumer): |
0 | 578 |
|
579 |
# Create a new transition |
|
80 | 580 |
def __init__(self, parent, type = "reference", condition = None, priority = 0, id = None): |
0 | 581 |
Graphic_Element.__init__(self, parent) |
361
62570186dad4
Adding support for synchronize refreshing with tick and limit it to a defined period
greg
parents:
327
diff
changeset
|
582 |
DebugDataConsumer.__init__(self) |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
583 |
self.Type = None |
0 | 584 |
self.Id = id |
80 | 585 |
self.Priority = 0 |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
586 |
self.Size = wx.Size(SFC_TRANSITION_SIZE[0], SFC_TRANSITION_SIZE[1]) |
0 | 587 |
# Create an input and output connector |
145 | 588 |
self.Input = Connector(self, "", None, wx.Point(self.Size[0] / 2, 0), NORTH, onlyone = True) |
589 |
self.Output = Connector(self, "", None, wx.Point(self.Size[0] / 2, self.Size[1]), SOUTH, onlyone = True) |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
590 |
self.SetType(type, condition) |
80 | 591 |
self.SetPriority(priority) |
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
592 |
self.Highlights = {} |
253 | 593 |
self.PreviousValue = None |
594 |
self.PreviousSpreading = False |
|
0 | 595 |
|
249 | 596 |
def Flush(self): |
597 |
if self.Input is not None: |
|
598 |
self.Input.Flush() |
|
599 |
self.Input = None |
|
600 |
if self.Output is not None: |
|
601 |
self.Output.Flush() |
|
602 |
self.Output = None |
|
603 |
if self.Type == "connection" and self.Condition is not None: |
|
604 |
self.Condition.Flush() |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
605 |
self.Condition = None |
0 | 606 |
|
478
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
607 |
def SetForced(self, forced): |
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
608 |
if self.Forced != forced: |
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
609 |
self.Forced = forced |
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
610 |
if self.Visible: |
634 | 611 |
self.Parent.ElementNeedRefresh(self) |
478
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
612 |
|
253 | 613 |
def SetValue(self, value): |
614 |
self.PreviousValue = self.Value |
|
615 |
self.Value = value |
|
616 |
if self.Value != self.PreviousValue: |
|
368 | 617 |
if self.Visible: |
634 | 618 |
self.Parent.ElementNeedRefresh(self) |
253 | 619 |
self.SpreadCurrent() |
620 |
||
621 |
def SpreadCurrent(self): |
|
622 |
if self.Parent.Debug: |
|
623 |
if self.Value is None: |
|
624 |
self.Value = False |
|
625 |
spreading = self.Input.ReceivingCurrent() & self.Value |
|
626 |
if spreading and not self.PreviousSpreading: |
|
627 |
self.Output.SpreadCurrent(True) |
|
628 |
elif not spreading and self.PreviousSpreading: |
|
629 |
self.Output.SpreadCurrent(False) |
|
630 |
self.PreviousSpreading = spreading |
|
631 |
||
112 | 632 |
# Make a clone of this SFC_Transition |
162 | 633 |
def Clone(self, parent, id = None, pos = None): |
634 |
transition = SFC_Transition(parent, self.Type, self.Condition, self.Priority, id) |
|
112 | 635 |
transition.SetSize(self.Size[0], self.Size[1]) |
636 |
if pos is not None: |
|
637 |
transition.SetPosition(pos.x, pos.y) |
|
283 | 638 |
else: |
639 |
transition.SetPosition(self.Pos.x, self.Pos.y) |
|
112 | 640 |
transition.Input = self.Input.Clone(transition) |
641 |
transition.Output = self.Output.Clone(transition) |
|
172 | 642 |
if self.Type == "connection": |
643 |
transition.Condition = self.Condition.Clone(transition) |
|
112 | 644 |
return transition |
645 |
||
283 | 646 |
def GetConnectorTranslation(self, element): |
647 |
connectors = {self.Input : element.Input, self.Output : element.Output} |
|
648 |
if self.Type == "connection" and self.Condition is not None: |
|
649 |
connectors[self.Condition] = element.Condition |
|
650 |
return connectors |
|
651 |
||
144 | 652 |
# Returns the RedrawRect |
653 |
def GetRedrawRect(self, movex = 0, movey = 0): |
|
654 |
rect = Graphic_Element.GetRedrawRect(self, movex, movey) |
|
655 |
rect = rect.Union(self.Input.GetRedrawRect(movex, movey)) |
|
656 |
rect = rect.Union(self.Output.GetRedrawRect(movex, movey)) |
|
657 |
if movex != 0 or movey != 0: |
|
658 |
if self.Input.IsConnected(): |
|
659 |
rect = rect.Union(self.Input.GetConnectedRedrawRect(movex, movey)) |
|
660 |
if self.Output.IsConnected(): |
|
661 |
rect = rect.Union(self.Output.GetConnectedRedrawRect(movex, movey)) |
|
175 | 662 |
if self.Type == "connection" and self.Condition.IsConnected(): |
172 | 663 |
rect = rect.Union(self.Condition.GetConnectedRedrawRect(movex, movey)) |
144 | 664 |
return rect |
665 |
||
0 | 666 |
# Forbids to change the transition size |
667 |
def SetSize(self, width, height): |
|
27 | 668 |
if self.Parent.GetDrawingMode() == FREEDRAWING_MODE: |
669 |
Graphic_Element.SetSize(self, width, height) |
|
0 | 670 |
|
671 |
# Forbids to resize the transition |
|
672 |
def Resize(self, x, y, width, height): |
|
27 | 673 |
if self.Parent.GetDrawingMode() == FREEDRAWING_MODE: |
674 |
Graphic_Element.Resize(self, x, y, width, height) |
|
0 | 675 |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
676 |
# Refresh the size of text for name |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
677 |
def RefreshConditionSize(self): |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
678 |
if self.Type != "connection": |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
679 |
if self.Condition != "": |
165 | 680 |
self.ConditionSize = self.Parent.GetTextExtent(self.Condition) |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
681 |
else: |
165 | 682 |
self.ConditionSize = self.Parent.GetTextExtent("Transition") |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
683 |
|
80 | 684 |
# Refresh the size of text for name |
685 |
def RefreshPrioritySize(self): |
|
686 |
if self.Priority != "": |
|
165 | 687 |
self.PrioritySize = self.Parent.GetTextExtent(str(self.Priority)) |
80 | 688 |
else: |
689 |
self.PrioritySize = None |
|
690 |
||
0 | 691 |
# Delete this transition by calling the appropriate method |
692 |
def Delete(self): |
|
693 |
self.Parent.DeleteTransition(self) |
|
694 |
||
695 |
# Unconnect input and output |
|
696 |
def Clean(self): |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
697 |
self.Input.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
698 |
self.Output.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
699 |
if self.Type == "connection": |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
700 |
self.Condition.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) |
0 | 701 |
|
702 |
# Refresh the transition bounding box |
|
703 |
def RefreshBoundingBox(self): |
|
80 | 704 |
bbx_x, bbx_y, bbx_width, bbx_height = self.Pos.x, self.Pos.y, self.Size[0], self.Size[1] |
705 |
if self.Priority != 0: |
|
706 |
bbx_y = self.Pos.y - self.PrioritySize[1] - 2 |
|
707 |
bbx_width = max(self.Size[0], self.PrioritySize[0]) |
|
708 |
bbx_height = self.Size[1] + self.PrioritySize[1] + 2 |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
709 |
if self.Type == "connection": |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
710 |
bbx_x = self.Pos.x - CONNECTOR_SIZE |
80 | 711 |
bbx_width = bbx_width + CONNECTOR_SIZE |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
712 |
else: |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
713 |
text_width, text_height = self.ConditionSize |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
714 |
# Calculate the bounding box size |
80 | 715 |
bbx_width = max(bbx_width, self.Size[0] + 5 + text_width) |
716 |
bbx_y = min(bbx_y, self.Pos.y - max(0, (text_height - self.Size[1]) / 2)) |
|
717 |
bbx_height = max(bbx_height, self.Pos.y - bbx_y + (self.Size[1] + text_height) / 2) |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
718 |
self.BoundingBox = wx.Rect(bbx_x, bbx_y, bbx_width + 1, bbx_height + 1) |
0 | 719 |
|
720 |
# Returns the connector connected to input |
|
721 |
def GetPreviousConnector(self): |
|
722 |
wires = self.Input.GetWires() |
|
723 |
if len(wires) == 1: |
|
145 | 724 |
return wires[0][0].GetOtherConnected(self.Input) |
0 | 725 |
return None |
726 |
||
727 |
# Returns the connector connected to output |
|
728 |
def GetNextConnector(self): |
|
729 |
wires = self.Output.GetWires() |
|
730 |
if len(wires) == 1: |
|
145 | 731 |
return wires[0][0].GetOtherConnected(self.Output) |
0 | 732 |
return None |
733 |
||
734 |
# Refresh the positions of the transition connectors |
|
735 |
def RefreshConnectors(self): |
|
145 | 736 |
scaling = self.Parent.GetScaling() |
737 |
horizontal_pos = self.Size[0] / 2 |
|
738 |
vertical_pos = self.Size[1] / 2 |
|
739 |
if scaling is not None: |
|
740 |
horizontal_pos = round(float(self.Pos.x + horizontal_pos) / float(scaling[0])) * scaling[0] - self.Pos.x |
|
741 |
vertical_pos = round(float(self.Pos.y + vertical_pos) / float(scaling[1])) * scaling[1] - self.Pos.y |
|
0 | 742 |
# Update input position |
145 | 743 |
self.Input.SetPosition(wx.Point(horizontal_pos, 0)) |
0 | 744 |
# Update output position |
145 | 745 |
self.Output.SetPosition(wx.Point(horizontal_pos, self.Size[1])) |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
746 |
if self.Type == "connection": |
145 | 747 |
self.Condition.SetPosition(wx.Point(0, vertical_pos)) |
0 | 748 |
self.RefreshConnected() |
749 |
||
750 |
# Refresh the position of the wires connected to transition |
|
751 |
def RefreshConnected(self, exclude = []): |
|
752 |
self.Input.MoveConnected(exclude) |
|
753 |
self.Output.MoveConnected(exclude) |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
754 |
if self.Type == "connection": |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
755 |
self.Condition.MoveConnected(exclude) |
0 | 756 |
|
757 |
# Returns the transition connector that starts with the point given if it exists |
|
27 | 758 |
def GetConnector(self, position, name = None): |
759 |
# if a name is given |
|
633
3536f4469cde
Fixing ToolTip behavior and bug with INOUT interface variables in Function Blocks and adding support for display connection point between wire and connector when mouse passing over.
laurent
parents:
566
diff
changeset
|
760 |
if name is not None: |
27 | 761 |
# Test input and output connector |
633
3536f4469cde
Fixing ToolTip behavior and bug with INOUT interface variables in Function Blocks and adding support for display connection point between wire and connector when mouse passing over.
laurent
parents:
566
diff
changeset
|
762 |
#if name == self.Input.GetName(): |
3536f4469cde
Fixing ToolTip behavior and bug with INOUT interface variables in Function Blocks and adding support for display connection point between wire and connector when mouse passing over.
laurent
parents:
566
diff
changeset
|
763 |
# return self.Input |
27 | 764 |
if name == self.Output.GetName(): |
765 |
return self.Output |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
766 |
if self.Type == "connection" and name == self.Condition.GetName(): |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
767 |
return self.Condition |
537
a31bf722aa82
Fix wire disappearing when wire tip and connector are not exactly at the same position fixed.
laurent
parents:
478
diff
changeset
|
768 |
connectors = [self.Input, self.Output] |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
769 |
if self.Type == "connection": |
553 | 770 |
connectors.append(self.Condition) |
537
a31bf722aa82
Fix wire disappearing when wire tip and connector are not exactly at the same position fixed.
laurent
parents:
478
diff
changeset
|
771 |
return self.FindNearestConnector(position, connectors) |
0 | 772 |
|
383
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
773 |
# Returns the transition condition connector |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
774 |
def GetConditionConnector(self): |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
775 |
if self.Type == "connection": |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
776 |
return self.Condition |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
777 |
return None |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
778 |
|
0 | 779 |
# Returns input and output transition connectors |
780 |
def GetConnectors(self): |
|
383
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
781 |
return {"inputs": [self.Input], "outputs": [self.Output]} |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
782 |
|
0 | 783 |
# Test if point given is on transition input or output connector |
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
784 |
def TestConnector(self, pt, direction = None, exclude=True): |
0 | 785 |
# Test input connector |
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
786 |
if self.Input.TestPoint(pt, direction, exclude): |
0 | 787 |
return self.Input |
788 |
# Test output connector |
|
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
789 |
if self.Output.TestPoint(pt, direction, exclude): |
0 | 790 |
return self.Output |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
791 |
# Test condition connector |
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
792 |
if self.Type == "connection" and self.Condition.TestPoint(pt, direction, exclude): |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
793 |
return self.Condition |
0 | 794 |
return None |
795 |
||
796 |
# Changes the transition type |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
797 |
def SetType(self, type, condition = None): |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
798 |
if self.Type != type: |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
799 |
if self.Type == "connection": |
154 | 800 |
self.Condition.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
801 |
self.Type = type |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
802 |
if type == "connection": |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
803 |
self.Condition = Connector(self, "", "BOOL", wx.Point(0, self.Size[1] / 2), WEST) |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
804 |
else: |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
805 |
if condition == None: |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
806 |
condition = "" |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
807 |
self.Condition = condition |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
808 |
self.RefreshConditionSize() |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
809 |
elif self.Type != "connection": |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
810 |
if condition == None: |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
811 |
condition = "" |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
812 |
self.Condition = condition |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
813 |
self.RefreshConditionSize() |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
814 |
self.RefreshBoundingBox() |
0 | 815 |
|
816 |
# Returns the transition type |
|
817 |
def GetType(self): |
|
818 |
return self.Type |
|
819 |
||
80 | 820 |
# Changes the transition priority |
821 |
def SetPriority(self, priority): |
|
822 |
self.Priority = priority |
|
823 |
self.RefreshPrioritySize() |
|
824 |
self.RefreshBoundingBox() |
|
825 |
||
826 |
# Returns the transition type |
|
827 |
def GetPriority(self): |
|
828 |
return self.Priority |
|
829 |
||
0 | 830 |
# Returns the transition condition |
831 |
def GetCondition(self): |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
832 |
if self.Type != "connection": |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
833 |
return self.Condition |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
834 |
return None |
0 | 835 |
|
836 |
# Returns the transition minimum size |
|
837 |
def GetMinSize(self): |
|
838 |
return SFC_TRANSITION_SIZE |
|
839 |
||
840 |
# Align input element with this step |
|
841 |
def RefreshInputPosition(self): |
|
842 |
wires = self.Input.GetWires() |
|
843 |
current_pos = self.Input.GetPosition(False) |
|
844 |
input = self.GetPreviousConnector() |
|
845 |
if input: |
|
846 |
input_pos = input.GetPosition(False) |
|
847 |
diffx = current_pos.x - input_pos.x |
|
848 |
input_block = input.GetParentBlock() |
|
849 |
if isinstance(input_block, SFC_Divergence): |
|
850 |
input_block.MoveConnector(input, diffx) |
|
851 |
else: |
|
852 |
if isinstance(input_block, SFC_Step): |
|
853 |
input_block.MoveActionBlock((diffx, 0)) |
|
854 |
input_block.Move(diffx, 0) |
|
855 |
input_block.RefreshInputPosition() |
|
856 |
||
857 |
# Align output element with this step |
|
858 |
def RefreshOutputPosition(self, move = None): |
|
859 |
wires = self.Output.GetWires() |
|
860 |
if len(wires) != 1: |
|
861 |
return |
|
862 |
current_pos = self.Output.GetPosition(False) |
|
145 | 863 |
output = wires[0][0].GetOtherConnected(self.Output) |
0 | 864 |
output_pos = output.GetPosition(False) |
865 |
diffx = current_pos.x - output_pos.x |
|
866 |
output_block = output.GetParentBlock() |
|
867 |
if move: |
|
868 |
if isinstance(output_block, SFC_Step): |
|
869 |
output_block.MoveActionBlock(move) |
|
870 |
wires[0][0].Move(move[0], move[1], True) |
|
871 |
if not isinstance(output_block, SFC_Divergence) or output_block.GetConnectors()["inputs"].index(output) == 0: |
|
872 |
output_block.Move(move[0], move[1], self.Parent.Wires) |
|
873 |
output_block.RefreshOutputPosition(move) |
|
874 |
else: |
|
875 |
output_block.RefreshPosition() |
|
876 |
elif isinstance(output_block, SFC_Divergence): |
|
877 |
output_block.MoveConnector(output, diffx) |
|
878 |
else: |
|
879 |
if isinstance(output_block, SFC_Step): |
|
880 |
output_block.MoveActionBlock((diffx, 0)) |
|
881 |
output_block.Move(diffx, 0) |
|
882 |
output_block.RefreshOutputPosition() |
|
27 | 883 |
|
0 | 884 |
# Method called when a LeftDClick event have been generated |
27 | 885 |
def OnLeftDClick(self, event, dc, scaling): |
0 | 886 |
# Edit the transition properties |
887 |
self.Parent.EditTransitionContent(self) |
|
888 |
||
889 |
# Method called when a RightUp event have been generated |
|
27 | 890 |
def OnRightUp(self, event, dc, scaling): |
0 | 891 |
# Popup the menu with special items for a step |
892 |
self.Parent.PopupDefaultMenu() |
|
893 |
||
894 |
# Refreshes the transition state according to move defined and handle selected |
|
327
7fd5233ce5ce
Adding support for contraining move to only one direction when control down
lbessard
parents:
320
diff
changeset
|
895 |
def ProcessDragging(self, movex, movey, event, scaling): |
27 | 896 |
if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: |
138
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
897 |
movex = max(-self.BoundingBox.x, movex) |
145 | 898 |
if scaling is not None: |
899 |
movex = round(float(self.Pos.x + movex) / float(scaling[0])) * scaling[0] - self.Pos.x |
|
27 | 900 |
self.Move(movex, 0) |
901 |
self.RefreshInputPosition() |
|
902 |
self.RefreshOutputPosition() |
|
138
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
903 |
return movex, 0 |
110
29b6b70e1721
Bug that makes element resizing acting strongly fixed
lbessard
parents:
108
diff
changeset
|
904 |
else: |
327
7fd5233ce5ce
Adding support for contraining move to only one direction when control down
lbessard
parents:
320
diff
changeset
|
905 |
return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling, width_fac = 2, height_fac = 2) |
0 | 906 |
|
907 |
# Refresh input element model |
|
908 |
def RefreshInputModel(self): |
|
27 | 909 |
if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: |
910 |
input = self.GetPreviousConnector() |
|
911 |
if input: |
|
912 |
input_block = input.GetParentBlock() |
|
913 |
input_block.RefreshModel(False) |
|
914 |
if not isinstance(input_block, SFC_Divergence): |
|
915 |
input_block.RefreshInputModel() |
|
0 | 916 |
|
917 |
# Refresh output element model |
|
918 |
def RefreshOutputModel(self, move=False): |
|
919 |
output = self.GetNextConnector() |
|
920 |
if output: |
|
921 |
output_block = output.GetParentBlock() |
|
922 |
output_block.RefreshModel(False) |
|
923 |
if not isinstance(output_block, SFC_Divergence) or move: |
|
924 |
output_block.RefreshOutputModel(move) |
|
925 |
||
926 |
# Refreshes the transition model |
|
927 |
def RefreshModel(self, move=True): |
|
928 |
self.Parent.RefreshTransitionModel(self) |
|
929 |
# If transition has moved, refresh the model of wires connected to output |
|
930 |
if move: |
|
27 | 931 |
if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: |
932 |
self.RefreshInputModel() |
|
933 |
self.RefreshOutputModel() |
|
934 |
else: |
|
935 |
self.Output.RefreshWires() |
|
0 | 936 |
|
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
937 |
# Adds an highlight to the block |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
938 |
def AddHighlight(self, infos, start, end ,highlight_type): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
939 |
if infos[0] in ["reference", "inline", "priority"] and start[0] == 0 and end[0] == 0: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
940 |
highlights = self.Highlights.setdefault(infos[0], []) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
941 |
AddHighlight(highlights, (start, end, highlight_type)) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
942 |
|
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
943 |
# Removes an highlight from the block |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
944 |
def RemoveHighlight(self, infos, start, end, highlight_type): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
945 |
if infos[0] in ["reference", "inline", "priority"]: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
946 |
highlights = self.Highlights.get(infos[0], []) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
947 |
if RemoveHighlight(highlights, (start, end, highlight_type)) and len(highlights) == 0: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
948 |
self.Highlights.pop(infos[0]) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
949 |
|
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
950 |
# Removes all the highlights of one particular type from the block |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
951 |
def ClearHighlight(self, highlight_type=None): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
952 |
if highlight_type is None: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
953 |
self.Highlights = {} |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
954 |
else: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
955 |
highlight_items = self.Highlights.items() |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
956 |
for name, highlights in highlight_items: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
957 |
highlights = ClearHighlights(highlight, highlight_type) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
958 |
if len(highlights) == 0: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
959 |
self.Highlights.pop(name) |
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
960 |
|
0 | 961 |
# Draws transition |
962 |
def Draw(self, dc): |
|
144 | 963 |
Graphic_Element.Draw(self, dc) |
253 | 964 |
if self.Value: |
478
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
965 |
if self.Forced: |
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
966 |
dc.SetPen(MiterPen(wx.CYAN)) |
478
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
967 |
dc.SetBrush(wx.CYAN_BRUSH) |
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
968 |
else: |
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
969 |
dc.SetPen(MiterPen(wx.GREEN)) |
478
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
970 |
dc.SetBrush(wx.GREEN_BRUSH) |
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
971 |
elif self.Forced: |
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
972 |
dc.SetPen(MiterPen(wx.BLUE)) |
478
dc403c47af54
Adding colour to graphic element that showing forced values
laurent
parents:
383
diff
changeset
|
973 |
dc.SetBrush(wx.BLUE_BRUSH) |
253 | 974 |
else: |
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
975 |
dc.SetPen(MiterPen(wx.BLACK)) |
253 | 976 |
dc.SetBrush(wx.BLACK_BRUSH) |
213 | 977 |
|
978 |
if getattr(dc, "printing", False): |
|
979 |
if self.Type != "connection": |
|
980 |
condition_size = dc.GetTextExtent(self.Condition) |
|
981 |
if self.Priority != 0: |
|
982 |
priority_size = dc.GetTextExtent(str(self.Priority)) |
|
983 |
else: |
|
984 |
if self.Type != "connection": |
|
985 |
condition_size = self.ConditionSize |
|
986 |
if self.Priority != 0: |
|
987 |
priority_size = self.PrioritySize |
|
988 |
||
0 | 989 |
# Draw plain rectangle for representing the transition |
175 | 990 |
dc.DrawRectangle(self.Pos.x, |
991 |
self.Pos.y + (self.Size[1] - SFC_TRANSITION_SIZE[1])/2, |
|
992 |
self.Size[0] + 1, |
|
993 |
SFC_TRANSITION_SIZE[1] + 1) |
|
994 |
vertical_line_x = self.Input.GetPosition()[0] |
|
199 | 995 |
dc.DrawLine(vertical_line_x, self.Pos.y, vertical_line_x, self.Pos.y + self.Size[1] + 1) |
0 | 996 |
# Draw transition condition |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
997 |
if self.Type != "connection": |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
998 |
if self.Condition != "": |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
999 |
condition = self.Condition |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1000 |
else: |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1001 |
condition = "Transition" |
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1002 |
condition_pos = (self.Pos.x + self.Size[0] + 5, |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1003 |
self.Pos.y + (self.Size[1] - condition_size[1]) / 2) |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1004 |
dc.DrawText(condition, condition_pos[0], condition_pos[1]) |
80 | 1005 |
# Draw priority number |
1006 |
if self.Priority != 0: |
|
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1007 |
priority_pos = (self.Pos.x, self.Pos.y - priority_size[1] - 2) |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1008 |
dc.DrawText(str(self.Priority), priority_pos[0], priority_pos[1]) |
0 | 1009 |
# Draw input and output connectors |
1010 |
self.Input.Draw(dc) |
|
1011 |
self.Output.Draw(dc) |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1012 |
if self.Type == "connection": |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1013 |
self.Condition.Draw(dc) |
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1014 |
|
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1015 |
if not getattr(dc, "printing", False): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1016 |
for name, highlights in self.Highlights.iteritems(): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1017 |
if name == "priority": |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1018 |
DrawHighlightedText(dc, str(self.Priority), highlights, priority_pos[0], priority_pos[1]) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1019 |
else: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1020 |
DrawHighlightedText(dc, condition, highlights, condition_pos[0], condition_pos[1]) |
0 | 1021 |
|
1022 |
#------------------------------------------------------------------------------- |
|
1023 |
# Sequencial Function Chart Divergence and Convergence |
|
1024 |
#------------------------------------------------------------------------------- |
|
1025 |
||
1026 |
""" |
|
1027 |
Class that implements the graphic representation of a divergence or convergence, |
|
1028 |
selection or simultaneous |
|
1029 |
""" |
|
1030 |
||
1031 |
class SFC_Divergence(Graphic_Element): |
|
1032 |
||
1033 |
# Create a new divergence |
|
1034 |
def __init__(self, parent, type, number = 2, id = None): |
|
1035 |
Graphic_Element.__init__(self, parent) |
|
1036 |
self.Type = type |
|
1037 |
self.Id = id |
|
1038 |
self.RealConnectors = None |
|
1039 |
number = max(2, number) |
|
175 | 1040 |
self.Size = wx.Size((number - 1) * SFC_DEFAULT_SEQUENCE_INTERVAL, self.GetMinSize()[1]) |
0 | 1041 |
# Create an input and output connector |
1042 |
if self.Type in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]: |
|
145 | 1043 |
self.Inputs = [Connector(self, "", None, wx.Point(self.Size[0] / 2, 0), NORTH, onlyone = True)] |
0 | 1044 |
self.Outputs = [] |
1045 |
for i in xrange(number): |
|
145 | 1046 |
self.Outputs.append(Connector(self, "", None, wx.Point(i * SFC_DEFAULT_SEQUENCE_INTERVAL, self.Size[1]), SOUTH, onlyone = True)) |
0 | 1047 |
elif self.Type in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]: |
1048 |
self.Inputs = [] |
|
1049 |
for i in xrange(number): |
|
145 | 1050 |
self.Inputs.append(Connector(self, "", None, wx.Point(i * SFC_DEFAULT_SEQUENCE_INTERVAL, 0), NORTH, onlyone = True)) |
1051 |
self.Outputs = [Connector(self, "", None, wx.Point(self.Size[0] / 2, self.Size[1]), SOUTH, onlyone = True)] |
|
253 | 1052 |
self.Value = None |
1053 |
self.PreviousValue = None |
|
0 | 1054 |
|
249 | 1055 |
def Flush(self): |
1056 |
for input in self.Inputs: |
|
1057 |
input.Flush() |
|
0 | 1058 |
self.Inputs = [] |
249 | 1059 |
for output in self.Outputs: |
1060 |
output.Flush() |
|
0 | 1061 |
self.Outputs = [] |
1062 |
||
253 | 1063 |
def SpreadCurrent(self): |
1064 |
if self.Parent.Debug: |
|
1065 |
self.PreviousValue = self.Value |
|
1066 |
if self.Type == SELECTION_CONVERGENCE: |
|
1067 |
self.Value = False |
|
1068 |
for input in self.Inputs: |
|
1069 |
self.Value |= input.ReceivingCurrent() |
|
1070 |
elif self.Type == SIMULTANEOUS_CONVERGENCE: |
|
1071 |
self.Value = True |
|
1072 |
for input in self.Inputs: |
|
1073 |
self.Value &= input.ReceivingCurrent() |
|
1074 |
elif self.Type in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]: |
|
1075 |
self.Value = self.Inputs[0].ReceivingCurrent() |
|
1076 |
else: |
|
1077 |
self.Value = False |
|
1078 |
if self.Value and not self.PreviousValue: |
|
368 | 1079 |
if self.Visible: |
634 | 1080 |
self.Parent.ElementNeedRefresh(self) |
253 | 1081 |
for output in self.Outputs: |
1082 |
output.SpreadCurrent(True) |
|
1083 |
elif not self.Value and self.PreviousValue: |
|
368 | 1084 |
if self.Visible: |
634 | 1085 |
self.Parent.ElementNeedRefresh(self) |
253 | 1086 |
for output in self.Outputs: |
1087 |
output.SpreadCurrent(False) |
|
1088 |
||
112 | 1089 |
# Make a clone of this SFC_Divergence |
162 | 1090 |
def Clone(self, parent, id = None, pos = None): |
1091 |
divergence = SFC_Divergence(parent, self.Type, max(len(self.Inputs), len(self.Outputs)), id) |
|
112 | 1092 |
divergence.SetSize(self.Size[0], self.Size[1]) |
1093 |
if pos is not None: |
|
1094 |
divergence.SetPosition(pos.x, pos.y) |
|
283 | 1095 |
else: |
1096 |
divergence.SetPosition(self.Pos.x, self.Pos.y) |
|
112 | 1097 |
divergence.Inputs = [input.Clone(divergence) for input in self.Inputs] |
1098 |
divergence.Outputs = [output.Clone(divergence) for output in self.Outputs] |
|
1099 |
return divergence |
|
1100 |
||
283 | 1101 |
def GetConnectorTranslation(self, element): |
1102 |
return dict(zip(self.Inputs + self.Outputs, element.Inputs + element.Outputs)) |
|
1103 |
||
144 | 1104 |
# Returns the RedrawRect |
1105 |
def GetRedrawRect(self, movex = 0, movey = 0): |
|
1106 |
rect = Graphic_Element.GetRedrawRect(self, movex, movey) |
|
1107 |
if movex != 0 or movey != 0: |
|
1108 |
for input in self.Inputs: |
|
1109 |
if input.IsConnected(): |
|
1110 |
rect = rect.Union(input.GetConnectedRedrawRect(movex, movey)) |
|
1111 |
for output in self.Outputs: |
|
1112 |
if output.IsConnected(): |
|
1113 |
rect = rect.Union(output.GetConnectedRedrawRect(movex, movey)) |
|
1114 |
return rect |
|
1115 |
||
0 | 1116 |
# Forbids to resize the divergence |
1117 |
def Resize(self, x, y, width, height): |
|
27 | 1118 |
if self.Parent.GetDrawingMode() == FREEDRAWING_MODE: |
175 | 1119 |
Graphic_Element.Resize(self, x, 0, width, self.GetMinSize()[1]) |
0 | 1120 |
|
1121 |
# Delete this divergence by calling the appropriate method |
|
1122 |
def Delete(self): |
|
1123 |
self.Parent.DeleteDivergence(self) |
|
1124 |
||
1125 |
# Returns the divergence type |
|
1126 |
def GetType(self): |
|
1127 |
return self.Type |
|
1128 |
||
1129 |
# Unconnect input and output |
|
1130 |
def Clean(self): |
|
1131 |
for input in self.Inputs: |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1132 |
input.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) |
0 | 1133 |
for output in self.Outputs: |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1134 |
output.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) |
0 | 1135 |
|
1136 |
# Add a branch to the divergence |
|
1137 |
def AddBranch(self): |
|
1138 |
if self.Type in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]: |
|
1139 |
maxx = 0 |
|
1140 |
for output in self.Outputs: |
|
1141 |
pos = output.GetRelPosition() |
|
1142 |
maxx = max(maxx, pos.x) |
|
145 | 1143 |
connector = Connector(self, "", None, wx.Point(maxx + SFC_DEFAULT_SEQUENCE_INTERVAL, self.Size[1]), SOUTH, onlyone = True) |
0 | 1144 |
self.Outputs.append(connector) |
1145 |
self.MoveConnector(connector, 0) |
|
1146 |
elif self.Type in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]: |
|
1147 |
maxx = 0 |
|
1148 |
for input in self.Inputs: |
|
1149 |
pos = input.GetRelPosition() |
|
1150 |
maxx = max(maxx, pos.x) |
|
145 | 1151 |
connector = Connector(self, "", None, wx.Point(maxx + SFC_DEFAULT_SEQUENCE_INTERVAL, 0), NORTH, onlyone = True) |
0 | 1152 |
self.Inputs.append(connector) |
1153 |
self.MoveConnector(connector, SFC_DEFAULT_SEQUENCE_INTERVAL) |
|
1154 |
||
1155 |
# Remove a branch from the divergence |
|
1156 |
def RemoveBranch(self, connector): |
|
1157 |
if self.Type in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]: |
|
110
29b6b70e1721
Bug that makes element resizing acting strongly fixed
lbessard
parents:
108
diff
changeset
|
1158 |
if connector in self.Outputs and len(self.Outputs) > 2: |
0 | 1159 |
self.Outputs.remove(connector) |
1160 |
self.MoveConnector(self.Outputs[0], 0) |
|
1161 |
elif self.Type in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]: |
|
110
29b6b70e1721
Bug that makes element resizing acting strongly fixed
lbessard
parents:
108
diff
changeset
|
1162 |
if connector in self.Inputs and len(self.Inputs) > 2: |
0 | 1163 |
self.Inputs.remove(connector) |
1164 |
self.MoveConnector(self.Inputs[0], 0) |
|
1165 |
||
80 | 1166 |
# Remove the handled branch from the divergence |
1167 |
def RemoveHandledBranch(self): |
|
1168 |
handle_type, handle = self.Handle |
|
1169 |
if handle_type == HANDLE_CONNECTOR: |
|
1170 |
handle.UnConnect(delete=True) |
|
1171 |
self.RemoveBranch(handle) |
|
1172 |
||
0 | 1173 |
# Return the number of branches for the divergence |
1174 |
def GetBranchNumber(self): |
|
1175 |
if self.Type in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]: |
|
1176 |
return len(self.Outputs) |
|
1177 |
elif self.Type in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]: |
|
1178 |
return len(self.Inputs) |
|
1179 |
||
1180 |
# Returns if the point given is in the bounding box |
|
633
3536f4469cde
Fixing ToolTip behavior and bug with INOUT interface variables in Function Blocks and adding support for display connection point between wire and connector when mouse passing over.
laurent
parents:
566
diff
changeset
|
1181 |
def HitTest(self, pt, connectors=True): |
652 | 1182 |
return self.BoundingBox.InsideXY(pt.x, pt.y) or self.TestConnector(pt, exclude=False) != None |
0 | 1183 |
|
1184 |
# Refresh the divergence bounding box |
|
1185 |
def RefreshBoundingBox(self): |
|
1186 |
if self.Type in [SELECTION_DIVERGENCE, SELECTION_CONVERGENCE]: |
|
145 | 1187 |
self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y, |
1188 |
self.Size[0] + 1, self.Size[1] + 1) |
|
0 | 1189 |
elif self.Type in [SIMULTANEOUS_DIVERGENCE, SIMULTANEOUS_CONVERGENCE]: |
145 | 1190 |
self.BoundingBox = wx.Rect(self.Pos.x - SFC_SIMULTANEOUS_SEQUENCE_EXTRA, self.Pos.y, |
1191 |
self.Size[0] + 2 * SFC_SIMULTANEOUS_SEQUENCE_EXTRA + 1, self.Size[1] + 1) |
|
0 | 1192 |
|
1193 |
# Refresh the position of wires connected to divergence |
|
1194 |
def RefreshConnected(self, exclude = []): |
|
1195 |
for input in self.Inputs: |
|
1196 |
input.MoveConnected(exclude) |
|
1197 |
for output in self.Outputs: |
|
1198 |
output.MoveConnected(exclude) |
|
1199 |
||
1200 |
# Moves the divergence connector given |
|
1201 |
def MoveConnector(self, connector, movex): |
|
1202 |
position = connector.GetRelPosition() |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1203 |
connector.SetPosition(wx.Point(position.x + movex, position.y)) |
0 | 1204 |
minx = self.Size[0] |
1205 |
maxx = 0 |
|
1206 |
for input in self.Inputs: |
|
1207 |
input_pos = input.GetRelPosition() |
|
1208 |
minx = min(minx, input_pos.x) |
|
1209 |
maxx = max(maxx, input_pos.x) |
|
1210 |
for output in self.Outputs: |
|
1211 |
output_pos = output.GetRelPosition() |
|
1212 |
minx = min(minx, output_pos.x) |
|
1213 |
maxx = max(maxx, output_pos.x) |
|
1214 |
if minx != 0: |
|
1215 |
for input in self.Inputs: |
|
1216 |
input_pos = input.GetRelPosition() |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1217 |
input.SetPosition(wx.Point(input_pos.x - minx, input_pos.y)) |
0 | 1218 |
for output in self.Outputs: |
1219 |
output_pos = output.GetRelPosition() |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1220 |
output.SetPosition(wx.Point(output_pos.x - minx, output_pos.y)) |
641
e9295622ce9b
Fix bug with ToolTip staying on screen when compiling project with shortcut and mouse over a block
laurent
parents:
634
diff
changeset
|
1221 |
self.Inputs.sort(lambda x, y: cmp(x.Pos.x, y.Pos.x)) |
e9295622ce9b
Fix bug with ToolTip staying on screen when compiling project with shortcut and mouse over a block
laurent
parents:
634
diff
changeset
|
1222 |
self.Outputs.sort(lambda x, y: cmp(x.Pos.x, y.Pos.x)) |
0 | 1223 |
self.Pos.x += minx |
1224 |
self.Size[0] = maxx - minx |
|
1225 |
connector.MoveConnected() |
|
1226 |
self.RefreshBoundingBox() |
|
1227 |
||
1228 |
# Returns the divergence connector that starts with the point given if it exists |
|
27 | 1229 |
def GetConnector(self, position, name = None): |
1230 |
# if a name is given |
|
633
3536f4469cde
Fixing ToolTip behavior and bug with INOUT interface variables in Function Blocks and adding support for display connection point between wire and connector when mouse passing over.
laurent
parents:
566
diff
changeset
|
1231 |
if name is not None: |
27 | 1232 |
# Test each input and output connector |
633
3536f4469cde
Fixing ToolTip behavior and bug with INOUT interface variables in Function Blocks and adding support for display connection point between wire and connector when mouse passing over.
laurent
parents:
566
diff
changeset
|
1233 |
#for input in self.Inputs: |
3536f4469cde
Fixing ToolTip behavior and bug with INOUT interface variables in Function Blocks and adding support for display connection point between wire and connector when mouse passing over.
laurent
parents:
566
diff
changeset
|
1234 |
# if name == input.GetName(): |
3536f4469cde
Fixing ToolTip behavior and bug with INOUT interface variables in Function Blocks and adding support for display connection point between wire and connector when mouse passing over.
laurent
parents:
566
diff
changeset
|
1235 |
# return input |
27 | 1236 |
for output in self.Outputs: |
1237 |
if name == output.GetName(): |
|
1238 |
return output |
|
537
a31bf722aa82
Fix wire disappearing when wire tip and connector are not exactly at the same position fixed.
laurent
parents:
478
diff
changeset
|
1239 |
return self.FindNearestConnector(position, self.Inputs + self.Outputs) |
0 | 1240 |
|
1241 |
# Returns input and output divergence connectors |
|
1242 |
def GetConnectors(self): |
|
383
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
1243 |
return {"inputs": self.Inputs, "outputs": self.Outputs} |
0 | 1244 |
|
1245 |
# Test if point given is on divergence input or output connector |
|
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
1246 |
def TestConnector(self, pt, direction = None, exclude=True): |
0 | 1247 |
# Test input connector |
1248 |
for input in self.Inputs: |
|
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
1249 |
if input.TestPoint(pt, direction, exclude): |
0 | 1250 |
return input |
1251 |
# Test output connector |
|
1252 |
for output in self.Outputs: |
|
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
1253 |
if output.TestPoint(pt, direction, exclude): |
0 | 1254 |
return output |
1255 |
return None |
|
1256 |
||
1257 |
# Changes the divergence size |
|
1258 |
def SetSize(self, width, height): |
|
199 | 1259 |
height = self.GetMinSize()[1] |
0 | 1260 |
for i, input in enumerate(self.Inputs): |
1261 |
position = input.GetRelPosition() |
|
1262 |
if self.RealConnectors: |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1263 |
input.SetPosition(wx.Point(int(round(self.RealConnectors["Inputs"][i] * width)), 0)) |
0 | 1264 |
else: |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1265 |
input.SetPosition(wx.Point(int(round(float(position.x)*float(width)/float(self.Size[0]))), 0)) |
0 | 1266 |
input.MoveConnected() |
1267 |
for i, output in enumerate(self.Outputs): |
|
1268 |
position = output.GetRelPosition() |
|
1269 |
if self.RealConnectors: |
|
146 | 1270 |
output.SetPosition(wx.Point(int(round(self.RealConnectors["Outputs"][i] * width)), height)) |
0 | 1271 |
else: |
146 | 1272 |
output.SetPosition(wx.Point(int(round(float(position.x)*float(width)/float(self.Size[0]))), height)) |
0 | 1273 |
output.MoveConnected() |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1274 |
self.Size = wx.Size(width, height) |
0 | 1275 |
self.RefreshBoundingBox() |
1276 |
||
1277 |
# Returns the divergence minimum size |
|
110
29b6b70e1721
Bug that makes element resizing acting strongly fixed
lbessard
parents:
108
diff
changeset
|
1278 |
def GetMinSize(self, default=False): |
29b6b70e1721
Bug that makes element resizing acting strongly fixed
lbessard
parents:
108
diff
changeset
|
1279 |
width = 0 |
29b6b70e1721
Bug that makes element resizing acting strongly fixed
lbessard
parents:
108
diff
changeset
|
1280 |
if default: |
29b6b70e1721
Bug that makes element resizing acting strongly fixed
lbessard
parents:
108
diff
changeset
|
1281 |
if self.Type in [SELECTION_DIVERGENCE, SIMULTANEOUS_DIVERGENCE]: |
29b6b70e1721
Bug that makes element resizing acting strongly fixed
lbessard
parents:
108
diff
changeset
|
1282 |
width = (len(self.Outputs) - 1) * SFC_DEFAULT_SEQUENCE_INTERVAL |
29b6b70e1721
Bug that makes element resizing acting strongly fixed
lbessard
parents:
108
diff
changeset
|
1283 |
elif self.Type in [SELECTION_CONVERGENCE, SIMULTANEOUS_CONVERGENCE]: |
29b6b70e1721
Bug that makes element resizing acting strongly fixed
lbessard
parents:
108
diff
changeset
|
1284 |
width = (len(self.Inputs) - 1) * SFC_DEFAULT_SEQUENCE_INTERVAL |
27 | 1285 |
if self.Type in [SELECTION_DIVERGENCE, SELECTION_CONVERGENCE]: |
110
29b6b70e1721
Bug that makes element resizing acting strongly fixed
lbessard
parents:
108
diff
changeset
|
1286 |
return width, 1 |
27 | 1287 |
elif self.Type in [SIMULTANEOUS_DIVERGENCE, SIMULTANEOUS_CONVERGENCE]: |
110
29b6b70e1721
Bug that makes element resizing acting strongly fixed
lbessard
parents:
108
diff
changeset
|
1288 |
return width, 3 |
27 | 1289 |
return 0, 0 |
0 | 1290 |
|
1291 |
# Refresh the position of the block connected to connector |
|
1292 |
def RefreshConnectedPosition(self, connector): |
|
1293 |
wires = connector.GetWires() |
|
1294 |
if len(wires) != 1: |
|
1295 |
return |
|
1296 |
current_pos = connector.GetPosition(False) |
|
145 | 1297 |
next = wires[0][0].GetOtherConnected(connector) |
0 | 1298 |
next_pos = next.GetPosition(False) |
1299 |
diffx = current_pos.x - next_pos.x |
|
1300 |
next_block = next.GetParentBlock() |
|
1301 |
if isinstance(next_block, SFC_Divergence): |
|
1302 |
next_block.MoveConnector(next, diffx) |
|
1303 |
else: |
|
1304 |
next_block.Move(diffx, 0) |
|
1305 |
if connector in self.Inputs: |
|
1306 |
next_block.RefreshInputPosition() |
|
1307 |
else: |
|
1308 |
next_block.RefreshOutputPosition() |
|
27 | 1309 |
|
0 | 1310 |
# Refresh the position of this divergence |
1311 |
def RefreshPosition(self): |
|
1312 |
y = 0 |
|
1313 |
for input in self.Inputs: |
|
1314 |
wires = input.GetWires() |
|
1315 |
if len(wires) != 1: |
|
1316 |
return |
|
145 | 1317 |
previous = wires[0][0].GetOtherConnected(input) |
0 | 1318 |
previous_pos = previous.GetPosition(False) |
1319 |
y = max(y, previous_pos.y + GetWireSize(previous.GetParentBlock())) |
|
1320 |
diffy = y - self.Pos.y |
|
1321 |
if diffy != 0: |
|
1322 |
self.Move(0, diffy, self.Parent.Wires) |
|
1323 |
self.RefreshOutputPosition((0, diffy)) |
|
1324 |
for input in self.Inputs: |
|
1325 |
input.MoveConnected() |
|
1326 |
||
1327 |
# Align output element with this divergence |
|
1328 |
def RefreshOutputPosition(self, move = None): |
|
1329 |
if move: |
|
1330 |
for output_connector in self.Outputs: |
|
1331 |
wires = output_connector.GetWires() |
|
1332 |
if len(wires) != 1: |
|
1333 |
return |
|
1334 |
current_pos = output_connector.GetPosition(False) |
|
145 | 1335 |
output = wires[0][0].GetOtherConnected(self.Output) |
0 | 1336 |
output_pos = output.GetPosition(False) |
1337 |
diffx = current_pos.x - output_pos.x |
|
1338 |
output_block = output.GetParentBlock() |
|
1339 |
if isinstance(output_block, SFC_Step): |
|
1340 |
output_block.MoveActionBlock(move) |
|
1341 |
wires[0][0].Move(move[0], move[1], True) |
|
1342 |
if not isinstance(output_block, SFC_Divergence) or output_block.GetConnectors()["inputs"].index(output) == 0: |
|
1343 |
output_block.Move(move[0], move[1], self.Parent.Wires) |
|
1344 |
output_block.RefreshOutputPosition(move) |
|
1345 |
||
1346 |
# Method called when a LeftDown event have been generated |
|
27 | 1347 |
def OnLeftDown(self, event, dc, scaling): |
652 | 1348 |
connector = None |
1349 |
if event.ControlDown(): |
|
1350 |
pos = GetScaledEventPosition(event, dc, scaling) |
|
1351 |
# Test if a connector have been handled |
|
1352 |
connector = self.TestConnector(pos, exclude=False) |
|
0 | 1353 |
if connector: |
1354 |
self.Handle = (HANDLE_CONNECTOR, connector) |
|
381
98890d848701
Redefine cursor switching procedure in graphic viewers
laurent
parents:
379
diff
changeset
|
1355 |
wx.CallAfter(self.Parent.SetCurrentCursor, 1) |
0 | 1356 |
self.Selected = False |
1357 |
# Initializes the last position |
|
27 | 1358 |
self.oldPos = GetScaledEventPosition(event, dc, scaling) |
0 | 1359 |
else: |
652 | 1360 |
self.RealConnectors = {"Inputs":[],"Outputs":[]} |
1361 |
for input in self.Inputs: |
|
1362 |
position = input.GetRelPosition() |
|
1363 |
self.RealConnectors["Inputs"].append(float(position.x)/float(self.Size[0])) |
|
1364 |
for output in self.Outputs: |
|
1365 |
position = output.GetRelPosition() |
|
1366 |
self.RealConnectors["Outputs"].append(float(position.x)/float(self.Size[0])) |
|
1367 |
Graphic_Element.OnLeftDown(self, event, dc, scaling) |
|
1368 |
||
1369 |
# Method called when a LeftUp event have been generated |
|
1370 |
def OnLeftUp(self, event, dc, scaling): |
|
0 | 1371 |
handle_type, handle = self.Handle |
204
5eb48c97f6e5
Bug with RightUp on SFC_Divergence connectors without movement fixed
lbessard
parents:
199
diff
changeset
|
1372 |
if handle_type == HANDLE_CONNECTOR and self.Dragging and self.oldPos: |
0 | 1373 |
wires = handle.GetWires() |
320 | 1374 |
if len(wires) == 1: |
1375 |
block = wires[0][0].GetOtherConnected(handle).GetParentBlock() |
|
1376 |
block.RefreshModel(False) |
|
1377 |
if not isinstance(block, SFC_Divergence): |
|
1378 |
if handle in self.Inputs: |
|
1379 |
block.RefreshInputModel() |
|
1380 |
else: |
|
1381 |
block.RefreshOutputModel() |
|
652 | 1382 |
Graphic_Element.OnLeftUp(self, event, dc, scaling) |
1383 |
self.RealConnectors = None |
|
1384 |
||
1385 |
# Method called when a RightUp event have been generated |
|
1386 |
def OnRightUp(self, event, dc, scaling): |
|
1387 |
pos = GetScaledEventPosition(event, dc, scaling) |
|
1388 |
# Popup the menu with special items for a block and a connector if one is handled |
|
1389 |
connector = self.TestConnector(pos, exclude=False) |
|
1390 |
if connector: |
|
1391 |
self.Handle = (HANDLE_CONNECTOR, connector) |
|
1392 |
self.Parent.PopupDivergenceMenu(True) |
|
1393 |
else: |
|
1394 |
# Popup the divergence menu without delete branch |
|
1395 |
self.Parent.PopupDivergenceMenu(False) |
|
0 | 1396 |
|
1397 |
# Refreshes the divergence state according to move defined and handle selected |
|
327
7fd5233ce5ce
Adding support for contraining move to only one direction when control down
lbessard
parents:
320
diff
changeset
|
1398 |
def ProcessDragging(self, movex, movey, event, scaling): |
0 | 1399 |
handle_type, handle = self.Handle |
1400 |
# A connector has been handled |
|
1401 |
if handle_type == HANDLE_CONNECTOR: |
|
138
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
1402 |
movex = max(-self.BoundingBox.x, movex) |
145 | 1403 |
if scaling is not None: |
1404 |
movex = round(float(self.Pos.x + movex) / float(scaling[0])) * scaling[0] - self.Pos.x |
|
0 | 1405 |
self.MoveConnector(handle, movex) |
27 | 1406 |
if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: |
1407 |
self.RefreshConnectedPosition(handle) |
|
138
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
1408 |
return movex, 0 |
27 | 1409 |
elif self.Parent.GetDrawingMode() == FREEDRAWING_MODE: |
327
7fd5233ce5ce
Adding support for contraining move to only one direction when control down
lbessard
parents:
320
diff
changeset
|
1410 |
return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling) |
138
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
1411 |
return 0, 0 |
0 | 1412 |
|
1413 |
# Refresh output element model |
|
1414 |
def RefreshOutputModel(self, move=False): |
|
27 | 1415 |
if move and self.Parent.GetDrawingMode() != FREEDRAWING_MODE: |
0 | 1416 |
for output in self.Outputs: |
1417 |
wires = output.GetWires() |
|
1418 |
if len(wires) != 1: |
|
1419 |
return |
|
145 | 1420 |
output_block = wires[0][0].GetOtherConnected(output).GetParentBlock() |
0 | 1421 |
output_block.RefreshModel(False) |
1422 |
if not isinstance(output_block, SFC_Divergence) or move: |
|
1423 |
output_block.RefreshOutputModel(move) |
|
1424 |
||
1425 |
# Refreshes the divergence model |
|
1426 |
def RefreshModel(self, move=True): |
|
1427 |
self.Parent.RefreshDivergenceModel(self) |
|
1428 |
# If divergence has moved, refresh the model of wires connected to outputs |
|
1429 |
if move: |
|
27 | 1430 |
if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: |
1431 |
self.RefreshOutputModel() |
|
1432 |
else: |
|
1433 |
for output in self.Outputs: |
|
1434 |
output.RefreshWires() |
|
0 | 1435 |
|
140
06d28f03f6f4
Adding highlighting on group or element when mouse is over
lbessard
parents:
138
diff
changeset
|
1436 |
# Draws the highlightment of this element if it is highlighted |
06d28f03f6f4
Adding highlighting on group or element when mouse is over
lbessard
parents:
138
diff
changeset
|
1437 |
def DrawHighlightment(self, dc): |
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1438 |
scalex, scaley = dc.GetUserScale() |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1439 |
dc.SetUserScale(1, 1) |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1440 |
dc.SetPen(MiterPen(HIGHLIGHTCOLOR)) |
144 | 1441 |
dc.SetBrush(wx.Brush(HIGHLIGHTCOLOR)) |
1442 |
dc.SetLogicalFunction(wx.AND) |
|
1443 |
# Draw two rectangles for representing the contact |
|
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1444 |
posx = self.Pos.x |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1445 |
width = self.Size[0] |
144 | 1446 |
if self.Type in [SIMULTANEOUS_DIVERGENCE, SIMULTANEOUS_CONVERGENCE]: |
1447 |
posx -= SFC_SIMULTANEOUS_SEQUENCE_EXTRA |
|
1448 |
width += SFC_SIMULTANEOUS_SEQUENCE_EXTRA * 2 |
|
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1449 |
dc.DrawRectangle(int(round((posx - 1) * scalex)) - 2, |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1450 |
int(round((self.Pos.y - 1) * scaley)) - 2, |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1451 |
int(round((width + 3) * scalex)) + 5, |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1452 |
int(round((self.Size.height + 3) * scaley)) + 5) |
144 | 1453 |
dc.SetLogicalFunction(wx.COPY) |
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1454 |
dc.SetUserScale(scalex, scaley) |
140
06d28f03f6f4
Adding highlighting on group or element when mouse is over
lbessard
parents:
138
diff
changeset
|
1455 |
|
0 | 1456 |
# Draws divergence |
1457 |
def Draw(self, dc): |
|
144 | 1458 |
Graphic_Element.Draw(self, dc) |
253 | 1459 |
if self.Value: |
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1460 |
dc.SetPen(MiterPen(wx.GREEN)) |
253 | 1461 |
dc.SetBrush(wx.GREEN_BRUSH) |
1462 |
else: |
|
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1463 |
dc.SetPen(MiterPen(wx.BLACK)) |
253 | 1464 |
dc.SetBrush(wx.BLACK_BRUSH) |
0 | 1465 |
# Draw plain rectangle for representing the divergence |
1466 |
if self.Type in [SELECTION_DIVERGENCE, SELECTION_CONVERGENCE]: |
|
1467 |
dc.DrawRectangle(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1) |
|
1468 |
elif self.Type in [SIMULTANEOUS_DIVERGENCE, SIMULTANEOUS_CONVERGENCE]: |
|
1469 |
dc.DrawLine(self.Pos.x - SFC_SIMULTANEOUS_SEQUENCE_EXTRA, self.Pos.y, |
|
1470 |
self.Pos.x + self.Size[0] + SFC_SIMULTANEOUS_SEQUENCE_EXTRA + 1, self.Pos.y) |
|
27 | 1471 |
dc.DrawLine(self.Pos.x - SFC_SIMULTANEOUS_SEQUENCE_EXTRA, self.Pos.y + self.Size[1], |
1472 |
self.Pos.x + self.Size[0] + SFC_SIMULTANEOUS_SEQUENCE_EXTRA + 1, self.Pos.y + self.Size[1]) |
|
0 | 1473 |
# Draw inputs and outputs connectors |
1474 |
for input in self.Inputs: |
|
1475 |
input.Draw(dc) |
|
1476 |
for output in self.Outputs: |
|
1477 |
output.Draw(dc) |
|
140
06d28f03f6f4
Adding highlighting on group or element when mouse is over
lbessard
parents:
138
diff
changeset
|
1478 |
|
0 | 1479 |
|
1480 |
#------------------------------------------------------------------------------- |
|
1481 |
# Sequencial Function Chart Jump to Step |
|
1482 |
#------------------------------------------------------------------------------- |
|
1483 |
||
1484 |
""" |
|
1485 |
Class that implements the graphic representation of a jump to step |
|
1486 |
""" |
|
1487 |
||
1488 |
class SFC_Jump(Graphic_Element): |
|
1489 |
||
1490 |
# Create a new jump |
|
1491 |
def __init__(self, parent, target, id = None): |
|
1492 |
Graphic_Element.__init__(self, parent) |
|
213 | 1493 |
self.SetTarget(target) |
0 | 1494 |
self.Id = id |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1495 |
self.Size = wx.Size(SFC_JUMP_SIZE[0], SFC_JUMP_SIZE[1]) |
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1496 |
self.Highlights = [] |
0 | 1497 |
# Create an input and output connector |
145 | 1498 |
self.Input = Connector(self, "", None, wx.Point(self.Size[0] / 2, 0), NORTH, onlyone = True) |
253 | 1499 |
self.Value = None |
1500 |
self.PreviousValue = None |
|
0 | 1501 |
|
249 | 1502 |
def Flush(self): |
1503 |
if self.Input is not None: |
|
1504 |
self.Input.Flush() |
|
1505 |
self.Input = None |
|
0 | 1506 |
|
253 | 1507 |
def SpreadCurrent(self): |
1508 |
if self.Parent.Debug: |
|
1509 |
self.PreviousValue = self.Value |
|
1510 |
self.Value = self.Input.ReceivingCurrent() |
|
368 | 1511 |
if self.Value != self.PreviousValue and self.Visible: |
634 | 1512 |
self.Parent.ElementNeedRefresh(self) |
253 | 1513 |
|
112 | 1514 |
# Make a clone of this SFC_Jump |
162 | 1515 |
def Clone(self, parent, id = None, pos = None): |
1516 |
jump = SFC_Jump(parent, self.Target, id) |
|
112 | 1517 |
jump.SetSize(self.Size[0], self.Size[1]) |
1518 |
if pos is not None: |
|
1519 |
jump.SetPosition(pos.x, pos.y) |
|
283 | 1520 |
else: |
1521 |
jump.SetPosition(self.Pos.x, self.Pos.y) |
|
112 | 1522 |
jump.Input = self.Input.Clone(jump) |
1523 |
return jump |
|
1524 |
||
283 | 1525 |
def GetConnectorTranslation(self, element): |
1526 |
return {self.Input : element.Input} |
|
1527 |
||
144 | 1528 |
# Returns the RedrawRect |
1529 |
def GetRedrawRect(self, movex = 0, movey = 0): |
|
1530 |
rect = Graphic_Element.GetRedrawRect(self, movex, movey) |
|
1531 |
rect = rect.Union(self.Input.GetRedrawRect(movex, movey)) |
|
1532 |
if movex != 0 or movey != 0: |
|
1533 |
if self.Input.IsConnected(): |
|
1534 |
rect = rect.Union(self.Input.GetConnectedRedrawRect(movex, movey)) |
|
1535 |
return rect |
|
1536 |
||
0 | 1537 |
# Forbids to change the jump size |
1538 |
def SetSize(self, width, height): |
|
27 | 1539 |
if self.Parent.GetDrawingMode() == FREEDRAWING_MODE: |
1540 |
Graphic_Element.SetSize(self, width, height) |
|
0 | 1541 |
|
1542 |
# Forbids to resize jump |
|
1543 |
def Resize(self, x, y, width, height): |
|
27 | 1544 |
if self.Parent.GetDrawingMode() == FREEDRAWING_MODE: |
1545 |
Graphic_Element.Resize(self, x, y, width, height) |
|
0 | 1546 |
|
1547 |
# Delete this jump by calling the appropriate method |
|
1548 |
def Delete(self): |
|
1549 |
self.Parent.DeleteJump(self) |
|
1550 |
||
1551 |
# Unconnect input |
|
1552 |
def Clean(self): |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1553 |
self.Input.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) |
0 | 1554 |
|
213 | 1555 |
# Refresh the size of text for target |
1556 |
def RefreshTargetSize(self): |
|
1557 |
self.TargetSize = self.Parent.GetTextExtent(self.Target) |
|
1558 |
||
0 | 1559 |
# Refresh the jump bounding box |
1560 |
def RefreshBoundingBox(self): |
|
165 | 1561 |
text_width, text_height = self.Parent.GetTextExtent(self.Target) |
0 | 1562 |
# Calculate the bounding box size |
1563 |
bbx_width = self.Size[0] + 2 + text_width |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1564 |
self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y - CONNECTOR_SIZE, |
0 | 1565 |
bbx_width + 1, self.Size[1] + CONNECTOR_SIZE + 1) |
1566 |
||
1567 |
# Returns the connector connected to input |
|
1568 |
def GetPreviousConnector(self): |
|
27 | 1569 |
wires = self.Input.GetWires() |
1570 |
if len(wires) == 1: |
|
145 | 1571 |
return wires[0][0].GetOtherConnected(self.Input) |
0 | 1572 |
return None |
1573 |
||
27 | 1574 |
# Refresh the element connectors position |
1575 |
def RefreshConnectors(self): |
|
145 | 1576 |
scaling = self.Parent.GetScaling() |
1577 |
horizontal_pos = self.Size[0] / 2 |
|
1578 |
if scaling is not None: |
|
1579 |
horizontal_pos = round(float(self.Pos.x + horizontal_pos) / float(scaling[0])) * scaling[0] - self.Pos.x |
|
1580 |
self.Input.SetPosition(wx.Point(horizontal_pos, 0)) |
|
27 | 1581 |
self.RefreshConnected() |
1582 |
||
0 | 1583 |
# Refresh the position of wires connected to jump |
1584 |
def RefreshConnected(self, exclude = []): |
|
1585 |
if self.Input: |
|
1586 |
self.Input.MoveConnected(exclude) |
|
1587 |
||
1588 |
# Returns input jump connector |
|
27 | 1589 |
def GetConnector(self, position = None, name = None): |
0 | 1590 |
return self.Input |
1591 |
||
383
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
1592 |
# Returns all the jump connectors |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
1593 |
def GetConnectors(self): |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
1594 |
return {"inputs": [self.Input], "outputs": []} |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
1595 |
|
0 | 1596 |
# Test if point given is on jump input connector |
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
1597 |
def TestConnector(self, pt, direction = None, exclude = True): |
0 | 1598 |
# Test input connector |
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
1599 |
if self.Input and self.Input.TestPoint(pt, direction, exclude): |
0 | 1600 |
return self.Input |
1601 |
return None |
|
1602 |
||
1603 |
# Changes the jump target |
|
1604 |
def SetTarget(self, target): |
|
1605 |
self.Target = target |
|
213 | 1606 |
self.RefreshTargetSize() |
0 | 1607 |
self.RefreshBoundingBox() |
1608 |
||
1609 |
# Returns the jump target |
|
1610 |
def GetTarget(self): |
|
1611 |
return self.Target |
|
1612 |
||
1613 |
# Returns the jump minimum size |
|
1614 |
def GetMinSize(self): |
|
1615 |
return SFC_JUMP_SIZE |
|
1616 |
||
1617 |
# Align input element with this jump |
|
1618 |
def RefreshInputPosition(self): |
|
1619 |
if self.Input: |
|
1620 |
current_pos = self.Input.GetPosition(False) |
|
1621 |
input = self.GetPreviousConnector() |
|
1622 |
if input: |
|
1623 |
input_pos = input.GetPosition(False) |
|
1624 |
diffx = current_pos.x - input_pos.x |
|
1625 |
input_block = input.GetParentBlock() |
|
1626 |
if isinstance(input_block, SFC_Divergence): |
|
1627 |
input_block.MoveConnector(input, diffx) |
|
1628 |
else: |
|
1629 |
if isinstance(input_block, SFC_Step): |
|
1630 |
input_block.MoveActionBlock((diffx, 0)) |
|
1631 |
input_block.Move(diffx, 0) |
|
1632 |
input_block.RefreshInputPosition() |
|
1633 |
||
1634 |
# Can't align output element, because there is no output |
|
1635 |
def RefreshOutputPosition(self, move = None): |
|
1636 |
pass |
|
1637 |
||
1638 |
# Method called when a LeftDClick event have been generated |
|
27 | 1639 |
def OnLeftDClick(self, event, dc, scaling): |
0 | 1640 |
# Edit the jump properties |
1641 |
self.Parent.EditJumpContent(self) |
|
1642 |
||
1643 |
# Method called when a RightUp event have been generated |
|
27 | 1644 |
def OnRightUp(self, event, dc, scaling): |
0 | 1645 |
# Popup the default menu |
1646 |
self.Parent.PopupDefaultMenu() |
|
1647 |
||
1648 |
# Refreshes the jump state according to move defined and handle selected |
|
327
7fd5233ce5ce
Adding support for contraining move to only one direction when control down
lbessard
parents:
320
diff
changeset
|
1649 |
def ProcessDragging(self, movex, movey, event, scaling): |
27 | 1650 |
if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: |
138
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
1651 |
movex = max(-self.BoundingBox.x, movex) |
145 | 1652 |
if scaling is not None: |
1653 |
movex = round(float(self.Pos.x + movex) / float(scaling[0])) * scaling[0] - self.Pos.x |
|
27 | 1654 |
self.Move(movex, 0) |
1655 |
self.RefreshInputPosition() |
|
138
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
1656 |
return movex, 0 |
110
29b6b70e1721
Bug that makes element resizing acting strongly fixed
lbessard
parents:
108
diff
changeset
|
1657 |
else: |
327
7fd5233ce5ce
Adding support for contraining move to only one direction when control down
lbessard
parents:
320
diff
changeset
|
1658 |
return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling, width_fac = 2) |
0 | 1659 |
|
1660 |
# Refresh input element model |
|
1661 |
def RefreshInputModel(self): |
|
27 | 1662 |
if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: |
1663 |
input = self.GetPreviousConnector() |
|
1664 |
if input: |
|
1665 |
input_block = input.GetParentBlock() |
|
1666 |
input_block.RefreshModel(False) |
|
1667 |
if not isinstance(input_block, SFC_Divergence): |
|
1668 |
input_block.RefreshInputModel() |
|
0 | 1669 |
|
1670 |
# Refresh output element model |
|
1671 |
def RefreshOutputModel(self, move=False): |
|
1672 |
pass |
|
1673 |
||
1674 |
# Refreshes the jump model |
|
1675 |
def RefreshModel(self, move=True): |
|
1676 |
self.Parent.RefreshJumpModel(self) |
|
1677 |
if move: |
|
27 | 1678 |
if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: |
1679 |
self.RefreshInputModel() |
|
0 | 1680 |
|
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1681 |
# Adds an highlight to the variable |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1682 |
def AddHighlight(self, infos, start, end, highlight_type): |
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1683 |
if infos[0] == "target" and start[0] == 0 and end[0] == 0: |
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1684 |
AddHighlight(self.Highlights, (start, end, highlight_type)) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1685 |
|
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1686 |
# Removes an highlight from the variable |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1687 |
def RemoveHighlight(self, infos, start, end, highlight_type): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1688 |
if infos[0] == "target": |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1689 |
RemoveHighlight(self.Highlights, (start, end, highlight_type)) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1690 |
|
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1691 |
# Removes all the highlights of one particular type from the variable |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1692 |
def ClearHighlight(self, highlight_type=None): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1693 |
ClearHighlights(self.Highlights, highlight_type) |
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1694 |
|
140
06d28f03f6f4
Adding highlighting on group or element when mouse is over
lbessard
parents:
138
diff
changeset
|
1695 |
# Draws the highlightment of this element if it is highlighted |
06d28f03f6f4
Adding highlighting on group or element when mouse is over
lbessard
parents:
138
diff
changeset
|
1696 |
def DrawHighlightment(self, dc): |
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1697 |
scalex, scaley = dc.GetUserScale() |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1698 |
dc.SetUserScale(1, 1) |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1699 |
dc.SetPen(MiterPen(HIGHLIGHTCOLOR)) |
144 | 1700 |
dc.SetBrush(wx.Brush(HIGHLIGHTCOLOR)) |
1701 |
dc.SetLogicalFunction(wx.AND) |
|
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1702 |
points = [wx.Point(int(round((self.Pos.x - 2) * scalex)) - 3, |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1703 |
int(round((self.Pos.y - 2) * scaley)) - 2), |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1704 |
wx.Point(int(round((self.Pos.x + self.Size[0] + 2) * scalex)) + 4, |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1705 |
int(round((self.Pos.y - 2) * scaley)) - 2), |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1706 |
wx.Point(int(round((self.Pos.x + self.Size[0] / 2) * scalex)), |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1707 |
int(round((self.Pos.y + self.Size[1] + 3) * scaley)) + 4)] |
144 | 1708 |
dc.DrawPolygon(points) |
1709 |
dc.SetLogicalFunction(wx.COPY) |
|
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1710 |
dc.SetUserScale(scalex, scaley) |
140
06d28f03f6f4
Adding highlighting on group or element when mouse is over
lbessard
parents:
138
diff
changeset
|
1711 |
|
0 | 1712 |
# Draws divergence |
1713 |
def Draw(self, dc): |
|
144 | 1714 |
Graphic_Element.Draw(self, dc) |
253 | 1715 |
if self.Value: |
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1716 |
dc.SetPen(MiterPen(wx.GREEN)) |
253 | 1717 |
dc.SetBrush(wx.GREEN_BRUSH) |
1718 |
else: |
|
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1719 |
dc.SetPen(MiterPen(wx.BLACK)) |
253 | 1720 |
dc.SetBrush(wx.BLACK_BRUSH) |
213 | 1721 |
|
1722 |
if getattr(dc, "printing", False): |
|
1723 |
target_size = dc.GetTextExtent(self.Target) |
|
1724 |
else: |
|
1725 |
target_size = self.TargetSize |
|
1726 |
||
0 | 1727 |
# Draw plain rectangle for representing the divergence |
1728 |
dc.DrawLine(self.Pos.x + self.Size[0] / 2, self.Pos.y, self.Pos.x + self.Size[0] / 2, self.Pos.y + self.Size[1]) |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1729 |
points = [wx.Point(self.Pos.x, self.Pos.y), |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1730 |
wx.Point(self.Pos.x + self.Size[0] / 2, self.Pos.y + self.Size[1] / 3), |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1731 |
wx.Point(self.Pos.x + self.Size[0], self.Pos.y), |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1732 |
wx.Point(self.Pos.x + self.Size[0] / 2, self.Pos.y + self.Size[1])] |
0 | 1733 |
dc.DrawPolygon(points) |
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1734 |
target_pos = (self.Pos.x + self.Size[0] + 2, |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1735 |
self.Pos.y + (self.Size[1] - target_size[1]) / 2) |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1736 |
dc.DrawText(self.Target, target_pos[0], target_pos[1]) |
0 | 1737 |
# Draw input connector |
1738 |
if self.Input: |
|
1739 |
self.Input.Draw(dc) |
|
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1740 |
|
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1741 |
if not getattr(dc, "printing", False): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1742 |
DrawHighlightedText(dc, self.Target, self.Highlights, target_pos[0], target_pos[1]) |
140
06d28f03f6f4
Adding highlighting on group or element when mouse is over
lbessard
parents:
138
diff
changeset
|
1743 |
|
0 | 1744 |
|
1745 |
#------------------------------------------------------------------------------- |
|
1746 |
# Sequencial Function Chart Action Block |
|
1747 |
#------------------------------------------------------------------------------- |
|
1748 |
||
1749 |
""" |
|
1750 |
Class that implements the graphic representation of an action block |
|
1751 |
""" |
|
1752 |
||
1753 |
class SFC_ActionBlock(Graphic_Element): |
|
1754 |
||
1755 |
# Create a new action block |
|
1756 |
def __init__(self, parent, actions = [], id = None): |
|
1757 |
Graphic_Element.__init__(self, parent) |
|
1758 |
self.Id = id |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1759 |
self.Size = wx.Size(SFC_ACTION_MIN_SIZE[0], SFC_ACTION_MIN_SIZE[1]) |
108 | 1760 |
self.MinSize = wx.Size(SFC_ACTION_MIN_SIZE[0], SFC_ACTION_MIN_SIZE[1]) |
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1761 |
self.Highlights = {} |
0 | 1762 |
# Create an input and output connector |
145 | 1763 |
self.Input = Connector(self, "", None, wx.Point(0, SFC_ACTION_MIN_SIZE[1] / 2), WEST, onlyone = True) |
0 | 1764 |
self.SetActions(actions) |
253 | 1765 |
self.Value = None |
1766 |
self.PreviousValue = None |
|
0 | 1767 |
|
249 | 1768 |
def Flush(self): |
1769 |
if self.Input is not None: |
|
1770 |
self.Input.Flush() |
|
1771 |
self.Input = None |
|
0 | 1772 |
|
253 | 1773 |
def SpreadCurrent(self): |
1774 |
if self.Parent.Debug: |
|
1775 |
self.PreviousValue = self.Value |
|
1776 |
self.Value = self.Input.ReceivingCurrent() |
|
368 | 1777 |
if self.Value != self.PreviousValue and self.Visible: |
634 | 1778 |
self.Parent.ElementNeedRefresh(self) |
253 | 1779 |
|
112 | 1780 |
# Make a clone of this SFC_ActionBlock |
162 | 1781 |
def Clone(self, parent, id = None, pos = None): |
112 | 1782 |
actions = [action.copy() for action in self.Actions] |
162 | 1783 |
action_block = SFC_ActionBlock(parent, actions, id) |
112 | 1784 |
action_block.SetSize(self.Size[0], self.Size[1]) |
1785 |
if pos is not None: |
|
1786 |
action_block.SetPosition(pos.x, pos.y) |
|
283 | 1787 |
else: |
1788 |
action_block.SetPosition(self.Pos.x, self.Pos.y) |
|
112 | 1789 |
action_block.Input = self.Input.Clone(action_block) |
144 | 1790 |
return action_block |
1791 |
||
283 | 1792 |
def GetConnectorTranslation(self, element): |
1793 |
return {self.Input : element.Input} |
|
1794 |
||
1795 |
# Returns the RedrawRect |
|
144 | 1796 |
def GetRedrawRect(self, movex = 0, movey = 0): |
1797 |
rect = Graphic_Element.GetRedrawRect(self, movex, movey) |
|
1798 |
rect = rect.Union(self.Input.GetRedrawRect(movex, movey)) |
|
1799 |
if movex != 0 or movey != 0: |
|
1800 |
if self.Input.IsConnected(): |
|
1801 |
rect = rect.Union(self.Input.GetConnectedRedrawRect(movex, movey)) |
|
1802 |
return rect |
|
112 | 1803 |
|
0 | 1804 |
# Returns the number of action lines |
1805 |
def GetLineNumber(self): |
|
1806 |
return len(self.Actions) |
|
1807 |
||
27 | 1808 |
def GetLineSize(self): |
108 | 1809 |
if len(self.Actions) > 0: |
27 | 1810 |
return self.Size[1] / len(self.Actions) |
1811 |
else: |
|
1812 |
return SFC_ACTION_MIN_SIZE[1] |
|
1813 |
||
0 | 1814 |
# Forbids to resize the action block |
1815 |
def Resize(self, x, y, width, height): |
|
27 | 1816 |
if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: |
1817 |
if x == 0: |
|
1818 |
self.SetSize(width, self.Size[1]) |
|
1819 |
else: |
|
1820 |
Graphic_Element.Resize(self, x, y, width, height) |
|
0 | 1821 |
|
1822 |
# Delete this action block by calling the appropriate method |
|
1823 |
def Delete(self): |
|
1824 |
self.Parent.DeleteActionBlock(self) |
|
1825 |
||
1826 |
# Unconnect input and output |
|
1827 |
def Clean(self): |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1828 |
self.Input.UnConnect(delete = self.Parent.GetDrawingMode() == FREEDRAWING_MODE) |
0 | 1829 |
|
1830 |
# Refresh the action block bounding box |
|
1831 |
def RefreshBoundingBox(self): |
|
144 | 1832 |
self.BoundingBox = wx.Rect(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1) |
0 | 1833 |
|
1834 |
# Refresh the position of wires connected to action block |
|
1835 |
def RefreshConnected(self, exclude = []): |
|
1836 |
self.Input.MoveConnected(exclude) |
|
1837 |
||
1838 |
# Returns input action block connector |
|
27 | 1839 |
def GetConnector(self, position = None, name = None): |
0 | 1840 |
return self.Input |
1841 |
||
383
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
1842 |
# Returns all the action block connectors |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
1843 |
def GetConnectors(self): |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
1844 |
return {"inputs": [self.Input], "outputs": []} |
25ffba02b6a8
Improving viewer loading instances procedure to faster
laurent
parents:
381
diff
changeset
|
1845 |
|
0 | 1846 |
# Test if point given is on action block input connector |
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
1847 |
def TestConnector(self, pt, direction = None, exclude = True): |
0 | 1848 |
# Test input connector |
243
c5da8b706cde
Adding support for allowing connections only between an input and an output connector
lbessard
parents:
231
diff
changeset
|
1849 |
if self.Input.TestPoint(pt, direction, exclude): |
0 | 1850 |
return self.Input |
1851 |
return None |
|
1852 |
||
145 | 1853 |
# Refresh the element connectors position |
1854 |
def RefreshConnectors(self): |
|
1855 |
scaling = self.Parent.GetScaling() |
|
1856 |
vertical_pos = SFC_ACTION_MIN_SIZE[1] / 2 |
|
1857 |
if scaling is not None: |
|
1858 |
vertical_pos = round(float(self.Pos.y + vertical_pos) / float(scaling[1])) * scaling[1] - self.Pos.y |
|
1859 |
self.Input.SetPosition(wx.Point(0, vertical_pos)) |
|
1860 |
self.RefreshConnected() |
|
1861 |
||
0 | 1862 |
# Changes the action block actions |
1863 |
def SetActions(self, actions): |
|
1864 |
self.Actions = actions |
|
1865 |
self.ColSize = [0, 0, 0] |
|
108 | 1866 |
min_height = 0 |
0 | 1867 |
for action in self.Actions: |
165 | 1868 |
width, height = self.Parent.GetTextExtent(action["qualifier"]) |
0 | 1869 |
self.ColSize[0] = max(self.ColSize[0], width + 10) |
108 | 1870 |
row_height = height |
379
e4c26ee9c998
Code rewritten, replacing all list containing tests by dict key defining tests
laurent
parents:
368
diff
changeset
|
1871 |
if action.has_key("duration"): |
165 | 1872 |
width, height = self.Parent.GetTextExtent(action["duration"]) |
108 | 1873 |
row_height = max(row_height, height) |
0 | 1874 |
self.ColSize[0] = max(self.ColSize[0], width + 10) |
165 | 1875 |
width, height = self.Parent.GetTextExtent(action["value"]) |
108 | 1876 |
row_height = max(row_height, height) |
0 | 1877 |
self.ColSize[1] = max(self.ColSize[1], width + 10) |
379
e4c26ee9c998
Code rewritten, replacing all list containing tests by dict key defining tests
laurent
parents:
368
diff
changeset
|
1878 |
if action.get("indicator", "") != "": |
165 | 1879 |
width, height = self.Parent.GetTextExtent(action["indicator"]) |
108 | 1880 |
row_height = max(row_height, height) |
0 | 1881 |
self.ColSize[2] = max(self.ColSize[2], width + 10) |
108 | 1882 |
min_height += row_height + 5 |
27 | 1883 |
if self.Parent.GetDrawingMode() == FREEDRAWING_MODE: |
108 | 1884 |
self.Size = wx.Size(self.ColSize[0] + self.ColSize[1] + self.ColSize[2], max(min_height, SFC_ACTION_MIN_SIZE[1], self.Size[1])) |
1885 |
self.MinSize = max(self.ColSize[0] + self.ColSize[1] + self.ColSize[2], |
|
1886 |
SFC_ACTION_MIN_SIZE[0]), max(SFC_ACTION_MIN_SIZE[1], min_height) |
|
1887 |
self.RefreshBoundingBox() |
|
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1888 |
else: |
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1889 |
self.Size = wx.Size(max(self.ColSize[0] + self.ColSize[1] + self.ColSize[2], |
27 | 1890 |
SFC_ACTION_MIN_SIZE[0]), len(self.Actions) * SFC_ACTION_MIN_SIZE[1]) |
108 | 1891 |
self.MinSize = max(self.ColSize[0] + self.ColSize[1] + self.ColSize[2], |
1892 |
SFC_ACTION_MIN_SIZE[0]), len(self.Actions) * SFC_ACTION_MIN_SIZE[1] |
|
1893 |
self.RefreshBoundingBox() |
|
1894 |
if self.Input: |
|
1895 |
wires = self.Input.GetWires() |
|
1896 |
if len(wires) == 1: |
|
145 | 1897 |
input_block = wires[0][0].GetOtherConnected(self.Input).GetParentBlock() |
108 | 1898 |
input_block.RefreshOutputPosition() |
1899 |
input_block.RefreshOutputModel(True) |
|
0 | 1900 |
|
1901 |
# Returns the action block actions |
|
1902 |
def GetActions(self): |
|
1903 |
return self.Actions |
|
1904 |
||
1905 |
# Returns the action block minimum size |
|
1906 |
def GetMinSize(self): |
|
108 | 1907 |
return self.MinSize |
0 | 1908 |
|
1909 |
# Method called when a LeftDClick event have been generated |
|
27 | 1910 |
def OnLeftDClick(self, event, dc, scaling): |
0 | 1911 |
# Edit the action block properties |
1912 |
self.Parent.EditActionBlockContent(self) |
|
1913 |
||
127
436268f31dae
Adding contextual menu on LD_Contact, LD_Coil, LD_PowerRail and SFC_ActionBlock
lbessard
parents:
112
diff
changeset
|
1914 |
# Method called when a RightUp event have been generated |
436268f31dae
Adding contextual menu on LD_Contact, LD_Coil, LD_PowerRail and SFC_ActionBlock
lbessard
parents:
112
diff
changeset
|
1915 |
def OnRightUp(self, event, dc, scaling): |
436268f31dae
Adding contextual menu on LD_Contact, LD_Coil, LD_PowerRail and SFC_ActionBlock
lbessard
parents:
112
diff
changeset
|
1916 |
# Popup the default menu |
436268f31dae
Adding contextual menu on LD_Contact, LD_Coil, LD_PowerRail and SFC_ActionBlock
lbessard
parents:
112
diff
changeset
|
1917 |
self.Parent.PopupDefaultMenu() |
436268f31dae
Adding contextual menu on LD_Contact, LD_Coil, LD_PowerRail and SFC_ActionBlock
lbessard
parents:
112
diff
changeset
|
1918 |
|
0 | 1919 |
# Refreshes the action block state according to move defined and handle selected |
327
7fd5233ce5ce
Adding support for contraining move to only one direction when control down
lbessard
parents:
320
diff
changeset
|
1920 |
def ProcessDragging(self, movex, movey, event, scaling): |
27 | 1921 |
if self.Parent.GetDrawingMode() != FREEDRAWING_MODE: |
1922 |
handle_type, handle = self.Handle |
|
1923 |
if handle_type == HANDLE_MOVE: |
|
138
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
1924 |
movex = max(-self.BoundingBox.x, movex) |
145 | 1925 |
if scaling is not None: |
1926 |
movex = round(float(self.Pos.x + movex) / float(scaling[0])) * scaling[0] - self.Pos.x |
|
27 | 1927 |
wires = self.Input.GetWires() |
1928 |
if len(wires) == 1: |
|
145 | 1929 |
input_pos = wires[0][0].GetOtherConnected(self.Input).GetPosition(False) |
27 | 1930 |
if self.Pos.x - input_pos.x + movex >= SFC_WIRE_MIN_SIZE: |
1931 |
self.Move(movex, 0) |
|
138
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
1932 |
return movex, 0 |
9c74d00ce93e
Last bugs on block and wire moving, resizing with cursor fixed
lbessard
parents:
127
diff
changeset
|
1933 |
return 0, 0 |
27 | 1934 |
else: |
327
7fd5233ce5ce
Adding support for contraining move to only one direction when control down
lbessard
parents:
320
diff
changeset
|
1935 |
return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling) |
7fd5233ce5ce
Adding support for contraining move to only one direction when control down
lbessard
parents:
320
diff
changeset
|
1936 |
else: |
7fd5233ce5ce
Adding support for contraining move to only one direction when control down
lbessard
parents:
320
diff
changeset
|
1937 |
return Graphic_Element.ProcessDragging(self, movex, movey, event, scaling) |
27 | 1938 |
|
0 | 1939 |
|
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1940 |
# Refreshes the action block model |
0 | 1941 |
def RefreshModel(self, move=True): |
1942 |
self.Parent.RefreshActionBlockModel(self) |
|
1943 |
||
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1944 |
# Adds an highlight to the variable |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1945 |
def AddHighlight(self, infos, start, end, highlight_type): |
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1946 |
if infos[0] == "action" and infos[1] < len(self.Actions): |
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1947 |
action_highlights = self.Highlights.setdefault(infos[1], {}) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1948 |
attribute_highlights = action_highlights.setdefault(infos[2], []) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1949 |
AddHighlight(attribute_highlights, (start, end, highlight_type)) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1950 |
|
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1951 |
# Removes an highlight from the block |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1952 |
def RemoveHighlight(self, infos, start, end, highlight_type): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1953 |
if infos[0] == "action" and infos[1] < len(self.Actions): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1954 |
action_highlights = self.Highlights.get(infos[1], {}) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1955 |
attribute_highlights = action_highlights.setdefault(infos[2], []) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1956 |
if RemoveHighlight(attribute_highlights, (start, end, highlight_type)) and len(attribute_highlights) == 0: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1957 |
action_highlights.pop(infos[2]) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1958 |
if len(action_highlights) == 0: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1959 |
self.Highlights.pop(infos[1]) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1960 |
|
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1961 |
# Removes all the highlights of one particular type from the block |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1962 |
def ClearHighlight(self, highlight_type=None): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1963 |
if highlight_type is None: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1964 |
self.Highlights = {} |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1965 |
else: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1966 |
highlight_items = self.Highlights.items() |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1967 |
for number, action_highlights in highlight_items: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1968 |
action_highlight_items = action_highlights.items() |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1969 |
for name, attribute_highlights in action_highlights: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1970 |
attribute_highlights = ClearHighlights(attribute_highlights, highlight_type) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1971 |
if len(attribute_highlights) == 0: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1972 |
action_highlights.pop(name) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1973 |
if len(action_highlights) == 0: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
1974 |
self.Highlights.pop(number) |
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1975 |
|
0 | 1976 |
# Draws divergence |
1977 |
def Draw(self, dc): |
|
144 | 1978 |
Graphic_Element.Draw(self, dc) |
253 | 1979 |
if self.Value: |
563
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1980 |
dc.SetPen(MiterPen(wx.GREEN)) |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1981 |
else: |
3f92a5e18804
- Fixing editing graphic element (handles, rubberband and highlight) in graphic editor in order to make them keep the same size whatever the zoom factor applied to graphic editor
laurent
parents:
553
diff
changeset
|
1982 |
dc.SetPen(MiterPen(wx.BLACK)) |
64
dd6f693e46a1
Cleaning code for using only wxPython 2.6 class naming
lbessard
parents:
58
diff
changeset
|
1983 |
dc.SetBrush(wx.WHITE_BRUSH) |
0 | 1984 |
colsize = [self.ColSize[0], self.Size[0] - self.ColSize[0] - self.ColSize[2], self.ColSize[2]] |
1985 |
# Draw plain rectangle for representing the action block |
|
1986 |
dc.DrawRectangle(self.Pos.x, self.Pos.y, self.Size[0] + 1, self.Size[1] + 1) |
|
1987 |
dc.DrawLine(self.Pos.x + colsize[0], self.Pos.y, |
|
1988 |
self.Pos.x + colsize[0], self.Pos.y + self.Size[1]) |
|
1989 |
dc.DrawLine(self.Pos.x + colsize[0] + colsize[1], self.Pos.y, |
|
1990 |
self.Pos.x + colsize[0] + colsize[1], self.Pos.y + self.Size[1]) |
|
27 | 1991 |
line_size = self.GetLineSize() |
0 | 1992 |
for i, action in enumerate(self.Actions): |
1993 |
if i != 0: |
|
27 | 1994 |
dc.DrawLine(self.Pos.x, self.Pos.y + i * line_size, |
1995 |
self.Pos.x + self.Size[0], self.Pos.y + i * line_size) |
|
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1996 |
qualifier_size = dc.GetTextExtent(action["qualifier"]) |
379
e4c26ee9c998
Code rewritten, replacing all list containing tests by dict key defining tests
laurent
parents:
368
diff
changeset
|
1997 |
if action.has_key("duration"): |
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1998 |
qualifier_pos = (self.Pos.x + (colsize[0] - qualifier_size[0]) / 2, |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
1999 |
self.Pos.y + i * line_size + line_size / 2 - qualifier_size[1]) |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2000 |
duration_size = dc.GetTextExtent(action["duration"]) |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2001 |
duration_pos = (self.Pos.x + (colsize[0] - duration_size[0]) / 2, |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2002 |
self.Pos.y + i * line_size + line_size / 2) |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2003 |
dc.DrawText(action["duration"], duration_pos[0], duration_pos[1]) |
0 | 2004 |
else: |
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2005 |
qualifier_pos = (self.Pos.x + (colsize[0] - qualifier_size[0]) / 2, |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2006 |
self.Pos.y + i * line_size + (line_size - qualifier_size[1]) / 2) |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2007 |
dc.DrawText(action["qualifier"], qualifier_pos[0], qualifier_pos[1]) |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2008 |
content_size = dc.GetTextExtent(action["value"]) |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2009 |
content_pos = (self.Pos.x + colsize[0] + (colsize[1] - content_size[0]) / 2, |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2010 |
self.Pos.y + i * line_size + (line_size - content_size[1]) / 2) |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2011 |
dc.DrawText(action["value"], content_pos[0], content_pos[1]) |
379
e4c26ee9c998
Code rewritten, replacing all list containing tests by dict key defining tests
laurent
parents:
368
diff
changeset
|
2012 |
if action.has_key("indicator"): |
231
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2013 |
indicator_size = dc.GetTextExtent(action["indicator"]) |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2014 |
indicator_pos = (self.Pos.x + colsize[0] + colsize[1] + (colsize[2] - indicator_size[0]) / 2, |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2015 |
self.Pos.y + i * line_size + (line_size - indicator_size[1]) / 2) |
fc2d6cbb8b39
Adding support for highlighing compiling errors from matiec
lbessard
parents:
213
diff
changeset
|
2016 |
dc.DrawText(action["indicator"], indicator_pos[0], indicator_pos[1]) |
566
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
2017 |
|
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
2018 |
if not getattr(dc, "printing", False): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
2019 |
action_highlights = self.Highlights.get(i, {}) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
2020 |
for name, attribute_highlights in action_highlights.iteritems(): |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
2021 |
if name == "qualifier": |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
2022 |
DrawHighlightedText(dc, action["qualifier"], attribute_highlights, qualifier_pos[0], qualifier_pos[1]) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
2023 |
elif name == "duration": |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
2024 |
DrawHighlightedText(dc, action["duration"], attribute_highlights, duration_pos[0], duration_pos[1]) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
2025 |
elif name in ["reference", "inline"]: |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
2026 |
DrawHighlightedText(dc, action["value"], attribute_highlights, content_pos[0], content_pos[1]) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
2027 |
elif name == "indicator": |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
2028 |
DrawHighlightedText(dc, action["indicator"], attribute_highlights, indicator_pos[0], indicator_pos[1]) |
6014ef82a98a
Adding support for searching text or regular expression in whole project
laurent
parents:
563
diff
changeset
|
2029 |
|
0 | 2030 |
# Draw input connector |
2031 |
self.Input.Draw(dc) |
|
140
06d28f03f6f4
Adding highlighting on group or element when mouse is over
lbessard
parents:
138
diff
changeset
|
2032 |