hilfdirselbst.ch
Facebook Twitter gamper-media
Mac OS X enthält verschiedene integrierte Werkzeuge und Technologien, mit denen sich gängige Aufgaben schnell und einfach automatisieren lassen.
Gast
Beiträge: 125
27. Mai 2003, 12:23
Beitrag #1 von 5
Bewertung:
(859 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

sortierte Liste


:(
Hallo Skripter,

ich hoffe Ihr könnt mir bei folgendem Problem helfen:

Ich will auf einer bestimmten Seite in QuarkXPress (4er) die Reihenfolge der Textrahmen von oben nach unten bestimmen.

Dachte ich könnte dies mit folgendem Befehl tun:
set Liste to top of bounds of every text box

Was ich aber bekomme ist folgende Liste:
{"238,5 mm", "164 mm", "110,885 mm", "99 mm", "96,395 mm", "32,871 mm", "54,206 mm", "61,838 mm", "16,134 mm", "23,16 mm", "-2,765 mm", "5 mm", "16,342 mm", "284,942 mm", "287,411 mm"}

Gibt es nun eine Möglichkeit diese Werte der Größe nach zu sortieren?

oder

Gibt es eine Möglichkeit per AS die Reihenfolge von Rahmen von oben nach unten zu bestimmen?

(Grundidee: die Zusammenfassung von Textrahmen in ihrer logischen Reihenfolge)

Vielen Dank schon mal für Eure Tipps!

Andreas Top
 
X
Hans Haesler  M  p
Beiträge: 5414
27. Mai 2003, 16:36
Beitrag #2 von 5
Beitrag ID: #418166
Bewertung:
(858 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

sortierte Liste


Hallo Andreas,

schaust Du immer so grimmig drein? ;-)

Bevor man Deine Liste sortieren kann, müssen die Elemente in Zahlen verwandelt werden. Dann kann man sie mit einer
der vielen Sortierungs-Routinen der Grösse nach sortieren. Aber dies hilft Dir überhaupt nicht weiter. Besser ist,
den Index der Boxen einzubeziehen, also eine Liste von Listen aufstellen und das Sortieren nach dem Element 'top of
bounds' vorzunehmen.

Das gelingt aber nicht mit der Formulierung '... every text box...'. Man muss eine leere Liste initialisieren und dann
mit einer Wiederholungsschleife die Boxen eine nach der anderen abfragen und bei jeder den Wert des Zählers und des
'top of bounds' an die Liste anhängen. Bei dieser Gelegenheit kann man auch die Umwandlung in einen Bruch vornehmen.

Das Ergebnis sieht dann etwa so aus:
Code
{{1, 238.5}, {2, 164.0}, {3, 110.884994506836}}"

Diese Liste von Listen wird mit einer komplizierten Routine nach dem zweiten Wert jedes Elements sortiert:
Code
{{3, 110.884994506836}, {2, 164.0}, {1, 238.5}}"

Dann kann man das Ergebnis benutzen und den ersten Wert jedes Elements zum Ansprechen der Boxen benutzen.
Der Zähler der Repeat-Schleife ist 'k'. Der Wert von 'k' beim ersten Durchgang ist 1. Demnach ist 'item k of boxList' das erste
Element der sortierten Liste und das 'item 1' davon ist der Index der entsprechenden Box.
Code
tell text box (item 1 of (item k of my boxList))

Zuerst kommt die Box 3 an die Reihe, dann die 2 und zum Schluss die 1.

---
tell document 1 of application "QuarkXPress 4.11"
  set boxRefs to {}
  tell page 1
    repeat with i from 1 to count of text boxes
      set end of boxRefs to {i, (top of bounds of text box i as real)}
    end repeat
    if boxRefs is not {} then
      -- die Liste nach Position sortieren
      set boxList to my sortList(1, count of items of boxRefs, boxRefs, 2)
      -- ... dann die Boxen der Reihe nach abarbeiten
      repeat with k from 1 to (count of items of boxList)
        tell text box (item 1 of (item k of my boxList))
          --
          -- hier Aktionen einfügen, z.B.:
          set y1 to top of bounds
          display dialog y1
          --
        end tell
      end repeat
    end if
  end tell
end tell

on sortList(startWith1, itemCount, aList, elementToSortOn)
  set leftCounter to startWith1
  set rightCounter to itemCount
  set midItem to item elementToSortOn of (item ((startWith1 + itemCount) div 2) of aList)
  repeat until rightCounter <= leftCounter
    repeat while item elementToSortOn of (item leftCounter of aList) < midItem
      set leftCounter to leftCounter + 1
    end repeat
    repeat while item elementToSortOn of (item rightCounter of aList) > midItem
      set rightCounter to rightCounter - 1
    end repeat
    if leftCounter <= rightCounter then
      set astore to item leftCounter of aList
      set item leftCounter of aList to item rightCounter of aList
      set item rightCounter of aList to astore
      set leftCounter to leftCounter + 1
      set rightCounter to rightCounter - 1
    end if
  end repeat
  if startWith1 < rightCounter then
    my sortList(startWith1, rightCounter, aList, elementToSortOn)
  end if
  if itemCount > leftCounter then
    my sortList(leftCounter, itemCount, aList, elementToSortOn)
  end if
  return aList
end sortList
---

HTH (= Hope This Helps = hoffe, dass dies hilft :-)

Hans Haesler, hsa@ringier.ch
als Antwort auf: [#418165] Top
 
Anonym
Beiträge: 22827
12. Jun 2003, 12:31
Beitrag #3 von 5
Beitrag ID: #418167
Bewertung:
(858 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

sortierte Liste


:D

Hallo Hans,

vilen Dank für die Mühe.
Hab' es jetzt erst gesehen! Wow!
Damals hat's so bressiert, weshalb ich die Werte nach FileMaker übernommen habe und sie dort sortiert habe. Geht auch, da ich immer mit FileMaker die Lösungen laufen lasse.
Aber: Deine ist natürlich phänomenal!

Vielen Dank!
als Antwort auf: [#418165] Top
 
Anonym
Beiträge: 22827
12. Jun 2003, 12:34
Beitrag #4 von 5
Beitrag ID: #418168
Bewertung:
(858 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

sortierte Liste


die "1,", "2," etc. dienen wohl dazu, dass Problem der amerikanischen Zahlenformatierung zu umgehen, oder?
als Antwort auf: [#418165] Top
 
Hans Haesler  M  p
Beiträge: 5414
12. Jun 2003, 13:20
Beitrag #5 von 5
Beitrag ID: #418169
Bewertung:
(858 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

sortierte Liste


Hallo Andreas,

ja, so gefällst Du mir besser. ;-)

Nein, die "1,", "2," etc. sind die Indizes der Boxen. Auf einer XPress-Seite ist jede Box auf einer eigenen Ebene.
Jede hat einen Index. Die "oberste" Box hat den Index '1'. Wenn ein Script die Boxen mit einer Repeat-Schleife durchgeht ...
Code
repeat with i from 1 to count of text boxes

... dann wird beim ersten Umgang die oberste Box adressiert, weil der Zähler 'i' den Wert '1' hat.

Wenn diese Indizes aber sortiert werden können, indem dem Script ein anderes Kriterium gegeben wird - nämlich den Wert von
'top of bounds' - können die Boxen "der Reihe nach" abgearbeitet werden.

Hans Haesler, hsa@ringier.ch
als Antwort auf: [#418165] Top
 
X