The Omni Group
These forums are now read-only. Please visit our new forums to participate in discussion. A new account will be required to post in the new forums. For more info on the switch, see this post. Thank you!

Go Back   The Omni Group Forums > OmniGraffle > OmniGraffle General
FAQ Members List Calendar Search Today's Posts Mark Forums Read

 
applescripting help for graphics on shared layers Thread Tools Search this Thread Display Modes
I'm trying to write an Applescript to export all graphics in a document, including ones that lie on shared layers. The script works well, except for the shared layer graphics. For those I get an export of the entire canvas, rather than just the shared graphic.

Is this a bug, or am I doing something wrong?

heres the script

Code:
on getExportGraphics(export_folder)
	set foundGraphics to {}
	set sharedDone to {}
	tell application "OmniGraffle Professional 5"
		activate
		
		set oDoc to front document
		set theWin to front window
		
		
		set canvasCount to count of canvases of oDoc
		
		set origCanvas to canvas of front window
		
		set theCanvases to every canvas in oDoc
		
		set cindex to 0
		repeat with currentCanvas in every canvas of document of front window
			set canvas of front window to currentCanvas
			set canvasName to name of currentCanvas
			set canvasId to id of currentCanvas
			-----		
			
			repeat with currentLayer in every layer of currentCanvas
				
				set layerName to name of currentLayer
				
				set layerClass to (class of currentLayer) as string
				log "LAYER CLASS: " & layerClass
				if (layerClass is "shared layer") then
					set layerkey to "_shared|" & layerName
					set done to 0
					
					repeat with di from 1 to count of sharedDone
						set formerlyDone to item di of sharedDone
						if (formerlyDone = layerkey) then
							set done to 1
							set di to count of sharedDone
						end if
					end repeat
					if (done is 0) then
						set end of sharedDone to layerkey
					end if
					set sharedLayer to true
				else
					set layerkey to canvasName & "|" & layerName
					set done to 0
					set sharedLayer to false
				end if
				
				
				if (done is 0) then
					
					-- NOTE: top-level groups are present in the (graphics of current layer) 
					set numGraphics to (count of graphics of currentLayer)
					set numGroups to (count of groups of currentLayer)
					--display dialog num
					
					log "Canvas[" & canvasName & "] Layer: " & layerkey & " - " & layerClass & " => " & numGraphics - numGroups & " graphics, " & numGroups & " groups"
					if (numGraphics > 0) then
						
						
						------------------------------------------------------------------------------------------
						set gindex to 0
						repeat with currentGraphic in every graphic of currentLayer
							
							set gid to id of currentGraphic
							set exportedName to "graphic_" & gid
							log "SHAPE: " & exportedName
							--repeat with userDataItem in every user data item in currentCanvas
							--end repeat
							
							if ((count of user data of currentGraphic) is not 0) then
								set userData to user data of currentGraphic
								-------------------------------------------------------------------- Get Name
								try
									set gname to the value of user data item "name" of currentGraphic
									log "   NAME: " & gname
								on error errMsg number errNo
									set gname to ""
									if errNo is -1728 then
										-- no 'name' defined in userData
									else if errNo is -2753 then
										-- no 'name' defined in userData
									else
										log "ERROR: " & errMsg & " (" & errNo & ") "
									end if
								end try
								-------------------------------------------------------------------- Get Type
								try
									set gtype to the value of user data item "type" of currentGraphic
									log "   TYPE: " & gtype
								on error errMsg number errNo
									set gtype to ""
									if errNo is -1728 then
										-- no 'type' defined in userData
									else if errNo is -2753 then
										-- no 'type' defined in userData
									else
										log "ERROR: " & errMsg & " (" & errNo & ") "
									end if
								end try
								-------------------------------------------------------------------- Get Export
								try
									set gexport to the value of user data item "export" of currentGraphic
									log "   EXPORT: " & gexport
								on error errMsg number errNo
									set gexport to ""
									if errNo is -1728 then
										-- no 'export' defined in userData
									else if errNo is -2753 then
										-- no 'export' defined in userData
									else
										log "ERROR: " & errMsg & " (" & errNo & ") "
									end if
								end try
								
								--set user data of currentGraphic to {|keyName|:valueName} & user data of currentGraphic
								
								----------------------------------------------------- If unnamed, allow use of a qualifying one-line label as name
								if (gname is "") then
									try
										set graphicText to the text of currentGraphic
										log "GRAPHIC TEXT: " & graphicText & return
										-- TRIM WHITESPACE of full text
										set graphicText2 to my trim(1, graphicText)
										-- check that we're dealing with a single line				
										set graphicLines to paragraphs of graphicText2
										log "GRAPHIC LINES: " & graphicLines & return
										
										-- only single line entries
										if (length of graphicLines is 1) then
											set graphicText to item 1 of graphicLines
											
											-- no spaces allowed
											if (first character of " " is not in graphicText) then
												set graphicTextName to my trim(true, graphicText)
												set gname to graphicTextName
											end if
										end if
									end try
								end if
								
								-------------------------------------------------------------------- Decide to export or not
								set doExport to 0
								if (gexport is "true") then
									set doExport to 1
									if (gname is "") then
										if (gtype is not "") then
											set gname to gtype & "_" & gid
										else
											set gname to "graphic_" & gid
										end if
									end if
								else if (gexport is "false") then
									-- leave doExport at 0
								else if (gname is not "") then -- if name is defined, do export for types item & state 
									if (gtype is "state") then
										set doExport to 1
									else if (gtype is "item") then
										set doExport to 1
									else if (gtype is "") then -- untyped, but named is assumed to be item
										set doExport to 1
									end if
								else -- if name is NOT defined, do export for types item & state
									if (gtype is "state") then
										set doExport to 1
										set gname to "state_" & gid
									else if (gtype is "item") then
										set doExport to 1
										set gname to "item_" & gid
									end if
								end if
								
							else
								set doExport to 0
								--log "HAS NO USER DATA"
								
								set userData to {export:"false"}
							end if
							
							if (doExport is 1) then
								--set pos to origin of currentGraphic
								--set gx to item 1 of pos
								--set gy to item 2 of pos
								--set gsize to size of currentGraphic
								--set gw to item 1 of gsize
								--set gh to item 2 of gsize
								--set box to gx & "_" & gy & "_" & gw & "_" & gh
								set exportName to layerkey & "|" & gname & "|" & gindex
								set user data of currentGraphic to {_exported:exportName} & user data of currentGraphic
								
								-------------------------------------------------------------- DO EXPORT
								set canvas of front window to currentCanvas
								
								set p to properties of currentGraphic
								set gr to (a reference to currentGraphic)
								set selectionGraphics to {get currentGraphic}
								-- set end of selectionGraphics to currentGraphic
								set selection of front window to selectionGraphics
								
								set exportFileName to export_folder & exportName & "." & exportFileExtension
								log "Exporting IMAGE: " & exportName & "." & exportFileExtension & " "
								set exportType to exportFileType
								
								-- export settings
								set include border of current export settings to false
								
								-- exports each item separately
								set area type of current export settings to selected graphics
								
								-- exports each layer in full canvas size
								--set area type of current export settings to current canvas
								
								set draws background of current export settings to false
								set export scale of current export settings to myScale
								set resolution of current export settings to myResolution
								set border amount of current export settings to 0.0
								
								-- do the export and save
								save oDoc as exportFileType in exportFileName
								-------------------------------------------------------------- DONE EXPORT
								
								set end of foundGraphics to {|canvas|:currentCanvas, |canvasName|:canvasName, |exportName|:exportName, |layer|:currentLayer, |layerName|:layerName, |graphic|:currentGraphic, |group|:"NO"}
								
								set gindex to gindex + 1
							end if
						end repeat -- currentGraphic
						
					end if -- if numGraphics > 0
					
				end if -- if done is 0
				
			end repeat -- currentLayer
			
			set cindex to cindex + 1
		end repeat -- currentCanvas
		
		set canvas of front window to origCanvas
		
	end tell
	return foundGraphics
	
