Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 7 von 7

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

  1. #1
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Frage


    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 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.KEIN_GROUP_OBJECT 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
    Geändert von Flux (12.08.2013 um 11:20 Uhr)
    We must all suffer from one of two pains: the pain of discipline or the pain of regret. The difference is discipline weighs ounces while regret weighs tons.
    Zitieren Zitieren [WinCC-VBA] Objekte nach rechts verschieben in ca. 400 Bildern  

  2. #2
    Avatar von Flux
    Flux ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard

    Hab nun noch den Code hinzugefügt
    We must all suffer from one of two pains: the pain of discipline or the pain of regret. The difference is discipline weighs ounces while regret weighs tons.

  3. #3
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard

    Ist ein Objekt gruppiert so ist der Objekttyp HMIGroup.

    IF oHmiObject.Type = "HMIGroup" THEN ...

    sollte funktionieren.

  4. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    Flux (12.08.2013)

  5. #4
    Avatar von Flux
    Flux ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard

    Hi Thomas,

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

    Danke!
    We must all suffer from one of two pains: the pain of discipline or the pain of regret. The difference is discipline weighs ounces while regret weighs tons.

  6. #5
    Avatar von Flux
    Flux ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Frage

    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
    Geändert von Flux (12.08.2013 um 20:36 Uhr)
    We must all suffer from one of two pains: the pain of discipline or the pain of regret. The difference is discipline weighs ounces while regret weighs tons.

  7. #6
    Avatar von Flux
    Flux ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard

    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..

    MfG
    Flux
    We must all suffer from one of two pains: the pain of discipline or the pain of regret. The difference is discipline weighs ounces while regret weighs tons.

  8. #7
    Avatar von Flux
    Flux ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.03.2012
    Beiträge
    314
    Danke
    60
    Erhielt 9 Danke für 8 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 15.11.2011, 17:26
  2. Antworten: 4
    Letzter Beitrag: 18.02.2011, 10:06
  3. Antworten: 2
    Letzter Beitrag: 03.11.2008, 16:51
  4. Antworten: 0
    Letzter Beitrag: 06.10.2007, 10:22
  5. Antworten: 0
    Letzter Beitrag: 03.01.2006, 11:02

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •