# FreeCAD 1.1.1 - Expressions et modèles paramétriques

Ce tutoriel explique comment construire un modèle réellement paramétrique dans FreeCAD 1.1.1.

L'objectif est d'obtenir un fichier dans lequel les dimensions importantes sont regroupées dans une feuille de paramètres. Modifier une seule valeur, par exemple le diamètre intérieur d'un tube à essai, provoque automatiquement la mise à jour du modèle 3D.

L'exemple utilisé est un bouchon destiné à un tube à essai, mais la méthode est applicable à pratiquement n'importe quelle pièce.

---

# 1. Principe général

Un modèle paramétrique peut être organisé ainsi :

```text
Spreadsheet
    ↓
Paramètres
    ↓
Expressions
    ↓
Contraintes des esquisses
    ↓
Pad / Pocket / Revolution / etc.
    ↓
Modèle 3D

```

Au lieu d'écrire directement :

```text
15.6 mm

```

dans une contrainte, on écrit par exemple :

```text
<<Parametres>>.diametre_bouchon

```

La valeur réelle est alors stockée dans une feuille de calcul.

---

# 2. Créer la feuille de paramètres

Créer un nouveau document FreeCAD.

Puis sélectionner l'atelier :

```text
Spreadsheet

```

Créer une nouvelle feuille de calcul.

Renommer son **Label** en :

```text
Parametres

```

Le nom visible dans l'arborescence doit donc être :

```text
Parametres

```

---

# 3. Créer les premiers paramètres

Créer le tableau suivant :

<table id="bkmrk-cellule-nom-valeur-a"><thead><tr><th>Cellule</th><th>Nom</th><th align="right">Valeur</th></tr></thead><tbody><tr><td>A1</td><td>Paramètre</td><td align="right">Valeur</td></tr><tr><td>A2</td><td>Diamètre intérieur tube</td><td align="right">`16 mm`</td></tr><tr><td>A3</td><td>Jeu radial</td><td align="right">`0.20 mm`</td></tr><tr><td>A4</td><td>Longueur insertion</td><td align="right">`12 mm`</td></tr><tr><td>A5</td><td>Épaisseur paroi</td><td align="right">`1.2 mm`</td></tr><tr><td>A6</td><td>Hauteur chambre</td><td align="right">`10 mm`</td></tr><tr><td>A7</td><td>Largeur chambre</td><td align="right">`10 mm`</td></tr><tr><td>A8</td><td>Diamètre bouchon</td><td align="right">formule</td></tr><tr><td>A9</td><td>Diamètre intérieur bouchon</td><td align="right">formule</td></tr></tbody></table>

Dans `B2` :

```text
16 mm

```

Dans `B3` :

```text
0.20 mm

```

Dans `B4` :

```text
12 mm

```

Dans `B5` :

```text
1.2 mm

```

Dans `B6` :

```text
10 mm

```

Dans `B7` :

```text
10 mm

```

---

# 4. Créer des alias

Les alias donnent un nom lisible aux cellules.

Au lieu d'utiliser :

```text
Spreadsheet.B2

```

on pourra utiliser :

```text
<<Parametres>>.diametre_tube

```

Pour créer un alias :

1. sélectionner la cellule ;
2. utiliser **Spreadsheet → Set alias** ;
3. ou utiliser le raccourci :

```text
Ctrl + Shift + A

```

Créer les alias suivants :

<table id="bkmrk-cellule-alias-b2-dia"><thead><tr><th>Cellule</th><th>Alias</th></tr></thead><tbody><tr><td>B2</td><td>`diametre_tube`</td></tr><tr><td>B3</td><td>`jeu_radial`</td></tr><tr><td>B4</td><td>`longueur_insertion`</td></tr><tr><td>B5</td><td>`epaisseur_paroi`</td></tr><tr><td>B6</td><td>`hauteur_chambre`</td></tr><tr><td>B7</td><td>`largeur_chambre`</td></tr></tbody></table>

Les alias ne doivent pas contenir d'espaces.

Préférer :

```text
diametre_tube

```

