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ů.
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.
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'.
Todo: všechny ostatní ...
Detailní informace najdete v kódu:
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:
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:
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.
Č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 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:
Kalkulátor jednotek již VstupníPole používá.
Hlavní dokument: InputField/cs
Kód:
Systém veličin a jednotek ve FreeCADu je (jako téměř všechno) plně přístupný v Pythonu.
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.
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)')
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.
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
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é ...
Třída pro veličinu má dvě možnosti použití aktuálních převodového schematu:
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
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():
Quantity('22 m').getUserPrefered() # gets a tubple:('22 m', 1000.0, 'm')
Quantity('2 m').getUserPrefered() # Tuple: ('2000 mm', 1.0, 'mm')
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:
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