Kopieren von Elementen einer Drawpage

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Kopieren von Elementen einer Drawpage

Re: Kopieren von Elementen einer Drawpage

von Maggus » Di, 24.01.2012 11:19

Das mit dem Kopieren einer Gruppierung per Dispatcher funktioniert. :D

Habe mir folgendes zusammengebastelt:

Code: Alles auswählen

Sub copyShapeCollection
  oDocCtrl = ThisComponent.CurrentController
  ActiveSheet = oDocCtrl.ActiveSheet
  For n = 0 to ActiveSheet.DrawPage.getCount -1
    oShapeCollection = ActiveSheet.DrawPage.getByIndex(n)
    If oShapeCollection.supportsService("com.sun.star.drawing.GroupShape") Then
      If oShapeCollection.Name = "MeineGruppierung" Then
        oDocCtrl.select(oShapeCollection)
        oFrame = oDocCtrl.Frame
        dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
        dispatcher.executeDispatch(oFrame, ".uno:Copy", "", 0, Array())
        dim args2(0) as new com.sun.star.beans.PropertyValue
        args2(0).Name = "Nr"
        args2(0).Value = 6
        dispatcher.executeDispatch(oFrame, ".uno:JumpToTable", "", 0, args2())
        dispatcher.executeDispatch(oFrame, ".uno:Paste", "", 0, Array())
        oDocCtrl.select(createUnoService("com.sun.star.drawing.Shape")) 'Selektion aufheben
      End If
    End If
  Next n
End Sub
Vielleicht kann man das noch verfeinern...

Gruß,

Re: Kopieren von Elementen einer Drawpage

von Maggus » Mo, 23.01.2012 13:30

Ahaaa....
Sehr schön. Folgendes musste noch geändert werden:

ThisComponent.createInstance("com.sun.star.drawing.RectangleShape")
(herausgefunden mittels oShape.getShapeType)
und ohne GraphicURL

folgendes funktioniert also:

Code: Alles auswählen

Sub copyRectangleShape
  ActiveSheet = ThisComponent.CurrentController.ActiveSheet
  For n = 0 to ActiveSheet.DrawPage.getCount -1
    oShape = ActiveSheet.DrawPage.getByIndex(n)
    If oShape.supportsService("com.sun.star.drawing.Shape") Then
      If oShape.Name = "kopiermich" Then
        oShapeCopy = ThisComponent.createInstance("com.sun.star.drawing.RectangleShape")
        With oShapeCopy
          .Size = oShape.Size
          .Position = oShape.Position
        End With
        ThisComponent.Sheets(5).Drawpage.add(oShapeCopy)
      End If
    End If
  Next n
End Sub
Bleibt die Frage mit dem Kopieren einer Gruppierung per Dispatcher!?

Und wenn ich mir in einem Calc Sheet DrawPage.Forms(0) ansehe, dann deutet Count = 0 darauf hin, dass ich beim Löschen eines RectangleShape nur die View aus der DrawPage löschen muss und kein Model aus irgendeinem Form, oder irre ich? :)

Danke Frieder,
Gruß,

Re: Kopieren von Elementen einer Drawpage

von Frieder D. » Mo, 23.01.2012 12:02

Hallo Maggus
Bei meinen bisherigen Versuchen wird damit allerdings immer nur das oShape aus dem Quell Sheet gelöscht. Warum auch immer...
Du musst erst eine Kopie der Grafik erstellen.
der Code sieht dann so aus:

Code: Alles auswählen

Sub copyElement
  ActiveSheet = ThisComponent.CurrentController.ActiveSheet
   For n = 0 to ActiveSheet.DrawPage.getCount -1
     oShape = ActiveSheet.DrawPage.getByIndex(n)
      If oShape.supportsService("com.sun.star.drawing.Shape") Then
        If oShape.Name = "kopiermich" Then
        'Kopie erstellen:
          oshapecoppy = thiscomponent.createInstance("com.sun.star.drawing.GraphicObjectShape")
          'muss vieleicht so heißen
          'oshapecoppy = thiscomponent.createInstance("com.sun.star.drawing.Shape")
          with oshapecoppy
            .name = oShape.Name 
            .size = oShape.size 
            .position = oShape.position 
            .GraphicURL = oShape.GraphicURL 
          end with
          ThisComponent.Sheets(5).Drawpage.add(oshapecoppy)
        End If
     End If
    Next n
