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ř. rychlost 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

Skriptování v Pythonu
Systém veličin a jednotek ve FreeCADu je (jako téměř všechno) plně přístupný v Pythonu.

Jednotka
Třída Unit (jednotka) reprezentuje identifikaci fyzické jednotky. Jek je popsáno v základní části je pro reprezentaci jednotky použít vektor 8 čísel. Třída Unit umožňuje práci a výpočty s těmito informacemi.

Jednotka je používaná hlavně k popisu typu jednotky parametru. Proto speciální typ vlastnosti ve FreeCADu může předávat jednotky pro jejich kontrolu a zaručuje správnou jednotku. Hodnota jednotky a čísla je nazývána Veličina.

Hodnoty pro uživatele
Ve skriptech můžete používat veličiny pro všechny druhy výpočtů a kontrol, přijde čas, kdy budete muset vytvořit výstupní informaci pro uživatele. Můžete použít getValueAs pro vynucení určité jednotky, ale normálně uživatel nastaví svoje preferované jednotkové schéma v předvolbách. Toto jednotkové schema dělá všechny převody do reprezentace, kterou chce uživatel vidět. V této době jsou implementována 3 schemata: Přidální dalších schemat bude v budoucnosti snadné ...
 * 1: Vnitřní    (mm/kg/s)
 * 2: MKS         (m/kg/s)
 * 3: US customary (in/lb)

Třída pro veličinu má dvě možnosti použití aktuálních převodového schematu:

To funguje jenom když potřebujete řetězce (texty). Ale někdy potřebujete větší řízení, např. když máte dialogové tlačítko a možností posunu nahoru a dolu. Pak potřebujete mnohe víc informací o převodu do výstupu. Proto je pro veličiny používána metoda getUserPrefered:

Zde získáte dvě další informace jako pole o velikosti 3. Dostanete řetězec jako předtím, plus faktor, kterým je číslo převedeno a neupravený řetězec pouze s jednotkou vybranou převodovým schematem. S takovou informací můžete implementovat mnohem bohatší odezvu.

Kódy pro převodní schema můžete najít zde:
 * 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

Jednotky podporované parserem
Ačkoliv všechny fyzické jednotky mohou být popsány 7 jednotkami SI, většina jednotek používaných v technické oblasti jsou obecné kombinované jednotky (jako Pa = N/m^2 Pascal ). Proto parser jednotek ve FreeCADu podporuje spoustu SI a Imperiálních jednotek. Tyto jednotky jsou jsou definovány v souboru src/Base/QuantityParser.l a mohou být v budoucnosti dále rozšiřovány.

"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