à :

```text
diamètre tube

```

Éviter également les alias très courts tels que :

```text
A
W
m
s

```

car certains noms peuvent entrer en conflit avec les unités reconnues par FreeCAD.

---

# 5. Faire des calculs dans le Spreadsheet

Une formule dans une cellule de Spreadsheet commence par :

```text
=

```

Dans `B8`, calculons le diamètre du bouchon.

On veut un jeu de `0.20 mm` de chaque côté du bouchon :

```text
=diametre_tube - 2 * jeu_radial

```

Avec :

```text
diametre_tube = 16 mm
jeu_radial = 0.20 mm

```

on obtient :

```text
15.6 mm

```

Attribuer ensuite à `B8` l'alias :

```text
diametre_bouchon

```

---

Dans `B9`, calculons le diamètre intérieur du bouchon :

```text
=diametre_bouchon - 2 * epaisseur_paroi

```

Attribuer l'alias :

```text
diametre_interieur

```

Le Spreadsheet devient donc approximativement :

```text
A                              B
-----------------------------------------------------
Diamètre intérieur tube        16 mm
Jeu radial                     0.20 mm
Longueur insertion             12 mm
Épaisseur paroi                1.2 mm
Hauteur chambre                10 mm
Largeur chambre                10 mm
Diamètre bouchon               15.6 mm
Diamètre intérieur bouchon     13.2 mm

```

---

# 6. Expressions dans FreeCAD

Il faut distinguer deux cas.

## Dans un Spreadsheet

Une formule commence par :

```text
=

```

Exemple :

```text
=diametre_tube - 2 * jeu_radial

```

## Dans une propriété FreeCAD

Par exemple la longueur d'un Pad ou une contrainte Sketcher.

Cliquer sur le bouton `f(x)` ou appuyer sur :

```text
=

```

FreeCAD ouvre alors l'éditeur d'expression.

Dans cet éditeur, saisir directement :

```text
<<Parametres>>.diametre_bouchon

```

Il ne faut pas ajouter un deuxième `=` dans l'éditeur.

---

# 7. Créer une première pièce paramétrique

Passer dans :

```text
Part Design

```

Créer :

```text
Body

```

puis :

```text
Sketch

```

sur le plan XY.

Dessiner un cercle centré sur l'origine.

Ajouter une contrainte de diamètre.

Au lieu de saisir :

```text
15.6 mm

```

appuyer sur :

```text
=

```

Dans l'éditeur d'expression saisir :

```text
<<Parametres>>.diametre_bouchon

```

Valider.

Le diamètre du cercle dépend maintenant du Spreadsheet.

---

# 8. Extrusion paramétrique

Fermer l'esquisse.

Créer un :

```text
Pad

```

Pour sa longueur, ouvrir l'éditeur d'expression avec `=`.

Saisir :

```text
<<Parametres>>.longueur_insertion

```

Le Pad mesure maintenant automatiquement :

```text
12 mm

```

si le Spreadsheet contient :

```text
longueur_insertion = 12 mm

```

---

# 9. Tester le fonctionnement

Retourner dans :

```text
Parametres

```

Modifier :

```text
diametre_tube

```

de :

```text
16 mm

```

vers :

```text
18 mm

```

Le calcul devient automatiquement :

```text
diametre_bouchon
=
18 mm - 2 × 0.20 mm
=
17.6 mm

```

Le Sketch puis le Pad doivent automatiquement changer de diamètre.

C'est le principe fondamental d'un modèle paramétrique.

---

# 10. Utiliser directement des calculs dans une propriété

On n'est pas obligé de créer une cellule pour chaque résultat.

On peut écrire directement dans une propriété :

```text
<<Parametres>>.diametre_tube - 2 * <<Parametres>>.jeu_radial

```

Cependant, pour un modèle complexe, il est généralement plus lisible de mettre les calculs importants dans le Spreadsheet.

Par exemple :

```text
diametre_bouchon
diametre_interieur
diametre_chambre
hauteur_totale
epaisseur_plancher

```

Le modèle devient ainsi beaucoup plus facile à comprendre.

