[Risolto] funzione Python in Addons.xcu

Creare una macro - Scrivere uno script - Usare le API
Rispondi
Avatar utente
giuserpe
Messaggi: 127
Iscritto il: mercoledì 23 aprile 2014, 12:53

[Risolto] funzione Python in Addons.xcu

Messaggio da giuserpe »

Ciao a tutti.
Provo ad articolare qui una domanda riguardo l'uso di Python in LibreOffice ed in particolare sull'editazione del menù Addons.xcu.
Cencando un po' in giro ho trovato questo manuale http://bit.ly/1v7KKOT che indica come strutturare il menù.
Nel mio caso, lavorando su LeenO che è un addon, devo rifarmi al secondo esempio, a pagina n.255 (in realtà la 260^), arrivando a questa istruzione:

Codice: Seleziona tutto

vnd.sun.star.script:LeenO-3.10.3.dev.oxt|pyleeno.py$xmlsix2ods?language=Python&location=share:uno_packages
ottenendo, però il risultato nell'immagine allegata.
Per inciso il pyleeno.py, installato tramite OXT, finisce in
/home/giuserpe/.config/libreoffice/4/user/uno_packages/cache/uno_packages/luuu4xe7.tmp_/LeenO-3.10.3.dev-150207005618.oxt/
Ovviamente trattando il mio pyleeno.py come funzione installata in /home/giuserpe/.config/libreoffice/4/user/Scripts/python/ (primo esempio della pag. di cui sopra) funziona.
Qualcuno sa darmi una dritta?
Allegati
pyleeno_error1.png
Ultima modifica di charlie il martedì 24 marzo 2015, 14:14, modificato 2 volte in totale.
Motivazione: Inserito segno di spunta verde
LibreOffice fresh su Windows e Linux
vladboscaneanu
Volontario
Volontario
Messaggi: 378
Iscritto il: martedì 22 ottobre 2013, 1:35

Re: funzione Python in Addons.xcu

Messaggio da vladboscaneanu »

L'errore è KeyError,manca una chiave di un dizionario all'interno del tuo codice.
https://wiki.python.org/moin/KeyError
LibreOffice ultima versione su Windows 10
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: funzione Python in Addons.xcu

Messaggio da unlucky83 »

Ciao, come ben sai troverai pochi in grado di risponderti sugli script in python in questo forum (peccato).
Non sapendo darti una risposta certa, provo ad offrirmi come interlocutore perché alcune volte è sufficiente a trovare gli errori che si commettono.
Ti chiedo, sei sicuro che lo script si trovi nella posizione corretta?
/home/giuserpe/.config/libreoffice/4/user/uno_packages/...
mi sarei aspettato qualcosa del tipo /home/giuserpe/.config/libreoffice/4/share/uno_packages/...
dato che a pag. 263 vedo percorsi con una cartella "share".

Dopotutto hai messo "location=share:uno_packages"
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Avatar utente
giuserpe
Messaggi: 127
Iscritto il: mercoledì 23 aprile 2014, 12:53

Re: funzione Python in Addons.xcu

Messaggio da giuserpe »

Ciao unlucky83, il percorso in cui finiscono i file installati tramite l'OXT è quello. Non c'è interferenza da parte mia.
vladboscaneanu, sì... ho visto. Fatto sta che il percorso è quello. Anzi, ho voluto fare la prova del nove installando il pacchetto OXT con nome "leeno.oxt", ma l'errore resta. naturelmente il keyerror diventa 'leeno.oxt'.
LibreOffice fresh su Windows e Linux
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: funzione Python in Addons.xcu

Messaggio da unlucky83 »

Per scrupolo hai provato anche questa istruzione?

vnd.sun.star.script:LeenO-3.10.3.dev.oxt|pyleeno.py$xmlsix2ods?language=Python&location=user:uno_packages
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Avatar utente
giuserpe
Messaggi: 127
Iscritto il: mercoledì 23 aprile 2014, 12:53

Re: funzione Python in Addons.xcu

Messaggio da giuserpe »

Sì, senza esiti positivi. Credo, però, di dover guardare anche altrove e non sono nel file Addons.xcu.
Cerco di approfondire e vi dico.
LibreOffice fresh su Windows e Linux
Avatar utente
unlucky83
Volontario
Volontario
Messaggi: 2355
Iscritto il: lunedì 7 gennaio 2013, 1:23
Località: Latina

Re: funzione Python in Addons.xcu

Messaggio da unlucky83 »

ok. Un'altra cosa:
vnd.sun.star.script:myExtension.oxt|myScript|myModule.py$myFunction?language=Python&location=share:uno_packages