End Sub
Gruß Frieder

Re: Kopieren von Elementen einer Drawpage

von Maggus » Mo, 23.01.2012 11:18

Hi DPunch,
danke für die Aufklärung. Klar mit Sheets.getByIndex ist das ja das gleiche.

Bei den verlinkten Beiträgen, welche mir schon bekannt waren, geht es ja um Formular Elemente. Trifft das denn auf ein gezeichnetes Rechteck genauso zu? Müsste ich da auch ein Model aus einem Formular löschen?
DPunch hat geschrieben: Ohne Weiteres dürfte das nicht gehen, nein, da wirst Du vermutlich jedes Element einzeln kopieren und rüberschieben müssen.
Auch nicht per Dispatcher? ich könnte ja mit

Code: Alles auswählen

dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())
Die aktuelle Selektion kopieren. Leider ist es mir bisher aber auch nicht gelungen per Makro die Selektion auf ein Shape zu setzen. :(

So oder so finde ich keine Methods für den Kopiervorgang. Gehe ich richtig der Annahme, dass das nur mit oDrawPage.add(oShape) geht? Bei meinen bisherigen Versuchen wird damit allerdings immer nur das oShape aus dem Quell Sheet gelöscht. Warum auch immer...

[EDIT] Quatsch. Narürlich nicht gelöscht. Wurde im gleichen Sheet mit x=0 y=0 und 1x1 mm geändert.[/EDIT]

So sieht mein Code aus:

Code: Alles auswählen

Sub copyElement
  ActiveSheet = ThisComponent.CurrentController.ActiveSheet
	For n = 0 to ActiveSheet.DrawPage.getCount -1
	  oShape = ActiveSheet.DrawPage.getByIndex(n)
      If oShape.supportsService("com.sun.star.drawing.Shape") Then
        If oShape.Name = "kopiermich" Then
          ThisComponent.Sheets(5).Drawpage.add(oShape)
        End If
	  End If
    Next n
End Sub
Gruß,

Re: Kopieren von Elementen einer Drawpage

von DPunch » Fr, 20.01.2012 19:12

Aloha

Frage1: Ja - die Drawpage ist ein Container, und Container erlauben den Zugriff statt per getByIndex-Methode (fast) immer auch durch die verkürzte "Array-Schreibweise" x(n).

Frage2: Wurde z.B. Hier oder auch Hier schon behandelt, gibt sicher noch etliche Links mehr.

Frage3: Ohne Weiteres dürfte das nicht gehen, nein, da wirst Du vermutlich jedes Element einzeln kopieren und rüberschieben müssen.

Kopieren von Elementen einer Drawpage

von Maggus » Mi, 18.01.2012 14:24

Hallo,
also ich dachte, wie man in einem Calc Sheet auf ein Element in der Drawpage zugreift wäre mir klar:

Code: Alles auswählen

oSheet = thisComponent.Sheets.getByName("test")
  For n = 0 to oSheet.DrawPage.getCount -1
    oThisElement = oSheet.DrawPage.getByIndex(n)
    If oThisElement.Name = "hinweis1" Then
      xray oThisElement
    End If
  Next n
End Sub
Aber:
Frage1: greift man mit DrawPage.getByIndex(n) auf das gleiche zu wie mit DrawPage(n)? und ist das jetzt die DrawPage oder das x-te Element der DrawPage? Ich dachte jedes Sheet hat nur eine DrawPage :?

Frage2: Wie kann ich in der DrawPage was Löschen ohne dass Office abschmiert? Mit dispose? remove? Kombination?

Noch wichtiger für mich: Wie kann ich Ein gruppiertes Element kopieren und auf einem anderen Sheet einfügen? Oder geht das garnicht über die DrawPage? Ich finde mit Xray nämlich nichts dergleichen.

Gruß,

Nach oben