421 lines
19 KiB
HTML
421 lines
19 KiB
HTML
<html><head><title>Macro Airfoil Import %26 Scale/fr</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><link type='text/css' href='wiki.css' rel='stylesheet'></head><body><h1>Macro Airfoil Import %26 Scale/fr</h1></div>
|
|
|
|
<div id="mw-content-text" lang="fr" dir="ltr" class="mw-content-ltr"><hr/>
|
|
<div class="mw-parser-output"><table class="fcinfobox wikitable ct" width="100%" style="float: right; width: 230px; margin-left: 10px;">
|
|
<tr>
|
|
<td class="ctTitle">
|
|
<h3><span class="mw-headline" id="Macro_Airfoil_Import_.26_Scale"><a href="https://www.freecadweb.org/wiki/index.php?title=File:Text-x-python.png" class="image"><img alt="Text-x-python.png" src="32px-Text-x-python.png" width="32" height="32" srcset="/wiki/images/2/2c/Text-x-python.png 1.5x" /></a> Macro Airfoil Import & Scale</span></h3>
|
|
</td></tr>
|
|
<tr>
|
|
<th class="ctOdd">Description
|
|
</th></tr>
|
|
<tr>
|
|
<td class="ctEven left">Trace le profil d'une aile a partir d'un fichier .dat.
|
|
</td></tr>
|
|
<tr>
|
|
<th class="ctOdd">Auteur
|
|
</th></tr>
|
|
<tr>
|
|
<td class="ctEven"><a href="https://www.freecadweb.org/wiki/index.php?title=User:Quick61" title="User:Quick61">quick61</a>
|
|
</td></tr>
|
|
<tr>
|
|
<th class="ctOdd">Liens
|
|
</th></tr>
|
|
<tr>
|
|
<td class="ctEven"><a href="https://www.freecadweb.org/wiki/index.php?title=Macros_recipes/fr" title="Macros recipes/fr">Recettes macros</a><br /><a href="https://www.freecadweb.org/wiki/index.php?title=How_to_install_macros/fr" title="How to install macros/fr">Comment installer une macro</a><br /><a href="https://www.freecadweb.org/wiki/index.php?title=Customize_Toolbars/fr" title="Customize Toolbars/fr">Comment ajouter une barre d'outils</a>
|
|
</td></tr>
|
|
<tr>
|
|
<th class="ctOdd">Version
|
|
</th></tr>
|
|
<tr>
|
|
<td class="ctEven macro-version">1.5 , 2.0 and 2.1
|
|
</td></tr>
|
|
<tr>
|
|
<th class="ctOdd">Date dernière modification
|
|
</th></tr>
|
|
<tr>
|
|
<td class="ctEven macro-date">2014-10-02
|
|
</td></tr>
|
|
<tr>
|
|
<th class="ctOdd">
|
|
</th></tr>
|
|
<tr>
|
|
<td class="ctToc"><br /><div id="toc" class="toc"><div class="toctitle"><h2>Contents</h2></div>
|
|
<ul>
|
|
<li class="toclevel-1"><a href="#Macro_Airfoil_Import_.26_Scale"><span class="tocnumber">1</span> <span class="toctext">Macro Airfoil Import & Scale</span></a></li>
|
|
<li class="toclevel-1 tocsection-1"><a href="#Utilisation"><span class="tocnumber">2</span> <span class="toctext">Utilisation</span></a>
|
|
<ul>
|
|
<li class="toclevel-2 tocsection-2"><a href="#S.C3.A9lection_de_fichier"><span class="tocnumber">2.1</span> <span class="toctext">Sélection de fichier</span></a></li>
|
|
<li class="toclevel-2 tocsection-3"><a href="#Entrez_la_longueur_de_la_corde"><span class="tocnumber">2.2</span> <span class="toctext">Entrez la longueur de la corde</span></a></li>
|
|
</ul>
|
|
</li>
|
|
<li class="toclevel-1 tocsection-4"><a href="#Comment_utiliser_la_-_Version_2"><span class="tocnumber">3</span> <span class="toctext">Comment utiliser la - Version 2</span></a>
|
|
<ul>
|
|
<li class="toclevel-2 tocsection-5"><a href="#Modifier_la_s.C3.A9lection_par_d.C3.A9faut"><span class="tocnumber">3.1</span> <span class="toctext">Modifier la sélection par défaut</span></a></li>
|
|
</ul>
|
|
</li>
|
|
<li class="toclevel-1 tocsection-6"><a href="#Les_Macros"><span class="tocnumber">4</span> <span class="toctext">Les Macros</span></a>
|
|
<ul>
|
|
<li class="toclevel-2 tocsection-7"><a href="#Version_1.5"><span class="tocnumber">4.1</span> <span class="toctext">Version 1.5</span></a></li>
|
|
<li class="toclevel-2 tocsection-8"><a href="#Version_2"><span class="tocnumber">4.2</span> <span class="toctext">Version 2</span></a></li>
|
|
<li class="toclevel-2 tocsection-9"><a href="#Version_2.1"><span class="tocnumber">4.3</span> <span class="toctext">Version 2.1</span></a></li>
|
|
</ul>
|
|
</li>
|
|
<li class="toclevel-1 tocsection-10"><a href="#Liens"><span class="tocnumber">5</span> <span class="toctext">Liens</span></a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
</td></tr>
|
|
</table>
|
|
<p><br />
|
|
</p><p>Lorsqu'elle est exécutée, Cette Macro, demandera tout d'abord à l'utilisateur de localiser et sélectionner un fichier <b>.dat</b> de format texte décrivant un profil aérodynamique. Une fois sélectionné, une longueur de corde est demandée puis en validant avec la touche OK, un aileron sera dessiné à l'échelle correcte. Il existe ici deux versions. Version 1.5 devrait fonctionner sur les versions FreeCAD, 0,13 stable, ainsi que toutes les versions de 0,14. Version 2 ne doit être utilisée qu'avec les versions de FreeCAD égales ou supérieures à 0,14 3077 et fonctionnera mieux avec les versions générées avec des versions OCE/OCC 6,7 ou supérieure.<br />
|
|
</p><p>Voir aussi <a href="https://www.freecadweb.org/wiki/index.php?title=Common_Airfoil_Data_Import/fr" title="Common Airfoil Data Import/fr">Common Airfoil Data Import</a>
|
|
</p><p><br />
|
|
</p><p><a href="https://www.freecadweb.org/wiki/index.php?title=File:Macro_Airfoil_Import_%26_Scale_00.png" class="image" title="Airfoil_Import_&_Scale"><img alt="Airfoil_Import_&_Scale" src="480px-Macro_Airfoil_Import_%26_Scale_00.png" width="480" height="423" srcset="/wiki/images/4/43/Macro_Airfoil_Import_%26_Scale_00.png 1.5x" /></a>
|
|
</p>
|
|
<div style="clear:both"></div>
|
|
<p><br />
|
|
</p>
|
|
<h2><span class="mw-headline" id="Utilisation">Utilisation</span></h2>
|
|
<h3><span class="mw-headline" id="S.C3.A9lection_de_fichier">Sélection de fichier</span></h3>
|
|
<p>En exécutant la Macro le navigateur de fichiers s'affiche vous permettant de sélectionner un fichier .dat souhaité. Recherchez où le fichier de profil aérodynamique se trouve, sélectionnez-le et cliquez sur Ouvrir.
|
|
</p>
|
|
<div class="center"><div class="floatnone"><a href="https://www.freecadweb.org/wiki/index.php?title=File:File_browser.png" class="image" title="File browser window for importing .dat airfoil files"><img alt="File browser window for importing .dat airfoil files" src="File_browser.png" width="859" height="496" /></a></div></div>
|
|
<h3><span class="mw-headline" id="Entrez_la_longueur_de_la_corde">Entrez la longueur de la corde</span></h3>
|
|
<p>Une fois que le fichier de profil aérodynamique a été sélectionné, une nouvelle boîte de dialogue apparaît pour vous demander d'entrer une longueur de corde. Vous pouvez entrer n'importe quelle longueur, en millimètres. Après avoir entré la longueur désirée, la Macro produira un profil filaire (DWire) suivant les coordonnées décrites dans le fichier de profil aérodynamique .dat précédemment sélectionné et à l'échelle que vous aurez entré pour la longueur de la corde.
|
|
</p>
|
|
<div class="center"><div class="floatnone"><a href="https://www.freecadweb.org/wiki/index.php?title=File:Chord_length.png" class="image" title="Chord length dialog for import and scale macro v1.5"><img alt="Chord length dialog for import and scale macro v1.5" src="Chord_length.png" width="378" height="146" /></a></div></div>
|
|
<p>L'aile, optimisée, devrait maintenant être prête à être utilisé dans votre projet.
|
|
</p>
|
|
<h2><span class="mw-headline" id="Comment_utiliser_la_-_Version_2">Comment utiliser la - Version 2</span></h2>
|
|
<p>Sélectionnez le fichier de la même manière que la version 1.5. Avec la version 2, vous avez le choix de disposer soit de l'aile qui en résulte fait avec un fil (DWire) ou une base Spline (BSpline). Comme avec la version 1.5, vous entrez la longueur de la corde désirée. En outre, vous pouvez maintenant sélectionner quel type de papier souhaitée. Il suffit de cliquer sur la case d'option BSpline ou laisser la valeur par défaut DWire.
|
|
</p>
|
|
<div class="center"><div class="floatnone"><a href="https://www.freecadweb.org/wiki/index.php?title=File:V2_scale.png" class="image" title="La boîte de dialogue de la version 2 Airfoil Import avec le choix de DWire ou BSpline"><img alt="La boîte de dialogue de la version 2 Airfoil Import avec le choix de DWire ou BSpline" src="V2_scale.png" width="378" height="189" /></a></div></div>
|
|
<h3><span class="mw-headline" id="Modifier_la_s.C3.A9lection_par_d.C3.A9faut">Modifier la sélection par défaut</span></h3>
|
|
<p>Si vous préférez importer vos profils en BSplines plutôt que DWires, la Marco peut être modifiée pour que Bspline soit actif défaut. Il suffit juste de modifier la ligne-
|
|
</p>
|
|
<pre>##exampleCode##
|
|
self.radio1.setChecked(True) </pre>
|
|
<p><br />
|
|
- and changing it to -<br />
|
|
</p>
|
|
<pre>##exampleCode##
|
|
self.radio2.setChecked(True) </pre><br />
|
|
<p>Une note sur la possible modification est incluse dans le texte de la macro.
|
|
</p>
|
|
<h2><span class="mw-headline" id="Les_Macros">Les Macros</span></h2>
|
|
<h3><span class="mw-headline" id="Version_1.5">Version 1.5</span></h3>
|
|
<pre># # # #
|
|
#
|
|
# AIRFOIL IMPORT & SCALE v1.5
|
|
#
|
|
# Imports and scales an Airfoil in the form of a Draft Wire (DWire)
|
|
#
|
|
# # # #
|
|
|
|
|
|
from PySide import QtCore, QtGui
|
|
from PySide.QtGui import QLineEdit
|
|
import FreeCAD, FreeCADGui, Draft
|
|
import importAirfoilDAT
|
|
|
|
# Select .dat airfoil data file to be imported
|
|
|
|
filename = QtGui.QFileDialog.getOpenFileName(QtGui.qApp.activeWindow(),'Open An Airfoil File','*.dat')
|
|
|
|
class p():
|
|
|
|
def proceed(self):
|
|
try:
|
|
|
|
# This produces a scaled Airfoil with a DWire
|
|
|
|
scalefactor=float(self.s1.text())
|
|
f1=str(filename)
|
|
importAirfoilDAT.insert(f1,"Unnamed")
|
|
Draft.scale(App.ActiveDocument.ActiveObject,delta=App.Vector(scalefactor,scalefactor,scalefactor),center=App.Vector(0,0,0),legacy=True)
|
|
|
|
except:
|
|
FreeCAD.Console.PrintError("Error, not a valid .dat file\n")
|
|
|
|
self.close()
|
|
|
|
def close(self):
|
|
self.dialog.hide()
|
|
|
|
def __init__(self):
|
|
self.dialog = None
|
|
self.s1 = None
|
|
|
|
# Make dialog box and get the scale size
|
|
|
|
self.dialog = QtGui.QDialog()
|
|
self.dialog.resize(350,100)
|
|
self.dialog.setWindowTitle("Airfoil Import & Scale")
|
|
la = QtGui.QVBoxLayout(self.dialog)
|
|
t1 = QtGui.QLabel("Chord Length")
|
|
la.addWidget(t1)
|
|
self.s1 = QtGui.QLineEdit()
|
|
la.addWidget(self.s1)
|
|
|
|
# Add OK / Cancel buttons
|
|
|
|
#ori okbox = QtGui.QDialogButtonBox(self.dialog)
|
|
#ori okbox.setOrientation(QtCore.Qt.Horizontal)
|
|
#ori okbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel -PIPE- QtGui.QDialogButtonBox.Ok)
|
|
# modify original code for install with addon-install cause -PIPE- 05-12-2016 FC 0.16
|
|
|
|
okbox = QtGui.QDialogButtonBox(self.dialog)
|
|
okbox.setOrientation(QtCore.Qt.Horizontal)
|
|
okbox.setStandardButtons(QtGui.QDialogButtonBox.Ok)
|
|
|
|
cancelbox = QtGui.QDialogButtonBox(self.dialog)
|
|
cancelbox.setOrientation(QtCore.Qt.Horizontal)
|
|
cancelbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel)
|
|
cancelbox.move(0,62)
|
|
|
|
la.addWidget(okbox)
|
|
QtCore.QObject.connect(okbox, QtCore.SIGNAL("accepted()"), self.proceed)
|
|
QtCore.QObject.connect(cancelbox, QtCore.SIGNAL("rejected()"), self.close)
|
|
QtCore.QMetaObject.connectSlotsByName(self.dialog)
|
|
self.dialog.show()
|
|
self.dialog.exec_()
|
|
|
|
p() </pre>
|
|
<h3><span class="mw-headline" id="Version_2">Version 2</span></h3>
|
|
<div id="itsfree" style="text-align:center;color:black;background:#FDE0A8;margin:1em 7em;padding:0.5em 2em;border:2px solid #FF5706;"><b>Avertissement - avec cette Macro les versions de FreeCAD inférieures à 0,14, révision 3077 ne donnent pas les résultats attendus lorsque vous utilisez l'option BSpline et peut donner lieu à un blocage de FreeCAD et de perdre les données non sauvegardées !</b></div>
|
|
<pre>
|
|
# # # #
|
|
#
|
|
# AIRFOIL IMPORT & SCALE v2.
|
|
#
|
|
# Imports and scales an Airfoil in the form of a Draft Wire (DWire) or Basic Spline (BSpline)
|
|
#
|
|
# For FreeCAD Versions = or > 0.14 Revision 3077
|
|
#
|
|
# Works best with OCC/OCE = or > 6.7
|
|
#
|
|
# # # #
|
|
|
|
|
|
from PyQt4 import QtCore, QtGui
|
|
from PyQt4.QtGui import QLineEdit, QRadioButton
|
|
import FreeCAD, FreeCADGui, Draft
|
|
import importAirfoilDAT
|
|
|
|
# Select .dat airfoil data file to be imported
|
|
|
|
filename = QtGui.QFileDialog.getOpenFileName(QtGui.qApp.activeWindow(),'Open An Airfoil File','*.dat')
|
|
|
|
class p():
|
|
|
|
def proceed(self):
|
|
if self.radio1.isChecked():
|
|
try:
|
|
|
|
# This produces a scaled Airfoil with a DWire
|
|
|
|
scalefactor=float(self.s1.text())
|
|
f1=str(filename)
|
|
importAirfoilDAT.insert(f1,"Unnamed")
|
|
Draft.scale(App.ActiveDocument.ActiveObject,delta=App.Vector(scalefactor,scalefactor,scalefactor),center=App.Vector(0,0,0),legacy=True)
|
|
|
|
except:
|
|
FreeCAD.Console.PrintError("Error, not a valid .dat file\n")
|
|
|
|
self.close()
|
|
|
|
if self.radio2.isChecked():
|
|
try:
|
|
|
|
# This produces a scaled Airfoil with a BSpline
|
|
|
|
scalefactor=float(self.s1.text())
|
|
f1=str(filename)
|
|
importAirfoilDAT.insert(f1,"Unnamed")
|
|
points = FreeCAD.ActiveDocument.ActiveObject.Points
|
|
Draft.makeBSpline(points, closed=True)
|
|
Draft.scale(App.ActiveDocument.ActiveObject,delta=App.Vector(scalefactor,scalefactor,scalefactor),center=App.Vector(0,0,0),legacy=True)
|
|
App.getDocument("Unnamed").removeObject("DWire")
|
|
|
|
except:
|
|
FreeCAD.Console.PrintError("Error, not a valid .dat file\n")
|
|
|
|
self.close()
|
|
|
|
def close(self):
|
|
self.dialog.hide()
|
|
|
|
|
|
def __init__(self):
|
|
self.dialog = None
|
|
self.s1 = None
|
|
|
|
|
|
# Make dialog box and get the scale size
|
|
|
|
self.dialog = QtGui.QDialog()
|
|
self.dialog.resize(350,100)
|
|
self.dialog.setWindowTitle("Airfoil Import & Scale")
|
|
la = QtGui.QVBoxLayout(self.dialog)
|
|
t1 = QtGui.QLabel("Chord Length")
|
|
la.addWidget(t1)
|
|
self.s1 = QtGui.QLineEdit()
|
|
la.addWidget(self.s1)
|
|
|
|
# Add radio buttons to select between DWire and BSpline
|
|
|
|
self.radio1 = QRadioButton("Make DWire")
|
|
self.radio2 = QRadioButton("Make BSpline")
|
|
|
|
# set default to DWire & make radio buttons - Change self.radio1.setChecked(True) to
|
|
# self.radio2.setChecked(True) to set BSpline as default
|
|
|
|
self.radio1.setChecked(True)
|
|
la.addWidget(self.radio1)
|
|
la.addWidget(self.radio2)
|
|
|
|
# Add OK / Cancel buttons
|
|
|
|
okbox = QtGui.QDialogButtonBox(self.dialog)
|
|
okbox.setOrientation(QtCore.Qt.Horizontal)
|
|
okbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
|
|
la.addWidget(okbox)
|
|
QtCore.QObject.connect(okbox, QtCore.SIGNAL("accepted()"), self.proceed)
|
|
QtCore.QObject.connect(okbox, QtCore.SIGNAL("rejected()"), self.close)
|
|
QtCore.QMetaObject.connectSlotsByName(self.dialog)
|
|
self.dialog.show()
|
|
self.dialog.exec_()
|
|
|
|
p()
|
|
</pre>
|
|
<h3><span class="mw-headline" id="Version_2.1">Version 2.1</span></h3>
|
|
<p>Updated by mangtronix to use PySide instead of PyQt (used in older versions of FreeCAD)
|
|
</p>
|
|
<pre>
|
|
# # # #
|
|
#
|
|
# AIRFOIL IMPORT & SCALE v2.1
|
|
#
|
|
# Imports and scales an Airfoil in the form of a Draft Wire (DWire) or Basic Spline (BSpline)
|
|
#
|
|
# For FreeCAD Versions = or > 0.14 Revision 3703
|
|
#
|
|
# Works best with OCC/OCE = or > 6.7
|
|
#
|
|
# # # #
|
|
|
|
|
|
from PySide import QtCore, QtGui
|
|
from PySide.QtGui import QLineEdit, QRadioButton
|
|
import FreeCAD, FreeCADGui, Draft
|
|
import importAirfoilDAT
|
|
|
|
# Select .dat airfoil data file to be imported
|
|
|
|
# PySide returns a tuple (filename, filter) instead of just a string like in PyQt
|
|
filename, filefilter = QtGui.QFileDialog.getOpenFileName(QtGui.qApp.activeWindow(),'Open An Airfoil File','*.dat')
|
|
|
|
class p():
|
|
|
|
def proceed(self):
|
|
global filename
|
|
if self.radio1.isChecked():
|
|
#if True:
|
|
try:
|
|
|
|
# This produces a scaled Airfoil with a DWire
|
|
|
|
scalefactor=float(self.s1.text())
|
|
f1=str(filename)
|
|
importAirfoilDAT.insert(f1,"Unnamed")
|
|
Draft.scale(App.ActiveDocument.ActiveObject,delta=App.Vector(scalefactor,scalefactor,scalefactor),center=App.Vector(0,0,0),legacy=True)
|
|
|
|
except Exception, e:
|
|
FreeCAD.Console.PrintError("Error, not a valid .dat file\n")
|
|
|
|
self.close()
|
|
|
|
if self.radio2.isChecked():
|
|
try:
|
|
|
|
# This produces a scaled Airfoil with a BSpline
|
|
|
|
scalefactor=float(self.s1.text())
|
|
f1=str(filename)
|
|
importAirfoilDAT.insert(f1,"Unnamed")
|
|
points = FreeCAD.ActiveDocument.ActiveObject.Points
|
|
Draft.makeBSpline(points, closed=True)
|
|
Draft.scale(App.ActiveDocument.ActiveObject,delta=App.Vector(scalefactor,scalefactor,scalefactor),center=App.Vector(0,0,0),legacy=True)
|
|
App.getDocument("Unnamed").removeObject("DWire")
|
|
|
|
except:
|
|
FreeCAD.Console.PrintError("Error, not a valid .dat file\n")
|
|
|
|
self.close()
|
|
|
|
def close(self):
|
|
self.dialog.hide()
|
|
|
|
|
|
def __init__(self):
|
|
self.dialog = None
|
|
self.s1 = None
|
|
|
|
|
|
# Make dialog box and get the scale size
|
|
|
|
self.dialog = QtGui.QDialog()
|
|
self.dialog.resize(350,100)
|
|
self.dialog.setWindowTitle("Airfoil Import & Scale")
|
|
la = QtGui.QVBoxLayout(self.dialog)
|
|
t1 = QtGui.QLabel("Chord Length")
|
|
la.addWidget(t1)
|
|
self.s1 = QtGui.QLineEdit()
|
|
la.addWidget(self.s1)
|
|
|
|
# Add radio buttons to select between DWire and BSpline
|
|
|
|
self.radio1 = QRadioButton("Make DWire")
|
|
self.radio2 = QRadioButton("Make BSpline")
|
|
|
|
# set default to DWire & make radio buttons - Change self.radio1.setChecked(True) to
|
|
# self.radio2.setChecked(True) to set BSpline as default
|
|
|
|
self.radio1.setChecked(True)
|
|
la.addWidget(self.radio1)
|
|
la.addWidget(self.radio2)
|
|
|
|
# Add OK / Cancel buttons
|
|
|
|
okbox = QtGui.QDialogButtonBox(self.dialog)
|
|
okbox.setOrientation(QtCore.Qt.Horizontal)
|
|
okbox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
|
|
la.addWidget(okbox)
|
|
QtCore.QObject.connect(okbox, QtCore.SIGNAL("accepted()"), self.proceed)
|
|
QtCore.QObject.connect(okbox, QtCore.SIGNAL("rejected()"), self.close)
|
|
QtCore.QMetaObject.connectSlotsByName(self.dialog)
|
|
self.dialog.show()
|
|
self.dialog.exec_()
|
|
|
|
p()
|
|
</pre>
|
|
<h2><span class="mw-headline" id="Liens">Liens</span></h2>
|
|
<p>Discussion sur <a rel="nofollow" class="external text" href="http://forum.freecadweb.org/viewtopic.php?f=22&t=5554&p=45137&hilit=Airfoil#p45137">Forum</a>
|
|
</p><p><a rel="nofollow" class="external text" href="http://aerospace.illinois.edu/m-selig/ads/coord_database.html#N">UIUC Applied Aerodynamics Group Departement of Aerospace Engineering</a>
|
|
</p>
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div><div class="printfooter">
|
|
Online version: "<a dir="ltr" href="https://www.freecadweb.org/wiki/index.php?title=Macro_Airfoil_Import_%26_Scale/fr&oldid=241100">http://www.freecadweb.org/wiki/index.php?title=Macro_Airfoil_Import_%26_Scale/fr&oldid=241100</a>"</div>
|
|
<div id="catlinks" class="catlinks" data-mw="interface"></div><div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
<div id="mw-navigation">
|
|
<h2>Navigation menu</h2>
|
|
|
|
</body></html> |