Kalla opp Basic-makroar frå Python

Du kan kalla opp LibreOffice Basic-makroar frå Python-skript. Du kan såleis oppnå spesielle funksjonar som for eksempel

Skriptnettverket LibreOffice Application Programming Interface (API) har st√łtte for √• k√łyra blanda skript mellom Python og Basic, eller andre programmeringsspr√•k for den saks skuld. S√•leis kan argument sendast mellom spr√•ka dersom dei er s√•kalla primitive datatypar som begge spr√•ka forst√•r og at dei vert konverterte korrekt.

tip

Det vert tilr√•dd at du har kjennskap til standardmodulane i Python og LibreOffice API-funksjonar f√łr du lagar oppkall fr√• Python til Basic, JavaScript eller andre spr√•k.


warning

N√•r du k√łyrer Python-skript fr√• eit IDE (Integrated Development Environment = Integrert utviklingsmilj√ł) kan den innebygde Basic-motoren i LibreOffice mangla. D√• m√• du unng√• oppkall fr√• Python til LibreOffice Basic. Python-milj√łet og Universal Networks Objekter (UNO) er fult tilgjengelege. Du finn meir om dette i Oppsetjing av Integrert IDE til Python.


Hent LibreOffice Basic-skript

LibreOffice Basic-makroar kan vera personlege, delte eller innebygde i dokumenta. For √• k√łyra dei, m√• Python-k√łyretid vera oppf√łrt med grunnleggjande makroplasseringar. Implementering av grensesnittet com.sun.star.script.provider.XScriptProvider tillet henting av k√łyrbare skript:


		 import uno
		 from com.sun.star.script.provider import Xscript
		     
		 def getBasicScript(macro='Main', module='Module1', library='Standard',
		         isEmbedded=False) -> XScript:
		     '''Hent Basic-skript-objekt f√łr bruk.'''
		     ctx = uno.getComponentContext()
		     smgr = ctx.ServiceManager
		     if isEmbedded:
		         desktop = smgr.createInstanceWithContext('com.sun.star.frame.Desktop', ctx)
		         scriptPro = desktop.CurrentComponent.getScriptProvider()
		         location = "document"
		     else:
		         mspf = smgr.createInstanceWithContext(
		             "com.sun.star.script.provider.MasterScriptProviderFactory", ctx)
		         scriptPro = mspf.createScriptProvider("")
		         location = "application"
		     scriptName = "vnd.sun.star.script:"+library+"."+module+"."+macro+ \
		                  "?language=Basic&location="+location
		     xScript = scriptPro.getScript(scriptName)
		     return xScript
		 

K√łyrer LibreOffice Basic-skript

LibreOffice Software Development Kit (SDK) sin dokumentasjon for grensesnittet com.sun.star.script.provider.XScriptforklarar reglane for oppkall av mellomspråkelege oppkall. Funksjonsoppkallet krev tre tabellar:

Python-syntaks

results = script.invoke((prompt,buttons,title), (), ())

script.invoke((message,), tuple, ())

script.invoke((args), (), results)

Eksempel på personlege eller delte skript

Eksempla i Input/Output to Screen forklarar i detalj oppkall frå Python til Basic. Monitoring Document Events viser bruk av *args Python-formspråk for å skriva ut varierande mengde parametrar til dialogvindauget med logkonsollen for Access2Base.

tip

P√• utviklingsstadiet kan du avbryta Python-skriptk√łyringa ved hjelp av Xray extension for √• sj√• p√• eigenskapar og metodar for UNO-objekt. Utvidinga APSO-feils√łkingsprogrammet tillet objektinspeksjon ved hjelp av anten Xray- eller MR-utvidingar.



	  def xray(myObject):
	  	  script = getBasicScript(library="XrayTool", module="_Main", macro="Xray")
	  	  script.invoke((myObject,), (), ())
	  

Eksempel på innebygde skript i dokument

Den forenkla Python-syntaksen *args kan brukast i samband med LibreOffice Basic-rutinar som godtar ei varierande meng argument. Under Print og SUM kallar Python-funksjonane dei tilsvarande Basic-funksjonane Print og SUM med den nemnde funksjonen getBasicScript. Unntakshandsaminga er ikkje detaljert.


	  # -*- coding: utf-8 -*-
	  from __future__ import unicode_literals
	      
	  def Print(*args):
	      """Skriv ut dei valde strengane eller numeriske uttrykka i eit dialogvindauge."""
	      xScript = getBasicScript("Print", "Scripting", embedded=True)
	      xScript.invoke((args), (), ())
	      
	  def SUM(*args):
	      """SUMmerer det gjevne taluttrykket."""
	      xScript = getBasicScript("SUM", "Scripting", embedded=True)
	      res = xScript.invoke((args), (), ())
	      return res[0]
	      
	  # def getBasicScript()  # see above
	      
	  def playWithArgs():
	      Print("Fun with *args ", -9.81, 297864.681974, 8762E-137)
	      Print(SUM(45, -9.81, 297864.681974))
	      Print(SUM(45, -9.81, 297864.681974, 8762E+137))
	      
	  g_exportedScripts = (playWithArgs,)
	  

Dei dokumentbaserte LibreOffice Basic-rutinane Print og SUM godtar ei varierande mengd argument. Attributta Private og Public har ingen effekt. Kontroll av argumenttypen er sl√łyfa for √• gjere oppstillinga tydlegare.


	  Option Compatible ' "Standard.Scripting" module
	  Option Explicit
	      
	  Private Sub Print(ParamArray args() As Variant, Optional sep As String = " ")
	      ''' Skriv ut artikkellista over variable tal '''
	      ' alle  CStr() som kan konverterast er gyldige
	      Dim str As String, i As Integer
	      If UBound(args) >= 0 Then
	          For i = 0 To UBound(args)
	              str = str + Cstr(args(i))+ sep 
	          Next i
	      End If
	      Print str
	  End Sub ' Standard.Scripting.Print()
	      
	  Public Function SUM(ParamArray args() As Variant) As Variant
	      ''' SUMmerer ei variabel liste med tal '''
	      Dim ndx As Integer
	      If UBound(args) >= 0 Then
	          For ndx = 0 To UBound(args)
	              SUM = SUM + args(ndx)
	          Next ndx
	      End If
	  End Function ' Standard.Scripting.SUM()
	  

St√łtt oss!