Jump to content

Copiare in memoria il codice esadecimale del colore della forma

From The Document Foundation Wiki
This page is a translated version of the page Macros/Impress/004 and the translation is 100% complete.


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