Pagina 1 di 1

[Risolto] Accesso a Calc già aperto Python XSCRIPTCONTEXT

Inviato: lunedì 23 marzo 2015, 23:11
da giuserpe
Ciao,
sto provando un semplice script in Python per mettere un po' di dati in Calc.

Codice: Seleziona tutto

#!
#coding: utf-8
import sys, os, uno, unohelper
#
def oMacroTest():
    desktop = XSCRIPTCONTEXT.getDesktop()
    oDoc = desktop.loadComponentFromURL('private:factory/scalc','_blank', 0, () )
    oSheet = oDoc.getSheets().getByName('Foglio1')
    oSheet.getCellRangeByName('A1').Value = 2
    oSheet.getCellRangeByName('A2').Value = 2
    oSheet.getCellRangeByName('A3').Formula = '=sum(A1:A2)'
Va tutto bene fino a quando non decido di lavorare su un file di Calc già aperto.
Ho provato a cambiare lo script così:

Codice: Seleziona tutto

#!
#coding: utf-8
import sys, os, uno, unohelper
def oMacroTest1():
    desktop = XSCRIPTCONTEXT.getDesktop()
    oDoc = desktop.getCurrentComponent()
    oSheet = oDoc.getSheets().getByName('Foglio1')
    oSheet.getCellRangeByName('A1').Value = 2
    oSheet.getCellRangeByName('A2').Value = 2
    oSheet.getCellRangeByName('A3').Formula = '=sum(A1:A2)'
ma ottengo questo errore: (<class 'AttributeError'>: getSheets
In cosa sbaglio? Qualcuno sa darmi una dritta?

Re: Accesso a file Calc già aperto via Python XSCRIPTCONTEXT

Inviato: lunedì 23 marzo 2015, 23:47
da vladboscaneanu
Prova a dare un argomento alla tua macro(va bene anche oEvent)

Codice: Seleziona tutto

def oMacroTest(oEvent):

Re: Accesso a file Calc già aperto via Python XSCRIPTCONTEXT

Inviato: martedì 24 marzo 2015, 0:20
da giuserpe
Ok, perdona... ma poi che valore gli do?

Re: Accesso a file Calc già aperto via Python XSCRIPTCONTEXT

Inviato: martedì 24 marzo 2015, 0:33
da vladboscaneanu
Nessuno.Un argomento necessario per gli script in python,quando vengono eseguiti tramite un evento(ad esempio pulsante).
Semplicemente aggiungi oEvent nella macro.Tutto li.

Codice: Seleziona tutto

def oMacroTest1(oEvent):

Re: Accesso a file Calc già aperto via Python XSCRIPTCONTEXT

Inviato: martedì 24 marzo 2015, 9:51
da giuserpe
mmm... A questo punto vale la pena condividere un attimo il mio modo di fare, in maniera che altri possano valutarlo, adottarlo e/o correggerlo.
In pratica io edito gli script di Python al volo avviandoli direttamente da IDE di Basic con Libreoffice, senza necessariamente riavviare tutto, nel modo che provo ad esporre qui.
Intanto premetto che sto sviluppando LeenO (leeno.org) e sto iniziando ad implementare qualche riga in python per la grande versatilità che offre.
Trattandosi di codice che finisce poi pacchettizzato in formato OXT, ho indicato in manifest.xml, con le altre, la seguente riga:

Codice: Seleziona tutto

<manifest:file-entry manifest:media-type="application/vnd.sun.star.framework-script" manifest:full-path="pyLeenO"/> 
in cui pyLeenO è la subdir dell'estensione che ospita tutti i file *.py
In Basic ho questo codice:

Codice: Seleziona tutto

Function LeenO_Path
	If NOT GlobalScope.BasicLibraries.isLibraryLoaded( "Tools" ) Then 
 	 GlobalScope.BasicLibraries.LoadLibrary( "Tools" ) 
	End If
	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)
	LeenO_Path = extensionLocation ' full path
End Function
rem ----------------------------------------------------------------------
Sub Script_py
'xray StarDesktop.getCurrentFrame.getContainerWindow.getToolkit
	rem RIF: http://bit.ly/1b4d3dF
	Dim MasterScriptProviderFactory as Object
	Dim MasterScriptProvider as Object
	Dim Script as Object
	Dim Url as String
'	Dim PythonResult as object
	sName = FileNameoutofPath(LeenO_Path) 'nome file
'Print sName
	sModulo = "FormulaSemplice.py"
	sFunzione = "$oMacroTest1"
	Url = "vnd.sun.star.script:" & sName & "|pyLeenO|" & sModulo & sFunzione &"?language=Python&location=user:uno_packages"
'Print Url
	MasterScriptProviderFactory = createUnoService("com.sun.star.script.provider.MasterScriptProviderFactory")
	MasterScriptProvider = MasterScriptProviderFactory.createScriptProvider("")
	Script = MasterScriptProvider.getScript(Url)
'xray Script
	Script.invoke(Array(),Array(),Array())
'	PythonResult = Script.invoke(Array(),Array(),Array())
End Sub
A questo punto posso editare con Geany, o altro editor avanzato, il codice Python ed avviarlo al volo da IDE di Basic da Script_py.
Preciso che LeenO_Path mi serve ad individuare di volta in volta in nome della dir di installazione dell'estensione che varia per via del timestamp che gli metto in fase di pacchettizzazione.
Ovviamente non è tutta farina del mio sacco... mi sono solo limitato ad assemblare del codice preso in giro.
Così facendo però, mi par di capire che oEvent messo in def oMacroTest1(oEvent): non mi può aiutare.
Ho alternative o sono costretto ad avviare lo script Python tramite un evento? Ne sarei in difficoltà.

Re: Accesso a file Calc già aperto via Python XSCRIPTCONTEXT

Inviato: martedì 24 marzo 2015, 10:46
da vladboscaneanu
Executing Macros from Toolbar Buttons

In Basic, you can call any subroutines or functions through toolbar buttons.
Sub WriteHello()
ThisComponent.getText().getEnd().setString("Hello!")
End Sub
In Python, you have to define your Python function with an argument (or variable length arguments) to take an argument passed when the function executed through assigned toolbar button.
def writeHello(*args):
# writeHello(arg): is also ok but if you want to call this function
# by some ways, define your function takes variable arguments.
XSCRIPTCONTEXT.getDocument().getText().getEnd().setString("Hello!")
Transfer from Basic to Python

Re: [Risolto] Accesso a Calc già aperto Python XSCRIPTCONTEX

Inviato: martedì 24 marzo 2015, 12:02
da giuserpe
Ok, ho risolto appiccicando ad un pulsante della toolbar la sub di Basic che richiama lo script Python. Nessun argomento opzionale necessario. Un po' contorto ma è perfetto così.
Avrei potuto metterci l'url diretto allo script Python, ma, come già dicevo, è variabile per via del timestamp che contraddistingue ogni rilascio dell'add-on di LeenO.

vladboscaneanu, ti ringrazio tantissimo.