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.


    Other languages:

    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