[WinCC-VBA] Objekte nach rechts verschieben in ca. 400 Bildern

Flux

Level-1
Beiträge
314
Reaktionspunkte
11
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich stehe vor der Aufgabe ca. 400 Bilder zu editieren, d.h. alle sich darin befindlichen Bildelemente um genau 400 px nach rechts zu verschieben. Das kann man manuell machen :rolleyes: oder aber skripten. Dazu habe ich mir aus ein Paar Codeschnipseln ein halbwegs funktionierendes Skript zusammengebastelt.

Probleme entstehen bei gruppierten Elementen, da dann der doppelte Offset (2 x 400 px) auf die gruppierten Elemente addiert wird (einmal auf alle HMIObjects und einmal auf das HMIGroup-Object). Ich suche nun nach einem Kriterium (siehe KEIN_GROUP_OBJECT im Code), welches mir sagt, ob das Element Group-Object oder "normales" HMIObject ist, um abhängig davon den Offset aufzuaddieren.

MfG Flux

Code:
Sub MoveAllObjects400PX()
'*******************************
Dim objGDApplication As grafexe.Application

Dim fso As FileSystemObject
Dim ofolder As Folder
Dim ofiles As Files
Dim ofile As File

Dim oColObjects As HMIObjects
Dim oHmiObject As HMIObject
'*******************************
    Set objGDApplication = Application
    
    Set fso = New FileSystemObject
    Set ofolder = fso.GetFolder(objGDApplication.ApplicationDataPath)
    Set ofiles = ofolder.Files
            
    For Each ofile In ofiles
        If UCase(Right(ofile.Name, 3)) = "PDL" Then 'Bild?
        
            objGDApplication.Documents.Open ofile.Name, hmiOpenDocumentTypeVisible 'Bild öffnen
                                               
            Set oColObjects = ActiveDocument.HMIObjects  'Bildelemente
                   
            For Each oHmiObject In oColObjects
                
                If oHmiObject.[COLOR=#ff0000][B]KEIN_GROUP_OBJECT [/B][/COLOR]Then
                    oHmiObject.Left = oHmiObject.Left + 400 'Bildelement um 400 px nach rechts verschieben
                End If
                
            Next oHmiObject
            
            Application.Documents.SaveAll 'speichern
                        
            Application.Documents.Close (Application.ApplicationDataPath & ofile.Name) 'schließen
            
        End If
            
    Next ofile

Set fso = Nothing
End Sub
 
Zuletzt bearbeitet:
Hi Thomas,

IF oHmiObject.Type <> HMIGroup THEN hatte ich schon versucht, ohne Erfolg. Mit "" um HMIGroup funktionierts :ROFLMAO:

Danke!
 
Hallo nochmal,

ich hab das Skript mal angestoßen. Alter Schwede, Performance sieht anders aus.
Was ich gemacht hab ist das hmiOpenDocumentTypeVisible durch hmiOpenDocumentTypeInvisible zu ersetzen, aber viel hat's eigentlich nicht gebracht.
Hat jemand ne Idee wie man das Skript noch optimieren kann ?

In einem zweiten Skript lese ich mir per ActiveDocument.Width/Height die Maße aller Bilder aus und schreibe in jedem Schleifendurchlauf / für jedes Bild per TextStream.write in ein txt-file. Leider kann man ActiveDocument nur ansprechen, nachdem man .open ausgeführt hat, was nicht gerade zur Performance beiträgt. Hat jemand ne Idee, wie man möglichst effizient eine Auflistung der Maße aller Bilder erstellen kann mit VBA ?

Danke für eure Vorschläge
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

das Skript ist nun im 3. Versuch glücklicherweise durchgelaufen, wobei in den ersten zwei Anläufen der GraficDesigner abgeschmiert ist. Mir ist außerdem aufgefallen, dass das Skript mit zunehmender Laufzeit langsamer wird - Ich habe den Eindruck der freie Speicher wird immer knapper und knapper.

Gibt es vielleicht einen Befehl, womit man Speicher wieder freigeben kann ?

Außerdem frage ich mich, ob es einen Befehl gibt um nur das aktuelle Bild (ActiveDocument) zu speicehrn, anstatt Application.Documents.SaveAll zu machen? In der Hoffnung, dass das zur Effizienz beitragen könnte.. :confused:

MfG
Flux
 
Hallo Leute,
da ich gehört habe man könne auch in Kombinatio mit C# auf die grafexe zugreifen, wollte ich mal fragen, ob das schonmal jemand gemacht hat?
Mein Ziel wäre die Funktionalität des obigen Skripts damit zu formulieren, in der Hoffnung dass es damit schneler geht.

Für jegliche hinweise bin ich dankbar
Flux
 
Zurück
Oben