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

 
Script: Zoom all canvases to fit whole diagram Thread Tools Search this Thread Display Modes
A draft script:

Code:
-- ZOOM ALL CANVASES IN CURRENT OMNIGRAFFLE DOCUMENT TO FIT WHOLE DIAGRAM

property pTitle : "Zoom All Canvases to Fit"
property pVer : "0.8"

property plstMenuItem : {"View", "Zoom", "Zoom to Selection"}

-- ADJUST THIS TO A VALUE SLIGHTLY BELOW 1.0 TO DECREASE THE DEFAULT LEVEL OF ZOOM
property pZoomScale : 0.9

on run
	if not GUIEnabled() then return
	
	-- GET A REFERENCE TO VIEW > ZOOM > ZOOM TO SELECTION
	set mnuZoomFit to GetMenuItem("OGfl", plstMenuItem)
	
	-- LOOP THRU EACH CANVAS, 
	--    SELECTING ALL GRAPHICS AND ZOOMING TO SELECTION, 
	-- 	AND ALLOWING FOR A FRACTIONAL ADJUSTMENT OF THE DEGREE OF ZOOM
	--     (THEN RESTORE ORIGINAL SELECTION)
	tell application id "OGfl"
		activate
		tell front window
			try
				set oFrontCanvas to its canvas
			on error
				return
			end try
			
			repeat with oCanv in canvases of its document
				set canvas of it to oCanv
				
				-- RECORD EXISTING SELECTION
				set lstSeln to its selection
				
				-- ZOOM TO FIT WHOLE DIAGRAM
				set its selection to graphics of oCanv
				tell application id "sevs" to click mnuZoomFit
				if pZoomScale ≠ 1.0 then set its zoom to (its zoom) * pZoomScale
				
				-- RESTORE ORIGINAL SELECTION
				set its selection to lstSeln
			end repeat
			set its canvas to oFrontCanvas
		end tell
	end tell
end run


-- RETURNS A REFERENCE TO A CLICKABLE MENU ITEM
-- E.G. set mnuZoomFit to GetMenuItem("OGfl", {"View", "Zoom", "Zoom to Selection"})
on GetMenuItem(strAppCode, lstMenu)
	set lngChain to length of lstMenu
	if lngChain < 2 then return missing value
	
	tell application id "sevs"
		set lstApps to application processes where its creator type = strAppCode
		if length of lstApps < 1 then return missing value
		tell first item of lstApps
			-- GET THE TOP LEVEL MENU
			set strMenu to item 1 of lstMenu
			set oMenu to menu strMenu of menu bar item strMenu of menu bar 1
			
			-- TRAVEL DOWN THROUGH ANY SUB-MENUS
			repeat with i from 2 to (lngChain - 1)
				set strMenu to item i of lstMenu
				set oMenu to menu strMenu of menu item strMenu of oMenu
			end repeat
			
			-- AND RETURN THE FINAL MENU ITEM
			return menu item (item -1 of lstMenu) of oMenu
		end tell
	end tell
end GetMenuItem

on GUIEnabled()
	tell application id "sevs"
		if UI elements enabled then
			return true
		else
			activate
			display dialog "This script depends on enabling access for assistive devices in system preferences" buttons "OK" default button "OK" with title pTitle & "   " & pVer
			tell application id "sprf"
				activate
				set current pane to pane id "com.apple.preference.universalaccess"
			end tell
			return false
		end if
	end tell
end GUIEnabled

Last edited by RobTrew; 2011-12-21 at 11:03 AM.. Reason: Ver 0.8 generalizes GUI access to items nested in submenus
 
GUI scripting eh? Thanks again for your work on this.
 
Well, 'whatever works' ... :-)

