Hors série : Il va y avoir du sport !
Compatible avec linux ?
Oui cette souris spacemouse de 3DConnexion est compatible avec Linux avec la majorité des distributions toutefois, c’est pas sans effort pour la faire fonctionner correctement… car il y a plusieurs solutions pour différents résultats.
Navigation d’élément 3D
Si votre but est de l’utiliser avec blender ou freecad qui prennent en charge nativement le périphérique, ce tutoriel ne vous sera pas d’une grande aide. On trouve sur le site français d’Ubuntu le nécessaire à son installation et sa configuration du pilote libre (version 0,7 dans les dépôts). La version 1 existe sur Github, mais il n’existe aucun PPA et il n’existe pas de .deb avec le GUI. Il existe également un pilote propriétaire mais datant de 2014 ! pas très utile en 2022.
Et n’y l’un n’y l’autre ne sont compatible avec le but recherché c’est à dire Gimp et Inkscape.
On abandonne ? Non ! Pour mettre en place ce qui suit vous devez désactiver ce pilote et au boot.
sudo systemctl stop spacenavd
sudo systemctl disable spacenavd
Vous pourrez le réactiver plus tard pour FreeCAD ou Blender.

Navigation d’élément 2D
Sous Windows ou macOS, il existe un plugin pour Photoshop ! Mais pour rien pour Gimp et Inkscape.
Avant de commercer je mets en garde, cette méthode est uniquement pour Gimp et Inkscape… ça ne marche pas avec Krita (sauf le zoom), Scribus par exemple, ce n’était pas mon but recherché également. Cette méthode nécessite l’ajout de fichiers dans votre OS Ubuntu, bien-sur il suffira de les effacer pour revenir en arrières, car tous les fichiers sont nouvellement créés. Pour la rédaction de cet article, j’utilise la version 22.04 d’Ubuntu LTS.
Pour information, je n’ai rien inventé, mais je me suis basé sur deux posts de forum / Wiki, un du forum 3Dconnexion et l’autre du Wiki Gentoo Linux.
Je ne vais pas forcément entrer dans les détails de mise en place, toutefois,++ je vais le faire en terminal + graphique pour rester simple. Pour les plus aventureux vous pouvez les faire aisément avec nano ou vim.
Mise en place des fichiers
Dans cette méthode il y aura 5 fichiers à mettre en place
- /etc/udev/rules.d/41-spacenavigator.rules
- /etc/systemd/system/spacenav-python-evdev.service
- /usr/local/bin/spacenav-python.py
- /etc/X11/xorg.conf.d/54-spacenav-pyevdev.conf
- /etc/modules-load.d/spacenav.conf
Il n’est pas necessaire de les créer avec la commande touch, les instructions avec gedit seront suffisantes.
Premier fichier
Avant de commencer la mise en place de ce fichier, il vous faudra l’id de votre souris, pour cela on ouvre un terminal et on tape :
lsusb | grep 3Dconnexion
L’ID ressemble a ceci : 046d:c626, si vous en avez deux, c’est que vous avez la version wireless et que votre câble est branché, ce n’est pas très grave, il suffit de prendre la version ou se n’est pas marqué “cabled”.
On continue en créant le fichier, dans un terminal :
sudo gedit /etc/udev/rules.d/41-spacenavigator.rules
Et on colle le texte, en remplaçant les ID vendor et product
#obseved 046d:c626
#KERNEL Line allows non root user to create uinput device. ADD action identifies devices flags as joystick, and creates input/spacenav symlink,
KERNEL=="uinput", MODE="0666"
ACTION=="add", KERNEL=="event[0-9]*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c626", ENV{ID_INPUT_JOYSTICK}="1", SYMLINK+="input/spacenav", RUN+="/usr/bin/systemctl start spacenav-python-evdev.service"
ACTION=="remove", KERNEL=="event[0-9]*", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="c626", RUN+="/usr/bin/systemctl stop spacenav-python-evdev.service"
Attention, il y a bien 4 valeurs a modifier ! Une fois fait on enregistre et on quitte gedit.
Second fichier
Cette partie est simple
sudo gedit /etc/systemd/system/spacenav-python-evdev.service
[Unit]
Description = spacenav python evdev wrapper
[Service]
Type=oneshot
ExecStart = python3 /usr/local/bin/spacenav-python.py
ExecStop = killall spacenav-python.py
[Install]
On sauvegarde et on quitte
Troisième fichier
Encore du copier / coller
sudo gedit /usr/local/bin/spacenav-python.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import evdev
from evdev import InputDevice, categorize, ecodes
import time
import uinput
# creates object 'sn' to store the data
sn = InputDevice('/dev/input/spacenav')
# prints out device info at start
print(sn)
# for event in sn.read_loop():
# print(categorize(event))
# input codes
X = 0
Y = 1 # negative=up
Z = 2
RY = 3
RX = 4
RZ = 5
BTN_L = 256
BTN_R = 257
max = 350
min = -max
fuzz = 5
flat = 5
events = (
uinput.BTN_LEFT,
uinput.BTN_RIGHT,
uinput.ABS_X + (min, max, fuzz, flat),
uinput.ABS_Y + (min, max, fuzz, flat),
uinput.ABS_Z + (min, max, fuzz, flat),
uinput.ABS_RX + (min, max, fuzz, flat),
uinput.ABS_RY + (min, max, fuzz, flat),
uinput.ABS_RZ + (min, max, fuzz, flat),
)
device = uinput.Device(events, name='spacenav-pyevdev')
# loop and filter by event code
for event in sn.read_loop():
if event.type != ecodes.EV_KEY:
# if abs(event.value) > 20:
if event.code == Y:
# print("Y",event.value)
device.emit(uinput.ABS_Y, event.value)
elif event.code == X:
# print("X", event.value)
device.emit(uinput.ABS_X, event.value)
elif event.code == Z:
# print("Z" , event.value)
device.emit(uinput.ABS_Z, event.value)
elif event.code == RY:
# print("RY", event.value)
device.emit(uinput.ABS_RY, event.value)
elif event.code == RX:
# print("RX", event.value)
device.emit(uinput.ABS_RX, event.value)
elif event.code == RZ:
# print("RZ", event.value)
device.emit(uinput.ABS_RZ, event.value)
if event.type == ecodes.EV_KEY:
if event.code == BTN_L:
device.emit(uinput.BTN_LEFT, event.value)
# without the emit ABS_RX 0, for some reason the ABS_RX would min out until new value sent?
device.emit(uinput.ABS_RX, 0)
elif event.code == BTN_R:
device.emit(uinput.BTN_RIGHT, event.value)
device.emit(uinput.ABS_RX, 0)
Sauvegarde et ….
Quatrième fichier
Et cette partie est encore plus facile.
sudo gedit /etc/modules-load.d/spacenav.conf
uinput
Oui c’est juste un mot, on sauvegarde et on quitte, si j’ai perdu personne on va passer au croustillant !
Cinquième fichier
Cette dernière partie est la plus fun, car c’est elle qui donnera les instructions au la souris 3D qui se prendra pour un joystick. Oui vous avez bien lu, tout ce procéder est de donner les instructions a X11 que votre souris 3D est un joystick en plus évolué.
sudo gedit /etc/X11/xorg.conf.d/54-spacenav-pyevdev.conf
Section "InputClass"
Identifier "spacenav-python-uinput"
MatchProduct "spacenav-pyevdev|3Dconnexion|SpaceNavigator|Space Navigator"
Option "AutoRepeat" "1500 1"
Driver "joystick"
# X: move left/right - horizontal scroll
Option "MapAxis1" "mode=relative axis=-5zx deadzone=5000"
# Y: move up/down - vertical scroll
Option "MapAxis2" "mode=relative axis=-5zy deadzone=5000"
# Z: pull up / push down - right / left click
#Option "MapAxis3" "mode=relative keyhigh=251 keylow=252 deadzone=000"
Option "MapAxis3" "mode=relative keyhigh=86 keylow=82 deadzone=5000"
# RY: tilt up/down - move pointer
Option "MapAxis4" "mode=relative axis=+5y deadzone=500"
# RX: tilt left/right (inverted) - move pointer
Option "MapAxis5" "mode=relative axis=-5x deadzone=500"
# RZ: twist left/right - horizontal scroll
Option "MapAxis6" "mode=relative axis=-10zy deadzone=2500"
# Button 2 - right click
#Option "MapButton2" "button=3"
Option "MapButton2" "key=65"
EndSection
Après c’est une question de préférence… a ce stade dans Gimp ou inskape la base marchera en déplaçant l’image en haut, bas, gauche, droit. Le push up et down auront la fonction de zoom. Le clique droit a maintenant + mouvement de la souris pour le déplacement, clique gauche pour la sélection et enfin le haut de la souris 3Dconnexion bougera le curseur !
Pour inverser le mouvement haut, bas, gauche, droite du déplacement de l’image il suffit de mettre +5zx ou +5zy dans MapAxis1 et 2.
Pour appliquer, il suffit de redémarrer votre PC ou simplement le redémarrer le DM
sudo systemctl restart display-manager
Pour aller plus loin
Dans ce dernier fichier vous pouvez augmenter la sensibilité de la souris 3D en mettant par exemple 8000 au lieu de 5000 à la deadzone.
Pour les bouton push up & down et le bouton de droite vous pouvez mettre d’autre touche ou valeur la liste des touches est disponible en tapant ceci :
xmodmap -pk
C’est un peu déroutant a lire comme fichier, mais sur un écran large, on y arrive… Il vous suffira donc de reporter le keycode désiré. Il est donc tout a fait possible d’adapter votre souris 3D pour autre chose ou un autre programme en respectant ses propres touches.
Conclusion
J’espère que ce petit tutoriel hors série vous servira ! Comme chez 6BorG nous sommes amené a manipuler des images ou des créations SVG cette souris est un utilitaire indispensable pour les créateurs.
Hélas ce tutoriel ne marchera que pour X11, Il n’y a encore aucun tutoriel disponible pour Wayland. Je mettrai a jour ce tutoriel si je trouve des informations.