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.
Anonym
Beiträge: 22827
6. Sep 2003, 14:47
Beitrag #1 von 5
Bewertung:
(1055 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Status - box overflows - funktioniert nur bei......, warum?


Hi Scripter,

ich habe in meinem Script einen Teil, der die Textrahmen auf Überlauf prüft und diese dann erweitert. Leider habe ich feststellen müssen, das der Überlauf nur korrekt geprüft wird, wenn auch die Seite mit den Rahmen aktuell im Fenster angezeigt wird. So wird die Seite 2 nicht richtig geprüft, wenn nur die Seite 1 im Fenster zu sehen ist. Warum? Kann man das umgehen? Ich habe nun immer ein "show" eingebaut, um die zu prüfende Seite anzuzeigen, jedoch wird dadurch das Script erheblich langsamer. Wer weiß Rat oder hat eine Idee?

if box overflows of text box 1 of page 1 of document 1 is false then
--funktioniert nur, wenn auch die Seite 1 aktuell angezeigt wird. Wird ein anderer Druckbogen angezeigt, erhalte ich nicht das richtige Ergebnis.

happy filemaking

Armin Top
 
X
Hans Haesler  M  p
Beiträge: 5533
6. Sep 2003, 21:41
Beitrag #2 von 5
Beitrag ID: #418284
Bewertung:
(1054 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Status - box overflows - funktioniert nur bei......, warum?


Hi Armin,

bis noch vor kurzem hätte ich gesagt: nichts zu machen. Damit muss man leben.

Der Grund: QuarkXPress ist auf Geschwindigkeit getrimmt. Dies wurde erreicht dass – zum Beispiel – die Flächen ausserhalb des Bildschirm-Ausschnittes nicht aufgefrischt werden. Deshalb ist die Information, welche den "Overflow" betrifft nicht zuverlässig, wenn die adressierte Box ausserhalb des Blickfeldes liegt. Nach dem Motto: "Aus den Augen, aus dem Sinn."

Dieser "Nachteil" ist nur dann ärgerlich, wenn die Ausführung eines Script gebremst wird. Aber das manuelle Verschieben des Fensterinhaltes geht äusserst flüssig vonstatten. Was man beim Konkurrenzprodukt nicht sagen kann...

Aber es gibt Hoffnung! Mit "nicht zuverlässig" meine ich, dass ein Script korrekte Resultate liefern kann. Aber schon beim nächsten Mal versagt es wieder. Abhilfe: Es genügt, vor dem Abspielen des Scripts, durch das Dokument zu scrollen. Wenn es manuell zu mühsam ist, kann es auch per Script geschehen. Der folgende Code demonstriert wie. Zum Beschleunigen der Ausführung wird der Turbolader "do script" eingesetzt. 

Das Script enthält zwei Scriptobjekte. Das erste – 'refreshScreen' – geht die "Spreads" durch, zeigt jeden an und erzwingt die Auffrischung (mit 'do updates'). Das zweite – 'getOverflow' – inkrementiert den Zähler 'ctr' wenn eine überfliessende Box gefunden wird. Diese beiden Objekte müssen im Code definiert sein, bevor sie mit 'do script' aufgerufen werden.

Der Start des Scripts ist demnach in der zweiten Hälfte. Das momentane Anzeigeprozent und die aktuelle Seite werden gespeichert. Dann wird die Bildschirmanzeige auf "Arbeitsfläche" eingestellt. Das erste Scriptobjekt wird aufgerufen. Es frischt den Zustand des ganzen Dokuments auf. Dann ist es bereit, mit dem zweiten Scriptobjekt die Informationen über eventuellen Textüberfluss zu liefern. Am Schluss wird – anwenderfreundlich – das ursprüngliche Anzeigeprozent wieder eingestellt und die aktuelle Seite angezeigt. Ein Dialog informiert über die Anzahl Textüberflüsse.
---
script refreshScreen
  tell document 1 of application "QuarkXPress 4.11"
    repeat with i from 1 to count of spreads
      show spread i
      do updates
    end repeat
  end tell
end script

script getOverflow
  set ctr to 0
  tell document 1 of application "QuarkXPress 4.11"
    repeat with i from 1 to count of stories
      tell story i
        if box overflows of text box -1 then
          set ctr to ctr + 1
        end if
      end tell
    end repeat
  end tell
  return ctr
end script

tell document 1 of application "QuarkXPress 4.11"
  activate
  set vScale to view scale
  set curPage to current page
  set view scale to fit spread in window
  do script {refreshScreen}
  set ctr to do script {getOverflow}
  set view scale to vScale
  show curPage
  if ctr = 0 then
    display dialog "Keine überfliessende Boxen." buttons "OK" default button 1 with icon 1
  else
    display dialog "Überfliessende Boxen:  " & ctr buttons "OK" default button 1 with icon 1
  end if
end tell
---
Diese "Technik" habe ich erst im Mai dieses Jahres entwickelt. Ich hoffe, dass sich dieses Script an Deine Bedürfnisse anpassen lässt.

Hans Haesler <hsa@ringier.ch>
als Antwort auf: [#418283] Top
 
Anonym
Beiträge: 22827
6. Sep 2003, 21:55
Beitrag #3 von 5
Beitrag ID: #418285
Bewertung:
(1054 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Status - box overflows - funktioniert nur bei......, warum?


Hallo Hans,

vielen Dank für den Tipp, doch leider kann ich es nicht ganz umsetzen, da ich den Status bereits im Script benötige. Ich ändere die Größe der Textbox und muß dann prüfen ob ein Überlauf vorhanden ist. Wenn ja, wird immer um 1 pt nach unten vergrößert, bis es keinen Overflow mehr gibt. Es ist also in eine kurze Schleife eingebunden. Ich habe es jetzt so gelöst, das ich den Textrahmen immer vorher anzeigen lasse. Der "show" Befehl hilft mir dabei.

tell text box 1
    show
end tell

Leider ist das ganze nicht so schnell - aber es funktioniert einwandfrei. Nicht alle Lösungen sind damit möglich - unter 4.11 kann ich es in dem "do script" Befehl nicht nutzen - unter 5.0 allerdings ohne Probleme. Unter 4.11 muß ich mir die Textrahmenänderung immer mit ansehen - und das dauert! Der Rechner kann ja auch eine Weile laufen bei ca. 500 Seiten.

happy filemaking

Armin
als Antwort auf: [#418283] Top
 
Hans Haesler  M  p
Beiträge: 5533
7. Sep 2003, 09:45
Beitrag #4 von 5
Beitrag ID: #418286
Bewertung:
(1054 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Status - box overflows - funktioniert nur bei......, warum?


Hallo Armin,

ja, mein Vorschlag war für den Fall gedacht, dass ein Dokument überprüft werden muss. Statt nur zu zählen, könnte man die Objektreferenzen der Boxen sammeln und sie dann gezielt behandeln.

Aber wenn Du die Boxen in der Schleife (in welcher sie mit Text gefüllt werden) anpassen willst, dann muss man anders vorgehen. Übrigens... den "show"-Befehl kann man auch so schreiben:
Code
show text box 1 

Ich verstehe nicht ganz, weshalb die "do script"-Methode unter 4.11 nicht funktioniert. Im übrigen kann die Ausführung sicher optimiert werden. Die "Bremse" ist die 1-Punkt-Schritt-Vergrösserung. Hier zwei Vorschläge.

1) Beginne mit einer Grob-Anpassung in 10-Punkt-Schritten. Sobald kein Überlauf mehr ist, mit 1-Punkt-Schritten verkleinern. Zuletzt wieder einen Punkt zugeben.
---
tell document 1 of application "QuarkXPress 4.11"
  activate
  set vertical measure to points
  tell text box 1
    repeat while box overflows
      set height of bounds to (height of bounds as real) + 10
    end repeat
    repeat until box overflows
      set height of bounds to (height of bounds as real) - 1
    end repeat
    set height of bounds to (height of bounds as real) + 1
  end tell
end tell
---

2) Definiere die Höhe der Box übertrieben gross. So dass es keinen Überlauf geben kann. Nach dem Füllen mit Text wird die Position der untersten Zeile festgestellt. Und die Höhe der Box wird gezielt ausgerechnet: "baseline" plus "Fleisch". Dieser Wert für die Distanz von der Schriftlinie bis zum Boxenrand muss je nach Schrift und Grösse angepasst werden.
---
tell document 1 of application "QuarkXPress 4.11"
  activate
  tell page 1
    tell text box 1
      tell story 1
        set basePos to ((baseline of line -1) as real)
      end tell
      set height of bounds to basePos + 1.2
    end tell
  end tell
end tell
---
Für dieses zweite Beispiel gilt wieder die Masseinheit "millimeters". Der Zugabewert entspricht einer "Helvetica Neue" in 12 pt. Es muss auch die Rahmenstärke und ein eventueller Textabstand berücksichtigt werden. Achtung: nicht zu knapp einstellen! Lieber einen Zehntel als "Sicherheit" zugeben.

Wetten, dass der Unterschied bei 500 Seiten spürbar wird? :-)

Hans Haesler <hsa@ringier.ch>
als Antwort auf: [#418283] Top
 
Anonym
Beiträge: 22827
7. Sep 2003, 12:02
Beitrag #5 von 5
Beitrag ID: #418287
Bewertung:
(1054 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen

Status - box overflows - funktioniert nur bei......, warum?


Zitat von Hans Haesler ja, mein Vorschlag war für den Fall gedacht, dass ein Dokument überprüft werden muss. Statt nur zu zählen, könnte man die Objektreferenzen der Boxen sammeln und sie dann gezielt behandeln.

Das mache ich bereits - ich hole mir die Referenzen der Textboxen "set xTBref to object reference of every text box of spread...." Die werden dann abgearbeitet. Die Textboxen sind bereits vorhanden und bereits mit Text gefüllt - meine Aufgabe ist nur, die Breite anzupassen und bei Überlauf den Textrahmen nach unten zu vergrößern.

Zitat von Hans Haesler Aber wenn Du die Boxen in der Schleife (in welcher sie mit Text gefüllt werden) anpassen willst, dann muss man anders vorgehen. Übrigens... den "show"-Befehl kann man auch so schreiben:
---
show text box 1
---

Der tell text box 1 Block wurde wieder bereinigt dargestellt - da folgen in meinem Script noch andere Befehle (properties, bounds, tab list, usw...). Daher diese Schreibweise.
Dein Tipp mit der Gesamtanzeige ist aber besser, da das Dokument am Bildschirm nicht immer wieder neu aufgebaut werden muß. Das ist dann auch wieder besser und schneller als meine direkte Textbox-Anzeige.

Zitat von Hans Haesler Ich verstehe nicht ganz, weshalb die "do script"-Methode unter 4.11 nicht funktioniert.

Ich leider auch nicht - der PowerBooster "do script" beschleunigt das ganze erheblich. Das ganze wurde richtig in einen Handler gepackt und läuft mit diesem Handler unter 4.11/5.0. Als "do script" leider nur unter 5.0. Der Handler beeinhaltet nur die Prüfung "box overflows" und die Erweiterung um jeweils einen Punkt.

Zitat von Hans Haesler Im übrigen kann die Ausführung sicher optimiert werden. Die "Bremse" ist die 1-Punkt-Schritt-Vergrösserung. Hier zwei Vorschläge.

1) Beginne mit einer Grob-Anpassung in 10-Punkt-Schritten. Sobald kein Überlauf mehr ist, mit 1-Punkt-Schritten verkleinern. Zuletzt wieder einen Punkt zugeben.
2) Definiere die Höhe der Box übertrieben gross. So dass es keinen Überlauf geben kann. Nach dem Füllen mit Text wird die Position der untersten Zeile festgestellt. Und die Höhe der Box wird gezielt ausgerechnet: "baseline" plus "Fleisch". Dieser Wert für die Distanz von der Schriftlinie bis zum Boxenrand muss je nach Schrift und Grösse angepasst werden.
Wetten, dass der Unterschied bei 500 Seiten spürbar wird? :-)

Vielen Dank für die Tipps - werden gleich mal umgesetzt. Die Geschwindigkeit war erst einmal zweitrangig - ich wollte eine Lösung für das Problem finden und bin dabei auf den Befehl "show" gestossen - wollte aber wissen, ob das bekannt ist und es einen anderen Lösungsweg gibt, als das Dokument anzeigen zu lassen.

happy filemaking

Armin
als Antwort auf: [#418283] Top
 
X