[Resuelto] Trabajar con MARCOS en vez de TABLAS

Desarrollo de Macros y programación en UNO, usar las API, llamar programas externos...
Responder
Chumpocomon
Mensajes: 5
Registrado: Jue Oct 01, 2009 2:29 pm

[Resuelto] Trabajar con MARCOS en vez de TABLAS

Mensaje por Chumpocomon »

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.
Última edición por Chumpocomon el Lun Oct 05, 2009 11:32 am, editado 1 vez en total.
OOo 3.1
Avatar de Usuario
mauricio
Mensajes: 6093
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Trabajar con MARCOS en vez de TABLAS

Mensaje por mauricio »

Hola...

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 Sub
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
______________________________________________
"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

Mensaje por Chumpocomon »

Hola, Mauricio, antetodo gracias por tu rápida contestación.

Gracias a tu aporte conseguí acceder a los marcos e insertar texto e imagenes :D :

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
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.
Última edición por Chumpocomon el Lun Oct 05, 2009 11:31 am, editado 1 vez en total.
OOo 3.1
Avatar de Usuario
mauricio
Mensajes: 6093
Registrado: Sab Nov 22, 2008 5:36 am
Ubicación: CDMX
Contactar:

Re: Trabajar con MARCOS en vez de TABLAS

Mensaje por mauricio »

Hola...

Para el ajuste continuo usas:

Código: Seleccionar todo

oImagen.TextWrap = 1
Para la posición de la imagen usas:

Có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 = 500
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,

Código: Seleccionar todo

MsgBox oObjeto.dbg_supportedinterfaces
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
______________________________________________
"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

Mensaje por Chumpocomon »

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.

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
Responder