myExtension.oxt-->LeenO-3.10.3.dev.oxt
myScript-->??
myModule.py-->pyleeno.py
$myFunction-->$xmlsix2ods

Sicuro che myScript vada ignorato?
LibO:Versione: 6.2.8.2
Build ID: 1:6.2.8~rc2-0ubuntu0.16.04.1- 32-bit
-
Se risolvi:
1. Condividi la soluzione qui con noi
2. Metti [Risolto] al titolo del primo messaggio come spiegato qui
Avatar utente
giuserpe
Messaggi: 127
Iscritto il: mercoledì 23 aprile 2014, 12:53

Re: funzione Python in Addons.xcu

Messaggio da giuserpe »

Il myScript indica l'eventuale subdir in cui ho messo pyleeno.py. Nel mio caso non c'è e comunque, a scanso di equivoci, ho provato anche a mettere il pyleeno.py in una subdir indicandola, poi, al posto di myScript. Niente da fare.
Intanto ho letto che tocca editare a priori anche il manifest.xml che si trova in META-INF. così come indicato qui: https://forum.openoffice.org/en/forum/v ... 20&t=69328
Ho già provato, ma niente. forse perche il mio manifest.xml ha troppe righe:

Codice: Seleziona tutto

<?xml version="1.0" encoding="UTF-8"?>
<manifest:manifest>
	<manifest:file-entry manifest:full-path="Addons.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
	<manifest:file-entry manifest:full-path="Paths.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
	<manifest:file-entry manifest:full-path="Accelerators.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
 <manifest:file-entry manifest:full-path="Office/UI/DrawWindowState.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
 <manifest:file-entry manifest:full-path="Office/UI/CalcWindowState.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
 <manifest:file-entry manifest:full-path="Office/UI/ImpressWindowState.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
 <manifest:file-entry manifest:full-path="Office/UI/BasicIDEWindowState.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
 <manifest:file-entry manifest:full-path="Office/UI/WriterWindowState.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
 <manifest:file-entry manifest:full-path="Office/UI/BaseWindowState.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
 <manifest:file-entry manifest:full-path="Office/UI/StartModuleWindowState.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
 <manifest:file-entry manifest:full-path="Office/UI/MathWindowState.xcu" manifest:media-type="application/vnd.sun.star.configuration-data"/>
 <manifest:file-entry manifest:full-path="UltimusFree2/" manifest:media-type="application/vnd.sun.star.basic-library"/>
 <manifest:file-entry manifest:media-type="application/vnd.sun.star.uno-component;type=Python" manifest:full-path="pyleeno.uno.py"/>
</manifest:manifest>
Dove sbaglio?
Forse è il caso di eliminare quelle righe che non hanno a che fare direttamente con Calc
LibreOffice fresh su Windows e Linux
Avatar utente
giuserpe
Messaggi: 127
Iscritto il: mercoledì 23 aprile 2014, 12:53

Re: funzione Python in Addons.xcu

Messaggio da giuserpe »

Avrei trovato anche un altro sistema che per me potrebbe essere più indicato in quanto rinomino il pacchetto oxt ad ogni rilascio con il timestamp, ottenendo, perciò, ogni volta un diverso percorso dell'estensione.
Si tratterebbe di avviare lo script Python tramite Basic:

Codice: Seleziona tutto

Function LeenO_Path
	Dim pip As Object, extensionLocation As String
	Const extensionIdentifier = "org.giuseppe-vizziello.leeno"
	' Const extensionIdentifier = "put the identifier value from the description.xml here"
	pip = GetDefaultContext.getValueByName("/singletons/com.sun.star.deployment.PackageInformationProvider")
	extensionLocation = pip.getPackageLocation(extensionIdentifier)
'	display a human readable address
'	MsgBox(ConvertFromURL(extensionLocation)
	sURL = (ConvertFromURL(extensionLocation))
	LeenO_Path = FileNameoutofPath(sURL)
'	Print sName 
End Function
rem ----------------------------------------------------------------------
Sub Mainpy
	Dim MasterScriptProviderFactory as Object
	Dim MasterScriptProvider as Object
	Dim Script as Object
	Dim Url as String
	Dim PythonResult as String
	If NOT GlobalScope.BasicLibraries.isLibraryLoaded( "Tools" ) Then 
			 GlobalScope.BasicLibraries.LoadLibrary( "Tools" ) 
	End If 
	sName = LeenO_Path
'	Print sName
	Url = "vnd.sun.star.script:" & sName & "|pyleeno.py$xmlsix2ods?language=Python&location=share:uno_packages"
' "vnd.sun.star.script:yokogawa.py$YokoCalcPython?language=Python&location=share"
' vnd.sun.star.script:myModule.py$myFunction?language=Python&location=user
' vnd.sun.star.script:myModule.py$myFunction?language=Python&location=share
' vnd.sun.star.script:myModule.py$myFunction?language=Python&location=document
	
	MasterScriptProviderFactory = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory")
	MasterScriptProvider = MasterScriptProviderFactory.createScriptProvider("")
	
	Script = MasterScriptProvider.getScript(Url)
	PythonResult = Script.invoke(Array(),Array(),Array())
	MsgBox PythonResult
End Sub
Ottengo quanto in allegato.

Per completezza metto qui anche il codice di pyleeno.py

Codice: Seleziona tutto

#!/usr/bin/env python -c
# -*- coding: utf-8 -*-
########################################################################
import os, sys
# cos'e' il namespace:
# http://www.html.it/articoli/il-misterioso-mondo-dei-namespaces-1/
import xml.etree.ElementTree as etree
xmL = 'W:/_dwg/ULTIMUSFREE/elenchi/Bolzano/altri_formati/HBED13.six.xml'# file da convertire
#xmL = '/media/giuserpe/PRIVATO/_dwg/ULTIMUSFREE/elenchi/Bolzano/altri_formati/HBED13.six.xml'
# fixtag serve per risalire al dict che contiene il namespace del file XML-six
def fixtag(ns, tag, nsmap):
    return '{' + nsmap[ns] + '}' + tag
########################################################################
def xmlsix2ods ():
    """
    Modulo per la conversione dei prezzari dal formato XML-six a LeenO
    (c) Giuseppe Vizziello 2015
    """
    nsmap = {}
    listaUM = []
    listaprzDes = []
    listaPRO = []
    for event, elem in etree.iterparse(xmL, events=('end', 'start-ns')):
        if event == 'start-ns':
            ns, url = elem
            nsmap[ns] = url
        if event == 'end':
            if elem.tag == fixtag('', 'prezzario', nsmap):
                prezzarioId = elem.get('prezzarioId')
                przId = elem.get('przId')
                prdStruttura = elem.get('prdStruttura')
                categoriaPrezzario = elem.get('categoriaPrezzario')
                arrotondamento = elem.get('arrotondamento')
                arrotondamentoImporto = elem.get('arrotondamentoImporto')
                arrotondamentoPercentuale = elem.get('arrotondamentoPercentuale')
            elif elem.tag == fixtag('', 'unitaDiMisura', nsmap):
                listaUM.append(elem)
            elif elem.tag == fixtag('', 'przDescrizione', nsmap):# titolo del prezzario
                listaprzDes.append(elem)
            elif elem.tag == fixtag('', 'prodotto', nsmap):
                listaPRO.append(elem)
    #lista delle unita' di misura
    listaUMis = dict()
    #unitaDiMisura:
    for elem in listaUM:
        listaUMis[elem.get('unitaDiMisuraId')] = elem.getchildren()[1].get('breve')# in italiano
    ########################################################################
    #Formazione della lista dei prezzi
    #prodotto:
    listaPrz =[]
    prezzo =[]
    for elem in listaPRO:
        desc = elem.getchildren()[1].get('estesa')
        if desc == None:
            desc = elem.getchildren()[1].get('breve')
        um = dict(elem.items()).get('unitaDiMisuraId')
        prezzo = (elem.get('prdId'), desc)
        if um != None:
            prezzo = (elem.get('prdId'), desc, listaUMis[um])
        if len(elem.getchildren()) == 3:
            valore = dict(elem.getchildren()[2].items())['valore']
            prezzo = (elem.get('prdId'), desc, listaUMis[um], valore)
        listaPrz.append(prezzo)
    przDes_breve = dict(listaprzDes[1].items())['breve']
    for elem in  listaPrz:
        print(elem[1] + '\n')
    print ('mio')

g_exportedScripts = xmlsix2ods,
########################################################################
#import pdb; pdb.set_trace() #debugger
Script python che da shell non fa una piega.
Allegati
Screenshot 2015-02-10 16.42.13.png
Screenshot 2015-02-10 16.42.13.png (8.03 KiB) Visto 3874 volte
LibreOffice fresh su Windows e Linux
Avatar utente
giuserpe
Messaggi: 127
Iscritto il: mercoledì 23 aprile 2014, 12:53

Re: funzione Python in Addons.xcu

Messaggio da giuserpe »

Come spesso capita, pingavo dalla parte sbagliata. Tocca editare il file manifest.xml come indicato qui: viewtopic.php?f=26&t=6725

Grazie unlucky83. Ovviamente le tue indicazioni erano corrette.
LibreOffice fresh su Windows e Linux
Rispondi