Neu:

  Keine Werbeeinblendungen für registrierte User❗

  Jede SPENDE für das LIBREOFFICE Forum zählt ❤



  🌹 Danke für Ihre Unterstützung 🙏


Programmierung in Calc

Alles zur Programmierung im LibreOffice.
Antworten
hexpert
Beiträge: 6
Registriert: Di 21. Jul 2020, 17:26

Programmierung in Calc

Beitrag von hexpert » Di 21. Jul 2020, 18:57

Liebe Leute,

derzeit möchte ich eigentlich gerne mittels Makro auf ein Linienobjekt zugreifen, um dies zu rotieren.

Allerdings bin ich verzweifelt am Suchen nach Infos zum Objektmodell in Calc. Ich habe zwar einige Beispiel gefunden, wie man irgendwas in Zellen reinschreibt etc., aber ich finde nichts dazu, wie ich auf z.B. ein Zeichnungsobjekt zugreifen kann.

Da diese "Mini-IDE" keinerlei IntelliSense hat wie ich es z.B. von Visual Studio gewohnt bin, habe ich keine Ahnung, welche Eigenschaften oder Methoden welche Objekte jeweils haben....

Kann mir da jemand weiterhelfen?
Liebe Grüße

Uwe Homm

http://www.uwehomm.de

craig
Beiträge: 680
Registriert: Do 21. Apr 2016, 11:42

Re: Programmierung in Calc

Beitrag von craig » Di 21. Jul 2020, 19:52

Hallo Uwe,

Code: Alles auswählen

REM  *****  BASIC  *****

Sub Main
Dim oDoc As Object
oDoc=ThisComponent
	' Linie drehen
	' Maßeinheit: 1 = 1/100 Grad = 0,01 Grad
	oDoc.Sheets.getByIndex(0).Drawpage.getByIndex(0).RotateAngle=9000		' 9000/100 = 90 Grad

End Sub
Bei Bildern und Zeichnungsobjekten musst Du auf die Drawpage/s zu greifen.
Einfach gesagt handelt es sich um eine unsichtbare Ebene über dem Tabellenblatt.
Drawpage.getByIndex(0)
Der Index = 0 ist das eigentliche Objekt.

Statt einer Intellisense nutze ich z.B.:
  • XRAY-Tool
    Lade Dir das deutschsprachige Dokument von der angegebenen Seite herunter und öffne es in Writer.
    Dort findest Du einen Button zur INstallation des Tools. BItte beachte auf jedenfall die nachfolgenden Seiten,
    denn dort wird beschrieben, wie Xray bei jedem Office-Start mit geladen wird.

    Es kostet ein wenig Einarbeitungszeit, ist aber mehr als nützlich.
    Gleiches gilt für MRI.
  • MRI dient auch der Codeinspektion. Leider wird es für LibreOffice nicht mehr weiterentwickelt.
    MRI - UNO Object Inspection Tool-1.3.3
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.0.1.2 (x64) • AOO 4.1.6

hexpert
Beiträge: 6
Registriert: Di 21. Jul 2020, 17:26

Re: Programmierung in Calc

Beitrag von hexpert » Di 21. Jul 2020, 20:04

Hallo craig,

herzlichen Dank erstmal! Deinen Hinweise werde ich nachgehen und mir das Tool mal ansehen.

Und Deinen Beispielcode probiere ich :-)
Das mit der DrawPage hatte ich mittlerweile auch herausgefunden, aber wie ich dann auf die Objekte komme und wie deren Properties heißen...ohne Unterlagen keine Chance...
Meine Linien haben Namen, daher wird das wohl auch mit "getByName("Pfeil_U")" funktionieren.

Nochmals Danke!
Liebe Grüße

Uwe Homm

http://www.uwehomm.de

craig
Beiträge: 680
Registriert: Do 21. Apr 2016, 11:42

Re: Programmierung in Calc

Beitrag von craig » Di 21. Jul 2020, 20:32

Hallo Uwe,

LibreOffice-API: Drawpage

OpenOffice-API: Drawpage
Uwe hat geschrieben:mir das Tool mal ansehen.
Ist eigentlich ein muss, denn mal ansehen, weil die oben verlinken API-Seiten einen in den Wahsinn treiben können. ;)
Kannst übrigens beide Tools parallel installieren.