---

# 11. Opérations mathématiques

Les opérateurs classiques sont disponibles :

```text
+
-
*
/
^

```

Exemples :

```text
=diametre_tube + 1 mm

```

```text
=diametre_tube - 2 * jeu_radial

```

```text
=diametre_tube / 2

```

```text
=diametre_tube ^ 2

```

Les parenthèses permettent de contrôler l'ordre des opérations :

```text
=(diametre_tube - 2 * jeu_radial) / 2

```

---

# 12. Fonctions utiles

FreeCAD dispose également de fonctions mathématiques.

Quelques fonctions courantes :

```text
abs()
sqrt()
sin()
cos()
tan()
min()
max()
round()
floor()
ceil()

```

Exemples :

```text
=sqrt(25 mm^2)

```

```text
=max(diametre_tube - 0.4 mm; 10 mm)

```

Selon le contexte et les paramètres régionaux, le séparateur d'arguments peut apparaître différemment dans l'interface. L'autocomplétion de l'éditeur d'expression permet de vérifier la syntaxe acceptée.

---

# 13. Expressions conditionnelles

FreeCAD 1.1 permet également des expressions conditionnelles.

Syntaxe :

```text
condition ? valeur_si_vrai : valeur_si_faux

```

Exemple :

```text
diametre_tube > 20 mm ? 2 mm : 1.2 mm

```

Cela signifie :

```text
si diametre_tube > 20 mm
    épaisseur = 2 mm
sinon
    épaisseur = 1.2 mm

```

On peut par exemple calculer automatiquement l'épaisseur du bouchon :

```text
=diametre_tube >= 20 mm ? 1.6 mm : 1.2 mm

```

---

# 14. Référencer une propriété d'un objet

Les expressions ne sont pas limitées aux Spreadsheets.

On peut référencer une propriété d'un objet.

Par exemple :

```text
Pad.Length

```

ou :

```text
Box.Length

```

Avec un Label :

```text
<<MonPad>>.Length

```

Pour la position d'un objet :

```text
<<MonObjet>>.Placement.Base.x

```

```text
<<MonObjet>>.Placement.Base.z

```

---

# 15. Nommer les contraintes d'une esquisse

Les contraintes peuvent elles aussi avoir un nom.

Supposons une esquisse appelée :

```text
SketchBouchon

```

et une contrainte nommée :

```text
DiametreExterieur

```

Depuis une autre propriété, elle peut être référencée avec :

```text
<<SketchBouchon>>.Constraints.DiametreExterieur

```

Dans la même esquisse :

```text
Constraints.DiametreExterieur

```

C'est beaucoup plus lisible qu'une référence par numéro telle que :

```text
Constraints[7]

```

---

# 16. Exemple complet pour le bouchon de tube à essai

Pour un bouchon paramétrique destiné à l'élevage de fourmis, une feuille de paramètres pourrait ressembler à ceci :

<table id="bkmrk-param%C3%A8tre-valeur-%2F-f"><thead><tr><th>Paramètre</th><th>Valeur / formule</th><th>Alias</th></tr></thead><tbody><tr><td>Diamètre intérieur tube</td><td>`16 mm`</td><td>`diametre_tube`</td></tr><tr><td>Jeu radial</td><td>`0.20 mm`</td><td>`jeu_radial`</td></tr><tr><td>Diamètre bouchon</td><td>`=diametre_tube - 2 * jeu_radial`</td><td>`diametre_bouchon`</td></tr><tr><td>Longueur insertion</td><td>`12 mm`</td><td>`longueur_insertion`</td></tr><tr><td>Épaisseur paroi</td><td>`1.2 mm`</td><td>`epaisseur_paroi`</td></tr><tr><td>Diamètre intérieur</td><td>`=diametre_bouchon - 2 * epaisseur_paroi`</td><td>`diametre_interieur`</td></tr><tr><td>Hauteur chambre</td><td>`10 mm`</td><td>`hauteur_chambre`</td></tr><tr><td>Largeur chambre</td><td>`10 mm`</td><td>`largeur_chambre`</td></tr><tr><td>Épaisseur plancher</td><td>`1.2 mm`</td><td>`epaisseur_plancher`</td></tr><tr><td>Épaisseur volet</td><td>`0.8 mm`</td><td>`epaisseur_volet`</td></tr><tr><td>Jeu volet</td><td>`0.25 mm`</td><td>`jeu_volet`</td></tr><tr><td>Largeur volet</td><td>`=largeur_chambre + 2 mm`</td><td>`largeur_volet`</td></tr><tr><td>Diamètre collerette</td><td>`=diametre_tube + 3 mm`</td><td>`diametre_collerette`</td></tr></tbody></table>

