[GastForen Programmierung/Entwicklung AppleScript Box per Koordinaten in Quark7.5 ansprechen

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Box per Koordinaten in Quark7.5 ansprechen

Alelli
Beiträge gesamt: 20

11. Mai 2009, 13:27
Beitrag # 1 von 8
Bewertung:
(3742 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo,

kann ich in Quark 7.5 per Apple Script eine Box per ca. Koordinaten ansprechen?

Ich kenne eine TextBox und in einem gewissen Abstand zu dieser Box muss eine Bildbox stehen, wie kann ich diese ansprechen?
Wobei die Größe der Bildbox nicht bekannt ist und immer unterschiedlich sein kann.


Danke für Eure Hilfe.

Gruß Alelli

PM
  [ Bearbeiten ]  [ Zitieren ]
X

Box per Koordinaten in Quark7.5 ansprechen

Hans Haesler
  
Beiträge gesamt: 5826

11. Mai 2009, 13:52
Beitrag # 2 von 8
Beitrag ID: #423051
Bewertung:
(3739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Alelli,

und das Script? "Kennt" es diese Box auch?

Es genügt, wenn die Box ausgewählt ist. Dann kann das Script die Position der Ränder speichern, daraus die Position der Bildbox ausrechnen und diese dann ansprechen.

Ist die Bildbox immer im selben Abstand zur Textbox? Welche Ecke der Textbox ist der Bezugspunkt?

Gruss, Hans


als Antwort auf: [#423050]

Box per Koordinaten in Quark7.5 ansprechen

Alelli
Beiträge gesamt: 20

11. Mai 2009, 14:37
Beitrag # 3 von 8
Beitrag ID: #423052
Bewertung:
(3739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

das Script kennt die Textbox und ausgehend von der linken oberen Ecke der Textbox mit y Abstand - 2 mm muss eine Bildbox sitzen.

Ich kenne zwar eine Position in der Bildbox jedoch kenne aber nicht die Startkoordinaten der Bildbox.

Ich könnte jetzt jede Bildbox gegen rechnen um zu Prüfen ob diese Koordinaten passen könnten aber ich denke es gibt bestimmt eine einfachere Lösung um die Bildbox zu erkennen.


Danke.

Gruß Alelli


als Antwort auf: [#423050]

Box per Koordinaten in Quark7.5 ansprechen

Hans Haesler
  
Beiträge gesamt: 5826

11. Mai 2009, 14:55
Beitrag # 4 von 8
Beitrag ID: #423053
Bewertung:
(3739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Alelli,

am einfachsten gelingt das Ansprechen von Bildboxen, wenn sie beim Erzeugen (oder nachträglich) benannt worden sind.

Wenn alleine über Koordinaten die entsprechende Box aufgespürt werden soll, dann müssen – in der Tat – die vorhandenen mit einer Schleife nacheinander abgefragt werden. Die Schleife kann verlassen werden, sobald eine Übereinstimmung gefunden wird.

Ich verstehe die Aufgabe noch nicht ganz. Hast Du ein Script, welches die Textboxen einer Seite abklappert und bei jeder die passende Bildbox finden soll?

Ich werde heute Abend versuchen, eine Lösung zu entwickeln.

Gruss, Hans


als Antwort auf: [#423050]

Box per Koordinaten in Quark7.5 ansprechen

Alelli
Beiträge gesamt: 20

11. Mai 2009, 15:08
Beitrag # 5 von 8
Beitrag ID: #423054
Bewertung:
(3739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

genau das ist die Aufgabe, ich benötige zu der Textbox den dazugehörigen Bildpfad einer Bildbox.

Danke für Deine Mühe.

Gruß Alelli


als Antwort auf: [#423050]

Box per Koordinaten in Quark7.5 ansprechen

Hans Haesler
  
Beiträge gesamt: 5826

11. Mai 2009, 20:56
Beitrag # 6 von 8
Beitrag ID: #423055
Bewertung:
(3739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Alelli,

zuerst bastelte ich ein Testdokument. Eine Doppelseite (2 mal A4), auf jeder Seite sechs Bildboxen und darunter mit 2 mm Abstand immer eine gleich breite, aber weniger hohe Textbox.

Falls notwendig, stellt das Script die Masseinheiten auf "Millimeter" und die Objektkoordinaten auf "Montagefläche".

Die äussere Schleife geht durch die Montageflächen. Bei jeder wird zuerst die Liste der Bildboxenkoordinaten (d.h. x1 und y2, also die linke untere Ecke) erstellt.

Anschliessend geht eine Schleife durch die Textboxen. Bei jeder werden die Positionen y1 und y1 (= linker oberer Rand) in Bruchzahlen umgewandelt. Weil dadurch die schön geraden Zahlen der Masspalette oft sehr gering kleiner oder grösser sind, muss man beim Vergleichen einen Toleranzwert einsetzen.

Ein Beispiel: Der obere Rand meiner ersten Bildbox beginnt bei "12 mm", die Box ist 60 mm hoch. Der untere Rand ist also bei "72 mm" positioniert.

Der obere Rand der Textbox ist folglich auf "74 mm" plaziert.

Aber beim Umrechnen 'as real' werden daraus 71.999969482422 und 73.999938964844. Ergibt einen Zwischenraum von 1.999969482422.

Wenn man jetzt mit genauen 2 mm käme, dann hätte man keine Übereinstimmung. Deshalb wird horizontal und vertikal mit je einem Minimal- und einem Maximalwert agiert.

Zuerst wird die linke Kante der ersten Textbox gespeichert und 'as real' verwandelt. Die Schleife geht durch die Liste der Bildboxen-Koordinaten. Mit dem automatischen Zähler 'i', aber mit dem Zusatz 'by 2'. Beim ersten Umgang wird der Wert 1 genommen, beim zweiten der Wert 3, dann 5 usw.

Sobald einer dieser Wert innerhalb der Toleranz von plus/minus "1 mm" liegt, wird der dazugehörige Wert (= i+1) genommen. Wenn dieser nicht innerhalb der tolerierten vertikalen Abweichung liegt, dann geht das Script zum nächsten – horizontalen – Wert über.

Falls mal auch der vertikale Wert in Ordnung ist, wird ein Handler aufgerufen, welcher den Pfad des Bildes auszieht und zurückschickt. Dieses Ergebnis wird in die Textbox eingesetzt und das Script adressiert die nächste.

Die Textboxschleife läuft rückwärts (= by -1). Dadurch wird die Befüllung von links nach rechts und oben nach unten vollzogen (weil meistens die vorderste Box unten rechts liegt).

Code
tell document 1 of application "QuarkXPress 7.5" 
activate

-- Masseinheiten und Objektkoordinaten speichern und prüfen
-- wenn nicht "Millimeter" und "Montagefläche", dann ändern
set isc to 0
set mes to 0
set {vMes, hMes} to {vertical measure, horizontal measure}
if vMes is not millimeters or hMes is not millimeters then
  set mes to 1
end if
if item spread coords is false then set isc to 1
if isc is 1 and mes is 1 then
  set properties to ¬
  {vertical measure:millimeters, horizontal measure:millimeters ¬
    , item spread coords:true}
else if isc is 0 and mes is 1 then
  set properties to {vertical measure:millimeters, horizontal measure:millimeters}
else if isc is 1 and mes is 0 then
  set item spread coords to true
end if

-- eine Schleife durch die Montageflächen
repeat with s from 1 to count of spreads
  set posList to {}
  tell spread s
  -- die Koordinaten der Bildboxen auflisten
  repeat with p from 1 to count of picture boxes
    tell picture box p
    set {y1, x1, y2, x2} to bounds as list
    set end of posList to x1 as real
    set end of posList to y2 as real
    end tell
  end repeat
  -- eine Schleife durch die Textboxen
  repeat with t from (count of text boxes) to 1 by -1
    tell text box t
    -- die Positionen der Ränder
    set {y1, x1, y2, x2} to bounds as list
    set y1 to y1 as real
    set x1 to x1 as real
    -- eine Schleife durch die Liste der Bildboxen-Koordinaten
    repeat with i from 1 to count of posList by 2
      -- das aktuelle Element der Liste
      set curItem1 to item i of my posList
      -- die Werte vergleichen
      -- wenn X und Y passen, den Bildpfad holen und einsetzen
      if curItem1 is greater than (x1 - 1) and curItem1 is less than (x1 + 1) then
      set curItem2 to item (i + 1) of my posList
      if curItem2 is greater than (y1 - 3) and curItem2 is less than (y1 - 1) then
        set filePath to my getFilePath(s, (i + 1) / 2)
        tell paragraph 1
        set contents to filePath
        end tell
        exit repeat
      end if
      end if
    end repeat
    end tell
  end repeat
  end tell
end repeat

-- Masseinheiten und Objektkoordinaten:
-- Die ursprüngliche Einstellung wiederherstellen
if mes = 1 then
  if isc = 0 then
  set properties to {vertical measure:vMes, horizontal measure:hMes}
  else if isc = 1 then
  set properties to ¬
    {vertical measure:vMes, horizontal measure:hMes, item spread coords:false}
  end if
else if mes = 0 then
  if isc = 1 then
  set item spread coords to false
  end if
end if

display dialog "Fertig." buttons "OK" default button 1 with icon 1 giving up after 1

end tell

-- der Handler, welcher den aktuellen Bildpfad auszieht und zurückschickt
on getFilePath(s, ctr)
set filePath to ""
tell document 1 of application "QuarkXPress 7.5"
  tell spread s
  try
    set filePath to (file path of image 1 of picture box ctr) as Unicode text
  end try
  end tell
end tell
return filePath
end getFilePath


Gruss, Hans


als Antwort auf: [#423050]

Box per Koordinaten in Quark7.5 ansprechen

Alelli
Beiträge gesamt: 20

12. Mai 2009, 14:33
Beitrag # 7 von 8
Beitrag ID: #423056
Bewertung:
(3739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

ich habe getested und bis auf eine kleine Anpassung
funktioniert es.

Geändert habe ich

<code>

tell picture box p
    set {y1, x1, y2, x2} to bounds as list
    set end of posList to x1 as real
    set end of posList to y2 as real
in
  set obnds to bounds as list
  set theLeft to (coerce item 2 of obnds to real)
  set thebottom to (coerce item 3 of obnds to real)
  set end of posList to theLeft as real
  set end of posList to thebottom as real
</code>

Das gleiche habe ich für die Koordinaten der Text Boxen auch gemacht.

Recht herzlichen Dank für deine Mühe.

Gruß Alelli


als Antwort auf: [#423050]

Box per Koordinaten in Quark7.5 ansprechen

Hans Haesler
  
Beiträge gesamt: 5826

13. Mai 2009, 19:16
Beitrag # 8 von 8
Beitrag ID: #423057
Bewertung:
(3739 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Alelli,

bitteschön. Hätte nie gedacht, dass es (fast) auf Anhieb klappen wird.

Also ... wenn Du 'coerce' benutzen musst, dann macht es den Anschein als ob QuarkXPress unter Leopard (und Intel) laufen würde.

Aufruf an alle: Bitte immer vollständige Angaben über die Umgebung machen. Dann kann eine Lösung gezielter entwickelt werden.

Gruss, Hans


als Antwort auf: [#423050]
X