29 from python_qt_binding
import loadUi
30 from python_qt_binding.QtCore
import Qt, Signal, Slot, QRectF, QPointF, QSize, QRect, QPoint
31 from python_qt_binding.QtWidgets
import QDialog, QGraphicsView, QGraphicsScene, QGraphicsEllipseItem, QGraphicsPathItem
32 from python_qt_binding.QtGui
import QColor, QPen, QBrush, QPainterPath, QPolygonF, QTransform, QPainter
38 b = QBrush(QColor(0,0,255))
40 b = QBrush(QColor(255,255,255))
41 elif state ==
'R': # running 42 b = QBrush(QColor(0,255,0)) 46 b = QPen(QColor(0,0,255))
48 b = QPen(QBrush(QColor(255,0,0)), 5)
50 b = QPen(QBrush(QColor(0,0,0)), 1)
55 super(GraphScene, self).
__init__(rect)
59 comp_select_signal = Signal(str)
62 super (GraphView, self).__init__ (parent)
66 self.setTransformationAnchor(QGraphicsView.NoAnchor)
67 self.setResizeAnchor(QGraphicsView.NoAnchor)
76 oldPos = self.mapToScene(event.pos())
77 self.translate(oldPos.x(),oldPos.y())
80 if event.angleDelta().y() < 0 :
82 self.scale(factor, factor)
85 newPos = self.mapToScene(event.pos())
87 delta = newPos - oldPos
88 self.translate(delta.x(), delta.y())
95 if event.button() == Qt.MidButton:
101 for item
in self.items():
102 if type(item)
is QGraphicsEllipseItem:
103 if item.contains( self.mapToScene(event.pos()) ):
107 elif type(item)
is QGraphicsPathItem:
108 if item.contains( self.mapToScene(event.pos()) ):
109 print "connections: ", item.data(0)
114 if event.buttons() == Qt.MidButton:
115 mouseMovePos = event.pos()
118 scene_diff = view_diff
119 new_tf = QTransform(tf.m11(), tf.m12(), tf.m21(), tf.m22(), tf.dx()+view_diff.x(), tf.dy()+view_diff.y())
120 self.setTransform(new_tf)
125 if event.button() == Qt.MidButton:
150 e.setPen( QPen(QBrush(QColor(0,0,0)), 1) )
159 e.setPen( QPen(QBrush(QColor(255,0,0)), 5) )
165 self.comboBoxConnections.clear()
168 if name ==
None or name ==
'':
170 self.labelSelectedComponent.setText(
'No state selected')
171 self.labelSubBehaviors.setText(
'No state selected')
176 self.labelSelectedComponent.setText(name)
180 for state
in self.
parent.subsystem_info.state_machine:
181 if state.name == name:
187 for subbehavior
in state.behavior_names:
191 behavior_str += subbehavior
192 self.labelSubBehaviors.setText(behavior_str)
194 for next_state
in state.next_states:
196 transition_str =
'next state - NAME: ' + next_state.name +
', INIT_COND: ' + next_state.init_cond
197 self.comboBoxConnections.addItem(transition_str)
200 for comp_name
in self.
nodes:
202 if name
in self.
nodes:
208 super(StateMachineGraphDialog, self).
__init__(parent)
212 self.setWindowFlags(Qt.Window)
214 rp = rospkg.RosPack()
215 ui_file = os.path.join(rp.get_path(
'rqt_agent'),
'resource',
'FsmVis.ui')
216 loadUi(ui_file, self)
218 self.setWindowTitle(subsystem_name +
" - state machine")
222 self.pushButton_export.clicked.connect(self.
exportClick)
225 self.pushButton_close.clicked.connect(self.
closeClick)
226 self.pushButton_zoom_in.clicked.connect(self.
zoomInClick)
227 self.pushButton_zoom_out.clicked.connect(self.
zoomOutClick)
251 graph = graph_str.splitlines()
253 header = graph[0].split()
254 if header[0] !=
'graph':
255 raise Exception(
'wrong graph format',
'header is: ' + graph[0])
260 print "QGraphicsScene size:", self.
width, self.
height 268 elif items[0] ==
'stop':
270 elif items[0] ==
'node':
273 raise Exception(
'wrong number of items in line',
'line is: ' + l)
277 w = self.
scX(items[4])
278 h = self.
scY(items[5])
279 x = self.
tfX(items[2])
280 y = self.
tfY(items[3])
282 self.
nodes[name] = self.
scene.addEllipse(x - w/2, y - h/2, w, h)
283 self.
nodes[name].setData(0, name)
284 text_item = self.
scene.addSimpleText(name)
285 br = text_item.boundingRect()
286 text_item.setPos(x - br.width()/2, y - br.height()/2)
288 elif items[0] ==
'edge':
294 line_len = int(items[3])
297 if (line_len * 2 + 6) == len(items):
300 elif (line_len * 2 + 9) == len(items):
302 label_text = items[4 + line_len*2]
303 label_pos = QPointF(self.
tfX(items[4 + line_len*2 + 1]), self.
tfY(items[4 + line_len*2 + 2]))
305 raise Exception(
'wrong number of items in line',
'should be: ' + str(line_len * 2 + 6) +
" or " + str(line_len * 2 + 9) +
', line is: ' + l)
308 for i
in range(line_len):
309 line.append( (self.
tfX(items[4+i*2]), self.
tfY(items[5+i*2])) )
310 control_points_idx = 1
311 path = QPainterPath(QPointF(line[0][0], line[0][1]))
313 q1 = line[control_points_idx]
314 q2 = line[control_points_idx+1]
315 p2 = line[control_points_idx+2]
316 path.cubicTo( q1[0], q1[1], q2[0], q2[1], p2[0], p2[1] )
317 control_points_idx = control_points_idx + 3
318 if control_points_idx >= len(line):
320 edge = self.
scene.addPath(path)
321 edge.setData(0, (items[1], items[2]))
322 self.
edges.append(edge)
324 end_p = QPointF(line[-1][0], line[-1][1])
325 p0 = end_p - QPointF(line[-2][0], line[-2][1])
326 p0_norm = math.sqrt(p0.x()*p0.x() + p0.y()*p0.y())
329 p1 = QPointF(p0.y(), -p0.x()) * 0.25
333 poly.append(p0+end_p)
334 poly.append(p1+end_p)
335 poly.append(p2+end_p)
336 poly.append(p0+end_p)
341 self.
scene.addPolygon(poly)
343 if label_text
and label_pos:
344 if label_text[0] ==
"\"":
345 label_text = label_text[1:]
346 if label_text[-1] ==
"\"":
347 label_text = label_text[:-1]
348 label_text = label_text.replace(
"\\n",
"\n")
349 label_item = self.
scene.addSimpleText(label_text)
350 br = label_item.boundingRect()
351 label_item.setPos(label_pos.x() - br.width()/2, label_pos.y() - br.height()/2)
357 self.
parent.exportStateMachineGraph()
383 scaleFactor = 1.0/1.1
389 active_state_name = mcd.history[0].state_name
390 for comp_name
in self.
nodes:
391 if comp_name == active_state_name:
def transitionSelected(self, index)
prev_selected_connections
def mouseReleaseEvent(self, event)
def addGraph(self, graph_str)
def __init__(self, parent=None)
def getComponentBrush(state)
def wheelEvent(self, event)
def componentSelected(self, name)
def mousePressEvent(self, event)
def selectComponent(self, name)
def __init__(self, subsystem_name, parent=None)
def getComponentPen(state)
def reset_viewClick(self)
def mouseMoveEvent(self, event)
def updateState(self, mcd)
selected_component_next_states_names