<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.flightgear.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Red+Leader</id>
	<title>FlightGear wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.flightgear.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Red+Leader"/>
	<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/Special:Contributions/Red_Leader"/>
	<updated>2026-04-19T00:39:14Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_November_2025&amp;diff=143281</id>
		<title>FlightGear Newsletter November 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_Newsletter_November_2025&amp;diff=143281"/>
		<updated>2025-12-19T17:01:09Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Tidy up a few links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
NOTES TO EDITORS&lt;br /&gt;
&lt;br /&gt;
* Headings&lt;br /&gt;
  * DO NOT DELETE HEADINGS prior to final cleanup&lt;br /&gt;
  * Current headings and their order is merely a suggestion based on what have been used earlier&lt;br /&gt;
  * Changes made to headings or structure should also be copied the Newsletter template http://wiki.flightgear.org/User:Skybike/Template:This_months_newsletter/Newsletter_example&lt;br /&gt;
&lt;br /&gt;
* Final cleanup before write protecting&lt;br /&gt;
  * Remove unused headings&lt;br /&gt;
  * Remove {{Appendix}} if not used.&lt;br /&gt;
  * Update &amp;quot;Category: Changes after&amp;quot; to the FG version current at the 1st of this month&lt;br /&gt;
  * Finally remove this comment&lt;br /&gt;
  * Update [[Next Newsletter]] and [[FlightGear Newsletter]]&lt;br /&gt;
&lt;br /&gt;
* Discussion, issues and suggestions&lt;br /&gt;
  * Regarding this newsletter issue, please use the discussion page&lt;br /&gt;
  * Regarding the newsletter in general, primarily use the FlightGear Newsletter discussion page (Talk:FlightGear Newsletter)&lt;br /&gt;
  * Regarding this Newsletter template, please use FIXME&lt;br /&gt;