Ainsi, pour adapter tout le bouchon à un autre tube, il suffit principalement de modifier :

```text
diametre_tube

```

Par exemple :

```text
14 mm
16 mm
18 mm
20 mm

```

Toutes les dimensions dépendantes sont recalculées.

---

# 17. Organiser les paramètres

Une bonne feuille de paramètres peut être organisée en plusieurs sections.

```text
PARAMÈTRES TUBE

Diamètre tube
Jeu radial


BOUCHON

Diamètre bouchon
Longueur insertion
Épaisseur paroi


CHAMBRE DE NOURRISSAGE

Largeur chambre
Hauteur chambre
Épaisseur plancher


VOLET

Largeur volet
Épaisseur volet
Jeu volet


COLLERETTE

Diamètre collerette
Hauteur collerette

```

Une convention pratique consiste à réserver :

```text
Colonne A = description
Colonne B = valeur
Colonne C = commentaire

```

et à placer les alias sur les cellules de la colonne B.

---

# 18. Valeurs d'entrée et valeurs calculées

Il est utile de distinguer deux types de paramètres.

## Valeurs saisies par l'utilisateur

Par exemple :

```text
diametre_tube = 16 mm
jeu_radial = 0.20 mm
longueur_insertion = 12 mm
epaisseur_paroi = 1.2 mm

```

## Valeurs calculées

Par exemple :

```text
diametre_bouchon
diametre_interieur
diametre_collerette
largeur_volet

```

Cette distinction évite de modifier accidentellement une valeur qui devrait être calculée.

---

# 19. Les unités sont importantes

Écrire de préférence :

```text
16 mm

```

et non :

```text
16

```

De même :

```text
0.2 mm

```

est préférable à :

```text
0.2

```

FreeCAD effectue une analyse dimensionnelle des expressions.

Par exemple :

```text
10 mm + 2 mm

```

est cohérent.

En revanche une expression mélangeant incorrectement une longueur et un nombre sans dimension peut provoquer une erreur.

---

# 20. Éviter les dépendances circulaires

Il faut éviter une chaîne de dépendances comme :

```text
Spreadsheet
    ↓
Pad
    ↓
Spreadsheet

```

Par exemple :

```text
Spreadsheet.diametre
    ↓
Pad

```

puis vouloir récupérer :

```text
Pad.Shape.Volume

```

dans le même Spreadsheet qui pilote déjà le Pad peut créer une dépendance circulaire.

Pour les modèles complexes, une architecture plus propre est :

```text
Spreadsheet Parametres
        ↓
      Modèle
        ↓
Spreadsheet Resultats

```

`Parametres` pilote la géométrie.

`Resultats` sert éventuellement à afficher des volumes, surfaces ou autres résultats calculés.

---

# 21. Bonnes pratiques pour un modèle robuste

## Centraliser les dimensions importantes

Éviter de disperser des valeurs numériques comme :

```text
1.2 mm
0.25 mm
15.6 mm

```

dans des dizaines de fonctions.

Créer plutôt :

```text
epaisseur_paroi
jeu_volet
diametre_bouchon

```

## Utiliser des alias descriptifs

Préférer :

```text
diametre_bouchon

```

à :

```text
d1

```

## Conserver les unités

Préférer :

```text
0.25 mm

```

à :

```text
0.25

```

## Utiliser les contraintes géométriques

