LO Makro Draw Problem GluePoint definieren

Mir gelingt es nicht, in LO Draw (5.3 - 5.4, openSUSE, Windows 10) einen nutzerdefinierten GluePoint für Verbinder korrekt zu setzen. Ich bitte darum, das zu testen. Vielleicht ist es ein Problem vor der Tastatur oder bei LO.

Der folgende Code funktioniert in AOO (3.. bis 4.1.4).

Das Makro erzeugt ein neues Draw-Dokument und versucht, StartGluePoints mittig in Rechtecke zu setzen. Stattdessen starten die Verbinder jeweils an der rechten unteren Ecke. Bei AOO starten sie brav in der Mitte.

Sub DrawConnector()
   Dim oDoc, oPage, oRect(2), oConn, oGlue
   Dim oSize As New com.sun.star.awt.Size
   Dim oPos As New com.sun.star.awt.Point
   Dim i%

   oDoc = StarDesktop.loadComponentFromUrl("private:factory/sdraw", "_blank", 0, Array())

   oPage = oDoc.DrawPages.getByIndex(0)
   oSize.Width = 1500
   oSize.Height = 1000
   For i = 0 To 2
     oRect(i) = oDoc.createInstance("com.sun.star.drawing.RectangleShape")
     oPage.add(oRect(i))
     oRect(i).Size = oSize
   Next
   For i = 0 To 2
     oPos.X = (i + 1) * 4000
     oPos.Y = 2000 + ((i + 1) Mod 3) * 2000
     oRect(i).Position = oPos
     oConn = oDoc.createInstance("com.sun.star.drawing.ConnectorShape")
     oPage.add(oConn)
     oConn.StartShape = oRect(i)
     oConn.EndShape = oRect((i + 1) Mod 3)
     oConn.EdgeKind = com.sun.star.drawing.ConnectorType.STANDARD

     oGlue = CreateUnoStruct("com.sun.star.drawing.GluePoint2")
     oGlue.IsRelative = False
     oGlue.Escape = com.sun.star.drawing.EscapeDirection.SMART
     oGlue.PositionAlignment = com.sun.star.drawing.Alignment.CENTER
     oGlue.IsUserDefined = True
     oGlue.Position.X = oRect(i).Position.X + 750
     oGlue.Position.Y = oRect(i).Position.Y + 500
     oConn.StartGluePointIndex = oRect(i).GluePoints.insert(oGlue)
   Next
End Sub

Schöne Grüße
Volker

Hey Volker,

teste mal die Folgende Zeile:

oConn.StartGluePointIndex = oRect(i).GluePoints.insert(oGlue)+ 1

Wäre das Dein erwartetes Eegebnis? Ich denke, die Indices der GluePoints beginnen bei 1 und nicht bei 0.

Könnte dann natürlich auch ein Fehler der Api sein...

VG

Thomas

Hallo Thomas,

die Indices habe ich überprüft, weil ich den Verdacht hatte, dass es standardmäßig mehr als nur 4 geben könnte. Aber dem ist nicht so.

Print oRect(i).GluePoints.Count ergibt 5 nach der Einfügung des zentrierten Punkts. 0 = oben, 1 = rechts, 2 = unten, 3 = links, alles jeweils in der Mitte der Linie.

Index 4 (der neue) hat den GluePoint an der Ecke rechts unten, was sicher auch nicht im Standard vorhanden ist. Das ändert sich auch nicht, wenn ich X und Y der Positionen ändere.

Jeder weitere Index (auch 5) ergibt keinen Error, sondern einen Startpunkt links in der Mitte, der aber nicht mit dem Rechteck verbunden ist.

Doch ein Bug?

Schöne Grüße
Volker

Hey Volker,

leider weiss ich immer noch nicht genau, wie es aussehen soll;)

Aber ich glaube, noch etws gefunden zu haben:

oGlue = CreateUnoStruct("com.sun.star.drawing.GluePoint2")
    oGlue.IsRelative = False
    oGlue.Escape = com.sun.star.drawing.EscapeDirection.SMART
    oGlue.PositionAlignment = com.sun.star.drawing.Alignment.CENTER
    oGlue.IsUserDefined = True

'oGlue.Position.X = 750 'oRect(i).Position.X + 750
    'oGlue.Position.Y = 500 'oRect(i).Position.Y + 500

oConn.StartGluePointIndex = oRect(i).GluePoints.insert(oGlue)

Die Zeile "Glue.PositionAlignment = com.sun.star.drawing.Alignment.CENTER" setzt doch den Nullpunkt in die Mitte des Zeichnungsobjektes - also von dort aus wird jetzt gemessen.

Wenn ich Dich richtig verstanden habe, willst Du den GluePoint doch genau dort hin habe? dann wäre doch die Positionsangabe 0 , 0 - also brauchste nix angeben?

Da der Punkt maximal in den Grenzen des Rechtecks sein muss, wäre auch die bisherige Platzierung rechts unten verständlich - weiter geht eben nicht;)

War es das, was Du suchst?

Viele Grüße

Thomas

Offensichtlich, ja. LO scheint einen Bug von AOO behoben zu haben. Denn in AOO werden die Positionsangaben wohl gar nicht berücksichtigt. Jedenfalls nach meinen schnellen Tests jetzt gerade. ALIGNMENT bestimmt allein. Daher ist es mir nicht aufgefallen, weil ich die Mitte quasi zweimal eingestellt hatte.

In LO kann ich jetzt jeden Punkt innerhalb der Rechtecke bestimmen, was in AOO nicht ging.

Danke für den Hinweis und schöne Grüße
Volker