Hatena::ブログ(Diary)

名もないテクノ手 このページをアンテナに追加 RSSフィード

EPUB版『InDesign者のための正規表現入門』

InDesignのTips一覧

2009-12-11

[][]アイコンの座標を数値で変更する

ちょっと必要に迫られて、Finderのアイコン位置を座標値で確認・変更したくてちょろっと書きました。探せば便利なユーティリティもあるんでしょうけれど、とりあえずこれで十分てな場合。

(*
icon_position.app

Finder上のアイコンの座標位置の確認と変更

2009-12-11	とりあえず
*)


on run
	tell application "Finder"
		activate
		set my_icons to selection
		if my_icons is {} then display dialog "Finderでアイコンを選択してから実行してください。"
		repeat with i in my_icons
			set aFile to contents of i
			my doit(aFile)
		end repeat
	end tell
end run

on open of theFiles
	tell application "Finder"
		activate
		repeat with i in theFiles
			set aFile to contents of i
			my doit(file aFile)
		end repeat
	end tell
end open


to doit(aFile)
	tell application "Finder"
		activate
		set my_position to my as_join(", ", position of aFile)
		set ans to display dialog "「" & (name of aFile) & "」のアイコンポジション「x, y」座標は下記の通りです。" & return & "変更したい場合は数値を変えて「変更ボタンをクリックしてください」" default answer my_position buttons {"キャンセル", "次へ", "変更"} default button 3
		if button returned of ans is "変更" then
			set position of aFile to my as_split(", ", text returned of ans)
			update container of aFile --★これだけだとicon位置は変わらない。あれれ...
			close container of aFile --仕方ないのでフォルダを閉じてから開く
			open container of aFile
		end if
	end tell
end doit



to as_join(thedelimit, theList)
	set oldDelim to AppleScript's text item delimiters
	set AppleScript's text item delimiters to thedelimit
	set tmpstr to theList as text
	set AppleScript's text item delimiters to oldDelim
	return tmpstr
end as_join

to as_split(thedelimit, theText)
	set oldDelim to AppleScript's text item delimiters
	set AppleScript's text item delimiters to thedelimit
	set tmpList to every text item of theText
	set AppleScript's text item delimiters to oldDelim
	return tmpList
end as_split

★の部分、updateコマンドってなぜか効かないです。あれれ...おかしいな。使い方が間違っているんでしょうか。。。仕方ないからウインドウを結んで開いて表示を更新する始末^^

参照

AppleScript 2.1 Help: Update

2009-12-07

[][][][]特定のラベルを持つファイル(フォルダ)だけを探したい

特定のルールを決めてラベル付けしているMacユーザーは多いと思います。あんまり気軽に付けられるものだから、深い階層のファイルまでラベル付け放題で、どこに付けたんだかわからなくなっている人も多いかもしれません(俺だ)。

f:id:seuzo:20091206175755g:image

そんな時はフォルダの検索窓からラベルを検索するといいですよ。

f:id:seuzo:20091206175756g:image

この時のラベル番号は

数字ラベルの色
0無し
1グレー
2グリーン
3パープル
4ブルー
5イエロー
6レッド
7オレンジ

になっています。

だが、しかし! このファイル検索はSpotlightの一種なので、Spotlightを有効にしていない人(場所)についてはスルーしてくれます。まあ、そうですね。

で、AppleScriptでフォルダ(またはファイル)をドラッグ&ドロップすると探してくれるのを書いてみました。応急処置なので深く考えていません。なにげなくentire contentsとか使っているけど、大丈夫なのかな?*1 

ASのラベル番号はなぜだかSpotlightの番号とは違います(Finderで見える通りなので、むしろこっちが順番わかりやすい)。

数字ラベルの色
0無し
1レッド
2オレンジ
3イエロー
4グリーン
5ブルー
6パープル
7グレー
(*
copy_label_files
指定ラベルの付いたファイルのフルパスをクリップボードにコピーします。

-Mac OS X 10.6.1

2009-12-06
*)

