[oowriter] Letzte Grafik oder Liste der Grafiken

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

calli
**
Beiträge: 22
Registriert: Do, 31.08.2006 14:53

[oowriter] Letzte Grafik oder Liste der Grafiken

Beitrag von calli »

Hallo,

ich komme vom Latex und bin es gewohnt mich nicht wirklich um die Einbindung von Grafiken zu kümmern. Nun muss ich aber writer nehmen um etwas längeres zu schreiben und will mir die Arbeit so bequem wie möglich machen. Dazu muss ich also in die Makros reinschnuppern, möglichst ohne mit der Maus dauernd in Menüs suchen zu müssen.

Als Übungsobjekt versuche ich mich an einem Makro das ein Bild einfügt, die Bildunterschrift ändert und Formatiert. Das sieht nach einigem gehacke und code-klau so aus:

Code: Alles auswählen

Function GetAFileName(Filternames()) As String
  Dim oFileDialog as Object
  Dim iAccept as Integer
  Dim sPath as String
  Dim InitPath as String
  Dim RefControlName as String
  Dim oUcb as object
  'Dim ListAny(0)

  GlobalScope.BasicLibraries.LoadLibrary("Tools")
  'Note: The following services must be called in the following order,
  ' otherwise the FileDialog Service is not removed.
  oFileDialog = CreateUnoService("com.sun.star.ui.dialogs.FilePicker")
  ' Defaults to Open, you can also use Save
  'oFileDialog.Initialize( _
  '       Array(com.sun.star.ui.dialogs.TemplateDescription.FILESAVE_SIMPLE))
  oUcb = createUnoService("com.sun.star.ucb.SimpleFileAccess")
  'ListAny(0) = _
  ' com.sun.star.ui.dialogs.TemplateDescription.FILEOPEN_SIMPLE
  'oFileDialog.initialize(ListAny())
  AddFiltersToDialog(FilterNames(), oFileDialog)
  
  'Set your initial path here!
  InitPath = ConvertToUrl("/home/cw/texte/buchV4/Abbildungen/")
  oFileDialog.SetDisplayDirectory(InitPath)
  
  iAccept = oFileDialog.Execute()
  If iAccept = 1 Then
    sPath = oFileDialog.Files(0)
    GetAFileName = sPath
  End If
  oFileDialog.Dispose()
End Function


sub InsertGraphic
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object

Dim filterNames(1) As String
filterNames(0) = "*.png"
filterNames(1) = "*.jpg"


rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args1(3) as new com.sun.star.beans.PropertyValue
args1(0).Name = "FileName"
args1(0).Value = GetAFileName(filterNames())
args1(1).Name = "FilterName"
args1(1).Value = "<Alle Formate>"
args1(2).Name = "AsLink"
args1(2).Value = false
args1(3).Name = "Style"
args1(3).Value = "Grafik"

dispatcher.executeDispatch(document, ".uno:InsertGraphic", "", 0, args1())

rem ----------------------------------------------------------------------
dispatcher.executeDispatch(document, ".uno:InsertCaptionDialog", "", 0, Array())

rem ----------------------------------------------------------------------
dim args4(1) as new com.sun.star.beans.PropertyValue
args4(0).Name = "Template"
args4(0).Value = "Marginal-Abb."
args4(1).Name = "Family"
args4(1).Value = 2

dispatcher.executeDispatch(document, ".uno:StyleApply", "", 0, args4())
end sub
Das funktioniert erst mal ganz ok. Nun mal ein paar Fragen:

- ich würde später gern noch etwas an der Grafik machen, wie bekomme ich die zuletzt eingefügte Grafik oder ein Liste aller Grafiken (ich habe sowas schon mal gesehen aber finde den Link nicht mehr mangels Suchbegriffen)

- ich würde mir gerne den zuletzt genutzten Pfad merken (am besten per Dokument) damit man schneller wieder dort ist wo die Bilder liegen, der Standardfiledialog schein das nicht zu leisten?!

- ich würde auch gerne auf die passende Bildunterschrift zugreifen habe aber keine Ahnung wie (der dispatch uno:InsertCaptionDialog geht zwar aber wieso ;-?)

Generelle Kommentare zu "meinem" Code und so sind natürlich auch gern gesehen.

