Pfeile in Calc

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

Moderator: Moderatoren

RudiMax
*
Beiträge: 12
Registriert: Mi, 17.06.2020 22:22

Pfeile in Calc

Beitrag von RudiMax »

Hallo zusammen,

zu meinem Thema habe ich nichts Annäherndes im Forum gefunden (was nichts heißen muss), sodass die Sache hoffentlich von breiterem Interesse ist.
Mein Makro soll Zellen mit Pfeilen verbinden, deren Farbe und Stärke von den Zelleninhalten abhängt.
Nachfolgend das Unterprogramm für das Setzen der Pfeile, der Übersichtlichkeit halber mit festen Werten und auf seine Grundstruktur „eingedampft“.

Code: Alles auswählen

Sub Pfeil_setzen
	Dim xLinie, xZelle1, xZelle2, xFolie As Object
	Dim oTabelle As Object
	Dim oPunkt As New com.sun.star.awt.Point		'Position eines Punktes
	Dim xRechteck As New com.sun.star.awt.Size		'umschreibendes Rechteck
	oTabelle = ThisComponent.Sheets().getByName("Tabelle")
	xZelle1 = oTabelle.getCellByPosition(1, 2)
	xZelle2 = oTabelle.getCellByPosition(3, 4)
	oPunkt.X = xZelle1.Position.X				'linke obere Ecke
	oPunkt.Y = xZelle1.Position.Y				'linke obere Ecke
	xRechteck.Width = xZelle2.Position.X - oPunkt.X		'Breite
	xRechteck.Height = xZelle2.Position.Y - oPunkt.Y	'Höhe
	xLinie = ThisComponent.createInstance("com.sun.star.drawing.LineShape")
	With xLinie
		.Position = oPunkt				'Beginn
		.Size = xRechteck				'umschreibendes Rechteck
		.LineWidth = 100				'Linienstärke
		.LineColor = RGB(8, 128, 1)			'Linienfarbe
	End With
	xFolie = oTabelle.getDrawPage()
	'Die Linie in eeine Folie einfügen und mit Pfeilspitze versehen (diese Reihenfolge ist zwingend)
	xFolie.add(xLinie)
	xLinie.LineEndName = "Arrow concave"
End Sub
Schleifen und die Belegung der Parameter mit Variablen und deren Übergabe aus dem Hauptprogramm bekomme ich hin, nur die Grafik ist Neuland für mich:
1. Während ich über LineWidth die Linienbreite vergrößere, bleibt die Pfeilspitze unverändert. Ist das halt so komisch oder mache ich etwas falsch?
2. Wo sind Services wie "com.sun.star.drawing.LineShape“ dokumentiert? Konkret suche ich etwas wie LineType oder LineStyle = „dashed“ für gestrichelte Linie.
3. Wie bekomme ich ‑für eine Aktualisierung der Ansicht- die Pfeile wieder weg, damit ich neue setzen kann? Meine vergeblichen Versuche gehen in untenstehende Richtung. Um die Folien zu löschen, könnte ich sie auch namentlich ansprechen. Aber ich weiß nicht wo und wie ich die Namen vergeben müsste und vermute einen einfacheren Weg, da ich ja alle Pfeile (Folien) entfernen möchte.

Code: Alles auswählen

Sub Pfeil_loeschen
	Dim xFolien As Object
	Dim oDoc, oTabelle As Object	
	''oTabelle = ThisComponent.Sheets().getByName("Tabelle")
	''xFolien = oTabelle.getDrawPages()
	oDoc = ThisComponent
	xFolien = oDoc.getDrawPages()
	xFolien.remove(xFolien.getByIndex(0))
End Sub
Danke fürs Gedankenmachen!

Rudi
Stephan
********
Beiträge: 12058
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Pfeile in Calc

Beitrag von Stephan »

zu meinem Thema habe ich nichts Annäherndes im Forum gefunden (was nichts heißen muss), sodass die Sache hoffentlich von breiterem Interesse ist.
Es dürfte wohl wirklich nicht viele Infos dazu geben, weil solche speziellen Dinge nur selten benötigt werden. Ich selbst müsste mir Informationen dazu auch zusammensuchen, weil sie mir nicht geläufig sind und ich möchte, aus Zeitknappheit, nur auf eine DEiner Fragen eingehen:
2. Wo sind Services wie "com.sun.star.drawing.LineShape“ dokumentiert? Konkret suche ich etwas wie LineType oder LineStyle = „dashed“ für gestrichelte Linie.
in der sog. IDL-Referenz (=API-Doku), im KOnkreten z.B. Einstieg hier:
http://www.openoffice.org/api/docs/comm ... Shape.html

und dann weiter über "LineProperties".

Ein einfacher ZUgriff auf diese Infos, während des Programmierens, ist z.B. mit dem XRAY-Tool und der dortigen Schaltfläche "API Doc" möglich, siehe Screenshot hier:
https://wiki.openoffice.org/wiki/Extens ... #Xray_tool

Es gibt XRAY-Tool auch in deutsch:
http://berma.pagesperso-orange.fr/Files ... l60_de.odt



Gruß
Stephan
cwolan
*
Beiträge: 16
Registriert: Sa, 06.03.2021 12:56

Re: Pfeile in Calc

Beitrag von cwolan »

1. Während ich über LineWidth die Linienbreite vergrößere, bleibt die Pfeilspitze unverändert. Ist das halt so komisch oder mache ich etwas falsch?
Versuche mit: .LineStartWidth und .LineEndWidth
3. Wie bekomme ich ‑für eine Aktualisierung der Ansicht- die Pfeile wieder weg, damit ich neue setzen kann? (...)
Siehe:
"Select shape by name"
https://forum.openoffice.org/en/forum/v ... 8&p=335261