Nachfolgende Datei habe ich aus MRI heraus exportiert.
Der Aufruf im Code sieht so aus:

Code: Alles auswählen

mri oDoc.Sheets.getByIndex(0).Drawpage
Objekt Drawpage.ods
(12.13 KiB) 21-mal heruntergeladen
Uwe hat geschrieben:Meine Linien haben Namen, daher wird das wohl auch mit "getByName("Pfeil_U")" funktionieren.
Leider bietet Drawpage keine getByName-Methode (siehe Calc-Datei → Tabelle: Methods).
Man muss eine Schleife über die Indizes bilden und darin die Namen abfragen:

Code: Alles auswählen

Dim oDP as Object
	oDP=oDoc.Sheets.getByIndex(0).Drawpage
		For i = 0 to 5
			oDP.getByIndex(i)
				If oDP.getByIndex(i).Name = "Banane" Then
						' Linie drehen
						' Maßeinheit: 1 = 1/100 Grad = 0,01 Grad
						oDP.getByIndex(i).RotateAngle=9000		' 9000/100 = 90 Grad
				end If
		next i
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.0.1.2 (x64) • AOO 4.1.6

hexpert
Beiträge: 6
Registriert: Di 21. Jul 2020, 17:26

Re: Programmierung in Calc

Beitrag von hexpert » Mi 22. Jul 2020, 07:24

Lieber craig

wow...danke für die zahlreichen Infos!

Ja, das mit getByName hatte ich gestern spät noch getestet...und leider auch feststellen müssen, dass dies nicht funktioniert

Jetzt werde ich mich mal mit Deinen neuen Infos beschäftigen :-)
Liebe Grüße

Uwe Homm

http://www.uwehomm.de

hexpert
Beiträge: 6
Registriert: Di 21. Jul 2020, 17:26

Re: Programmierung in Calc

Beitrag von hexpert » Mi 22. Jul 2020, 07:27

Noch eine Ergänzung: Eigentlich verwende ich bei Sammlungen ja die foreach...aber DrawPage hat wohl auch keinen Container für die Zeichnungsobjekte...
Liebe Grüße

Uwe Homm

http://www.uwehomm.de

hexpert
Beiträge: 6
Registriert: Di 21. Jul 2020, 17:26

Re: Programmierung in Calc

Beitrag von hexpert » Mi 22. Jul 2020, 08:44

Hi craig,

mit einer Sache komme ich derzeit nicht klar...und zwar mit der Einstellung bei Xray für den Ort des API.

Ich habe mir das aktuelle SDK heruntergeladen und installiert. Ich finde aber NICHT das richtige Verzeichnis, dass ich für das lokal installierte API eintragen muss...habe zwar verschiedene Verzeichnisse probiert, aber bisher kein Erfolg :-(

Und bei der Einrichtung des Web-API habe ich die URL https://api.libreoffice.org/docs/idl/ref/index.html probiert, die aber auch nicht die Richtige ist...

Kannst Du mir bitte hier nochmal auf die Sprünge helfen?
Ansonsten ist Xray schonmal sehr informativ :-)
Momentan suche ich das richtige Property, dass mir den Drehpunkt vor der Drehung festlegt. Ich will nicht um die Mitte der Linie drehen, sondern um den Anfangspunkt der Linie. Ich vermute mal, dass dies eine Enumeration ist, aber bisher habe ich bei den Eigenschaften noch nichts zielführendes gefunden. Daher wäre die API-Beschreibung bestimmt hilfreich :-)
Liebe Grüße

Uwe Homm

http://www.uwehomm.de

hexpert
Beiträge: 6
Registriert: Di 21. Jul 2020, 17:26

Re: Programmierung in Calc

Beitrag von hexpert » Mi 22. Jul 2020, 09:06

Also der Drehpunkt ist doch eine Koordinate...vielleicht mit dem Datentyp Point...mal weiterforschen :-)
Liebe Grüße

Uwe Homm

http://www.uwehomm.de

craig
Beiträge: 680
Registriert: Do 21. Apr 2016, 11:42

Re: Programmierung in Calc