Gruß,
Carsten
calli
**
Beiträge: 22
Registriert: Do, 31.08.2006 14:53

Re: [oowriter] Letzte Grafik oder Liste der Grafiken

Beitrag von calli »

Ich hatte echt auf eine Antwort gehofft...

Gestern Nacht noch mit verkleisterten Augen rausgefunden wie ich über alle Grafiken iteriere und damit auch die letzte bekomme leider hab ich das nicht gespeichert. Schön blöd geschaut heute Morgen. Jetzt muss ich mir das wieder zusammenstümpern. Ich hatte OO nur geschlossen, das Dokument nicht gespeichert (war nur Test) aber er warnte nicht das ich Änderungen im MakroEditor hatte :?

Aufs neue.

Carsten
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: [oowriter] Letzte Grafik oder Liste der Grafiken

Beitrag von komma4 »

15 Stunden und keine Antwort... echt unverschämt hier, die FREIWILLIGEN. :evil:



Solche Standardfragen beantwortet Dir das Studium von Andrews Makro-Dokument - oder auch in Blick in die installierten BASIC-Makros jeder OOo-Installation:

aus der Bibliothek GIMMICKS

Code: Alles auswählen

Sub GetGraphicNames()
Dim i as integer
Dim oDocGraphics as Object
	MakeLogHeadLine("Graphics")
	oDocGraphics = oDocument.GraphicObjects
	For i = 0 to oDocGraphics.count - 1
		WriteStringtoLogFile(oDocGraphics.GetbyIndex(i).Name)
	Next
End Sub
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
calli
**
Beiträge: 22
Registriert: Do, 31.08.2006 14:53

Re: [oowriter] Letzte Grafik oder Liste der Grafiken

Beitrag von calli »

Lieber Winfried,
komma4 hat geschrieben:15 Stunden und keine Antwort... echt unverschämt hier, die FREIWILLIGEN. :evil:
Ich habe doch gehofft geschrieben, dann hätte ich mir das nochmals mit Try&Error sparen können nachdem Datenverlust.

Verlangt oder erwartet habe ich nix.

In Deinem Code muss man noch oDocument setzen (per =ThisComponent) oder?

Ich habe jetzt wieder den Code zusammen, leider hörte es plötzlich(? ich meine gestern ging es, auch mit der Dispatch Methode) auf die Grafik am Cursor einzusetzen. Dann bin ich auf ein Code-Schnipsel von Andrew umgestiegen, aber auch hier wird immer am Dokumentanfang eingesetzt.

Code: Alles auswählen

' Icon im Text ===================================================================
sub InsertIcon

Dim oCursor
Dim oGraph
Dim oText

Dim filterNames(1) As String
filterNames(0) = "*.png"
filterNames(1) = "*.jpg"

dim document   as object

rem get access to the document
document   = ThisComponent
'Xray document

oText = document.getText()
'Xray oText

oCursor = oText.createTextCursor()
'oCursor = document.CurrentController.getViewCursor() ' geht auch nicht.

oCursor.goToStart(FALSE)
oGraph = document.createInstance("com.sun.star.text.GraphicObject")

With oGraph
.GraphicURL = "file:///home/cw/139.png" ' GetAFileName(filterNames())
.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
.Width = 600
.Height = 600
End With
'now insert the image into the text document
oText.insertTextContent( oCursor, oGraph, False )

'last = lastGraphic
'Xray last

'textheight = 300 ' noch zu erfahren...

'last.AnchorType = 1 ' Als Zeichen
'last.VertOrient = 1 ' Oben an Grundlinie

'owidth = last.width
'oheight = last.height

'last.height = textheight
'last.width = textheight*(owidth/oheight)

end sub
' Icon ================================================================================
Aufgerufen wird es über ein Tastaturkürzel, ich dachte erst wenn ich es über den Editor starte wäre ich in einem flaschen Kontext oder so.

Bin (mal wieder) ratlos. Die übrigen 3 Fragen aus dem 1. Posting sind aber auch noch aktuell.

Gruß,
Carsten
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: [oowriter] Letzte Grafik oder Liste der Grafiken

Beitrag von komma4 »

