file_writer.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 
6 
7 import os
8 import uuid
9 import xml.sax.saxutils as saxutils
10 
11 import converter.xar_types as xar_types
12 
13 
14 ENTITIES = {
15  '\x00': "�", '\x01': "",
16  '\x02': "", '\x03': "",
17  '\x04': "", '\x05': "",
18  '\x06': "", '\x07': "",
19  '\x08': "", '\x09': "	",
20  '\x0a': "
", '\x0b': "",
21  '\x0c': "", '\x0d': "
",
22  '\x0e': "", '\x0f': "",
23  '\x10': "", '\x11': "",
24  '\x12': "", '\x13': "",
25  '\x14': "", '\x15': "",
26  '\x16': "", '\x17': "",
27  '\x18': "", '\x19': "",
28  '\x1a': "", '\x1b': "",
29  '\x1c': "", '\x1d': "",
30  '\x1e': "", '\x1f': "",
31  '\"': """, '\'': "'"
32 }
33 
34 
35 def write_box_interface(f, node):
36  """ Write meta informations about a box
37 
38  :param f: open file to write informations
39  :param node: the box
40  """
41  if not node.tooltip:
42  node.tooltip = ""
43 
44  # XML header
45  f.write(u"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + os.linesep)
46 
47  # Root tag and attributes
48  f.write((u"<BoxInterface uuid=\"{}\" box_version=\"{}\" name=\"{}\"")
49  .format(uuid.uuid4(),
50  "1.0.0.0",
51  node.name))
52  if node.localization:
53  f.write((u" localization=\"{}\"")
54  .format(node.localization))
55 
56  f.write((u" tooltip=\"{}\"")
57  .format(saxutils.escape(node.tooltip, entities=ENTITIES)))
58  if node.plugin:
59  f.write((u" plugin=\"{}\"").format(node.plugin))
60  f.write((u" format_version=\"{}\" >{}").format(u"4", os.linesep))
61 
62  # bitmap elements
63  for bitmap in node.bitmaps:
64  f.write((u" <Bitmap path=\"{}\" />{}")
65  .format(bitmap.path,
66  os.linesep))
67 
68  for inp in node.inputs:
69  if not inp.tooltip:
70  inp.tooltip = ""
71  if inp.stm_value_name:
72  f.write((u" <Input name=\"{}\" signature=\"{}\""
73  + u" nature=\"{}\" stm_value_name=\"{}\" inner=\"{}\""
74  + u" tooltip=\"{}\" id=\"{}\" />{}")
75  .format(inp.name,
76  saxutils.escape(inp.signature, entities=ENTITIES),
77  inp.nature,
78  inp.stm_value_name,
79  inp.inner,
80  saxutils.escape(inp.tooltip, entities=ENTITIES),
81  inp.id,
82  os.linesep))
83  else:
84  f.write((u" <Input name=\"{}\" signature=\"{}\""
85  + u" nature=\"{}\" inner=\"{}\" tooltip=\"{}\""
86  + u" id=\"{}\" />{}")
87  .format(inp.name,
88  saxutils.escape(inp.signature, entities=ENTITIES),
89  inp.nature,
90  inp.inner,
91  saxutils.escape(inp.tooltip, entities=ENTITIES),
92  inp.id,
93  os.linesep))
94 
95  for output in node.outputs:
96  if not output.tooltip:
97  output.tooltip = ""
98  f.write((u" <Output name=\"{}\" signature=\"{}\""
99  + u" nature=\"{}\" inner=\"{}\" tooltip=\"{}\""
100  + u" id=\"{}\" />{}")
101  .format(output.name,
102  saxutils.escape(output.signature, entities=ENTITIES),
103  output.nature,
104  output.inner,
105  saxutils.escape(output.tooltip, entities=ENTITIES),
106  output.id,
107  os.linesep))
108 
109  for parameter in node.parameters:
110  if not parameter.tooltip:
111  parameter.tooltip = ""
112  f.write((u" <Parameter name=\"{}\" inherits_from_parent=\"{}\""
113  + u" type=\"{}\" default_value=\"{}\"")
114  .format(parameter.name,
115  parameter.inherits_from_parent,
116  saxutils.escape(parameter.type, entities=ENTITIES),
117  parameter.default_value))
118 
119  if (parameter.type == xar_types.IOSignature.DOUBLE
120  or parameter.type == xar_types.IOSignature.INT):
121  f.write((u" min=\"{}\" max=\"{}\"")
122  .format(parameter.min,
123  parameter.max))
124 
125  if parameter.custom_choice:
126  f.write((u" custom_choice=\"{}\"")
127  .format(parameter.custom_choice))
128 
129  if parameter.password:
130  f.write((u" password=\"{}\"")
131  .format(parameter.password))
132 
133  f.write((u" tooltip=\"{}\" id=\"{}\"")
134  .format(saxutils.escape(parameter.tooltip,
135  entities=ENTITIES),
136  parameter.id))
137  if parameter.choices:
138  f.write(u">" + os.linesep)
139  for choice in parameter.choices:
140  f.write((u" <Choice value=\"{}\" />{}")
141  .format(saxutils.escape(choice.value,
142  entities=ENTITIES),
143  os.linesep))
144  f.write(u" </Parameter>" + os.linesep)
145  else:
146  f.write(u" />" + os.linesep)
147 
148  for resource in node.resources:
149  f.write((u" <Resource name=\"{}\" lock_type=\"{}\""
150  + u" timeout=\"{}\" />{}")
151  .format(resource.name,
152  resource.lock_type,
153  resource.timeout,
154  os.linesep))
155 
156  # and the link to box implementation
157  f.write(u" <Contents>" + os.linesep)
158 
159  # does this box embed a script ?
160  if node.script:
161  if node.script.language == xar_types.ScriptLanguage.PYTHON:
162  f.write((u" <Content type=\"{}\" path=\"{}\""
163  + u" checksum=\"\" />{}")
164  .format(xar_types.ContentType.PYTHON_SCRIPT,
165  node.script.node_path + ".py",
166  os.linesep))
167  else:
168  f.write((u" <Content type=\"{}\" path=\"{}\""
169  + u" checksum=\"\" />{}")
170  .format(xar_types.ContentType.QICHAT_SCRIPT,
171  node.script.node_path + ".top",
172  os.linesep))
173 
174  # does this box embed a flow diagram ?
175  if node.timeline and node.timeline.enable == "0":
176  f.write((u" <Content type=\"{}\" path=\"{}\""
177  + u" checksum=\"\" />{}")
178  .format(xar_types.ContentType.FLOW_DIAGRAM,
179  node.timeline.node_path + ".fld",
180  os.linesep))
181 
182  # does this box embed a behaviorSequence
183  if (node.timeline
184  and node.timeline.enable == "1"
185  and node.timeline.behavior_layers):
186  f.write((u" <Content type=\"{}\" path=\"{}\""
187  + u" checksum=\"\" />{}")
188  .format(xar_types.ContentType.BEHAVIOR_SEQUENCE,
189  node.timeline.node_path + ".bhs",
190  os.linesep))
191 
192  # does this box embed an animation
193  if node.timeline and node.timeline.actuator_list:
194  f.write((u" <Content type=\"{}\" path=\"{}\""
195  + u" checksum=\"\" />{}")
196  .format(xar_types.ContentType.ANIMATION,
197  node.timeline.actuator_list.node_path + ".anim",
198  os.linesep))
199 
200  f.write(u" </Contents>" + os.linesep)
201 
202  f.write(u"</BoxInterface>" + os.linesep)
203 
204 
205 def write_behavior_sequence(f, timeline):
206  """ Write the behavior sequence file
207 
208  :param f: open file to write information
209  :param timeline: the timeline object containing the sequence
210  """
211 
212  # XML Header
213  f.write(u"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + os.linesep)
214 
215  # BehaviorSequence root tag
216  f.write((u"<BehaviorSequence fps=\"{}\" "
217  + u"start_frame=\"{}\" end_frame=\"{}\" size=\"{}\"")
218  .format(timeline.fps,
219  timeline.start_frame,
220  timeline.end_frame,
221  timeline.size))
222 
223  if timeline.resources_acquisition:
224  f.write((u" resources_acquisition=\"{}\"")
225  .format(timeline.resources_acquisition))
226 
227  f.write((u" format_version=\"{}\" >{}")
228  .format(u"4",
229  os.linesep))
230 
231  for layer in timeline.behavior_layers:
232  _write_behavior_layer(f, layer, " ")
233 
234  f.write(u"</BehaviorSequence>" + os.linesep)
235 
236 
237 def _write_behavior_layer(f, layer, indent):
238  f.write((u"{}<BehaviorLayer name=\"{}\"")
239  .format(indent,
240  layer.name))
241  if layer.mute:
242  f.write((u" mute=\"{}\"")
243  .format(layer.mute))
244  f.write((u" >{}").format(os.linesep))
245 
246  for keyframe in layer.behavior_keyframes:
247  _write_behavior_keyframe(f, keyframe, indent + " ")
248 
249  f.write((u"{}</BehaviorLayer>{}").format(indent,
250  os.linesep))
251 
252 
253 def _write_behavior_keyframe(f, keyframe, indent):
254  f.write((u"{}<BehaviorKeyframe name=\"{}\" index=\"{}\"")
255  .format(indent,
256  keyframe.name,
257  keyframe.index))
258 
259  if keyframe.bitmap:
260  f.write((u" bitmap=\"{}\"")
261  .format(keyframe.bitmap))
262 
263  f.write((u" path=\"{}\" />{}")
264  .format(keyframe.node_path + ".fld",
265  os.linesep))
266 
267 
268 def write_flow_diagram(f, flow_diagram):
269  """ Write flow diagram description
270 
271  :param f: open file to write information
272  :param flow_diagram: diagram node to write
273  """
274  # XML header
275  f.write(u"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + os.linesep)
276 
277  # Root tag
278  f.write(u"<FlowDiagram")
279 
280  if flow_diagram.scale:
281  f.write((u" scale=\"{}\"")
282  .format(flow_diagram.scale))
283 
284  f.write((u" format_version=\"{}\" >{}")
285  .format(u"4",
286  os.linesep))
287 
288  # instances of boxes used
289  for box in flow_diagram.boxes:
290  _write_box_instance(f, box, " ")
291 
292  # links between thos boxes and/or parent box
293  for link in flow_diagram.links:
294  _write_link(f, link, " ")
295 
296  f.write(u"</FlowDiagram>" + os.linesep)
297 
298 
299 def _write_box_instance(f, instance, indent):
300  f.write((u"{}<BoxInstance name=\"{}\" id=\"{}\""
301  + u" x=\"{}\" y=\"{}\" path=\"{}\"")
302  .format(indent,
303  instance.name,
304  instance.id,
305  instance.x_pos,
306  instance.y_pos,
307  instance.node_path + ".xml"))
308 
309  # if no content, close the beacon
310  if not instance.parameters and not instance.plugin_content:
311  f.write(u" />" + os.linesep)
312  return
313 
314  # else
315  f.write(u" >" + os.linesep)
316 
317  if instance.parameters:
318  for parameter in instance.parameters:
319  _write_parameter_value(f, parameter, indent + " ")
320 
321  if instance.plugin_content:
322  _write_plugin_content(f, instance.plugin_content, indent + " ")
323 
324  f.write((u"{}</BoxInstance>{}").format(indent, os.linesep))
325 
326 
327 def _write_parameter_value(f, parameter, indent):
328  f.write((u"{}<ParameterValue id=\"{}\" value=\"{}\" />{}")
329  .format(indent,
330  parameter.id,
331  parameter.value,
332  os.linesep))
333 
334 
335 def _write_plugin_content(f, pluginContent, indent):
336  """ Write XML part of the <pluginContent> beacon, inside the box
337  interface XML
338 
339  A recursive write is necessary because the content of the part
340  is completely unknown and can contain levels and levels of
341  sub-nodes
342  """
343 
344  f.write((u"{}<{}>{}").format(indent,
345  pluginContent.beacon(),
346  os.linesep))
347  for subnode in pluginContent.subnodes:
348  _write_plugin_subnode(f, subnode, indent + " ")
349  f.write((u"{}</{}>{}").format(indent,
350  pluginContent.beacon(),
351  os.linesep))
352 
353 
354 def _write_plugin_subnode(f, subnode, indent):
355  f.write((u"{}<{}").format(indent,
356  subnode.beacon()))
357  if subnode.attributes.keys():
358  for key in subnode.attributes.keys():
359  f.write((u" {}=\"{}\"").format(str(key),
360  str(subnode.attributes[key])))
361 
362  if subnode.subnodes:
363  f.write(u">" + os.linesep)
364  for subsubnode in subnode.subnodes:
365  _write_plugin_subnode(f, subsubnode, indent + " ")
366  f.write((u"{}</{}>{}").format(indent,
367  subnode.beacon(),
368  os.linesep))
369 
370  elif subnode.content:
371  f.write((u">{}</{}>{}").format(subnode.content,
372  subnode.beacon(),
373  os.linesep))
374 
375  else:
376  f.write(u"/>" + os.linesep)
377 
378 
379 def _write_link(f, link, indent):
380  f.write((u"{}<Link inputowner=\"{}\" indexofinput=\"{}\""
381  + u" outputowner=\"{}\" indexofoutput=\"{}\" />{}")
382  .format(indent,
383  link.emitterID,
384  link.indexofinput,
385  link.receiverID,
386  link.indexofoutput,
387  os.linesep))
388 
389 
390 def write_animation(f, actuator_list):
391  """ Write the animation file
392 
393  :param f: open file to write information
394  :param timeline: the timeline containing the motion layer
395  """
396  # XML Header
397  f.write(u"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + os.linesep)
398 
399  # root tag
400  f.write((u"<Animation fps=\"{}\""
401  + u" start_frame=\"{}\" end_frame=\"{}\" size=\"{}\"")
402  .format(actuator_list.parent_node.fps,
403  actuator_list.parent_node.start_frame,
404  actuator_list.parent_node.end_frame,
405  actuator_list.parent_node.size))
406 
407  if actuator_list.parent_node.resources_acquisition:
408  f.write((u" resources_acquisition=\"{}\"")
409  .format(actuator_list.parent_node.resources_acquisition))
410 
411  f.write((u" format_version=\"{}\" >{}")
412  .format(u"4",
413  os.linesep))
414 
415  f.write((u" <ActuatorList model=\"{}\" >{}")
416  .format(actuator_list.model,
417  os.linesep))
418 
419  for curve in actuator_list.curves:
420  _write_actuator_curve(f, curve, " ")
421 
422  f.write(u" </ActuatorList>" + os.linesep)
423  f.write(u"</Animation>" + os.linesep)
424 
425 
426 def _write_actuator_curve(f, curve, indent):
427  f.write((u"{}<ActuatorCurve name=\"{}\" actuator=\"{}\""
428  + u" recordable=\"{}\" mute=\"{}\" unit=\"{}\" >{}")
429  .format(indent,
430  curve.name,
431  curve.actuator,
432  curve.recordable,
433  curve.mute,
434  curve.unit,
435  os.linesep))
436 
437  for key in curve.keys:
438  _write_actuator_key(f, key, indent + " ")
439 
440  f.write((u"{}</ActuatorCurve>{}")
441  .format(indent,
442  os.linesep))
443 
444 
445 def _write_actuator_key(f, key, indent):
446  f.write((u"{}<Key frame=\"{}\" value=\"{}\""
447  + u" smooth=\"{}\" symmetrical=\"{}\"")
448  .format(indent,
449  key.frame,
450  key.value,
451  key.smooth,
452  key.symmetrical))
453 
454  if key.tangents:
455  f.write(u" >" + os.linesep)
456  for tangent in key.tangents:
457  _write_tangent(f, tangent, indent + " ")
458  f.write((u"{}</Key>{}")
459  .format(indent,
460  os.linesep))
461  else:
462  f.write(u" />" + os.linesep)
463 
464 
465 def _write_tangent(f, tangent, indent):
466  f.write((u"{}<Tangent side=\"{}\" interpType=\"{}\""
467  + u" abscissaParam=\"{}\" ordinateParam=\"{}\" />{}")
468  .format(indent,
469  tangent.side,
470  tangent.interpType,
471  tangent.abscissaParam,
472  tangent.ordinateParam,
473  os.linesep))
474 
475 
476 def write_entry_point(f, node, name):
477  """ Write the main file of the behavior
478 
479  :param f: open file to write information
480  :param node: the root node of the behavior
481  """
482 
483  # XML Header
484  f.write(u"<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" + os.linesep)
485 
486  # root tag
487  f.write((u"<ChoregrapheProject name=\"{}\" format_version=\"{}\" >{}")
488  .format(name, u"4", os.linesep))
489 
490  _write_box_instance(f, node, ' ')
491 
492  f.write(u"</ChoregrapheProject>" + os.linesep)
converter.file_writer._write_actuator_curve
def _write_actuator_curve(f, curve, indent)
Definition: file_writer.py:426
converter.file_writer.write_entry_point
def write_entry_point(f, node, name)
Definition: file_writer.py:476
converter.file_writer._write_tangent
def _write_tangent(f, tangent, indent)
Definition: file_writer.py:465
converter.file_writer._write_link
def _write_link(f, link, indent)
Definition: file_writer.py:379
converter.xar_types
Definition: xar_types.py:1
converter.file_writer._write_behavior_layer
def _write_behavior_layer(f, layer, indent)
Definition: file_writer.py:237
converter.file_writer._write_parameter_value
def _write_parameter_value(f, parameter, indent)
Definition: file_writer.py:327
converter.file_writer._write_actuator_key
def _write_actuator_key(f, key, indent)
Definition: file_writer.py:445
converter.file_writer.write_flow_diagram
def write_flow_diagram(f, flow_diagram)
Definition: file_writer.py:268
converter.file_writer._write_behavior_keyframe
def _write_behavior_keyframe(f, keyframe, indent)
Definition: file_writer.py:253
converter.file_writer.write_box_interface
def write_box_interface(f, node)
Definition: file_writer.py:35
converter.file_writer._write_box_instance
def _write_box_instance(f, instance, indent)
Definition: file_writer.py:299
converter.file_writer._write_plugin_content
def _write_plugin_content(f, pluginContent, indent)
Definition: file_writer.py:335
converter.file_writer.write_behavior_sequence
def write_behavior_sequence(f, timeline)
Definition: file_writer.py:205
converter.file_writer._write_plugin_subnode
def _write_plugin_subnode(f, subnode, indent)
Definition: file_writer.py:354
converter.file_writer.write_animation
def write_animation(f, actuator_list)
Definition: file_writer.py:390


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