&lt;br /&gt;
+++   {{Newsletter-header|{{#time: F | 2025-11}}}}   +++&lt;br /&gt;
--&amp;gt;{{User:Skybike/Template:Newsletter-header-translate|2025-11}}&lt;br /&gt;
{{TOC_right|limit=2}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''We would like to emphasize that the monthly newsletter cannot live without the contributions of FlightGear users and developers. Everyone with a wiki account (free to register) is welcome to contribute to the newsletter.  If you know about any FlightGear related news or projects such as for example updated scenery or aircraft, please do feel invited to add such news to the newsletter.''&lt;br /&gt;
&lt;br /&gt;
''The new Visual Editor makes editing the wiki as simple as using a Word-processor, and even easier than using the forum as you don't even need to know the syntax for a url. Just hit the 'edit' link and start.''&lt;br /&gt;
&lt;br /&gt;
== Development news ==&lt;br /&gt;
&amp;lt;!-- News about FlightGear itself.  The FlightGear mailing list and/or core developers are a good source. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- {{Disclaimer|id=final-fixed-function-release}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related Software tools and projects ==&lt;br /&gt;
=== Julia photoscenery generator ===&lt;br /&gt;
==== Photoscenery-GUI ====&lt;br /&gt;
&lt;br /&gt;
[[File:Photoscenery-GUI-20251113-202721.jpg|thumb|Photoscenery-GUI Beta]]&lt;br /&gt;
&lt;br /&gt;
Adriano Bassignana has begun writing the manual for the Photoscenery GUI, which has been published [[Julia photoscenery generator GUI]]. The manual currently contains the essential information for correct installation.&lt;br /&gt;
&lt;br /&gt;
New features in the latest version include:&lt;br /&gt;
&lt;br /&gt;
The tool, which already managed the rational downloading of tiles in various resolutions, now includes additional features accessible via its web interface to increase operational utility. The program's initialization has been modified to enable faster startup.&lt;br /&gt;
&lt;br /&gt;
A new functionality has been introduced to read airports and radio navigation aids from files updated weekly—the same data sources used by FlightGear itself. This resolves the previous issue of airport misalignment between the tool and the simulator.&lt;br /&gt;
&lt;br /&gt;
Route management has been improved. When loading a route for display on the map, the system now simultaneously loads data on local scenery to prevent unnecessary downloads. For users with a fast internet connection, real-time image downloading is possible. A fast, low-resolution preload feature also provides a valid overview of the surrounding area's coverage.&lt;br /&gt;
&lt;br /&gt;
The interface allows users to view radio navigation aids and airports, along with their key information.&lt;br /&gt;
&lt;br /&gt;
The [create route] mode enables users to generate a flight path by clicking on map points, airports, and navigation aids. Created routes can be saved and later imported into FlightGear for use.&lt;br /&gt;
&lt;br /&gt;
Many other features will be documented on the Wiki in the future.&lt;br /&gt;
&lt;br /&gt;
Source code: https://github.com/abassign/Photoscenery-GUI&lt;br /&gt;
&lt;br /&gt;
For more information, see the discussion on the FG Forum: https://forum.flightgear.org/viewtopic.php?f=5&amp;amp;t=39066&amp;amp;start=390&lt;br /&gt;
&lt;br /&gt;
==== Photoscenery-CLI ====&lt;br /&gt;
&lt;br /&gt;
For all users of the Julia photoscenery in terminal in its pre-GUI version, it is a pleasure to report that the previously released &amp;quot;beta 5&amp;quot; version of Adriano Bassignana's Julia/Photoscenery (before development began on the GUI version, ver. 6) continues to work well on Flightgear installations in a Windows 10 (and possibly 11) environment. More info. on that may be found under [https://forum.flightgear.org/viewtopic.php?f=5&amp;amp;t=39066&amp;amp;start=435#p436792 this post] on the FG forum.&lt;br /&gt;
&lt;br /&gt;
=== Framework for Canvas Add-on ===&lt;br /&gt;
&lt;br /&gt;
Roman Ludwicki (PlayeRom on the forum) created a [https://github.com/PlayeRom/flightgear-addon-framework framework] for creating add-ons based on Canvas dialog boxes. After creating numerous add-ons, he realized he needed to separate the common code base. This led to the creation of a separate Framework project that could be attached to any add-on. The framework includes the following features:&lt;br /&gt;
&lt;br /&gt;
# Automatic recognition and loading of add-on Nasal files into the appropriate namespaces (with an exclusion list if necessary).&lt;br /&gt;
# Ability to add a menu for restarting add-on Nasal files without having to change repository files.&lt;br /&gt;
# Ability to define keys for the multi-key command to restart add-on Nasal files without having to change repository files.&lt;br /&gt;
# A mechanism for checking whether there is a new version of your add-on to inform users about it.&lt;br /&gt;
# Base classes for Canvas windows that are created and destroyed on demand (Transient dialog), as well as created once during simulator startup (Persistent dialog).&lt;br /&gt;
# Ability to create Nasal unit tests and run them using multi-key command.&lt;br /&gt;
&lt;br /&gt;
An example project using the Framework is the [https://github.com/PlayeRom/flightgear-addon-canvas-skeleton Canvas Skeleton] project, which can be used as a basis for creating a new add-on.&lt;br /&gt;
&lt;br /&gt;
You can also see how his other add-ons are written, all based on the Framework (main branches):&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-aerotow-everywhere Aerotow Everywhere]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-logbook Logbook]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-which-runway Which Runway]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-nasal-namespace-browser Nasal Namespace Browser]&lt;br /&gt;
# [https://github.com/PlayeRom/flightgear-addon-menu-aggregator Add-on Menu Aggregator]&lt;br /&gt;
&lt;br /&gt;
=== Add-ons Menu Aggregator ===&lt;br /&gt;
&lt;br /&gt;
Roman Ludwicki has created a new &amp;quot;[https://github.com/PlayeRom/flightgear-addon-menu-aggregator Add-ons Menu Aggregator]&amp;quot; add-on. The &amp;quot;Add-ons Menu Aggregator&amp;quot; add-on solves the problem of increasing menu clutter in FlightGear, which occurs after installing multiple add-ons. Each add-on can add its own items to the main menu, causing it to become very large and, at low resolutions, extend beyond the screen. This makes it difficult for users to find functions related to specific add-ons, and the menu itself becomes unreadable.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Add-ons Menu Aggregator&amp;quot; automatically aggregates menu entries from all installed add-ons and places them into one common menu item – &amp;quot;Add-ons.&amp;quot; Each add-on receives its own submenu here, containing its original items while maintaining full functionality and layout.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|gNH3MBpRxjo|480px||Add-ons Menu Aggregator - Polish audio}}&lt;br /&gt;
&lt;br /&gt;
== In the hangar ==&lt;br /&gt;
&amp;lt;!-- News about new and upgraded aircraft and related stuff. The official forum and other ones usually are a good source for this. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === New aircraft === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Updated aircraft === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Liveries === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Instruments === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === Aircraft reviews === --&amp;gt;&lt;br /&gt;
=== Aircraft reviews ===&lt;br /&gt;
==== Laminar 13 Hang Glider for FlightGear ====&lt;br /&gt;
&lt;br /&gt;
===== Flight Test &amp;amp; Personal Tweaks by VonS =====&lt;br /&gt;
Having recently become interested in gliding and soaring in FG, VonS thought to go a (simpler) step further and merely strapped a wing to themselves (or themselves to a wing). That of course was also a good opportunity to harmonize further a few of the control inputs on the Laminar 13 for their rig/setup, as well as (subtly) to modify some of the weight shifts, drag and lift values, etc. Representative clip below for those who enjoy hang gliders, both real ones and in the world of FG.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|tHQqhl3Sf5w|||Laminar 13 Hang Glider for FlightGear. Flight Test &amp;amp; Tweaks by Vons |frame}}&lt;br /&gt;
&lt;br /&gt;
If you're interested in seeing the flight test results and accessing the latest tweaks, visit the FG forum page at: https://forum.flightgear.org/viewtopic.php?f=19&amp;amp;t=42893&amp;amp;start=45#p436600&lt;br /&gt;
&lt;br /&gt;
===== Additional Tweaks Information =====&lt;br /&gt;
&lt;br /&gt;
FlightGear users interested in these custom tweaks may also want to check the recent gliders updates (October and November 2025) for the [https://forum.flightgear.org/viewtopic.php?f=4&amp;amp;t=43713&amp;amp;start=105#p435385 ASK 13 tweaks] and [https://forum.flightgear.org/viewtopic.php?f=4&amp;amp;t=43713&amp;amp;start=105#p436217 ASG 29 tweaks]&lt;br /&gt;
&lt;br /&gt;
Review the posts carefully before downloading. Many of these adjustments, including lift, drag, and control harmonization values, were later applied to the Laminar hang glider as subtle improvements.&lt;br /&gt;
&lt;br /&gt;
These tweaks were tested in FG 2020.3.19 and should be compatible with current versions. All mentioned gliders use JSBSim flight dynamics models (FDM).&lt;br /&gt;
&lt;br /&gt;
For YASim-based tweaks by VonS, please contact him directly via PM on the FG forum, as most were not publicly released. Some exceptions are included in recent updates to Emmanuel Baranger's aircraft at the &amp;quot;Helijah FG Hangar.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Links to various modifications can be found at the bottom of the contributor's forum posts [https://forum.flightgear.org/viewtopic.php?f=3&amp;amp;t=43735 &amp;quot;Von S Various Mods&amp;quot;]. For a broader overview, see the VonS Various Mods thread in &amp;quot;Hangar Talk.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
VonS began FDM tweaking in the mid-2010s, focusing on early 1900s and WWI aircraft, and has contributed significantly to FlightGear's open-source flexibility. For early aviation examples, see [https://forum.flightgear.org/viewtopic.php?f=4&amp;amp;t=43872&amp;amp;start=15 the Sopwith Camel thread (November 2025)] which also includes detailed technical posts by S&amp;amp;J, Lester-Boffo, Alant, and himself.&lt;br /&gt;
&lt;br /&gt;
== Scenery corner ==&lt;br /&gt;
&amp;lt;!-- Scenery development news --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Scenery Models === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Airports === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Land cover === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Osm2city === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === New OSM2City areas === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Interview with a contributor == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Suggested flights == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == AI == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI traffic === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- === AI scenarios === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Community news ==&lt;br /&gt;
&amp;lt;!-- === FlightGear on YouTube === --&amp;gt;&lt;br /&gt;
&amp;lt;!-- embed video as {{#ev:youtube|VCc6PwRI1LA}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Forum news === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Wiki updates === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === Article of the month === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Multiplayer events ==&lt;br /&gt;
&amp;lt;!-- === Upcoming events === --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Finished events ===&lt;br /&gt;
==== Independence Day Event 2025 ====&lt;br /&gt;
To celebrate Poland's Independence Day, the Polish Discord channel organized an Air Show with several performances. Clips are included in the video:&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|ekiLpbSXAmU|480px||Independence Day Event 2025}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == FlightGear events == --&amp;gt;&lt;br /&gt;
&amp;lt;!-- For example presence at FSWeekend --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- == Hardware reviews == --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Screenshot of the Month ==&lt;br /&gt;
&amp;lt;!--FlightGear's Screenshot of the Month {{#time: F | 2025-05}} 2025 is FIXME by {{usr|FIXME}}&lt;br /&gt;
ADD IMAGE --&amp;gt;&lt;br /&gt;
If you want to participate in the screenshot contest&amp;lt;!-- of {{#time: F | 2025-05 + 1month}}--&amp;gt;, you can submit your candidate to the {{forum link|title=this|f=88|t=}}. Be sure to see the first post for participation rules. For purposes of convenience and organization, at the end of the month or after 20 entries have been submitted, a new forum topic will be started containing all shots in an easy-to-view layout. The voting will then take place there.&amp;lt;!--Once the voting has finished, the best screenshot will be presented in the Newsletter edition of {{#time: F | 2025-05 + 1month}}--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Appendix}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[Category:Changes after 2024.1]]--&amp;gt;&lt;br /&gt;
&amp;lt;!--Has a new version been released this month? Use previous version!--&amp;gt;&lt;br /&gt;
[[Category:FlightGear Newsletter|2025 11]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--[[de:FlightGear Newsletter {{#time: F Y | 2025-05 | de }}]]--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=British_Aerospace_Sea_Harrier&amp;diff=143280</id>
		<title>British Aerospace Sea Harrier</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=British_Aerospace_Sea_Harrier&amp;diff=143280"/>
		<updated>2025-12-19T16:55:01Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Fix spelling; remove rotted link to Art Nalls' website&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{:{{PAGENAME}}/info}}&lt;br /&gt;
The '''British Aerospace Sea Harrier''' (informally '''Shar''') is a naval short take-off and vertical-landing/vertical take-off and landing jet fighter, reconnaissance and attack aircraft, and a development of the [[Hawker Siddeley Harrier GR1|Hawker Siddeley Harrier]]. It first entered service with the Royal Navy in April 1980 as the Sea Harrier {{abbr|FRS1|Fighter, Reconnaissance, Strike, Mk. 1}} and became informally known as the &amp;quot;Shar&amp;quot; ('''S'''ea '''Har'''rier). Unusual in an era in which most naval and land-based air superiority fighters were large and supersonic, the principal role of the subsonic Sea Harrier was to provide air defence of the fleet from Royal Navy aircraft carriers.  Retired in 2006, today there is only one airworthy Sea Harrier in the world.  XZ439, a restored former Royal Navy Sea Harrier FA2, is operated in the United States by Art Nalls, a former USMC pilot.&lt;br /&gt;
&lt;br /&gt;
The version currently modelled in [[FlightGear]] is the Sea Harrier {{abbr|FA2|Fighter, Attack, Mk. 2}}, an improved version with the {{wikipedia|Blue Vixen}} radar and the {{wikipedia|AIM-120 AMRAAM}} missile.&lt;br /&gt;
&lt;br /&gt;
== Keyboard controls ==&lt;br /&gt;
{| class=&amp;quot;keytable&amp;quot;&lt;br /&gt;
! Key&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|m}}&lt;br /&gt;
|Vector thrust upwards&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|Shift|m}}&lt;br /&gt;
|Vector thrust downwards&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|h}}&lt;br /&gt;
|Toggle HUD on/off&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|j}}&lt;br /&gt;
|Decrease air brake&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|k}}&lt;br /&gt;
|Increase air brake&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|e}}&lt;br /&gt;
|Release ordinance/fire gun&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|w}}&lt;br /&gt;
|Cycle stick mode selector&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|Ctrl|w}}&lt;br /&gt;
|Toggle station arming&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|Ctrl|f}}&lt;br /&gt;
|Release countermeasure&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|1}}/{{key press|2}}/{{key press|3}}/{{key press|4}}/{{key press|5}}/{{key press|6}}/{{key press|7}}&lt;br /&gt;
|Select station&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|Shift|&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
|Autostart&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|Shift|c}}&lt;br /&gt;
|Toggle canopy&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|n}}&lt;br /&gt;
|Next target&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|Ctrl|n}}&lt;br /&gt;
|Previous target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* A fully working weapons system, including realistic stores and gun behaviour&lt;br /&gt;
* Semi-realistic startup&lt;br /&gt;
* [[Bombable]] support&lt;br /&gt;
* [[Rembrandt]] support&lt;br /&gt;
* Full electrical system, including switchable instruments &lt;br /&gt;
* [[Aircraft Checklists|Checklists]] and [[Tutorials]] support&lt;br /&gt;
* Realistic [[autopilot]]&lt;br /&gt;
* Modeled limits&lt;br /&gt;
* [[Canvas]] {{abbr|HDD|Head-down Display}}&lt;br /&gt;
* Flare/chaff system&lt;br /&gt;
* {{abbr|CCIP|Constantly-Computed Impact Point}} bombing system&lt;br /&gt;
* {{abbr|RWR|Radar Warning Receiver}} &lt;br /&gt;
* Bombable-compatible AI aircraft&lt;br /&gt;
* Fuel System&lt;br /&gt;
* [[Instant Replay]] support&lt;br /&gt;
* Custom failures based on the new [[A Failure Management Framework for FlightGear|custom failures framework]].&lt;br /&gt;
* Backwards compatibility (tested on both FG 3.2 and 2.12.0)&lt;br /&gt;
* [[Howto:Implement pushback|Pushback]] truck&lt;br /&gt;
&lt;br /&gt;
== Changes for the latest release (2.5.0) ==&lt;br /&gt;
* Nasal code style cleaned up&lt;br /&gt;
* All XML files encoded in UTF-8 w/o BOM; encoding added in headers&lt;br /&gt;
* Throttle and thrust vector levers fixed.&lt;br /&gt;
* Canvas HDD properly integrated&lt;br /&gt;
* Start Canvas-based radar&lt;br /&gt;
* All paths are now relative&lt;br /&gt;
* Some changes to the cockpit&lt;br /&gt;
* Some more bugfixes&lt;br /&gt;
* New splash texture&lt;br /&gt;
* License changed back to GNU GPL v2&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
&amp;lt;big&amp;gt;Last updated 23 June 2016&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== For next release (2.6.0) ===&lt;br /&gt;
* Update docs&lt;br /&gt;
* Make new FDM&lt;br /&gt;
* Unify radar&lt;br /&gt;
&lt;br /&gt;
=== Cockpit ===&lt;br /&gt;
* More detailed cockpit (more info required)&lt;br /&gt;
&lt;br /&gt;
=== Model ===&lt;br /&gt;
* Better, more detailed model&lt;br /&gt;
* British 1,000lb bomb&lt;br /&gt;
&lt;br /&gt;
=== Systems ===&lt;br /&gt;
* New radar (possibly using [[Canvas Radar]])&lt;br /&gt;
* Autoland system&lt;br /&gt;
* Realistic {{abbr|SMS|Stores Management System}}&lt;br /&gt;
&lt;br /&gt;
=== FDM ===&lt;br /&gt;
* More realistic (data needed)&lt;br /&gt;
&lt;br /&gt;
=== General ===&lt;br /&gt;
* New [[Canvas Widgets|Canvas dialogs]]&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
=== FDM ===&lt;br /&gt;
* Aircraft swings on the ground.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [https://forum.flightgear.org/viewtopic.php?f=4&amp;amp;t=24711 Forum topic]&lt;br /&gt;
* [https://www.dropbox.com/s/kot5l0x8oi9k5oy/AI%20harrier%20%26%20scenario.zip?dl=0 Bombable-compatible AI aircraft and scenario]&lt;br /&gt;
&lt;br /&gt;
=== External links ===&lt;br /&gt;
* {{wikipedia|British Aerospace Sea Harrier|noicon=1}} (Wikipedia)&lt;br /&gt;
* [http://www.naval-technology.com/projects/fa2-sea-harrier/ Sea Harrier] (naval-technology.com)&lt;br /&gt;
&lt;br /&gt;
{{British Aerospace}}&lt;br /&gt;
&lt;br /&gt;
{{air-to-air refueling}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Howto:Add_aerotow_hitch_to_an_AI-aircraft&amp;diff=143176</id>
		<title>Howto:Add aerotow hitch to an AI-aircraft</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Howto:Add_aerotow_hitch_to_an_AI-aircraft&amp;diff=143176"/>
		<updated>2025-12-07T21:06:17Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;For the visualization of the tow rope, it is advantageous if a hitch position is defined for the AI tow plane.&lt;br /&gt;
&lt;br /&gt;
To set the hitch position for the AI aircraft, add the following code to the top of the &amp;lt;tt&amp;gt;{aircraft}-ai.xml&amp;lt;/tt&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nasal&amp;gt;&lt;br /&gt;
  &amp;lt;load&amp;gt;&lt;br /&gt;
   var rplayer = cmdarg();&lt;br /&gt;
   rplayer.getNode(&amp;quot;sim/hitches/aerotow/local-pos-x&amp;quot;,1).setValue(&amp;quot;x&amp;quot;);  &lt;br /&gt;
   rplayer.getNode(&amp;quot;sim/hitches/aerotow/local-pos-y&amp;quot;,1).setValue(&amp;quot;y&amp;quot;); &lt;br /&gt;
   rplayer.getNode(&amp;quot;sim/hitches/aerotow/local-pos-z&amp;quot;,1).setValue(&amp;quot;z&amp;quot;); &lt;br /&gt;
  &amp;lt;/load&amp;gt;&lt;br /&gt;
  &amp;lt;unload&amp;gt;&lt;br /&gt;
   rplayer.getNode(&amp;quot;sim/hitches&amp;quot;).remove();&lt;br /&gt;
  &amp;lt;/unload&amp;gt;&lt;br /&gt;
&amp;lt;/nasal&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;!-- Rest of content here --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PropertyList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In place of x, y, z, enter appropriate values for the hitch position.&lt;br /&gt;
Coordinate system: x forward, y to the left, and z up. The units are meters.&lt;br /&gt;
&lt;br /&gt;
That's it! The tow rope ends at the defined position.&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
* [[Soaring]]&lt;br /&gt;
* [[Improving Glider Realism]]&lt;br /&gt;
* [[Howto:Setup winch and aerotowing for JSBSim-aircraft]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Howto]]&lt;br /&gt;
[[Category:Aircraft enhancement]]&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Property_browser&amp;diff=139789</id>
		<title>Property browser</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Property_browser&amp;diff=139789"/>
		<updated>2024-04-28T16:31:02Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Apply templates; internal formatting; move Olsen quote and improve citation; typo fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Property_Browser.jpg|thumb|270px|The property browser window]]&lt;br /&gt;
{{PropertyTree}}&lt;br /&gt;
&lt;br /&gt;
The [[FlightGear]] '''property browser''' is a dialog used to browse, in-simulator, through all properties. Properties are internal, runtime state variables in FlightGear. The property browser cannot only be used to inspect all sorts of internal variables at runtime, but it can also be used to change the values of most properties easily (some being conceptually read-only, i.e. because they're exclusively written-to by a certain subsystem such as the FDM). For instance, you cannot change your frame rate by changing the frame counter obviously. &lt;br /&gt;
&lt;br /&gt;
== Opening the property browser ==&lt;br /&gt;
The property browser can be opened while FlightGear is running either:&lt;br /&gt;
* By pressing the {{key press|/}} key (forward slash)&lt;br /&gt;
* Through the main [[menubar|menu]]: &amp;lt;tt&amp;gt;Debug &amp;gt; Browse Internal Properties&amp;lt;/tt&amp;gt; (in older version: &amp;lt;tt&amp;gt;File &amp;gt; Browse Internal Properties&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Browse around to see the different data fields that are available. Just about everything interesting/useful is published in the property system. The browser allows you to inspect and even change values in the live running copy of FG.&lt;br /&gt;
&lt;br /&gt;
=== Property Key Handler ===&lt;br /&gt;
&lt;br /&gt;
The property key handler provides a better experience for developers when using the property tree and is suited to keyboard operations. See [[Property Key Handler]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Tied properties ==&lt;br /&gt;
Some properties are so called ''tied'' properties which are directly mapped to internal C++ variables and they cannot be modified using the property browser, we are currently trying to get rid of tied properties, see [[Howto:Use Property Tree Objects]] for details.&lt;br /&gt;
&lt;br /&gt;
In addition, even some non-tied properties cannot be modified because they are by default constantly written/modified by another subsystem (in C++/Nasal space), possibly updating properties at frame rate, this applies for example to the frame rate counter, which is constantly updated by C++ code - so trying to set it from Nasal would be kind of pointless.&lt;br /&gt;
&lt;br /&gt;
Also certain properties are only read/applied during initialization/re-initialization (startup/reset) of the sim, while others require the corresponding subsystems to be reinitialized.&lt;br /&gt;
&lt;br /&gt;
{{Note|{{cquote|1=&lt;br /&gt;
The origin of tied properties was largely to address &amp;quot;hypothetical&amp;quot; performance concerns in the early days. Coders could continue to use native compiled variables and simultaneously expose them to the property system. Early property system skepticism included issues like performance and use of global structures. Those have largely not proven out to be actual issues. So without looking deep into how much effort/change/impact this would require, I think for the most part the whole tied property aspect of the API could go away and the property system API would simplify quite a bit.&lt;br /&gt;
|2={{cite web|url=https://sourceforge.net/p/flightgear/mailman/message/37280934/|author=Curtis Olson|title=Re: &amp;amp;lsqb;Flightgear-devel&amp;amp;rsqb; Making Simgear properties threadsafe|date=12&amp;lt;sup&amp;gt;th&amp;lt;/sup&amp;gt; May 2021}}}}}}&lt;br /&gt;
&lt;br /&gt;
== Tips and tricks ==&lt;br /&gt;
Apart from setting a property by clicking it and using the text field and Set button, there is many things that can be done through the property browser:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Mouse click while holding on keyboard !! Function !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| {{key press|Ctrl}}&lt;br /&gt;
| on '.' toggle verbose mode&lt;br /&gt;
on '..' goto root&lt;br /&gt;
on any bool property: toggle true/false value&lt;br /&gt;
| Verbose mode is explained below&lt;br /&gt;
|-&lt;br /&gt;
| {{key press|Shift}}&lt;br /&gt;
| on '.' dump properties to console&lt;br /&gt;
display property in top left corner of the flightgear screen&lt;br /&gt;
| To ''remove the property'', {{key press|Ctrl|Shift}} and click on another property&lt;br /&gt;
|-&lt;br /&gt;
| {{key press|Alt}}&lt;br /&gt;
| toggle trace_write attribute of the selected property&lt;br /&gt;
| Since 04/2024 on 'next'; details below in 'verbose mode'&lt;br /&gt;
|-&lt;br /&gt;
| {{key press|Ctrl|Alt}}&lt;br /&gt;
| toggle trace_read attribute of the selected property&lt;br /&gt;
| Since 04/2024 on 'next'; details below in 'verbose mode'&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Verbose mode ==&lt;br /&gt;
In verbose mode, toggled by ctrl-clicking an &amp;quot;&amp;lt;tt&amp;gt;.&amp;lt;/tt&amp;gt;&amp;quot; entry or toggling &amp;lt;code&amp;gt;/sim/gui/dialogs/property-browser/show-flags&amp;lt;/code&amp;gt;, some additional information is shown as flags like this&lt;br /&gt;
&lt;br /&gt;
 foo = '123.456' (double; AT) &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Flag !! Meaning !! Comment&lt;br /&gt;
|-&lt;br /&gt;
| r || Read protected || Showing that a property can not be read.&lt;br /&gt;
|-&lt;br /&gt;
| w || Write protected || Showing that a property can not be written to.&lt;br /&gt;
|-&lt;br /&gt;
| R || Trace read operations || rowspan=&amp;quot;2&amp;quot; | In &amp;lt;code&amp;gt;--log-level=info&amp;lt;/code&amp;gt; create log line with TRACE prefix on write/read operation; set with &amp;lt;code&amp;gt;&amp;lt;foo trace-write=&amp;quot;y&amp;quot;&amp;gt;&amp;lt;/code&amp;gt;.&lt;br /&gt;
Since 04/2024 on next R and W flag can be set on the fly via the property browser (see above)&lt;br /&gt;
|-&lt;br /&gt;
| W || Trace write operations&lt;br /&gt;
|-&lt;br /&gt;
| A || Archive bit set || Makes writeProperties() also save this property in restricted mode (&amp;quot;save flight&amp;quot;), while all others are only saved in full mode.&lt;br /&gt;
|-&lt;br /&gt;
| U || User archive bit set || Saved into ~/.fgfs/autosave.xml, and restored next time. &amp;lt;!-- When FlightGear starts? --&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| T || Tied property || Only the C/C++ code that owns a tied property can write to it. Also, listeners will not be triggered.&lt;br /&gt;
|-&lt;br /&gt;
| L&amp;lt;N&amp;gt; || Number of listeners&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|=&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
|Alias target&lt;br /&gt;
|This prop is an alias for &amp;lt;path&amp;gt; (since 04/2024 on 'next')&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{FGCquote&lt;br /&gt;
|1= &amp;lt;pre&amp;gt;props.globals.getNode(&amp;quot;/sim/aircraft&amp;quot;).getAttribute(&amp;quot;references&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
does now return the reference counter -- the number of co-owners&lt;br /&gt;
of the shared pointer. This is really only useful for debugging.&lt;br /&gt;
And here's again a summary of all the attribute names:&lt;br /&gt;
&lt;br /&gt;
 children    ... returns number of children (faster than size(n.getChildren()!)&lt;br /&gt;
 listeners   ... return number of attached listeners&lt;br /&gt;
 references  ... returns number of co-owners (+ 2 for own consumption)&lt;br /&gt;
 tied        ... returns whether a node is &amp;quot;tied&amp;quot; (in which case listeners&lt;br /&gt;
                 might not get triggered)&lt;br /&gt;
 alias       ... whether the node is an alias to another node&lt;br /&gt;
 read        ... whether the node is read-protected&lt;br /&gt;
 write       ... whether the node is write-protected&lt;br /&gt;
 archive     ... whether the &amp;quot;archive&amp;quot; flag is set, which makes the&lt;br /&gt;
                 node saved with &amp;quot;Save Flight&amp;quot; in the menu&lt;br /&gt;
 trace-read  ... whether the node is being traced for read operations&lt;br /&gt;
 trace-write ... whether the node is being traced for write operations&lt;br /&gt;
 userarchive ... whether the node will be saved to ~/.fgfs/autosave.xml&lt;br /&gt;
                 on exit&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
|2= {{cite web&lt;br /&gt;
  | url    = http://sourceforge.net/p/flightgear/mailman/message/15645291/&lt;br /&gt;
  | title  = &amp;lt;nowiki&amp;gt;Re: [Flightgear-devel] FlightGear/Plib periodic stutter notes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | author = &amp;lt;nowiki&amp;gt;Melchior FRANZ&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
  | date   = Oct 21st, 2007&lt;br /&gt;
  | added   = Oct 21st, 2007&lt;br /&gt;
  | script_version = 0.25&lt;br /&gt;
  }}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Other ways to open the property browser ==&lt;br /&gt;
=== Forcing open the browser on startup ===&lt;br /&gt;
You can force the browser to open on startup, through the following command:&lt;br /&gt;
 --prop:browser=/sim/path/that/you/want/to/show&lt;br /&gt;
&lt;br /&gt;
More than one property browser can be opened like this.&lt;br /&gt;
 --prop:browser=position --prop:browser[1]=orientation&lt;br /&gt;
&lt;br /&gt;
=== Opening the property browser through nasal ===&lt;br /&gt;
Calling &amp;lt;code&amp;gt;gui.property_browser(&amp;lt;path&amp;gt;)&amp;lt;/code&amp;gt; opens a property browser for &amp;lt;path&amp;gt;.  While it can be called more than once, though all the dialogues will be drawn on top of each other in the centre of the screen. Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
settimer(func {&lt;br /&gt;
    gui.property_browser(&amp;quot;/position&amp;quot;);&lt;br /&gt;
    gui.property_browser(&amp;quot;/orientation&amp;quot;);&lt;br /&gt;
}, 0);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Displaying On-Screen property values through nasal ===&lt;br /&gt;
Create a file (let's call it display-props.nas) with instructions such below:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nasal&amp;quot;&amp;gt;&lt;br /&gt;
# On-screen displays&lt;br /&gt;
var enableOSD = func {&lt;br /&gt;
    var left  = screen.display.new(20, 10);&lt;br /&gt;
    var right = screen.display.new(-300, 10);&lt;br /&gt;
&lt;br /&gt;
    left.add(&amp;quot;/orientation/heading-deg&amp;quot;);&lt;br /&gt;
    left.add(&amp;quot;/environment/wind-from-heading-deg&amp;quot;);&lt;br /&gt;
    left.add(&amp;quot;/environment/wind-speed-kt&amp;quot;);&lt;br /&gt;
    right.add(&amp;quot;/controls/flight/rudder&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
enableOSD();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add the path/to/display-props.nas in your aircraft-set.xml or in your $FG_HOME/ inside a Nasal/ folder.&lt;br /&gt;
&lt;br /&gt;
== Related content ==&lt;br /&gt;
=== Wiki articles ===&lt;br /&gt;
* [[Property Key Handler]]&lt;br /&gt;
&lt;br /&gt;
=== Source code ===&lt;br /&gt;
* {{fgdata source|path=gui/dialogs/property-browser.xml}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Menubar]]&lt;br /&gt;
[[Category:Property Tree]]&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_wiki:Village_pump&amp;diff=139046</id>
		<title>FlightGear wiki:Village pump</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_wiki:Village_pump&amp;diff=139046"/>
		<updated>2024-01-30T21:58:32Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NEWSECTIONLINK__&lt;br /&gt;
{{Archives|[[/Archive 2012|2012]]|[[/Archive 2013|2013]]|[[/Archive 2014|2014]]|[[/Archive 2015|2015]]|[[/Archive 2016|2016]]|[[/Archive 2017|2017]]|[[/Archive 2018|2018]]|[[/Archive 2019|2019]]|[[/Archive 2020|2020]]|[[/Archive 2021|2021]]|[[/Archive 2022|2022]]}}&lt;br /&gt;
{{shortcut|FGW:VP}}&lt;br /&gt;
&lt;br /&gt;
Welcome to the '''Village Pump'''. This page is used to discuss the technical issues, operations and guidelines of the [[FlightGear wiki]].&lt;br /&gt;
&lt;br /&gt;
Please &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[{{fullurl:{{FULLPAGENAME}}|action=edit&amp;amp;section=new}} add new topics]&amp;lt;/span&amp;gt; to the '''bottom''' of this page.&lt;br /&gt;
&lt;br /&gt;
Old discussions should be moved to a [[FlightGear wiki:Village pump/Archive YEAR]]. These discussions can then be moved to a relevant talk page if appropriate.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== MediaWiki updated to 1.39.6 ==&lt;br /&gt;
&lt;br /&gt;
We have updated MediaWiki to its latest LTS version 1.39.6 today. Although we've tested the update, chances are that we've missed certain scenarios or features. Please report any issues that you may encounter.&lt;br /&gt;
&lt;br /&gt;
[[User:Gijs|Gijs]] ([[User talk:Gijs|talk]]) 09:31, 30 January 2024 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Embedded YouTube videos broken ==&lt;br /&gt;
&lt;br /&gt;
It seems that the [[mw:Extension:EmbedVideo|EmbedVideo extension]] was removed at some point. Consequently, pages such as [[Howto:Creating FlightGear Promo Videos]] are broken. At present, the best replacements seems to be [[mw:Extension:EmbedVideo_(fork)|a fork]] and [[mw:Extension:YouTube|Extension:YouTube]].&lt;br /&gt;
&lt;br /&gt;
—'''''[[User:Red Leader|&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Red Leader&amp;lt;/span&amp;gt;]]''''' ([[User talk:Red Leader|talk]], [[Special:Contributions/Red Leader|contribs]]) 19:21, 30 January 2024 (UTC)&lt;br /&gt;
&lt;br /&gt;
: Hi,&lt;br /&gt;
: Thanks for the report. It was introduced by today's update, but should be fixed now.&lt;br /&gt;
: [[User:Gijs|Gijs]] ([[User talk:Gijs|talk]]) 21:21, 30 January 2024 (UTC)&lt;br /&gt;
&lt;br /&gt;
:: Confirmed, thanks. And I’d completely forgotten about {{[[Template:Wikipedia|wikipedia]]}}. 😅&lt;br /&gt;
:: '''''[[User:Red Leader|&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Red Leader&amp;lt;/span&amp;gt;]]''''' ([[User talk:Red Leader|talk]], [[Special:Contributions/Red Leader|contribs]]) 21:57, 30 January 2024 (UTC)&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Template:Archives&amp;diff=139043</id>
		<title>Template:Archives</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Template:Archives&amp;diff=139043"/>
		<updated>2024-01-30T19:24:59Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Missed a bit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; clear: right;&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align: center; font-size: 85%; background-color: #f9f9f9; border: 1px solid #aaa; padding: 5px; margin: 1em 0;&amp;quot;&lt;br /&gt;
| [[File:Replacement filing cabinet.png|40px|alt=|link=]]&amp;lt;br&amp;gt;'''[[Help:Archiving a talk page|Archives]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{{1|{{error|Please add at&amp;lt;br&amp;gt;least one parameter}}}}}{{#if: {{{2|}}} | , {{{2}}} }}&lt;br /&gt;
|-&lt;br /&gt;
{{#if: {{{3|}}} | {{!}} {{{3}}}{{#if: {{{4|}}} | , {{{4}}} }} }}&lt;br /&gt;
|-&lt;br /&gt;
{{#if: {{{5|}}} | {{!}} {{{5}}}{{#if: {{{6|}}} | , {{{6}}} }} }}&lt;br /&gt;
|-&lt;br /&gt;
{{#if: {{{7|}}} | {{!}} {{{7}}}{{#if: {{{8|}}} | , {{{8}}} }} }}&lt;br /&gt;
|-&lt;br /&gt;
{{#if: {{{9|}}} | {{!}} {{{9}}}{{#if: {{{10|}}} | , {{{10}}} }} }}&lt;br /&gt;
|-&lt;br /&gt;
{{#if: {{{11|}}} | {{!}} {{{11}}}{{#if: {{{12|}}} | , {{{12}}} }} }}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
{{Informative template|1=&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Usage ==&lt;br /&gt;
This template is for containing links to [[Help:Archiving a talk page|archives of talk pages]].&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
 {{obr}}'''Archives'''{{!}}archive{{!}}''archive 2''{{!}}''archive 3''{{!}}''archive 4''{{!}}''archive 5''{{!}}''archive 6''{{!}}''archive 7''{{!}}''archive 8''{{!}}''archive 9''{{!}}''archive 10''{{!}}''archive 11''{{!}}''archive 12''{{cbr}}&lt;br /&gt;
&lt;br /&gt;
; archive (''1-12'') : Link to archive. Only the first one is mandatory.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Archives|[[/Archive 2014|2014]]}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{Archives|[[/Archive 2014|2014]]}}{{-}}&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Archives|[[/Archive 2012|2012]]|[[/Archive 2013|2013]]|[[/Archive 2014|2014]]}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{Archives|[[/Archive 2012|2012]]|[[/Archive 2013|2013]]|[[/Archive 2014|2014]]}}{{-}}&lt;br /&gt;
&lt;br /&gt;
== Related templates ==&lt;br /&gt;
* {{tl|Talk archive}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Template:Archives&amp;diff=139042</id>
		<title>Template:Archives</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Template:Archives&amp;diff=139042"/>
		<updated>2024-01-30T19:23:12Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Looks like we have to expand the options to support the Village Pump.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float: right; clear: right;&amp;quot;&amp;gt;&lt;br /&gt;
{| style=&amp;quot;text-align: center; font-size: 85%; background-color: #f9f9f9; border: 1px solid #aaa; padding: 5px; margin: 1em 0;&amp;quot;&lt;br /&gt;
| [[File:Replacement filing cabinet.png|40px|alt=|link=]]&amp;lt;br&amp;gt;'''[[Help:Archiving a talk page|Archives]]'''&lt;br /&gt;
|-&lt;br /&gt;
| {{{1|{{error|Please add at&amp;lt;br&amp;gt;least one parameter}}}}}{{#if: {{{2|}}} | , {{{2}}} }}&lt;br /&gt;
|-&lt;br /&gt;
{{#if: {{{3|}}} | {{!}} {{{3}}}{{#if: {{{4|}}} | , {{{4}}} }} }}&lt;br /&gt;
|-&lt;br /&gt;
{{#if: {{{5|}}} | {{!}} {{{5}}}{{#if: {{{6|}}} | , {{{6}}} }} }}&lt;br /&gt;
|-&lt;br /&gt;
{{#if: {{{7|}}} | {{!}} {{{7}}}{{#if: {{{8|}}} | , {{{8}}} }} }}&lt;br /&gt;
|-&lt;br /&gt;
{{#if: {{{9|}}} | {{!}} {{{9}}}{{#if: {{{10|}}} | , {{{10}}} }} }}&lt;br /&gt;
|-&lt;br /&gt;
{{#if: {{{11|}}} | {{!}} {{{11}}}{{#if: {{{12|}}} | , {{{12}}} }} }}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{-}}&lt;br /&gt;
{{Informative template|1=&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Usage ==&lt;br /&gt;
This template is for containing links to [[Help:Archiving a talk page|archives of talk pages]].&lt;br /&gt;
&lt;br /&gt;
== Goal ==&lt;br /&gt;
 {{obr}}'''Archives'''{{!}}archive{{!}}''archive 2''{{!}}''archive 3''{{!}}''archive 4''{{!}}''archive 5''{{!}}''archive 6''{{!}}''archive 7''{{!}}''archive 8''{{!}}''archive 9''{{!}}''archive 10''{{!}}''archive 11''{{!}}''archive 12''{{cbr}}&lt;br /&gt;
&lt;br /&gt;
; archive (''1-10'') : Link to archive. Only the first one is mandatory.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Archives|[[/Archive 2014|2014]]}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{Archives|[[/Archive 2014|2014]]}}{{-}}&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{Archives|[[/Archive 2012|2012]]|[[/Archive 2013|2013]]|[[/Archive 2014|2014]]}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{Archives|[[/Archive 2012|2012]]|[[/Archive 2013|2013]]|[[/Archive 2014|2014]]}}{{-}}&lt;br /&gt;
&lt;br /&gt;
== Related templates ==&lt;br /&gt;
* {{tl|Talk archive}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Templates]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=FlightGear_wiki:Village_pump&amp;diff=139041</id>
		<title>FlightGear wiki:Village pump</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=FlightGear_wiki:Village_pump&amp;diff=139041"/>
		<updated>2024-01-30T19:21:11Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: /* Embedded YouTube videos broken */ new section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NEWSECTIONLINK__&lt;br /&gt;
{{Archives|[[/Archive 2012|2012]]|[[/Archive 2013|2013]]|[[/Archive 2014|2014]]|[[/Archive 2015|2015]]|[[/Archive 2016|2016]]|[[/Archive 2017|2017]]|[[/Archive 2018|2018]]|[[/Archive 2019|2019]]|[[/Archive 2020|2020]]|[[/Archive 2021|2021]]|[[/Archive 2022|2022]]}}&lt;br /&gt;
{{shortcut|FGW:VP}}&lt;br /&gt;
&lt;br /&gt;
Welcome to the '''Village Pump'''. This page is used to discuss the technical issues, operations and guidelines of the [[FlightGear wiki]].&lt;br /&gt;
&lt;br /&gt;
Please &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[{{fullurl:{{FULLPAGENAME}}|action=edit&amp;amp;section=new}} add new topics]&amp;lt;/span&amp;gt; to the '''bottom''' of this page.&lt;br /&gt;
&lt;br /&gt;
Old discussions should be moved to a [[FlightGear wiki:Village pump/Archive YEAR]]. These discussions can then be moved to a relevant talk page if appropriate.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== MediaWiki updated to 1.39.6 ==&lt;br /&gt;
&lt;br /&gt;
We have updated MediaWiki to its latest LTS version 1.39.6 today. Although we've tested the update, chances are that we've missed certain scenarios or features. Please report any issues that you may encounter.&lt;br /&gt;
&lt;br /&gt;
[[User:Gijs|Gijs]] ([[User talk:Gijs|talk]]) 09:31, 30 January 2024 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Embedded YouTube videos broken ==&lt;br /&gt;
&lt;br /&gt;
It seems that the [[mw:Extension:EmbedVideo|EmbedVideo extension]] was removed at some point. Consequently, pages such as [[Howto:Creating FlightGear Promo Videos]] are broken. At present, the best replacements seems to be [[mw:Extension:EmbedVideo_(fork)|a fork]] and [[mw:Extension:YouTube|Extension:YouTube]].&lt;br /&gt;
&lt;br /&gt;
—'''''[[User:Red Leader|&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Red Leader&amp;lt;/span&amp;gt;]]''''' ([[User talk:Red Leader|talk]], [[Special:Contributions/Red Leader|contribs]]) 19:21, 30 January 2024 (UTC)&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Grumman_F-14_Tomcat_Weapons_Operations&amp;diff=139040</id>
		<title>Grumman F-14 Tomcat Weapons Operations</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Grumman_F-14_Tomcat_Weapons_Operations&amp;diff=139040"/>
		<updated>2024-01-30T19:10:41Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Switch to interwiki link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page explains how to operate weapons and the related radar modes for the [[Grumman_F-14_Tomcat|Grumman F-14 Tomcat]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Version Warning ==&lt;br /&gt;
{{Note|&lt;br /&gt;
Be aware that the documentation in this page refers to the development version of the F-14, which is maintained in a [https://github.com/Zaretto/fg-aircraft GitHub repository]. Some features might therefore not be available, if you use the less frequently updated version from [[FGAddon|FGAddon]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
The development of the weapons and radar in the F-14 are related to [https://discord.gg/MBWnqHC4 Operation Red Flag], the premier military aviation organization for the flight simulator FlightGear!&lt;br /&gt;
&lt;br /&gt;
== Weapons Operation ==&lt;br /&gt;
NB: Especially for gunning you might want to set SAS Roll to off to prevent the plane from oscillating when using aggressive stick input.&lt;br /&gt;
&lt;br /&gt;
NB: In some new versions of FlightGear, the {{Key press|w}} key is replaced by the {{Key press|m}} key to select weapons.&lt;br /&gt;
&lt;br /&gt;
===M61A1 Vulcan (gun)===&lt;br /&gt;
*At startup, the ammunition store is filled with 675 round. There is an option on the '''Fuel and Stores''' dialog in the '''Tomcat Controls''' Menu to allow the gun to be reloaded&lt;br /&gt;
*Select HUD A/A Mode on the Display panel, on pilot's right console. A multikey shortcut is also available {{Key press|:}}{{Key press|A}}{{Key press|H}}{{Key press|a}}. Having the HUD in this mode is not mandatory however when the HUD is in the right mode the guidance symbology will assist with target identification and aiming.&lt;br /&gt;
*Select Gun mode with the Stick Weapon Mode Selector ({{Key press|w}}). A pipper, the G symbol with a number showing approximately the remaining rounds x 100 and a closure rate scale are displayed in the HUD. The closure rate scale is active only if a target has been locked ({{Key press|y}}) by the radar with TWS AUTO mode (diamond on the HUD).&lt;br /&gt;
*Switch Master Arm on cycle with {{Key press|CTRL-w}}, the X on the G symbol means Master Arm off or in training mode.&lt;br /&gt;
* Press {{Key press|e}} to fire the gun.&lt;br /&gt;
&lt;br /&gt;
===AIM-9M Sidewinders===&lt;br /&gt;
*Select a weapons set using the menu: Tomcat Controls &amp;gt; Fuel and Stores: &amp;quot;FAD light&amp;quot; has 4 sidewinders, &amp;quot;FAD&amp;quot;, &amp;quot;FAD heavy&amp;quot; and &amp;quot;Bombcat&amp;quot; have 2 of them.&lt;br /&gt;
*Select HUD A/A Mode on the Display panel, on pilot's right console. A multikey shortcut is also available ({{Key press|:}}{{Key press|A}}{{Key press|H}}{{Key press|a}}).&lt;br /&gt;
* Select &amp;quot;SW&amp;quot; mode with the Stick Weapon Mode Selector ({{Key press|w}}).&lt;br /&gt;
*Switch to the RIO view ({{Key press|Ctrl|v}}).&lt;br /&gt;
*Select pylons 1 and 8, down position, on the Armament panel, on RIO's left console. A shortcut toggles these two switches so you can select or deselect all AIM-9 in one keyboard stroke ({{Key press|Ctrl|m}}) without leaving pilot's view. If you have 4 sidewinders, then after shooting the first 2 you need to toggle the pylons 1 and 8 into the up position.&lt;br /&gt;
*Switch back to the pilot's view ({{Key press|Ctrl|v}}).&lt;br /&gt;
* Switch Master Arm on, you hear the search signal of the seeker head, a low volume buzz sound.&lt;br /&gt;
*Now prior to be fired, the AIM-9 must have a lock on a target. Multiplayers, AI aircraft, and AI tankers can be locked (radar lock with {{Key press|y}}). The minimal lock distance is 10 NM, the target must be approximately inside a 80° cone centred on datum line. When locked, the signal buzz volume becomes louder and the 2 red &amp;quot;LOCK&amp;quot; lights at the top of the canopy frame are lit. For best results try to shoot ({{Key press|e}}) at a 3 to 6 NM range and with the target centred on the aircraft velocity vector (when the 2 red &amp;quot;SHOOT&amp;quot; lights at the top of the canopy frame are lit). The missile will explode at the smaller distance possible. However if this distance is above 70 meters, it will continue its trajectory without guidance.&lt;br /&gt;
&lt;br /&gt;
===AIM-7 Sparrow and AIM-54 Phoenix===&lt;br /&gt;
*Select a weapons set using the menu: Tomcat Controls &amp;gt; Fuel and Stores: &amp;quot;FAD&amp;quot; has 2 Sparrows and 4 Phoenix, &amp;quot;FAD light&amp;quot; has 4 Sparrows, &amp;quot;FAD heavy&amp;quot; has 6 Phoenix.&lt;br /&gt;
*Select A/A Mode, master arm etc. as with Sidewinders.&lt;br /&gt;
*Select &amp;quot;SP-PH&amp;quot; mode with the Stick Weapon Mode Selector ({{Key press|w}}).&lt;br /&gt;
*Set the appropriate pylons into the up position: 3, 4, 5, 6 for the pylons below the belly, 1 and 8 under the wing in up position for &amp;quot;FAD&amp;quot; (2 Sparrows, the 2 Sidewinders are selected in the down position of 1/8.&lt;br /&gt;
*Obtain a radar lock by using {{Key press|y}} the the next target and {{Key press|Ctrl|y}} the the previous target.&lt;br /&gt;
*Launching the missiles is the same as for the Sidewinders, but there is no growling sound and the max shooting range are larger: up to 30+ nm for the {{Wikipedia|AIM-7_Sparrow}} and 100+ nm for the {{Wikipedia|AIM-54_Phoenix}}.&lt;br /&gt;
&lt;br /&gt;
===Bombs===&lt;br /&gt;
NB: only CCIP mode is implemented - and only dumb low-drag unguided bombs - and only single release.&lt;br /&gt;
*Select the right weapons' set using the menu: Tomcat Controls &amp;gt; Fuel and Stores: &amp;quot;Bombcat&amp;quot; has 4 Mk83 bombs.&lt;br /&gt;
*Master arm on&lt;br /&gt;
*Select A/G Mode&lt;br /&gt;
*Select &amp;quot;Off&amp;quot; mode with the Stick Weapon Mode Selector (yes, off - you will still be able to pull the trigger in A/G mode).&lt;br /&gt;
*Set the appropriate pylons into the up position: 3, 4, 5, 6.&lt;br /&gt;
*No need for locking with the radar. There is a CCIP in the HUD.&lt;br /&gt;
*Set wing sweep to manual and 55 deg.&lt;br /&gt;
*Make sure you are high above terrain (e.g. 10000 ft) and initiate a steep dive to 40 degs. Deploy speed brakes in order not to get too fast. Make sure wings are levelled, otherwise the bomb will not hit even though the pipper is on the target (there is currently no vertical bomb fall line implemented in the HUD).&lt;br /&gt;
*Release the bomb when the target is within the circle around the bottom of the HUD and before you reach 2000 ft above ground.&lt;br /&gt;
&lt;br /&gt;
Find out what is working for you - it is not that simple.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Radar Scan Modes==&lt;br /&gt;
===Key Bindings===&lt;br /&gt;
{{Key press|y}}: Next target&lt;br /&gt;
&lt;br /&gt;
{{Key press|Shift|y}}: Cycle azimuth field width&lt;br /&gt;
&lt;br /&gt;
{{Key press|Shift|u}}: Undesignate (very useful for PAL mode)&lt;br /&gt;
&lt;br /&gt;
{{Key press|i}}: Tilt radar up&lt;br /&gt;
&lt;br /&gt;
{{Key press|Shift|i}}: Tilt radar down&lt;br /&gt;
&lt;br /&gt;
{{Key press|Shift|d}}: Cycle number of bars&lt;br /&gt;
&lt;br /&gt;
{{Key press|Ctrl|n}}: Cycle radar scan modes&lt;br /&gt;
&lt;br /&gt;
{{Key press|d}}: Pilot Auto Lockon mode (PAL) [click {{Key press|Ctrl|n}} to exit]&lt;br /&gt;
&lt;br /&gt;
{{Key press|r}}: Single Target Track mode (STT)&lt;br /&gt;
&lt;br /&gt;
{{Key press|Shift|e}} and {{Key press|r}}: Radar range when not in PAL mode.&lt;br /&gt;
&lt;br /&gt;
{{Key press|q}}: Radar standby&lt;br /&gt;
&lt;br /&gt;
===Modes===&lt;br /&gt;
Use {{Key press|Ctrl|n}} to cycle between radar scan modes (alternatively press the corresponding buttons on the RIO's front console).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Mode !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''PD SEARCH''' || Has the longest RCS sensitivity of the modes. Will only show targets that has above/below a certain closure-rate. Notchable. Will not show targets altitude or heading.&lt;br /&gt;
|-&lt;br /&gt;
| '''RWS''' || Medium RCS sensitivity. Notchable.&lt;br /&gt;
|-&lt;br /&gt;
| '''P SEARCH''' || Basically a ground/sea radar. Cannot be notched.&lt;br /&gt;
|-&lt;br /&gt;
| '''PAL''' || Scans the area around the HUD, fixed at 10nm range. Automatically enters STT for anything it sees. Note that when in this mode, none of the RIO mode push buttons will lit up.&lt;br /&gt;
|-&lt;br /&gt;
| '''P STT''' || Single target track. Cannot be notched, wont produce closure-rate output.&lt;br /&gt;
|-&lt;br /&gt;
| '''PD STT''' || Single target track. Can be notched.&lt;br /&gt;
|-&lt;br /&gt;
| '''TWS MAN''' || Once a target has been scanned twice within some seconds, groundtrack (headings) is displayed on TID. Only has 2 options for bars/az combinations. Has the shortest RCS sensitivity of the modes. Notchable.&lt;br /&gt;
|-&lt;br /&gt;
| '''TWS AUTO''' || Is disabled / does not work.&lt;br /&gt;
|} &lt;br /&gt;
&lt;br /&gt;
==== Missile Notes ====&lt;br /&gt;
&lt;br /&gt;
* AIM-7 needs STT mode.&lt;br /&gt;
&lt;br /&gt;
* AIM-9 needs STT mode or TWS mode with something selected. Or radar in standby, then it will lock onto whatever is at bore.&lt;br /&gt;
&lt;br /&gt;
* AIM-54 need either STT or TWS with something selected (in which case it will go active immediately with reduced range).&lt;br /&gt;
&lt;br /&gt;
====How to Notch====&lt;br /&gt;
Notching means flying manoeuvrers to make an aircraft less detectable on radar/evade it. It is sometimes called beaming.&lt;br /&gt;
&lt;br /&gt;
If you are flying against an F-14, keep the F-14 on your 3 or 9 o'clock and make sure that seen from the F-14 point of view that he will see terrain behind you.&lt;br /&gt;
&lt;br /&gt;
====Datalink====&lt;br /&gt;
&lt;br /&gt;
Aircraft on datalink that are inside the radar field will be shown on TID (even if the radar is standby). The backseater needs to take care to enter the datalink channel at the top of the right panel (IFF is taken care of by the pilot at the top of the pilot's right panel).&lt;br /&gt;
&lt;br /&gt;
====Misc====&lt;br /&gt;
&lt;br /&gt;
RWS/TWS MAN/PDSearch/PSearch will able to show 19 targets, MP or not. TWS can show groundtrack on max 10 of them.&lt;br /&gt;
&lt;br /&gt;
Radar elevation, commanded and actual, is shown on gauge left of DDD display. It is in relation to horizon in all modes except PAL.&lt;br /&gt;
&lt;br /&gt;
Each mode remembers its own bars and az settings. So if you switch to 1 bar in RWS, and then switch to PD SEARCH it might have 8 bars, when you switch back to RWS you will have 1 bar again. Radar antennae elevation/azimuth is shared between modes though.&lt;br /&gt;
&lt;br /&gt;
====Moving Radar Azimuth Field Left and Right====&lt;br /&gt;
&lt;br /&gt;
There are no key bindings for moving the radar azimuth field left and right when not 120. To use this, enable it from FG joystick dialog.&lt;br /&gt;
&lt;br /&gt;
====Dual Control====&lt;br /&gt;
&lt;br /&gt;
When connecting as a Radar Intercept Officer (RIO aka. [[wikipedia:weapon systems officer|WSO]]), the pilot will no longer be able to control the radar - it is all done from the dual control RIO MP seat. The RIO is able to control the station switches.&lt;br /&gt;
&lt;br /&gt;
Make sure that you as a RIO do not switch modes and stuff too fast, allow for a short moment for each change you make to propagate to the pilot.&lt;br /&gt;
&lt;br /&gt;
If the RIO selects something and it fails pilot screen will show selection handover fails, the pilot could try to press y to repeat the handover and if successful, and then ask RIO to cycle modes if RIO had commanded STT, to make the pilots radar try to enter STT again.&lt;br /&gt;
&lt;br /&gt;
==Related Information==&lt;br /&gt;
{{#ev:youtube|ibHrZyAQ1C4|||A tutorial video explaining how to fire the F-14B's missiles.|frame}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Red_Leader&amp;diff=135423</id>
		<title>User:Red Leader</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Red_Leader&amp;diff=135423"/>
		<updated>2022-09-02T12:02:49Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Update external links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{User&lt;br /&gt;
|name      = Red Leader&lt;br /&gt;
|location  = United Kingdom&lt;br /&gt;
|interests = &lt;br /&gt;
* [https://www.flightgear.org/ FlightGear]&lt;br /&gt;
* {{Wikipedia|Military aircraft|noicon=1}}&lt;br /&gt;
* [https://www.lego.com/ Lego]&lt;br /&gt;
|callsign  = &lt;br /&gt;
* Red-Led&lt;br /&gt;
* RLTest1&lt;br /&gt;
* RLTest2&lt;br /&gt;
|favourite = &lt;br /&gt;
* [[Grumman F-14 Tomcat]]&lt;br /&gt;
* [[British Aerospace Sea Harrier]]&lt;br /&gt;
* [[Dassault Mirage 2000-5]]&lt;br /&gt;
* [[Saab JA-37 Viggen]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
My involvement with flight simulators started when I got [https://ysflight.org/ YSFlight], another free flight simulator. Although it was great fun, it wasn’t very realistic, so I wanted something better. After looking at {{wikipedia|Microsoft Flight Simulator X|noicon=1}} and {{Wikipedia|Combat Flight Simulator 3: Battle for Europe|Combat Flight Simulator|noicon=1}}, I found [https://www.flightgear.org/ FlightGear]. Since then I’ve wanted to improve FlightGear and make it better for the end-user.&lt;br /&gt;
&lt;br /&gt;
In late August 2015, I became an administrator on the [[FlightGear Wiki]].&lt;br /&gt;
&lt;br /&gt;
Since Autumn 2018, I have been essentially inactive within the community due to other commitments in my life. I do, however, intend to return to FlightGear one day, and I still keep a very dim view of things going on here. It is best to contact me via private message on the FlightGear forum ({{forum link|text=profile|type=member|u=17099}}); I should be fairly prompt in responding.&lt;br /&gt;
&lt;br /&gt;
== Projects ==&lt;br /&gt;
=== Simulator ===&lt;br /&gt;
* [[British Aerospace Sea Harrier]] development. {{paused}}&lt;br /&gt;
* [[Scripted AI Objects]] development (with {{usr|5H1N0B1}}). {{paused}}&lt;br /&gt;
* Starting the [[Canvas HUD]] framework. {{not done}}&lt;br /&gt;
&lt;br /&gt;
=== Wiki ===&lt;br /&gt;
* Documenting the [[Nasal]] {{abbr|API|Application Programming Interface}} (see my [[/Nasal documentation proposal|Nasal documentation proposal]]) {{paused}}&lt;br /&gt;
&lt;br /&gt;
== Pages ==&lt;br /&gt;
* [[/Sandbox|My sandbox]]&lt;br /&gt;
* [[/Nasal documentation proposal|Nasal documentation proposal]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Users]]&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Red_Leader&amp;diff=130426</id>
		<title>User:Red Leader</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Red_Leader&amp;diff=130426"/>
		<updated>2021-02-28T16:43:14Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Use U+2019 for apostrophe instead of U+0027&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{User&lt;br /&gt;
|name      = Red Leader&lt;br /&gt;
|location  = United Kingdom&lt;br /&gt;
|interests = &lt;br /&gt;
* [http://www.flightgear.org/ FlightGear]&lt;br /&gt;
* {{Wikipedia|Military aircraft|noicon=1}}&lt;br /&gt;
* [http://www.lego.com/en-gb/ Lego]&lt;br /&gt;
|callsign  = &lt;br /&gt;
* Red-Led&lt;br /&gt;
* RLTest1&lt;br /&gt;
* RLTest2&lt;br /&gt;
|favourite = &lt;br /&gt;
* [[Grumman F-14 Tomcat]]&lt;br /&gt;
* [[British Aerospace Sea Harrier]]&lt;br /&gt;
* [[Dassault Mirage 2000-5]]&lt;br /&gt;
* [[Saab JA-37 Viggen]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
My involvement with flight simulators started when I got [http://www.ysflight.com/ YSFlight], another free flight simulator. Although it was great fun, it wasn’t very realistic, so I wanted something better. After looking at {{wikipedia|Microsoft Flight Simulator X|noicon=1}} and {{Wikipedia|Combat Flight Simulator 3: Battle for Europe|Combat Flight Simulator|noicon=1}}, I found [https://www.flightgear.org/ FlightGear]. Since then I’ve wanted to improve FlightGear and make it better for the end-user.&lt;br /&gt;
&lt;br /&gt;
In late August 2015, I became an administrator on the [[FlightGear Wiki]].&lt;br /&gt;
&lt;br /&gt;
Since Autumn 2018, I have been essentially inactive within the community due to other commitments in my life. I do, however, intend to return to FlightGear one day, and I still keep a very dim view of things going on here. It is best to contact me via private message on the FlightGear forum ({{forum link|text=profile|type=member|u=17099}}); I should be fairly prompt in responding.&lt;br /&gt;
&lt;br /&gt;
== Projects ==&lt;br /&gt;
=== Simulator ===&lt;br /&gt;
* [[British Aerospace Sea Harrier]] development. {{paused}}&lt;br /&gt;
* [[Scripted AI Objects]] development (with {{usr|5H1N0B1}}). {{paused}}&lt;br /&gt;
* Starting the [[Canvas HUD]] framework. {{not done}}&lt;br /&gt;
&lt;br /&gt;
=== Wiki ===&lt;br /&gt;
* Documenting the [[Nasal]] {{abbr|API|Application Programming Interface}} (see my [[/Nasal documentation proposal|Nasal documentation proposal]]) {{paused}}&lt;br /&gt;
&lt;br /&gt;
== Pages ==&lt;br /&gt;
* [[/Sandbox|My sandbox]]&lt;br /&gt;
* [[/Nasal documentation proposal|Nasal documentation proposal]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Users]]&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Red_Leader&amp;diff=130425</id>
		<title>User:Red Leader</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Red_Leader&amp;diff=130425"/>
		<updated>2021-02-28T13:00:15Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Remove first heading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{User&lt;br /&gt;
|name      = Red Leader&lt;br /&gt;
|location  = United Kingdom&lt;br /&gt;
|interests = &lt;br /&gt;
* [http://www.flightgear.org/ FlightGear]&lt;br /&gt;
* {{Wikipedia|Military aircraft|noicon=1}}&lt;br /&gt;
* [http://www.lego.com/en-gb/ Lego]&lt;br /&gt;
|callsign  = &lt;br /&gt;
* Red-Led&lt;br /&gt;
* RLTest1&lt;br /&gt;
* RLTest2&lt;br /&gt;
|favourite = &lt;br /&gt;
* [[Grumman F-14 Tomcat]]&lt;br /&gt;
* [[British Aerospace Sea Harrier]]&lt;br /&gt;
* [[Dassault Mirage 2000-5]]&lt;br /&gt;
* [[Saab JA-37 Viggen]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
My involvement with flight simulators started when I got [http://www.ysflight.com/ YSFlight], another free flight simulator. Although it was great fun, it wasn't very realistic, so I wanted something better. After looking at {{wikipedia|Microsoft Flight Simulator X|noicon=1}} and {{Wikipedia|Combat Flight Simulator 3: Battle for Europe|Combat Flight Simulator|noicon=1}}, I found [https://www.flightgear.org/ FlightGear]. Since then I've wanted to improve FlightGear and make it better for the end-user.&lt;br /&gt;
&lt;br /&gt;
In late August 2015, I became an administrator on the [[FlightGear Wiki]].&lt;br /&gt;
&lt;br /&gt;
Since Autumn 2018, I have been essentially inactive within the community due to other commitments in my life. I do, however, intend to return to FlightGear one day, and I still keep a very dim view of things going on here. It is best to contact me via private message on the FlightGear forum ({{forum link|text=profile|type=member|u=17099}}); I should be fairly prompt in responding.&lt;br /&gt;
&lt;br /&gt;
== Projects ==&lt;br /&gt;
=== Simulator ===&lt;br /&gt;
* [[British Aerospace Sea Harrier]] development. {{paused}}&lt;br /&gt;
* [[Scripted AI Objects]] development (with {{usr|5H1N0B1}}). {{paused}}&lt;br /&gt;
* Starting the [[Canvas HUD]] framework. {{not done}}&lt;br /&gt;
&lt;br /&gt;
=== Wiki ===&lt;br /&gt;
* Documenting the [[Nasal]] {{abbr|API|Application Programming Interface}} (see my [[/Nasal documentation proposal|Nasal documentation proposal]]) {{paused}}&lt;br /&gt;
&lt;br /&gt;
== Pages ==&lt;br /&gt;
* [[/Sandbox|My sandbox]]&lt;br /&gt;
* [[/Nasal documentation proposal|Nasal documentation proposal]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Users]]&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Red_Leader&amp;diff=130424</id>
		<title>User:Red Leader</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Red_Leader&amp;diff=130424"/>
		<updated>2021-02-28T12:59:52Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Update my current status and edit wikitext formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{{User&lt;br /&gt;
|name      = Red Leader&lt;br /&gt;
|location  = United Kingdom&lt;br /&gt;
|interests = &lt;br /&gt;
* [http://www.flightgear.org/ FlightGear]&lt;br /&gt;
* {{Wikipedia|Military aircraft|noicon=1}}&lt;br /&gt;
* [http://www.lego.com/en-gb/ Lego]&lt;br /&gt;
|callsign  = &lt;br /&gt;
* Red-Led&lt;br /&gt;
* RLTest1&lt;br /&gt;
* RLTest2&lt;br /&gt;
|favourite = &lt;br /&gt;
* [[Grumman F-14 Tomcat]]&lt;br /&gt;
* [[British Aerospace Sea Harrier]]&lt;br /&gt;
* [[Dassault Mirage 2000-5]]&lt;br /&gt;
* [[Saab JA-37 Viggen]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== My involvement with flight simulators ==&lt;br /&gt;
My involvement with flight simulators started when I got [http://www.ysflight.com/ YSFlight], another free flight simulator. Although it was great fun, it wasn't very realistic, so I wanted something better. After looking at {{wikipedia|Microsoft Flight Simulator X|noicon=1}} and {{Wikipedia|Combat Flight Simulator 3: Battle for Europe|Combat Flight Simulator|noicon=1}}, I found [https://www.flightgear.org/ FlightGear]. Since then I've wanted to improve FlightGear and make it better for the end-user.&lt;br /&gt;
&lt;br /&gt;
In late August 2015, I became an administrator on the [[FlightGear Wiki]].&lt;br /&gt;
&lt;br /&gt;
Since Autumn 2018, I have been essentially inactive within the community due to other commitments in my life. I do, however, intend to return to FlightGear one day, and I still keep a very dim view of things going on here. It is best to contact me via private message on the FlightGear forum ({{forum link|text=profile|type=member|u=17099}}); I should be fairly prompt in responding.&lt;br /&gt;
&lt;br /&gt;
== Projects ==&lt;br /&gt;
=== Simulator ===&lt;br /&gt;
* [[British Aerospace Sea Harrier]] development. {{paused}}&lt;br /&gt;
* [[Scripted AI Objects]] development (with {{usr|5H1N0B1}}). {{paused}}&lt;br /&gt;
* Starting the [[Canvas HUD]] framework. {{not done}}&lt;br /&gt;
&lt;br /&gt;
=== Wiki ===&lt;br /&gt;
* Documenting the [[Nasal]] {{abbr|API|Application Programming Interface}} (see my [[/Nasal documentation proposal|Nasal documentation proposal]]) {{paused}}&lt;br /&gt;
&lt;br /&gt;
== Pages ==&lt;br /&gt;
* [[/Sandbox|My sandbox]]&lt;br /&gt;
* [[/Nasal documentation proposal|Nasal documentation proposal]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Users]]&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Changelog_2020.3&amp;diff=129540</id>
		<title>Changelog 2020.3</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Changelog_2020.3&amp;diff=129540"/>
		<updated>2020-12-17T20:14:18Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Grammar correction &amp;amp; apply :Template:Key press&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{changelogs|prev=2020.1|next=2022.1}}&lt;br /&gt;
&lt;br /&gt;
Available in: [[Changelog_2020.3|English]], [[Zh/2020.3|Chinese]]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please help us translate into other languages!&lt;br /&gt;
&lt;br /&gt;
----&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Undocumented templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The FlightGear development team is delighted to announce the v2020.3 LTS release of FlightGear, the free, open-source flight simulator. This is the second Long Term Support release for FlightGear, since the project changed to offering both Long Term Support releases, and more cutting-edge Preview releases.  This release represents the culmination of two years of development effort by a worldwide group of volunteers, brought together by a shared ambition to create the most realistic flight simulator possible that is free to use, modify and distribute. FlightGear is used all over the world by desktop flight simulator enthusiasts, for research in universities and for interactive exhibits in museums.&lt;br /&gt;
&lt;br /&gt;
Major enhancements since the v2018.3 LTS include: &lt;br /&gt;
* a developer preview of the upcoming Compositor graphical rendering framework as a separate pre-built binary, &lt;br /&gt;
* enhancements to both the JSBSim and YASim flight dynamics models&lt;br /&gt;
* DDS texture caching to reduce load times&lt;br /&gt;
* faster loading and more memory efficient buildings&lt;br /&gt;
* improved aircraft carrier support&lt;br /&gt;
&lt;br /&gt;
Additionally 30 completely new aircraft have been added to the official hangar, and a further 71 have received major updates.&lt;br /&gt;
&lt;br /&gt;
Founded in 1997, FlightGear features more than 700 aircraft, a worldwide scenery database, a multiplayer environment, detailed sky modelling, a flexible and open aircraft modelling system, varied networking options, multiple display support, a powerful scripting language, and an open architecture. Best of all, being open-source, the simulator is owned by the community and everyone is encouraged to contribute.&lt;br /&gt;
&lt;br /&gt;
FlightGear - Fly Free! &lt;br /&gt;
&lt;br /&gt;
----&amp;lt;noinclude&amp;gt;&lt;br /&gt;
[[Category:Undocumented templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Launcher ==&lt;br /&gt;
* Addition of a welcome screen on first launch, providing helpful information to first time users.&lt;br /&gt;
* Aircraft can now be marked as Favourites, and filtered, making it easier to see find your favourite aircraft out of the hundreds available.&lt;br /&gt;
* The launcher now supports aircraft carriers, including selecting a carrier and setting a start position.&lt;br /&gt;
* {{key press|Ctrl|F}} shortcut for when you just want to Fly!&lt;br /&gt;
* Improved support for helipads and seaports, including detection of current aircraft type.&lt;br /&gt;
* Numerous bugfixes and stability improvements, in particular for the aircraft and addons tabs.&lt;br /&gt;
&lt;br /&gt;
== Graphics ==&lt;br /&gt;
* To provide a developer preview, the [[Compositor]] renderer is included as part of this release.  It provides a fully XML-configurable multi-pass rendering pipeline that is compatible with ALS and includes clustered shading.&lt;br /&gt;
* Support for DDS Texture Cache, improving loading times for texture files.&lt;br /&gt;
* Star visibility is configurable based on magnitude of star and atmospheric conditions.&lt;br /&gt;
* Use of non-directional point sprites as a fallback for drivers that do not support triangles of point sprites is now supported by setting &amp;lt;code&amp;gt;/rendering/triangle-directional-lights=false&amp;lt;/code&amp;gt;.&lt;br /&gt;
* A new Tower AGL view has been added.  This is similar to Tower View, except that it keeps both the aircraft and the ground immediately below the aircraft in view, zooming and panning smoothly as the aircraft moves. Good for viewing landings.&lt;br /&gt;
* Improved airport grass textures&lt;br /&gt;
* Implemented tidal movement for littoral areas.&lt;br /&gt;
* Updated regional material definitions for California, Asia, Northern Brazil, Iceland, Jan Mayen island.&lt;br /&gt;
* Active volcanoes - Katla, Eyjafjallajokull, Surtsey.  &lt;br /&gt;
* Instanced-based random and OpenStreetMap buildings, improving performance and graphical quality significantly.&lt;br /&gt;
* Improvements to the Wingflex Shader.&lt;br /&gt;
* Users may enable/disable the pilot model from the View Options dialog.&lt;br /&gt;
&lt;br /&gt;
== JSBSim ==&lt;br /&gt;
* Added the ability to set up the starter and acceleration times of a turbine (parameters &amp;lt;code&amp;gt;&amp;lt;n1spinup&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;n2spinup&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;n1startrate&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;n2startrate&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
* The &amp;lt;code&amp;gt;&amp;lt;integrator&amp;gt;&amp;lt;/code&amp;gt; filter can now be reset to 0.0 by setting its &amp;lt;code&amp;gt;&amp;lt;trigger&amp;gt;&amp;lt;/code&amp;gt; property to a negative value.&lt;br /&gt;
* The integration scheme of the &amp;lt;code&amp;gt;&amp;lt;integrator&amp;gt;&amp;lt;/code&amp;gt; filter can now be chosen among &amp;lt;code&amp;gt;rect&amp;lt;/code&amp;gt; (Euler), &amp;lt;code&amp;gt;trap&amp;lt;/code&amp;gt; (Trapezoidal), &amp;lt;code&amp;gt;ab2&amp;lt;/code&amp;gt; (2nd order Adams-BashForth) and &amp;lt;code&amp;gt;ab3&amp;lt;/code&amp;gt; (3rd order Adams-Bashforth)&lt;br /&gt;
* The following functions can now be used in &amp;lt;code&amp;gt;&amp;lt;function&amp;gt;&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;floor&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ceil&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;fmod&amp;lt;/code&amp;gt;. Their functionalities are the same than the corresponding C/C++ functions.&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;function&amp;gt;&amp;lt;/code&amp;gt; now checks the number of its arguments.&lt;br /&gt;
* New system component linear_actuator&lt;br /&gt;
* Export the fuel density to the property tree&lt;br /&gt;
* Added cyclic clipping for FCS components&lt;br /&gt;
* Added the ability to control the turbine engines spin down factor&lt;br /&gt;
* [Backward compatibility breakage] Gyros are now measuring rotation rates instead of rotational accelerations. Gyros that measure rotational accelerations do not exist in the real world.&lt;br /&gt;
* Output properties of flight control elements are no longer tied. This saves a lot of spurious warning messages and allows direct references of the same properties among several flight controls.&lt;br /&gt;
* Water vapor in the atmosphere is now managed through its mass fraction rather than its partial pressure. The former being the physical quantity that is conserved when pressure and temperature vary.&lt;br /&gt;
* Check that there are at least 3 contacts before trying to trim on ground.&lt;br /&gt;
* Added optional transmission of the simulation time for FG UDP interface&lt;br /&gt;
* The existence of the property that is used for table independent vars is now checked during execution rather than when the XML definition is parsed. This relaxes the order in which filters, table and more generally flight controls need to be declared in the XML definition files.&lt;br /&gt;
* Electric engines RPM is now exported in UDP sockets.&lt;br /&gt;
* The parameter &amp;lt;code&amp;gt;&amp;lt;ignitionn2&amp;gt;&amp;lt;/code&amp;gt; now affects N2 rather than N1. &lt;br /&gt;
* A warning is now given when max &amp;lt; min in a &amp;lt;code&amp;gt;&amp;lt;clipto&amp;gt;&amp;lt;/code&amp;gt; rather than throwing an exception&lt;br /&gt;
* Added the ability to log properties in a CSV file with the new fgfs executable argument &amp;lt;code&amp;gt;--jsbsim-output-directive-file&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== YASim ==&lt;br /&gt;
* Ground friction (stiction) changes&lt;br /&gt;
* Support for transonic flow effects.&lt;br /&gt;
* Control initial gear state directly by setting &amp;lt;code&amp;gt;/fdm/yasim/respect-external-gear-state=true&amp;lt;/code&amp;gt;, rather then YASim settings this depending on whether the aircraft is in the air or on the ground.&lt;br /&gt;
* Electric engines are now supported.&lt;br /&gt;
&lt;br /&gt;
== Weather and Environment ==&lt;br /&gt;
* Increased turbulence will be encountered near active volcanoes.&lt;br /&gt;
* Configurable METAR URL.&lt;br /&gt;
* METAR strings are decoded and displayed in a human-readable form in the weather dialog.&lt;br /&gt;
&lt;br /&gt;
== Carriers ==&lt;br /&gt;
* Two new carrier-specific starting options are supported in the launcher: &amp;lt;code&amp;gt;carrier-takeoff&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;carrier-approach&amp;lt;/code&amp;gt;.&lt;br /&gt;
* A new &amp;lt;code&amp;gt;--carrier-position&amp;lt;/code&amp;gt; command-line argument has been added.  This can be used to select the aircraft start position on an aircraft carrier.  Either a catapult (e.g. &amp;lt;code&amp;gt;cat-1&amp;lt;/code&amp;gt;), a parking position (e.g. &amp;lt;code&amp;gt;park-1&amp;lt;/code&amp;gt;), on final approach on the FLOLS (&amp;lt;code&amp;gt;flols&amp;lt;/code&amp;gt;) or abeam the carrier (&amp;lt;code&amp;gt;abeam&amp;lt;/code&amp;gt;).&lt;br /&gt;
* MPCarrier can now be detected by the GUI even if not available on startup.  To enable this feature set &amp;lt;code&amp;gt;/sim/mp-carriers/auto-attach=true&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== AI ==&lt;br /&gt;
* New fgcommands &amp;lt;code&amp;gt;add-aiobject&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;remove-aiobject&amp;lt;/code&amp;gt; for adding/removing objects to the AI subsystem.&lt;br /&gt;
* New AI aircraft, including 747 Freighter, CRJ900, SR-71, Saab 340.&lt;br /&gt;
* Numerous updates to AI traffic schedules and airline liveries.&lt;br /&gt;
* Space Shuttle TAEM and approach at KEDW scenario.&lt;br /&gt;
* Accurate Britten-Norman Islander performance data, from an Islander pilot.&lt;br /&gt;
&lt;br /&gt;
== Multiplayer ==&lt;br /&gt;
* Connection to VATSIM via swift is now available via the GUI.&lt;br /&gt;
* FGCom now supports both COM1 and COM2, as well as volume settings.&lt;br /&gt;
* The views defined by the user's aircraft (Pilot view, Helicopter view, Tower view etc) can now be used with multiplayer aircraft.  Viewing a particular multiplayer aircraft is done by clicking in the Pilot List dialogue's &amp;quot;view' column (see the &amp;quot;Multiplayer/Pilot List&amp;quot; menu).&lt;br /&gt;
* &amp;lt;code&amp;gt;--disable-hold-short&amp;lt;/code&amp;gt; option which allows the user to force a start on the runway when multiplayer is enabled.  This option should be used with caution - it can give other pilots and ATC a nasty fright to find an aircraft materialize on the runway!&lt;br /&gt;
* Support for recording multiplayer data&lt;br /&gt;
&lt;br /&gt;
== Nasal Scripting ==&lt;br /&gt;
* Configurable load order for core Nasal modules.&lt;br /&gt;
* Improvements and bug fixes to Emesary, the messaging interface.&lt;br /&gt;
* Improvements to the core libraries.&lt;br /&gt;
* Garbage collection improvements to reduce frame stuttering&lt;br /&gt;
* Re-loadable Nasal modules&lt;br /&gt;
* Canvas EFIS framework&lt;br /&gt;
* New methods in Canvas Image to set colors of pixels in the image.&lt;br /&gt;
&lt;br /&gt;
== Aircraft == &lt;br /&gt;
* FG1000 Glass Panel improvements include user-configurable VFR transponder codes, volume controls, new fascia, UI is now resizeable, support for custom SVG files (e.g. for a G500).  The FG1000 is now available on the Cessna 182T, J3 Cub, Diamond DA40.&lt;br /&gt;
* Improved glider vario instrument.&lt;br /&gt;
* New Aircraft: &lt;br /&gt;
** Airbus A320 - airliner&lt;br /&gt;
** Alisport Silent2Electro - glider with electric sustainer motor&lt;br /&gt;
** Bombardier Q400 DHC8-402 - shorthaul turboprop airliner&lt;br /&gt;
** Breguet Atlantic BR 1150 - long-range maritime patrol aircraft&lt;br /&gt;
** Cessna 140 - GA aircraft&lt;br /&gt;
** Cessna 208B Caravan - short range passenger, freighter and utility aircraft&lt;br /&gt;
** Cirrus SR22T - GA aircraft&lt;br /&gt;
** Diamond DA40 NG - GA aircraft, including FG1000 glass panel cockpit&lt;br /&gt;
** Diamond DA62 Twinstar- Twin engine GA aircraft&lt;br /&gt;
** Diamond HK36 Super Dimona - motorglider&lt;br /&gt;
** Dornier DO 28 Skyservant - Twin engine STOL utility aircraft&lt;br /&gt;
** Douglas TBD Devastator - WWII Torpedo bomber&lt;br /&gt;
** Draco Wilga - turboprop taildragger bush plane&lt;br /&gt;
** Fokker T.V - twin engine bomber&lt;br /&gt;
** Glasfluegel H201B Standard Libelle - glider&lt;br /&gt;
** Grumman F11-Tiger - carrier-based fighter&lt;br /&gt;
** Grumman HU-16A Albatross - twin engine amphibian&lt;br /&gt;
** Petliakov PE-8 (Ant-42/TB-7) - WWII bomber&lt;br /&gt;
** Piper PA28-161 Warrior II - GA aircraft&lt;br /&gt;
** Pipistrel Alpha Electro - electric training aircraft&lt;br /&gt;
** Pipistrel Taurus Electro G2.5 - glider with electric sustainer motor&lt;br /&gt;
** Rolladen Schneider LS8sc neo - standard glider with electric sustainer motor&lt;br /&gt;
** Robin DR400 Ecoflyer - GA Aircraft&lt;br /&gt;
** Scheibe Bergfalke II/55 - training glider&lt;br /&gt;
** Schempp-Hirth Arcus S - high performance glider&lt;br /&gt;
** Schleicher Ka6(CR) &amp;quot;Rhoensegler&amp;quot; - training glider&lt;br /&gt;
** SEPECAT Jaguar GR.1 - jet attack aircraft&lt;br /&gt;
** SUMPAC - Human powered airplane&lt;br /&gt;
** Supermarine Swift - jet fighter&lt;br /&gt;
** Yak 52 - training aircraft&lt;br /&gt;
* Major updates to over 70 aircraft.  Including 737-100, 737-300, 777, A-26-Invader, AR-234, ASG29, ASK13, ASK21, Aero-Commander, Aichi-D3A, B-17, B-24-Liberator, B-25, Bombardier-415, CH750STOL, CRJ700-family, Cessna-208-Caravan, Cessna Citation II, Cessna-L19, Cirrus-SR22, Concorde, DO-228, DO-335, Diamond-Da40, Diamond-Da42, Dragonfly, Embraer-ERJ-145, F-15, Fairchild-Metroliner, Falcon-50, Fokker-S-11, Fw200, H4-Hercules, Harrier-GR3, Horten-Ho-IX, Hughes-XF11, J3Cub, JA37, JAS39-Gripen, Jaguar, LS4, Lancair-235, Lionceau, Lockheed-NF104A, Lockheed-P38, ME-262, Mirage-2000, MirageIV, Northrop-xb35, PC-12, Piaggio-P166, Piper-PA-28, Potez-630, R44, Ryan-Navion, SIAI-Marchetti-SF.260, Socata-ST10, SpaceShuttle, Starship, Tecnam-P2006T, UH-1, Yak-18T, Zlin-50lx, an24b, bluebird, c182s, dhc1, f-14b, f16.&lt;br /&gt;
&lt;br /&gt;
== Miscellaneous ==&lt;br /&gt;
* Updated Chinese, Dutch, French, German, Italian, Polish and Slovak translations.&lt;br /&gt;
* Map dialog displays heliports and allows configurable cursor key panning&lt;br /&gt;
* Faster Terrasync:  Download a tarball of airport information on first start and only check for updates every 24 hours rather than every simulator run.&lt;br /&gt;
* GPS fly-by mode&lt;br /&gt;
* Sentry.io integration to provide centralized crash reporting.&lt;br /&gt;
* Change screenshot filename to have date and time&lt;br /&gt;
* New thread safe particle manager -- should reduce random crashes around particles.&lt;br /&gt;
&lt;br /&gt;
=Updates since 2020.1=&lt;br /&gt;
Changes since the 2020.1 preview release include:&lt;br /&gt;
* Various launcher improvements including a Welcome screen and a keyboard shortcut (Ctrl+F) to Fly!&lt;br /&gt;
* Improved regional definitions for California, Iceland and Northern Brazil and better grass textures.&lt;br /&gt;
* Implemented tidal movement for littoral areas.&lt;br /&gt;
* New AI model for the 747 Freighter, and numerous AI livery and traffic updates.&lt;br /&gt;
* Updates to the FG1000 glass panel display including configurable VFR transponder codes, volume controls, a new fascia, resizeable UI and support for custom SVG files.&lt;br /&gt;
* A hangar full of new aircraft: HU-16A-Albatross, LS8, Embraer-ERJ-145, Cessna 208B Caravan, PZL 104 wilga 2000 Draco, Scheibe Bergfalke, Taurus, f16, Dornier Do 28 Skyservant, Petliakov Pe 8 (Ant 42/DB 7), Grumman F.11 Tiger&lt;br /&gt;
* Updates to a large number of aircraft including CRJ700, Dragonfly, Mirage 2000, Jaguar GR1, H4 Hercules, JA37, Supermarine Swift, A320, Cirrus-SR22, Cessna Citation, J3Cub&lt;br /&gt;
* Updated Chinese, Dutch, French, German, Italian, Polish and Slovak translations.&lt;br /&gt;
* Faster Terrasync:  Download a tarball of airport information on first start and only check for updates every 24 hours rather than every simulator run.&lt;br /&gt;
* GPS fly-by mode&lt;br /&gt;
* Sentry.io integration to provide centralized crash reporting.&lt;br /&gt;
* New thread safe particle manager -- should reduce random crashes around particles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:FlightGear changelogs‎]]&lt;br /&gt;
[[Zh:2020.3]]&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Red_Leader&amp;diff=117238</id>
		<title>User:Red Leader</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Red_Leader&amp;diff=117238"/>
		<updated>2019-02-01T07:35:47Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Status update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__{{User&lt;br /&gt;
|name      = Red Leader&lt;br /&gt;
|location  = United Kingdom&lt;br /&gt;
|interests = &lt;br /&gt;
* [http://www.flightgear.org/ FlightGear]&lt;br /&gt;
* {{Wikipedia|Military aircraft|noicon=1}}&lt;br /&gt;
* [http://www.lego.com/en-gb/ Lego]&lt;br /&gt;
|callsign  = &lt;br /&gt;
* Red-Led&lt;br /&gt;
* RLTest1&lt;br /&gt;
* RLTest2&lt;br /&gt;
|favourite = &lt;br /&gt;
* [[Grumman F-14 Tomcat]]&lt;br /&gt;
* [[British Aerospace Sea Harrier]]&lt;br /&gt;
* [[Dassault Mirage 2000-5]]&lt;br /&gt;
* [[Saab JA-37 Viggen]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== My involvement with flight simulators ==&lt;br /&gt;
My involvement with flight simulators started when I got [http://www.ysflight.com/ YSFlight], another free flight simulator.  Although it was great fun, it wasn't very realistic, so I wanted something better.  After looking at [http://www.microsoft.com/games/fsinsider/ Microsoft Flight Simulator] and {{Wikipedia|Combat_Flight_Simulator_3:_Battle_for_Europe|Combat Flight Simulator|noicon=1}}, I found [http://www.flightgear.org/ FlightGear].  Since then I've wanted to improve FlightGear and make it better for the end user.&lt;br /&gt;
&lt;br /&gt;
In late August 2015, I became an administrator on the [[FlightGear Wiki]].&lt;br /&gt;
&lt;br /&gt;
As of January 2019, I am almost inactive on FlightGear due to lack of free time. I don't intend to stop, however, and hopefully will become more active again during Summer 2019.&lt;br /&gt;
&lt;br /&gt;
== Projects ==&lt;br /&gt;
=== Simulator ===&lt;br /&gt;
* [[British Aerospace Sea Harrier]] development. {{paused}}&lt;br /&gt;
* [[Scripted AI Objects]] development (with {{usr|5H1N0B1}}). {{paused}}&lt;br /&gt;
* Starting the [[Canvas HUD]] framework. {{not done}}&lt;br /&gt;
&lt;br /&gt;
=== Wiki ===&lt;br /&gt;
* Documenting the [[Nasal]] {{abbr|API|Application Programming Interface}} (see my [[User:Red_Leader/Nasal_documentation_proposal|Nasal documentation proposal]]) {{paused}}&lt;br /&gt;
&lt;br /&gt;
== Pages ==&lt;br /&gt;
* [[User:Red_Leader/Sandbox|My sandbox]]&lt;br /&gt;
* [[User:Red_Leader/Nasal_documentation_proposal|Nasal documentation proposal]]&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=What_is_Nasal&amp;diff=116967</id>
		<title>What is Nasal</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=What_is_Nasal&amp;diff=116967"/>
		<updated>2018-12-31T13:04:33Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: https://plausible.org/nasal/ is now a dead link (looks like the server was reinstalled). Provide reference link to the last save from the Wayback Machine&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Template:Nasal Navigation}}&lt;br /&gt;
&lt;br /&gt;
[[FlightGear]] offers a very powerful functional '''scripting language''' called '''Nasal'''&amp;lt;ref&amp;gt;https://web.archive.org/web/20160817183633/https://plausible.org/nasal/&amp;lt;/ref&amp;gt;, which supports reading and writing of internal [[Property Tree Intro|FlightGear properties]], accessing internal data via extension functions, creating GUI dialogs and much more. While &amp;quot;Nasal&amp;quot; may seem like a weird name, just read it as &amp;quot;FlightGear scripting&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Not another scripting language ==&lt;br /&gt;
Nasal uses some of the concepts of ECMA/JavaScript, Python and Perl and implements a simple but complete way of Object Oriented Programming (OOP), Nasal uses an internal garbage collector so that no manual memory management is required by the programmer. &lt;br /&gt;
&lt;br /&gt;
People familiar with other programming languages, and scripting languages like JavaScript in particular, are usually able to learn Nasal rather quickly. FlightGear provides a rich library of simulation-specific and general-purpose functions that can be accessed by Nasal scripts.&lt;br /&gt;
&lt;br /&gt;
Nasal code can be run by [[aircraft]] configuration files, and it can be embedded in various [[XML]] files (dialog files, animation files, bindings for [[joystick]]s, keyboard and cockpit controls, and even in [[Howto:Nasal in scenery object XML files|scenery objects]]). Nasal is platform independent and designed to be thread safe.&lt;br /&gt;
&lt;br /&gt;
{{Template:Appendix}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Red_Leader/Git&amp;diff=116523</id>
		<title>User:Red Leader/Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Red_Leader/Git&amp;diff=116523"/>
		<updated>2018-10-27T16:56:04Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Add Heading setup&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Intended to be a collection of notes on '''getting up and running with Git''' with the eventual aim of producing an article.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
* Download Git for https://git-scm.com/downloads.&lt;br /&gt;
* Install Git&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=British_Aerospace_Sea_Harrier/info&amp;diff=115907</id>
		<title>British Aerospace Sea Harrier/info</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=British_Aerospace_Sea_Harrier/info&amp;diff=115907"/>
		<updated>2018-08-23T08:16:32Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Change download link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{infobox aircraft&lt;br /&gt;
| name           = BAe Sea Harrier FA2&lt;br /&gt;
| image          = External-view-Sea-Harrier.png&lt;br /&gt;
| alt            = External view of the Sea Harrier&lt;br /&gt;
| image2         = Cockpit-Sea-Harrier.png&lt;br /&gt;
| alt2           = Cockpit of the Sea Harrier&lt;br /&gt;
| type           = VTOL aircraft/Military aircraft/Fighter aircraft/Carrier-based aircraft/Attack aircraft&lt;br /&gt;
| config         = High wing aircraft/Retractable gear aircraft&lt;br /&gt;
| propulsion     = Single-engine jet&lt;br /&gt;
| manufacturer   = British Aerospace&lt;br /&gt;
| author1        = Andy Ross&lt;br /&gt;
| author2        = Steve Havlir&lt;br /&gt;
| author3        = {{usr|Red Leader}} (present)&lt;br /&gt;
| fdm            = YASim&lt;br /&gt;
| fgname         = harrier&lt;br /&gt;
| status-fdm     = 2&lt;br /&gt;
| status-systems = 3&lt;br /&gt;
| status-cockpit = 3&lt;br /&gt;
| status-model   = 4&lt;br /&gt;
| ready          = airrefuel/bombable/rembrandt/canvas/checklist/tutorials&lt;br /&gt;
| download       = https://www.dropbox.com/s/8n9oig9v2xw7b75/harrier%20v2.5.0.zip?dl=0&lt;br /&gt;
| forumtid       = 24711&lt;br /&gt;
| navbar         = 1&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
This is the aircraft infobox subpage of the [[British Aerospace Sea Harrier]].&lt;br /&gt;
[[Category:Aircraft infobox documentation]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=British_Aerospace_Sea_Harrier&amp;diff=115906</id>
		<title>British Aerospace Sea Harrier</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=British_Aerospace_Sea_Harrier&amp;diff=115906"/>
		<updated>2018-08-23T08:16:04Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Change AI version &amp;amp; scenario link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{:{{PAGENAME}}/info}}&lt;br /&gt;
The '''British Aerospace Sea Harrier''' (informally '''Shar''') is a naval short take-off and vertical-landing/vertical take-off and landing jet fighter, reconnaissance and attack aircraft, and a development of the [[Hawker Siddeley Harrier GR1|Hawker Siddeley Harrier]]. It first entered service with the Royal Navy in April 1980 as the Sea Harrier {{abbr|FRS1|Fighter, Reconnaissance, Strike, Mk. 1}} and became informally known as the &amp;quot;Shar&amp;quot; ('''S'''ea '''Har'''rier). Unusual in an era in which most naval and land-based air superiority fighters were large and supersonic, the principal role of the subsonic Sea Harrier was to provide air defence of the fleet from Royal Navy aircraft carriers.  Retired in 2006, today there is only one airworthy Sea Harrier in the world.  XZ439, a restored former Royal Navy Sea Harrier FA2, is operated in the United States by Art Nalls, a former USMC pilot ([http://www.nallsaviation.com/ website]).&lt;br /&gt;
&lt;br /&gt;
The version currently modeled in [[FlightGear]] is the Sea Harrier {{abbr|FA2|Fighter, Attack, Mk. 2}}, an improved version with the {{wikipedia|Blue Vixen}} radar and the {{wikipedia|AIM-120 AMRAAM}} missile.&lt;br /&gt;
&lt;br /&gt;
== Keyboard controls ==&lt;br /&gt;
{| class=&amp;quot;keytable&amp;quot;&lt;br /&gt;
! Key&lt;br /&gt;
! Function&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|m}}&lt;br /&gt;
|Vector thrust upwards&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|Shift|m}}&lt;br /&gt;
|Vector thrust downwards&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|h}}&lt;br /&gt;
|Toggle HUD on/off&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|j}}&lt;br /&gt;
|Decrease air brake&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|k}}&lt;br /&gt;
|Increase air brake&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|e}}&lt;br /&gt;
|Release ordinance/fire gun&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|w}}&lt;br /&gt;
|Cycle stick mode selector&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|Ctrl|w}}&lt;br /&gt;
|Toggle station arming&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|Ctrl|f}}&lt;br /&gt;
|Release countermeasure&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|1}}/{{key press|2}}/{{key press|3}}/{{key press|4}}/{{key press|5}}/{{key press|6}}/{{key press|7}}&lt;br /&gt;
|Select station&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|Shift|&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
|Autostart&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|Shift|c}}&lt;br /&gt;
|Toggle canopy&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|n}}&lt;br /&gt;
|Next target&lt;br /&gt;
|-&lt;br /&gt;
|{{key press|Ctrl|n}}&lt;br /&gt;
|Previous target&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
* A fully working weapons system, including realistic stores and gun behaviour&lt;br /&gt;
* Semi-realistic startup&lt;br /&gt;
* [[Bombable]] support&lt;br /&gt;
* [[Rembrandt]] support&lt;br /&gt;
* Full electrical system, including switchable instruments &lt;br /&gt;
* [[Aircraft Checklists|Checklists]] and [[Tutorials]] support&lt;br /&gt;
* Realistic [[autopilot]]&lt;br /&gt;
* Modeled limits&lt;br /&gt;
* [[Canvas]] {{abbr|HDD|Head-down Display}}&lt;br /&gt;
* Flare/chaff system&lt;br /&gt;
* {{abbr|CCIP|Constantly-Computed Impact Point}} bombing system&lt;br /&gt;
* {{abbr|RWR|Radar Warning Receiver}} &lt;br /&gt;
* Bombable-compatible AI aircraft&lt;br /&gt;
* Fuel System&lt;br /&gt;
* [[Instant Replay]] support&lt;br /&gt;
* Custom failures based on the new [[A Failure Management Framework for FlightGear|custom failures framework]].&lt;br /&gt;
* Backwards compatibility (tested on both FG 3.2 and 2.12.0)&lt;br /&gt;
* [[Howto:Implement pushback|Pushback]] truck&lt;br /&gt;
&lt;br /&gt;
== Changes for the latest release (2.5.0) ==&lt;br /&gt;
* Nasal code style cleaned up&lt;br /&gt;
* All XML files encoded in UTF-8 w/o BOM; encoding added in headers&lt;br /&gt;
* Throttle and thrust vector levers fixed.&lt;br /&gt;
* Canvas HDD properly integrated&lt;br /&gt;
* Start Canvas-based radar&lt;br /&gt;
* All paths are now relative&lt;br /&gt;
* Some changes to the cockpit&lt;br /&gt;
* Some more bugfixes&lt;br /&gt;
* New splash texture&lt;br /&gt;
* License changed back to GNU GPL v2&lt;br /&gt;
&lt;br /&gt;
== Development ==&lt;br /&gt;
&amp;lt;big&amp;gt;Last updated 23 June 2016&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== For next release (2.6.0) ===&lt;br /&gt;
* Update docs&lt;br /&gt;
* Make new FDM&lt;br /&gt;
* Unify radar&lt;br /&gt;
&lt;br /&gt;
=== Cockpit ===&lt;br /&gt;
* More detailed cockpit (more info required)&lt;br /&gt;
&lt;br /&gt;
=== Model ===&lt;br /&gt;
* Better, more detailed model&lt;br /&gt;
* British 1,000lb bomb&lt;br /&gt;
&lt;br /&gt;
=== Systems ===&lt;br /&gt;
* New radar (possibly using [[Canvas Radar]])&lt;br /&gt;
* Autoland system&lt;br /&gt;
* Realistic {{abbr|SMS|Stores Management System}}&lt;br /&gt;
&lt;br /&gt;
=== FDM ===&lt;br /&gt;
* More realistic (data needed)&lt;br /&gt;
&lt;br /&gt;
=== General ===&lt;br /&gt;
* New [[Canvas Widgets|Canvas dialogs]]&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
=== FDM ===&lt;br /&gt;
* Aircraft swings on the ground.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* [https://forum.flightgear.org/viewtopic.php?f=4&amp;amp;t=24711 Forum topic]&lt;br /&gt;
* [https://www.dropbox.com/s/kot5l0x8oi9k5oy/AI%20harrier%20%26%20scenario.zip?dl=0 Bombable-compatible AI aircraft and scenario]&lt;br /&gt;
&lt;br /&gt;
=== External links ===&lt;br /&gt;
* {{wikipedia|British Aerospace Sea Harrier|noicon=1}} (Wikipedia)&lt;br /&gt;
* [http://www.naval-technology.com/projects/fa2-sea-harrier/ Sea Harrier] (naval-technology.com)&lt;br /&gt;
&lt;br /&gt;
{{British Aerospace}}&lt;br /&gt;
&lt;br /&gt;
{{air-to-air refueling}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Red_Leader/Git&amp;diff=115900</id>
		<title>User:Red Leader/Git</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Red_Leader/Git&amp;diff=115900"/>
		<updated>2018-08-22T18:05:08Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Start placeholder page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Intended to be a collection of notes on '''getting up and running with Git''' with the eventual aim of producing an article.&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115045</id>
		<title>Nasal library/clipboard</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115045"/>
		<updated>2018-04-27T13:05:19Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Doc setText()&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace provides functions for working with text stored in the {{wikipedia|Clipboard (computing)|clipboard}}. The &amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace is implemented in {{flightgear source|src/Scripting/NasalClipboard.cxx|pre=flightgear}}. There are also several files in the &amp;lt;tt&amp;gt;''Scripting''&amp;lt;/tt&amp;gt; folder that implement the backend depending on the OS.&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== getText() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = clipboard.getText([type]);&lt;br /&gt;
|source = {{flightgear source|src/Scripting/NasalClipboard.cxx|l=69|t=Source}}&lt;br /&gt;
|text = Returns the contents of the clipboard as a string.&lt;br /&gt;
|param1 = type&lt;br /&gt;
|param1text = Optional argument that specifies the source of the text. If &amp;lt;code&amp;gt;clipboard.CLIPBOARD&amp;lt;/code&amp;gt; (the default) is given, the contents of the clipboard are returned. If &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt; is given, the contents of the selection buffer are given. Note that only X11 systems properly implement &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt;, but this argument may still be used with &amp;lt;code&amp;gt;[[#setText()|setText()]]&amp;lt;/code&amp;gt; (see example 2).&lt;br /&gt;
|example1 = var text = clipboard.getText(); # make sure you copy some text first&lt;br /&gt;
print(&amp;quot;'&amp;quot;, text, &amp;quot;'&amp;quot;);&lt;br /&gt;
|example2 = clipboard.setText(&amp;quot;Demo&amp;quot;, clipboard.SELECTION);&lt;br /&gt;
var text = clipboard.getText(clipboard.SELECTION);&lt;br /&gt;
print(&amp;quot;'&amp;quot;, text, &amp;quot;'&amp;quot;); # prints 'Demo'&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== setText() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = clipboard.setText(text[, type]);&lt;br /&gt;
|source = {{flightgear source|src/Scripting/NasalClipboard.cxx|l=54|t=Source}}&lt;br /&gt;
|text = Sets the contents of the clipboard. If the operation is successful, 1 (true) is returned, otherwise 0 (false) is returned.&lt;br /&gt;
|param1 = text&lt;br /&gt;
|param1text = A string that will be put into the clipboard.&lt;br /&gt;
|param2 = type&lt;br /&gt;
|param2text = Optional argument that specifies into which part of the clipboard the text should be put. If &amp;lt;code&amp;gt;clipboard.CLIPBOARD&amp;lt;/code&amp;gt; (the default) is given, it will go to the normal clipboard. If &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt; is given, the text will be added to the selection buffer. Note that only X11 systems properly implement &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt;, but this argument may still be used with &amp;lt;code&amp;gt;[[#setText()|setText()]]&amp;lt;/code&amp;gt; (see example 2).&lt;br /&gt;
|example1 = clipboard.setText(&amp;quot;Demo&amp;quot;);&lt;br /&gt;
print(&amp;quot;'&amp;quot;, clipboard.getText(), &amp;quot;'&amp;quot;); # prints 'Demo'&lt;br /&gt;
|example2 = clipboard.setText(&amp;quot;Demo&amp;quot;, clipboard.SELECTION);&lt;br /&gt;
print(&amp;quot;'&amp;quot;, clipboard.getText(clipboard.SELECTION), &amp;quot;'&amp;quot;); # prints 'Demo'&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Constants ==&lt;br /&gt;
=== CLIPBOARD ===&lt;br /&gt;
&lt;br /&gt;
=== SELECTION ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115044</id>
		<title>Nasal library/clipboard</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115044"/>
		<updated>2018-04-27T08:07:48Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: /* getText() */ Source&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace provides functions for working with text stored in the {{wikipedia|Clipboard (computing)|clipboard}}. The &amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace is implemented in {{flightgear source|src/Scripting/NasalClipboard.cxx|pre=flightgear}}. There are also several files in the &amp;lt;tt&amp;gt;''Scripting''&amp;lt;/tt&amp;gt; folder that implement the backend depending on the OS.&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== getText() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = clipboard.getText([type]);&lt;br /&gt;
|source = {{flightgear source|src/Scripting/NasalClipboard.cxx|l=69|t=Source}}&lt;br /&gt;
|text = Returns the contents of the clipboard as a string.&lt;br /&gt;
|param1 = type&lt;br /&gt;
|param1text = Optional argument that specifies the source of the text. If &amp;lt;code&amp;gt;clipboard.CLIPBOARD&amp;lt;/code&amp;gt; (the default) is given, the contents of the clipboard are returned. If &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt; is given, the contents of the selection buffer are given. Note that only X11 systems properly implement &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt;, but this argument may still be used with &amp;lt;code&amp;gt;[[#setText()|setText()]]&amp;lt;/code&amp;gt; (see example 2).&lt;br /&gt;
|example1 = var text = clipboard.getText(); # make sure you copy some text first&lt;br /&gt;
print(&amp;quot;'&amp;quot;, text, &amp;quot;'&amp;quot;);&lt;br /&gt;
|example2 = clipboard.setText(&amp;quot;Demo&amp;quot;, clipboard.SELECTION);&lt;br /&gt;
var text = clipboard.getText(clipboard.SELECTION);&lt;br /&gt;
print(&amp;quot;'&amp;quot;, text, &amp;quot;'&amp;quot;); # prints 'Demo'&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== setText() ===&lt;br /&gt;
&lt;br /&gt;
== Constants ==&lt;br /&gt;
=== CLIPBOARD ===&lt;br /&gt;
&lt;br /&gt;
=== SELECTION ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115043</id>
		<title>Nasal library/clipboard</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115043"/>
		<updated>2018-04-27T07:16:00Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Change Template:Flightgear file to Template:Flightgear source&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace provides functions for working with text stored in the {{wikipedia|Clipboard (computing)|clipboard}}. The &amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace is implemented in {{flightgear source|src/Scripting/NasalClipboard.cxx|pre=flightgear}}. There are also several files in the &amp;lt;tt&amp;gt;''Scripting''&amp;lt;/tt&amp;gt; folder that implement the backend depending on the OS.&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== getText() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = clipboard.getText([type]);&lt;br /&gt;
&amp;lt;!-- |source = {{simgear file|simgear/nasal/mathlib.c|l=196|t=Source}} --&amp;gt;&lt;br /&gt;
|text = Returns the contents of the clipboard as a string.&lt;br /&gt;
|param1 = type&lt;br /&gt;
|param1text = Optional argument that specifies the source of the text. If &amp;lt;code&amp;gt;clipboard.CLIPBOARD&amp;lt;/code&amp;gt; (the default) is given, the contents of the clipboard are returned. If &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt; is given, the contents of the selection buffer are given. Note that only X11 systems properly implement &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt;, but this argument may still be used with &amp;lt;code&amp;gt;[[#setText()|setText()]]&amp;lt;/code&amp;gt; (see example 2).&lt;br /&gt;
|example1 = var text = clipboard.getText(); # make sure you copy some text first&lt;br /&gt;
print(&amp;quot;'&amp;quot;, text, &amp;quot;'&amp;quot;);&lt;br /&gt;
|example2 = clipboard.setText(&amp;quot;Demo&amp;quot;, clipboard.SELECTION);&lt;br /&gt;
var text = clipboard.getText(clipboard.SELECTION);&lt;br /&gt;
print(&amp;quot;'&amp;quot;, text, &amp;quot;'&amp;quot;); # prints 'Demo'&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== setText() ===&lt;br /&gt;
&lt;br /&gt;
== Constants ==&lt;br /&gt;
=== CLIPBOARD ===&lt;br /&gt;
&lt;br /&gt;
=== SELECTION ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115042</id>
		<title>Nasal library/clipboard</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115042"/>
		<updated>2018-04-27T06:48:15Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: /* getText() */ Link style&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace provides functions for working with text stored in the {{wikipedia|Clipboard (computing)|clipboard}}. The &amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace is implemented in {{flightgear file|src/Scripting/NasalClipboard.cxx}}. There are also several files in the &amp;lt;tt&amp;gt;''Scripting''&amp;lt;/tt&amp;gt; folder that implement the backend depending on the OS.&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== getText() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = clipboard.getText([type]);&lt;br /&gt;
&amp;lt;!-- |source = {{simgear file|simgear/nasal/mathlib.c|l=196|t=Source}} --&amp;gt;&lt;br /&gt;
|text = Returns the contents of the clipboard as a string.&lt;br /&gt;
|param1 = type&lt;br /&gt;
|param1text = Optional argument that specifies the source of the text. If &amp;lt;code&amp;gt;clipboard.CLIPBOARD&amp;lt;/code&amp;gt; (the default) is given, the contents of the clipboard are returned. If &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt; is given, the contents of the selection buffer are given. Note that only X11 systems properly implement &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt;, but this argument may still be used with &amp;lt;code&amp;gt;[[#setText()|setText()]]&amp;lt;/code&amp;gt; (see example 2).&lt;br /&gt;
|example1 = var text = clipboard.getText(); # make sure you copy some text first&lt;br /&gt;
print(&amp;quot;'&amp;quot;, text, &amp;quot;'&amp;quot;);&lt;br /&gt;
|example2 = clipboard.setText(&amp;quot;Demo&amp;quot;, clipboard.SELECTION);&lt;br /&gt;
var text = clipboard.getText(clipboard.SELECTION);&lt;br /&gt;
print(&amp;quot;'&amp;quot;, text, &amp;quot;'&amp;quot;); # prints 'Demo'&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== setText() ===&lt;br /&gt;
&lt;br /&gt;
== Constants ==&lt;br /&gt;
=== CLIPBOARD ===&lt;br /&gt;
&lt;br /&gt;
=== SELECTION ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115041</id>
		<title>Nasal library/clipboard</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115041"/>
		<updated>2018-04-26T18:59:52Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: /* getText() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace provides functions for working with text stored in the {{wikipedia|Clipboard (computing)|clipboard}}. The &amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace is implemented in {{flightgear file|src/Scripting/NasalClipboard.cxx}}. There are also several files in the &amp;lt;tt&amp;gt;''Scripting''&amp;lt;/tt&amp;gt; folder that implement the backend depending on the OS.&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== getText() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = clipboard.getText([type]);&lt;br /&gt;
&amp;lt;!-- |source = {{simgear file|simgear/nasal/mathlib.c|l=196|t=Source}} --&amp;gt;&lt;br /&gt;
|text = Returns the contents of the clipboard as a string.&lt;br /&gt;
|param1 = type&lt;br /&gt;
|param1text = Optional argument that specifies the source of the text. If &amp;lt;code&amp;gt;clipboard.CLIPBOARD&amp;lt;/code&amp;gt; (the default) is given, the contents of the clipboard are returned. If &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt; is given, the contents of the selection buffer are given. Note that only X11 systems properly implement &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt;, but this argument may still be used with [[#setText()|setText()]] (see example 2).&lt;br /&gt;
|example1 = var text = clipboard.getText(); # make sure you copy some text first&lt;br /&gt;
print(&amp;quot;'&amp;quot;, text, &amp;quot;'&amp;quot;);&lt;br /&gt;
|example2 = clipboard.setText(&amp;quot;Demo&amp;quot;, clipboard.SELECTION);&lt;br /&gt;
var text = clipboard.getText(clipboard.SELECTION);&lt;br /&gt;
print(&amp;quot;'&amp;quot;, text, &amp;quot;'&amp;quot;); # prints 'Demo'&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== setText() ===&lt;br /&gt;
&lt;br /&gt;
== Constants ==&lt;br /&gt;
=== CLIPBOARD ===&lt;br /&gt;
&lt;br /&gt;
=== SELECTION ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115040</id>
		<title>Nasal library/clipboard</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115040"/>
		<updated>2018-04-26T18:59:29Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace provides functions for working with text stored in the {{wikipedia|Clipboard (computing)|clipboard}}. The &amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace is implemented in {{flightgear file|src/Scripting/NasalClipboard.cxx}}. There are also several files in the &amp;lt;tt&amp;gt;''Scripting''&amp;lt;/tt&amp;gt; folder that implement the backend depending on the OS.&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== getText() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = clipboard.getText([type]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/mathlib.c|l=196|t=Source}}&lt;br /&gt;
|text = Returns the contents of the clipboard as a string.&lt;br /&gt;
|param1 = type&lt;br /&gt;
|param1text = Optional argument that specifies the source of the text. If &amp;lt;code&amp;gt;clipboard.CLIPBOARD&amp;lt;/code&amp;gt; (the default) is given, the contents of the clipboard are returned. If &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt; is given, the contents of the selection buffer are given. Note that only X11 systems properly implement &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt;, but this argument may still be used with [[#setText()|setText()]] (see example 2).&lt;br /&gt;
|example1 = var text = clipboard.getText(); # make sure you copy some text first&lt;br /&gt;
print(&amp;quot;'&amp;quot;, text, &amp;quot;'&amp;quot;);&lt;br /&gt;
|example2 = clipboard.setText(&amp;quot;Demo&amp;quot;, clipboard.SELECTION);&lt;br /&gt;
var text = clipboard.getText(clipboard.SELECTION);&lt;br /&gt;
print(&amp;quot;'&amp;quot;, text, &amp;quot;'&amp;quot;); # prints 'Demo'&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== setText() ===&lt;br /&gt;
&lt;br /&gt;
== Constants ==&lt;br /&gt;
=== CLIPBOARD ===&lt;br /&gt;
&lt;br /&gt;
=== SELECTION ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115039</id>
		<title>Nasal library/clipboard</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115039"/>
		<updated>2018-04-26T18:57:09Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: /* getText() */ Doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace provides functions for working with text stored in the {{wikipedia|Clipboard (computing)|clipboard}}. The &amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace is implemented in {{flightgear file|src/Scripting/NasalClipboard.cxx}}. There are also several files in the &amp;lt;tt&amp;gt;''Scripting''&amp;lt;/tt&amp;gt; folder that implement the backend depending on the OS.&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== getText() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = clipboard.getText([type]);&lt;br /&gt;
|source = {{simgear file|simgear/nasal/mathlib.c|l=196|t=Source}}&lt;br /&gt;
|text = Returns the contents of the clipboard as a string.&lt;br /&gt;
|param1 = type&lt;br /&gt;
|param1text = Optional argument that specifies the source of the text. If &amp;lt;code&amp;gt;clipboard.CLIPBOARD&amp;lt;/code&amp;gt; (the default) is given, the contents of the clipboard are returned. If &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt; is given, the contents of the selection buffer are given. Note that only X11 systems properly implement &amp;lt;code&amp;gt;clipboard.SELECTION&amp;lt;/code&amp;gt;, but this argument may still be used with [[#setText()|setText]] (see example 2).&lt;br /&gt;
|example1 = var text = clipboard.getText(); # make sure you copy some text first&lt;br /&gt;
print(&amp;quot;'&amp;quot;, text, &amp;quot;'&amp;quot;);&lt;br /&gt;
|example2 = clipboard.setText(&amp;quot;Demo&amp;quot;, clipboard.SELECTION);&lt;br /&gt;
var text = clipboard.getText(clipboard.SELECTION);&lt;br /&gt;
print(&amp;quot;'&amp;quot;, text, &amp;quot;'&amp;quot;); # prints 'Demo'&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== setText() ===&lt;br /&gt;
&lt;br /&gt;
== Constants ==&lt;br /&gt;
=== CLIPBOARD ===&lt;br /&gt;
&lt;br /&gt;
=== SELECTION ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115038</id>
		<title>Nasal library/clipboard</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115038"/>
		<updated>2018-04-26T18:38:17Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Grammar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace provides functions for working with text stored in the {{wikipedia|Clipboard (computing)|clipboard}}. The &amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace is implemented in {{flightgear file|src/Scripting/NasalClipboard.cxx}}. There are also several files in the &amp;lt;tt&amp;gt;''Scripting''&amp;lt;/tt&amp;gt; folder that implement the backend depending on the OS.&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== getText() ===&lt;br /&gt;
=== setText() ===&lt;br /&gt;
&lt;br /&gt;
== Constants ==&lt;br /&gt;
=== CLIPBOARD ===&lt;br /&gt;
&lt;br /&gt;
=== SELECTION ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Template:Nasal_Navigation&amp;diff=115037</id>
		<title>Template:Nasal Navigation</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Template:Nasal_Navigation&amp;diff=115037"/>
		<updated>2018-04-26T09:43:35Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{Informative template|1=&lt;br /&gt;
Navigation box for core [[Nasal]] articles.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
Put this at the top of the article:&lt;br /&gt;
 {{obr}}'''Nasal Navigation'''{{cbr}}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Navigation templates]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;{{nocat|{{{nocat|}}}|Nasal}}&amp;lt;/includeonly&amp;gt;{{forum|30|Nasal Scripting}}&lt;br /&gt;
{{sidebar with collapsible headers&lt;br /&gt;
| topimage = [[File:Nasallogo3.png]]&lt;br /&gt;
| name	= Nasal Navigation&lt;br /&gt;
| title = [[Nasal|Nasal scripting]]&lt;br /&gt;
| contentstyle = text-align: left;&lt;br /&gt;
| state = collapsed&lt;br /&gt;
&lt;br /&gt;
| content1 = &lt;br /&gt;
* [[What is Nasal]]?&lt;br /&gt;
* [[Nasal success stories|Success stories]]&lt;br /&gt;
* [[Nasal FAQ]]&lt;br /&gt;
* [[Nasal Snippets]]&lt;br /&gt;
* [[Howto:Syntax highlighting for Nasal]]&lt;br /&gt;
&lt;br /&gt;
| heading2 = Tools and utilities&lt;br /&gt;
| content2style = text-align: center;&lt;br /&gt;
| content2 = [[Nasal Console|Console]] &amp;amp;bull; [[Interactive Nasal Console|REPL Console]] &amp;amp;bull; [[Nasal Browser|Browser]]&lt;br /&gt;
&lt;br /&gt;
| heading3 = Getting started&lt;br /&gt;
| content3 =&lt;br /&gt;
* [[Nasal Best Practices]]&lt;br /&gt;
* [[Nasal for C++ programmers]]&lt;br /&gt;
* [[Creating new Nasal scripts]]&lt;br /&gt;
* [[Nasal Hello World]]&lt;br /&gt;
* [[Howto:Create a new Nasal module]]&lt;br /&gt;
* [[Using Nasal functions]]&lt;br /&gt;
* [[Nasal Variables]]&lt;br /&gt;
* [[Nasal Namespaces]]&lt;br /&gt;
* [[Howto:Understand Namespaces and Methods|Namespace and Methods]]&lt;br /&gt;
* [[Nasal Namespaces in-depth]]&lt;br /&gt;
* [[Nasal Conditionals]]&lt;br /&gt;
* [[Nasal Loops]]&lt;br /&gt;
* [[Numbers in Nasal]]&lt;br /&gt;
* [[Nasal Operators]]&lt;br /&gt;
* [[Howto:Use vectors and foreach loops to write shorter code]]&lt;br /&gt;
* [[Howto:Start using vectors and hashes in Nasal]]&lt;br /&gt;
* [[Nasal library]] ([[Nasal library#Core library functions|core]]/[[Nasal library#Extension functions|extension]] functions)&lt;br /&gt;
** [[Nasal library/clipboard|&amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/debug|&amp;lt;code&amp;gt;debug&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/geo|&amp;lt;code&amp;gt;geo&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/io|&amp;lt;code&amp;gt;io&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/math|&amp;lt;code&amp;gt;math&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/os.path|&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/props|&amp;lt;code&amp;gt;props&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
* [[Nasal String Manipulation]]&lt;br /&gt;
* [[Howto:Write a parser in Nasal]]&lt;br /&gt;
* [[Nasal File I/O]]&lt;br /&gt;
* [[Nasal Flightplan]]&lt;br /&gt;
* [[Object oriented programming in Nasal|OOP Introduction]]&lt;br /&gt;
* [[Object Oriented Programming with Nasal]]&lt;br /&gt;
* [[Nasal Callbacks Explained]]&lt;br /&gt;
* [[Exception handling with Nasal]]&lt;br /&gt;
* [[Using listeners and signals with Nasal]]&lt;br /&gt;
* [[Developing and debugging Nasal code]]&lt;br /&gt;
&lt;br /&gt;
| heading4 = Advanced Tutorials&lt;br /&gt;
| content4 =&lt;br /&gt;
* [[Caching Nasal function calls]]&lt;br /&gt;
* [[Nasal Unit Testing Framework]] (WIP)&lt;br /&gt;
* [[Nasal Meta-Programming]]&lt;br /&gt;
* [[A GPX flight logger in Nasal]]&lt;br /&gt;
* [[Multiplayer scripting in Nasal]]&lt;br /&gt;
* [[Howto:Making HTTP Requests from Nasal]]&lt;br /&gt;
* [[Howto:Transmit properties over MP]]&lt;br /&gt;
* [[Howto:Terrain sampling in Nasal]]&lt;br /&gt;
* [[Howto:Create a new system in Nasal]]&lt;br /&gt;
* [[Howto:Load a Nasal file at runtime]]&lt;br /&gt;
* [[Howto:Control the route manager in Nasal]]&lt;br /&gt;
* [[Howto:Get a number of elevation offsets for a number of objects]]&lt;br /&gt;
* [[Howto:Nasal in scenery object XML files]]&lt;br /&gt;
* [[Howto:Create animation XML files from Nasal]]&lt;br /&gt;
* [[Howto:Port I/O from Nasal]]&lt;br /&gt;
* [[Howto:Continuation-passing style programming in Nasal]]&lt;br /&gt;
* [[Howto:Start worker threads using listeners in Nasal]]&lt;br /&gt;
* [[Howto:Developing a DSL interpreter in Nasal]]&lt;br /&gt;
* [[Howto:Nasal Metaprogramming]]&lt;br /&gt;
* [[Nasal/JavaScript Subset]]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
{{Nasal Internals}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Red_Leader/Nasal_documentation_proposal&amp;diff=115036</id>
		<title>User:Red Leader/Nasal documentation proposal</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Red_Leader/Nasal_documentation_proposal&amp;diff=115036"/>
		<updated>2018-04-26T09:42:46Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Proposal for the documentation of the [[Nasal]] API.&lt;br /&gt;
__TOC__&lt;br /&gt;
== Documentation pages ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Nasal library {{Done}}&lt;br /&gt;
! Old page(s) !! New page &lt;br /&gt;
|- &lt;br /&gt;
| &lt;br /&gt;
* [[Nasal library functions]] ([http://wiki.flightgear.org/index.php?title=Nasal_library_functions&amp;amp;oldid=93458 perm])&lt;br /&gt;
* [[List of Nasal extension functions]] ([http://wiki.flightgear.org/index.php?title=List_of_Nasal_extension_functions&amp;amp;oldid=72953 perm])&lt;br /&gt;
|| [[Nasal library]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Form: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Nasal library/&amp;lt;namespace&amp;gt;]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Nasal namespaces {{progressbar|30}}&lt;br /&gt;
! Namespace !! New page !! Progress&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''aircraft'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|rowspan{{=}}&amp;quot;2&amp;quot; colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''bits'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''clipboard'''&amp;lt;/code&amp;gt; || [[Nasal library/debug]] || {{progressbar|10}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''debug'''&amp;lt;/code&amp;gt; || [[Nasal library/debug]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''geo'''&amp;lt;/code&amp;gt; || [[Nasal library/geo]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''gui'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|rowspan{{=}}&amp;quot;2&amp;quot; colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''http'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''io'''&amp;lt;/code&amp;gt; || [[Nasal library/io]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''math'''&amp;lt;/code&amp;gt; || [[Nasal library/math]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''mp_broadcast'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''os[.path]'''&amp;lt;/code&amp;gt;  || [[Nasal library/os.path]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''positioned'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''props'''&amp;lt;/code&amp;gt; || [[Nasal library/props‎‎]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''scenery'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|rowspan{{=}}&amp;quot;7&amp;quot; colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''screen'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''std'''&amp;lt;/code&amp;gt; (current page: [[Vector]])&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''string'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''thread'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''utf8'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''view'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Basic Nasal scripting {{Not done}}&lt;br /&gt;
! Subject !! Current page(s) !! New page&lt;br /&gt;
|-&lt;br /&gt;
| Hashes&lt;br /&gt;
|&lt;br /&gt;
* [[Howto:Start using vectors and hashes in Nasal]] &lt;br /&gt;
* [[Object Oriented Programming with Nasal]]&lt;br /&gt;
* [[Object oriented programming in Nasal]]&lt;br /&gt;
* [[Howto:Understand Namespaces and Methods]]&lt;br /&gt;
* [[Nasal Namespaces in-depth]]&lt;br /&gt;
| [[Hashes in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Namespaces&lt;br /&gt;
|&lt;br /&gt;
* [[Howto:Understand Namespaces and Methods]]&lt;br /&gt;
* [[Nasal Namespaces in-depth]] &lt;br /&gt;
* [[Nasal Namespaces]]&lt;br /&gt;
| [[Namespaces in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Numbers || {{N/a|Very little}} || [[Numbers in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Vectors&lt;br /&gt;
|&lt;br /&gt;
* [[Nasal Variables]]&lt;br /&gt;
* [[Howto:Use vectors and foreach loops to write shorter code]]&lt;br /&gt;
* [[Howto:Start using vectors and hashes in Nasal]]&lt;br /&gt;
| [[Vectors in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Strings || [[Nasal Hello World]] || [[Strings in Nasal]]&lt;br /&gt;
|- &lt;br /&gt;
| Conditionals || [[Nasal Conditionals]] || [[Conditionals in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Operators || [[Nasal Operators]] || [[Operators in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Loops || [[Nasal Loops]] || [[Loops in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Functions || [[Using Nasal functions]] || [[Functions in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Variables || [[Nasal Variables]] || [[Variables in Nasal]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Advanced Nasal scripting {{Not done}}&lt;br /&gt;
! What? !! Current page(s) !! New page&lt;br /&gt;
|-&lt;br /&gt;
| Vector slicing  || [[Nasal Variables]] || [[Vectors in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| OOP&lt;br /&gt;
|&lt;br /&gt;
* [[Object Oriented Programming with Nasal]]&lt;br /&gt;
* [[Object oriented programming in Nasal]]&lt;br /&gt;
| [[Object orientated programming in Nasal]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ [[Canvas]] {{Abbr|API|Application Programming Interface}} {{Not done}}&lt;br /&gt;
! What? !! Current page(s)&lt;br /&gt;
|-&lt;br /&gt;
| Canvas Element || [[Canvas Element]]&lt;br /&gt;
|-&lt;br /&gt;
| Canvas Image || [[Canvas Image]]&lt;br /&gt;
|-&lt;br /&gt;
| Canvas Path || [[Canvas Path]]&lt;br /&gt;
|-&lt;br /&gt;
| Canvas Map || &lt;br /&gt;
* [[Canvas Map API]] {{FG ver|&amp;lt; 3.0}}&lt;br /&gt;
* [[Canvas MapStructure]] {{FG ver|3.0+}}&lt;br /&gt;
|-&lt;br /&gt;
| Event handling || [[Canvas Event Handling]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | [[Canvas GUI]]&lt;br /&gt;
|-&lt;br /&gt;
| Layout system || [[Canvas Layout System]]&lt;br /&gt;
|- &lt;br /&gt;
| Widgets&lt;br /&gt;
|&lt;br /&gt;
* [[Canvas Widget Matrix]]&lt;br /&gt;
* [[Canvas GUI]]&lt;br /&gt;
* [[Howto:Creating a Canvas GUI Widget]]&lt;br /&gt;
|-&lt;br /&gt;
| Canvas MessageBox || [[Canvas MessageBox]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Navbox ==&lt;br /&gt;
{{forum|30|Nasal}}&lt;br /&gt;
{{sidebar with collapsible headers&lt;br /&gt;
| topimage = [[File:Nasallogo3.png]]&lt;br /&gt;
| name	= Nasal Navigation&lt;br /&gt;
| title = [[Nasal|Nasal scripting]]&lt;br /&gt;
| contentstyle = text-align: left;&lt;br /&gt;
| state = collapsed&lt;br /&gt;
&lt;br /&gt;
| content1style = text-align: center;&lt;br /&gt;
| content1 = [[Nasal success stories|Success stories]] &amp;amp;bull; [[Nasal FAQ|FAQ]]&lt;br /&gt;
&lt;br /&gt;
| heading2 = Tools and utilities&lt;br /&gt;
| content2style = text-align: center;&lt;br /&gt;
| content2 = [[Nasal Console|Console]] &amp;amp;bull; [[Interactive Nasal Console|REPL Console]] &amp;amp;bull; [[Nasal Browser|Browser]] &amp;amp;bull; [[Howto:Syntax highlighting for Nasal|Syntax highlighting]]&lt;br /&gt;
&lt;br /&gt;
| heading3 = Getting started&lt;br /&gt;
| content3 =&lt;br /&gt;
* [[Nasal syntax overview|Syntax overview]]&lt;br /&gt;
* [[Writing Nasal scripts]]&lt;br /&gt;
* [[Nasal Snippets]]&lt;br /&gt;
* [[Developing and debugging Nasal code]]&lt;br /&gt;
&lt;br /&gt;
| heading4 = Basic Scripting&lt;br /&gt;
| content4style = text-align: center;&lt;br /&gt;
| content4 = [[Hashes in Nasal|Hashes]] &amp;amp;bull; [[Variables in Nasal|Variables]] &amp;amp;bull; [[Operators in Nasal|Operators]] &amp;amp;bull; [[Functions in Nasal|Functions]] &amp;amp;bull; [[Namespaces in Nasal|Namespaces]] &amp;amp;bull; [[Strings in Nasal|Strings]] &amp;amp;bull; [[Vectors in Nasal|Vectors]] &amp;amp;bull; [[Conditionals in Nasal|Conditionals]] &amp;amp;bull; [[Numbers in Nasal|Numbers]] &amp;amp;bull; [[Loops in Nasal|Loops]]&lt;br /&gt;
&lt;br /&gt;
| heading5 = Advanced Scripting&lt;br /&gt;
| content5 =&lt;br /&gt;
* [[Object orientated programming in Nasal|Object orientated programming]]&lt;br /&gt;
* [[Nasal Flightplan]]&lt;br /&gt;
* [[Callbacks in Nasal]]&lt;br /&gt;
* [[Exception handling with Nasal]]&lt;br /&gt;
* [[Using listeners and signals with Nasal]]&lt;br /&gt;
* [[Caching Nasal function calls]]&lt;br /&gt;
* [[Nasal Unit Testing Framework]] (WIP)&lt;br /&gt;
* [[Nasal Meta-Programming]]&lt;br /&gt;
* [[A GPX flight logger in Nasal]]&lt;br /&gt;
* [[Multiplayer scripting in Nasal]]&lt;br /&gt;
| heading6 = Howtos&lt;br /&gt;
| content6 =&lt;br /&gt;
* [[Howto:Write a parser in Nasal]]&lt;br /&gt;
* [[Howto:Making HTTP Requests from Nasal]]&lt;br /&gt;
* [[Howto:Transmit properties over MP]]&lt;br /&gt;
* [[Howto:Terrain sampling in Nasal]]&lt;br /&gt;
* [[Howto:Create a new system in Nasal]]&lt;br /&gt;
* [[Howto:Load a Nasal file at runtime]]&lt;br /&gt;
* [[Howto:Control the route manager in Nasal]]&lt;br /&gt;
* [[Howto:Get a number of elevation offsets for a number of objects]]&lt;br /&gt;
* [[Howto:Nasal in scenery object XML files]]&lt;br /&gt;
* [[Howto:Create animation XML files from Nasal]]&lt;br /&gt;
* [[Howto:Port I/O from Nasal]]&lt;br /&gt;
* [[Howto:Continuation-passing style programming in Nasal]]&lt;br /&gt;
* [[Howto:Start worker threads using listeners in Nasal]]&lt;br /&gt;
* [[Howto:Developing a DSL interpreter in Nasal]]&lt;br /&gt;
* [[Howto:Nasal Metaprogramming]]&lt;br /&gt;
* [[Nasal/JavaScript Subset]]&lt;br /&gt;
| heading7 = Reference&lt;br /&gt;
| content7 =&lt;br /&gt;
* [[Nasal library]] ([[Nasal library#Core library functions|core]]/[[Nasal library#Extension functions|extension]] functions)&lt;br /&gt;
** [[Nasal library/geo|&amp;lt;code&amp;gt;geo&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/io|&amp;lt;code&amp;gt;io&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/math|&amp;lt;code&amp;gt;math&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/props|&amp;lt;code&amp;gt;props&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
* [[Nasal String Manipulation]]&lt;br /&gt;
}}&lt;br /&gt;
{{Nasal Internals}}&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
* Merge [[Nasal scripting language]] and [[What is Nasal]] into [[Nasal]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Nasal namespace documentation]]&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115035</id>
		<title>Nasal library/clipboard</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115035"/>
		<updated>2018-04-26T08:19:38Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: /* CLIPBAORD */ Spelling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace provides functions for working with text stored in the {{wikipedia|Clipboard (computing)|clipboard}}. The &amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; is implemented namespace is defined from {{flightgear file|src/Scripting/NasalClipboard.cxx}}. There are also several files in the &amp;lt;tt&amp;gt;''Scripting''&amp;lt;/tt&amp;gt; folder that implement the backend depending on the OS.&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== getText() ===&lt;br /&gt;
=== setText() ===&lt;br /&gt;
&lt;br /&gt;
== Constants ==&lt;br /&gt;
=== CLIPBOARD ===&lt;br /&gt;
&lt;br /&gt;
=== SELECTION ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Red_Leader/Nasal_documentation_proposal&amp;diff=115034</id>
		<title>User:Red Leader/Nasal documentation proposal</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Red_Leader/Nasal_documentation_proposal&amp;diff=115034"/>
		<updated>2018-04-26T08:19:18Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Add category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Proposal for the documentation of the [[Nasal]] API.&lt;br /&gt;
__TOC__&lt;br /&gt;
== Documentation pages ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Nasal library {{Done}}&lt;br /&gt;
! Old page(s) !! New page &lt;br /&gt;
|- &lt;br /&gt;
| &lt;br /&gt;
* [[Nasal library functions]] ([http://wiki.flightgear.org/index.php?title=Nasal_library_functions&amp;amp;oldid=93458 perm])&lt;br /&gt;
* [[List of Nasal extension functions]] ([http://wiki.flightgear.org/index.php?title=List_of_Nasal_extension_functions&amp;amp;oldid=72953 perm])&lt;br /&gt;
|| [[Nasal library]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Form: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Nasal library/&amp;lt;namespace&amp;gt;]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Nasal namespaces {{progressbar|30}}&lt;br /&gt;
! Namespace !! New page !! Progress&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''aircraft'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|rowspan{{=}}&amp;quot;3&amp;quot; colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''bits'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''clipboard'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''debug'''&amp;lt;/code&amp;gt; || [[Nasal library/debug]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''geo'''&amp;lt;/code&amp;gt; || [[Nasal library/geo]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''gui'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|rowspan{{=}}&amp;quot;2&amp;quot; colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''http'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''io'''&amp;lt;/code&amp;gt; || [[Nasal library/io]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''math'''&amp;lt;/code&amp;gt; || [[Nasal library/math]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''mp_broadcast'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''os[.path]'''&amp;lt;/code&amp;gt;  || [[Nasal library/os.path]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''positioned'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''props'''&amp;lt;/code&amp;gt; || [[Nasal library/props‎‎]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''scenery'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|rowspan{{=}}&amp;quot;7&amp;quot; colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''screen'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''std'''&amp;lt;/code&amp;gt; (current page: [[Vector]])&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''string'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''thread'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''utf8'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''view'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Basic Nasal scripting {{Not done}}&lt;br /&gt;
! Subject !! Current page(s) !! New page&lt;br /&gt;
|-&lt;br /&gt;
| Hashes&lt;br /&gt;
|&lt;br /&gt;
* [[Howto:Start using vectors and hashes in Nasal]] &lt;br /&gt;
* [[Object Oriented Programming with Nasal]]&lt;br /&gt;
* [[Object oriented programming in Nasal]]&lt;br /&gt;
* [[Howto:Understand Namespaces and Methods]]&lt;br /&gt;
* [[Nasal Namespaces in-depth]]&lt;br /&gt;
| [[Hashes in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Namespaces&lt;br /&gt;
|&lt;br /&gt;
* [[Howto:Understand Namespaces and Methods]]&lt;br /&gt;
* [[Nasal Namespaces in-depth]] &lt;br /&gt;
* [[Nasal Namespaces]]&lt;br /&gt;
| [[Namespaces in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Numbers || {{N/a|Very little}} || [[Numbers in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Vectors&lt;br /&gt;
|&lt;br /&gt;
* [[Nasal Variables]]&lt;br /&gt;
* [[Howto:Use vectors and foreach loops to write shorter code]]&lt;br /&gt;
* [[Howto:Start using vectors and hashes in Nasal]]&lt;br /&gt;
| [[Vectors in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Strings || [[Nasal Hello World]] || [[Strings in Nasal]]&lt;br /&gt;
|- &lt;br /&gt;
| Conditionals || [[Nasal Conditionals]] || [[Conditionals in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Operators || [[Nasal Operators]] || [[Operators in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Loops || [[Nasal Loops]] || [[Loops in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Functions || [[Using Nasal functions]] || [[Functions in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Variables || [[Nasal Variables]] || [[Variables in Nasal]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Advanced Nasal scripting {{Not done}}&lt;br /&gt;
! What? !! Current page(s) !! New page&lt;br /&gt;
|-&lt;br /&gt;
| Vector slicing  || [[Nasal Variables]] || [[Vectors in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| OOP&lt;br /&gt;
|&lt;br /&gt;
* [[Object Oriented Programming with Nasal]]&lt;br /&gt;
* [[Object oriented programming in Nasal]]&lt;br /&gt;
| [[Object orientated programming in Nasal]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ [[Canvas]] {{Abbr|API|Application Programming Interface}} {{Not done}}&lt;br /&gt;
! What? !! Current page(s)&lt;br /&gt;
|-&lt;br /&gt;
| Canvas Element || [[Canvas Element]]&lt;br /&gt;
|-&lt;br /&gt;
| Canvas Image || [[Canvas Image]]&lt;br /&gt;
|-&lt;br /&gt;
| Canvas Path || [[Canvas Path]]&lt;br /&gt;
|-&lt;br /&gt;
| Canvas Map || &lt;br /&gt;
* [[Canvas Map API]] {{FG ver|&amp;lt; 3.0}}&lt;br /&gt;
* [[Canvas MapStructure]] {{FG ver|3.0+}}&lt;br /&gt;
|-&lt;br /&gt;
| Event handling || [[Canvas Event Handling]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | [[Canvas GUI]]&lt;br /&gt;
|-&lt;br /&gt;
| Layout system || [[Canvas Layout System]]&lt;br /&gt;
|- &lt;br /&gt;
| Widgets&lt;br /&gt;
|&lt;br /&gt;
* [[Canvas Widget Matrix]]&lt;br /&gt;
* [[Canvas GUI]]&lt;br /&gt;
* [[Howto:Creating a Canvas GUI Widget]]&lt;br /&gt;
|-&lt;br /&gt;
| Canvas MessageBox || [[Canvas MessageBox]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Navbox ==&lt;br /&gt;
{{forum|30|Nasal}}&lt;br /&gt;
{{sidebar with collapsible headers&lt;br /&gt;
| topimage = [[File:Nasallogo3.png]]&lt;br /&gt;
| name	= Nasal Navigation&lt;br /&gt;
| title = [[Nasal|Nasal scripting]]&lt;br /&gt;
| contentstyle = text-align: left;&lt;br /&gt;
| state = collapsed&lt;br /&gt;
&lt;br /&gt;
| content1style = text-align: center;&lt;br /&gt;
| content1 = [[Nasal success stories|Success stories]] &amp;amp;bull; [[Nasal FAQ|FAQ]]&lt;br /&gt;
&lt;br /&gt;
| heading2 = Tools and utilities&lt;br /&gt;
| content2style = text-align: center;&lt;br /&gt;
| content2 = [[Nasal Console|Console]] &amp;amp;bull; [[Interactive Nasal Console|REPL Console]] &amp;amp;bull; [[Nasal Browser|Browser]] &amp;amp;bull; [[Howto:Syntax highlighting for Nasal|Syntax highlighting]]&lt;br /&gt;
&lt;br /&gt;
| heading3 = Getting started&lt;br /&gt;
| content3 =&lt;br /&gt;
* [[Nasal syntax overview|Syntax overview]]&lt;br /&gt;
* [[Writing Nasal scripts]]&lt;br /&gt;
* [[Nasal Snippets]]&lt;br /&gt;
* [[Developing and debugging Nasal code]]&lt;br /&gt;
&lt;br /&gt;
| heading4 = Basic Scripting&lt;br /&gt;
| content4style = text-align: center;&lt;br /&gt;
| content4 = [[Hashes in Nasal|Hashes]] &amp;amp;bull; [[Variables in Nasal|Variables]] &amp;amp;bull; [[Operators in Nasal|Operators]] &amp;amp;bull; [[Functions in Nasal|Functions]] &amp;amp;bull; [[Namespaces in Nasal|Namespaces]] &amp;amp;bull; [[Strings in Nasal|Strings]] &amp;amp;bull; [[Vectors in Nasal|Vectors]] &amp;amp;bull; [[Conditionals in Nasal|Conditionals]] &amp;amp;bull; [[Numbers in Nasal|Numbers]] &amp;amp;bull; [[Loops in Nasal|Loops]]&lt;br /&gt;
&lt;br /&gt;
| heading5 = Advanced Scripting&lt;br /&gt;
| content5 =&lt;br /&gt;
* [[Object orientated programming in Nasal|Object orientated programming]]&lt;br /&gt;
* [[Nasal Flightplan]]&lt;br /&gt;
* [[Callbacks in Nasal]]&lt;br /&gt;
* [[Exception handling with Nasal]]&lt;br /&gt;
* [[Using listeners and signals with Nasal]]&lt;br /&gt;
* [[Caching Nasal function calls]]&lt;br /&gt;
* [[Nasal Unit Testing Framework]] (WIP)&lt;br /&gt;
* [[Nasal Meta-Programming]]&lt;br /&gt;
* [[A GPX flight logger in Nasal]]&lt;br /&gt;
* [[Multiplayer scripting in Nasal]]&lt;br /&gt;
| heading6 = Howtos&lt;br /&gt;
| content6 =&lt;br /&gt;
* [[Howto:Write a parser in Nasal]]&lt;br /&gt;
* [[Howto:Making HTTP Requests from Nasal]]&lt;br /&gt;
* [[Howto:Transmit properties over MP]]&lt;br /&gt;
* [[Howto:Terrain sampling in Nasal]]&lt;br /&gt;
* [[Howto:Create a new system in Nasal]]&lt;br /&gt;
* [[Howto:Load a Nasal file at runtime]]&lt;br /&gt;
* [[Howto:Control the route manager in Nasal]]&lt;br /&gt;
* [[Howto:Get a number of elevation offsets for a number of objects]]&lt;br /&gt;
* [[Howto:Nasal in scenery object XML files]]&lt;br /&gt;
* [[Howto:Create animation XML files from Nasal]]&lt;br /&gt;
* [[Howto:Port I/O from Nasal]]&lt;br /&gt;
* [[Howto:Continuation-passing style programming in Nasal]]&lt;br /&gt;
* [[Howto:Start worker threads using listeners in Nasal]]&lt;br /&gt;
* [[Howto:Developing a DSL interpreter in Nasal]]&lt;br /&gt;
* [[Howto:Nasal Metaprogramming]]&lt;br /&gt;
* [[Nasal/JavaScript Subset]]&lt;br /&gt;
| heading7 = Reference&lt;br /&gt;
| content7 =&lt;br /&gt;
* [[Nasal library]] ([[Nasal library#Core library functions|core]]/[[Nasal library#Extension functions|extension]] functions)&lt;br /&gt;
** [[Nasal library/geo|&amp;lt;code&amp;gt;geo&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/io|&amp;lt;code&amp;gt;io&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/math|&amp;lt;code&amp;gt;math&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/props|&amp;lt;code&amp;gt;props&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
* [[Nasal String Manipulation]]&lt;br /&gt;
}}&lt;br /&gt;
{{Nasal Internals}}&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
* Merge [[Nasal scripting language]] and [[What is Nasal]] into [[Nasal]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Nasal namespace documentation]]&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Template:Nasal_namespaces&amp;diff=115033</id>
		<title>Template:Nasal namespaces</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Template:Nasal_namespaces&amp;diff=115033"/>
		<updated>2018-04-26T08:18:19Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Update&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{navbox&lt;br /&gt;
|name  = Nasal namespaces&lt;br /&gt;
|title = [[Nasal Namespaces|Nasal namespaces]]&lt;br /&gt;
&lt;br /&gt;
|above = [[Nasal library|Global namespace (globals)]]&lt;br /&gt;
|list1 = [[Nasal library/clipboard|clipboard]] &amp;amp;bull; [[Nasal library/debug|debug]] &amp;amp;bull; [[Nasal library/geo|geo]] &amp;amp;bull; [[Nasal library/io|io]] &amp;amp;bull; [[Nasal library/math|math]] &amp;amp;bull; [[Nasal library/os.path|os.path]] &amp;amp;bull; [[Nasal library/props|props]]&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;includeonly&amp;gt;{{main other|[[Category:Nasal namespace documentation]]}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Informative template|1=&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Goal ==&lt;br /&gt;
This navigation template enables easy navigation between different [[Nasal Namespaces|Nasal namespaces]].&lt;br /&gt;
&lt;br /&gt;
Adding this template to a page in the article namespace will automatically add [[:Category:Nasal namespace documentation]] to that page.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
Put this line before the categories and the language links at the bottom of the article.&lt;br /&gt;
 {{obr}}'''Nasal namespaces'''{{cbr}}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Navigation templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115032</id>
		<title>Nasal library/clipboard</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/clipboard&amp;diff=115032"/>
		<updated>2018-04-26T08:17:33Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: In the beginning...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace provides functions for working with text stored in the {{wikipedia|Clipboard (computing)|clipboard}}. The &amp;lt;code&amp;gt;clipboard&amp;lt;/code&amp;gt; is implemented namespace is defined from {{flightgear file|src/Scripting/NasalClipboard.cxx}}. There are also several files in the &amp;lt;tt&amp;gt;''Scripting''&amp;lt;/tt&amp;gt; folder that implement the backend depending on the OS.&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== getText() ===&lt;br /&gt;
=== setText() ===&lt;br /&gt;
&lt;br /&gt;
== Constants ==&lt;br /&gt;
=== CLIPBAORD ===&lt;br /&gt;
=== SELECTION ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=User:Red_Leader/Nasal_documentation_proposal&amp;diff=115019</id>
		<title>User:Red Leader/Nasal documentation proposal</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=User:Red_Leader/Nasal_documentation_proposal&amp;diff=115019"/>
		<updated>2018-04-22T20:12:57Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: /* Documentation pages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Proposal for the documentation of the [[Nasal]] API.&lt;br /&gt;
__TOC__&lt;br /&gt;
== Documentation pages ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Nasal library {{Done}}&lt;br /&gt;
! Old page(s) !! New page &lt;br /&gt;
|- &lt;br /&gt;
| &lt;br /&gt;
* [[Nasal library functions]] ([http://wiki.flightgear.org/index.php?title=Nasal_library_functions&amp;amp;oldid=93458 perm])&lt;br /&gt;
* [[List of Nasal extension functions]] ([http://wiki.flightgear.org/index.php?title=List_of_Nasal_extension_functions&amp;amp;oldid=72953 perm])&lt;br /&gt;
|| [[Nasal library]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Form: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;[[Nasal library/&amp;lt;namespace&amp;gt;]]&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Nasal namespaces {{progressbar|30}}&lt;br /&gt;
! Namespace !! New page !! Progress&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''aircraft'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|rowspan{{=}}&amp;quot;3&amp;quot; colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''bits'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''clipboard'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''debug'''&amp;lt;/code&amp;gt; || [[Nasal library/debug]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''geo'''&amp;lt;/code&amp;gt; || [[Nasal library/geo]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''gui'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|rowspan{{=}}&amp;quot;2&amp;quot; colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''http'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''io'''&amp;lt;/code&amp;gt; || [[Nasal library/io]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''math'''&amp;lt;/code&amp;gt; || [[Nasal library/math]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''mp_broadcast'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''os[.path]'''&amp;lt;/code&amp;gt;  || [[Nasal library/os.path]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''positioned'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''props'''&amp;lt;/code&amp;gt; || [[Nasal library/props‎‎]] || {{done}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''scenery'''&amp;lt;/code&amp;gt;&lt;br /&gt;
| {{N/a|Not started|rowspan{{=}}&amp;quot;7&amp;quot; colspan{{=}}&amp;quot;2&amp;quot;}}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''screen'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''std'''&amp;lt;/code&amp;gt; (current page: [[Vector]])&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''string'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''thread'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''utf8'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;'''view'''&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Basic Nasal scripting {{Not done}}&lt;br /&gt;
! Subject !! Current page(s) !! New page&lt;br /&gt;
|-&lt;br /&gt;
| Hashes&lt;br /&gt;
|&lt;br /&gt;
* [[Howto:Start using vectors and hashes in Nasal]] &lt;br /&gt;
* [[Object Oriented Programming with Nasal]]&lt;br /&gt;
* [[Object oriented programming in Nasal]]&lt;br /&gt;
* [[Howto:Understand Namespaces and Methods]]&lt;br /&gt;
* [[Nasal Namespaces in-depth]]&lt;br /&gt;
| [[Hashes in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Namespaces&lt;br /&gt;
|&lt;br /&gt;
* [[Howto:Understand Namespaces and Methods]]&lt;br /&gt;
* [[Nasal Namespaces in-depth]] &lt;br /&gt;
* [[Nasal Namespaces]]&lt;br /&gt;
| [[Namespaces in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Numbers || {{N/a|Very little}} || [[Numbers in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Vectors&lt;br /&gt;
|&lt;br /&gt;
* [[Nasal Variables]]&lt;br /&gt;
* [[Howto:Use vectors and foreach loops to write shorter code]]&lt;br /&gt;
* [[Howto:Start using vectors and hashes in Nasal]]&lt;br /&gt;
| [[Vectors in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Strings || [[Nasal Hello World]] || [[Strings in Nasal]]&lt;br /&gt;
|- &lt;br /&gt;
| Conditionals || [[Nasal Conditionals]] || [[Conditionals in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Operators || [[Nasal Operators]] || [[Operators in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Loops || [[Nasal Loops]] || [[Loops in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Functions || [[Using Nasal functions]] || [[Functions in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| Variables || [[Nasal Variables]] || [[Variables in Nasal]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Advanced Nasal scripting {{Not done}}&lt;br /&gt;
! What? !! Current page(s) !! New page&lt;br /&gt;
|-&lt;br /&gt;
| Vector slicing  || [[Nasal Variables]] || [[Vectors in Nasal]]&lt;br /&gt;
|-&lt;br /&gt;
| OOP&lt;br /&gt;
|&lt;br /&gt;
* [[Object Oriented Programming with Nasal]]&lt;br /&gt;
* [[Object oriented programming in Nasal]]&lt;br /&gt;
| [[Object orientated programming in Nasal]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ [[Canvas]] {{Abbr|API|Application Programming Interface}} {{Not done}}&lt;br /&gt;
! What? !! Current page(s)&lt;br /&gt;
|-&lt;br /&gt;
| Canvas Element || [[Canvas Element]]&lt;br /&gt;
|-&lt;br /&gt;
| Canvas Image || [[Canvas Image]]&lt;br /&gt;
|-&lt;br /&gt;
| Canvas Path || [[Canvas Path]]&lt;br /&gt;
|-&lt;br /&gt;
| Canvas Map || &lt;br /&gt;
* [[Canvas Map API]] {{FG ver|&amp;lt; 3.0}}&lt;br /&gt;
* [[Canvas MapStructure]] {{FG ver|3.0+}}&lt;br /&gt;
|-&lt;br /&gt;
| Event handling || [[Canvas Event Handling]]&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | [[Canvas GUI]]&lt;br /&gt;
|-&lt;br /&gt;
| Layout system || [[Canvas Layout System]]&lt;br /&gt;
|- &lt;br /&gt;
| Widgets&lt;br /&gt;
|&lt;br /&gt;
* [[Canvas Widget Matrix]]&lt;br /&gt;
* [[Canvas GUI]]&lt;br /&gt;
* [[Howto:Creating a Canvas GUI Widget]]&lt;br /&gt;
|-&lt;br /&gt;
| Canvas MessageBox || [[Canvas MessageBox]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Navbox ==&lt;br /&gt;
{{forum|30|Nasal}}&lt;br /&gt;
{{sidebar with collapsible headers&lt;br /&gt;
| topimage = [[File:Nasallogo3.png]]&lt;br /&gt;
| name	= Nasal Navigation&lt;br /&gt;
| title = [[Nasal|Nasal scripting]]&lt;br /&gt;
| contentstyle = text-align: left;&lt;br /&gt;
| state = collapsed&lt;br /&gt;
&lt;br /&gt;
| content1style = text-align: center;&lt;br /&gt;
| content1 = [[Nasal success stories|Success stories]] &amp;amp;bull; [[Nasal FAQ|FAQ]]&lt;br /&gt;
&lt;br /&gt;
| heading2 = Tools and utilities&lt;br /&gt;
| content2style = text-align: center;&lt;br /&gt;
| content2 = [[Nasal Console|Console]] &amp;amp;bull; [[Interactive Nasal Console|REPL Console]] &amp;amp;bull; [[Nasal Browser|Browser]] &amp;amp;bull; [[Howto:Syntax highlighting for Nasal|Syntax highlighting]]&lt;br /&gt;
&lt;br /&gt;
| heading3 = Getting started&lt;br /&gt;
| content3 =&lt;br /&gt;
* [[Nasal syntax overview|Syntax overview]]&lt;br /&gt;
* [[Writing Nasal scripts]]&lt;br /&gt;
* [[Nasal Snippets]]&lt;br /&gt;
* [[Developing and debugging Nasal code]]&lt;br /&gt;
&lt;br /&gt;
| heading4 = Basic Scripting&lt;br /&gt;
| content4style = text-align: center;&lt;br /&gt;
| content4 = [[Hashes in Nasal|Hashes]] &amp;amp;bull; [[Variables in Nasal|Variables]] &amp;amp;bull; [[Operators in Nasal|Operators]] &amp;amp;bull; [[Functions in Nasal|Functions]] &amp;amp;bull; [[Namespaces in Nasal|Namespaces]] &amp;amp;bull; [[Strings in Nasal|Strings]] &amp;amp;bull; [[Vectors in Nasal|Vectors]] &amp;amp;bull; [[Conditionals in Nasal|Conditionals]] &amp;amp;bull; [[Numbers in Nasal|Numbers]] &amp;amp;bull; [[Loops in Nasal|Loops]]&lt;br /&gt;
&lt;br /&gt;
| heading5 = Advanced Scripting&lt;br /&gt;
| content5 =&lt;br /&gt;
* [[Object orientated programming in Nasal|Object orientated programming]]&lt;br /&gt;
* [[Nasal Flightplan]]&lt;br /&gt;
* [[Callbacks in Nasal]]&lt;br /&gt;
* [[Exception handling with Nasal]]&lt;br /&gt;
* [[Using listeners and signals with Nasal]]&lt;br /&gt;
* [[Caching Nasal function calls]]&lt;br /&gt;
* [[Nasal Unit Testing Framework]] (WIP)&lt;br /&gt;
* [[Nasal Meta-Programming]]&lt;br /&gt;
* [[A GPX flight logger in Nasal]]&lt;br /&gt;
* [[Multiplayer scripting in Nasal]]&lt;br /&gt;
| heading6 = Howtos&lt;br /&gt;
| content6 =&lt;br /&gt;
* [[Howto:Write a parser in Nasal]]&lt;br /&gt;
* [[Howto:Making HTTP Requests from Nasal]]&lt;br /&gt;
* [[Howto:Transmit properties over MP]]&lt;br /&gt;
* [[Howto:Terrain sampling in Nasal]]&lt;br /&gt;
* [[Howto:Create a new system in Nasal]]&lt;br /&gt;
* [[Howto:Load a Nasal file at runtime]]&lt;br /&gt;
* [[Howto:Control the route manager in Nasal]]&lt;br /&gt;
* [[Howto:Get a number of elevation offsets for a number of objects]]&lt;br /&gt;
* [[Howto:Nasal in scenery object XML files]]&lt;br /&gt;
* [[Howto:Create animation XML files from Nasal]]&lt;br /&gt;
* [[Howto:Port I/O from Nasal]]&lt;br /&gt;
* [[Howto:Continuation-passing style programming in Nasal]]&lt;br /&gt;
* [[Howto:Start worker threads using listeners in Nasal]]&lt;br /&gt;
* [[Howto:Developing a DSL interpreter in Nasal]]&lt;br /&gt;
* [[Howto:Nasal Metaprogramming]]&lt;br /&gt;
* [[Nasal/JavaScript Subset]]&lt;br /&gt;
| heading7 = Reference&lt;br /&gt;
| content7 =&lt;br /&gt;
* [[Nasal library]] ([[Nasal library#Core library functions|core]]/[[Nasal library#Extension functions|extension]] functions)&lt;br /&gt;
** [[Nasal library/geo|&amp;lt;code&amp;gt;geo&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/io|&amp;lt;code&amp;gt;io&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/math|&amp;lt;code&amp;gt;math&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
** [[Nasal library/props|&amp;lt;code&amp;gt;props&amp;lt;/code&amp;gt; namespace]]&lt;br /&gt;
* [[Nasal String Manipulation]]&lt;br /&gt;
}}&lt;br /&gt;
{{Nasal Internals}}&lt;br /&gt;
{{-}}&lt;br /&gt;
&lt;br /&gt;
== Misc ==&lt;br /&gt;
* Merge [[Nasal scripting language]] and [[What is Nasal]] into [[Nasal]]&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=115018</id>
		<title>Nasal library/os.path</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=115018"/>
		<updated>2018-04-22T20:12:16Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Finish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace implements tools (from SGPath) for manipulating file paths. Everything in the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace is sourced from {{flightgear file|src/Scripting/NasalSGPath.cxx}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
{{note|Everything here was added to FlightGear 3.0. (released [[FlightGear History#Release timeline|February 2014]])|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Class ==&lt;br /&gt;
=== os.path ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|mode = class&lt;br /&gt;
|text = A pseudo-class (actually a Nasal ghost). This is the main class that stores and allows manipulation of file paths. This is also integrated into the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
==== new() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.new([path]);&lt;br /&gt;
|text = Constructor function. Returns a new &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; instance. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will default to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;); # Windows filepath&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
==== set() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.set([path]);&lt;br /&gt;
|text = Sets the filepath. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will be set to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.set(&amp;quot;C:/Windows/Program Files&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints new path&lt;br /&gt;
}}&lt;br /&gt;
==== append() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.append([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the new part to add to the filepath. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.append(&amp;quot;Program Files&amp;quot;);&lt;br /&gt;
# path.append(&amp;quot;bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== concat() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.concat([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying part to concat to the existing filepath. Note that this will simply add the string to the end of the path without adding a separator. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.concat(&amp;quot;/Program Files&amp;quot;);&lt;br /&gt;
# path.concat(&amp;quot;/bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== exists() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.exists();&lt;br /&gt;
|text = Returns 1 (true) if the path exists and 0 (false) if it does not.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 1 (true)&lt;br /&gt;
path.set(&amp;quot;C:/Window&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/r&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== canRead() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canRead();&lt;br /&gt;
|text = Returns 1 (true) if the path can be read (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canRead()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.canRead()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== canWrite() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canWrite();&lt;br /&gt;
|text = Returns 1 (true) if the path can be written to (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canWrite()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;) ~ &amp;quot;/txt.log&amp;quot;);&lt;br /&gt;
print(path.canWrite()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isFile() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isFile();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a file and 0 (false) if it points to a directory. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isFile()); # prints 0 (false)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isFile()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isDir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isDir();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a directory and 0 (false) if it points to a file. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isDir()); # prints 1 (true)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isDir()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== isRelative() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isRelative();&lt;br /&gt;
|text = Returns 1 (true) if the path is relative and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
path.set(&amp;quot;./Nasal&amp;quot;);&lt;br /&gt;
print(path.isRelative()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isAbsolute() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isAbsolute();&lt;br /&gt;
|text = Returns 1 (true) if the path is an absolute path and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isAbsolute()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isNull() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isNull();&lt;br /&gt;
|text = Returns 1 (true) if the path is null and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new();&lt;br /&gt;
print(path.isNull());&lt;br /&gt;
}}&lt;br /&gt;
==== create_dir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.create_dir();&lt;br /&gt;
|text = Creates the parent of the path as a directory. This will only work if the path is absolute and considered as writable by {{func link|fgValidatePath()|link=https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Main/util.cxx#l142}} (typically okay under [[$FG_HOME]]/Export).&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test/demo.txt&amp;quot;);&lt;br /&gt;
path.create_dir(); # Creates $FG_HOME/Export/test/&lt;br /&gt;
}}&lt;br /&gt;
==== remove() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.remove();&lt;br /&gt;
|text = Removes the last element of the path from the file directory. This will only work if the path is absolute and deletion of the file is permitted by the file permissions (typically okay under [[$FG_HOME]]/Export). Note that on Windows, deletion of read-only files are never permitted.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo.txt&amp;quot;);&lt;br /&gt;
var file = io.open(path.realpath, &amp;quot;w&amp;quot;);&lt;br /&gt;
io.write(file, 'Hello, World' ~ &amp;quot;\n&amp;quot;);&lt;br /&gt;
io.close(file);&lt;br /&gt;
print(path.exists()); # prints &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
path.remove();&lt;br /&gt;
print(path.exists()); # prints &amp;quot;0&amp;quot;&lt;br /&gt;
|example2 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test&amp;quot;);&lt;br /&gt;
path.create_dir();&lt;br /&gt;
path.remove(); # folder &amp;quot;/test&amp;quot; is removed&lt;br /&gt;
}}&lt;br /&gt;
==== rename() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.rename(new_name);&lt;br /&gt;
|text = Renames the last element of the path from the file directory. This will only work if the path is absolute, the old path is both readable and writable, the new path is writable.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo.txt&amp;quot;);&lt;br /&gt;
var file = io.open(path.realpath, &amp;quot;w&amp;quot;);&lt;br /&gt;
io.write(file, 'Hello, World' ~ &amp;quot;\n&amp;quot;);&lt;br /&gt;
io.close(file);&lt;br /&gt;
path.rename(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo1.txt&amp;quot;);&lt;br /&gt;
print(path.realpath); # prints $FG_HOME/Export/demo1.txt&lt;br /&gt;
}}&lt;br /&gt;
==== realpath ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.realpath;&lt;br /&gt;
|text = A string variable that gives the full file path. This should only be used when the path is an absolute path. If the path is relative, it will simply be appended to the FlightGear folder (the level up from [[$FG_ROOT]]).&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.realpath); # prints the absolute path of $FG_HOME&lt;br /&gt;
}}&lt;br /&gt;
==== file ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.file;&lt;br /&gt;
|text = A string variable that gives the last part of the filepath.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.file); # prints &amp;quot;flightgear.org&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== dir ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.dir;&lt;br /&gt;
|text = A string variable that gives all of the filepath except the last element (see &amp;lt;code&amp;gt;os.path.file&amp;lt;/code&amp;gt; above).&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;Program Files/temp/text.txt&amp;quot;);&lt;br /&gt;
print(path.dir); # prints &amp;quot;Program Files/temp&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== base ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.base;&lt;br /&gt;
|text = A string variable that gives all of the filepath except the extension of the file. If the filepath points to a folder, it has the same value as [[#realpath|realpath]].&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;Program Files/temp/text.txt&amp;quot;);&lt;br /&gt;
print(path.base); # prints &amp;quot;Program Files/temp/text&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== file_base ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.file_base;&lt;br /&gt;
|text = A string variable that gives the file name without the extension. If the filepath points to a folder, it will simply be the folder name.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;Program Files/temp/text.txt&amp;quot;);&lt;br /&gt;
print(path.file_base); # prints &amp;quot;text&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== extension ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.extension;&lt;br /&gt;
|text = A string variable that gives the file's extension. If the filepath points to a folder, it will be an empty string.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;Program Files/temp/text.txt&amp;quot;);&lt;br /&gt;
print(path.extension); # prints &amp;quot;txt&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== lower_extension ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.lower_extension;&lt;br /&gt;
|text = A string variable that gives the file's extension, but converted to lowercase. If the filepath points to a folder, it will be an empty string.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;Program Files/temp/text.TXT&amp;quot;);&lt;br /&gt;
print(path.lower_extension); # prints &amp;quot;txt&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== complete_lower_extension ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.complete_lower_extension;&lt;br /&gt;
|text = This is to be used when a file has a double extension (e.g., &amp;lt;code&amp;gt;.tar.gz&amp;lt;/code&amp;gt;). It also converts it to lowercase.  If the filepath points to a folder, it will be an empty string.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;Program Files/temp/text.TAR.GZ&amp;quot;);&lt;br /&gt;
print(path.complete_lower_extension); # prints &amp;quot;tar.gz&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== str ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.str;&lt;br /&gt;
|text = A string giving the path that the instance points too.&lt;br /&gt;
This is to be used when a file has a double extension (e.g., &amp;lt;code&amp;gt;.tar.gz&amp;lt;/code&amp;gt;). It also converts it to lowercase.  If the filepath points to a folder, it will be an empty string.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;../temp/text.txt&amp;quot;);&lt;br /&gt;
print(path.str); # prints &amp;quot;../temp/text.txt&amp;quot;&lt;br /&gt;
|example2 = var path = os.path.new(getprop(&amp;quot;sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.str); # prints the full path to $FG_HOME&lt;br /&gt;
}}&lt;br /&gt;
==== mtime ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.mtime;&lt;br /&gt;
|text = An integer giving the Unix time when the file or folder was last modified.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.mtime); # prints a Unix time&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== desktop() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.desktop();&lt;br /&gt;
|text = Creates and returns an &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; pointing to the desktop location.&lt;br /&gt;
&lt;br /&gt;
{{Note|As of April 2018, this function does not work properly and returns the &amp;lt;code&amp;gt;/bin&amp;lt;/code&amp;gt; folder.}}&lt;br /&gt;
|example1 = var path = os.path.desktop();&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
=== standardLocation() ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.standardLocation(location);&lt;br /&gt;
|text = Creates and returns an &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; pointing to the standard location.&lt;br /&gt;
&lt;br /&gt;
{{Note|As of April 2018, only supplying &amp;quot;HOME&amp;quot; to this function actually works. All the others do not work properly and return the &amp;lt;code&amp;gt;/bin&amp;lt;/code&amp;gt; folder.}}&lt;br /&gt;
|param1 = location&lt;br /&gt;
|param1text = String specifying the standard location to use. May be one of &amp;lt;code&amp;gt;HOME&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DESKTOP&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOWNLOADS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DOCUMENTS&amp;lt;/code&amp;gt;, or &amp;lt;code&amp;gt;PICTURES&amp;lt;/code&amp;gt;.&lt;br /&gt;
|example1 = var path = os.path.standardLocation(&amp;quot;HOME&amp;quot;);&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114929</id>
		<title>Nasal library/os.path</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114929"/>
		<updated>2018-04-15T20:30:39Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: More doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace implements tools (from SGPath) for manipulating file paths. Everything in the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace is sourced from {{flightgear file|src/Scripting/NasalSGPath.cxx}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
{{note|Everything here was added to FlightGear 3.0. (released [[FlightGear History#Release timeline|February 2014]])|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Class ==&lt;br /&gt;
=== os.path ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|mode = class&lt;br /&gt;
|text = A pseudo-class (actually a Nasal ghost). This is the main class that stores and allows manipulation of file paths. This is also integrated into the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
==== new() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.new([path]);&lt;br /&gt;
|text = Constructor function. Returns a new &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; instance. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will default to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;); # Windows filepath&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
==== set() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.set([path]);&lt;br /&gt;
|text = Sets the filepath. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will be set to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.set(&amp;quot;C:/Windows/Program Files&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints new path&lt;br /&gt;
}}&lt;br /&gt;
==== append() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.append([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the new part to add to the filepath. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.append(&amp;quot;Program Files&amp;quot;);&lt;br /&gt;
# path.append(&amp;quot;bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== concat() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.concat([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying part to concat to the existing filepath. Note that this will simply add the string to the end of the path without adding a separator. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.concat(&amp;quot;/Program Files&amp;quot;);&lt;br /&gt;
# path.concat(&amp;quot;/bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== exists() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.exists();&lt;br /&gt;
|text = Returns 1 (true) if the path exists and 0 (false) if it does not.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 1 (true)&lt;br /&gt;
path.set(&amp;quot;C:/Window&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/r&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== canRead() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canRead();&lt;br /&gt;
|text = Returns 1 (true) if the path can be read (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canRead()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.canRead()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== canWrite() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canWrite();&lt;br /&gt;
|text = Returns 1 (true) if the path can be written to (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canWrite()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;) ~ &amp;quot;/txt.log&amp;quot;);&lt;br /&gt;
print(path.canWrite()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isFile() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isFile();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a file and 0 (false) if it points to a directory. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isFile()); # prints 0 (false)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isFile()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isDir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isDir();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a directory and 0 (false) if it points to a file. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isDir()); # prints 1 (true)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isDir()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== isRelative() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isRelative();&lt;br /&gt;
|text = Returns 1 (true) if the path is relative and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
path.set(&amp;quot;./Nasal&amp;quot;);&lt;br /&gt;
print(path.isRelative()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isAbsolute() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isAbsolute();&lt;br /&gt;
|text = Returns 1 (true) if the path is an absolute path and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isAbsolute()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isNull() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isNull();&lt;br /&gt;
|text = Returns 1 (true) if the path is null and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new();&lt;br /&gt;
print(path.isNull());&lt;br /&gt;
}}&lt;br /&gt;
==== create_dir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.create_dir();&lt;br /&gt;
|text = Creates the parent of the path as a directory. This will only work if the path is absolute and considered as writable by {{func link|fgValidatePath()|link=https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Main/util.cxx#l142}} (typically okay under [[$FG_HOME]]/Export).&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test/demo.txt&amp;quot;);&lt;br /&gt;
path.create_dir(); # Creates $FG_HOME/Export/test/&lt;br /&gt;
}}&lt;br /&gt;
==== remove() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.remove();&lt;br /&gt;
|text = Removes the last element of the path from the file directory. This will only work if the path is absolute and deletion of the file is permitted by the file permissions (typically okay under [[$FG_HOME]]/Export). Note that on Windows, deletion of read-only files are never permitted.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo.txt&amp;quot;);&lt;br /&gt;
var file = io.open(path.realpath, &amp;quot;w&amp;quot;);&lt;br /&gt;
io.write(file, 'Hello, World' ~ &amp;quot;\n&amp;quot;);&lt;br /&gt;
io.close(file);&lt;br /&gt;
print(path.exists()); # prints &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
path.remove();&lt;br /&gt;
print(path.exists()); # prints &amp;quot;0&amp;quot;&lt;br /&gt;
|example2 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test&amp;quot;);&lt;br /&gt;
path.create_dir();&lt;br /&gt;
path.remove(); # folder &amp;quot;/test&amp;quot; is removed&lt;br /&gt;
}}&lt;br /&gt;
==== rename() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.rename(new_name);&lt;br /&gt;
|text = Renames the last element of the path from the file directory. This will only work if the path is absolute, the old path is both readable and writable, the new path is writable.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo.txt&amp;quot;);&lt;br /&gt;
var file = io.open(path.realpath, &amp;quot;w&amp;quot;);&lt;br /&gt;
io.write(file, 'Hello, World' ~ &amp;quot;\n&amp;quot;);&lt;br /&gt;
io.close(file);&lt;br /&gt;
path.rename(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo1.txt&amp;quot;);&lt;br /&gt;
print(path.realpath); # prints $FG_HOME/Export/demo1.txt&lt;br /&gt;
}}&lt;br /&gt;
==== realpath ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.realpath;&lt;br /&gt;
|text = A string variable that gives the full file path. This should only be used when the path is an absolute path. If the path is relative, it will simply be appended to the FlightGear folder (the level up from [[$FG_ROOT]]).&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.realpath); # prints the absolute path of $FG_HOME&lt;br /&gt;
}}&lt;br /&gt;
==== file ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.file;&lt;br /&gt;
|text = A string variable that gives the last part of the filepath.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.file); # prints &amp;quot;flightgear.org&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== dir ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.dir;&lt;br /&gt;
|text = A string variable that gives all of the filepath except the last element (see &amp;lt;code&amp;gt;os.path.file&amp;lt;/code&amp;gt; above).&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;Program Files/temp/text.txt&amp;quot;);&lt;br /&gt;
print(path.dir); # prints &amp;quot;Program Files/temp&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== base ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.base;&lt;br /&gt;
|text = A string variable that gives all of the filepath except the extension of the file. If the filepath points to a folder, it has the same value as [[#realpath|realpath]].&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;Program Files/temp/text.txt&amp;quot;);&lt;br /&gt;
print(path.base); # prints &amp;quot;Program Files/temp/text&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== file_base ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.file_base;&lt;br /&gt;
|text = A string variable that gives the file name without the extension. If the filepath points to a folder, it will simply be the folder name.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;Program Files/temp/text.txt&amp;quot;);&lt;br /&gt;
print(path.file_base); # prints &amp;quot;text&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== extension ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.extension;&lt;br /&gt;
|text = A string variable that gives the file's extension. If the filepath points to a folder, it will be an empty string.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;Program Files/temp/text.txt&amp;quot;);&lt;br /&gt;
print(path.extension); # prints &amp;quot;txt&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== lower_extension ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.lower_extension;&lt;br /&gt;
|text = A string variable that gives the file's extension, but converted to lowercase. If the filepath points to a folder, it will be an empty string.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;Program Files/temp/text.TXT&amp;quot;);&lt;br /&gt;
print(path.lower_extension); # prints &amp;quot;txt&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== complete_lower_extension ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.complete_lower_extension;&lt;br /&gt;
|text = This is to be used when a file has a double extension (e.g., &amp;lt;code&amp;gt;.tar.gz&amp;lt;/code&amp;gt;). It also converts it to lowercase.  If the filepath points to a folder, it will be an empty string.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;Program Files/temp/text.TAR.GZ&amp;quot;);&lt;br /&gt;
print(path.complete_lower_extension); # prints &amp;quot;tar.gz&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== str ====&lt;br /&gt;
==== mtime ====&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== desktop() ===&lt;br /&gt;
=== standardLocation() ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114928</id>
		<title>Nasal library/os.path</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114928"/>
		<updated>2018-04-15T19:53:17Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: /* realpath */ finish&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace implements tools (from SGPath) for manipulating file paths. Everything in the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace is sourced from {{flightgear file|src/Scripting/NasalSGPath.cxx}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
{{note|Everything here was added to FlightGear 3.0. (released [[FlightGear History#Release timeline|February 2014]])|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Class ==&lt;br /&gt;
=== os.path ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|mode = class&lt;br /&gt;
|text = A pseudo-class (actually a Nasal ghost). This is the main class that stores and allows manipulation of file paths. This is also integrated into the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
==== new() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.new([path]);&lt;br /&gt;
|text = Constructor function. Returns a new &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; instance. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will default to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;); # Windows filepath&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
==== set() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.set([path]);&lt;br /&gt;
|text = Sets the filepath. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will be set to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.set(&amp;quot;C:/Windows/Program Files&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints new path&lt;br /&gt;
}}&lt;br /&gt;
==== append() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.append([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the new part to add to the filepath. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.append(&amp;quot;Program Files&amp;quot;);&lt;br /&gt;
# path.append(&amp;quot;bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== concat() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.concat([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying part to concat to the existing filepath. Note that this will simply add the string to the end of the path without adding a separator. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.concat(&amp;quot;/Program Files&amp;quot;);&lt;br /&gt;
# path.concat(&amp;quot;/bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== exists() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.exists();&lt;br /&gt;
|text = Returns 1 (true) if the path exists and 0 (false) if it does not.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 1 (true)&lt;br /&gt;
path.set(&amp;quot;C:/Window&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/r&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== canRead() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canRead();&lt;br /&gt;
|text = Returns 1 (true) if the path can be read (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canRead()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.canRead()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== canWrite() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canWrite();&lt;br /&gt;
|text = Returns 1 (true) if the path can be written to (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canWrite()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;) ~ &amp;quot;/txt.log&amp;quot;);&lt;br /&gt;
print(path.canWrite()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isFile() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isFile();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a file and 0 (false) if it points to a directory. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isFile()); # prints 0 (false)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isFile()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isDir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isDir();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a directory and 0 (false) if it points to a file. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isDir()); # prints 1 (true)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isDir()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== isRelative() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isRelative();&lt;br /&gt;
|text = Returns 1 (true) if the path is relative and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
path.set(&amp;quot;./Nasal&amp;quot;);&lt;br /&gt;
print(path.isRelative()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isAbsolute() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isAbsolute();&lt;br /&gt;
|text = Returns 1 (true) if the path is an absolute path and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isAbsolute()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isNull() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isNull();&lt;br /&gt;
|text = Returns 1 (true) if the path is null and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new();&lt;br /&gt;
print(path.isNull());&lt;br /&gt;
}}&lt;br /&gt;
==== create_dir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.create_dir();&lt;br /&gt;
|text = Creates the parent of the path as a directory. This will only work if the path is absolute and considered as writable by {{func link|fgValidatePath()|link=https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Main/util.cxx#l142}} (typically okay under [[$FG_HOME]]/Export).&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test/demo.txt&amp;quot;);&lt;br /&gt;
path.create_dir(); # Creates $FG_HOME/Export/test/&lt;br /&gt;
}}&lt;br /&gt;
==== remove() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.remove();&lt;br /&gt;
|text = Removes the last element of the path from the file directory. This will only work if the path is absolute and deletion of the file is permitted by the file permissions (typically okay under [[$FG_HOME]]/Export). Note that on Windows, deletion of read-only files are never permitted.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo.txt&amp;quot;);&lt;br /&gt;
var file = io.open(path.realpath, &amp;quot;w&amp;quot;);&lt;br /&gt;
io.write(file, 'Hello, World' ~ &amp;quot;\n&amp;quot;);&lt;br /&gt;
io.close(file);&lt;br /&gt;
print(path.exists()); # prints &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
path.remove();&lt;br /&gt;
print(path.exists()); # prints &amp;quot;0&amp;quot;&lt;br /&gt;
|example2 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test&amp;quot;);&lt;br /&gt;
path.create_dir();&lt;br /&gt;
path.remove(); # folder &amp;quot;/test&amp;quot; is removed&lt;br /&gt;
}}&lt;br /&gt;
==== rename() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.rename(new_name);&lt;br /&gt;
|text = Renames the last element of the path from the file directory. This will only work if the path is absolute, the old path is both readable and writable, the new path is writable.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo.txt&amp;quot;);&lt;br /&gt;
var file = io.open(path.realpath, &amp;quot;w&amp;quot;);&lt;br /&gt;
io.write(file, 'Hello, World' ~ &amp;quot;\n&amp;quot;);&lt;br /&gt;
io.close(file);&lt;br /&gt;
path.rename(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo1.txt&amp;quot;);&lt;br /&gt;
print(path.realpath); # prints $FG_HOME/Export/demo1.txt&lt;br /&gt;
}}&lt;br /&gt;
==== realpath ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.realpath;&lt;br /&gt;
|text = A variable that is a string and gives the full file path. This should only be used when the path is an absolute path. If the path is relative, it will simply be appended to the FlightGear folder (the level up from [[$FG_ROOT]]).&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.realpath); # prints the absolute path of $FG_HOME&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== file ====&lt;br /&gt;
==== dir ====&lt;br /&gt;
==== base ====&lt;br /&gt;
==== file_base ====&lt;br /&gt;
==== extension ====&lt;br /&gt;
==== lower_extension ====&lt;br /&gt;
==== complete_lower_extension ====&lt;br /&gt;
==== str ====&lt;br /&gt;
==== mtime ====&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== desktop() ===&lt;br /&gt;
=== standardLocation() ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114924</id>
		<title>Nasal library/os.path</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114924"/>
		<updated>2018-04-15T19:05:55Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Start realpath doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace implements tools (from SGPath) for manipulating file paths. Everything in the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace is sourced from {{flightgear file|src/Scripting/NasalSGPath.cxx}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
{{note|Everything here was added to FlightGear 3.0. (released [[FlightGear History#Release timeline|February 2014]])|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Class ==&lt;br /&gt;
=== os.path ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|mode = class&lt;br /&gt;
|text = A pseudo-class (actually a Nasal ghost). This is the main class that stores and allows manipulation of file paths. This is also integrated into the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
==== new() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.new([path]);&lt;br /&gt;
|text = Constructor function. Returns a new &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; instance. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will default to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;); # Windows filepath&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
==== set() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.set([path]);&lt;br /&gt;
|text = Sets the filepath. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will be set to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.set(&amp;quot;C:/Windows/Program Files&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints new path&lt;br /&gt;
}}&lt;br /&gt;
==== append() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.append([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the new part to add to the filepath. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.append(&amp;quot;Program Files&amp;quot;);&lt;br /&gt;
# path.append(&amp;quot;bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== concat() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.concat([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying part to concat to the existing filepath. Note that this will simply add the string to the end of the path without adding a separator. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.concat(&amp;quot;/Program Files&amp;quot;);&lt;br /&gt;
# path.concat(&amp;quot;/bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== exists() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.exists();&lt;br /&gt;
|text = Returns 1 (true) if the path exists and 0 (false) if it does not.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 1 (true)&lt;br /&gt;
path.set(&amp;quot;C:/Window&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/r&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== canRead() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canRead();&lt;br /&gt;
|text = Returns 1 (true) if the path can be read (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canRead()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.canRead()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== canWrite() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canWrite();&lt;br /&gt;
|text = Returns 1 (true) if the path can be written to (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canWrite()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;) ~ &amp;quot;/txt.log&amp;quot;);&lt;br /&gt;
print(path.canWrite()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isFile() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isFile();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a file and 0 (false) if it points to a directory. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isFile()); # prints 0 (false)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isFile()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isDir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isDir();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a directory and 0 (false) if it points to a file. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isDir()); # prints 1 (true)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isDir()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== isRelative() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isRelative();&lt;br /&gt;
|text = Returns 1 (true) if the path is relative and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
path.set(&amp;quot;./Nasal&amp;quot;);&lt;br /&gt;
print(path.isRelative()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isAbsolute() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isAbsolute();&lt;br /&gt;
|text = Returns 1 (true) if the path is an absolute path and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isAbsolute()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isNull() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isNull();&lt;br /&gt;
|text = Returns 1 (true) if the path is null and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new();&lt;br /&gt;
print(path.isNull());&lt;br /&gt;
}}&lt;br /&gt;
==== create_dir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.create_dir();&lt;br /&gt;
|text = Creates the parent of the path as a directory. This will only work if the path is absolute and considered as writable by {{func link|fgValidatePath()|link=https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Main/util.cxx#l142}} (typically okay under [[$FG_HOME]]/Export).&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test/demo.txt&amp;quot;);&lt;br /&gt;
path.create_dir(); # Creates $FG_HOME/Export/test/&lt;br /&gt;
}}&lt;br /&gt;
==== remove() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.remove();&lt;br /&gt;
|text = Removes the last element of the path from the file directory. This will only work if the path is absolute and deletion of the file is permitted by the file permissions (typically okay under [[$FG_HOME]]/Export). Note that on Windows, deletion of read-only files are never permitted.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo.txt&amp;quot;);&lt;br /&gt;
var file = io.open(path.realpath, &amp;quot;w&amp;quot;);&lt;br /&gt;
io.write(file, 'Hello, World' ~ &amp;quot;\n&amp;quot;);&lt;br /&gt;
io.close(file);&lt;br /&gt;
print(path.exists()); # prints &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
path.remove();&lt;br /&gt;
print(path.exists()); # prints &amp;quot;0&amp;quot;&lt;br /&gt;
|example2 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test&amp;quot;);&lt;br /&gt;
path.create_dir();&lt;br /&gt;
path.remove(); # folder &amp;quot;/test&amp;quot; is removed&lt;br /&gt;
}}&lt;br /&gt;
==== rename() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.rename(new_name);&lt;br /&gt;
|text = Renames the last element of the path from the file directory. This will only work if the path is absolute, the old path is both readable and writable, the new path is writable.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo.txt&amp;quot;);&lt;br /&gt;
var file = io.open(path.realpath, &amp;quot;w&amp;quot;);&lt;br /&gt;
io.write(file, 'Hello, World' ~ &amp;quot;\n&amp;quot;);&lt;br /&gt;
io.close(file);&lt;br /&gt;
path.rename(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo1.txt&amp;quot;);&lt;br /&gt;
print(path.realpath); # prints $FG_HOME/Export/demo1.txt&lt;br /&gt;
}}&lt;br /&gt;
==== realpath ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.realpath;&lt;br /&gt;
|text = A variable that is a string and gives the full file path. This should only be used when the path is an absolute path.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.realpath); # prints the absolute path of $FG_HOME&lt;br /&gt;
}}&lt;br /&gt;
==== file ====&lt;br /&gt;
==== dir ====&lt;br /&gt;
==== base ====&lt;br /&gt;
==== file_base ====&lt;br /&gt;
==== extension ====&lt;br /&gt;
==== lower_extension ====&lt;br /&gt;
==== complete_lower_extension ====&lt;br /&gt;
==== str ====&lt;br /&gt;
==== mtime ====&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== desktop() ===&lt;br /&gt;
=== standardLocation() ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Template:Nasal_namespaces&amp;diff=114752</id>
		<title>Template:Nasal namespaces</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Template:Nasal_namespaces&amp;diff=114752"/>
		<updated>2018-03-19T14:05:06Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Update with os.path&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{navbox&lt;br /&gt;
|name  = Nasal namespaces&lt;br /&gt;
|title = [[Nasal Namespaces|Nasal namespaces]]&lt;br /&gt;
&lt;br /&gt;
|above = [[Nasal library|Global namespace (globals)]]&lt;br /&gt;
|list1 = [[Nasal library/debug|debug]] &amp;amp;bull; [[Nasal library/geo|geo]] &amp;amp;bull; [[Nasal library/io|io]] &amp;amp;bull; [[Nasal library/math|math]] &amp;amp;bull; [[Nasal library/os.path|os.path]] &amp;amp;bull; [[Nasal library/props|props]]&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;includeonly&amp;gt;{{main other|[[Category:Nasal namespace documentation]]}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Informative template|1=&lt;br /&gt;
__NOTOC__&lt;br /&gt;
== Goal ==&lt;br /&gt;
This navigation template enables easy navigation between different [[Nasal Namespaces|Nasal namespaces]].&lt;br /&gt;
&lt;br /&gt;
Adding this template to a page in the article namespace will automatically add [[:Category:Nasal namespace documentation]] to that page.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
Put this line before the categories and the language links at the bottom of the article.&lt;br /&gt;
 {{obr}}'''Nasal namespaces'''{{cbr}}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Navigation templates]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114750</id>
		<title>Nasal library/os.path</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114750"/>
		<updated>2018-03-18T21:37:55Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Doc rename()&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace implements tools (from SGPath) for manipulating file paths. Everything in the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace is sourced from {{flightgear file|src/Scripting/NasalSGPath.cxx}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
{{note|Everything here was added to FlightGear 3.0. (released [[FlightGear History#Release timeline|February 2014]])|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Class ==&lt;br /&gt;
=== os.path ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|mode = class&lt;br /&gt;
|text = A pseudo-class (actually a Nasal ghost). This is the main class that stores and allows manipulation of file paths. This is also integrated into the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
==== new() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.new([path]);&lt;br /&gt;
|text = Constructor function. Returns a new &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; instance. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will default to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;); # Windows filepath&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
==== set() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.set([path]);&lt;br /&gt;
|text = Sets the filepath. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will be set to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.set(&amp;quot;C:/Windows/Program Files&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints new path&lt;br /&gt;
}}&lt;br /&gt;
==== append() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.append([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the new part to add to the filepath. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.append(&amp;quot;Program Files&amp;quot;);&lt;br /&gt;
# path.append(&amp;quot;bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== concat() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.concat([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying part to concat to the existing filepath. Note that this will simply add the string to the end of the path without adding a separator. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.concat(&amp;quot;/Program Files&amp;quot;);&lt;br /&gt;
# path.concat(&amp;quot;/bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== exists() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.exists();&lt;br /&gt;
|text = Returns 1 (true) if the path exists and 0 (false) if it does not.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 1 (true)&lt;br /&gt;
path.set(&amp;quot;C:/Window&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/r&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== canRead() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canRead();&lt;br /&gt;
|text = Returns 1 (true) if the path can be read (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canRead()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.canRead()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== canWrite() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canWrite();&lt;br /&gt;
|text = Returns 1 (true) if the path can be written to (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canWrite()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;) ~ &amp;quot;/txt.log&amp;quot;);&lt;br /&gt;
print(path.canWrite()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isFile() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isFile();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a file and 0 (false) if it points to a directory. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isFile()); # prints 0 (false)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isFile()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isDir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isDir();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a directory and 0 (false) if it points to a file. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isDir()); # prints 1 (true)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isDir()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== isRelative() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isRelative();&lt;br /&gt;
|text = Returns 1 (true) if the path is relative and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
path.set(&amp;quot;./Nasal&amp;quot;);&lt;br /&gt;
print(path.isRelative()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isAbsolute() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isAbsolute();&lt;br /&gt;
|text = Returns 1 (true) if the path is an absolute path and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isAbsolute()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isNull() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isNull();&lt;br /&gt;
|text = Returns 1 (true) if the path is null and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new();&lt;br /&gt;
print(path.isNull());&lt;br /&gt;
}}&lt;br /&gt;
==== create_dir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.create_dir();&lt;br /&gt;
|text = Creates the parent of the path as a directory. This will only work if the path is absolute and considered as writable by {{func link|fgValidatePath()|link=https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Main/util.cxx#l142}} (typically okay under [[$FG_HOME]]/Export).&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test/demo.txt&amp;quot;);&lt;br /&gt;
path.create_dir(); # Creates $FG_HOME/Export/test/&lt;br /&gt;
}}&lt;br /&gt;
==== remove() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.remove();&lt;br /&gt;
|text = Removes the last element of the path from the file directory. This will only work if the path is absolute and deletion of the file is permitted by the file permissions (typically okay under [[$FG_HOME]]/Export). Note that on Windows, deletion of read-only files are never permitted.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo.txt&amp;quot;);&lt;br /&gt;
var file = io.open(path.realpath, &amp;quot;w&amp;quot;);&lt;br /&gt;
io.write(file, 'Hello, World' ~ &amp;quot;\n&amp;quot;);&lt;br /&gt;
io.close(file);&lt;br /&gt;
print(path.exists()); # prints &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
path.remove();&lt;br /&gt;
print(path.exists()); # prints &amp;quot;0&amp;quot;&lt;br /&gt;
|example2 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test&amp;quot;);&lt;br /&gt;
path.create_dir();&lt;br /&gt;
path.remove(); # folder &amp;quot;/test&amp;quot; is removed&lt;br /&gt;
}}&lt;br /&gt;
==== rename() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.rename(new_name);&lt;br /&gt;
|text = Renames the last element of the path from the file directory. This will only work if the path is absolute, the old path is both readable and writable, the new path is writable.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo.txt&amp;quot;);&lt;br /&gt;
var file = io.open(path.realpath, &amp;quot;w&amp;quot;);&lt;br /&gt;
io.write(file, 'Hello, World' ~ &amp;quot;\n&amp;quot;);&lt;br /&gt;
io.close(file);&lt;br /&gt;
path.rename(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo1.txt&amp;quot;);&lt;br /&gt;
print(path.realpath); # prints $FG_HOME/Export/demo1.txt&lt;br /&gt;
}}&lt;br /&gt;
==== realpath ====&lt;br /&gt;
==== file ====&lt;br /&gt;
==== dir ====&lt;br /&gt;
==== base ====&lt;br /&gt;
==== file_base ====&lt;br /&gt;
==== extension ====&lt;br /&gt;
==== lower_extension ====&lt;br /&gt;
==== complete_lower_extension ====&lt;br /&gt;
==== str ====&lt;br /&gt;
==== mtime ====&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== desktop() ===&lt;br /&gt;
=== standardLocation() ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114749</id>
		<title>Nasal library/os.path</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114749"/>
		<updated>2018-03-18T21:06:24Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Doc remove()&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace implements tools (from SGPath) for manipulating file paths. Everything in the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace is sourced from {{flightgear file|src/Scripting/NasalSGPath.cxx}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
{{note|Everything here was added to FlightGear 3.0. (released [[FlightGear History#Release timeline|February 2014]])|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Class ==&lt;br /&gt;
=== os.path ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|mode = class&lt;br /&gt;
|text = A pseudo-class (actually a Nasal ghost). This is the main class that stores and allows manipulation of file paths. This is also integrated into the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
==== new() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.new([path]);&lt;br /&gt;
|text = Constructor function. Returns a new &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; instance. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will default to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;); # Windows filepath&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
==== set() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.set([path]);&lt;br /&gt;
|text = Sets the filepath. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will be set to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.set(&amp;quot;C:/Windows/Program Files&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints new path&lt;br /&gt;
}}&lt;br /&gt;
==== append() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.append([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the new part to add to the filepath. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.append(&amp;quot;Program Files&amp;quot;);&lt;br /&gt;
# path.append(&amp;quot;bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== concat() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.concat([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying part to concat to the existing filepath. Note that this will simply add the string to the end of the path without adding a separator. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.concat(&amp;quot;/Program Files&amp;quot;);&lt;br /&gt;
# path.concat(&amp;quot;/bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== exists() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.exists();&lt;br /&gt;
|text = Returns 1 (true) if the path exists and 0 (false) if it does not.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 1 (true)&lt;br /&gt;
path.set(&amp;quot;C:/Window&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/r&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== canRead() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canRead();&lt;br /&gt;
|text = Returns 1 (true) if the path can be read (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canRead()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.canRead()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== canWrite() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canWrite();&lt;br /&gt;
|text = Returns 1 (true) if the path can be written to (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canWrite()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;) ~ &amp;quot;/txt.log&amp;quot;);&lt;br /&gt;
print(path.canWrite()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isFile() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isFile();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a file and 0 (false) if it points to a directory. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isFile()); # prints 0 (false)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isFile()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isDir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isDir();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a directory and 0 (false) if it points to a file. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isDir()); # prints 1 (true)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isDir()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== isRelative() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isRelative();&lt;br /&gt;
|text = Returns 1 (true) if the path is relative and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
path.set(&amp;quot;./Nasal&amp;quot;);&lt;br /&gt;
print(path.isRelative()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isAbsolute() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isAbsolute();&lt;br /&gt;
|text = Returns 1 (true) if the path is an absolute path and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isAbsolute()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isNull() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isNull();&lt;br /&gt;
|text = Returns 1 (true) if the path is null and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new();&lt;br /&gt;
print(path.isNull());&lt;br /&gt;
}}&lt;br /&gt;
==== create_dir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.create_dir();&lt;br /&gt;
|text = Creates the parent of the path as a directory. This will only work if the path is absolute and considered as writable by {{func link|fgValidatePath()|link=https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Main/util.cxx#l142}} (typically okay under [[$FG_HOME]]/Export).&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test/demo.txt&amp;quot;);&lt;br /&gt;
path.create_dir(); # Creates $FG_HOME/Export/test/&lt;br /&gt;
}}&lt;br /&gt;
==== remove() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.remove();&lt;br /&gt;
|text = Removes the last element of the path from the file directory. This will only work if the path is absolute and deletion of the file is permitted by the file permissions (typically okay under [[$FG_HOME]]/Export). Note that on Windows, deletion of read-only files are never permitted.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/demo.txt&amp;quot;);&lt;br /&gt;
var file = io.open(path.realpath, &amp;quot;w&amp;quot;);&lt;br /&gt;
io.write(file, 'Hello, World' ~ &amp;quot;/n&amp;quot;);&lt;br /&gt;
io.close(file);&lt;br /&gt;
print(path.exists()); # prints &amp;quot;1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
path.remove();&lt;br /&gt;
print(path.exists()); # prints &amp;quot;0&amp;quot;&lt;br /&gt;
|example2 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test&amp;quot;);&lt;br /&gt;
path.create_dir();&lt;br /&gt;
path.remove(); # folder &amp;quot;/test&amp;quot; is removed&lt;br /&gt;
}}&lt;br /&gt;
==== rename() ====&lt;br /&gt;
==== realpath ====&lt;br /&gt;
==== file ====&lt;br /&gt;
==== dir ====&lt;br /&gt;
==== base ====&lt;br /&gt;
==== file_base ====&lt;br /&gt;
==== extension ====&lt;br /&gt;
==== lower_extension ====&lt;br /&gt;
==== complete_lower_extension ====&lt;br /&gt;
==== str ====&lt;br /&gt;
==== mtime ====&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== desktop() ===&lt;br /&gt;
=== standardLocation() ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114748</id>
		<title>Nasal library/os.path</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114748"/>
		<updated>2018-03-18T20:43:20Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace implements tools (from SGPath) for manipulating file paths. Everything in the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace is sourced from {{flightgear file|src/Scripting/NasalSGPath.cxx}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
{{note|Everything here was added to FlightGear 3.0. (released [[FlightGear History#Release timeline|February 2014]])|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Class ==&lt;br /&gt;
=== os.path ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|mode = class&lt;br /&gt;
|text = A pseudo-class (actually a Nasal ghost). This is the main class that stores and allows manipulation of file paths. This is also integrated into the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
==== new() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.new([path]);&lt;br /&gt;
|text = Constructor function. Returns a new &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; instance. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will default to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;); # Windows filepath&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
==== set() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.set([path]);&lt;br /&gt;
|text = Sets the filepath. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will be set to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.set(&amp;quot;C:/Windows/Program Files&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints new path&lt;br /&gt;
}}&lt;br /&gt;
==== append() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.append([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the new part to add to the filepath. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.append(&amp;quot;Program Files&amp;quot;);&lt;br /&gt;
# path.append(&amp;quot;bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== concat() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.concat([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying part to concat to the existing filepath. Note that this will simply add the string to the end of the path without adding a separator. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.concat(&amp;quot;/Program Files&amp;quot;);&lt;br /&gt;
# path.concat(&amp;quot;/bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== exists() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.exists();&lt;br /&gt;
|text = Returns 1 (true) if the path exists and 0 (false) if it does not.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 1 (true)&lt;br /&gt;
path.set(&amp;quot;C:/Window&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/r&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== canRead() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canRead();&lt;br /&gt;
|text = Returns 1 (true) if the path can be read (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canRead()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.canRead()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== canWrite() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canWrite();&lt;br /&gt;
|text = Returns 1 (true) if the path can be written to (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canWrite()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;) ~ &amp;quot;/txt.log&amp;quot;);&lt;br /&gt;
print(path.canWrite()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isFile() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isFile();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a file and 0 (false) if it points to a directory. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isFile()); # prints 0 (false)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isFile()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isDir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isDir();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a directory and 0 (false) if it points to a file. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isDir()); # prints 1 (true)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isDir()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== isRelative() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isRelative();&lt;br /&gt;
|text = Returns 1 (true) if the path is relative and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
path.set(&amp;quot;./Nasal&amp;quot;);&lt;br /&gt;
print(path.isRelative()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isAbsolute() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isAbsolute();&lt;br /&gt;
|text = Returns 1 (true) if the path is an absolute path and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isAbsolute()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isNull() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isNull();&lt;br /&gt;
|text = Returns 1 (true) if the path is null and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new();&lt;br /&gt;
print(path.isNull());&lt;br /&gt;
}}&lt;br /&gt;
==== create_dir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.create_dir();&lt;br /&gt;
|text = Creates the parent of the path as a directory. This will only work if the path is absolute and considered as writable by {{func link|fgValidatePath()|link=https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Main/util.cxx#l142}} (typically okay under [[$FG_HOME]]/Export).&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test/demo.txt&amp;quot;);&lt;br /&gt;
path.create_dir(); # Creates $FG_HOME/Export/test/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== remove() ====&lt;br /&gt;
==== rename() ====&lt;br /&gt;
==== realpath ====&lt;br /&gt;
==== file ====&lt;br /&gt;
==== dir ====&lt;br /&gt;
==== base ====&lt;br /&gt;
==== file_base ====&lt;br /&gt;
==== extension ====&lt;br /&gt;
==== lower_extension ====&lt;br /&gt;
==== complete_lower_extension ====&lt;br /&gt;
==== str ====&lt;br /&gt;
==== mtime ====&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== desktop() ===&lt;br /&gt;
=== standardLocation() ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114747</id>
		<title>Nasal library/os.path</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114747"/>
		<updated>2018-03-18T20:40:07Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Complete create_dir() doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace implements tools (from SGPath) for manipulating file paths. Everything in the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace is sourced from {{flightgear file|src/Scripting/NasalSGPath.cxx}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
{{note|Everything here was added to FlightGear 3.0. (~2013)|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Class ==&lt;br /&gt;
=== os.path ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|mode = class&lt;br /&gt;
|text = A pseudo-class (actually a Nasal ghost). This is the main class that stores and allows manipulation of file paths. This is also integrated into the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
==== new() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.new([path]);&lt;br /&gt;
|text = Constructor function. Returns a new &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; instance. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will default to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;); # Windows filepath&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
==== set() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.set([path]);&lt;br /&gt;
|text = Sets the filepath. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will be set to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.set(&amp;quot;C:/Windows/Program Files&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints new path&lt;br /&gt;
}}&lt;br /&gt;
==== append() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.append([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the new part to add to the filepath. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.append(&amp;quot;Program Files&amp;quot;);&lt;br /&gt;
# path.append(&amp;quot;bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== concat() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.concat([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying part to concat to the existing filepath. Note that this will simply add the string to the end of the path without adding a separator. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.concat(&amp;quot;/Program Files&amp;quot;);&lt;br /&gt;
# path.concat(&amp;quot;/bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== exists() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.exists();&lt;br /&gt;
|text = Returns 1 (true) if the path exists and 0 (false) if it does not.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 1 (true)&lt;br /&gt;
path.set(&amp;quot;C:/Window&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/r&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== canRead() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canRead();&lt;br /&gt;
|text = Returns 1 (true) if the path can be read (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canRead()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.canRead()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== canWrite() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canWrite();&lt;br /&gt;
|text = Returns 1 (true) if the path can be written to (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canWrite()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;) ~ &amp;quot;/txt.log&amp;quot;);&lt;br /&gt;
print(path.canWrite()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isFile() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isFile();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a file and 0 (false) if it points to a directory. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isFile()); # prints 0 (false)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isFile()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isDir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isDir();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a directory and 0 (false) if it points to a file. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isDir()); # prints 1 (true)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isDir()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== isRelative() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isRelative();&lt;br /&gt;
|text = Returns 1 (true) if the path is relative and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
path.set(&amp;quot;./Nasal&amp;quot;);&lt;br /&gt;
print(path.isRelative()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isAbsolute() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isAbsolute();&lt;br /&gt;
|text = Returns 1 (true) if the path is an absolute path and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isAbsolute()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isNull() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isNull();&lt;br /&gt;
|text = Returns 1 (true) if the path is null and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new();&lt;br /&gt;
print(path.isNull());&lt;br /&gt;
}}&lt;br /&gt;
==== create_dir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.create_dir();&lt;br /&gt;
|text = Creates the parent of the path as a directory. This will only work if the path is absolute and considered as writable by {{func link|fgValidatePath()|link=https://sourceforge.net/p/flightgear/flightgear/ci/next/tree/src/Main/util.cxx#l142}} (typically okay under [[$FG_HOME]]/Export).&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;/sim/fg-home&amp;quot;) ~ &amp;quot;/Export/test/demo.txt&amp;quot;);&lt;br /&gt;
path.create_dir(); # Creates $FG_HOME/Export/test/&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== remove() ====&lt;br /&gt;
==== rename() ====&lt;br /&gt;
==== realpath ====&lt;br /&gt;
==== file ====&lt;br /&gt;
==== dir ====&lt;br /&gt;
==== base ====&lt;br /&gt;
==== file_base ====&lt;br /&gt;
==== extension ====&lt;br /&gt;
==== lower_extension ====&lt;br /&gt;
==== complete_lower_extension ====&lt;br /&gt;
==== str ====&lt;br /&gt;
==== mtime ====&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== desktop() ===&lt;br /&gt;
=== standardLocation() ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114536</id>
		<title>Nasal library/os.path</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114536"/>
		<updated>2018-02-18T20:46:03Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Doc isNull()&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace implements tools (from SGPath) for manipulating file paths. Everything in the &amp;lt;code&amp;gt;geo&amp;lt;/code&amp;gt; namespace is sourced from {{flightgear file|src/Scripting/NasalSGPath.cxx}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
{{note|Everything here was added to FlightGear 3.0.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Class ==&lt;br /&gt;
=== os.path ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|mode = class&lt;br /&gt;
|text = A pseudo-class (actually a Nasal ghost). This is the main class that stores and allows manipulation of file paths. This is also integrated into the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
==== new() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.new([path]);&lt;br /&gt;
|text = Constructor function. Returns a new &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; instance. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will default to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;); # Windows filepath&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
==== set() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.set([path]);&lt;br /&gt;
|text = Sets the filepath. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will be set to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.set(&amp;quot;C:/Windows/Program Files&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints new path&lt;br /&gt;
}}&lt;br /&gt;
==== append() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.append([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the new part to add to the filepath. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.append(&amp;quot;Program Files&amp;quot;);&lt;br /&gt;
# path.append(&amp;quot;bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== concat() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.concat([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying part to concat to the existing filepath. Note that this will simply add the string to the end of the path without adding a separator. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.concat(&amp;quot;/Program Files&amp;quot;);&lt;br /&gt;
# path.concat(&amp;quot;/bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== exists() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.exists();&lt;br /&gt;
|text = Returns 1 (true) if the path exists and 0 (false) if it does not.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 1 (true)&lt;br /&gt;
path.set(&amp;quot;C:/Window&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/r&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== canRead() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canRead();&lt;br /&gt;
|text = Returns 1 (true) if the path can be read (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canRead()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.canRead()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== canWrite() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canWrite();&lt;br /&gt;
|text = Returns 1 (true) if the path can be written to (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canWrite()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;) ~ &amp;quot;/txt.log&amp;quot;);&lt;br /&gt;
print(path.canWrite()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isFile() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isFile();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a file and 0 (false) if it points to a directory. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isFile()); # prints 0 (false)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isFile()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isDir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isDir();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a directory and 0 (false) if it points to a file. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isDir()); # prints 1 (true)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isDir()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== isRelative() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isRelative();&lt;br /&gt;
|text = Returns 1 (true) if the path is relative and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
path.set(&amp;quot;./Nasal&amp;quot;);&lt;br /&gt;
print(path.isRelative()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isAbsolute() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isAbsolute();&lt;br /&gt;
|text = Returns 1 (true) if the path is an absolute path and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isAbsolute()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isNull() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isNull();&lt;br /&gt;
|text = Returns 1 (true) if the path is null and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new();&lt;br /&gt;
print(path.isNull());&lt;br /&gt;
}}&lt;br /&gt;
==== create_dir() ====&lt;br /&gt;
==== remove() ====&lt;br /&gt;
==== rename() ====&lt;br /&gt;
==== realpath ====&lt;br /&gt;
==== file ====&lt;br /&gt;
==== dir ====&lt;br /&gt;
==== base ====&lt;br /&gt;
==== file_base ====&lt;br /&gt;
==== extension ====&lt;br /&gt;
==== lower_extension ====&lt;br /&gt;
==== complete_lower_extension ====&lt;br /&gt;
==== str ====&lt;br /&gt;
==== mtime ====&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== desktop() ===&lt;br /&gt;
=== standardLocation() ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114535</id>
		<title>Nasal library/os.path</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114535"/>
		<updated>2018-02-18T20:32:14Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: More doc&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace implements tools (from SGPath) for manipulating file paths. Everything in the &amp;lt;code&amp;gt;geo&amp;lt;/code&amp;gt; namespace is sourced from {{flightgear file|src/Scripting/NasalSGPath.cxx}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
{{note|Everything here was added to FlightGear 3.0.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Class ==&lt;br /&gt;
=== os.path ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|mode = class&lt;br /&gt;
|text = A pseudo-class (actually a Nasal ghost). This is the main class that stores and allows manipulation of file paths. This is also integrated into the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
==== new() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.new([path]);&lt;br /&gt;
|text = Constructor function. Returns a new &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; instance. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will default to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;); # Windows filepath&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
==== set() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.set([path]);&lt;br /&gt;
|text = Sets the filepath. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will be set to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.set(&amp;quot;C:/Windows/Program Files&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints new path&lt;br /&gt;
}}&lt;br /&gt;
==== append() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.append([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the new part to add to the filepath. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.append(&amp;quot;Program Files&amp;quot;);&lt;br /&gt;
# path.append(&amp;quot;bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== concat() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.concat([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying part to concat to the existing filepath. Note that this will simply add the string to the end of the path without adding a separator. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.concat(&amp;quot;/Program Files&amp;quot;);&lt;br /&gt;
# path.concat(&amp;quot;/bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
==== exists() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.exists();&lt;br /&gt;
|text = Returns 1 (true) if the path exists and 0 (false) if it does not.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 1 (true)&lt;br /&gt;
path.set(&amp;quot;C:/Window&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/r&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== canRead() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canRead();&lt;br /&gt;
|text = Returns 1 (true) if the path can be read (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canRead()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.canRead()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== canWrite() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canWrite();&lt;br /&gt;
|text = Returns 1 (true) if the path can be written to (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canWrite()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;) ~ &amp;quot;/txt.log&amp;quot;);&lt;br /&gt;
print(path.canWrite()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isFile() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isFile();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a file and 0 (false) if it points to a directory. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isFile()); # prints 0 (false)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isFile()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isDir() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isDir();&lt;br /&gt;
|text = Returns 1 (true) if the path points to a directory and 0 (false) if it points to a file. Note that the path must also exist.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isDir()); # prints 1 (true)&lt;br /&gt;
path.append(&amp;quot;Nasal/io.nas&amp;quot;);&lt;br /&gt;
print(path.isDir()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
==== isRelative() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isRelative();&lt;br /&gt;
|text = Returns 1 (true) if the path is relative and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
path.set(&amp;quot;./Nasal&amp;quot;);&lt;br /&gt;
print(path.isRelative()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isAbsolute() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.isDir();&lt;br /&gt;
|text = Returns 1 (true) if the path is an absolute path and 0 (false) if it is not.&lt;br /&gt;
|example1 = var path = os.path.new(getprop(&amp;quot;sim/fg-root&amp;quot;));&lt;br /&gt;
print(path.isAbsolute()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
==== isNull() ====&lt;br /&gt;
==== create_dir() ====&lt;br /&gt;
==== remove() ====&lt;br /&gt;
==== rename() ====&lt;br /&gt;
==== realpath ====&lt;br /&gt;
==== file ====&lt;br /&gt;
==== dir ====&lt;br /&gt;
==== base ====&lt;br /&gt;
==== file_base ====&lt;br /&gt;
==== extension ====&lt;br /&gt;
==== lower_extension ====&lt;br /&gt;
==== complete_lower_extension ====&lt;br /&gt;
==== str ====&lt;br /&gt;
==== mtime ====&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== desktop() ===&lt;br /&gt;
=== standardLocation() ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114534</id>
		<title>Nasal library/os.path</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114534"/>
		<updated>2018-02-18T16:16:50Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: Doc canRead() and Write()&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace implements tools (from SGPath) for manipulating file paths. Everything in the &amp;lt;code&amp;gt;geo&amp;lt;/code&amp;gt; namespace is sourced from {{flightgear file|src/Scripting/NasalSGPath.cxx}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
{{note|Everything here was added to FlightGear 3.0.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Class ==&lt;br /&gt;
=== os.path ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|mode = class&lt;br /&gt;
|text = A pseudo-class (actually a Nasal ghost). This is the main class that stores and allows manipulation of file paths. This is also integrated into the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== new() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.new([path]);&lt;br /&gt;
|text = Constructor function. Returns a new &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; instance. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will default to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;); # Windows filepath&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== set() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.set([path]);&lt;br /&gt;
|text = Sets the filepath. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will be set to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.set(&amp;quot;C:/Windows/Program Files&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints new path&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== append() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.append([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the new part to add to the filepath. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.append(&amp;quot;Program Files&amp;quot;);&lt;br /&gt;
# path.append(&amp;quot;bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== concat() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.concat([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying part to concat to the existing filepath. Note that this will simply add the string to the end of the path without adding a separator. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.concat(&amp;quot;/Program Files&amp;quot;);&lt;br /&gt;
# path.concat(&amp;quot;/bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== exists() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.exists();&lt;br /&gt;
|text = Returns 1 (true) if the path exists and 0 (false) if it does not.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 1 (true)&lt;br /&gt;
path.set(&amp;quot;C:/Window&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/r&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== canRead() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canRead();&lt;br /&gt;
|text = Returns 1 (true) if the path can be read (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canRead()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;));&lt;br /&gt;
print(path.canRead()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== canWrite() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.canWrite();&lt;br /&gt;
|text = Returns 1 (true) if the path can be written to (from Nasal) and 0 (false) if it cannot. This follows the rules for allowed paths.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.canWrite()); # prints 0 (false)&lt;br /&gt;
path.set(getprop(&amp;quot;sim/fg-home&amp;quot;) ~ &amp;quot;/txt.log&amp;quot;);&lt;br /&gt;
print(path.canWrite()); # prints 1 (true)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== isFile() ====&lt;br /&gt;
==== isDir() ====&lt;br /&gt;
==== isRelative() ====&lt;br /&gt;
==== isAbsolute() ====&lt;br /&gt;
==== isNull() ====&lt;br /&gt;
==== create_dir() ====&lt;br /&gt;
==== remove() ====&lt;br /&gt;
==== rename() ====&lt;br /&gt;
==== realpath ====&lt;br /&gt;
==== file ====&lt;br /&gt;
==== dir ====&lt;br /&gt;
==== base ====&lt;br /&gt;
==== file_base ====&lt;br /&gt;
==== extension ====&lt;br /&gt;
==== lower_extension ====&lt;br /&gt;
==== complete_lower_extension ====&lt;br /&gt;
==== str ====&lt;br /&gt;
==== mtime ====&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== desktop() ===&lt;br /&gt;
=== standardLocation() ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114501</id>
		<title>Nasal library/os.path</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114501"/>
		<updated>2018-02-17T21:26:57Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: /* exists() */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace implements tools (from SGPath) for manipulating file paths. Everything in the &amp;lt;code&amp;gt;geo&amp;lt;/code&amp;gt; namespace is sourced from {{flightgear file|src/Scripting/NasalSGPath.cxx}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
{{note|Everything here was added to FlightGear 3.0.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Class ==&lt;br /&gt;
=== os.path ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|mode = class&lt;br /&gt;
|text = A pseudo-class (actually a Nasal ghost). This is the main class that stores and allows manipulation of file paths. This is also integrated into the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== new() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.new([path]);&lt;br /&gt;
|text = Constructor function. Returns a new &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; instance. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will default to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;); # Windows filepath&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== set() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.set([path]);&lt;br /&gt;
|text = Sets the filepath. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will be set to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.set(&amp;quot;C:/Windows/Program Files&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints new path&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== append() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.append([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the new part to add to the filepath. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.append(&amp;quot;Program Files&amp;quot;);&lt;br /&gt;
# path.append(&amp;quot;bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== concat() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.concat([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying part to concat to the existing filepath. Note that this will simply add the string to the end of the path without adding a separator. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.concat(&amp;quot;/Program Files&amp;quot;);&lt;br /&gt;
# path.concat(&amp;quot;/bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== exists() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.exists();&lt;br /&gt;
|text = Returns 1 (true) if the path exists and 0 (false) if it does not.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 1 (true)&lt;br /&gt;
path.set(&amp;quot;C:/Window&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/r&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== canRead() ====&lt;br /&gt;
==== canWrite() ====&lt;br /&gt;
==== isFile() ====&lt;br /&gt;
==== isDir() ====&lt;br /&gt;
==== isRelative() ====&lt;br /&gt;
==== isAbsolute() ====&lt;br /&gt;
==== isNull() ====&lt;br /&gt;
==== create_dir() ====&lt;br /&gt;
==== remove() ====&lt;br /&gt;
==== rename() ====&lt;br /&gt;
==== realpath ====&lt;br /&gt;
==== file ====&lt;br /&gt;
==== dir ====&lt;br /&gt;
==== base ====&lt;br /&gt;
==== file_base ====&lt;br /&gt;
==== extension ====&lt;br /&gt;
==== lower_extension ====&lt;br /&gt;
==== complete_lower_extension ====&lt;br /&gt;
==== str ====&lt;br /&gt;
==== mtime ====&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== desktop() ===&lt;br /&gt;
=== standardLocation() ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114500</id>
		<title>Nasal library/os.path</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114500"/>
		<updated>2018-02-17T21:26:46Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: /* Class */ Doc exists()&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace implements tools (from SGPath) for manipulating file paths. Everything in the &amp;lt;code&amp;gt;geo&amp;lt;/code&amp;gt; namespace is sourced from {{flightgear file|src/Scripting/NasalSGPath.cxx}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
{{note|Everything here was added to FlightGear 3.0.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Class ==&lt;br /&gt;
=== os.path ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|mode = class&lt;br /&gt;
|text = A pseudo-class (actually a Nasal ghost). This is the main class that stores and allows manipulation of file paths. This is also integrated into the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== new() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.new([path]);&lt;br /&gt;
|text = Constructor function. Returns a new &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; instance. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will default to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;); # Windows filepath&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== set() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.set([path]);&lt;br /&gt;
|text = Sets the filepath. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will be set to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.set(&amp;quot;C:/Windows/Program Files&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints new path&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== append() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.append([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the new part to add to the filepath. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.append(&amp;quot;Program Files&amp;quot;);&lt;br /&gt;
# path.append(&amp;quot;bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== concat() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.concat([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying part to concat to the existing filepath. Note that this will simply add the string to the end of the path without adding a separator. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.concat(&amp;quot;/Program Files&amp;quot;);&lt;br /&gt;
# path.concat(&amp;quot;/bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== exists() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.exists([);&lt;br /&gt;
|text = Returns 1 (true) if the path exists and 0 (false) if it does not.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 1 (true)&lt;br /&gt;
path.set(&amp;quot;C:/Window&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/r&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.exists()); # prints 0 (false)&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== canRead() ====&lt;br /&gt;
==== canWrite() ====&lt;br /&gt;
==== isFile() ====&lt;br /&gt;
==== isDir() ====&lt;br /&gt;
==== isRelative() ====&lt;br /&gt;
==== isAbsolute() ====&lt;br /&gt;
==== isNull() ====&lt;br /&gt;
==== create_dir() ====&lt;br /&gt;
==== remove() ====&lt;br /&gt;
==== rename() ====&lt;br /&gt;
==== realpath ====&lt;br /&gt;
==== file ====&lt;br /&gt;
==== dir ====&lt;br /&gt;
==== base ====&lt;br /&gt;
==== file_base ====&lt;br /&gt;
==== extension ====&lt;br /&gt;
==== lower_extension ====&lt;br /&gt;
==== complete_lower_extension ====&lt;br /&gt;
==== str ====&lt;br /&gt;
==== mtime ====&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== desktop() ===&lt;br /&gt;
=== standardLocation() ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
	<entry>
		<id>https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114499</id>
		<title>Nasal library/os.path</title>
		<link rel="alternate" type="text/html" href="https://wiki.flightgear.org/w/index.php?title=Nasal_library/os.path&amp;diff=114499"/>
		<updated>2018-02-17T21:13:42Z</updated>

		<summary type="html">&lt;p&gt;Red Leader: /* Class */ Doc concat()&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Nasal Navigation|nocat=1}}&lt;br /&gt;
This page contains documentation for the '''&amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; namespace''' in [[Nasal]]. This namespace implements tools (from SGPath) for manipulating file paths. Everything in the &amp;lt;code&amp;gt;geo&amp;lt;/code&amp;gt; namespace is sourced from {{flightgear file|src/Scripting/NasalSGPath.cxx}}&lt;br /&gt;
&lt;br /&gt;
{{tip|Copy &amp;amp; paste the examples into your [[Nasal Console]] and execute them to see what they do.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
{{note|Everything here was added to FlightGear 3.0.|width=70%}}&lt;br /&gt;
&lt;br /&gt;
== Class ==&lt;br /&gt;
=== os.path ===&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|mode = class&lt;br /&gt;
|text = A pseudo-class (actually a Nasal ghost). This is the main class that stores and allows manipulation of file paths. This is also integrated into the &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== new() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.new([path]);&lt;br /&gt;
|text = Constructor function. Returns a new &amp;lt;code&amp;gt;os.path&amp;lt;/code&amp;gt; instance. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will default to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;); # Windows filepath&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== set() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.set([path]);&lt;br /&gt;
|text = Sets the filepath. Note that the path must not violate the rules for allowed paths.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the filepath. If not given, the path will be set to [[$FG_ROOT]]&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/bin/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.set(&amp;quot;C:/Windows/Program Files&amp;quot;);&lt;br /&gt;
# path.set(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints new path&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== append() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.append([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying the new part to add to the filepath. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr/&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.append(&amp;quot;Program Files&amp;quot;);&lt;br /&gt;
# path.append(&amp;quot;bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== concat() ====&lt;br /&gt;
{{Nasal doc&lt;br /&gt;
|syntax = os.path.concat([path]);&lt;br /&gt;
|text = Appends a new part to the filepath.&lt;br /&gt;
|param1 = path&lt;br /&gt;
|param1text = Optional string specifying part to concat to the existing filepath. Note that this will simply add the string to the end of the path without adding a separator. If not given, the resultant path will not change.&lt;br /&gt;
|example1 = var path = os.path.new(&amp;quot;C:/Windows&amp;quot;);&lt;br /&gt;
# var path = os.path.new(&amp;quot;/usr&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath);&lt;br /&gt;
path.concat(&amp;quot;/Program Files&amp;quot;);&lt;br /&gt;
# path.concat(&amp;quot;/bin&amp;quot;); # alternative Unix filepath&lt;br /&gt;
print(path.realpath); # prints &amp;quot;C:/Windows/Program Files&amp;quot; or &amp;quot;/usr/bin&amp;quot;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== exists() ====&lt;br /&gt;
==== canRead() ====&lt;br /&gt;
==== canWrite() ====&lt;br /&gt;
==== isFile() ====&lt;br /&gt;
==== isDir() ====&lt;br /&gt;
==== isRelative() ====&lt;br /&gt;
==== isAbsolute() ====&lt;br /&gt;
==== isNull() ====&lt;br /&gt;
==== create_dir() ====&lt;br /&gt;
==== remove() ====&lt;br /&gt;
==== rename() ====&lt;br /&gt;
==== realpath ====&lt;br /&gt;
==== file ====&lt;br /&gt;
==== dir ====&lt;br /&gt;
==== base ====&lt;br /&gt;
==== file_base ====&lt;br /&gt;
==== extension ====&lt;br /&gt;
==== lower_extension ====&lt;br /&gt;
==== complete_lower_extension ====&lt;br /&gt;
==== str ====&lt;br /&gt;
==== mtime ====&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
=== desktop() ===&lt;br /&gt;
=== standardLocation() ===&lt;br /&gt;
&lt;br /&gt;
{{Nasal namespaces}}&lt;/div&gt;</summary>
		<author><name>Red Leader</name></author>
	</entry>
</feed>