Mouvement sans configuration

Pour créer un mouvement quelconque qui n’a pas besoin de paramètre externe pour être configuré, il suffit d’éditer le fichier scan.py et d’ajouter une méthode générant les coordonnés à la classe Scan. Cette méthode doit renvoyer un objet de type np.ndarray[tuple] c’est à dire une liste de coordonnés (x, y, z). Si l’un des axes n’est pas utilisé, il suffira de remplacer une composante par un None.

Par exemple, si l’on veut générer un déplacement selon la diagonale, on peut écrire le code de cette manière :

class Scan():
 
	# ...
 
	def diagonale(self) -> np.ndarray[tuple]:
		n = self.conf.zoi.dimensions.X
		
		# On créer la liste qui va être retourné 
		coords = np.zeros(n, dtype=(float, 3))
 
		# On remplie la liste
		for i in range(n):
			coords[i] = (i, i, None)
 
		return coords

Pour pouvoir utiliser cette méthode, il convient de modifier deux choses.

Il faut modifier le type de l’attribue scan_type dans la classe ScanConfig, afin d’ajouter la possibilité d’écrire le nom de notre fonction dans le fichier scan.yaml :

class ScanConfig(BaseModel):
	# ...
	scan_type: Literal["balayage", "spirale", "diagonale"]
	# ...

Il faut aussi modifier le contenue de la méthode __init__(...) de la classe Scan :

class Scan():
 
	def __init__(self, axis: Tuple[KPZ101], config_file="scan.yaml") -> None:
		# ...
		match self.conf.scan_type:
			case "balayage": 
			case "spirale":
			case "diagonale":
				self.coords = self.diagonale()

Cela aura pour effet de générer les coordonnés lors de la création d’un objet de type Scan.

A partir de maintenant, il suffit de mettre scan_type: diagonale dans le fichier de configuration yaml et les nouvelles coordonnées seront disponibles

Mouvement avec configuration

Le mouvement généré par la méthode que l’on a créé précédemment ne peut pas s’adapter à des paramètres d’un fichier de configuration. Il peut être intéressant d’ajouter dans le fichier de configuration des paramètres pour la méthode que l’on vient de créer. Disons par exemple :

diagonale:
	diag_number: 0 

diag_number étant un paramètre pour indiquer quelle diagonale suivre ((0, 0) (X_max, Y_max) ou (X_max, 0) (0, Y_max))

Il faudra ainsi rajouter une classe nommée DiagonaleConfig dans le fichier scan.py :

class DiagonaleConfig(BaseModel):
	# name ---- type - default value
	diag_number: int = 0

et ajouter dans la classe ScanConfig :

class ScanConfig(BaseModel):
	# ...
	diagonale: Optional[DiagonaleConfig] = None

Après ça, il sera possible d’utiliser tous les paramètres du fichier yaml dans la méthode digonale en faisant self.conf.diagonale.diag_number.

Si vous avez été jusque là, que vous avez implémenté votre fonction, et que vous pensez qu’elle peut être utile à d’autres personnes n’hésitez pas à faire une Pull-request de vos changements.