Quantity/cs

Veličina je kombinace čísla a jednotky. Je využívána všude ve FreeCADu k práci s parametry a všemi dalšími druhy vstupů a výstupů.

Základní
V CAD a CAE systémech je velmi důležité sledovat jednotky hodnot. Mnoho problémů může nastat když se míchají různé jednotky nebo vypočítané výsledky v různých jednotkových systémech. Jeden známý případ je havárie Mars Climate Orbiteru kvůli pomíchání jednotek. I ve stejném jednotkovém systému přicházejí jednotky se spoustou variant šitých vždy na dané použití. Jednoduché příklady jsou např. rycjlost v km/h (auta), m/s (roboti) nebo mm/min (frézování). CAD systém musí spolehlivě sledovat jednotky. Také s nimi dělat výpočty a kontrolovat správné jednoty u speciálních parametrů.

Z těchto důvodů byl vytvořen Framework veličin FreeCADu. Zahrnuje všechny kódy a objekty, které pracují s jednotkami, výpočty jednotek, uživatelské vstupy, konverze do jiných jednotkových systémů a pěkný výstup jednotek a hodnot. V dlouhodobém horizontu by žádný paramater ve FreeCADu neměl být pouze jen číslo.

Podporované jednotky
Vstupní parser FreeCADu podporuje balík jednotek a jednotkových systémů. Používáme řecké písmeno pro mikro, ale jako náhrada je akceptováno i 'u'.


 * Délka
 * "nm"
 * "µm"
 * "mm"
 * "cm"
 * "dm"
 * "m"
 * "km"
 * "in"
 * "ft"
 * "thou"
 * "mil"
 * "yd"
 * "mi"

Todo: všechny ostatní ...

Detailní informace najdete v kódu:
 * Slovník veličin: http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Base/QuantityParser.l
 * Definice veličin: http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Base/Quantity.cpp#l167

Interní reprezentace
Všechny fyzické jednotky mohou být vyjádřeny jako kombinace sedmi SI-jednotek:



Jednoduchým způsobem jak vyjádřit jednotku je celočíselné pole 7 čísel (počet základních jednotek), které definuje o jakou jednotku se jedná. Signatury 7 základních jednotek jsou:
 * DĚLKA: [1,0,0,0,0,0,0]
 * HMOTNOST: [0,1,0,0,0,0,0]
 * ČAS: [0,0,1,0,0,0,0]
 * ELEKTRICKÝ PROUD: [0,0,0,1,0,0,0]
 * TERMODYNAMICKÁ TEPLOTA: [0,0,0,0,1,0,0]
 * LÁTKOVÉ MNOŽSTVÍ: [0,0,0,0,0,1,0]
 * SVĚTELNÁ INTENZITA: [0,0,0,0,0,0,1]

Těmito 7 jednotkami můžeme vyjádřit všechny odvozené jednotky definované v Průvodci pro použití Mezinárodního jednotkového systému (SI) a vytvářet nové jednotky podle potřeby jako například:
 * MĚRNÁ HMOTNOST: [-3,1,0,0,0,0,0]
 * PLOCHA: [0,2,0,0,0,0,0]

Protože úhly jsou fyzikálně bezrozměrné, ale ne méně důležité v CAD systému, přidali jsme jednu další virtuální jednotku pro úhel. To dotváří 8-mi místný vektor v jednotkové signatuře FreeCADu.

Kalkulátor jednotek
Často potřebujete přepočítávat jednotky z jednoho systému do druhého. Například máte starou tabulku parametrů s drátovými jednotkami. Pro takový případ FreeCAD nabízí konverzní nástroj nazývaný Kalkulátor jednotek, který pomáhá s přepočtem jednotek.

Detailní popis je zde: Std_UnitsCalculator

VstupníPole
VstupníPole je QLineEdit odvozený z Qt widgetu k práci se všemi druhy uživatelských vstupů veličin a parametrů. Má následující vlastnosti:
 * zpracovává libovolné hodnoty/jednotky na vstupu
 * kontrola na správnou jednotku (je-li zadána) a dává uživatelskou odezvu
 * speciální kontextové menu pro operace s veličinami/jednotkami
 * správa historie (ukládá poslední použitou hodnotu)
 * ukládá často používané hodnoty jako klávesové zkratky v kontextovém menu
 * vytáčené hodnoty pomocí kolečka myši a klávesových šipek (tbd)
 * vytáčené hodnoty pomocí středního tlačítka myši a posunů myši (tbd)
 * integrace do Pythonu pro použití v dialogových oknech Pythonu (tbd)

Kalkulátor jednotek již VstupníPole používá.

Hlavní dokument: InputField/cs

Kód:
 * 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

Python scripting
The Unit and Quantity system in FreeCAD is (as nearly everything) fully accessibly via Python.

Unit
The Unit class represents the Fingerprint of any physical unit. As descriped in the Basics section a vector of 8 numbers is used to represent this fingerprint. The Unit class allows the handling and calculation with this information.

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.

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: There can be easily additional schemas implemented in the future...
 * 1: Internal    (mm/kg/s)
 * 2: MKS         (m/kg/s)
 * 3: US customary (in/lb)

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

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:

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:
 * 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

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 "µ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