Spacemouse de 3DConnexion sur Ubuntu avec Gimp

Table des matières

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.

6BorG - Spacemouse de 3Dconnexion
SpaceMouse filaire de 3Dconnexion

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.

6BorG - Spacemouse de 3Dconnexion

Informations sur l'article

Catégories & Étiquettes

Gaëtan LEGAY

Gaëtan LEGAY

Passionné d'informatique et du développement Web, je vous invite à découvrir mon univers, Discutons Web.

Partage

Facebook
Twitter
LinkedIn
Telegram
WhatsApp
Email

Commentaires

S’abonner
Notification pour
0 Commentaires
Commentaires en ligne
Afficher tous les commentaires

Articles Similaires