xar_file_writer.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 
6 
7 import os
8 import xml.sax.saxutils as saxutils
9 
10 import converter.xar_types as xar_types
11 
12 
13 ENTITIES = {
14  '\x00': "�", '\x01': "",
15  '\x02': "", '\x03': "",
16  '\x04': "", '\x05': "",
17  '\x06': "", '\x07': "",
18  '\x08': "", '\x09': "	",
19  '\x0a': "
", '\x0b': "",
20  '\x0c': "", '\x0d': "
",
21  '\x0e': "", '\x0f': "",
22  '\x10': "", '\x11': "",
23  '\x12': "", '\x13': "",
24  '\x14': "", '\x15': "",
25  '\x16': "", '\x17': "",
26  '\x18': "", '\x19': "",
27  '\x1a': "", '\x1b': "",
28  '\x1c': "", '\x1d': "",
29  '\x1e': "", '\x1f': "",
30  '\"': """, '\'': "'"
31 }
32 
33 
34 def write_xar_file(f, project):
35  # XML header
36  f.write(u"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + os.linesep)
37 
38  # Root tag
39  f.write(u"<ChoregrapheProject "
40  + u"xmlns=\"http://www.aldebaran-robotics.com/schema/choregraphe/project.xsd\""
41  + u" xar_version=\"3\">"
42  + os.linesep)
43 
44  _write_box_instance(f, project.root_box, " ")
45 
46  f.write(u"</ChoregrapheProject>" + os.linesep)
47 
48 
49 def _write_box_instance(f, instance, indent):
50  # box beacon
51  f.write((u"{}<Box name=\"{}\" id=\"{}\"")
52  .format(indent,
53  saxutils.escape(instance.name, entities=ENTITIES),
54  instance.id))
55 
56  if instance.interface.localization:
57  f.write((u" localization=\"{}\"")
58  .format(instance.interface.localization))
59 
60  f.write((u" tooltip=\"{}\"")
61  .format(saxutils.escape(instance.interface.tooltip,
62  entities=ENTITIES)))
63 
64  if instance.interface.plugin:
65  f.write((u" plugin=\"{}\"").format(instance.interface.plugin))
66 
67  f.write((u" x=\"{}\" y=\"{}\">{}")
68  .format(instance.x,
69  instance.y,
70  os.linesep))
71 
72  for bitmap in instance.interface.bitmaps:
73  _write_bitmap(f, bitmap, indent + ' ')
74 
75  _write_box_script(f, instance, indent + ' ')
76 
77  if instance.plugin_content and instance.interface.plugin:
78  _write_plugin_content(f, instance.plugin_content, indent + ' ')
79 
80  for input in instance.interface.inputs:
81  _write_input(f, input, indent + ' ')
82 
83  for output in instance.interface.outputs:
84  _write_output(f, output, indent + ' ')
85 
86  for parameter in instance.interface.parameters:
87  value = instance.get_parameter_value(parameter.id)
88  _write_parameter(f, parameter, value, indent + ' ')
89 
90  _write_timeline(f, instance.interface, indent + ' ')
91 
92  for resource in instance.interface.resources:
93  _write_resource(f, resource, indent + ' ')
94 
95  f.write((u"{}</Box>{}").format(indent, os.linesep))
96 
97 
98 def _write_bitmap(f, bitmap, indent):
99  f.write((u"{}<bitmap>{}</bitmap>{}")
100  .format(indent,
101  bitmap.path,
102  os.linesep))
103 
104 
105 def _write_box_script(f, instance, indent):
106  script_content = None
107  for content in instance.interface.contents:
108  if (content.content_type == xar_types.ContentType.PYTHON_SCRIPT
109  or content.content_type == xar_types.ContentType.QICHAT_SCRIPT):
110  script_content = content
111 
112  if script_content:
113  if script_content.content_type == xar_types.ContentType.PYTHON_SCRIPT:
114  f.write((u"{}<script language=\"{}\">{}")
115  .format(indent,
116  xar_types.ScriptLanguage.PYTHON,
117  os.linesep))
118  elif script_content.content_type == xar_types.ContentType.QICHAT_SCRIPT:
119  f.write((u"{}<script language=\"{}\">{}")
120  .format(indent,
121  xar_types.ScriptLanguage.QICHAT,
122  os.linesep))
123  else:
124  raise Exception("Bad script language "
125  + script_content.content_type)
126 
127  f.write((u"{}<content>{}"
128  + u"{}<![CDATA[{}]]>{}"
129  + u"</content>{}"
130  + u"{}</script>{}")
131  .format(indent + ' ', os.linesep,
132  indent + ' ', script_content.impl, os.linesep,
133  os.linesep,
134  indent, os.linesep))
135  else:
136  f.write((u"{}<script/>{}").format(indent, os.linesep))
137 
138 
139 def _write_plugin_content(f, plugin_content, indent):
140  """ Write XML part of the <pluginContent> beacon, inside the box
141  interface XML
142 
143  A recursive write is necessary because the content of the part
144  is completely unknown and can contain levels and levels of
145  sub-nodes
146  """
147 
148  f.write((u"{}<pluginContent>{}").format(indent,
149  os.linesep))
150  for subnode in plugin_content.subnodes:
151  _write_plugin_subnode(f, subnode, indent + " ")
152  f.write((u"{}</pluginContent>{}").format(indent,
153  os.linesep))
154 
155 
156 def _write_plugin_subnode(f, subnode, indent):
157  f.write((u"{}<{}").format(indent,
158  subnode.beacon()))
159  if subnode.attributes.keys():
160  for key in subnode.attributes.keys():
161  f.write((u" {}=\"{}\"").format(str(key),
162  str(subnode.attributes[key])))
163 
164  if subnode.subnodes:
165  f.write(u">" + os.linesep)
166  for subsubnode in subnode.subnodes:
167  _write_plugin_subnode(f, subsubnode, indent + " ")
168  f.write((u"{}</{}>{}").format(indent,
169  subnode.beacon(),
170  os.linesep))
171  elif subnode.content:
172  f.write((u">{}</{}>{}").format(saxutils.escape(subnode.content,
173  entities=ENTITIES),
174  subnode.beacon(),
175  os.linesep))
176  else:
177  f.write(u"/>" + os.linesep)
178 
179 
180 def _write_input(f, input, indent):
181  f.write((u"{}<Input name=\"{}\" {} nature=\"{}\"")
182  .format(indent,
183  input.name,
185  input.nature))
186 
187  if input.stm_value_name:
188  f.write((u" stm_value_name=\"{}\"")
189  .format(input.stm_value_name))
190 
191  f.write((u" inner=\"{}\" tooltip=\"{}\" id=\"{}\" />{}")
192  .format(input.inner,
193  saxutils.escape(input.tooltip, entities=ENTITIES),
194  input.id,
195  os.linesep))
196 
197 
198 def _write_output(f, output, indent):
199  f.write((u"{}<Output name=\"{}\" {}"
200  + u" nature=\"{}\" inner=\"{}\" tooltip=\"{}\" id=\"{}\" />{}")
201  .format(indent,
202  output.name,
204  output.nature,
205  output.inner,
206  saxutils.escape(output.tooltip, entities=ENTITIES),
207  output.id,
208  os.linesep))
209 
210 
211 def _write_parameter(f, parameter, value, indent):
212  f.write((u"{}<Parameter name=\"{}\" inherits_from_parent=\"{}\""
213  + u" content_type=\"{}\" value=\"{}\" default_value=\"{}\"")
214  .format(indent,
215  parameter.name,
216  parameter.inherits_from_parent,
217  _resolve_parameter_type(parameter),
218  value,
219  parameter.default_value))
220 
221  if (parameter.type == xar_types.IOSignature.DOUBLE
222  or parameter.type == xar_types.IOSignature.INT):
223  f.write((u" min=\"{}\" max=\"{}\"")
224  .format(parameter.min,
225  parameter.max))
226 
227  if parameter.custom_choice:
228  f.write((u" custom_choice=\"{}\"").format(parameter.custom_choice))
229 
230  if parameter.password == "1":
231  f.write((u" password=\"{}\"").format(parameter.password))
232 
233  if parameter.choices:
234  f.write((u" tooltip=\"{}\" id=\"{}\">{}")
235  .format(saxutils.escape(parameter.tooltip, entities=ENTITIES),
236  parameter.id,
237  os.linesep))
238  for choice in parameter.choices:
239  f.write((u"{}<Choice value=\"{}\" />{}")
240  .format(indent + ' ',
241  saxutils.escape(choice.value, entities=ENTITIES),
242  os.linesep))
243  f.write((u"{}</Parameter>{}")
244  .format(indent,
245  os.linesep))
246  else:
247  f.write((u" tooltip=\"{}\" id=\"{}\" />{}")
248  .format(saxutils.escape(parameter.tooltip, entities=ENTITIES),
249  parameter.id,
250  os.linesep))
251 
252 
254  ioType = ""
255  ioSize = u"1"
256 
257  # allowed because old xar do not manage complete types
258  signature = io.signature.strip("()")
259  if signature == xar_types.IOSignature.BANG: # empty
260  ioType = xar_types.IOType.BANG
261  elif signature == xar_types.IOSignature.BITMAP:
262  ioType = xar_types.IOType.BITMAP
263  elif signature == xar_types.IOSignature.SOUND:
264  ioType = xar_types.IOType.SOUND
265  elif signature[0] == xar_types.IOSignature.DYNAMIC:
266  ioType = xar_types.IOType.DYNAMIC
267  elif signature[0] == xar_types.IOSignature.DOUBLE:
268  ioType = xar_types.IOType.NUMBER
269  ioSize = str(signature.count(xar_types.IOSignature.DOUBLE))
270  elif signature[0] == xar_types.IOSignature.STRING:
271  ioType = xar_types.IOType.STRING
272  ioSize = str(signature.count(xar_types.IOSignature.STRING))
273  else:
274  raise Exception("Unknown signature: %s" % io.type)
275 
276  return u"type=\"{}\" type_size=\"{}\"".format(ioType, ioSize)
277 
278 
279 def _resolve_parameter_type(parameter):
280  paramType = ""
281 
282  if parameter.type == xar_types.IOSignature.BOOL:
283  paramType = xar_types.ParameterType.BOOL
284  elif parameter.type == xar_types.IOSignature.DOUBLE:
285  paramType = xar_types.ParameterType.DOUBLE
286  elif parameter.type == xar_types.IOSignature.INT:
287  paramType = xar_types.ParameterType.INT
288  elif parameter.type == xar_types.IOSignature.RESOURCE:
289  paramType = xar_types.ParameterType.RESOURCE
290  elif parameter.type == xar_types.IOSignature.STRING:
291  paramType = xar_types.ParameterType.STRING
292  else:
293  raise Exception("Unknown signature: %s" % parameter.type)
294 
295  return paramType
296 
297 
298 def _write_timeline(f, interface, indent):
299  # extract interesting contents
300  flow_diagram = None
301  sequence = None
302  animation = None
303 
304  for content in interface.contents:
305  if content.content_type == xar_types.ContentType.FLOW_DIAGRAM:
306  flow_diagram = content.impl
307  elif content.content_type == xar_types.ContentType.BEHAVIOR_SEQUENCE:
308  sequence = content.impl
309  elif content.content_type == xar_types.ContentType.ANIMATION:
310  animation = content.impl
311  elif content.content_type == xar_types.ContentType.PYTHON_SCRIPT:
312  pass
313  elif content.content_type == xar_types.ContentType.QICHAT_SCRIPT:
314  pass
315  else:
316  raise Exception("unknown content type "
317  + str(content.content_type))
318 
319  if not (flow_diagram or sequence or animation):
320  return
321 
322  if flow_diagram:
323  f.write((u"{}<Timeline enable=\"0\">{}")
324  .format(indent,
325  os.linesep))
326  elif animation:
327  f.write((u"{}<Timeline enable=\"1\" fps=\"{}\" start_frame=\"{}\""
328  + u" end_frame=\"{}\" size=\"{}\"")
329  .format(indent,
330  animation.fps,
331  animation.start_frame,
332  animation.end_frame,
333  animation.size))
334  if animation.resources_acquisition:
335  f.write((u" resources_acquisition=\"{}\">{}")
336  .format(animation.resources_acquisition,
337  os.linesep))
338  else:
339  f.write((u">{}").format(os.linesep))
340  else:
341  f.write((u"{}<Timeline enable=\"1\" fps=\"{}\" start_frame=\"{}\""
342  + u" end_frame=\"{}\" size=\"{}\"")
343  .format(indent,
344  sequence.fps,
345  sequence.start_frame,
346  sequence.end_frame,
347  sequence.size))
348  if sequence.resources_acquisition:
349  f.write((u" resources_acquisition=\"{}\">{}")
350  .format(sequence.resources_acquisition,
351  os.linesep))
352  else:
353  f.write((u">{}").format(os.linesep))
354 
355  if flow_diagram:
356  _write_flow_diagram(f, flow_diagram, indent + ' ')
357 
358  if sequence:
359  _write_behavior_sequence(f, sequence, indent + ' ')
360 
361  if animation:
362  _write_animation(f, animation, indent + ' ')
363 
364  f.write((u"{}</Timeline>{}")
365  .format(indent,
366  os.linesep))
367 
368 
369 def _write_flow_diagram(f, diagram, indent):
370  f.write((u"{}<BehaviorLayer name=\"behavior_layer1\">{}"
371  + u"{}<BehaviorKeyframe name=\"keyframe1\" index=\"1\">{}")
372  .format(indent,
373  os.linesep,
374  indent + ' ',
375  os.linesep))
376  _write_diagram(f, diagram, indent + ' ')
377  f.write((u"{}</BehaviorKeyframe>{}"
378  + u"{}</BehaviorLayer>{}")
379  .format(indent + ' ',
380  os.linesep,
381  indent,
382  os.linesep))
383 
384 
385 def _write_animation(f, animation, indent):
386  # there is no animation level in old xar format
387  _write_actuator_list(f, animation.actuator_list, indent)
388 
389 
390 def _write_actuator_list(f, actuator_list, indent):
391  f.write((u"{}<ActuatorList model=\"{}\">{}")
392  .format(indent,
393  actuator_list.model,
394  os.linesep))
395 
396  for curve in actuator_list.curves:
397  _write_actuator_curve(f, curve, indent + ' ')
398 
399  f.write((u"{}</ActuatorList>{}")
400  .format(indent,
401  os.linesep))
402 
403 
404 def _write_actuator_curve(f, curve, indent):
405  f.write((u"{}<ActuatorCurve name=\"{}\" actuator=\"{}\" recordable=\"{}\""
406  + u" mute=\"{}\" unit=\"{}\"")
407  .format(indent,
408  curve.name,
409  curve.actuator,
410  curve.recordable,
411  curve.mute,
412  curve.unit))
413 
414  if curve.keys:
415  f.write(u">" + os.linesep)
416  for key in curve.keys:
417  _write_actuator_key(f, key, indent + ' ')
418 
419  f.write((u"{}</ActuatorCurve>{}")
420  .format(indent,
421  os.linesep))
422  else:
423  f.write(u" />" + os.linesep)
424 
425 
426 def _write_actuator_key(f, key, indent):
427  f.write((u"{}<Key frame=\"{}\" value=\"{}\"")
428  .format(indent,
429  key.frame,
430  key.value))
431 
432  if key.smooth == "1":
433  f.write(u" smooth=\"1\"")
434  if key.symmetrical == "1":
435  f.write(u" symmetrical=\"1\"")
436 
437  if key.tangents:
438  f.write(u">" + os.linesep)
439  for tangent in key.tangents:
440  _write_tangent(f, tangent, indent + ' ')
441  f.write(indent + u"</Key>" + os.linesep)
442  else:
443  f.write(u" />" + os.linesep)
444 
445 
446 def _write_tangent(f, tangent, indent):
447  f.write((u"{}<Tangent side=\"{}\" interpType=\"{}\""
448  + u" abscissaParam=\"{}\" ordinateParam=\"{}\" />{}")
449  .format(indent,
450  tangent.side,
451  tangent.interpType,
452  tangent.abscissaParam,
453  tangent.ordinateParam,
454  os.linesep))
455 
456 
457 def _write_behavior_sequence(f, sequence, indent):
458  for layer in sequence.behavior_layers:
459  _write_behavior_layer(f, layer, indent)
460 
461 
462 def _write_behavior_layer(f, layer, indent):
463  f.write((u"{}<BehaviorLayer name=\"{}\"")
464  .format(indent,
465  layer.name))
466  if layer.mute:
467  f.write((u" mute=\"{}\">{}")
468  .format(layer.mute,
469  os.linesep))
470  else:
471  f.write(u">" + os.linesep)
472 
473  for keyframe in layer.behavior_keyframes:
474  _write_behavior_keyframe(f, keyframe, indent + ' ')
475 
476  f.write((u"{}</BehaviorLayer>{}")
477  .format(indent,
478  os.linesep))
479 
480 
481 def _write_behavior_keyframe(f, keyframe, indent):
482  f.write((u"{}<BehaviorKeyframe name=\"{}\" index=\"{}\"")
483  .format(indent,
484  keyframe.name,
485  keyframe.index))
486  if keyframe.bitmap:
487  f.write((u" bitmap=\"{}\">{}")
488  .format(keyframe.bitmap,
489  os.linesep))
490  else:
491  f.write(u">" + os.linesep)
492 
493  _write_diagram(f, keyframe.diagram, indent + ' ')
494 
495  f.write((u"{}</BehaviorKeyframe>{}")
496  .format(indent,
497  os.linesep))
498 
499 
500 def _write_diagram(f, diagram, indent):
501  # because a keyframe can embed an empty diagram
502  if (not diagram.box_instances) and (not diagram.links):
503  f.write(indent + u"<Diagram />" + os.linesep)
504  return
505 
506  # else
507  f.write(indent + u"<Diagram")
508 
509  if diagram.scale:
510  f.write((u" scale=\"{}\">{}")
511  .format(diagram.scale,
512  os.linesep))
513  else:
514  f.write(u">" + os.linesep)
515 
516  for box_instance in diagram.box_instances:
517  _write_box_instance(f, box_instance, indent + ' ')
518 
519  for link in diagram.links:
520  _write_link(f, link, indent + ' ')
521 
522  f.write(indent + u"</Diagram>" + os.linesep)
523 
524 
525 def _write_link(f, link, indent):
526  f.write((u"{}<Link inputowner=\"{}\" indexofinput=\"{}\""
527  + u" outputowner=\"{}\" indexofoutput=\"{}\" />{}")
528  .format(indent,
529  link.emitterID,
530  link.indexofinput,
531  link.receiverID,
532  link.indexofoutput,
533  os.linesep))
534 
535 
536 def _write_resource(f, resource, indent):
537  f.write((u"{}<Resource name=\"{}\" type=\"{}\" timeout=\"{}\" />{}")
538  .format(indent,
539  resource.name,
540  resource.lock_type,
541  resource.timeout,
542  os.linesep))
converter.xar_file_writer._write_flow_diagram
def _write_flow_diagram(f, diagram, indent)
Definition: xar_file_writer.py:369
converter.xar_file_writer._write_actuator_key
def _write_actuator_key(f, key, indent)
Definition: xar_file_writer.py:426
converter.xar_file_writer._write_tangent
def _write_tangent(f, tangent, indent)
Definition: xar_file_writer.py:446
converter.xar_file_writer._write_parameter
def _write_parameter(f, parameter, value, indent)
Definition: xar_file_writer.py:211
converter.xar_file_writer._write_behavior_sequence
def _write_behavior_sequence(f, sequence, indent)
Definition: xar_file_writer.py:457
converter.xar_file_writer._write_actuator_curve
def _write_actuator_curve(f, curve, indent)
Definition: xar_file_writer.py:404
converter.xar_file_writer._write_box_instance
def _write_box_instance(f, instance, indent)
Definition: xar_file_writer.py:49
converter.xar_file_writer._write_input
def _write_input(f, input, indent)
Definition: xar_file_writer.py:180
converter.xar_types
Definition: xar_types.py:1
converter.xar_file_writer._write_animation
def _write_animation(f, animation, indent)
Definition: xar_file_writer.py:385
converter.xar_file_writer._write_behavior_layer
def _write_behavior_layer(f, layer, indent)
Definition: xar_file_writer.py:462
converter.xar_file_writer._resolve_io_type_and_size
def _resolve_io_type_and_size(io)
Definition: xar_file_writer.py:253
converter.xar_file_writer._write_plugin_content
def _write_plugin_content(f, plugin_content, indent)
Definition: xar_file_writer.py:139
converter.xar_file_writer._write_plugin_subnode
def _write_plugin_subnode(f, subnode, indent)
Definition: xar_file_writer.py:156
converter.xar_file_writer._write_actuator_list
def _write_actuator_list(f, actuator_list, indent)
Definition: xar_file_writer.py:390
converter.xar_file_writer._write_bitmap
def _write_bitmap(f, bitmap, indent)
Definition: xar_file_writer.py:98
converter.xar_file_writer._write_box_script
def _write_box_script(f, instance, indent)
Definition: xar_file_writer.py:105
converter.xar_file_writer.write_xar_file
def write_xar_file(f, project)
Definition: xar_file_writer.py:34
converter.xar_file_writer._resolve_parameter_type
def _resolve_parameter_type(parameter)
Definition: xar_file_writer.py:279
converter.xar_file_writer._write_output
def _write_output(f, output, indent)
Definition: xar_file_writer.py:198
converter.xar_file_writer._write_behavior_keyframe
def _write_behavior_keyframe(f, keyframe, indent)
Definition: xar_file_writer.py:481
converter.xar_file_writer._write_link
def _write_link(f, link, indent)
Definition: xar_file_writer.py:525
converter.xar_file_writer._write_diagram
def _write_diagram(f, diagram, indent)
Definition: xar_file_writer.py:500
converter.xar_file_writer._write_timeline
def _write_timeline(f, interface, indent)
Definition: xar_file_writer.py:298
converter.xar_file_writer._write_resource
def _write_resource(f, resource, indent)
Definition: xar_file_writer.py:536


naoqi_libqicore
Author(s): Aldebaran
autogenerated on Wed Sep 14 2022 02:22:41