[GastForen Programmierung/Entwicklung AppleScript ID CS4: vom verankerten Objekt zum Absatz

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

ID CS4: vom verankerten Objekt zum Absatz

Goar
Beiträge gesamt: 395

19. Aug 2011, 21:17
Beitrag # 1 von 9
Bewertung:
(3323 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Scripter,

der verankerte Bildrahmen ist aktiv und ich möchte gerne auf den Absatz zugreifen, in dem der Bildrahmen verankert ist.
So weit bin ich:
Code
tell application "Adobe InDesign CS4" 
tell active document
set curSelection to selection
set curObject to item 1 of curSelection
parent of curObject
end tell
end tell

ich bekomme:
Code
text from character 5007 to character 5007 of story id 2003 of document "D-A_2_ge_Bu.indd" of application "Adobe InDesign CS4" 

Aber wie komme ich an den Inhalt, zum Beispiel die 5007?
Ich habe schon eine Fehlermeldung provoziert und versucht mit find text (satimage.osax) an die Zahl meiner Wünsche zu gelangen, aber das scheint in ID nicht zu funktionieren …
X

ID CS4: vom verankerten Objekt zum Absatz

Hans Haesler
  
Beiträge gesamt: 5826

19. Aug 2011, 21:39
Beitrag # 2 von 9
Beitrag ID: #478540
Bewertung:
(3311 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

in diesem Falle musst Du nur das parent of verdoppeln:

Code
tell application "Adobe InDesign CS5.5" 
set curObject to item 1 of selection
parent of parent of curObject
end tell

Gruss, Hans


als Antwort auf: [#478539]

ID CS4: vom verankerten Objekt zum Absatz

Goar
Beiträge gesamt: 395

20. Aug 2011, 13:16
Beitrag # 3 von 9
Beitrag ID: #478555
Bewertung:
(3254 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

die zweite Generation nach oben hatte ich schon ausprobiert, damit habe ich die story, aber noch lange nicht den gesuchten Absatz, zumal die story auch keinerlei Spur meines verankerten Rahmens enthält.

Aber ich habe es als Fingerzeig genommen, in diese Richtung zu gehen. Und weitab vom Rechner ist mir der Weg klarer geworden.

Der verankerte Rahmen, um den es geht, ist angeklickt.

Zunächst sammle ich die Namen der Absatzformate aller 1152 Absätze ein.
Dann prüfe ich in einer repeat-Schleife jeden einzelnen Namen, ob er mit "Bild" beginnt; die verankerten Rahmen stehen alle in solchen Bild-Absätzen, die auch sonst nichts enthalten.

Sobald das Skript einen Bild-Absatz gefunden hat, ermittelt es über all graphics die Referenz des dort verankerten Rahmens und vergleicht sie mit der des angeklickten Rahmens.
Wenn beide identisch sind, habe ich gleichzeitig den Index des Absatzes und den Namen seines Formates und damit alle Infos, die ich für das weitere Vorgehen brauche. An der Stelle verlasse ich die repeat-Schleife.

Und so sieht es aus:
Code
tell application "Adobe InDesign CS4" 
set curSelection to selection
set curObject to item 1 of curSelection
set curPic to all graphics of curObject
set curObjStyle to name of applied object style of curObject
set curStory to parent of parent of curObject

set allParaStyleRefs to applied paragraph style of every paragraph of curStory -- Formatnamen aller Absätze
repeat with i from 1 to length of allParaStyleRefs
set curParaStyleRef to item i of allParaStyleRefs -- Referenz des geprüften Absatzeformates
set curName to name of curParaStyleRef -- Formatname des geprüften Absatzeformates
if (curName starts with "Bild") then
set curParaInd to i -- Index des geprüften Absatzes
set checkPic to all graphics of paragraph curParaInd of curStory
if (checkPic is equal to curPic) then -- wenn Prüfbild das markierte ist
exit repeat -- dann haben wir alles zusammen
end if
end if
end repeat

end tell


Auf den ersten Seiten ist das Script recht flott, auf den letzten aber deutlich langsamer, weil es ja immer mehr Absätze prüfen muss, bis es auf die korrekte Referenz trifft.

Daher träume ich noch immer von einem kürzeren Weg vom angeklickten verankerten Rahmen zu dem Absatz, in dem er steht. In der Referenz ist ja die Information enthalten, an welchem character x der Rahmen steht, und die Absätze zu zählen, die im Text von Zeichen 1 bis x der story stehen, sollte das kleinste Problem sein.

Nun erinnere ich mich dunkel, dass, wenn find text nicht funktioniert (s.o., warum eigentlich nicht?) es vielleicht mit der "reinen" AS-Lösung per AppleScript's text item delimiters geht …

Falls Dir zu dem Ganzen etwas durch den Kopf geht: ich lerne gerne dazu.

Vielen Dank schon mal,


als Antwort auf: [#478540]

ID CS4: vom verankerten Objekt zum Absatz

Hans Haesler
  
Beiträge gesamt: 5826

20. Aug 2011, 13:59
Beitrag # 4 von 9
Beitrag ID: #478556
Bewertung:
(3246 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

es geht mir etwas in der Richtung durch den Kopf. Aber ich müsste es zuerst ausprobieren.

Kann ich aber erst im Laufe des Abends, denn jetzt befinde ich mich im wunderschönen Freibad von Lausanne. :-) Sonnenschein, kaum eine Wolke, 30 Grade (die Wassertemperatur um die 24).

Gruss, Hans


als Antwort auf: [#478555]

ID CS4: vom verankerten Objekt zum Absatz

Hans Haesler
  
Beiträge gesamt: 5826

20. Aug 2011, 20:42
Beitrag # 5 von 9
Beitrag ID: #478559
Bewertung:
(3213 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

ich hatte zu Beginn nicht richtig hingeschaut, was Du genau brauchst. Doch jetzt bin ich mir immer noch nicht sicher. Deshalb nachstehend ein paar Helfer.

So bekommst Du den Inhalt des Absatzes:

Code
tell application "Adobe InDesign CS4" 
set curObject to item 1 of selection
paragraph 1 of parent of curObject
end tell

Und so eine Objektreferenz.

Code
tell application "Adobe InDesign CS4" 
set curObject to item 1 of selection
object reference of paragraph 1 of parent of curObject
end tell

Und hiermit die Properties.

Code
tell application "Adobe InDesign CS4" 
set curObject to item 1 of selection
properties of paragraph 1 of parent of curObject
end tell

Weil ein Absatz keinen Index hat, muss man sich so behelfen, um die Nummer des aktuellen Absatzes festzustellen.

Code
tell application "Adobe InDesign CS4" 
set curObject to item 1 of selection
set insPos to index of insertion point 1 of parent of curObject
tell parent of parent of curObject
set totChars to 0
repeat with i from 1 to count of paragraphs
tell paragraph i
set nChars to count of characters
set totChars to (totChars + nChars)
if totChars is greater than insPos then
set paraNumber to i
exit repeat
end if
end tell
end repeat
end tell
end tell
paraNumber

Und schliesslich noch den Namen des aktuellen Absatzformates:

Code
tell application "Adobe InDesign CS4" 
set curObject to item 1 of selection
set insPos to index of insertion point 1 of parent of curObject
tell parent of parent of curObject
set totChars to 0
repeat with i from 1 to count of paragraphs
tell paragraph i
set nChars to count of characters
set totChars to (totChars + nChars)
if totChars is greater than insPos then
set paraStyleName to name of applied paragraph style
exit repeat
end if
end tell
end repeat
end tell
end tell
paraStyleName

Vielleicht ist etwas Brauchbares dabei. :-)

Gruss, Hans


als Antwort auf: [#478556]

ID CS4: vom verankerten Objekt zum Absatz

Goar
Beiträge gesamt: 395

22. Aug 2011, 09:56
Beitrag # 6 von 9
Beitrag ID: #478586
Bewertung:
(3153 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

das meiste davon hatte ich schon, aber über diese ausführliche Darstellung werden sich sicher einige Skripter freuen!

(Ein paar km nördlich von Deinem Freibad habe ich mir einen 27,5-km-Lauf in welligem Gelände angetan, bei ähnlichen Witterungsbedingungen. Beeindruckend.)

Für mein Problem war das der Volltreffer:

Zitat set insPos to index of insertion point 1 of parent of curObject

weil ich damit ohne Tricks die Position meines Bildrahmens in der story erhalte, was mir über die Referenz des Bildrahmens …

Code
rectangle id 32055 of text from character 104105 to character 104105 of text flow id 2003 of document "D-A_2_ge_Bu.indd" of application "Adobe InDesign CS4" 

… nicht gelungen ist, obwohl die gesuchte Information (104105) darin enthalten ist.

Die repeat-Schleife braucht für Bildrahmen am Ende der Textkette viel Zeit (8 bis 10 Sekunden), bis die paraNumber ermittelt ist.
Stattdessen habe ich den Text bis zur Position des insertion point aufgenommen und die Anzahl der darin enthaltenen Absätze festgestellt. Das funktioniert auch am Ende der Textkette noch in gefühlter Echtzeit.

So sieht der Skripteil jetzt aus:
Code
tell application "Adobe InDesign CS4" 
set curSelection to selection
set curObject to item 1 of curSelection
tell curObject
set curObjStyle to name of applied object style
set insPos to index of insertion point 1 of parent
set curStory to parent of parent
end tell
tell curStory
set tmptext to text from character 1 to character insPos
set paraNumber to count of paragraphs in tmptext
set curParaStyleName to name of applied paragraph style of paragraph paraNumber
set nextParaStyleName to name of applied paragraph style of paragraph (paraNumber + 1) -- Formatname des nachfolgenden Absatzes
end tell
end tell


Danke, Hans, so macht Skripten Spaß!

Gruß,


als Antwort auf: [#478559]

ID CS4: vom verankerten Objekt zum Absatz

Hans Haesler
  
Beiträge gesamt: 5826

22. Aug 2011, 20:05
Beitrag # 7 von 9
Beitrag ID: #478647
Bewertung:
(3132 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

bitteschön. Gut, dass das Script jetzt das Ergebnis schneller liefert.

27,5 km? War das der Langstreckenlauf um den Köterberg? Und Erster Deiner Altersklasse? Respekt! :-)

Übrigens: Die Referenz der Position des Bildrahmens ist nun mal eine ... Referenz (eine Beschreibung) und keine Textkette. Deshalb kann die Satimage-OSAX auch nicht eingesetzt werden.

Gruss, Hans


als Antwort auf: [#478586]

ID CS4: vom verankerten Objekt zum Absatz

Goar
Beiträge gesamt: 395

22. Aug 2011, 21:21
Beitrag # 8 von 9
Beitrag ID: #478651
Bewertung:
(3115 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vor längerer Zeit habe ich von Dir die Krücke abgeguckt, wie man aus einer Referenz eine Textkette macht, indem man nämlich eine Fehlermeldung provoziert. Aber vielleicht ist dabei irgendwas schief gegangen.

(Oh, Hans, bist Du gut im Recherchieren! Die Frage, ob es der war, ist ja wohl nur rhetorisch, wie der nächste Satz zeigt.)

Gruß,


als Antwort auf: [#478647]
(Dieser Beitrag wurde von Goar am 22. Aug 2011, 21:53 geändert)

ID CS4: vom verankerten Objekt zum Absatz

Hans Haesler
  
Beiträge gesamt: 5826

22. Aug 2011, 22:38
Beitrag # 9 von 9
Beitrag ID: #478655
Bewertung:
(3098 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Goar,

der Vollständigkeit halber (obwohl nicht mehr notwendig): So kann eine provozierte InDesign-Fehlermeldung abgefangen und "missbraucht" werden:

Code
tell application "Adobe InDesign CS4" 
tell active document
set curSelection to selection
set curObject to item 1 of curSelection
try
set aColor to color of parent of curObject
on error errMsg number errNr
set charPos to my getPos(errMsg)
end try
end tell
end tell
charPos

on getPos(errMsg)
set getPos to find text "(text from character )([0-9]+)?" in errMsg using "\\2" with regexp and string result
return getPos
end getPos

Den Lauf betreffend: Dank "Google" (Langstreckenlauf 27,5 km) ist das Recherchieren sehr einfach. Nochmals: Sehr grossen Respekt!

Gruss, Hans


als Antwort auf: [#478651]
(Dieser Beitrag wurde von Hans Haesler am 22. Aug 2011, 22:38 geändert)
X