Howto:Create animation XML files from Nasal: Difference between revisions
mNo edit summary |
mNo edit summary |
||
Line 3: | Line 3: | ||
Objective: Use [[Nasal]] scripting to dynamically create an XML file by using the setprop() API call to set up your XML file's PropertyList-encoded structure and then writing the result to the file system using the write_properties() wrapper found in $FG_ROOT/Nasal/io.nas. | Objective: Use [[Nasal]] scripting to dynamically create an XML file by using the setprop() API call to set up your XML file's PropertyList-encoded structure and then writing the result to the file system using the write_properties() wrapper found in $FG_ROOT/Nasal/io.nas. | ||
== Background == | |||
In general, this shouldn't really be necessary - because XML files are meant to be created and edited manually. On the other hand, due to the lack of a simple 2D drawing API accessible from Nasal, more and more complex "glass cockpit"-style instruments are getting implemented using the XML-based approach. These files (often more than 100-200 kbytes in size) contain fairly repetitive markup that could (and should) be created procedurally in and automated fashion. So, the approach suggested here is to use a separate Nasal script to create the required XML markup dynamically, rather than having to copy/paste and customize hundreds of XML animations manually. | |||
== Getting started == | == Getting started == |
Revision as of 13:43, 5 February 2012
This article is a stub. You can help the wiki by expanding it. |
Objective: Use Nasal scripting to dynamically create an XML file by using the setprop() API call to set up your XML file's PropertyList-encoded structure and then writing the result to the file system using the write_properties() wrapper found in $FG_ROOT/Nasal/io.nas.
Background
In general, this shouldn't really be necessary - because XML files are meant to be created and edited manually. On the other hand, due to the lack of a simple 2D drawing API accessible from Nasal, more and more complex "glass cockpit"-style instruments are getting implemented using the XML-based approach. These files (often more than 100-200 kbytes in size) contain fairly repetitive markup that could (and should) be created procedurally in and automated fashion. So, the approach suggested here is to use a separate Nasal script to create the required XML markup dynamically, rather than having to copy/paste and customize hundreds of XML animations manually.
Getting started
The following piece of Nasal creates a new XML file:
var location= "/temp/test/foo"; # location in the global FG property tree
var filename="test.xml"; # location in the local file system (will be OVERWRITTEN/DELETED!)
setprop(location, "hello world");
io.write_properties(filename, location);
The created output is:
<?xml version="1.0"?>
<PropertyList>
<temp>
<test>
<foo>hello world</foo>
</test>
</temp>
Once you understand how this works, you can dynamically create PropertyList-encoded XML files for your instruments.
<path>vsd.ac</path>
<animation>
<type>select</type>
<object-name>vsd</object-name>
<condition>
<greater-than-equals>
<property>systems/electrical/outputs/efis</property>
<value>9</value>
</greater-than-equals>
</condition>
</animation>
For example, to create the snippet of XML procedurally, you can use this:
var location = "/temp/test/";
var filename="xmltest.xml";
setprop(location~"path", "vsd.ac");
setprop(location~"animation/type", "select");
setprop(location~"animation/object-name", "vsd");
setprop(location~"animation/condition/greather-than-equals/property", "systems/electrical/outputs/efis");
setprop(location~"animation/condition/greather-than-equals/value", "9");
io.write_properties(filename, location);
Next, you could add a handful of helpers (or even a class wrapping animations) to make things a bit easier.