--------------------------------------------------------●ドラッグ&ドロップされた
on open of theFiles
	tell application "Finder"
		activate
		set my_label_No to text returned of (display dialog "探したいラベルナンバーを0〜7の数字で入力してください" default answer "1") --探したいラベルナンバー
		set my_label_No to my_label_No as integer
		set my_data to ""
		
		try
			repeat with aFile in theFiles
				if (kind of aFile) is ("フォルダ" as Unicode text) then
					set all_items to entire contents of aFile
					repeat with ii in all_items
						if label index of ii is my_label_No then
							set my_data to my_data & (ii as Unicode text) & return
						end if
					end repeat
				else
					if label index of aFile is my_label_No then
						set my_data to my_data & (aFile as Unicode text) & return
					end if
				end if
			end repeat
		on error errMsg number errNum
			display dialog ((name of aFile) as Unicode text) & return & "Error! This file failure." & return & errMsg buttons {"Cancel"}
		end try
		
		if my_data is "" then
			
			display dialog "ラベル番号" & my_label_No & "を持つアイテムはありませんでした"
		else
			set the clipboard to my_data
			display dialog "" & (count paragraph of my_data) & "個のアイテムが見つかりました。" & return & "以下のデータをクリップボードにコピーしました" & return & my_data
		end if
	end tell
end open

*1:entire contentsは再帰的にフォルダ内を調べるのでたくさんのファイルを持つフォルダを投げるとエラーになります。以前(classic時代)はentire contentsにバグがあって、ほとんど使ったことありません。再帰処理で書きたくなかったんですすいません^^

2009-08-05

[][]ファイルの作成日を変更する

パッケージの作成日 - InD-Board

作成日ってのは普通変えられない。Finderでも変えられないし、AppleScriptでもR/Oで変えられない。けれどSetFileコマンドで変えられるんだな、やっていいことか悪いことかわかんないけど^^

ということでこんな感じ。まずは、元日付を得たいファイルをドラッグ&ドロップして「Get」ボタンで設定をする。それから日付を変更したいファイルをドラッグ&ドロップして「Set」ボタンで変更するって具合。もし設定時間を現在時にしたかったらダブルクリックする。

f:id:seuzo:20090804203548p:image

property my_date : (current date) --日付

on run
	set date_now to (current date)
	display dialog ("Do you change setting, Now." & return & "TO : " & (date_now)) buttons {"Cancel", "Change"} default button 2
	set my_date to date_now
end run

on open of theFiles
	tell application "Finder"
		activate
		set ans to button returned of (display dialog ("The present setting is... " & return & (my_date)) buttons {"Cancel", "Get", "Set"} default button 3)
		if ans = "Get" then
			display dialog ("The present setting is..." & return & (my_date)) buttons {"Cancel", "OK"} default button 2
			set my_date to (creation date of item 1 of theFiles)
		else if ans = "Set" then
			repeat with i in theFiles
				if (locked of i) then
					display dialog ((name of i) as Unicode text) & " is Locked." buttons {"Cancel", "Unlock"} default button 1
					set locked of i to false
				end if
				set my_modDate to modification date of i
				if (my_modDate < my_date) then
					display dialog ("Woops! creation date is the future than modification date.") buttons {"Cancel", "Change"} default button 1
				end if
				try
					set tmp_path to (quoted form of POSIX path of i) as Unicode text
					do shell script "SetFile -d '" & my date2str(my_date) & "' " & tmp_path
				on error errMsg number errNum
					display dialog ((name of i) as Unicode text) & return & "Error! This file failure." & return & errMsg
				end try
				
			end repeat
		end if
	end tell
end open



