Quantity

From FreeCAD Documentation
Revision as of 11:39, 12 February 2014 by Mario52 (talk | contribs) (create page and translate)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

The FreeCAD input parser supports a bunch of units and units-systmes. We do use the Greek letter for micro but also accept 'u' as a replacement. 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 :

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 qui 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 en détaillée ici :

Std_UnitsCalculator

Champ à 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 :

  • parsing arbitrary value/unit input
  • checking on the right unit (if given) and give the user feedback
  • special context menu for operations on Quantities/Values
  • history management (save the last used values)
  • save often needed values as shortcut in context menu
  • dialing values with mouse wheel and arrow keys (tbd)
  • dialing with middle mouse button and mouse move (tbd)
  • python integration for usage in python only dialogs (tbd)
  • 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:

Script Python

Les système Unit et Quantity est entièrement accessible via Python dans (presque tout) FreeCAD.

Unit

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


from Units import Unit

# creating a Unit with certain signature
Unit(0,1)      # Mass     (kg)
Unit(1)        # Length   (mm)
Unit(-1,1,-2)  # Pressure (kg/mm*s^2)

# using predefined constats
Unit(FreeCAD.Units.Length)
Unit(FreeCAD.Units.Mass)
Unit(FreeCAD.Units.Pressure)

# parsing unit out of an string
Unit('kg/(m*s^2)')    # Pressure
Unit('Pa')            # the same as combined Unit Pascale
Unit('J')             # Joul (Work,Energy) mm^2*kg/(s^2)

# you can use units from all supported unit-systems
Unit('psi')           # Imperial pressure
Unit('lb')            # Mass
Unit('ft^2')          # Area

# comparing units
Unit(0,1) == Unit(FreeCAD.Units.Mass)

# getting type of unit
Unit('kg/(m*s^2)').Type == 'Pressure'

# calculating
Unit('kg') * Unit('m^-1*s^-2') == Unit('kg/(m*s^2)')

The Unit is mainly used to descripe a certain unit-type for a parameter. There fore a special Property Type in FreeCAD can transport a Unit to check and ensure the right Unit. A Unit and a float value is called Quantity.

Unit est principalement utilisé pour décrire un certain type d'unité pour un paramètre. Il fore un Type particulier de propriété à FreeCAD peut transporter une unité pour vérifier et garantir l'unité du droit. Une unité et une valeur float est appelée Quantity.

Quantity

from Units import Unit,Quantity

# to create a quantity you need a value (float) and a Unit
Quantity(1.0,Unit(0,1))               # Mass      1.0 kg
Quantity(1.0,Unit(1))                 # Length    1.0 mm
Quantity(1.0,Unit(-1,1,-2))           # Pressure  1.0 kg/mm*s^2
Quantity(1.0,FreeCAD.Units.Pressure)  # Pressure  1.0 kg/mm*s^2

# you can directly give a signature
Quantity(1.0,0,1)      # Mass      1.0 kg
Quantity(1.0,1)        # Length    1.0 mm
Quantity(1.0,-1,1,-2)  # Pressure  1.0 kg/mm*s^2

# parsing Quantitis out of a string
Quantity('1.0 kg/(m*s^2)')    # Pressure
Quantity('1.0 Pa')            # the same as combined Unit Pascale
Quantity('1.0 J')             # Joul (Work,Energy) mm^2*kg/(s^2)

# You can using a point or comma as float delimiter
Quantity('1,0 m')    
Quantity('1.0 m')   

# you can use units from all supported unit-systems
Quantity('1.0 psi')           # Imperial pressure
Quantity('1.0 lb')            # Mass
Quantity('1.0 ft^2')    

# the quantity parser can do calculations too
Quantity('360/5 deg')           # splitting circle 
Quantity('1/16 in')             # fractions
Quantity('5.3*6.3 m^2')         # calculating an area
Quantity('1/(log(2.3)/sin(pi)*3.4)+1.8e-3 m')
Quantity('1ft 3in')             # imperial style

# and for sure calculation and comparison
Quantity('1 Pa')* Quantity(2.0) == Quantity('2 Pa')
Quantity('1 m')* Quantity('2 m') == Quantity('2 m^2')
Quantity('1 m')* Quantity('2 ft') + Quantity('2 mm^2')
Quantity('1 m') > Quantity('2 ft')

# accessing the components
Quantity('1 m').Value     # get the number (allways internal system (mm/kg/s)
Quantity('1 m').Unit      # get the unit
Quantity('1 m') == Quantity( Quantity('1 m').Value , Quantity('1 m').Unit )

# translating the value into other units then the internal system (mm/kg/s)
Quantity('1 km/h').getValueAs('m/s')               # translate value
Quantity('1 m').getValueAs(2.45,1)                 # translation value and unit signature
Quantity('1 kPa').getValueAs(FreeCAD.Units.Pascal) # predefined standard units 
Quantity('1 MPa').getValueAs(Quantity('N/m^2'))    # a quantity

User facing values

Normally in script you can use Quantity for all kind of calculation and checking, but there comes the time you have to output information to the user. You could use getValueAs() to force a certain unit, but normally the user sets his preferred unit-schema in the preferences. This unit-schema do all the translations to the representation the user likes to see. At the moment there are 3 schema implemented:

  • 1: Internal (mm/kg/s)
  • 2: MKS (m/kg/s)
  • 3: US customary (in/lb)

There can be easily additional schemas implemented in the future...

The quantity class has two possibilities to use the actual schema translation:

from Units import Unit,Quantity

# Use the translated string:
Quantity('1m').UserString             # '1000 mm' in 1; '1 m' in 2; and '1.09361 yr' in 3

This does the job if you only need a string. But somethimes you need more control, e.g. if you want to have a dialog button which dial up and down. Then you need more information about the translation output. There fore the getUserPrefered() method of quantity is used:

Quantity('22 m').getUserPrefered()  # gets a tubple:('22 m', 1000.0, 'm')
Quantity('2  m').getUserPrefered()  # Tuple: ('2000 mm', 1.0, 'mm')

Here you get two more informations as a tuple of size 3. You get the string as before, plus the factor the number is translated and the raw string with only the unit chosen by the translation schema. With this information you can implement a much richer user interaction.

The code for the schema translation you can see here:

Appendix

Parser supported Units

Although all physical units can be described with the seven SI units, most of the units used in technical areas are common combined units (like Pa = N/m^2 Pascal ). There fore the units parser in FreeCAD support lot of SI and Imperial combined units. This units are defined in src/Base/QuantityParser.l file and can be further advanced in the future.


"nm"   = Quantity(1.0e-6    ,Unit(1));           // nano meter
"ym"   = 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
                                                 
"yg"   = 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         
"yK"   = 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
Traductions disponibles de cette page :