INDESIGN: Problem Passing Doc Through Handlers of Called Script
INDESIGN: Problem Passing Doc Through Handlers of Called Script
- Subject: INDESIGN: Problem Passing Doc Through Handlers of Called Script
- From: Rick Gordon <email@hidden>
- Date: Thu, 15 Sep 2011 20:37:14 -0700
I've got a script that is designed to loop through selected chapters of an .INDB book file to hunt down images that don't fill their container on all four sides.
It's divided into two script documents (which need to be in the same folder): the workhorse that processes one document via multiple handlers, and the other that travels through the chosen book documents, leaving documents requiring action open, closing the others, and providing a list on images needing adjustment.
The workhorse document works fine when directly run on a single document. The book traversing document successfully calls the main handler (fMain) of the workhorse doc ("Find Images Smaller Than Frame.scpt").
The problem happens when the workhorse doc, when called by the book traversing doc, calls additional handlers in the same script document. When fMain passes the reference to the current document to successive handlers, I get the error "Can't make document id <IDNUMBER> of application \"Adobe InDesign CS5\" into the expected type."
I've tried passing the document reference as it, object reference of it, a ref to it (then trying to access its contents or it directly), and passing it through a property -- always with the same error.
What am I doing wrong here? Thanks for any help.
I'll include both script components below:
--THE WORKHORSE SCRIPT (Works when run independently)--
--Must reside in same folder as the calling script
--Uncomment to run directly on front document
(*
tell application "Adobe InDesign CS5"
my fMain(document 1)
end tell
*)
--------
on fMain(aDoc)
set vList to {}
tell application "Adobe InDesign CS5"
set vApp to it
set vOldUserInteractionLevel to my fAppSetup()
tell aDoc
set vOriginalRulerOrigin to my fDocSetup(it)
try
set end of vList to return & return & name & return
set vContainerList to all graphics
repeat with vItem in vContainerList
set vComparedBounds to my fCompareBounds(parent of vItem)
set end of vList to vComparedBounds
if vComparedBounds = -1 then my vDocCleanup(it)
end repeat
on error
my fDocCleanup(it, vOriginalRulerOrigin)
my fAppCleanup(vOldUserInteractionLevel)
end try
my fDocCleanup(it, vOriginalRulerOrigin)
end tell
my fAppCleanup(vOldUserInteractionLevel)
return vList
end tell
end fMain
--
on fAppSetup()
tell application "Adobe InDesign CS5"
set rUserInteractionLevel to a reference to user interaction level of script preferences
set vOldUserInteractionLevel to rUserInteractionLevel
set rUserInteractionLevel to never interact
return vOldUserInteractionLevel
end tell
end fAppSetup
--
on fDocSetup(aDoc)
tell application "Adobe InDesign CS5"
tell vDoc
set rRulerOrigin to a reference to ruler origin of view preferences
set vOriginalRulerOrigin to ruler origin of view preferences
set contents of rRulerOrigin to spread origin
end tell
end tell
end fDocSetup
--
on fCompareBounds(aContainer)
set vList to {}
set vFoundError to false
try
tell application "Adobe InDesign CS5"
tell aContainer
set vStrokeAlignment to stroke alignment
set vStrokeWeight to stroke weight
if vStrokeAlignment is outside alignment then
set vStrokeAdjustment to 0
else if vStrokeAlignment is center alignment then
set vStrokeAdjustment to vStrokeWeight / 2
else
set vStrokeAdjustment to vStrokeWeight --inside alignment
end if
set vImage to image 1
set vImageName to name of item link of vImage
repeat with i from 1 to 4
tell item i of geometric bounds
set vImageBound to item i of geometric bounds of vImage
set vOffset to it - vImageBound
if i = 1 then
set vTopOffset to vOffset + vStrokeAdjustment
set vTopOk to (vTopOffset 0)
else if i = 2 then
set vLeftOffset to vOffset + vStrokeAdjustment
set vLeftOk to (vLeftOffset 0)
else if i = 3 then
set vBottomOffset to vOffset - vStrokeAdjustment
set vBottomOk to (vBottomOffset ¾ 0)
else if i = 4 then
set vRightOffset to vOffset - vStrokeAdjustment
set vRightOk to (vRightOffset ¾ 0)
end if
end tell
end repeat
if (vTopOk and vLeftOk and vBottomOk and vRightOk) is false then
set vFoundError to true
if label does not contain "FIXBOUNDS" then
if label is "" then
set label to "FIXBOUNDS"
else
set label to "FIXBOUNDS" & label & return
end if
end if
select
set vParentPage to parent page
set end of vList to (return as text) & " page " & (name of vParentPage) & ": " & ¬
vImageName & return
if vTopOk is false then set end of vList to " top: " & vTopOffset & return
if vLeftOk is false then set end of vList to " left: " & vLeftOffset & return
if vBottomOk is false then set end of vList to " bottom: " & vBottomOffset & return
if vRightOk is false then set end of vList to " right: " & vRightOffset & return
end if
end tell
end tell
on error
return vList
error -1
end try
if vFoundError then
return vList
else
return {}
end if
end fCompareBounds
--
on fDocCleanup(aDoc, aOriginalRulerOrigin)
tell application "Adobe InDesign CS5"
set ruler origin of view preferences of aDoc to aOriginalRulerOrigin
end tell
end fDocCleanup
--
on fAppCleanup(aOldUserInteractionLevel)
tell application "Adobe InDesign CS5"
set user interaction level of script preferences to aOldUserInteractionLevel
end tell
end fAppCleanup
-------------------
--THE BOOK TRAVERSING SCRIPT--
--(fMain is successfully called, but InDesign objects fail when passed to other handlers)--
--Must reside in same folder as the called script
set vList to {}
--
try
set vScriptName to "Find Images Smaller Than Frame.scpt"
set vScript to my fLoadScript(vScriptName)
set vHandler to vScript's fMain
on error
error "Can't load a script."
end try
--
tell application "Adobe InDesign CS5"
set vApp to it
set vOldUserInteractionLevel to my fAppSetup()
set vTargetList to my fChooseChapters(active book)
if vTargetList is {} then error "Nothing was chosen."
repeat with vItem in vTargetList
set vChapterAlias to full name of vItem
set vCurrentDoc to open vChapterAlias without showing window
tell vCurrentDoc
set vProcessResult to my fProcess(it, vHandler)
set end of vList to vProcessResult
if vProcessResult is not {} then
set end of last item of vList to my fPostprocess(it)
else
set end of last item of vList to my fPostprocessFail(it)
end if
end tell
end repeat
my fAppCleanup(vOldUserInteractionLevel)
return vList as text
end tell
--
on fAppSetup()
tell application "Adobe InDesign CS5"
set rUserInteractionLevel to a reference to user interaction level of script preferences
set vOldUserInteractionLevel to rUserInteractionLevel
set rUserInteractionLevel to never interact
return vOldUserInteractionLevel
end tell
end fAppSetup
--
on fChooseChapters(aBook)
tell application "Adobe InDesign CS5"
set vContents to a reference to book contents of aBook
set vContentsList to name of vContents
tell me to set vReturnedNames to (choose from list vContentsList with title "Open Selected Chapters" default items vContentsList with multiple selections allowed without empty selection allowed)
set vChapterList to items of vContents where name is in (vReturnedNames as text)
return vChapterList
end tell
end fChooseChapters
--
on fLoadScript(aScriptName)
--assumes this script and the script containing the handler are in the same folder
set vScriptPath to path to me
tell application "Finder"
set vScriptFolder to (container of vScriptPath) as alias as text
end tell
set vScriptPath to (vScriptFolder & aScriptName) as alias
return load script vScriptPath
end fLoadScript
--
on fProcess(aDoc, aHandler)
script sPassHandler
property pHandler : aHandler
return pHandler(aDoc)
end script
run sPassHandler
end fProcess
--
on fPostprocess(aDoc)
try
tell aDoc
--save
close
end tell
return true
on error
return false
end try
end fPostprocess
--
on fPostprocessFail(aDoc)
tell aDoc
--close without saving
end tell
return -1
end fPostprocessFail
--
on fAppCleanup(aOldUserInteractionLevel)
tell application "Adobe InDesign CS5"
set user interaction level of script preferences to aOldUserInteractionLevel
end tell
end fAppCleanup
--
___________________________________________________
RICK GORDON
EMERALD VALLEY GRAPHICS AND CONSULTING
___________________________________________________
WWW: http://www.shelterpub.com
_______________________________________________
Do not post admin requests to the list. They will be ignored.
AppleScript-Users mailing list (email@hidden)
Help/Unsubscribe/Update your Subscription:
Archives: http://lists.apple.com/archives/applescript-users
This email sent to email@hidden