calli hat geschrieben:Verlangt oder erwartet habe ich nix.
Ich wollte auch nur darauf hinweisen, dass es hier keine Antwort-Garantie gibt... schon gar nicht in einer (zudem noch) knappen Zeitspanne.
calli hat geschrieben:In Deinem Code muss man noch oDocument setzen (per =ThisComponent) oder?
Ist nicht mein Code - sondern OOo-mitgelieferter.
Diese Unterroutine wird von einer anderen aufgerufen, da sind die Variablen schon gesetzt... Auch die Unterroutine WriteStringtoLogFile fehlt dann noch :)
calli hat geschrieben: Dann bin ich auf ein Code-Schnipsel von Andrew umgestiegen, aber auch hier wird immer am Dokumentanfang eingesetzt.
Das liegt daran, das der TextCursor nach dem Erzeugen da steht.
Erstelle ihn halt an der Stelle des ViewCursors:

Code: Alles auswählen

oViewCursor = ThisComponent.getCurrentController().getViewCursor()
oTextCursor = oViewCursor.getText().createTextCursorByRange( oViewCursor )

Was meinst Du mit "Pfad merken"?
Auf die Beschriftung kommst Du, wenn Du Dir das Grafikobjekt mal mit XRAY anschaust.


Viel Erfolg!
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
calli
**
Beiträge: 22
Registriert: Do, 31.08.2006 14:53

Re: [oowriter] Letzte Grafik oder Liste der Grafiken

Beitrag von calli »

komma4 hat geschrieben:
calli hat geschrieben: Dann bin ich auf ein Code-Schnipsel von Andrew umgestiegen, aber auch hier wird immer am Dokumentanfang eingesetzt.
Das liegt daran, das der TextCursor nach dem Erzeugen da steht.
Erstelle ihn halt an der Stelle des ViewCursors:

Code: Alles auswählen

oViewCursor = ThisComponent.getCurrentController().getViewCursor()
oTextCursor = oViewCursor.getText().createTextCursorByRange( oViewCursor )
Das hatte ich mit der auskommentierten Zeile schon mal versucht. Komisch so gehts jetzt: (hoffe das bleibt so...)

Code: Alles auswählen

' Icon im Text ===================================================================
sub InsertIcon

Dim oGraph
Dim oText

Dim filterNames(1) As String
filterNames(0) = "*.png"
filterNames(1) = "*.jpg"

dim document   as object

rem get access to the document
document   = ThisComponent

oText = document.getText()

vCursor = document.CurrentController.getViewCursor()

oGraph = document.createInstance("com.sun.star.text.GraphicObject")

With oGraph
.GraphicURL = GetAFileName(filterNames())' "file:///home/cw/139.png" ' GetAFileName(filterNames())
.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
End With
'now insert the image into the text document
oText.insertTextContent( vCursor, oGraph, False )

last = lastGraphic
'print last.Name
'Xray last

textheight = 300 ' noch zu erfahren...

last.AnchorType = 1 ' Als Zeichen
last.VertOrient = 1 ' Oben an Grundlinie

owidth = last.width
oheight = last.height

last.height = textheight
last.width = textheight*(owidth/oheight)

end sub
' Icon ================================================================================
Leider geht jetzt das "LastGraphic" nicht mehr, anscheinend (vermute ich) wird es zu schnell nach dem oText.insertTextContent aufgerufen, wenn man ein print reinmacht dazwischen gehts...

Aber bei Andrew habe ich was gesehen um die Größe einer Grafik rauszubekommen damit kann ich ja dann die direkte Angabe machen. Hoffe ich ;-)

Mit "Pfad merken" meine ich das ich mir gerne einen String merken möchte von einem zum nächsten Makroaufruf. Gibts da ne gute Methode?

Gruß,
Carsten
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: [oowriter] Letzte Grafik oder Liste der Grafiken

Beitrag von komma4 »

calli hat geschrieben:Mit "Pfad merken" meine ich das ich mir gerne einen String merken möchte von einem zum nächsten Makroaufruf. Gibts da ne gute Methode?
Schreib ihn halt irgendwo hin... bspw. in die Dokumenteigenschaften, Info-Felder. Andrew hat meines Wissens dazu auch Code.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Antworten