Quantity/it

Quantity
TRADUZIONE PROVVISORIA

Quantity è la combinazione di un numero in virgola mobile e di una unità di misura.

In un sistema CAD o CAE ​​è molto importante mantenere la traccia dell'unità di misura di un valore. Quando si mescolano le unità o si calcolano i risultati in diverse unità di misura possono sorgere un sacco di problemi. Un famoso disastro, causato da un disguido sulle unità di misura, è il crash of the Mars Climate Orbiter. Anche all'interno di uno stesso Sistema di misura le unità possono essere disponibili in diversi formati, secondo il settore di utilizzo. Ad esempio, la velocità in km/h per le automobili, in m/s in robotica o in mm/minuto per la fresatura. Un sistema CAD deve conservare una traccia affidabile delle unità. Inoltre deve utilizzarle per eseguire i calcoli e deve verificare che per i parametri speciali sia adottata la giusta unità.

Per questo motivo è stata creata la sezione Quantity di FreeCAD. Essa include tutto il codice e gli oggetti che servono per trattare le unità, i calcoli delle unità, i dati inseriti dall'utente, la conversione tra i Sistemi e per fornire un corretto output delle unità e dei valori. In futuro, in FreeCAD, nessun parametro dovrebbe essere solo più un numero.

Unità supportate
Il parser dei dati in ingresso di FreeCAD supporta una serie di unità e di Sistemi di unità. Per indicare micro si deve utilizzare la lettera greca µ, ma, in sostituzione, viene anche accettata la 'u'.


 * Length - Lunghezza
 * "nm"
 * "µm"
 * "mm"
 * "cm"
 * "dm"
 * "m"
 * "km"
 * "in"
 * "ft"
 * "thou"
 * "mil"
 * "yd"
 * "mi"

Da fare: tutto il resto ...

Le specifiche dettagliate si trovano nel codice:
 * Quantity lexer: http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Base/QuantityParser.l
 * Quantity definitions: http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Base/Quantity.cpp#l167

Rappresentazione interna
Tutte le unità fisiche possono essere espresse come combinazione delle sette Unità SI di base:



Un modo semplice per esprimere una Unità è quello di utilizzare un array di 7 interi, il numero delle unità di base, che definisce di quale unità si tratta. Le firme delle 7 unità di base sono:
 * LUNGHEZZA: [1,0,0,0,0,0,0]
 * MASSA: [0,1,0,0,0,0,0]
 * TEMPO: [0,0,1,0,0,0,0]
 * CORRENTE ELECTTRICA: [0,0,0,1,0,0,0]
 * TEMPERATURA TERMODINAMICA: [0,0,0,0,1,0,0]
 * QUANTITÀ DI SOSTANZA: [0,0,0,0,0,1,0]
 * INTENSITÀ LUMINOSA: [0,0,0,0,0,0,1]

Partendo da queste 7 unità, siamo poi in grado di esprimere tutte le unità derivate definite nella Guida per l'utilizzo del Sistema Internazionale di Unità (SI) e di crearne di nuove, secondo le esigenze, come ad esempio:
 * MASS DENSITY: [-3,1,0,0,0,0,0]
 * AREA: [0,2,0,0,0,0,0]

Dato che l'angolo è fisicamente adimensionale, ma non è meno importante in un sistema CAD, si aggiunge una unità virtuale in più per Angle. Questo crea un vettore di 8 dati nella firma delle unità di FreeCAD.

Il convertitore delle unità
Sovente è necessario convertire le unità da un sistema all'altro. Per esempio, i parametri sono contenuti in vecchie tabelle e espressi in determinate unità. In questi casi FreeCAD offre uno strumento di conversione denominato Units-Calculator che aiuta a tradurre le unità.

La sua desrizione si trova nella pagina: Std_UnitsCalculator

InputField
The InputField is a QLineEdit derived Qt widget to handle all kind of user interaction with Quantities and parameters. It features 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
 * dialing values with mouse wheel and arrow keys (tbd)
 * dialing with middle mouse button and mouse move (tbd)
 * python integration for usage in python only dialogs (tbd)

The UnitsCalculator uses the InputField already.

Main docu: InputField

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

Script Python
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

Unità supportate dal Parser
Anche se tutte le unità fisiche possono essere descritte con le sette unità SI, la maggior parte delle unità utilizzate nelle aree tecniche sono delle combinazioni di unità comuni (come Pa = N/m^2 Pascal ). Pertanto il parser delle unità di FreeCAD supporta molte combinazioni del SI e del sistema Imperiale. Queste unità sono definite nel file src/Base/QuantityParser.l e in futuro possono essere incrementate.