Gruß
Czesław
Win. 7, 10 (x64) ▪ LO 7.0.3.1 ▪ AOO 4.1.9
F3K Total
********
Beiträge: 3549
Registriert: Mo, 28.02.2011 17:49

Re: Pfeile in Calc

Beitrag von F3K Total »

Moin,
ich wollte es mal ausprobieren, hier das Ergebnis:

Code: Alles auswählen

Sub Pfeile_setzen
    Dim xLinie, xZelle1, xZelle2, xFolie As Object
    Dim oTabelle As Object
    Dim oPunkt As New com.sun.star.awt.Point        'Position eines Punktes
    Dim xRechteck As New com.sun.star.awt.Size      'umschreibendes Rechteck
    for i = 0  to 99
        oTabelle = ThisComponent.Sheets().getByName("Tabelle")
        xZelle1 = oTabelle.getCellByPosition(2, i + 1)
        xZelle2 = oTabelle.getCellByPosition(4, i + 3)
        oPunkt.X = xZelle1.Position.X               'linke obere Ecke
        oPunkt.Y = xZelle1.Position.Y               'linke obere Ecke
        xRechteck.Width = xZelle2.Position.X - oPunkt.X        'Breite
        xRechteck.Height = xZelle2.Position.Y - oPunkt.Y    'Höhe
        xLinie = ThisComponent.createInstance("com.sun.star.drawing.LineShape")
        With xLinie
            .Position = oPunkt                      'Beginn
            .Size = xRechteck                       'umschreibendes Rechteck
            .LineWidth = 100                        'Linienstärke
            .LineColor = RGB(8, 128, 1)
            .LineEndName = "Arrow concave"
        End With
        xFolie = oTabelle.getDrawPage()
        'Die Linie in eine Folie einfügen und mit Pfeilspitze versehen (diese Reihenfolge ist zwingend)
        xFolie.add(xLinie)
        xLinie.LineEndName = "Arrow concave"
        xLinie.LineEndWidth = 400                   'Pfeilgroesse einstellen
    next i
End Sub

sub Pfeile_loeschen
	oTabelle = ThisComponent.Sheets().getByName("Tabelle")
	xFolie = oTabelle.getDrawPage()
	for i = xFolie.count - 1 to 0 step - 1
	    xLinie = xFolie.getbyindex(i)
	    if xLinie.supportsservice("com.sun.star.drawing.LineShape") then
	        xFolie.remove(xLinie)
	    endif  
	next 	
end sub
Gruß R
cwolan
*
Beiträge: 16
Registriert: Sa, 06.03.2021 12:56

Re: Pfeile in Calc

Beitrag von cwolan »

Hallo,

Das ist ein schöner Stapel von Pfeilen. :‑)

Unten ein Beispiel für eine gestrichelte Linie.

Gruß
Czesław
Dateianhänge
Linie - Beispiel.jpg
Linie - Beispiel.jpg (119.23 KiB) 443 mal betrachtet
Win. 7, 10 (x64) ▪ LO 7.0.3.1 ▪ AOO 4.1.9
cwolan
*
Beiträge: 16
Registriert: Sa, 06.03.2021 12:56

Re: Pfeile in Calc

Beitrag von cwolan »

Ein weiteres Beispiel...
Dateianhänge
Ultrafein gestrichelt.jpg
Ultrafein gestrichelt.jpg (129.7 KiB) 411 mal betrachtet
Win. 7, 10 (x64) ▪ LO 7.0.3.1 ▪ AOO 4.1.9
RudiMax
*
Beiträge: 12
Registriert: Mi, 17.06.2020 22:22

Re: Pfeile in Calc

Beitrag von RudiMax »

Hallo Stephan,
in der sog. IDL-Referenz (=API-Doku),.. und dann weiter über "LineProperties".
auf der Seite war ich sogar, habe aber die richtige Syntax nicht hinbekommen. Mangels Beispielen ist das für mich eigentlich unmöglich. Sorry
Und die Konstruktion mit com.sun.star.drawing.DashStyle.ROUND von cwolan unten kann ich auf den Seiten auch im Nachhinein nicht nachvollziehen.
Gut, dass es so hilfsbereite Könner wie Euch gibt!
An die implementierung des XRAY-Tool -toller Tipp!- werde ich mich mal an einem ruhigen Abend wagen, fürchte aber, Euch gelegentlich nochmal behelligen zu müssen :shock:.
Aber jetzt erstmal vielen Dank!!

Grüße
Rudi
RudiMax
*
Beiträge: 12
Registriert: Mi, 17.06.2020 22:22

Re: Pfeile in Calc

Beitrag von RudiMax »

Hallo Czesław,
1. (Pfeilenden)
Versuche mit: .LineStartWidth und .LineEndWidth
Super! das wars. Ich hatte die Eigenschaft LineEndName irrtümlich nur im Zusammenhang mit Polygonen gesehen.

3. (alle PFeile löschen)
ich wollte es mal ausprobieren, hier das Ergebnis:
Du hast den eigentlichen Fehler sofort erkannt: es gab durch mein Herumprobieren mit den Pfeilen mehrere leere Folien, und da nutzt es natürlich garnichts, nur die erste davon zu löschen.
Die Abfrage if xLinie.supportsservice("com.sun.star.drawing.LineShape") ist das Sahnehäubchen! Meine Routine, die ich gebastelt hatte, habe ich gleich überschrieben :lol: . Und der Rückwärtszähler? ...ist wahrscheinlich auch so ein Clou.

Und Deine Beispiele lassen keinen Wunsch übrig, nun bin ich für alle Ansprüche gerüstet! Du hast Dich da richtig reingehängt.

Vielen Dank jedenfalls!

Grüße
Rudi
Antworten