end getExportGraphics
 
You can deal with the shared layer(s) separately by querying on the class property.

Code:
tell application id "OGfl"
	tell front document
		repeat with oCanvas in canvases
			repeat with oUnsharedLayer in (layers of oCanvas where class is not shared layer) as list
				-- harvest from unshared layers of each Canvas
			end repeat
		end repeat
		
		tell front canvas
			repeat with oSharedLayer in (layers where class is shared layer) as list
				-- harvest each shared layer from just one of the canvases which parent it
				
			end repeat
		end tell
	end tell
end tell

Last edited by RobTrew; 2011-12-07 at 07:51 PM.. Reason: typo --> you *can* :-)
 
Thanks Rob for your response.
The problem I'm having is not in finding and iterating over the shared layers, but rather in iterating over their contained shapes, and, in particular in actually selecting them, so that they can be individually exported as images.

The following code is what is NOT working, but might illustrate my intent better that the previous example (I've stripped it down to show just the relevant part). In your provided code, this would be inserted just under the comment line beginning with 'harvest each shared layer'...

The error I'm getting is:
"Can't set window 1 of canvas 1 of document 1 to { item 1 of every graphic of item 1 of {layer "title" of canvas id 7 of document "test.graffle", layer "bg" of canvas id 7 of document "test.graffle"} }

Any ideas??? Thanks again.
ST
Code:
repeat with currentGraphic in every graphic of oSharedLayer
  set gclass to class of currentGraphic
  log "Current SHARED graphic: " & gclass
  set selectionGraphics to {}
  set end of selectionGraphics to currentGraphic
  set selection of front window to selectionGraphics

  set exportFileName to export_folder & exportName & "." & exportFileExtension
  log "Exporting IMAGE: " & exportName & "." & exportFileExtension & " "
  set exportType to exportFileType
						
  -- export settings
  set include border of current export settings to false
						
  -- exports each item separately
  set area type of current export settings to selected graphics
						
  set draws background of current export settings to false
  set export scale of current export settings to myScale
  set resolution of current export settings to myResolution
  set border amount of current export settings to 0.0
  						
  -- do the export and save
  save oDoc as exportFileType in exportFileName
end repeat
 
Looks to me as if you may indeed have hit a bug in the implementation of OmniGraffle's Applescript library.

I would report it through OG's main menu:
Help > Send Feedback ... including a link to the url of this thread.

The second half of the following code fails (Applescript can get references to individual graphics on unshared layers but not on shared layers).

Code:
tell application id "OGfl"
	set oWin to front window
	tell front document
		repeat with oCanvas in canvases
			repeat with oUnsharedLayer in (layers of oCanvas where class is not shared layer) as list
				-- harvest from unshared layers of each Canvas
				set lstID to id of graphics of oUnsharedLayer
				repeat with lngID in lstID
					set lngID to contents of lngID
					graphics of oUnsharedLayer
					
					-- WORKS 
					set oGraphic to graphic id lngID of oUnsharedLayer
					set selection of oWin to {oGraphic}
					selection of oWin
					{}
				end repeat
			end repeat
		end repeat
		
		set oCanvas to front canvas
		tell oCanvas
			repeat with oSharedLayer in (layers where class is shared layer) as list
				-- harvest each shared layer from just one of the canvases which parent it
				set lstID to id of graphics of oSharedLayer
				repeat with lngID in lstID
					set lngID to contents of lngID
					graphics of oSharedLayer
					
					-- BOTH FAIL -- BUG IN OG APPLESCRIPT ?
					set oGraphic to graphic id lngID of oSharedLayer
					set oGraphic to graphic id lngID of oCanvas
					
					set selection of oWin to {oGraphic}
					selection of oWin
					{}
				end repeat
			end repeat
		end tell
	end tell
end tell
There may be a clue in these two screen dumps from Script Debugger. The Applescript library is not offering a properly resolved reference to the canvas from shared layers (<<class >> rather than canvas)



In contrast, this works properly from ordinary layers:

Last edited by RobTrew; 2011-12-07 at 08:49 PM..
 
 


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes


Similar Threads
Thread Thread Starter Forum Replies Last Post
Shared Layers Question robrob OmniGraffle General 1 2010-02-24 04:11 PM
shared layers kajtzu OmniGraffle General 2 2009-09-24 08:45 AM
Converting Standard Layers to Shared Layers PRV OmniGraffle General 3 2009-07-07 09:48 AM
Shared Layers nickf OmniGraffle General 8 2009-03-11 02:06 PM
Inheriting shared layers hardcoreUFO OmniGraffle General 2 2008-01-05 05:40 PM


All times are GMT -8. The time now is 03:48 AM.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2020, vBulletin Solutions, Inc.