Dans Sketcher, utiliser autant que possible :

```text
Horizontal
Vertical
Coincident
Concentric
Equal
Symmetric

```

puis ne paramétrer que les dimensions réellement nécessaires.

## Éviter de contraindre inutilement

Une esquisse doit être complètement définie, mais pas surcontrainte.

## Préférer les plans de référence

Lorsque c'est possible, créer les esquisses sur :

```text
XY_Plane
XZ_Plane
YZ_Plane

```

ou sur des Datum Planes plutôt que de dépendre systématiquement d'une face générée par une opération précédente.

Cela rend généralement le modèle plus résistant aux changements importants de géométrie.

---

# 22. Déboguer une expression

Si une expression devient rouge ou affiche une erreur, vérifier dans cet ordre :

### Nom du Spreadsheet

Exemple :

```text
<<Parametres>>

```

### Alias

Vérifier :

```text
diametre_bouchon

```

et non :

```text
diametre bouchon

```

### Unités

Vérifier par exemple :

```text
0.2 mm

```

au lieu de :

```text
0.2

```

si l'expression attend une longueur.

### Dépendance circulaire

Vérifier qu'un objet ne dépend pas indirectement de lui-même.

### Résultat de l'expression

L'éditeur d'expression affiche normalement le résultat calculé avant validation.

Par exemple :

```text
<<Parametres>>.diametre_tube - 2 * <<Parametres>>.jeu_radial

```

doit produire quelque chose comme :

```text
15.60 mm

```

avant même de cliquer sur OK.

---

# 23. Expressions utiles — antisèche

## Référence à un paramètre

```text
<<Parametres>>.diametre_tube

```

## Soustraction

```text
<<Parametres>>.diametre_tube - 0.4 mm

```

## Utilisation de deux paramètres

```text
<<Parametres>>.diametre_tube - 2 * <<Parametres>>.jeu_radial

```

## Division par deux

```text
<<Parametres>>.diametre_bouchon / 2

```

## Épaisseur de chaque côté

```text
(<<Parametres>>.diametre_exterieur - <<Parametres>>.diametre_interieur) / 2

```

## Condition

```text
<<Parametres>>.diametre_tube >= 20 mm ? 1.6 mm : 1.2 mm

```

## Propriété d'un Pad

```text
Pad.Length

```

## Contrainte nommée

```text
<<SketchBouchon>>.Constraints.DiametreExterieur

```

## Position Z

```text
<<MonObjet>>.Placement.Base.z

```

---

# 24. Architecture recommandée

Pour une pièce un peu complexe comme le bouchon-sas :

```text
Document
│
├── Parametres
│
├── Body_Bouchon
│   ├── Sketch_Profil
│   ├── Pad_Base
│   ├── Sketch_Chambre
│   ├── Pocket_Chambre
│   ├── Sketch_Passage
│   └── Pocket_Passage
│
├── Body_Volet
│   ├── Sketch_Volet
│   └── Pad_Volet
│
└── Body_Trappe
    ├── Sketch_Trappe
    └── Pad_Trappe

```

Le Spreadsheet `Parametres` devient la source commune de toutes les dimensions.

Par exemple :

```text
Body_Bouchon
    ← epaisseur_paroi
    ← diametre_bouchon
    ← longueur_insertion

Body_Volet
    ← largeur_volet
    ← epaisseur_volet
    ← jeu_volet

Body_Trappe
    ← largeur_chambre
    ← epaisseur_paroi

```

---

# 25. Résultat

Une fois cette méthode mise en place, adapter une pièce ne demande plus de modifier chaque esquisse.

Il suffit par exemple de passer :

```text
diametre_tube = 16 mm

```

à :

```text
diametre_tube = 18 mm

```

FreeCAD recalcule ensuite :

```text
diametre_bouchon
diametre_interieur
diametre_collerette
largeur_volet

```

puis met à jour les esquisses et les opérations Part Design.

C'est cette séparation entre **paramètres**, **formules** et **géométrie** qui permet de construire des fichiers FreeCAD véritablement paramétriques et réutilisables.