Copiare in memoria il codice esadecimale del colore della forma
TDF LibreOffice Document Liberation Project Blog comunitari Weblate Nextcloud Redmine Ask LibreOffice Donazione
Descrizione
È utile poter copiare in memoria un attributo della forma o dell'oggetto attualmente selezionato. A tal fine, è indicato l'uso di Python, in quanto è semplice trovare e importare delle librerie in grado di copiare una stringa in memoria, cosa che sarebbe non così banale da fare usando le funzioni o le librerie di LibreOffice Basic. (In ogni caso, il libro di Andrew Pitonyak, OOME v3[1] a pagina 267 contiene un esempio di copia in memoria usando LO Basic.)
Nella macro seguente, l'accesso all'oggetto attualmente selezionato viene eseguito usando XSCRIPTCONTEXT.getDocument().CurrentSelection[0]
che indica l'elemento zero della matrice di oggetti selezionati. Una forma come com.sun.star.drawing.RectangleShape avrà l'attributo FillColor[2]. Il colore è rappresentato da un intero lungo, che ha la seguente definizione matematica:[3][4][5]
- Color Value [math]\displaystyle{ =R*2^{16} + G*2^8 + B*2^0 }[/math]
dove [math]\displaystyle{ R,G,B }[/math] sono valori a 8-bit (tra 0-255) che rappresentano rosso, verde e blu. Perciò, dev'essere creata una funzione che usando operazioni modulari ed altre operazioni matematiche estragga il più convenzionale formato RGB standard e quindi il codice esadecimale del colore.
Una volta eseguito l'accesso all'attributo FillColor, lo script fa uso del modulo pyperclip[6] per copiare il valore in memoria. Per installare pyperclip, eseguite
pip3 install --user pyperclip
Potreste anche dover aggiungere il percorso dei pacchetti, nel caso in cui LibreOffice non trovi l'installazione di pyperclip, ad esempio come:
import sys
sys.path.append('~/.local/lib/python3.8/site-packages/')
import pyperclip
Codice
Python
# -*- coding: utf-8 -*-
import uno
from com.sun.star.awt import MessageBoxButtons as MSG_BUTTONS
# Adjust and uncomment the following if the path of your packages does not load:
#import sys
#sys.path.append('~/.local/lib/python3.8/site-packages/')
import pyperclip
def copy_hex_color(*args): # È necessario inserire '*args' nella definizione della funzione
'''Macro di LO macro per ricavare il codice esadecimale del colore dall'attributo FillColor della forma selezionata e copiarlo in memoria.'''
thisComponent = XSCRIPTCONTEXT.getDocument()
try:
sel = thisComponent.CurrentSelection[0] # ricava la forma attualmente selezionata
hex_color = cval2hex(sel.FillColor)
pyperclip.copy(hex_color)
#msgbox( 'Copied "' + str(sel.FillColor) + '" as "' + pyperclip.paste() + '" !' ) # rimuovere il commento in fase di test
except:
msgbox('Exception occured!')
def cval2hex(c):
'''Converte il valore del colore in formato esadecimale.'''
# Estrae il valore RGB a 8-bit (0-255) dall'attributo Color Value
red = ( c - c % 2**16 ) /2**16;
green = ( c % 2**16 - c % 2**8 ) /2**8;
blue = ( c % 2**8 ) /2**0;
h = '#%02x%02x%02x' % (int(red), int(green), int(blue)) # RGB to hex
return h[1:] # rimuove il simbolo cancelletto dalla stringa restituita
def rgb2cval(r,g,b):
'''Restituisce l'attributo Color Value dai componenti RGB a 8-bit (0-255)'''
return (r * 2**16) + (g * 2**8) + (b * 2**0)
def msgbox(message, title='LibreOffice', buttons=MSG_BUTTONS.BUTTONS_OK, type_msg='infobox'):
'''https://wiki.documentfoundation.org/Macros/Python_Guide/Useful_functions#MsgBox'''
'''Create message box
type_msg: infobox, warningbox, errorbox, querybox, messbox
https://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1awt_1_1XMessageBoxFactory.html
'''
toolkit = create_instance('com.sun.star.awt.Toolkit')
parent = toolkit.getDesktopWindow()
mb = toolkit.createMessageBox(parent, type_msg, buttons, title, str(message))
return mb.execute()
def create_instance(name, with_context=False):
'''https://wiki.documentfoundation.org/Macros/Python_Guide/Useful_functions#Create_instances'''
CTX = uno.getComponentContext()
SM = CTX.getServiceManager()
if with_context:
instance = SM.createInstanceWithContext(name, CTX)
else:
instance = SM.createInstance(name)
return instance
# Rende visibile solamente la funzione copy_hex_color nell'albero di navigazione delle macro di LO
g_exportedScripts = (copy_hex_color,)
LO Basic
tbc
Scaricate il file ODP
Note
- ↑ https://www.pitonyak.org/oo.php
- ↑ https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1drawing_1_1FillProperties.html#aba11c9f14e66ff6ff10fa57c907d178d
- ↑ https://help.libreoffice.org/latest/en-US/text/sbasic/shared/00000003.html
- ↑ https://help.libreoffice.org/latest/en-US/text/sbasic/shared/03010305.html
- ↑ https://wiki.documentfoundation.org/Macros/Impress/001#Python
- ↑ https://pypi.org/project/pyperclip