[Resuelto] Trabajar con MARCOS en vez de TABLAS
-
Chumpocomon
- Mensajes: 5
- Registrado: Jue Oct 01, 2009 2:29 pm
[Resuelto] Trabajar con MARCOS en vez de TABLAS
Hola, estoy desarrollando una subrutina libre para generar etiquetas adhesivas.
Cada etiqueta tiene una imagen y un texto personalizados.
Uno de sus uso podría ser el de crear pegatinas con las fotos de tus amigos y el nombre de manera automática.
El uso de MARCOS (mayus para no confundir con macro ;P) en vez de tablas es porque a la hora de realizar etiquetas Write te trae por defecto la configuración de marcos y crear-ajustar una tabla es muy complicado para que quede bien en el formato de etiquetas adhesivas que compras en la tienda.
Busco algo parecido a getTextTables.getByIndex(0) y situación en celda, pero resulta que con marcos no tenemos una matriz de posiciones, no existen celdas, únicamente podemos hacer referencia por el nombre.
¿Sabrían alguna forma de insertar texto/imagen en un marco en concreto?
¿Es posible una vez dentro del marco situar cada uno de los elementos en una posición concreta que no sea centrado, izquierda o derecha?
Le agradezco de antemano su tiempo
Saludos.
Chumpocomon.
Cada etiqueta tiene una imagen y un texto personalizados.
Uno de sus uso podría ser el de crear pegatinas con las fotos de tus amigos y el nombre de manera automática.
El uso de MARCOS (mayus para no confundir con macro ;P) en vez de tablas es porque a la hora de realizar etiquetas Write te trae por defecto la configuración de marcos y crear-ajustar una tabla es muy complicado para que quede bien en el formato de etiquetas adhesivas que compras en la tienda.
Busco algo parecido a getTextTables.getByIndex(0) y situación en celda, pero resulta que con marcos no tenemos una matriz de posiciones, no existen celdas, únicamente podemos hacer referencia por el nombre.
¿Sabrían alguna forma de insertar texto/imagen en un marco en concreto?
¿Es posible una vez dentro del marco situar cada uno de los elementos en una posición concreta que no sea centrado, izquierda o derecha?
Le agradezco de antemano su tiempo
Saludos.
Chumpocomon.
Última edición por Chumpocomon el Lun Oct 05, 2009 11:32 am, editado 1 vez en total.
OOo 3.1
Re: Trabajar con MARCOS en vez de TABLAS
Hola...
Los marcos también son accesibles por índice, como en:
Debes tener un marco de texto como mínimo para que funcione. Si miras las interfaces que soporta (dbg_supportedinterfaces), soporta todas las de manipulación de texto e imágenes, checalo y nos cuentas.
Saludos
Los marcos también son accesibles por índice, como en:
Código: Seleccionar todo
Sub Main
Dim oDoc As Object
Dim oTF As Object
oDoc = ThisComponent
oTF = oDoc.getTextFrames()
MsgBox oTF(0).dbg_properties
MsgBox oTF(0).dbg_methods
MsgBox oTF(0).dbg_supportedinterfaces
End SubSaludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
-
Chumpocomon
- Mensajes: 5
- Registrado: Jue Oct 01, 2009 2:29 pm
Re: Trabajar con MARCOS en vez de TABLAS
Hola, Mauricio, antetodo gracias por tu rápida contestación.
Gracias a tu aporte conseguí acceder a los marcos e insertar texto e imagenes
:
No obstante, me pierdo bastante con la documentación de sun, si me pudieras explicar como manejarme te lo agradecería, pues llevo horas y horas tan solo para conseguir acceder a dos propiedades de la imagen:
- En Ajustes de Imagen\ Predeterminaciones\ continuo (viene por defecto dinámico con lo que la imagen la posiciona como texto)
- En Ajustes de Imagen\ Recortar\ posición de imagen (para situarla, en ese mismo apartado está el de tamaño que se accede con setSize(tamano) tamaño, pero como ya te digo el problema me viene en que no manejarme por la api y para colmo no existe un buscar) ¿No existe un setPosition(x,y)?
Seguro que todo esto es una tontería y nada más que lo veas vas a dar con la clave, pero para mi es un mundo.
Gracias de antemano.
Gracias a tu aporte conseguí acceder a los marcos e insertar texto e imagenes
Código: Seleccionar todo
REM Crea una tabla, y coloca en cada celda las imagenes y texto correspondientes a cada etiqueta
Sub GenerarEtiquetas()
Dim sRutaImagen As String
Dim oDoc As Object
Dim oImagen As Object
Dim tamano As New "com.sun.star.awt.Size"
Dim oTexto As Object
Dim iCount As Integer 'número de marcos
Dim i As Integer 'contador marcos
Dim oCursor As Object
Dim oMarco As Object
Dim oCursorMarco As Object
'Establecemos el tamaño de la imagen 100 = 1 mm
tamano.Width = 600
tamano.Height = 600
'ThisComponent se refiere al documento activo actual
oDoc = ThisComponent
'Creamos un objeto cursor
oCursor = oDoc.Text.createTextCursor()
'Creamos un objeto de tipo marco
oMarco = oDoc.createInstance("com.sun.star.text.TextFrame")
'Almacenamos el número de marcos del documento
iCount = oDoc.getTextFrames().getCount()
'Mostramos número de etiquetas
MsgBox iCount
iCount = 3 'Borrar
For i = 0 to iCount-1
'Marco concreto del documento
oMarco = oDoc.getTextFrames().getByIndex(i)
'Cursor dentro del Marco
oCursorMarco = oMarco.createTextCursor()
'Texto para marco
'Posición cursor
'Formato
oCursorMarco.CharHeight = "4.8" 'font size
oCursorMarco.CharWeight = com.sun.star.awt.FontWeight.BOLD
oCursorMarco.CharFontName = "Arial" 'font name
oCursorMarco.String = Chr(13) + " NOMBRE" + Chr(13) + " V1.0" + Chr(13) + Chr(13)
'Imagen para marco
sRutaImagen = "file:///C:/downloads/55-00-00-00-00-01%NOMBRE.png"
'Si existe la ruta
If Dir(sRutaImagen) <> "" Then
'Si existe construimos la ruta en forma de URL
sRutaImagen = ConvertToURL( sRutaImagen )
'El documento desde donde se llama esta macro
oDoc = ThisComponent
'Creamos una instancia de un objeto grafico
oImagen = oDoc.createInstance( "com.sun.star.text.GraphicObject" )
'Establecemos la ruta de la imagen
oImagen.GraphicURL = sRutaImagen
'Tamaño imagen
oImagen.setSize(tamano)
'Posición
'Referencia al texto
oTexto = oMarco.getText()
'Insertamos la imagen
oTexto.insertTextContent( oCursorMarco, oImagen, False )
'Si no existe la ruta
Else
'Mostramos solo para el primer caso el resto será igual
If columna = 1 Then
MsgBox "Ruta no existe o carga incorrecta", 16
End If
End If
Next
End Sub
- En Ajustes de Imagen\ Predeterminaciones\ continuo (viene por defecto dinámico con lo que la imagen la posiciona como texto)
- En Ajustes de Imagen\ Recortar\ posición de imagen (para situarla, en ese mismo apartado está el de tamaño que se accede con setSize(tamano) tamaño, pero como ya te digo el problema me viene en que no manejarme por la api y para colmo no existe un buscar) ¿No existe un setPosition(x,y)?
Seguro que todo esto es una tontería y nada más que lo veas vas a dar con la clave, pero para mi es un mundo.
Gracias de antemano.
Última edición por Chumpocomon el Lun Oct 05, 2009 11:31 am, editado 1 vez en total.
OOo 3.1
Re: Trabajar con MARCOS en vez de TABLAS
Hola...
Para el ajuste continuo usas:
Para la posición de la imagen usas:
Tu pregunta, de como manejarte en la API de OOo Basic, es una gran pregunta, el secreto esta en saber que "servicios" soporta un determinado objeto,
Ya con esta información, podemos ir directamente a la documentación de estas interfaces (servicios): http://api.openoffice.org/docs/common/r ... le-ix.html
No se que nivel de programación manejes, pero veo que no estas en ceros, en mi libro tengo bastante información para empezar con OOo Basic y su API http://user.services.openoffice.org/es/ ... =50&t=1545
Saludos
Para el ajuste continuo usas:
Código: Seleccionar todo
oImagen.TextWrap = 1Código: Seleccionar todo
'Posición desde la izquierda y desde arriba
oImagen.HoriOrient = 0
oImagen.VertOrient = 0
'Distancia desde la izquierda y desde arriba
oImagen.HoriOrientPosition = 5000
oImagen.VertOrientPosition = 500Código: Seleccionar todo
MsgBox oObjeto.dbg_supportedinterfacesNo se que nivel de programación manejes, pero veo que no estas en ceros, en mi libro tengo bastante información para empezar con OOo Basic y su API http://user.services.openoffice.org/es/ ... =50&t=1545
Saludos
______________________________________________
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
"Todo cuanto no podemos dar nos posee". - André Gide
LibreOffice 6.2 | ArchLinux | Gnome3
No respondo preguntas privadas, por favor, usa el foro
-
Chumpocomon
- Mensajes: 5
- Registrado: Jue Oct 01, 2009 2:29 pm
Re: Trabajar con MARCOS en vez de TABLAS
Qué tal Mauricio!
Le he echado un vistazo a tu manual para programación de macros openoffice y es de lo mejorcito que hay en español. No se si te dedicas a la enseñanza, si no es así deberias hacerlo para contrarestar con los cientos de profesores sin actitud pedagógica.
Gracias de nuevo, por estar ahí.
Saludos.
Por cierto aquí está el código por si a alguien le sirve de ayuda o lo quiere modificar.
La verdad es que está un poco hecho a medida y para un tipo concreto de etiquetas e imagenes. Podría haber puesto más opciones, pero como base para crear pegatinas (etiquetas) con fotos y textos distintos funciona.
Le he echado un vistazo a tu manual para programación de macros openoffice y es de lo mejorcito que hay en español. No se si te dedicas a la enseñanza, si no es así deberias hacerlo para contrarestar con los cientos de profesores sin actitud pedagógica.
Gracias de nuevo, por estar ahí.
Saludos.
Por cierto aquí está el código por si a alguien le sirve de ayuda o lo quiere modificar.
La verdad es que está un poco hecho a medida y para un tipo concreto de etiquetas e imagenes. Podría haber puesto más opciones, pero como base para crear pegatinas (etiquetas) con fotos y textos distintos funciona.
Código: Seleccionar todo
Option Explicit
Const MAX As Integer = 500
Global arrayMacAdress(MAX) As String
Global arrayMacAdress_(MAX) As String
REM Crea una lista de enlaces a imagenes Datamatrix para descargarlas desde Internet
Sub GenerarEnlacesDatamatrix()
Const nombreRutina As String = "Generador de Enlaces Datamatrix"
Const enlace As String = "http://datamatrix.kaywa.com/img.php?s=8&d="
Const nombreModuloDefecto As String = "NOMBRE QUE QUIERE CÓDIFICAR"
Const byteInicialDefecto As String = "55"
Const numEtiquetasDefecto As Integer = 200
Const maxLongSinByteInicial As Integer = 10
Const sRuta As String = "C:\"
Dim mOpciones(1) As New "com.sun.star.beans.PropertyValue"
Dim oDoc As Object
Dim sTextService$
Dim oCurs As Object
Dim nombreModulo As String
Dim byteInicial As String
Dim macAddressIni As String
Dim macAddress As String 'macAddress y más para descargas ":"
Dim macAddress_ As String 'macAddress y más para busqueda directorio "-"
Dim contadorMac As Integer
Dim contadorEtiqueta As Integer
Dim texto As String
Dim numEtiquetas As Integer
'ThisComponent se refiere al documento activo actual
oDoc = ThisComponent
'Creamos un nuevo documento de Write
oDoc = StarDesktop.loadComponentFromURL( "private:factory/swriter", "_blank", 0, mOpciones())
'Verificamos que es un documento de texto
sTextService = "com.sun.star.text.TextDocument"
If NOT oDoc.supportsService(sTextService) Then
'Si no lo es mostramos mensaje y salimos de macro
MsgBox "Esta macro solo trabaja con documentos de texto", 16, nombreRutina
Exit Sub
End If
'Nombre a codificar
nombreModulo = InputBox ("¿Qué nombre quiere codificar?", nombreRutina, nombreModuloDefecto)
'Verificamos que existe texto a codificar
If nombreModulo = "" Then
'Si no existe mostramos mensaje y salimos macro
MsgBox "No se definio ningún nombre para codificar u operación cancelada", 16, nombreRutina
Exit Sub
End If
'Byte inicial a codificar
byteInicial = InputBox ("MAC-ADDRESS: ¿Qué byte inicial quiere para codificar?", nombreRutina, byteInicialDefecto)
'Verificamos que existe texto a codificar
If byteInicial = "" or (Len(byteInicial) <> 2) Then
'Si no existe mostramos mensaje y salimos macro
MsgBox "Byte inicial incorrecto u operación cancelada", 16, nombreRutina
Exit Sub
End If
'Número de etiquetas
numEtiquetas = InputBox ("Etiquetas: ¿Cuántas etiquetas quiere obtener?", nombreRutina, numEtiquetasDefecto)
'Verificamos que etiquetas están dentro de un rango
If ((numEtiquetas < 0) Or (numEtiquetas >= MAX)) Then
'No estamos dentro del marco establecido
MsgBox "El número de etiquetas tiene que estar entre (0,500)", 16, nombreRutina
Exit Sub
End If
'Generamos los enlaces para la imagen de las etiquetas
For contadorEtiqueta = 1 To numEtiquetas
'Mac Address en Hexadecimal
macAddressIni = Format(Hex(contadorEtiqueta))
'Si la longitud no es la adecuada
If Len(macAddressIni) < maxLongSinByteInicial Then
Do
'Añadimos 0s a la izquierda hasta completar longitud
macAddressIni = "0" + macAddressIni
Loop While Len(macAddressIni) <maxLongSinByteInicial
End If
'MsgBox macAddressIni
'Formato: Añadimos ":" cada 2 bytes
For contadorMac = 1 To Len(macAddressIni) Step 2
macAddress = macAddress + ":" + Mid(macAddressIni, contadorMac, 2)
macAddress_= macAddress_ + "-" + Mid(macAddressIni, contadorMac, 2)
Next
'Añadimos bytes inicial a macAddress
macAddress = byteInicial + macAddress
macAddress_ = byteInicial + macAddress_
'MsgBox macAddress
'Para Descarga: Terminamos de formar el enlace y adjuntamos con el resto de enlaces
texto = texto + enlace + macAddress +"%25"+ nombreModulo + Chr(13)
'Para Busqueda en directorio
arrayMacAdress_(contadorEtiqueta-1) = macAddress_ + "%" + nombreModulo
'Para obtener a posteriori los nombes
arrayMacAdress(contadorEtiqueta-1) = macAddress + "%" + nombreModulo
'Borramos Mac Address actual para generar otra
macAddress = ""
macAddress_ = ""
Next
'Cogemos la referencia del cursor
oCurs = oDoc.currentController.getViewCursor()
'Insertamos el texto correspondiente al enlace
oCurs.Text.insertString(oCurs, Texto, False)
'Exportamos documento como txt
mOpciones(0).Name = "URL"
mOpciones(0).Value = ConvertToURL(sRuta)
mOpciones(1).Name = "FilterName"
mOpciones(1).Value = "Text"
oDoc.storeToURL(ConvertToURL(sRuta)+"lista.txt", mOpciones())
'Cerramos documento
'oDoc.close(True)
MsgBox "¡La lista ha sido generada!" 'y almacena en " + sRuta
End Sub
REM Crea una tabla, y coloca en cada celda las imagenes y texto correspondientes a cada etiqueta
Sub GenerarEtiquetas()
Dim sRutaImagen As String
Dim oDoc As Object
Dim oImagen As Object
Dim tamano As New "com.sun.star.awt.Size"
Dim oTexto As Object
Dim iCount As Integer 'número de marcos
Dim i As Integer 'contador marcos
Dim oCursor As Object
Dim oMarco As Object
Dim oCursorMarco As Object
'Establecemos el tamaño de la imagen 100 = 1 mm
tamano.Width = 600
tamano.Height = 600
'ThisComponent se refiere al documento activo actual
oDoc = ThisComponent
'Creamos un objeto cursor
oCursor = oDoc.Text.createTextCursor()
'Creamos un objeto de tipo marco
oMarco = oDoc.createInstance("com.sun.star.text.TextFrame")
'Almacenamos el número de marcos del documento
iCount = oDoc.getTextFrames().getCount()
For i = 0 to iCount-1
'Marco concreto del documento
oMarco = oDoc.getTextFrames().getByIndex(i)
'Cursor dentro del Marco
oCursorMarco = oMarco.createTextCursor()
'Texto para marco
'Posición cursor
'Formato
oCursorMarco.CharHeight = "4.8" 'font size
oCursorMarco.CharWeight = com.sun.star.awt.FontWeight.BOLD
oCursorMarco.CharFontName = "Arial" 'font name
oCursorMarco.String = Chr(13) + " " + Mid(arrayMacAdress(i), 25, 10) + Chr(13) + " " + Mid(arrayMacAdress(i), 35, 5) + Chr(13) + Chr(13) + " " + Mid(arrayMacAdress(i), 1, 17)
'Imagen para marco
sRutaImagen = "file:///C:/downloads/" + arrayMacAdress_(i) + ".png"
'Si existe la ruta
If Dir(sRutaImagen) <> "" Then
'Si existe construimos la ruta en forma de URL
sRutaImagen = ConvertToURL( sRutaImagen )
'El documento desde donde se llama esta macro
oDoc = ThisComponent
'Creamos una instancia de un objeto grafico
oImagen = oDoc.createInstance( "com.sun.star.text.GraphicObject" )
'Establecemos la ruta de la imagen
oImagen.GraphicURL = sRutaImagen
'Tamaño imagen
oImagen.setSize(tamano
'Referencia al texto
oTexto = oMarco.getText()
'Insertamos la imagen
oTexto.insertTextContent( oCursorMarco, oImagen, False )
'Posición imagen
'Continuo
oImagen.TextWrap = 1
'Posición desde la izquierda y desde arriba
oImagen.HoriOrient = 0
oImagen.VertOrient = 0
'Distancia desde la izquierda y desde arriba
oImagen.HoriOrientPosition = 100
oImagen.VertOrientPosition = 100
'Si no existe la ruta
Else
'Mostramos solo para el primer caso el resto será igual
If i = 0 Then
MsgBox "Ruta no existe o carga incorrecta", 16
End If
End If
Next
End Sub
OOo 3.1