Quantity/fr

Quantity est une combinaison d'un nombre à virgule flottante et d'une unité. Quantity est utilisé dans l'ensemble de FreeCAD pour gérer les paramètres et toutes sortes d'autres entrées/sorties.

Généralité
Dans un système CAO ou CAE il est très important de garder une trace de l'unité d'une valeur. Beaucoup de problèmes peuvent survenir lors du mélange des unités ou des résultats de calculs dans des systèmes d'unités différentes. Une catastrophe célèbre est la perte de la sonde Mars Climate Orbiter à cause d'une confusion d'interprétation d'unité. Même dans le même système d'unité, les unités sont de type différents, et toujours adaptés à son domaine d'utilisation. Un petit exemple, la vitesse interprétée en km/h (voitures), en m/s pour la (robotique) ou calcul de l'avance de l'outil en mm/minute (fraisage). Un système de CAO dois rester fiable avec toutes les unités. Donc, il faut compter sur elle et utiliser la bonne unité pour les paramètres spéciaux.

C'est pour cela que la FreeCAD Quantity framework a été créé. Il comprend le code et les objets à traiter avec les unités, calculs d'unités, entrées utilisateurs, conversion dans d'autres systèmes d'unités et affichage des unités et des valeurs. À long terme, aucun paramètre ne devrait être dans FreeCAD, juste un nombre.

Unités supportées
L'analyseur de FreeCAD prend en charge un tas d'unités et d'unités-systme. Nous utilisons la lettre grecque pour micro " µ " mais peut être substituée par la lettre " u ".


 * Longueurs
 * "nm"
 * "µm"
 * "mm"
 * "cm"
 * "dm"
 * "m"
 * "km"
 * "in"
 * "ft"
 * "thou"
 * "mil"
 * "yd"
 * "mi"

TODO : tout le reste...

Vous pouvez trouver plus de détails dans le code :
 * Quantity lexer: http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Base/QuantityParser.l
 * Quantity definitions: http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Base/Quantity.cpp#l167

Représentation interne
Toutes les unités physiques peuvent être exprimées dans sept combinaisons SI-Units:



Un moyen facile d'exprimer une unité est un tableau d'entiers de taille 7 (nombre d'unités de base) qui définit ce qu'est l'unité.

La signature des 7 unités de base sont :


 * LENGTH: [1,0,0,0,0,0,0]
 * MASS: [0,1,0,0,0,0,0]
 * TIME: [0,0,1,0,0,0,0]
 * ELECTRIC CURRENT: [0,0,0,1,0,0,0]
 * THERMODYNAMIC TEMPERATURE: [0,0,0,0,1,0,0]
 * AMOUNT OF SUBSTANCE: [0,0,0,0,0,1,0]
 * LUMINOUS INTENSITY: [0,0,0,0,0,0,1]

De ces 7 unités, nous sommes alors en mesure d'exprimer toutes les unités dérivées, définies dans Guide for the Use of the International System of Units (SI) et au besoin d'en créer de nouvelles comme par exemple :


 * MASS DENSITY: [-3,1,0,0,0,0,0]
 * AREA: [0,2,0,0,0,0,0]

Puisque l'angle est sans dimension physiquement, mais néanmoins important dans un système de CAO, nous ajouterons une unité plus virtuelle pour Angle. Ce qui rend le vecteur à 8 dans la signature d'unité de FreeCAD.

Conversion d'unités
Souvent, vous avez besoin de convertir des unités d'un système à un autre. Par exemple, vous avez un vieux tableau de paramètres avec des unités filaires. Dans ce cas FreeCAD offre un outil de conversion appelé Units-Calculator qui vous aide à traduire les unités.

Sa description est détaillée ici :

Std_UnitsCalculator

Champ a entrer
InputField est un QLineEdit dérivé Qt widget pour gérer tous les types d'interaction de l'utilisateur avec les paramètres et les quantités. Il dispose à la suite des propriétés :


 * l'analyse arbitraire d'entrée valeur/unité
 * vérification sur l'exactitude de l'unité (si) et donner une rétroaction
 * menu contextuel spécial sur les opérations quantités/valeurs
 * gestion de l'historique (sauf les dernières valeurs utilisées)
 * enregistrer fréquemment les valeurs avec le raccourci dans le menu contextuel
 * numérotation des valeurs avec action sur les touches de souris et flèche (tbd)
 * composition avec le bouton central de la souris et le déplacement de la souris (à déterminer)
 * intégration python pour l'utilisation dans la console python (tbd)

UnitsCalculator utilise déjà InputField.

Main docu: InputField

Code:
 * http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Gui/InputField.h
 * http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Gui/InputField.cpp

Script Python
Les système Unit et Quantity sont entièrements accessibles via Python dans (presque tout) FreeCAD.

Unit
La Unit class représente l'empreinte digitale de n'importe quelle unité physique. Comme décri dans la section plus haut, un vecteur de 8 nombres est utilisé pour représenter cette empreinte. La Unit class permet la manutention et le calcul grâce à cette information.

Unit est principalement utilisé pour décrire un paramètre d'un certain type d'unité. Un Type particulier de propriété peut être porté dans le système d'unités de FreeCAD pour vérifier et garantir l'unité adéquate. Une Unit et une valeur float sont appelés Quantity.

Valeurs face vers l'utilisateur
Normalement, dans un script, vous pouvez utiliser Quantity pour tout genre de calcul et vérification, mais il peut mettre un certain temps pour afficher les informations à l'utilisateur. Vous pouvez utiliser getValueAs pour forcer une certaine unité, mais normalement l'utilisateur définit son schéma-unité préféré dans les préférences. Ce schéma-unité donne toutes les représentations de la conversions que l'utilisateur veut voir. À l'heure actuelle, il y a 3 schémas mis en place :

A l'avenir il peut y avoir des schémas supplémentaires faciles à ajouter ...
 * 1: Internal    (mm/kg/s)
 * 2: MKS         (m/kg/s)
 * 3: US customary (in/lb)

La Quantity class a deux possibilités pour utiliser la conversion réelle du schéma :

Procédure à suivre, si vous n'avez besoin que d'une chaîne. Mais si vous avez besoin d'un plus grand contrôle, par exemple si vous voulez avoir une boîte de dialogue avec boutons up et down. Alors vous avez besoin de plus d'informations de la conversion affichée. Alors la méthode getUserPrefered de Quantity est utilisée :

Ici, vous obtenez deux informations comme un tuple de taille 3. Vous obtenez la chaîne telle qu'elle était avant, plus le facteur de conversion du nombre et la chaîne brute avec uniquement l'unité choisie par le schéma de conversion. Avec cette information, vous pouvez implémenter une interaction utilisateur beaucoup plus riche.

Vous pouvez voir ici le code pour la conversion du schéma :


 * http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Base/UnitsSchemaInternal.cpp
 * http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Base/UnitsSchemaMKS.cpp
 * http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Base/UnitsSchemaImperial1.cpp

Analyseur de prise en charge des unités
Bien que toutes les unités physiques peuvent être décrite avec les sept unités du SI, la plupart des unités utilisées dans le domaine technique sont combinées (comme Pa = N/m^2 Pascal). L'analyseur d'unités dans FreeCAD supporte la combinaison des unités des systèmes SI et Imperial. Ces unités sont définies dans le fichier src/Base/QuantityParser.l et peut être étendu dans le futur.

"nm"  = Quantity(1.0e-6    ,Unit(1));           // nano meter "µm"  = Quantity(1.0e-3    ,Unit(1));           // micro meter "mm"  = Quantity(1.0       ,Unit(1));           // milli meter "cm"  = Quantity(10.0      ,Unit(1));           // centi meter "dm"  = Quantity(100.0     ,Unit(1));           // deci meter "m"   = Quantity(1.0e3     ,Unit(1));           // meter "km"  = Quantity(1.0e6     ,Unit(1));           // kilo meter "l"   = Quantity(1000000.0 ,Unit(3));           // Liter dm^3 "µg"  = Quantity(1.0e-9    ,Unit(0,1));         // micro gram "mg"  = Quantity(1.0e-6    ,Unit(0,1));         // milli gram "g"   = Quantity(1.0e-3    ,Unit(0,1));         // gram "kg"  = Quantity(1.0       ,Unit(0,1));         // kilo gram "t"   = Quantity(1000.0    ,Unit(0,1));         // ton "s"   = Quantity(1.0       ,Unit(0,0,1));       // second          (internal standard time) "min" = Quantity(60.0      ,Unit(0,0,1));       // minute "h"   = Quantity(3600.0    ,Unit(0,0,1));       // hour "A"   = Quantity(1.0       ,Unit(0,0,0,1));     // Ampere          (internal standard electric current) "mA"  = Quantity(0.001     ,Unit(0,0,0,1));     // milli Ampere "kA"  = Quantity(1000.0    ,Unit(0,0,0,1));     // kilo Ampere "MA"  = Quantity(1.0e6     ,Unit(0,0,0,1));     // Mega Ampere "K"   = Quantity(1.0       ,Unit(0,0,0,0,1));   // Kelvin (internal standard thermodynamic temperature) "mK"  = Quantity(0.001     ,Unit(0,0,0,0,1));   // Kelvin "µK"  = Quantity(0.000001  ,Unit(0,0,0,0,1));   // Kelvin

"mol" = Quantity(1.0       ,Unit(0,0,0,0,0,1));   // Mole     (internal standard amount of substance)

"cd"  = Quantity(1.0       ,Unit(0,0,0,0,0,0,1)); // Candela   (internal standard luminous intensity)

"deg" = Quantity(1.0           ,Unit(0,0,0,0,0,0,0,1));  // degree         (internal standard angle) "rad" = Quantity(180/M_PI      ,Unit(0,0,0,0,0,0,0,1));  // radian "gon" = Quantity(360.0/400.0   ,Unit(0,0,0,0,0,0,0,1));  // gon

"in"  = Quantity(25.4          ,Unit(1));       // inch "\""  = Quantity(25.4          ,Unit(1));       // inch "fo"   = Quantity(304.8         ,Unit(1));       // foot "'"    = Quantity(304.8         ,Unit(1));       // foot "th"   = Quantity(0.0254        ,Unit(1));       // thou "yd"   = Quantity(914.4         ,Unit(1));       // yard

"lb"  = Quantity(0.45359237    ,Unit(0,1));    // pound "oz"  = Quantity(0.0283495231  ,Unit(0,1));    // ounce "st"  = Quantity(6.35029318    ,Unit(0,1));    // Stone "cwt" = Quantity(50.80234544   ,Unit(0,1));    // hundredweights