Beitrag von craig » Mi 22. Jul 2020, 16:22

Hallo Uwe,
Uwe hat geschrieben: mit einer Sache komme ich derzeit nicht klar...und zwar mit der Einstellung bei Xray für den Ort des API.
Das Problem ist, dass Xray eigentlich für AOO konzipiert ist und hier ist die API anders aufgebaut.

LibreOffice nutzt im Gegensatz zu AOO die Plattform "Generated by doxygen 1.8.18 " und damit kommt Xray wohl nicht klar.
Xray verlangt diese Seite:
http://www.openoffice.org/api/docs/comm ... dex-1.html
Beginnend mit dem Link "A"
Die LibreOffice -API beginnt hiermit:
https://api.libreoffice.org/docs/idl/ref/files.html

In MRI kann man diese Seite einstellen, wichtig ist, dass ein Haken bei "IDL reference..." gesetzt ist:
LibreOffice MRI IDL reference.jpg
LibreOffice MRI IDL reference.jpg (7.38 KiB) 1208 mal betrachtet
Die SDK muss übrigens nicht installiert sein. Es muss auch keine permantente Internetverbindung vorhanden sein.
Die Angabe der Doku-Seite in den Einstellungen dient wohl nur der Aktualisierung, wenn eine Internetverbindung erkannt wird.

Daraus resultiert für LibreOffice:
  • Nutze Xray unter Angabe der AOO-API
  • Nutze MRI wie im Screenshot zu sehen.
Ich selbst nutze lieber MRI, bin sehr traurig darüber, dass der Autor (Hanya) MRI nicht mehr weiterentwickelt. :(

Noch ein Hinweis:
Die AOO- und LibreOffice-API's bewegen sich nach und nach auseinander. Es gibt Fälle in denen
eine Anweisung in LibreOffice funktioniert, in AOO nicht und umgekehrt.
Dies hat selbstverständlich auch Auswirkungen auf die beiden Inspektions-Tools (XRAY und MRI).
Im Augenblick ist dies eher die Ausnahme, als die Regel.
Wollen mal sehen wo die Reise hingeht :roll:
Uwe hat geschrieben:Ansonsten ist Xray schonmal sehr informativ
Hier noch ein paar nützliche Links:
Uwe hat geschrieben:Momentan suche ich das richtige Property, dass mir den Drehpunkt vor der Drehung festlegt. Ich will nicht um die Mitte der Linie drehen, sondern um den Anfangspunkt der Linie. Ich vermute mal, dass dies eine Enumeration ist, aber bisher habe ich bei den Eigenschaften noch nichts zielführendes gefunden. Daher wäre die API-Beschreibung bestimmt hilfreich
Ich selbst so etwas noch nicht programmiert. Bin aber im OOME... fündig geworden:
Seite 560ff: Einfache Linien
Wenn ich es richtig verstanden habe, dann betrachtet man eine Linie als offenes Polygon.
Die Koordinaten-Daten werden dem Polygon als Array übergeben, usw.

------------------------------------------------
Uwe hat geschrieben:Eigentlich verwende ich bei Sammlungen ja die foreach...aber DrawPage hat wohl auch keinen Container für die Zeichnungsobjekte...
Im Prinzip ist die Drawpage Ebene und Container:
Die Eigenschaft Count liefert die Anzahl der Objekte auf der Drawpage.
Mit Indexgreift man auf die einzelnen Objekte zu.
Man kann auch mit hasmoreElements [TREU | FALSE] herausfinden, ob überhaupt Objekte vorhanden sind.
  1. nutze die Eigenschaft:

    Code: Alles auswählen

    nCounter=Drawpage.Count
    ODER
    die Methode:

    Code: Alles auswählen

    nCounter=Drawpage.getCount
    Damit hast Du die Anzahl der Zeichnungsobjekte in nCounter stehen.
    Aber Achtung: Die Zählung der Objekte beginnt bei 0
    Deshalb -1:

    Code: Alles auswählen

    For i = 0 to nCounter -1
Gruß

Craig

Nie die Sicherungskopie vergessen!

════════════════════════════════════════════════
WIN 10 Pro 64-Bit • LO 7.0.1.2 (x64) • AOO 4.1.6

Antworten