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'.

Todo: všechny ostatní ...


Detailní informace najdete v kódu:

Interní reprezentace

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

SI-Derived-Units.jpg


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.

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:

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

Hlavní dokument: InputField/cs

Kód:

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.

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.

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

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é ...

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:

Dodatek

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 
Online version: "http://www.freecadweb.org/wiki/index.php?title=Quantity/cs&oldid=83987"

Navigation menu