--文字列をdate型に変換。ただし、"MM/DD/YYYY hh:mm:ss"フォーマットのみ
to str2date(str)
	set date_now to current date
	set month of date_now to (text 1 thru 2 of str) as number
	set day of date_now to (text 4 thru 5 of str) as number
	set year of date_now to (text 7 thru 10 of str) as number
	set hh to (text 12 thru 13 of str) as number
	set mm to (text 15 thru 16 of str) as number
	set ss to (text 18 thru 19 of str) as number
	set time of date_now to (hh * 3600) + (mm * 60) + ss
	
	return date_now
end str2date

--date型を文字列に変換。ただし、"MM/DD/YYYY hh:mm:ss"フォーマットのみ
to date2str(aDate)
	set my_month to my add_zero((month of aDate) as number)
	set my_day to my add_zero(day of aDate)
	set my_year to my add_zero(year of aDate)
	set my_time to time string of aDate
	
	return "" & my_month & "/" & my_day & "/" & my_year & " " & my_time
end date2str

--ゼロパディング(一桁の数字だったら"0"を前につけるだけ)
to add_zero(num)
	set num to num as Unicode text
	if (count character of num) is 1 then set num to "0" & num
	return num
end add_zero

※思いつきで書いた部分もあるので、うまく動作しなかったらご指摘ください。

2008-04-20

[][][][][][]ドキュメントウインドウの大きさを数値で指定

同じ大きさのウインドウキャプチャを撮るために、ウインドウの大きさを指定します。

とりあえず、とりあえずですいません。

InDesign CS3
set my_width to 500
set my_hight to 300

tell application "Adobe InDesign CS3"
	tell window 1
		set my_bounds to bounds
		set y1 to item 1 of my_bounds
		set x1 to item 2 of my_bounds
		set y2 to item 3 of my_bounds
		set x2 to item 4 of my_bounds
		display dialog "width : " & x2 - x1 & return & "hight : " & y2 - y1
		set bounds to {y1, x1, y1 + my_hight, x1 + my_width}
		activate
		
	end tell
end tell
Safari 3.1
set my_width to 800
set my_hight to 1000

tell application "Safari"
	tell window 1
		set my_bounds to bounds
		set x1 to item 1 of my_bounds
		set y1 to item 2 of my_bounds
		set x2 to item 3 of my_bounds
		set y2 to item 4 of my_bounds
		display dialog "width : " & x2 - x1 & return & "hight : " & y2 - y1
		set bounds to {x1, y1, x1 + my_width, y1 + my_hight}
		activate
	end tell
end tell
Acrobat 8.1.2
set my_width to 700
set my_hight to 900

tell application "Adobe Acrobat Professional"
	tell window 1 of document 1
		set my_bounds to bounds
		set x1 to item 1 of my_bounds
		set y1 to item 2 of my_bounds
		set x2 to item 3 of my_bounds
		set y2 to item 4 of my_bounds
		display dialog "width : " & x2 - x1 & return & "hight : " & y2 - y1
		set bounds to {x1, y1, x1 + my_width, y1 + my_hight}
		activate
	end tell
end tell
Finder
set my_width to 500
set my_hight to 300

tell application "Finder"
	tell window 1
		set my_bounds to bounds
		set x1 to item 1 of my_bounds
		set y1 to item 2 of my_bounds
		set x2 to item 3 of my_bounds
		set y2 to item 4 of my_bounds
		display dialog "width : " & x2 - x1 & return & "hight : " & y2 - y1
		set bounds to {x1, y1, x1 + my_width, y1 + my_hight}
		activate
	end tell
end tell
mi 2.1.8
set my_width to 500
set my_hight to 700

tell application "mi"
	tell window 1
		set my_bounds to bounds
		set x1 to item 1 of my_bounds
		set y1 to item 2 of my_bounds
		set x2 to item 3 of my_bounds
		set y2 to item 4 of my_bounds
		display dialog "width : " & x2 - x1 & return & "hight : " & y2 - y1
		set bounds to {x1, y1, x1 + my_width, y1 + my_hight}
		activate
	end tell
end tell

ほとんど似てるけど、ちょっとづつ違うんである。ヒマがあったら、なんか統一的な形で書きたいなあ。当分ムリ。