"nm"     yylval = Quantity(1.0e-6    ,Unit(1));      return UNIT; // nanometro "ym"     yylval = Quantity(1.0e-3    ,Unit(1));      return UNIT; // micrometro "mm"     yylval = Quantity(1.0       ,Unit(1));      return UNIT; // millimetro "cm"     yylval = Quantity(10.0      ,Unit(1));      return UNIT; // centimetro "dm"     yylval = Quantity(100.0     ,Unit(1));      return UNIT; // decimetro "m"      yylval = Quantity(1.0e3     ,Unit(1));      return UNIT; // metro "km"     yylval = Quantity(1.0e6     ,Unit(1));      return UNIT; // kilometro "l"      yylval = Quantity(1000000.0 ,Unit(3));      return UNIT; // Litro      dm^3

"yg"     yylval = Quantity(1.0e-9    ,Unit(0,1));    return UNIT; // milligrammo "mg"     yylval = Quantity(1.0e-6    ,Unit(0,1));    return UNIT; // milligrammo "g"      yylval = Quantity(1.0e-3    ,Unit(0,1));    return UNIT; // grammo "kg"     yylval = Quantity(1.0       ,Unit(0,1));    return UNIT; // kilogrammo "t"      yylval = Quantity(1000.0    ,Unit(0,1));    return UNIT; // ton

"s"      yylval = Quantity(1.0       ,Unit(0,0,1));  return UNIT; // secondo                          (internal standard time) "min"    yylval = Quantity(60.0      ,Unit(0,0,1));  return UNIT; // minuto "h"      yylval = Quantity(3600.0    ,Unit(0,0,1));  return UNIT; // ora

"A"      yylval = Quantity(1.0       ,Unit(0,0,0,1));    return UNIT; // Ampere          (internal standard electric current) "mA"     yylval = Quantity(0.001     ,Unit(0,0,0,1));    return UNIT; // milli Ampere "kA"     yylval = Quantity(1000.0    ,Unit(0,0,0,1));    return UNIT; // kilo Ampere "MA"     yylval = Quantity(1.0e6     ,Unit(0,0,0,1));    return UNIT; // Mega Ampere

"K"      yylval = Quantity(1.0       ,Unit(0,0,0,0,1));  return UNIT; // Kelvin (internal standard thermodynamic temperature) "mK"     yylval = Quantity(0.001     ,Unit(0,0,0,0,1));  return UNIT; // Kelvin "yK"     yylval = Quantity(0.000001  ,Unit(0,0,0,0,1));  return UNIT; // Kelvin

"mol"    yylval = Quantity(1.0       ,Unit(0,0,0,0,0,1));    return UNIT; // Mole     (internal standard amount of substance)

"cd"     yylval = Quantity(1.0       ,Unit(0,0,0,0,0,0,1));  return UNIT; // Candela   (internal standard luminous intensity)

"deg"    yylval = Quantity(1.0           ,Unit(0,0,0,0,0,0,0,1));    return UNIT; // degree         (internal standard angle) "rad"    yylval = Quantity(180/M_PI      ,Unit(0,0,0,0,0,0,0,1));    return UNIT; // radian "gon"    yylval = Quantity(360.0/400.0   ,Unit(0,0,0,0,0,0,0,1));    return UNIT; // gon

"in"     yylval = Quantity(25.4      ,Unit(1));      return UNIT; // inch "\""     yylval = Quantity(25.4      ,Unit(1));      return UNIT; // inch "fo"      yylval = Quantity(304.8     ,Unit(1));      return UNIT; // foot "'"       yylval = Quantity(304.8     ,Unit(1));      return UNIT; // foot "th"      yylval = Quantity(0.0254    ,Unit(1));      return UNIT; // thou "yr"      yylval = Quantity(914.4     ,Unit(1));      return UNIT; // yard

"lb"     yylval = Quantity(0.45359237     ,Unit(0,1));   return UNIT; // pound "oz"     yylval = Quantity(0.45359237     ,Unit(0,1));   return UNIT; // ounce "st"     yylval = Quantity(6.35029318     ,Unit(0,1));   return UNIT; // Stone "cwt"    yylval = Quantity(50.80234544    ,Unit(0,1));   return UNIT; // hundredweights