Quantity/it: Difference between revisions

From FreeCAD Documentation
(Updating to match new version of source page)
(Updating to match new version of source page)
Line 1: Line 1:
<languages/>
<languages/>
<div class="mw-translate-fuzzy">
Quantity è la combinazione di un numero in virgola mobile e di una unità di misura.
Quantity è la combinazione di un numero in virgola mobile e di una unità di misura.
</div>


== Aspetti generali ==
== Aspetti generali ==


<div class="mw-translate-fuzzy">
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.
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 [http://en.wikipedia.org/wiki/Mars_Climate_Orbiter#Cause_of_failure 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/min 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à.
Un famoso disastro, causato da un disguido sulle unità di misura, è il [http://en.wikipedia.org/wiki/Mars_Climate_Orbiter#Cause_of_failure 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/min 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à.
</div>


<div class="mw-translate-fuzzy">
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.
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.
</div>


=== Unità supportate ===
=== Unità supportate ===


<div class="mw-translate-fuzzy">
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'.
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'.
</div>


* Length - Lunghezza
* Length - Lunghezza
Line 31: Line 39:




<div class="mw-translate-fuzzy">
Le specifiche dettagliate si trovano nel codice:
Le specifiche dettagliate si trovano nel codice:
* Quantity lexer: http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Base/QuantityParser.l
* 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
* Quantity definitions: http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Base/Quantity.cpp#l167
</div>


== Rappresentazione interna ==
== Rappresentazione interna ==
Line 42: Line 52:




<div class="mw-translate-fuzzy">
Un modo semplice per esprimere una Unità è quello di utilizzare un gruppo di 7 interi, il numero delle unità di base, che definisce di quale unità si tratta.
Un modo semplice per esprimere una Unità è quello di utilizzare un gruppo di 7 interi, il numero delle unità di base, che definisce di quale unità si tratta.
Le firme delle 7 unità di base sono:
Le firme delle 7 unità di base sono:
Line 51: Line 62:
* QUANTITÀ DI SOSTANZA: [0,0,0,0,0,1,0]
* QUANTITÀ DI SOSTANZA: [0,0,0,0,0,1,0]
* INTENSITÀ LUMINOSA: [0,0,0,0,0,0,1]
* INTENSITÀ LUMINOSA: [0,0,0,0,0,0,1]
</div>


<div class="mw-translate-fuzzy">
Partendo da queste 7 unità, siamo poi in grado di esprimere tutte le unità derivate definite nella [http://physics.nist.gov/cuu/pdf/sp811.pdf Guida per l'utilizzo del Sistema Internazionale di Unità (SI)] e di crearne di nuove, secondo le esigenze, come ad esempio:
Partendo da queste 7 unità, siamo poi in grado di esprimere tutte le unità derivate definite nella [http://physics.nist.gov/cuu/pdf/sp811.pdf 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]
* MASS DENSITY: [-3,1,0,0,0,0,0]
* AREA: [0,2,0,0,0,0,0]
* AREA: [0,2,0,0,0,0,0]
</div>


<div class="mw-translate-fuzzy">
Dato che l'angolo è fisicamente adimensionale, ma in un sistema CAD non è meno importante, si è aggiunta una unità virtuale in più per Angle. Questo crea un vettore di 8 dati nella firma delle unità di FreeCAD.
Dato che l'angolo è fisicamente adimensionale, ma in un sistema CAD non è meno importante, si è aggiunta una unità virtuale in più per Angle. Questo crea un vettore di 8 dati nella firma delle unità di FreeCAD.
</div>


<div class="mw-translate-fuzzy">
== Il convertitore delle unità ==
== Il convertitore delle unità ==
Sovente è necessario convertire le unità da un sistema a un altro. Per esempio, quando 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à.
Sovente è necessario convertire le unità da un sistema a un altro. Per esempio, quando 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à.
</div>


La sua desrizione si trova nella pagina: [[Std_UnitsCalculator/it|Std_UnitsCalculator]]
La sua desrizione si trova nella pagina: [[Std_UnitsCalculator/it|Std_UnitsCalculator]]


<div class="mw-translate-fuzzy">
== InputField ==
== InputField ==
Inputfield è un oggetto QLineEdit derivato da un widget Qt e serve per gestire tutti i tipi di interazioni dell'utente con le quantità e con i parametri. Offre le seguenti proprietà:
Inputfield è un oggetto QLineEdit derivato da un widget Qt e serve per gestire tutti i tipi di interazioni dell'utente con le quantità e con i parametri. Offre le seguenti proprietà:
Line 73: Line 92:
* selezione con il tasto centrale più il movimento del mouse (tbd)
* selezione con il tasto centrale più il movimento del mouse (tbd)
* integrazione python per l'utilizzo nella console python (tbd)
* integrazione python per l'utilizzo nella console python (tbd)
</div>


Lo strumento UnitsCalculator usa già InputField.
Lo strumento UnitsCalculator usa già InputField.


<div class="mw-translate-fuzzy">
Documentazione di riferimento: [[InputField/it|InputField]]
Documentazione di riferimento: [[InputField/it|InputField]]
</div>


<div class="mw-translate-fuzzy">
Codice:
Codice:
* 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.h
* http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Gui/InputField.cpp
* http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Gui/InputField.cpp
</div>


== Script Python ==
== Script Python ==
Come quasi tutto in FreeCAD, anche i sistemi Unit e Quantity sono totalmente accessibili tramite Python.
Come quasi tutto in FreeCAD, anche i sistemi Unit e Quantity sono totalmente accessibili tramite Python.


<div class="mw-translate-fuzzy">
=== Unit ===
=== Unit ===
La classe Unit rappresenta la firma digitale di qualsiasi unità fisica. Come descritto nella sezione di base, per rappresentare questa firma digitale viene usato un vettore di 8 numeri. La classe Unit permette di gestire tutte queste informazioni e di usarle per i calcoli.
La classe Unit rappresenta la firma digitale di qualsiasi unità fisica. Come descritto nella sezione di base, per rappresentare questa firma digitale viene usato un vettore di 8 numeri. La classe Unit permette di gestire tutte queste informazioni e di usarle per i calcoli.
</div>


<syntaxhighlight>
<syntaxhighlight>
Line 92: Line 118:
from Units import Unit
from Units import Unit


# creating a Unit with certain signature
# creating a unit with certain signature
Unit(0,1) # Mass (kg)
Unit(0,1) # Mass (kg)
Unit(1) # Length (mm)
Unit(1) # Length (mm)
Unit(-1,1,-2) # Pressure (kg/mm*s^2)
Unit(-1,1,-2) # Pressure (kg/mm*s^2)


# using predefined constats
# using predefined constants
Unit(FreeCAD.Units.Length)
Unit(FreeCAD.Units.Length)
Unit(FreeCAD.Units.Mass)
Unit(FreeCAD.Units.Mass)
Unit(FreeCAD.Units.Pressure)
Unit(FreeCAD.Units.Pressure)


# parsing unit out of an string
# parsing unit out of a string
Unit('kg/(m*s^2)') # Pressure
Unit('kg/(m*s^2)') # Pressure
Unit('Pa') # the same as combined Unit Pascale
Unit('Pa') # the same as combined unit Pascale
Unit('J') # Joul (Work,Energy) mm^2*kg/(s^2)
Unit('J') # Joul (work,energy) mm^2*kg/(s^2)


# you can use units from all supported unit-systems
# you can use units from all supported systems of units
Unit('psi') # Imperial pressure
Unit('psi') # Imperial pressure
Unit('lb') # Mass
Unit('lb') # Mass
Line 122: Line 148:


</syntaxhighlight>
</syntaxhighlight>
<div class="mw-translate-fuzzy">
Unit è utilizzata principalmente per descrivere un parametro in un determinato tipo di unità. In FreeCAD si può quindi importare una particolare proprietà Type abbinata a una Unit per controllare e garantire che sia utilizzata l'unità corretta.
Unit è utilizzata principalmente per descrivere un parametro in un determinato tipo di unità. In FreeCAD si può quindi importare una particolare proprietà Type abbinata a una Unit per controllare e garantire che sia utilizzata l'unità corretta.
Una Unit più un valore in virgola mobile sono definiti una Quantity.
Una Unit più un valore in virgola mobile sono definiti una Quantity.
</div>


=== Quantity ===
=== Quantity ===
Line 131: Line 159:
from Units import Unit,Quantity
from Units import Unit,Quantity


# to create a quantity you need a value (float) and a Unit
# 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(0,1)) # Mass 1.0 kg
Quantity(1.0,Unit(1)) # Length 1.0 mm
Quantity(1.0,Unit(1)) # Length 1.0 mm
Line 142: Line 170:
Quantity(1.0,-1,1,-2) # Pressure 1.0 kg/mm*s^2
Quantity(1.0,-1,1,-2) # Pressure 1.0 kg/mm*s^2


# parsing Quantitis out of a string
# parsing quantities out of a string
Quantity('1.0 kg/(m*s^2)') # Pressure
Quantity('1.0 kg/(m*s^2)') # Pressure
Quantity('1.0 Pa') # the same as combined Unit Pascale
Quantity('1.0 Pa') # the same as combined Unit Pascale
Quantity('1.0 J') # Joul (Work,Energy) mm^2*kg/(s^2)
Quantity('1.0 J') # Joul (Work,Energy) mm^2*kg/(s^2)


# You can using a point or comma as float delimiter
# You can use a point or comma as float delimiter
Quantity('1,0 m')
Quantity('1,0 m')
Quantity('1.0 m')
Quantity('1.0 m')


# you can use units from all supported unit-systems
# you can use units from all supported systems of units
Quantity('1.0 psi') # Imperial pressure
Quantity('1.0 psi') # Imperial pressure
Quantity('1.0 lb') # Mass
Quantity('1.0 lb') # Mass
Line 170: Line 198:


# accessing the components
# accessing the components
Quantity('1 m').Value # get the number (allways internal system (mm/kg/s)
Quantity('1 m').Value # get the number (allways internal system (mm/kg/s))
Quantity('1 m').Unit # get the unit
Quantity('1 m').Unit # get the unit
Quantity('1 m') == Quantity( Quantity('1 m').Value , Quantity('1 m').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)
# translating the value into other units than the internal system (mm/kg/s)
Quantity('1 km/h').getValueAs('m/s') # translate value
Quantity('1 km/h').getValueAs('m/s') # translate value
Quantity('1 m').getValueAs(2.45,1) # translation value and unit signature
Quantity('1 m').getValueAs(2.45,1) # translation value and unit signature
Line 182: Line 210:
</syntaxhighlight>
</syntaxhighlight>


<div class="mw-translate-fuzzy">
=== I valori nell'interfaccia utente ===
=== I valori nell'interfaccia utente ===
Normalmente negli script si può utilizzare Quantity per ogni tipo di calcolo e di verifica, ma può capitare che si debba attendere un po' per ottenere l'uscita dei risultati. Si può utilizzare getValueAs() per forzare una certa unità, ma di solito si definisce il proprio sistema di unità nelle preferenze. Il sistema di unità converte tutta la rappresentazione nel sistema impostato. Al momento sono implementati questi 3 sistemi di unità:
Normalmente negli script si può utilizzare Quantity per ogni tipo di calcolo e di verifica, ma può capitare che si debba attendere un po' per ottenere l'uscita dei risultati. Si può utilizzare getValueAs() per forzare una certa unità, ma di solito si definisce il proprio sistema di unità nelle preferenze. Il sistema di unità converte tutta la rappresentazione nel sistema impostato. Al momento sono implementati questi 3 sistemi di unità:
Line 188: Line 217:
* 3: US customary (in/lb)
* 3: US customary (in/lb)
In futuro potranno essere facilmente implementati altri sistemi ...
In futuro potranno essere facilmente implementati altri sistemi ...
</div>


<div class="mw-translate-fuzzy">
Attualmente, ci sono due modi di utilizzare la classe Quantity per realizzare la conversione del sistema:
Attualmente, ci sono due modi di utilizzare la classe Quantity per realizzare la conversione del sistema:
</div>


<syntaxhighlight>
<syntaxhighlight>
Line 200: Line 232:


</syntaxhighlight>
</syntaxhighlight>
<div class="mw-translate-fuzzy">
Questo metodo va bene quando serve solo una stringa. A volte però, si ha bisogno di un controllo maggiore, ad esempio quando si vuole avere una finestra di dialogo con un pulsante su e giù. In questo caso servono ulteriori informazioni sull'uscita della conversione, allora viene usato il metodo getUserPrefered() di Quantity:
Questo metodo va bene quando serve solo una stringa. A volte però, si ha bisogno di un controllo maggiore, ad esempio quando si vuole avere una finestra di dialogo con un pulsante su e giù. In questo caso servono ulteriori informazioni sull'uscita della conversione, allora viene usato il metodo getUserPrefered() di Quantity:
</div>


<syntaxhighlight>
<syntaxhighlight>


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


</syntaxhighlight>
</syntaxhighlight>
<div class="mw-translate-fuzzy">
Qui si ottengono due informazioni in più sotto forma di una tupla di dimensione 3. Si ottiene, come prima, la stringa, inoltre il fattore numero viene tradotto e la stringa cruda con solo l'unità scelta dal sistema di conversione. Con queste informazioni è possibile implementare una interazione con l'utente molto più ricca.
Qui si ottengono due informazioni in più sotto forma di una tupla di dimensione 3. Si ottiene, come prima, la stringa, inoltre il fattore numero viene tradotto e la stringa cruda con solo l'unità scelta dal sistema di conversione. Con queste informazioni è possibile implementare una interazione con l'utente molto più ricca.
</div>


<div class="mw-translate-fuzzy">
Il codice per la definizione del sistema di conversione è visibile in:
Il codice per la definizione del sistema di conversione è visibile in:
* 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/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/UnitsSchemaMKS.cpp
* http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Base/UnitsSchemaImperial1.cpp
* http://sourceforge.net/p/free-cad/code/ci/master/tree/src/Base/UnitsSchemaImperial1.cpp
</div>


== Appendice ==
== Appendice ==


<div class="mw-translate-fuzzy">
=== Unità supportate dal Parser ===
=== 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 potranno essere incrementate.
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 potranno essere incrementate.
</div>





Revision as of 21:06, 23 August 2018

Other languages:

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

Aspetti generali

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/min 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 ...


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 gruppo 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 ELETTRICA: [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 in un sistema CAD non è meno importante, si è aggiunta 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 a un altro. Per esempio, quando 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

Inputfield è un oggetto QLineEdit derivato da un widget Qt e serve per gestire tutti i tipi di interazioni dell'utente con le quantità e con i parametri. Offre le seguenti proprietà:

  • analisi dei valori e delle unità arbitrarie inserite
  • verifica della corrispondenza dell'unità (se fornita) e restituzione di un riscontro
  • speciale menu contestuale per le operazioni sulle Quantità e sui Valori
  • gestione della cronologia (salva gli ultimi valori usati)
  • salvataggio dei valori usati frequentemente nella scorciatoia del menu contestuale
  • selezione dei valori con la rotellina del mouse e con i tasti freccia (tbd)
  • selezione con il tasto centrale più il movimento del mouse (tbd)
  • integrazione python per l'utilizzo nella console python (tbd)

Lo strumento UnitsCalculator usa già InputField.

Documentazione di riferimento: InputField

Script Python

Come quasi tutto in FreeCAD, anche i sistemi Unit e Quantity sono totalmente accessibili tramite Python.

Unit

La classe Unit rappresenta la firma digitale di qualsiasi unità fisica. Come descritto nella sezione di base, per rappresentare questa firma digitale viene usato un vettore di 8 numeri. La classe Unit permette di gestire tutte queste informazioni e di usarle per i calcoli.

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

Unit è utilizzata principalmente per descrivere un parametro in un determinato tipo di unità. In FreeCAD si può quindi importare una particolare proprietà Type abbinata a una Unit per controllare e garantire che sia utilizzata l'unità corretta. Una Unit più un valore in virgola mobile sono definiti una 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

I valori nell'interfaccia utente

Normalmente negli script si può utilizzare Quantity per ogni tipo di calcolo e di verifica, ma può capitare che si debba attendere un po' per ottenere l'uscita dei risultati. Si può utilizzare getValueAs() per forzare una certa unità, ma di solito si definisce il proprio sistema di unità nelle preferenze. Il sistema di unità converte tutta la rappresentazione nel sistema impostato. Al momento sono implementati questi 3 sistemi di unità:

  • 1: Internal (mm/kg/s)
  • 2: MKS (m/kg/s)
  • 3: US customary (in/lb)

In futuro potranno essere facilmente implementati altri sistemi ...

Attualmente, ci sono due modi di utilizzare la classe Quantity per realizzare la conversione del sistema:

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

Questo metodo va bene quando serve solo una stringa. A volte però, si ha bisogno di un controllo maggiore, ad esempio quando si vuole avere una finestra di dialogo con un pulsante su e giù. In questo caso servono ulteriori informazioni sull'uscita della conversione, allora viene usato il metodo getUserPrefered() di Quantity:

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

Qui si ottengono due informazioni in più sotto forma di una tupla di dimensione 3. Si ottiene, come prima, la stringa, inoltre il fattore numero viene tradotto e la stringa cruda con solo l'unità scelta dal sistema di conversione. Con queste informazioni è possibile implementare una interazione con l'utente molto più ricca.

Appendice

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 potranno essere incrementate.


"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