XML: Using Macros

From FSDeveloper Wiki
Jump to: navigation, search

Possibly the clearest example of XML Macro usage was posted by Tom (taquillo) in the avsim.com Aircraft & Panel Design forum:

<Macro Name="Macro1">
    (A:VELOCITY WORLD X, m/s) (A:VELOCITY WORLD Z, m/s) atg2 rnor
</Macro>
<Value>
    (A:PLANE HEADING DEGREES TRUE, radians) s0
    (L:Cage switch,bool)
    if{ 0 }
    els{ @Macro1 l0 - abs 0.5 <
       if{ @Macro1 l0 - }
       els{ @Macro1 l0 <
          if{ @Macro1 3.14159 + l0 - }
          els{ l0 3.14159 + @Macro1 - /-/ }
          }
       }
</Value>

Wherever you see "@Macro1" used, simply substitute whatever is contained in the Macro1 code!

Now it truly makes NO sense to bother with creating a @Macro unless you are planning to use the same calculation more than once or twice in any given gauge project!

Notice that in Tom's example he's used the @Macro1 five times!!! thus making the code much easier to write, read and understand...

Now, parsing the code above, the first thing Tom's done is store the value of (A:PLANE HEADING DEGREES TRUE, radians) in register s0 (s0 is a temporary memory location used only during this <Value> calculation.

This allows Tom to further simplify the if/else code because anytime he needs the value of (A:PLANE HEADING DEGREES TRUE, radians), all he needs to do is write l0 (lowercase L for "load" register 0). Note that Tom's used the l0 register five times in the if/else clause as well.

Had all of this been written out without the use of the register and the @Macro, the result would have been a very long and messy bit of code!!!!!

<Value>
(L:Cage switch,bool)
if{ 0 }
els{ (A:VELOCITY WORLD X, m/s) (A:VELOCITY WORLD Z, m/s) atg2 rnor (A:PLANE HEADING DEGREES TRUE, radians) - abs 0.5 <
  if{ (A:VELOCITY WORLD X, m/s) (A:VELOCITY WORLD Z, m/s) atg2 rnor (A:PLANE HEADING DEGREES TRUE, radians) - }
  els{ (A:VELOCITY WORLD X, m/s) (A:VELOCITY WORLD Z, m/s) atg2 rnor (A:PLANE HEADING DEGREES TRUE, radians) <
     if{ (A:VELOCITY WORLD X, m/s) (A:VELOCITY WORLD Z, m/s) atg2 rnor 3.14159 + (ALANE HEADING DEGREES TRUE, radians) - }
     els{ (A:PLANE HEADING DEGREES TRUE, radians) 3.14159 + (A:VELOCITY WORLD X, m/s) (A:VELOCITY WORLD Z, m/s) atg2 rnor - /-/           }
         }
         }
</Value>

Which do you suppose is the easier to write/read/understand and most importantly, maintain?