Avertissement
Ne serait-ce pas plus simple d’utiliser un logiciel approprié en électricité ou une simple animation vidéo, au lieu de jouer avec des macros Calc ? Il s’agit d’un tableur, pas d’un logiciel à tout faire.
Solution
L’avertissement étant fait, voici une solution de mon cru. J’ai laissé l’utilisation de la couleur pour montrer comment on aurait pu arriver au même résultat mais sans image et uniquement avec des couleurs.
L’algorithme de la macro est somme toute assez simple.
- J’ai créé 2 images: une ampoule allumée, une autre éteinte.
- Je les ai respectivement nommées « lamp_on » et « lamp_off ».
- Etant donné qu’on ne travaille qu’avec des images dans le conteneur drawPages, j’itère sur le conteneur jusqu’à trouver les index correspondant à mes images.
- Je récupère l’objet image basé sur ces index.
- J’alterne ensuite leur visibilité en fonction de l’appui sur le bouton.
NOTE sur la propriété Visibily: J’ignore si la visibilité est une fonctionnalité qu’on peut exploiter par le biais de l’interface graphique de LibreOffice. Lors du développement, il m’est arrivé que je n’arrivais plus à afficher l’image que j’avais masquée. J’ai donc dû la réafficher manuellement par le biais du code. Dans tous les cas, d’après l’inspecteur XRay, la propriété Visible existe bel et bien, pourquoi ne pas l’exploiter donc.
NOTE sur la fonction RGB: On dirait que la fonction RGB comporte un bogue. Malgré le fait que le premier argument devrait être le rouge, c’est en réalité le bleu qui est spécifié. S’agit-il d’un bug d’endianness? OpenOffice ayant été développé par Sun fonctionnait sur des processeurs SPARC (big endian), le fait d’exécuter LibreOffice sur un processeur Intel (little endian) pourrait expliquer le problème.
Code
public sub SetLight()
dim cell
cell = ThisComponent.Sheets(0).getCellRangeByName("I3")
' WTF red should have been the first argument.
' Seems like a bug with endianness
if cell.CellBackColor = RGB(255,0,0) then
cell.CellBackColor = RGB(0,255,0)
else
cell.CellBackColor = RGB(255,0,0)
endif
' Get draw page from sheet 1 (counting from 0)
' Each image are shared across pages, so having index 1
' or 0 doesn't change anything in the result.
drawPage = ThisComponent.DrawPages.getByIndex(0)
' Images are typeof com.sun.star.drawing.GraphicObjectShape
' These can be explicitelly created with
' CreateUnoService("com.sun.star.drawing.GraphicObjectShape")
dim lampOnImage
dim lampOffImage
dim i
for i = 0 to drawPage.getCount() - 1
pageItem = drawPage.getByIndex(i)
if pageItem.Name = "lamp_on" then
lampOnImage = pageItem
endif
if pageItem.Name = "lamp_off" then
lampOffImage = pageItem
endif
next i
' Invert lamp image visibility
if lampOnImage.Visible = false then
lampOffImage.Visible = false
lampOnImage.Visible = true
else
lampOffImage.Visible = true
lampOnImage.Visible = false
endif
' Enforce position
lampOnImage.Position = cell.Position
lampOffImage.Position = cell.Position
end sub
Fichier
Le fichier ODS contenant la macro
N’oubliez pas de marquer cette question comme résolu si elle résout totalement votre problème et de voter avec la flèche vers le haut (^) si cette réponse vous a aidé.