Difference between revisions of "ES/Manuales/GuiaAOO/TemasAvanzados/Macros/Python/PythonAOO"

From Apache OpenOffice Wiki
< ES‎ | Manuales‎ | GuiaAOO‎ | TemasAvanzados‎ | Macros‎ | Python
Jump to: navigation, search
(Creando servicios)
(Creando servicios)
Line 21: Line 21:
  
  
En pyUNO tenemos dos formas de acceder a esta interfaz, las dos son equivalentes por lo que puedes usar la que prefieras. En la introducción a Python se mencionó que la mayoría de sus herramientas están disponibles en librerias, estás librerias tienen que importarse '''antes''' de poder usarse, en nuestro caso importaremos la librería '''uno''' que nos da acceso al contexto de ejecución de AOO.
+
En pyUNO tenemos dos formas de acceder a esta interfaz, las dos son equivalentes por lo que puedes usar la que prefieras. En la introducción a Python se mencionó que la mayoría de sus herramientas están disponibles en librerias, estás librerias tienen que importarse '''antes''' de poder usarse, en nuestro caso importaremos la librería '''uno''' que nos da acceso (entre otras cosas) al contexto de ejecución de AOO.
 
<source lang=python>
 
<source lang=python>
 
import uno
 
import uno
Line 30: Line 30:
 
     return  
 
     return  
 
</source>
 
</source>
{{Documentation/Note|'''''Nota''''': Si te gusta investigar, busca el archivo pythonscript.py en la carpeta de instalación de AOO, ahí puedes ver de donde sale XSCRIPTCONTEXT}}
+
{{Documentation/Note| Si te gusta investigar, busca el archivo pythonscript.py en la carpeta de instalación de AOO, ahí puedes ver de donde sale XSCRIPTCONTEXT}}
  
  
Line 40: Line 40:
 
     ctx = uno.getComponentContext()
 
     ctx = uno.getComponentContext()
 
     sm = ctx.getServiceManager()
 
     sm = ctx.getServiceManager()
 +
    return
 +
</source>
 +
 +
 +
Pero... ¿como sabemos que este '''objeto (ComponentContext)''' tiene este '''método getServiceManager()'''? porque lo estamos demostrando, si, también por eso, pero también porque puedes ver su documentación (<idl>com.sun.star.uno.XComponentContext</idl>) en el API de AOO, pero más importante aún, porque podemos hacer que el mismo objeto te diga todo lo que sabe hacer. Para ello haremos uso de una magnifica extensión que te tiene que acompañar el resto de tus días como programador de macros Python, nos referimos a [http://extensions.services.openoffice.org/project/MRI MRI]. Instala (tal vez tengas que reiniciar AOO para poder usarla) y la probamos de la siguiente manera.
 +
<source lang=python>
 +
import uno
 +
 +
def pruebas():
 +
    ctx = uno.getComponentContext()
 +
    # llamamos a la extensión MRI y le pasamos el objeto a inspeccionar
 +
    mri(ctx)
 +
    sm = ctx.getServiceManager()
 +
    return
 +
 +
def mri(target):
 +
    ctx = uno.getComponentContext()
 +
    sm = ctx.getServiceManager()   
 +
    mri = sm.createInstanceWithContext('mytools.Mri', ctx)
 +
    mri.inspect(target)
 
     return  
 
     return  
 
</source>
 
</source>

Revision as of 04:33, 23 April 2013

Conceptos iniciales

Este es el tema más importante para crear macros, de forma sencilla, pero se ven las bases para trabajar con todo AOO, por eso es importante no avanzar en estas notas, sin antes haber comprendido a cabalidad los temas presentes.

UNO (Universal Network Objects), es la especificación que da acceso a todos los objetos de Apache OpenOffice.

El API (Application Programer Interface) de Apache OpenOffice proporciona el acceso a toda la funcionalidad de AOO, independientemente del lenguaje.

La comunicación entre objetos UNO se basa en interfaces de objeto. Las interfaces pueden ser vistos desde el exterior o el interior de un objeto y proporcionan formas de ver o manipular el objeto.

Los servicios son agrupaciones lógicas de interfaces, son la forma en que un mismo objeto pueda ofrecer la funcionalidad de varias interfaces.

Los servicios se pueden implementar en librerías compartidas llamadas componentes UNO, con Python podemos crear componentes nuevos y generalmente el usuario final las recibe como una extensión OXT.

Los modulos pueden agrupar submodulos, servicios, excepciones, constantes, enumeraciones, etc, se utilizan para especificar bloques coherentes en la API, esto permite tener un APi bien estructurada.


Creando servicios

Para crear un servicio, usamos la fabrica de servicios (com.sun.star.lang.XMultiComponentFactory), una interfaz especial para crear nuevos servicios, pero para llegar a ella, tenemos que hacerlo a traves de la interfaz ComponentContext (com.sun.star.uno.XComponentContext), como puedes verlo en la siguiente imagen.

ComponentContext y ServiceManager


En pyUNO tenemos dos formas de acceder a esta interfaz, las dos son equivalentes por lo que puedes usar la que prefieras. En la introducción a Python se mencionó que la mayoría de sus herramientas están disponibles en librerias, estás librerias tienen que importarse antes de poder usarse, en nuestro caso importaremos la librería uno que nos da acceso (entre otras cosas) al contexto de ejecución de AOO.

import uno
 
def pruebas():
    ctx1 = XSCRIPTCONTEXT.getComponentContext()
    ctx2 = uno.getComponentContext()
    return

Template:Documentation/Note


Ahora si, podemos acceder a la fábrica de servicios con el método getServiceManager().

import uno
 
def pruebas():
    ctx = uno.getComponentContext()
    sm = ctx.getServiceManager()
    return


Pero... ¿como sabemos que este objeto (ComponentContext) tiene este método getServiceManager()? porque lo estamos demostrando, si, también por eso, pero también porque puedes ver su documentación (com.sun.star.uno.XComponentContext) en el API de AOO, pero más importante aún, porque podemos hacer que el mismo objeto te diga todo lo que sabe hacer. Para ello haremos uso de una magnifica extensión que te tiene que acompañar el resto de tus días como programador de macros Python, nos referimos a MRI. Instala (tal vez tengas que reiniciar AOO para poder usarla) y la probamos de la siguiente manera.

import uno
 
def pruebas():
    ctx = uno.getComponentContext()
    # llamamos a la extensión MRI y le pasamos el objeto a inspeccionar
    mri(ctx)
    sm = ctx.getServiceManager()
    return 
 
def mri(target):
    ctx = uno.getComponentContext()
    sm = ctx.getServiceManager()    
    mri = sm.createInstanceWithContext('mytools.Mri', ctx)
    mri.inspect(target)
    return
Personal tools