[GastForen Programmierung/Entwicklung AppleScript Script, das %-Größen von Bildern anzeigt

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

Script, das %-Größen von Bildern anzeigt

Roderix
Beiträge gesamt: 53

18. Sep 2008, 12:13
Beitrag # 1 von 21
Bewertung:
(3034 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Forum!

Ich suche ein Script, das die Prozent-Größen eingebauter Bilder eines InDesign-Dokumentes abfragt. Bilder sollen nicht mit weniger als 70% und nicht mit mehr als 125% verwendet werden.
Es wäre also schön, wenn bei Anwendung über allen Bildern, deren Prozent-Größe nicht in diesem Bereich liegt, ein Textfeld erstellt würde, das den verwendeten Prozentwert und den jeweiligen Bildnamen anzeigt.

Wichtig wäre ansonsten noch, dass eingebaute Vektor-Grafiken ignoriert werden, also nur pixelbasierte Bilder (= auflösungsabhängige Bilder) markiert werden.

Sowas gibt es doch sicher schon irgendwo im Web?

Ach so: Ideal wäre es, wenn die Hinweise auf einer Extra-Ebene angelegt würden und man deren Text- und Hintergrundfarbe festlegen könnte, z.B. gelber Text in magenta-farbenem Feld.

Danke für Hinweise,
Roderix
X

Script, das %-Größen von Bildern anzeigt

Hans Haesler
  
Beiträge gesamt: 5826

18. Sep 2008, 14:28
Beitrag # 2 von 21
Beitrag ID: #422615
Bewertung:
(3033 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roderix,

ob es sowas im Web gibt, weiss ich nicht. Aber ich habe für unsere Produktion solch ein Script geschrieben. Auf einer Extra-Ebene wird ein Textrahmen für jedes Bild erzeugt, dessen Prozentwerte ausserhalb der gegebenen Spanne liegen.

Für Deine  Zwecke müsste ich "nur" den Namen des Bildes einfügen. Und zwei Ausnahmebedingungen, welche den Dateipfad betreffen, entfernen.

Aber es handelt sich um ein JavaScript. Deshalb werde ich es zugleich nach AppleScript portieren.

Welche Version von InDesign verwendest Du?

Gruss, Hans


als Antwort auf: [#422614]

Script, das %-Größen von Bildern anzeigt

Roderix
Beiträge gesamt: 53

18. Sep 2008, 16:48
Beitrag # 3 von 21
Beitrag ID: #422616
Bewertung:
(3033 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans!

Das klingt sehr interessant.
Wir verwenden i.d.R. InDesign CS2, für einige Jobs auch CS3.

Könnte eine nachträgliche Anpassung ein Problem werden? Scripte, bei denen ich die "application" bisher änderte liefen einwandfrei erst unter CS2 und dann unter CS3.

Grüße, Roderix


als Antwort auf: [#422614]

Script, das %-Größen von Bildern anzeigt

Hans Haesler
  
Beiträge gesamt: 5826

19. Sep 2008, 21:29
Beitrag # 4 von 21
Beitrag ID: #422617
Bewertung:
(3033 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roderix,

das Ändern von CS2 zu CS3 im Befehl tell application "Adobe InDesign CS2" ist nicht notwendig. Denn dieser Wechsel geschieht automatisch, je nachdem, welche Version von InDesign läuft, wenn das Script geöffnet wird.

Damit ein CS2-Script auch mit CS3 problemlos läuft, hängt von den verwendeten Befehlen ab. Viele sind gleich geblieben = kein Problem. Einige sind geändert worden. Ergebnis: Entweder eine Fehlermeldung oder aber nicht das Erwartete. In diesem Fall muss der Scriptcode angepasst werden.

Nachstehend eine erste Version des Scripts. Achtung: Problembilder, welche verankert oder gruppiert sind, werden zwar gemeldet, aber nicht gekennzeichnet.

Das Ausklammern von Vektorbildern geschieht mit dem Versuch, die aktuellen ppi-Werte festzustellen. Mit einer Illustrator-Datei wird dabei eine Fehlermeldung generiert und die restlichen Befehle des aktuellen Schleifendurchgangs werden nicht ausgeführt.
Code
tell application "Adobe InDesign CS2" 
activate
-- testen, ob ein Dokument geöffnet ist
if not (exists document 1) then
  display dialog "Bitte ein InDesign-Dokument öffnen." buttons ¬
  "OK" default button 1 with icon 0
  error number -128
end if

tell document 1
  -- die aktive Ebene feststellen, damit diese am Schluss
  -- wieder aktiviert werden kann
  set actLayer to active layer of layout window 1
  if name of actLayer is "Bildprozente" then
  repeat with i from (count of layers) to 1 by -1
    if name of layer i is not "Bildprozente" then
    set actLayer to layer i
    exit repeat
    end if
  end repeat
  end if
 
  -- prüfen, ob die Extra-Ebene existiert ...
  if exists layer "Bildprozente" then
  try
    -- wenn ja, sichtbar machen, die Objekte entsperren und entfernen
    set properties of layer "Bildprozente" to {visible:true, locked:false}
    set locked of every page item of layer "Bildprozente" to false
    delete every page item of layer "Bildprozente"
  end try
  -- ... sonst eine erzeugen
  else
  set idLayer to make layer with properties {name:"Bildprozente"}
  end if
  -- die Ebene zur aktiven bestimmen
  set targetLayer to layer "Bildprozente"
  set active layer of layout window 1 to targetLayer
 
  -- eine Variable initialisieren
  set probCtr to 0
 
  -- die Vorgaben anpassen
  set zeroPoint to zero point
  if zeroPoint is not {0.0, 0.0} then set zero point to {0.0, 0.0}
  tell view preferences
  set rulerOrigin to ruler origin
  if rulerOrigin is not page origin then set ruler origin to page origin
  end tell
 
  if saved is false then
  display dialog "Bitte zuerst das Dokument speichern." buttons ¬
    "OK" default button 1 with icon 0
  error number -128
  end if
  try
  save
  end try
  set AppleScript's text item delimiters to {":"}
  set allLinks to every link whose needed is true
  -- eine Schleife durch die Links
  repeat with i from 1 to count of allLinks
  set curLink to (item i of my allLinks)
  set curProps to properties of (parent of curLink)
  try
    -- das Prüfen des aktuellen PPI-Wertes generiert einen Fehler, wenn ein
    -- Vektorbild adressiert wird
    set actPPI to actual ppi of curProps
    -- die Bildprozentwerte speichern ...
    set hScale to horizontal scale of curProps
    set vScale to vertical scale of curProps
    -- ... und prüfen
    if hScale is less than 70 or vScale is less than 70 or ¬
    hScale is greater than 125 or vScale is greater than 125 then
    set probCtr to probCtr + 1
    -- die beiden Werte auf zwei Dezimalstellen runden
    set hScale to (((hScale * 100) + 0.5) div 1) / 100
    set vScale to (((vScale * 100) + 0.5) div 1) / 100
    -- den Namen des Bildes feststellen
    set curPath to (file path of curLink)
    set fileName to text item -1 of curPath
    -- die Position des Bildrahmens speichern
    set curBox to parent of parent of curLink
    set {y1, x1, y2, x2} to geometric bounds of curBox
    set curSpread to parent of curBox
    -- die Textkette zusammensetzen ...
    set curString to fileName & return & "H: " & hScale & "%" & ¬
      return & "V: " & vScale & "%"
    -- ... und den Handler aufrufen, welcher den Rahmen erzeugt
    my makeFrame(curSpread, y1, x1, curString)
    end if
  end try
  end repeat
end tell
-- die ursprünglich aktivierte Ebene auswählen
try
  set active layer of layout window 1 to actLayer
end try
-- das Ergebnis der Aktion melden
if probCtr is 0 then
  display dialog "Keine Problembilder gefunden." buttons ¬
  "OK" default button 1 with icon 1
else if probCtr is 1 then
  display dialog "Ein Problembild gekennzeichnet." buttons ¬
  "OK" default button 1 with icon 2
else if probCtr is greater than 1 then
  display dialog "" & probCtr & " Problembilder gefunden." buttons ¬
  "OK" default button 1 with icon 2
end if
end tell

-- der Handler, welcher die Markierungsrahmen erzeugt
on makeFrame(curSpread, y1, x1, curString)
tell document 1 of application "Adobe InDesign CS2"
  set yellowColor to color "Yellow"
  tell curSpread
  try
    set newFrame to make text frame at beginning with properties ¬
    {geometric bounds:{y1, x1, y1 + 16, x1 + 50}, fill color:¬
      "Magenta", contents:curString}
    tell newFrame
    set inset spacing of text frame preferences to {1, 1, 0, 0}
    tell parent story
      set fill color to yellowColor
    end tell
    end tell
  end try
  end tell
end tell
end makeFrame

Hier funktioniert es gut. Aber ich frage mich, ob anstelle der Bildprozente nicht die effektiven ppi-Werte geprüft werden sollten. Denn eine 72-ppi-Datei wird bei einer Bildgrösse von 124% nicht angemeckert, obwohl die effektiven 58 ppi ziemlich sicher "auffallen" werden.

Gruss, Hans


als Antwort auf: [#422614]

Script, das %-Größen von Bildern anzeigt

Roderix
Beiträge gesamt: 53

23. Sep 2008, 09:38
Beitrag # 5 von 21
Beitrag ID: #422618
Bewertung:
(3033 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans!

Vielen Dank!
Das Script erfüllt bereits zu 85% unsere kühnsten Erwartungen.

Hier ein paar Anmerkungen:

- Generell ist ein Script, das die effektiven ppi-Werte ausgibt sicher empfehlenswerter. Bei unserem speziellen Workflow durchlaufen die Dokumente aber sowieso einen PitStop-Check, bei dem grobe PPI-Abweichungen bereits herausgefilter werden. Die Prozentwerte sollen darüberhinaus helfen, Feinheiten wie z.B. Moirés, etc. zu vermeiden, bevor ein Proof erstellt wird.

- Mit "verankerten" Bildern meinst Du "eingebettete" Bilder? Wir arbeiten kaum mit eingebetteten Bildern, aber viel mit Gruppierungen. Ist es möglich, dass dies Bilder auch markiert werden?

- Bei meinen Tests hatte ich ein Dokument, in dem die Meldung "4 Problemfälle sind aufgetreten." erschien, obwohl nur zwei Bilder markiert wurden. Den Grund dafür konnte ich nicht herausfinden. Bei anderen Dokumente entsprach die Anzahl der Markierungen immer der Zahl in der Meldung.

- Ist es möglich, dass die Texte in den Hinweisen immer eine Punktgröße von z.B. 7pt oder 8pt bekommen? In unterschiedlichen Dokumenten wurden unterschiedliche Punktgrößen generiert. In einem sogar 28pt, wobei der Text zu groß für das erstellte Textfeld wurde.

- Ist es möglich, dass horizontaler und vertikaler Prozentwert in einer Zeile geschrieben werden?

- Zu guter Letzt: Mir ist aufgefallen, dass das InDesign-Dokument während das Script abläuft, gesichert wird. Ist das nowendig? Wenn jemand das nicht weiß, könnte es passieren, dass er nach dem Ablauf des Scriptes zur zuletzt gesicherten Version zurückkehren möchte, und die Version, die er sich wünscht, dann durch das Script übersichert worden ist.

Gruß, Roderix


als Antwort auf: [#422614]

Script, das %-Größen von Bildern anzeigt

Hans Haesler
  
Beiträge gesamt: 5826

26. Sep 2008, 20:33
Beitrag # 6 von 21
Beitrag ID: #422619
Bewertung:
(3033 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roderix,

ich war im Urlaub. Deshalb meine verspätete Antwort.

Zu Deinen Bemerkungen und Fragen:

– Mit "verankerten" Bildern meine ich ... verankerte Bilder. Also Bildrahmen, welche ein Bild enthalten und im Textfluss verankert mitschwimmen. "Eingebettet" ist etwas anderes. Und solche Bilder werden problemlos markiert. Aber wie schon gesagt, gruppierte Bilder werden mit der ersten Version des Scripts nicht markiert.

– Schwierig, so aus der Ferne zu sagen, weshalb mehr Probleme gemeldet werden, als Bilder markiert sind. Da sollte ich schon das betreffende Dokument untersuchen können.

– Die unterschiedliche Formatierung der Markierungstexte hängt mit der ärgerlichen Anwenderfreundlichkeit von InDesign zusammen: Wenn der Anwender eine Einstellung vornimmt, ohne dass Text ausgewählt ist, wird diese Formatierung als Vorgabe für spätere Textimporte definiert. Dagegen hilft entweder das Speichern der Textvorgaben, damit man sie nach dem Formatieren der Markierung wieder zurücksetzen kann. Oder das Anlegen eines Absatzformates. Beides ist sehr aufwendig und keine Garantie für ein brauchbares Ergebnis. Es sei denn, man decke alle Attribute ab.

– Die beiden Prozentwerte in eine Zeile zu setzen ist kein Problem.

– Wenn das Sichern stört, kann der Befehl dazu weggelassen werden. Man sollte aber kein Script starten, wenn das Zieldokument nicht gesichert ist ...

Im nächsten Beitrag folgt die Version 02 des Scripts. Die Neuerungen:
– gruppierte Bilder werden markiert;
– das Absatzformat "Bildprozente" wird erzeugt und zugewiesen;
– die beiden Prozentwerte werden in dieselbe Zeile gesetzt;
– das Speichern des Dokuments wird nicht mehr verlangt;
– ungesicherte Änderungen werden so belassen.

Gruss, Hans


als Antwort auf: [#422614]

Script, das %-Größen von Bildern anzeigt

Hans Haesler
  
Beiträge gesamt: 5826

26. Sep 2008, 20:33
Beitrag # 7 von 21
Beitrag ID: #422620
Bewertung:
(3033 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Und hier ist das angekündigte Script.

Als Schrift ist "Helvetica Regular" eingestellt. Die Schriftgrösse ist "8 pt" und der Zeilenabstand "10 pt". Alle drei können im Script geändert werden. Aufpassen, dass der Tabulator zwischen Schriftfamilie und Schriftschnitt erhalten bleibt.
Code
tell application "Adobe InDesign CS2" 
activate
-- testen, ob ein Dokument geöffnet ist
if not (exists document 1) then
  display dialog "Bitte ein InDesign-Dokument öffnen." buttons ¬
  "OK" default button 1 with icon 0
  error number -128
end if

tell document 1
  -- die aktive Ebene feststellen, damit diese am Schluss
  -- wieder aktiviert werden kann
  set actLayer to active layer of layout window 1
  if name of actLayer is "Bildprozente" then
  repeat with i from (count of layers) to 1 by -1
    if name of layer i is not "Bildprozente" then
    set actLayer to layer i
    exit repeat
    end if
  end repeat
  end if
 
  -- prüfen, ob die Extra-Ebene existiert ...
  if exists layer "Bildprozente" then
  try
    -- wenn ja, sichtbar machen, die Objekte entsperren und entfernen
    set properties of layer "Bildprozente" to {visible:true, locked:false}
    set locked of every page item of layer "Bildprozente" to false
    delete every page item of layer "Bildprozente"
  end try
  -- ... sonst eine erzeugen
  else
  set idLayer to make layer with properties {name:"Bildprozente"}
  end if
  -- die Ebene zur aktiven bestimmen
  set targetLayer to layer "Bildprozente"
  set active layer of layout window 1 to targetLayer
 
  -- eine Variable initialisieren
  set probCtr to 0
 
  -- die Vorgaben anpassen
  set zeroPoint to zero point
  if zeroPoint is not {0.0, 0.0} then set zero point to {0.0, 0.0}
  tell view preferences
  set rulerOrigin to ruler origin
  if rulerOrigin is not page origin then set ruler origin to page origin
  end tell
 
  -- wenn das Absatzformat "Bildprozente" nicht vorhanden ist, wird es erzeugt
  if not (exists paragraph style "Bildprozente") then
  set yellowColor to color "Yellow"
  make paragraph style with properties {name:¬
    "Bildprozente", applied font:"Helvetica\tRegular", align to baseline:false ¬
    , baseline shift:0, capitalization:normal, drop cap lines:0 ¬
    , fill color:yellowColor, fill tint:-1.0, first line indent:0 ¬
    , horizontal scale:100, justification:left align, last line indent:0 ¬
    , left indent:0, point size:8, leading:10, position:normal, right indent:0 ¬
    , rule above:false, rule below:false, skew:0, strike thru:false ¬
    , stroke color:"None", tracking:0, underline:false, vertical scale:100}
  end if
 
  set AppleScript's text item delimiters to {":"}
  set allLinks to every link whose needed is true
  -- eine Schleife durch die Links
  repeat with i from 1 to count of allLinks
  set curLink to (item i of my allLinks)
  set curProps to properties of (parent of curLink)
  try
    -- das Prüfen des aktuellen PPI-Wertes generiert einen Fehler, wenn ein
    -- Vektorbild adressiert wird und die folgenden Befehle werden nicht ausgeführt
    set actPPI to actual ppi of curProps
    -- die Bildprozentwerte speichern ...
    set hScale to horizontal scale of curProps
    set vScale to vertical scale of curProps
    -- ... und prüfen
    if hScale is less than 70 or vScale is less than 70 or ¬
    hScale is greater than 125 or vScale is greater than 125 then
    set probCtr to probCtr + 1
    -- die beiden Werte auf zwei Dezimalstellen runden
    set hScale to (((hScale * 100) + 0.5) div 1) / 100
    set vScale to (((vScale * 100) + 0.5) div 1) / 100
    -- den Namen des Bildes feststellen
    set curPath to (file path of curLink)
    set fileName to text item -1 of curPath
    -- die Position des Bildrahmens speichern
    set curBox to parent of parent of curLink
    set {y1, x1, y2, x2} to geometric bounds of curBox
    set curPage to parent of curBox
    try
      repeat while class of curPage is group
      set curPage to parent of curPage
      end repeat
    end try
    -- die Textkette zusammensetzen ...
    set curString to fileName & return & "H: " & hScale & ¬
      "% / V: " & vScale & "%"
    -- ... und den Handler aufrufen, welcher den Rahmen erzeugt
    my makeFrame(curPage, y1, x1, curString)
    end if
  end try
  end repeat
end tell
-- die ursprünglich aktivierte Ebene auswählen
try
  set active layer of layout window 1 to actLayer
end try
-- das Ergebnis der Aktion melden
if probCtr is 0 then
  display dialog "Keine Problembilder gefunden." buttons ¬
  "OK" default button 1 with icon 1
else if probCtr is 1 then
  display dialog "Ein Problembild gekennzeichnet." buttons ¬
  "OK" default button 1 with icon 2
else if probCtr is greater than 1 then
  display dialog "" & probCtr & " Problembilder gefunden." buttons ¬
  "OK" default button 1 with icon 2
end if
end tell

-- der Handler, welcher die Markierungsrahmen erzeugt
on makeFrame(curPage, y1, x1, curString)
tell document 1 of application "Adobe InDesign CS2"
  tell curPage
  try
    set newFrame to make text frame at beginning with properties ¬
    {geometric bounds:{y1, x1, y1 + 8, x1 + 50}, fill color:¬
      "Magenta", contents:curString}
    tell newFrame
    set inset spacing of text frame preferences to {1, 1, 0, 0}
    tell parent story
      set applied paragraph style to "Bildprozente"
    end tell
    end tell
  end try
  end tell
end tell
end makeFrame

Gruss, Hans


als Antwort auf: [#422614]

Script, das %-Größen von Bildern anzeigt

Roderix
Beiträge gesamt: 53

5. Okt 2008, 16:55
Beitrag # 8 von 21
Beitrag ID: #422621
Bewertung:
(3033 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans!

Vielen Dank für dieses tolle Script. Es ist sehr zeitsparend im täglichen Gebrauch. (... und lässt keine Wünsche mehr offen).
Selbst der ungeübte User kann die Parameter mit wenig Aufwand den individuellen Anforderungen anpassen.

Der Fall, dass mehr Probleme gemeldet wurden, als tatsächlich vorhanden waren, ist nicht erneut aufgetreten. Ich glaube, dass brauchen wir nicht weiter vertiefen.

Einen kleinen Stolperstein gab's aber noch:
Die gewünschte Schrift (Helvetica Regular) wurde als "nicht installiert" gemeldet, obwohl sie installiert ist. Ich habe verschiedene andere Fonts probiert, die alle nicht erkannt wurden. Erst mit der Arial hat's geklappt. Egal, die ist mir auch recht.

Eine Frage hätte ich noch interessehalber:
Bei der Textfarbe hast Du "yellowColor" angegeben, bei der Box-Farbe "Magenta".
Würde im ersten Fall nicht auch einfach "Yellow" ausreichen?
... und kann man hier auch einen CMYK-Wert eingeben?

Nochmals besten Dank und Grüße,
Roderix


als Antwort auf: [#422614]

Script, das %-Größen von Bildern anzeigt

Hans Haesler
  
Beiträge gesamt: 5826

6. Okt 2008, 07:30
Beitrag # 9 von 21
Beitrag ID: #422622
Bewertung:
(3033 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roderix,

bitteschön.

das Problem mit der Schrift rührt daher, dass im geposteten Code der Tabulator zwischen "Helvetica" und "Regular" durch vier Leerräume ersetzt worden ist. Wenn an deren Stelle im Script ein Tabulator gesetzt wird, dann sollte es klappen.

Ich habe jetzt nachträglich diese Leerräume durch
Code
\t 

ersetzt, damit für später Dazukommende dieser Stolperstein weggeräumt ist.

Zur Frage wegen yellowColor: Ausprobieren! Wenn im Code ...
---
, fill color:"Yellow",
---
... verwendet wird, dann kommt diese Fehlermeldung:
Code
Ungültiger Wert für Einrichtung der Eigenschaft "fill color".  
swatch oder string erwartet, aber "Yellow" erhalten.

Ein Widerspruch, weil "Yellow" ja ein String (eine Textkette) ist. Somit ist es ein Bug, welchen man mit dem Einsetzen einer Referenz auf die Grundfarbe "Yellow" umgehen kann.

Eigentlich könnte man auf die Variable verzichten:
---
, fill color:color "Yellow",
---

Beim Zuweisen der Hintergrundfarbe eines Rahmens funktioniert das Benutzen des direkten Strings. Vorausgesetzt, dass die Farbe existiert.

Mit "Farbe" ist nicht ein "Farbfeld" gemeint. Und "Yellow" und "Magenta" werden nur aus Bequemlichkeit benutzt, damit nicht ein Farbfeld erzeugt werden muss. In einem Script können nicht einfach CMYK-Anteile zugewiesen werden.

Nicht zu verwechseln mit den Werten, welche in den Namen von Farbfeldern zu sehen sind. Im Script könnte bei der Definition der Absatzvorlage ...
---
, fill color:"C=0 M=0 Y=100 K=0",
---
... verwendet werden. Das würde klappen, aber nur wenn das entsprechende Farbfeld vorhanden ist.

In einem neu erzeugten InDesign-Dokument sind zusätzlich zu den nicht löschbaren Farbfeldern ("[Keine]", "[Papier]", "[Schwarz]", "[Passkreuze]") sechs weitere vorhanden (Cyan, Magenta, Gelb, Rot, Grün, Blau), deren Namen die definierten CMYK-Anteile wiedergeben. Diese Farbfelder sind "nicht verwendet", können mit dem entsprechenden Artikel des Fly-out-Menüs ausgewählt und durch Klick auf das Papierkorbsymbol gelöscht werden.

Wenn anschliessend dieses Script gestartet wird ...
---
tell document 1 of application "Adobe InDesign CS2"
   name of swatches
end tell
---
... erhält man: {"None", "Paper", "Black", "Registration"}

Und mit diesem ...
---
tell document 1 of application "Adobe InDesign CS2"
   name of colors
end tell
... ist das Ergebnis: {"Black", "Cyan", "Magenta", "Paper", "Registration", "Yellow", "", ""}

Das erklärt, warum "Cyan", "Magenta" und "Yellow" ohne Prüfung verwendet werden können, auch wenn sie im Dokument nicht sichtbar vorkommen.

Allerdings sollte man sie nur bei Objekten anwenden, deren Farbzusammensetzung später nicht geändert werden soll. Wie beim manuellen Verwenden von Farben tut man gut daran, ein Farbfeld zu erzeugen, damit man nur dessen Zusammensetzung ändern muss, um alle Vorkommen im Dokument zu erfassen.

Gruss, Hans


als Antwort auf: [#422614]

Script, das %-Größen von Bildern anzeigt

Roderix
Beiträge gesamt: 53

13. Okt 2008, 09:47
Beitrag # 10 von 21
Beitrag ID: #422623
Bewertung:
(3033 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans!

O.K., die Farbgebung ist ja auch gar nicht so erheblich, damit das Script seinen Zweck erfüllt, hatte mich nur mal so am Rande interessiert.  :-)
-> aber gut zu wissen.

Wir haben das Script inzwischen en gros getestet, dabei sind noch zwei kleine Bugs aufgefallen:

1) Wenn ein Bild mit seinem Rahmen wiederum in einen zweiten Rahmen hineinkopiert ist (Verschachtelung der Rahmen), wird es zwar als "Problemfall" gemeldet, aber es wird nicht mit einem Hinweis markiert. Vermutlich kann der Handler die Verschachtelung nicht korrekt interpretieren und kann den Hinweis in so einem Falle nicht platzieren. Ist es möglich, dass hier immer der hierarchisch übergeordnedste Rahmen als Anhaltspunkt für die Platzierung des Hinweises dienen kann?
(Werden mehrere "Problemfälle" in einem Dokument gemeldet, zählt der Anwender vielleicht nicht genau nach und so ein Bild könnte unter Umständen unerkannt bleiben.)

2) Wenn ein Bild um 180° gedreht und zudem horizontal gespiegelt ist, wird der V-Wert als Minuswert angezeigt / interpretiert und es wird markiert, obwohl seine Größe im toleranten Bereich liegt. Das macht zwar nichts, und kommt auch kaum mal vor, aber vielleicht gibt's ja eine Lösung?

Ach so: Wenn zufälligerweise im Dokument ein Zeichenformat ausgewählt ist, beeinflusst das die Textdarstellung in den Hinweisen. Das macht zwar auch nichts, führte nur teilweise zu Verwunderungen. :lol:


Gruß, Roderix


als Antwort auf: [#422614]

Script, das %-Größen von Bildern anzeigt

Hans Haesler
  
Beiträge gesamt: 5826

13. Okt 2008, 11:05
Beitrag # 11 von 21
Beitrag ID: #422624
Bewertung:
(3033 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roderix,

um zu vermeiden, dass ein Problembild vergessen wird: Ganz einfach das Script nach dem Auswechseln der Problemfälle nochmals starten. Eventuelle Markierungen werden gelöscht, bevor das Script die Bilder erneut prüft.

Das Problem mit einem verschachtelten Bildrahmen habe ich reproduzieren können.

Abhilfe: In der Schleife, welche ursprünglich den parent von gruppierten Rahmen prüft, den Test ändern. Statt "wiederhole so lange bis der Parent nicht 'Gruppe' ist", "wiederhole so lange bis der Parent 'Seite' ist". Das ist etwas riskant: Wenn die Ausstiegsbedingung nicht erfüllt werden kann, dann dreht das Script endlos. Damit auch Rahmen erfasst werden, welche nicht auf eine Seite liegen, wird gleichzeitig auf "Druckbogen" gestestet:
---
try
   repeat while class of curParent is not page and class of curParent is not spread
      set curParent to parent of curParent
   end repeat
end try
---

Das zweite Problem kann ich ebenfalls bestätigen.

Abhilfe: Prüfen, ob der V-Wert kleiner ist als Null. Falls ja, in eine positive Zahl verwandeln:
---
if vScale is less than 0 then
   set vScale to vScale - (2 * vScale)
end if
---

Ein ausgewähltes Zeichenformat, hingegen, hat hier keinen Einfluss auf das Ergebnis. Aber ich habe ein ähnliches Problem umgehen müssen, wenn ein Script Text importiert. Vielleicht hilft das Zurücksetzen der Vorgaben auf "[Keine]" auch in diesem Fall:
---
tell application "Adobe InDesign CS2"
   tell document 1
      set noCharStyle to character style 1
      set applied character style of text defaults to noCharStyle
      set noParaStyle to paragraph style 1
      set applied paragraph style of text defaults to noParaStyle
   end tell
end tell
---

Die ergänzte Version des Scripts kommt im nächsten Beitrag.

Gruss, Hans


als Antwort auf: [#422614]

Script, das %-Größen von Bildern anzeigt

Hans Haesler
  
Beiträge gesamt: 5826

13. Okt 2008, 11:06
Beitrag # 12 von 21
Beitrag ID: #422625
Bewertung:
(3033 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Code
tell application "Adobe InDesign CS2" 
activate
-- testen, ob ein Dokument geöffnet ist
if not (exists document 1) then
  display dialog "Bitte ein InDesign-Dokument öffnen." buttons ¬
  "OK" default button 1 with icon 0
  error number -128
end if

tell document 1
  -- die aktive Ebene feststellen, damit diese am Schluss
  -- wieder aktiviert werden kann
  set actLayer to active layer of layout window 1
  if name of actLayer is "Bildprozente" then
  repeat with i from (count of layers) to 1 by -1
    if name of layer i is not "Bildprozente" then
    set actLayer to layer i
    exit repeat
    end if
  end repeat
  end if
 
  -- prüfen, ob die Extra-Ebene existiert ...
  if exists layer "Bildprozente" then
  try
    -- wenn ja, sichtbar machen, die Objekte entsperren und entfernen
    set properties of layer "Bildprozente" to {visible:true, locked:false}
    set locked of every page item of layer "Bildprozente" to false
    delete every page item of layer "Bildprozente"
  end try
  -- ... sonst eine erzeugen
  else
  set idLayer to make layer with properties {name:"Bildprozente"}
  end if
  -- die Ebene zur aktiven bestimmen
  set targetLayer to layer "Bildprozente"
  set active layer of layout window 1 to targetLayer
 
  -- eine Variable initialisieren
  set probCtr to 0
 
  -- die Vorgaben anpassen
  set zeroPoint to zero point
  if zeroPoint is not {0.0, 0.0} then set zero point to {0.0, 0.0}
  tell view preferences
  set rulerOrigin to ruler origin
  if rulerOrigin is not page origin then set ruler origin to page origin
  end tell
  set noCharStyle to character style 1
  set applied character style of text defaults to noCharStyle
  set noParaStyle to paragraph style 1
  set applied paragraph style of text defaults to noParaStyle
 
  -- wenn das Absatzformat "Bildprozente" nicht vorhanden ist, wird es erzeugt
  if not (exists paragraph style "Bildprozente") then
  set yellowColor to color "Yellow"
  make paragraph style with properties {name:¬
    "Bildprozente", applied font:"Helvetica\tRegular", align to baseline:false ¬
    , baseline shift:0, capitalization:normal, drop cap lines:0 ¬
    , fill color:yellowColor, fill tint:-1.0, first line indent:0 ¬
    , horizontal scale:100, justification:left align, last line indent:0 ¬
    , left indent:0, point size:8, leading:10, position:normal, right indent:0 ¬
    , rule above:false, rule below:false, skew:0, strike thru:false ¬
    , stroke color:"None", tracking:0, underline:false, vertical scale:100}
  end if
 
  set AppleScript's text item delimiters to {":"}
  set allLinks to every link whose needed is true
  -- eine Schleife durch die Links
  repeat with i from 1 to count of allLinks
  set curLink to (item i of my allLinks)
  set curProps to properties of (parent of curLink)
  try
    -- das Prüfen des aktuellen PPI-Wertes generiert einen Fehler, wenn ein
    -- Vektorbild adressiert wird und die folgenden Befehle werden nicht ausgeführt
    set actPPI to actual ppi of curProps
    -- die Bildprozentwerte speichern ...
    set hScale to horizontal scale of curProps
    set vScale to vertical scale of curProps
    -- ... eventuelle negative Werte umpolen ...
    if vScale is less than 0 then
    set vScale to vScale - (2 * vScale)
    end if
    -- ... und prüfen
    if hScale is less than 70 or vScale is less than 70 or ¬
    hScale is greater than 125 or vScale is greater than 125 then
    set probCtr to probCtr + 1
    -- die beiden Werte auf zwei Dezimalstellen runden
    set hScale to (((hScale * 100) + 0.5) div 1) / 100
    set vScale to (((vScale * 100) + 0.5) div 1) / 100
    -- den Namen des Bildes feststellen
    set curPath to (file path of curLink)
    set fileName to text item -1 of curPath
    -- die Position des Bildrahmens speichern
    set curBox to parent of parent of curLink
    set {y1, x1, y2, x2} to geometric bounds of curBox
    set curParent to parent of curBox
    try
      repeat while class of curParent is not page and class of curParent is not spread
      set curParent to parent of curParent
      end repeat
    end try
    -- die Textkette zusammensetzen ...
    set curString to fileName & return & "H: " & hScale & ¬
      "% / V: " & vScale & "%"
    -- ... und den Handler aufrufen, welcher den Rahmen erzeugt
    my makeFrame(curParent, y1, x1, curString)
    end if
  end try
  end repeat
end tell
-- die ursprünglich aktivierte Ebene auswählen
try
  set active layer of layout window 1 to actLayer
end try
-- das Ergebnis der Aktion melden
if probCtr is 0 then
  display dialog "Keine Problembilder gefunden." buttons ¬
  "OK" default button 1 with icon 1
else if probCtr is 1 then
  display dialog "Ein Problembild gekennzeichnet." buttons ¬
  "OK" default button 1 with icon 2
else if probCtr is greater than 1 then
  display dialog "" & probCtr & " Problembilder gefunden." buttons ¬
  "OK" default button 1 with icon 2
end if
end tell

-- der Handler, welcher die Markierungsrahmen erzeugt
on makeFrame(curParent, y1, x1, curString)
tell document 1 of application "Adobe InDesign CS2"
  tell curParent
  try
    set newFrame to make text frame at beginning with properties ¬
    {geometric bounds:{y1, x1, y1 + 8, x1 + 50}, fill color:¬
      "Magenta", contents:curString}
    tell newFrame
    set inset spacing of text frame preferences to {1, 1, 0, 0}
    tell parent story
      set applied paragraph style to "Bildprozente"
    end tell
    end tell
  end try
  end tell
end tell
end makeFrame

Gruss, Hans


als Antwort auf: [#422614]

Script, das %-Größen von Bildern anzeigt

Roderix
Beiträge gesamt: 53

14. Okt 2008, 10:32
Beitrag # 13 von 21
Beitrag ID: #422626
Bewertung:
(3033 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans!

Ich glaube, jetzt lässt das Script keine Wünsche mehr offen.  :coolsmile:
-> läuft super! Vielen Dank für die Mühe!

Was bedeutet "Das ist etwas riskant: Wenn die Ausstiegsbedingung nicht erfüllt werden kann, dann dreht das Script endlos."?
Deute ich es richtig, dass, wenn ein Bildrahmen neben einer Seite liegen würde "parent" niemals "Seite" sein kann und durch die Einbeziehung von "Druckbogen" hier eine zweite Ausstiegsbedingung geschaffen wird?

Einfluss von ausgewählten Zeichenformaten auf die Formatierung der Hinweis-Texte gibt's auch nicht mehr.

Nochmals besten Dank.


Viele Grüsse, Roderix


als Antwort auf: [#422614]

Script, das %-Größen von Bildern anzeigt

Hans Haesler
  
Beiträge gesamt: 5826

14. Okt 2008, 13:02
Beitrag # 14 von 21
Beitrag ID: #422627
Bewertung:
(3033 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roderix,

bitteschön.

Zu Deiner Frage: In der früheren Version macht das Script eine Schleife, welche solange durchlaufen wird, bis der 'parent' nicht mehr 'group' ist. Bei einem nichtgruppierten Rahmen ist diese Bedingung schon zu Beginn erfüllt und die Schleife wird sofort verlassen. Bei gruppierten Gruppen welche gruppiert sind, braucht es mehrere Durchgänge. Aber mal kommt sicher ein Ergebnis, welches nicht 'group' ist.

Mit der letzten Version ist es anders. Weil auch verschachtelte Rahmen berücksichtigt werden müssen, klappt es mit 'group' nicht mehr. Deshhalb wird der Test umgestellt von solange bis nicht mehr 'Gruppe' auf solange bis 'Seite' oder 'Druckbogen'. Das Risiko, welches man damit eingeht, ist nicht sehr gross, denn der 'parent' ist meistens 'page' oder 'spread'.

Was noch nicht richtig funktioniert: Bei im Textfluss verankerten Rahmen, werden allfällige Problembilder nur gemeldet, aber nicht gekennzeichnet. Da muss ich noch versuchen, eine Lösung zu finden.

Gruss, Hans


als Antwort auf: [#422614]

Script, das %-Größen von Bildern anzeigt

Hans Haesler
  
Beiträge gesamt: 5826

16. Okt 2008, 20:24
Beitrag # 15 von 21
Beitrag ID: #422628
Bewertung:
(3033 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Roderix,

so ... und mit dieser Version werden verankerte (im Textfluss mitschwimmende) Problembilder nicht nur erkannt, sondern auch markiert.
Code
tell application "Adobe InDesign CS2" 
activate
if not (exists document 1) then
  display dialog "Bitte ein InDesign-Dokument öffnen." buttons ¬
  "OK" default button 1 with icon 0
  error number -128
end if

tell document 1
  set actLayer to active layer of layout window 1
  if name of actLayer is "Bildprozente" then
  repeat with i from (count of layers) to 1 by -1
    if name of layer i is not "Bildprozente" then
    set actLayer to layer i
    exit repeat
    end if
  end repeat
  end if
 
  if exists layer "Bildprozente" then
  try
    set properties of layer "Bildprozente" to {visible:true, locked:false}
    set locked of every page item of layer "Bildprozente" to false
    delete every page item of layer "Bildprozente"
  end try
  else
  set idLayer to make layer with properties {name:"Bildprozente"}
  end if
  set targetLayer to layer "Bildprozente"
  set active layer of layout window 1 to targetLayer
 
  set probCtr to 0
 
  set zeroPoint to zero point
  if zeroPoint is not {0.0, 0.0} then set zero point to {0.0, 0.0}
  tell view preferences
  set rulerOrigin to ruler origin
  if rulerOrigin is not page origin then set ruler origin to page origin
  end tell
  set noCharStyle to character style 1
  set applied character style of text defaults to noCharStyle
  set noParaStyle to paragraph style 1
  set applied paragraph style of text defaults to noParaStyle
 
  if not (exists paragraph style "Bildprozente") then
  set yellowColor to color "Yellow"
  make paragraph style with properties {name:¬
    "Bildprozente", applied font:"Helvetica\tRegular", align to baseline:false ¬
    , baseline shift:0, capitalization:normal, drop cap lines:0 ¬
    , fill color:yellowColor, fill tint:-1.0, first line indent:0 ¬
    , horizontal scale:100, justification:left align, last line indent:0 ¬
    , left indent:0, point size:8, leading:10, position:normal, right indent:0 ¬
    , rule above:false, rule below:false, skew:0, strike thru:false ¬
    , stroke color:"None", tracking:0, underline:false, vertical scale:100}
  end if
 
  set AppleScript's text item delimiters to {":"}
  set allLinks to every link whose needed is true
  repeat with i from 1 to count of allLinks
  set curLink to (item i of my allLinks)
  set curProps to properties of (parent of curLink)
  try
    -- das Prüfen des aktuellen PPI-Wertes generiert einen Fehler, wenn ein
    -- Vektorbild adressiert wird und die folgenden Befehle werden nicht ausgeführt
    set actPPI to actual ppi of curProps
    -- die Bildprozentwerte speichern ...
    set hScale to horizontal scale of curProps
    set vScale to vertical scale of curProps
    -- ... eventuelle negative Werte umpolen ...
    if vScale is less than 0 then
    set vScale to vScale - (2 * vScale)
    end if
    -- ... und prüfen
    if hScale is less than 70 or vScale is less than 70 or ¬
    hScale is greater than 125 or vScale is greater than 125 then
    set probCtr to probCtr + 1
    -- die beiden Werte auf zwei Dezimalstellen runden
    set hScale to (((hScale * 100) + 0.5) div 1) / 100
    set vScale to (((vScale * 100) + 0.5) div 1) / 100
    -- den Namen des Bildes feststellen
    set curPath to (file path of curLink)
    set fileName to text item -1 of curPath
    -- die Position des Bildrahmens speichern
    set curBox to parent of parent of curLink
    set {y1, x1, y2, x2} to geometric bounds of curBox
    set curParent to parent of curBox
    set done to false
    try
      repeat while class of curParent is not page and class of curParent is not spread
      -- wenn der 'parent' eine Textkette ist, dann ist es ein verankerter Bildrahmen
      if class of curParent is story then
        set curParent to parent of curParent
        -- die Textkette zusammensetzen ...
        set curString to fileName & return & "H: " & hScale & ¬
        "% / V: " & vScale & "%"
        -- ... und den Handler aufrufen, welcher den Rahmen erzeugt
        my makeFrame(curParent, y1, x1, curString)
        set done to true
        exit repeat
      end if
      set curParent to parent of curParent
      end repeat
    end try
    if not done then
      -- die Textkette zusammensetzen ...
      set curString to fileName & return & "H: " & hScale & ¬
      "% / V: " & vScale & "%"
      -- ... und den Handler aufrufen, welcher den Rahmen erzeugt
      my makeFrame(curParent, y1, x1, curString)
    end if
    end if
  end try
  end repeat
end tell
-- die ursprünglich aktivierte Ebene auswählen
try
  set active layer of layout window 1 to actLayer
end try
-- das Ergebnis der Aktion melden
if probCtr is 0 then
  display dialog "Keine Problembilder gefunden." buttons ¬
  "OK" default button 1 with icon 1
else if probCtr is 1 then
  display dialog "Ein Problembild gekennzeichnet." buttons ¬
  "OK" default button 1 with icon 2
else if probCtr is greater than 1 then
  display dialog "" & probCtr & " Problembilder gefunden." buttons ¬
  "OK" default button 1 with icon 2
end if
end tell

-- der Handler, welcher die Markierungsrahmen erzeugt
on makeFrame(curParent, y1, x1, curString)
tell document 1 of application "Adobe InDesign CS2"
  tell curParent
  try
    set newFrame to make text frame at beginning with properties ¬
    {geometric bounds:{y1, x1, y1 + 8, x1 + 50}, fill color:¬
      "Magenta", contents:curString}
    tell newFrame
    set inset spacing of text frame preferences to {1, 1, 0, 0}
    tell parent story
      set applied paragraph style to "Bildprozente"
    end tell
    end tell
  end try
  end tell
end tell
end makeFrame

Gruss, Hans


als Antwort auf: [#422614]
X