Quantity/de: Difference between revisions

From FreeCAD Documentation
(Created page with "== Interne Darstellung == Alle physikalischen Einheiten können als eine Komnbination der sieben [https://de.wikipedia.org/wiki/Internationales_Einheitensystem SI-Einheiten] a...")
(Created page with "Ein einfacher Weg, eine Einheit auszudrücken, ist ein Feld mit Integerwerten der Größe 7 (Anzahl der Basiseinheiten), das festlegt, was die Einheit darstellt. Die Kennzei...")
Line 40: Line 40:




Ein einfacher Weg, eine Einheit auszudrücken, ist ein Feld mit Integerwerten der Größe 7 (Anzahl der Basiseinheiten), das festlegt, was die Einheit darstellt.
An easy way to express a unit is an integer array of size 7 (number of base units) that defines what the unit is.

The signature of the 7 base units are:
Die Kennzeichnung der sieben Basiseinheiten ist:
* LENGTH: [1,0,0,0,0,0,0]

* MASS: [0,1,0,0,0,0,0]
* TIME: [0,0,1,0,0,0,0]
* LÄNGE: [1,0,0,0,0,0,0]
* ELECTRIC CURRENT: [0,0,0,1,0,0,0]
* MASSE: [0,1,0,0,0,0,0]
* THERMODYNAMIC TEMPERATURE: [0,0,0,0,1,0,0]
* ZEIT: [0,0,1,0,0,0,0]
* AMOUNT OF SUBSTANCE: [0,0,0,0,0,1,0]
* STROMSTÄRKE: [0,0,0,1,0,0,0]
* LUMINOUS INTENSITY: [0,0,0,0,0,0,1]
* THERMODYNAMISCHE TEMPERATUR: [0,0,0,0,1,0,0]
* STOFFMENGE: [0,0,0,0,0,1,0]
* LICHTSTÄRKE: [0,0,0,0,0,0,1]


Using these seven units we are then able to express all derived units defined in [http://physics.nist.gov/cuu/pdf/sp811.pdf Guide for the Use of the International System of Units (SI)] and create new ones as needed such as for instance:
Using these seven units we are then able to express all derived units defined in [http://physics.nist.gov/cuu/pdf/sp811.pdf Guide for the Use of the International System of Units (SI)] and create new ones as needed such as for instance:

Revision as of 17:05, 28 August 2018

Other languages:

Die Größe ist eine Kombination einer Fließkommazahl und einer Einheit. Sie wird überall in FreeCAD benutzt, um Parameter und alle Arten von Ein- und Ausgaben zu behandeln.

Allgemein

In einem CAD- oder CAE-System ist es sehr wichtig, die Einheit eines Wertes im Auge zu behalten. Viel Ärger kann entstehen, wenn Einheiten durcheinander geworfen oder Ergebnisse in unterschiedlichen Einheitensystemen berechnet werden. Ein berühmtes Missgeschick ist der des Mars Climate Orbiter durch unterschiedliche Einheiten. Selbst innerhalb des gleichen Einheitensystems kommen die Einheiten in unterschiedlichen Varianten abhängig vom Verwendungszweck. Einfache Beispiele sind die Geschwindigkeit in km/h (Autos), m/s (Robotik) oder mm/min (Fräsen). Ein CAD-System muss verlässlich auf die Einheiten achten. Es muss auch mit ihnen rechnen und auf die richtige Einheit bei speziellen Parametern achten.

Aus diesem Grund wurde das FreeCAD-Mengengerüst geschaffen. Es umfasst den gesamten Code und die Objekte zum Umgang mit Einheiten, Berechnungen, Benutzereingaben, Umrechnung in andere Einheitensysteme und die schöne Ausgabe von Werten und Einheiten. Langfristig sollte in FreeCAD kein Parameter nur eine Zahl sein.

Unterstützte Einheiten

Der FreeCAD-Eingabe-Parser unterstützt eine Vielzahl von Einheiten und Einheitensystemen. Wir benutzen den griechischen Buchstaben für micro, aber akzeptieren auch 'u' als Ersatz.

  • Länge
    • "nm"
    • "µm"
    • "mm"
    • "cm"
    • "dm"
    • "m"
    • "km"
    • "in"
    • "ft"
    • "thou"
    • "mil"
    • "yd"
    • "mi"

Todo: der ganze Rest...


Die detaillierte Beschreibung findest Du im Code:

Interne Darstellung

Alle physikalischen Einheiten können als eine Komnbination der sieben SI-Einheiten ausgedrückt werden:


Ein einfacher Weg, eine Einheit auszudrücken, ist ein Feld mit Integerwerten der Größe 7 (Anzahl der Basiseinheiten), das festlegt, was die Einheit darstellt.

Die Kennzeichnung der sieben Basiseinheiten ist:

  • LÄNGE: [1,0,0,0,0,0,0]
  • MASSE: [0,1,0,0,0,0,0]
  • ZEIT: [0,0,1,0,0,0,0]
  • STROMSTÄRKE: [0,0,0,1,0,0,0]
  • THERMODYNAMISCHE TEMPERATUR: [0,0,0,0,1,0,0]
  • STOFFMENGE: [0,0,0,0,0,1,0]
  • LICHTSTÄRKE: [0,0,0,0,0,0,1]

Using these seven units we are then able to express all derived units defined in Guide for the Use of the International System of Units (SI) and create new ones as needed such as for instance:

  • MASS DENSITY: [-3,1,0,0,0,0,0]
  • AREA: [0,2,0,0,0,0,0]

Since angle is physically dimensionless, but nevertheless important to a CAD system we add one more virtual unit for Angle. This makes a vector of 8 in the FreeCAD unit signature.

Units calculator

Often you are in need of converting values from one system of units to another. For example you have old parameter tables with wired units. In these cases FreeCAD offers a conversion tool called Units-Calculator which helps in translating units.

Its description in detail is here: Std_UnitsCalculator

InputField

The InputField is a QLineEdit derived Qt widget to handle all kinds of user interaction with quantities and parameters. It features the following properties:

  • 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
  • selecting values with mouse wheel and arrow keys (tbd)
  • selecting with middle mouse button and mouse move (tbd)
  • Python integration for usage in Python only dialogs (tbd)

The UnitsCalculator uses the InputField already.

Main documentation: InputField

Code:

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 described in the Basics section a vector of eight numbers is used to represent this fingerprint. The Unit class allows the handling and calculation based on this 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 constants
Unit(FreeCAD.Units.Length)
Unit(FreeCAD.Units.Mass)
Unit(FreeCAD.Units.Pressure)

# parsing unit out of a 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 systems of units
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 describe a certain type of unit for a parameter. Therefore a special property type in FreeCAD can pass a unit to check and ensure the right unit. A unit and a float value is called 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 quantities 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 use a point or comma as float delimiter
Quantity('1,0 m')    
Quantity('1.0 m')   

# you can use units from all supported systems of units
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 than 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 scripts you can use Quantity for all kinds of calculations 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 does all the translations to the representation the user likes to see. At the moment there are three schemes 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 options 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 sometimes you need more control, e.g. if you want to have a dialog button which dials up and down. Then you need more information about the translation output. Therefore the getUserPreferred() method of quantity is used:

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

Here you get more information using a tuple (three items). You get the string as before, plus the factor of the value 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 of the schema translation can be found 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 ). Therefore the units parser in FreeCAD supports lot of SI and Imperial combined units. These units are defined in src/Base/QuantityParser.l file and can be further expanded 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