( High-minded principle is all very well, but it wasn't the Enlightenment that doubled the human population during the 18c – it was the potato, with a little help from the peanut ).

Happy feasting !
 
Made some tweaks to the above script as my needs are slightly simpler. As opposed to zooming each page to the maximum size to fit all objects, my edit simply goes through each page and hits the "Fit in Window" menu command. I realised afterwards this was my mistake for requesting the wrong menu command in the first place. Taking out the object selection saving/select all/zoom/reset selection code also had the side effect of speeding it up a bit.

Thanks again for your script. This is a huge timesaver for me.

Code:
-- ZOOM ALL CANVASES IN CURRENT OMNIGRAFFLE DOCUMENT TO FIT IN WINDOW

property pTitle : "Zoom All Canvases to Fit"
property pVer : "0.7"

property pMenu : "View"
property pSubMenu : "Zoom"
property pCmd : "Fit in Window"

on run
	if not GUIEnabled() then return
	
	tell application id "OGfl"
		activate
		tell application id "sevs"
			set lstApps to application processes where name contains "OmniGraffle"
			if length of lstApps < 1 then return
			tell first item of lstApps
				tell menu bar 1
					tell menu pMenu of menu bar item pMenu
						tell menu pSubMenu of menu item pSubMenu
							set mnuZoomFit to menu item pCmd
						end tell
					end tell
				end tell
			end tell
		end tell
		tell front window
			try
				set oFrontCanvas to its canvas
			on error
				return
			end try
			
			repeat with oCanv in canvases of its document
				set canvas of it to oCanv
				-- ZOOM TO FIT
				tell application id "sevs" to click mnuZoomFit
			end repeat
			set its canvas to oFrontCanvas
		end tell
	end tell
end run

on GUIEnabled()
	tell application id "sevs"
		if UI elements enabled then
			return true
		else
			activate
			display dialog "This script depends on enabling access for assistive devices in system preferences" buttons "OK" default button "OK" with title pTitle & "   " & pVer
			tell application "System Preferences"
				activate
				set current pane to pane id "com.apple.preference.universalaccess"
			end tell
			return false
		end if
	end tell
end GUIEnabled
 
Good idea.

I've added that one to my keyboard macros too.

(I've also generalized the original to make it easier to get a reference to a GUI menu item nested, to arbitrary depth, inside sub-menus).

It uses a function like this:

Code:
-- RETURNS A REFERENCE TO A CLICKABLE MENU ITEM
-- E.G. set mnuZoomFit to GetMenuItem("OGfl", {"View", "Zoom", "Zoom to Selection"})
on GetMenuItem(strAppCode, lstMenu)
	set lngChain to length of lstMenu
	if lngChain < 2 then return missing value
	
	tell application id "sevs"
		set lstApps to application processes where its creator type = strAppCode
		if length of lstApps < 1 then return missing value
		tell first item of lstApps
			-- GET THE TOP LEVEL MENU
			set strMenu to item 1 of lstMenu
			set oMenu to menu strMenu of menu bar item strMenu of menu bar 1
			
			-- TRAVEL DOWN THROUGH ANY SUB-MENUS
			repeat with i from 2 to (lngChain - 1)
				set strMenu to item i of lstMenu
				set oMenu to menu strMenu of menu item strMenu of oMenu
			end repeat
			
			-- AND RETURN THE FINAL MENU ITEM
			return menu item (item -1 of lstMenu) of oMenu
		end tell
	end tell
end GetMenuItem

Last edited by RobTrew; 2011-12-21 at 11:17 AM..
 
Neat modification - have applied it to my script.

I've found this doesn't work in Lion's fullscreen mode – I'm assuming because it messes with the concept of a frontmost window and things like that. Are there workarounds to this, or is it a limitation of fullscreen mode?
 
In order not to have the script fail silently in fullscreen mode, I've borrowed and modified a function from Doug's iTunes applescripts. Below is the latest complete version of the script I'm using. It now shows an error if run in fullscreen mode.

Hope this is helpful to others.

Code:
-- ZOOM ALL CANVASES IN CURRENT OMNIGRAFFLE DOCUMENT TO FIT IN WINDOW

property pTitle : "Zoom All Canvases to Fit"
property pVer : "0.8"


on run
	-- Make sure "Enable access for assistive devices" is switched on in System Preferences
	if not GUIEnabled() then return
	
	-- Check whether app is running in full screen mode. If yes, display alert and upon dismissal of alert, quit script.
	if isFullScreen("OGfl") then
		delay 0.1
		set opt to (display alert "OmniGraffle Professional is in full screen mode." message "This script cannot run while OmniGraffle Professional is in full screen mode.
		
You can quit and re-launch this script after exiting full screen mode." buttons "OK" default button "OK" as warning giving up after 30)
		tell application id "OGfl" to activate
		return false
	end if
	
	-- Set the menu command to run on each canvas in the document
	set mnuZoomFit to GetMenuItem("OGfl", {"View", "Zoom", "Fit in Window"})
	
	-- Perform menu command on each canvas in the document
	tell application id "OGfl"
		activate
		tell front window
			try
				set oFrontCanvas to its canvas
			on error
				return
			end try
			
			repeat with oCanv in canvases of its document
				set canvas of it to oCanv
				-- ZOOM TO FIT
				tell application id "sevs" to click mnuZoomFit
			end repeat
			set its canvas to oFrontCanvas
		end tell
	end tell
end run

-- Checks whether Accessibility Preferences have been set to "Enable access for assistive devices"
on GUIEnabled()
	tell application id "sevs"
		if UI elements enabled then
			return true
		else
			activate
			display dialog "This script depends on enabling access for assistive devices in system preferences" buttons "OK" default button "OK" with title pTitle & "   " & pVer
			tell application "System Preferences"
				activate
				set current pane to pane id "com.apple.preference.universalaccess"
			end tell
			return false
		end if
	end tell
end GUIEnabled

-- Checks whether an application is in full screen mode in Lion
on isFullScreen(strAppCode)
	try
		tell application id "sevs"
			set lstApps to application processes where its creator type = strAppCode
			if length of lstApps < 1 then return missing value
			tell first item of lstApps
				return (get value of attribute "AXFullScreen" of window 1)
			end tell
		end tell
	on error
		return false
	end try
end isFullScreen

-- Returns a reference to a clickable menu item
-- E.G. set mnuZoomFit to GetMenuItem("OGfl", {"View", "Zoom", "Zoom to Selection"})
on GetMenuItem(strAppCode, lstMenu)
	set lngChain to length of lstMenu
	if lngChain < 2 then return missing value
	
	tell application id "sevs"
		set lstApps to application processes where its creator type = strAppCode
		if length of lstApps < 1 then return missing value
		tell first item of lstApps
			-- Get the top level menu
			set strMenu to item 1 of lstMenu
			set oMenu to menu strMenu of menu bar item strMenu of menu bar 1
			
			-- Travel down through any sub-menus
			repeat with i from 2 to (lngChain - 1)
				set strMenu to item i of lstMenu
				set oMenu to menu strMenu of menu item strMenu of oMenu
			end repeat
			
			-- And return the final menu item
			return menu item (item -1 of lstMenu) of oMenu
		end tell
	end tell
end GetMenuItem
 
Quote:
Originally Posted by Nigelw View Post
this doesn't work in Lion's fullscreen mode I'm assuming because it messes with the concept of a frontmost window
I'm keeping away from Lion, so FullScreen is one of my scripting blind spots. My understanding is that, as you suggest, the Full Screen window is not necessarily the first member of the window collection.

Can't test this (attribute "AXFullScreen" is undefined and trips an error on 10.6) but I wonder if you can run code along these lines:
Code:
tell application id "sevs"
	set lstApps to application processes where its creator type = "OGfl"
	if length of lstApps < 1 then return missing value
	tell first item of lstApps
		set oWin to missing value
		try
			set oWin to first window where value of attribute "AXFullScreen" is true
		end try
		
		if oWin is not missing value then
			-- work with this full screen window ?
		end if
	end tell
end tell
 
Hm, well I may have an error in the modification I tried to make to your code, but this is what I got.

I first tried displaying a dialog, like so:

Code:
on isFullScreen(strAppCode)
	try
		tell application id "sevs"
			set lstApps to application processes where its creator type = "OGfl"
			if length of lstApps < 1 then return missing value
			tell first item of lstApps
				set oWin to missing value
				try
					set oWin to first window where value of attribute "AXFullScreen" is true
				end try
				
				if oWin is not missing value then
					display dialog "This is a test" buttons "OK" default button "OK" with title pTitle & "   " & pVer
				end if
			end tell
		end tell
	on error
		return false
	end try
end isFullScreen
This was successful. I then replaced the dialog with the "Fit in Window" loop:

Code:
on isFullScreen(strAppCode)
	try
		tell application id "sevs"
			set lstApps to application processes where its creator type = "OGfl"
			if length of lstApps < 1 then return missing value
			tell first item of lstApps
				set oWin to missing value
				try
					set oWin to first window where value of attribute "AXFullScreen" is true
				end try
				
				if oWin is not missing value then
					repeat with oCanv in canvases of its document
						set canvas of it to oCanv
						-- ZOOM TO FIT
						tell application id "sevs" to click mnuZoomFit
					end repeat
				end if
			end tell
		end tell
	on error
		return false
	end try
end isFullScreen
This didn't seem to do anything. I'd play around more but work calls.

By the way, fullscreen OmniGraffle is something to look forward to if/when you upgrade to Lion. It's a far bigger improvement than I imagined it would be.
 
You would probably need to make sure that 'it' refers to the window. Sth like:

Code:
if oWin is not missing value then
	tell oWin
		repeat with oCanv in canvases of its document
			set canvas of it to oCanv
			-- ZOOM TO FIT
			tell application id "sevs" to click mnuZoomFit
		end repeat
	end tell
end if
 
 


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes


Similar Threads
Thread Thread Starter Forum Replies Last Post
Global zoom level for multiple canvases chrishan OmniGraffle General 6 2013-01-24 03:22 PM
Script: Export from FoldingText outline to OmniGraffle diagram RobTrew OmniGraffle General 0 2012-10-04 12:44 PM
how do I break process diagram into separate pages and display diagram name on every page Chien OmniGraffle General 0 2012-04-25 06:38 AM
Is there any way to set zoom across multiple canvases? fjordaan OmniGraffle General 7 2011-08-24 05:32 AM
multiple master canvases, new canvases wynntemp OmniGraffle General 2 2009-02-23 01:44 PM


All times are GMT -8. The time now is 01:51 PM.


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