1. トップ
  2. コラム

目次

バージョン1.2.9について

v1.2.8の場合

v1.2.9の場合

※画像上でスクロールすると拡大縮小します。
また、クリックードラッグすると移動します。

先日SOCSSを1.2.9にバージョンアップしました。
今回はバージョンアップ1.2.9の裏話的なことを書いて見たいと思います。
正式なバージョンアップの内容はバージョンアップ情報 v1.2.9をご覧ください。

さて、 今回のバージョンアップではSVGの入出力を見直しました。事の発端は今年(2018年)の年賀状のために作ったイラストを'インクスケープ'に 読み込ませるために'SVG'に変換した事です。'インクスケープ'はUNIXベースのドロー系アプリで'SVG'に深くコミットしていて、標準のファイルフォーマット が'.svg'になっているほどです。なのでSVGの入出力の検証では'インクスケープ'ファイルを基準にしています。で、変換して見ると左図上の様な状態になってしましました。

ああ〜そうだ!マスク、と影(SVG的にはGaussianBlur-Filter)に対応していなかったんだ。と思い出し、プログラムに手を入れたわけです。 左下側のイラストは今回のバージョンでSVGに変換したものです。
犬の輪郭部分の淡いグラデーションでは影を、ほっぺの部分ではマスク機能を使っています。

そして、ここで重大なことに気がついてしまったのです。マスクの効果がSVGとSOCSSでは逆だということに。 注目して欲しいのが、ほっぺの部分です。バージョン1.2.8版では端がピンク色で中央が白く四角くなっています。 下の図を見てください。

mac(SOCSS)では白色が100パーセント透明で、黒へ向かって段々と不透明度があがり、黒で完全な不透明(従ってベースが100パーセント反映される)となります。 そしてSVGではその逆になってます。
SOCSSをリリースして、今更ながら気がついたわけですが、今後のことを考えるとsvgとの互換性を考えてバージョン1.2.9からSVG方式を標準とすることにしました。

マスク機能を使用しているユーザーの皆様にはご迷惑をおかけします。
マスクを使ったファイルをバージョン1.2.9で開くとおかしく見えてしまいます。その場合はマスク画像を反転するか '環境設定'->'一般'に新たに設けた'マスク効果をSVG方式にする'のチェックをはずしてください。

これでいままでの方式のマスクになります。以上よろしくお願いします。


次に、ユーザーの一人からLaTeXiTという数式ソフトのドラッグ&ドロップに対応して欲しいと要望があり、以前から数式にはなんらかの形で対応したい思っていたので LaTeXiTについて色々しらべて見ました。
以前から画像ファイル(PDFを含む)のドラッグ&ドロップ(つまりFinderからのドラッグ&ドロップ)には対応していました。この場合渡ってくるのは 画像ファイルの場所を示すパスです。で、LaTeXiTを調べて見ると渡ってくるのは画像のデーター(文字列)そのものです。なのでFinderのパスから画像データーを 取得し、そのデーターをイメージ化する。という手順から'パスからデーターを取得する'部分をはぶくだけで対応できました。
又、LaTeXiTは'SVG'もサポートしていたので、SVGも読み込める様にしました。SVGの場合は図形として読み込むので(具体的にはスプラインを含んだグループ図形) その後数式を色々と加工することが可能です。

ついでに、文章図形でも画像の取り込み(PDFを含む)に対応して見ました。

Macのテキスト処理システムは優秀で、普通の使い方ならフレームワークが用意したオブジェクトをそのまま使うだけ十分です。
今回もNSTextViewを継承したオブジェクト初期化時にプロパティ'importsGraphics'をYESに変更しただけです。 これだけで画像の取り込みから保存まで自動で行ってくれます。
ただ、SVGには対応していません。SVGを取り込もうとすると(例えばLaTeXiTからドラッグ&ドロップ)生データーがそのまま、文字列化した状態で取り込まれてしまいますのでご注意を

最後にパス(直線、多角形、スプライン)編集時に長さ表示のオプションをつけてみました。
(左Video参照)表示が必要な人は"環境設定"->"一般"で"編集時の長さ表示"に チェックを入れてください。単位はミリメートル、メートル、キロメートルの3種類です。

私自身は建築出身で、図面作成ではこのような機能を必要と感じたことはないのですが、SOCSSは色々な用途に使える 汎用CADを目指しているので必要な人もいるかと思いつけてみました。特に曲線の使用が多い洋裁CAD?に有用ではないかと思っています。
今後ともMac上で動作する最も使い安い汎用CADを目指し改良を重ねていくつもりです。
そのためにも皆様のご意見ご要望をおまちしております。

多角形の重心を求めるスクリプト

今回は多角形の重心を計算し、その位置に点マーカーを表示するスクリプトです。
選択された多角形に対し、その重心の位置に点マーカーを生成します。
いつものようにスクリプトを掲載し、簡単に説明したいと思います。

1 tell application "SOCSS"
2 tell current document
3 tell current section
4 set shp to selected shape 1
5 if class of shp is equal to polygon then
6 set xCo to x coordinate of shp
7 set yCo to y coordinate of shp

8 set v to gravity_of_polygon(xCo, yCo, count of xCo) of me
9 set nx to item 1 of v
10set ny to item 2 of v

11clear selected shapes
12set newmarker to make new marker with properties{x origin:nx, y origin:ny}
13add to selected shapes newmarker

14end if
15end tell
16end tell
17end tell

2行目、現在の書類に対して、と言う意味。
3行目、現在の部分図に対して、と言う意味。
4行目、選択された図形の集合(配列)の一番目の図形を変数'shp'にセット。
5行目、shpにセットした図形が多角形(polygon)かどうかをチェック。
6行目、多角形'shp'のX座標の配列を'xCo'変数にセット。
7行目、多角形'shp'のY座標の配列を'yCo'変数にセット。
8行目、'gravity_of_polygon()'は実際に重心を計算する関数(ハンドラ)多角形のX,Yそれぞれの座標の配列と配列の要素数を渡しています。 戻り値は重心を示す配列で'{X座標, Y座標}'となっています。
9,10行目、多角形の重心のX座標,Y座標をそれぞれ変数'nx','ny'にセット。
11行目、選択状態の図形の選択を解除
12行目、点マーカーを生成し、それを変数'newmaker'にセット。
13行目、newmarkerを選択状態にしています。

次は実際に重心を計算している関数(ハンドラ)gravity_of_polygon()について簡単に説明します。

上図の様に多角形を三角形に分割し、それぞれの三角形の面積(S?)と重心(G?)を算出してそれを加重平均してX座標、Y座標を求めています。

1 on gravity_of_polygon(xCo, yCo, c)
2 set sx to item 1 of xCo
3 set sy to item 1 of yCo
4 set gx to 0.0
5 set gy to 0.0
6 set s to 0.0

7 repeat with i from 3 to c
8 set px to item(i-1) of xCo
9 set py to item(i-1) of yCo
10set x to item i of xCo
11set y to item i of yCo

12set s1 to traiangle_area(sx, px, x, sy, py, y)
13set pt to traiangle_center(sx, px, x, sy, py, y)

14set gx to s1*(item 1 of pt)+gx
15set gy to s1*(item 2 of pt)+gy
16set s to s1+s
17end repeat
18return {gx/s, gy/s}
19end gravity_of_polygon

2行目、変数'sx'に1番目のX座標をセット(上図でP0に相当)
3行目、変数'sy'に1番目のY座標をセット(上図でP0に相当)
7行目、繰り返し文,3から配列の数まで繰り返すという意味
8~11行目、それぞれp0以外の2点のX,Y座標をセットしている。
12行目、traiangle_area()3点の面積を計算する関数
13行目、traiangle_center()3点の重心を計算する関数,戻り値はX,Y座標の配列。
14行目、(三角形の)重心のX座標×面積を変数'gx'に加算している。
15行目、(三角形の)重心のY座標×面積を変数'gy'に加算している。
16行目、(三角形の)面積を変数's'に加算している。
18行目、加重した値を面責で割って重心のX,Y座標を算出。それを配列として返している。

以上です。

'通り芯と寸法線自動作成'スクリプトの改良

アップルスクリプトの弱点の一つはユーザーインターフェースが貧弱な点です。
スクリプトだからしょうがないという面もありますが、例えばユーザーに入力を求める場合、テキストフィールドを 一つしか表示させることが出来ません。

そこでSOCSSではv1.1.7からユーザーに入力を求めるための表(リスト)を表示させるスクリプトコマンド'display table'を用意しました。
今回は以前コラムで紹介した通り芯と寸法線を自動作成するスクリプトをインタフェースを改良して 再度紹介します。

スクリプトはこのように指定した間隔で通り芯と寸法線を自動作成します。機能的には以前のスクリプトと全く変わっていません。
しかし、インターフェースはこのように変わりました。

だいぶ分かりやすくなったのではないでしょうか。特にSOCSS本体で使っている線幅、線種プルダウンメニューがそのまま
使えるようになっています。
興味のある方はサンプルページよりダウンロードしてみてください。

マスク、ブレンドで画像編集

今回は趣向を変えてグループ図形にあるマスク、ブレンド機能を使った画像編集を話題にします。

上図のような画像を貼り付けたいが白色の背景が邪魔だ。という場合があると思います。
SOCSSでは簡単にこの白い部分を抜くことが出来ます。早速やってみましょう。
まず、同サイズの四角形を画像の上に作図します。そして面色を黒、線色を無しにします。


四角形を下、背景を抜きたい画像を上に重ね、2つをグループ化します。
グループ図形をダブルクリックして編集パネルを表示させます。

マスクを選択します。


白い背景の部分が抜けました。これは上の画像がマスクの役割を果たしたからです。マスク画像では黒色で100%下の図形を透過、透明度0%
徐々に変化し白色で透過度0%、透明度100%になります。
つまり寿の文字の黒い部分が下の四角形を透過し、それ以外の白い部分は透明になっています。
なので下の四角形は特に黒にこだわる必要はなく、何色でもかまいません。例えば下四角形をグラデーションにしてみると

この様な感じになります。
さらに黒で作った画像を重ね合わせると.....

このように文字を強調した表現になったりします。色々試してみると楽しいでしょう。

次に応用編として下図のような画像を考えます。画像が単純な黒色ではないのでこのままではマスク画像としては使えません。
なので背景を抜くには一工夫必要です。


まず最初に画像をコピーして2つ用意します。そして、片方の画像の上に四角形を描きます。 四角形の面色を黒か濃いグレーにします。そして今度は四角形を上にして2つをグループ化し、ダブルクリックします。

今度はブレンド/焼き込みを選択します。


そうすると右側のような図形になると思います。うまくいかない場合には上に重ねる四角形の面色を調節してみてください。
画像によっては黒色でうまくいく場合や、グレー色でうまくいく場合があります。
この図形をマスクに使います。右側の図形を左の画像の上に重ねグループ化します。
ダブルクリックしてグループ編集パネルを表示。今度はマスクを選択します。


画像の背景が抜けました。この時、画像の周りに線が入る場合がります。気になる場合は
周辺の線よりも若干小さめの四角形を描き、またグループ化します。

クリップを選択します。

今度はきれいに抜けたと思います。
最終的に気に入ったら、出来た図形を画像化コマンド で画像に変換しましょう。

このようにSOCSSは製図のためのCADにとどまらず。様々な場面で利用出来る機能が満載です。是非活用してみてください。

建具番号スクリプトv2の説明

前回の続きで建具番号スクリプトv2の内容を説明したいと思います。
スクリプト自体は以前ブログに掲載した"文字列の作成とプロパティ変数について"内で詳しく
説明していますので、ここでは異なっている部分を中心に簡単に説明したいと思います。

まずいつものようにスクリプトをみてください。今回は簡単なので全文を載せています。

1 property aRadius:3.5
2 property aKind:""
3 property aNum:1
4 property canDisplayList:true
5 property kFontName:"HiraMinPro-W3"
6 property nFontName:"HiraMinPro-W3"
7 property kFontSize:7.0
8 property nFontSize:7.2

9 tell application "SOCSS"
10tell current document
11tell current section
12if canDisplayList is true then
13set aKind to choose from list {"AD", "AW", "SD", "WD", "WW"}
14set aNum to text returned of (display dialog "開始番号を入力してください"default answer 1)
15set canDisplayList to false
16end if

17clear selected shapes

18set vRect to visible rect
19set newRadius to aRadius*ratio
20set aRatio to ratio

21set cx to (item 1 of vRect)+(item 3 of vRect)*0.5
22set cy to (item 2 of vRect)+(item 4 of vRect)*0.5
23set kFont to kFontName & " " & kFontSize*ratio
24set nFont to nFontName & " " & nFontSize*ratio

25set gp to make new group
26tell gp
27make new circle with properties {x center:cx, y center:cy, radius:newRadius, line width code:2}
28make new line with properties {x start:cx-newRadius, y start:cy, x end:cx+newRadius, y end:cy}

29make new string with properties {x origin:cx, y origin:cy+1.6*aRatio, content:aKind, font:kFont, placement:middle center}
30make new string with properties {x origin:cx, y origin:cy-1.6*aRatio, content:aNum as text, font:nFont, placement:middle center}
31end tell

32add to selected shapes gp
33set aNum to aNum+1
34end tell
35end tell
36end tell

1 property aRadius:3.5 -> プロパティ宣言 + 変数名:初期値

プロパティ宣言した変数はオブジェクト(プログラム)化された場合メモリーとして存続し、
ここの値を変更することにより、プログラムの挙動を変えることができます。
重要なのは3行目の'aNum'(建具番号を記憶している)と、
4行目の'canDisplayList'(ここの値でリストを表示したり、しないようにしている。)です。

12行目〜16行目のif文が今回追加した部分です。
13行目 建具記号の選択を促すリストを表示するスクリプトです。

13 set + 変数名 + to + choose from list (コマンド名) + {..} (配列)

これで変数にユーザーが選択した。値(文字)が入ります。

14行目 建具番号の開始番号を促すダイアログを表示するスクリプトです。
ダイアログ表示について少々詳しく説明します。まず基本形は以下の通りです。

display dialog (コマンド名) + ".." (ダイアログに表示する文字列)

これを実行すると下図のようになります。

見てわかるように文字列を表示するだけで入力するテキストフィールドは表示されません。入力を促す
テキストフィールドを表示させるには 'default answer' を設定する必要があります。

set + 変数名 + to display dialog (コマンド名) + ".." (ダイアログに表示する文字列) default answer 1

これでテキストフィールドが表示されます。で、変数にセットされる戻り値ですが、こうなります。

{ button returned:"OK", text returned:"1" }

これは'apple script'ではレコードと呼ばれているもので、クリックしたボタン名とテキストフィールドの値が戻ってきます。 で、欲しい情報はテキストフィールドの値だけなので、スクリプトは

set aNum to text returned( display dialog "開始番号を入力してください" default answer 1 )

という形になります。

17〜24行目はほとんど前回のスクリプトと同じなので説明はこちらを参照してください
あと前回と違う点は建具番号がグループ化されているところです。図形をグループ化する手順は以下の通りです。

set gp to make new group (まずグループ図形をつくり、変数にセット)
tell gp 
グループ化したい図形を生成する。
end tell

まずグループ図形を作り、そのグループ図形に対してのtell構文内にグループ化したい図形を記述するだけです。
このようにして簡単にグループ図形を作成することが出ます。
以上です。

スクリプトコマンドの説明

SOCSSv1.2.1からスクリプトをより使いやすくなるように、'スクリプトコマンド'機能を追加しました。
'スクリプトコマンド'はスクリプトをSOCSS内部のコマンドと同等の使い易さを提供します。
このコラムではその使い方を説明したいと思います。

まずこのコラムのために新しく作り直した建具番号作成スクリプト(joinery_sign_v2)をサンプルページにアップしましたので、それを ダウンロードしてください。
次に環境設定パネルを表示して、新しく追加した'scriptPaths'ペインを選択します。

右側にある一番上の'設定'ボタンをクリックします。オープンパネルが表示されますので、
先ほど保存したスクリプトを指定します。


設定が完了したら、"OK"ボタンを押して、環境設定パネルを閉じます。

以上で、ツールパネルに追加したスクリプトコマンドボタンや、メニュー"その他/スクリプトコマンド..."
からスクリプトを実行することができます。


しかし、ここではショートカットキーを設定して、キー操作でスクリプトを呼び出す設定にしてみます。
まず、 ショートカット設定パネルを呼び出します。

"スクリプト 1"にショートカットキーを設定します。なんでも構いませんが、ここではファンクションキー'F1'に設定してみます。

なお、お使いのMacがノートブックの場合、ファンクションキーを有効にするためにシステム環境設定のキーボード内の下記欄にチェックを入れておく必要があります。


'F1'キーを押します。

建具記号を選択するパネルが表示されますので、ここでは'AD'を選択します。

次に番号を入力するパネルが表示されます。ここでは'1'のまま"OK"ボタンを押します。

'1/AD'の建具番号が生成されます。続いて'F1'キーを数回押してみてください。番号が1づつ増えながら建具番号が作成されます。
最初に表示されていた記号設定パネルや番号入力パネルが2回目以降表示されないことに注意してください。

さて、次に別の建具記号(例えば'5/AW')を作りたいとします。
また環境設定のscriptPathsペインを表示させてください。

左側にある"スクリプトコマンド 1"のアイコン を右クリックして、コンテキストメニューの"初期化を選択します。
"OK"ボタンを押して環境設定パネルを閉じます。


また'F1'キーを押してみてください。
建具記号を選択するリストパネルが表示されます。'AW'を選択してみます。


番号入力を求めるパネルが表示されます。'5'を入力してみます。


'5/AW'の建具番号が生成されます。



以上でスクリプトコマンドの説明は終わりです。いままでの内容をまとめると以下のようになります。

まず最初にSOCSSは設定されたパスからスクリプトを読み込みます。そして、スクリプトをオブジェクト(プログラム)
として内部に保持します。

そして2回目以降は保持したオブジェクト(プログラム)を実行します。オブジェクトにはメモリー領域があり、
プログラムが存在している限りその値を保持します。そのためプログラムの挙動をプロパティ変数の状態によって詳細に制御することができます。

環境設定の'scriptPaths'ペインから初期化を選択するとプログラム(オブジェクト)は破棄され、再度実行した場合、指定したパスから
新たにスクリプトが読み込まれます。

このようにスクリプトコマンドの特徴は単にスクリプトを実行するだけではなく、スクリプトをプログラム(オブジェクト)として
保持する点にあり、この機能をうまく使えば通常のスクリプトより一層高度な使い方が可能になります。

次回のコラムでは今回使用したスクリプトの内容を解説したいと思います。
以上です。

選択した図形の面積を表示

久しぶりにコラムを更新します。今回は初心に帰ってというかリハビリを兼ねて割と簡単なスクリプトにしました。
選択された図形の真ん中あたりにその図形の面積を記した文字列を生成するスクリプトです。

で、このスクリプトを出来るだけ丁寧に説明したいと思います。
まずいつものようにスクリプトをみてください。今回は簡単なので全文を載せています。

1 property fontName:"HiraMinPro-W3"
2 property fontSize:8.0
3 property unit:"㎡"
4 property conversion:1000000

5 tell application "SOCSS"
6 tell current document
7 tell current section
8 set aFont to fontName & " " & fontSize * ratio

9 repeat with i from 1 to the count of selected shapes
10set shp to selected shape i

11set ara to (area shp)/conversion
12set ara to (round(ara*100))/100

13set bds to oBounds of shp
14set cx to (item 1 of bds) + (item 3 of bds)*0.5
15set cy to (item 2 of bds) + (item 4 of bds)*0.5

16set str to (ara as text) & unit

17make new string with properties {x origin:cx, y origin:cy, content:str, font:aFont, placement:middle center}
18end repeat

19end tell
20end tell
21end tell

1行目はフォント名を指定しています。もちろんここはユーザーの好みに合わせて変えてください。フォント名はPostScript名で 指定しています。フォントのPostScript名を調べる方法は以前ここ で説明しています。

2行目フォントサイズを指定しています。ここも好みに合わせて変えてください。 3行目は面積の後ろに付ける単位です。ここでは平米(㎡)です。例えばここを"坪"にしたい人もいるでしょう。 "property conversion: 1000000"は平米に変換するための変換率です。

SOCSS内部ではミリ単位で値を保持しているのでarea関数で帰って来る値もミリ平米なのです。そのため平米に変換する必要があります。
つまり1000mm×1000mm=1000000です。で、1000000で割っています。
6行目現在の書類という意味です。つまりSOCSS上で一番上に表示してある書類という意味になります。
tell 構文の解説についてはここを参照してください。

8行目でフォントを指定しています。SOCSSの場合フォントとはフォント名とフォントサイズを半角スペースで結んだ文字列です。
これも以前ここで説明しています。
ここではフォントサイズに'ratio'を掛けています。ratioはsection(部分図)のプロパティで、部分図で指定したスケールの逆数を表しています。 例えばスケールが1/100ならratioは100です。フォントサイズは対ユーザーではどんなスケールでも同一ですが、 内部では縮尺に合わせてratioを掛けた値を保持しています。
SOCSSでは自動でやってくれていますが、スクリプトでは手動でやらなければいけません。

11行目でshpの面積を平米に変換して変数araに代入しています。"area"はSOCSSで定義した関数で、"area 図形"で図形の面積を返します。
12行目roundは数字を丸める関数です。 "round 実数"とすると、小数点第1位を四捨五入して整数とします。
このスクリプトでは、小数点第3位を四捨五入して、第2位までとしているので、最初に実数を100倍し、関数を適用した後、 100で割って元に戻しています。例えば、小数点第2位を四捨五入して、小数点第1までを表す場合は(round(ara*10))/10とします。
因みに数字を切り上げたり、切り下げる場合はこのようにします。

round 実数 rounding up
round 実数 rounding down

13行目、図形shpの領域(bounds)を変数'bds'にセットしています。領域(bounds)とは図形全体を含む最小の四角形のことです。プロパティがoBoundsと 'o'が頭についていますが、特に意味はありません。本当はboundsにしたかったのですが、boundsがアップルスクリプトの 予約語になっていたので使えなかったのでoBoundsとしています。

変数'bds'の中身は四角形の値ですが、実態は4つの実数の配列です。配列の順序は下記のようになっています。

14,15行目で図形の領域の中心を求めています。上で説明したように値としての四角形の実体は実数4の配列です。 従って、中心のX座標は基準点のX座標+幅の1/2つまり "item 1 of bds + (item 3 of bds)*0.5" になるわけです。Y座標についても同様です。 16行目に文字列にする値(面積+単位)を変数strに代入しています。 17行目で文字列を作成しています。詳しい説明は以前ここで説明していますので参考にしてください。

以上です。出来るだけ詳しく説明したつもりですがどうでしょうか?スクリプトの質問も受け付けています。掲示板に書き込んでみてください。 次回はこのスクリプトに変更を加えてみてSOCSSにビルトインしている機能をもう少し詳しく説明してみるつもりです。

ファイル一括変換->PDF->結合 後半

前回のコラムでPDFファイルを結合するところを説明しました。今回はPDFファイルに変換するところを説明します。
まず"SystemEvents"でシュミレートする手順をもう一度再確認してみましょう。

① メニューバーの"ファイル"から今回は "印刷..." を選択します。


印刷用シートが表示されます。

② PDFメニューボタンを押します。
③ メニューから "PDFとして保存..." を選びます。


保存用シートが表示されます。

④ "良く使う項目"から保存先フォルダを選びます。
⑤ "名前:"テキストフィールドに新しい名前を入力します。
⑥ 最後に"保存"ボタンを押します。


以上です。
それではこれらの手順をスクリプトでどう表現するかをみていきましょう。スクリプト内にあるsave_as_pdf()ハンドラ内に、
これらが記述されています。

1 on save_as_pdf(nm)
2 tell application "System Events"
3 tell application process "SOCSS"
4 set frontmost to true
5 tell menu bar 1
6 click menu item "印刷..." of menu "ファイル" of menu bar item "ファイル"
7 end tell

8 tell window nm

9 repeat until sheet 1 exists
10end repeat

11tell sheet 1

12click menu button "PDF"
13repeat until menu 1 of menu button "PDF" exists
14end repeat

15click menu item "PDFとして保存..." of menu 1 of menu button "PDF"
16repeat until sheet 1 exists
17end repeat

2~4行目 もうお馴染みになりました。System Eventsを使う場合はこうすると覚えましょう。
6行目 メニューバーの"ファイル"から"印刷..."を選びます。(①に相当)

9~10行目 印刷用シートが表示されるのを待っています。
12行目 "PDF"メニューボタンをクリック(ポップアップボタンでないところに注意)(②に相当)

13~14行目 メニューボタンのメニューが表示されるのをまっています。
15行目 メニュー内の"PDFとして保存..."をクリック(③に相当)
16~17行目 保存用シートが表示されるのを待っています。

1 tell sheet 1

2 tell outline 1 of scroll area 1 of splitter group 1 of group 2
3 set i to 1
4 repeat until (name of UI element of row i) as text is fName
5 set i to i + 1
6 end repeat
7 select row i
8 end tell
9 set prefix to (num + idx) as text
10set value of text field "名前:" to prefix & "-" & name_without_extension(nm) of me
11set idx to idx + 1
12click button "保存"

13end tell
14end tell
15end tell
16end tell
17end tell
18end save_as_pdf


2行目 保存用シートの良く使う項目欄を指し示しています。
3~6行目 保存先フォルダの行番号を探しています。(この場合"newFiles")
7行目 "newFiles"を選択(④に相当)

10行目 名前:テキストフィールドに新しい保存用の名前をセットしています。(⑤に相当)
ここで"Automator"に図面番号順に読み込ませるための工夫をしています。フォルダ内でファイルが図面番号順に並ぶように
ファイル名の頭に桁の揃った数値をつけています。

  • 1001-D3GV002Z.pdf
  • 1002-D2PV002Z.pdf
  • 1003-D1SW002Z.pdf
  • 1004-D2VP001Z.pdf


こんな感じでファイル名の頭に数値をつけることで"Automator"が図面番号順に読み込むようにしています。
12行目 最後に"保存"ボタンを押しています。(⑥に相当)

最後にファイルを開く部分のスクリプトをみてください。

1 tell application "SOCSS"
2 set f_list to choose file multiple selections allowed yes
3 file_list to sort files f_list with compare data drawing_number

4 repeat with i from 1 to the count of file_list
5 set f_path to item i of file_list
6 set doc to open f_path

7 tell doc
8 set current section to section 1
9 set select stroke color to black white
10set print info to { -- 省略 -- }
11set nm to name
12end tell

13save_as_pdf(nm) of me
14delay 2.0
15close doc
16end repeat

17set str to "automator -i" & filePath & fName & " " & wfPath
18do shell script str
19end tell

2行目 はもうお馴染みですね。オープンパネルを表示してユーザーにファイルを選択させています。
3行目 ここで選択したファイルリストを図面番号順にソートしています。
6行目でファイルパスから書類(SOCSS)にしています。

8行目 現在の部分図をレイアウトにしています。
9行目 線色を白黒にしています。他に "by layer"レイアによる、"by stroke width"線巾による、"by stroke color"線色によるがあります。
10行目 プリントの設定です。それぞれの環境で最適な設定をしてください。

13行目 最後に"save_as_pdf()"ハンドラを呼び出してPDFに変換しています。引数nmは書類名です。
14行目 2秒ほどディレイをかけています。経験上すぐに書類を"close"してしまうとうまくPDFに変換されないようです。なので
もしうまくPDFに変換できない書類があった場合このディレイを長めにしてみてください。

18行目 全てをPDFに変換したあと、最後に"do shell script"コマンドを読んでいます。

do shell script コマンドはアップルスクリプト上でUNIXコマンドを実行するためのものです。
ここでは変数があって分かりづらいですが、内容は下記と同じです。

17do shell script "automator -i ~/Desktop/newFiles ~/Desktop/myWorkflow.workflow"


これは前回のコラムで登場したautomatorを起動するUNIXコマンドと同じです。これで"newFiles"内にあるPDFを結合します。
最後にスクリプト中の "print info"コマンドで設定出来るプロパティのリストを上げておきます。参考にしてください。以上です。


ファイル一括変換->PDF->結合 前半

"System Events"を使ったスクリプト第3弾はファイル(複数)をPDFに変換、結合して1つのファイルにします。
もちろん図面番号順です(図面番号については"書類メタデータ"のところで説明しました)。

それでは早速始めましょう。今回のコラムではスクリプトの後半部分"PDFファイルを結合する"をまず先に説明します。

MacでPDFを結合する方法は幾つか存在しますが、今回は"Automator"を使います。なのでまず"Automator"を起動してください。

起動したら新規書類でワークフローを選んでください。
ワークフローが開いたら、右側のライブラリから以下のアクションを左側のスペースにドラッグドロップしてください。

  • ①"ファイルとフォルダ" からフォルダの内容を取得
  • ②"PDF" からPDFページを結合
  • ③”ファイルとフォルダ" からFinder 項目を移動
  • ④"ファイルとフォルダ" からFinder 項目の名前を変更
  • ⑤"ファイルとフォルダ"からFinder 項目を開く


③ は結合されたPDFファイルの保存先です。適当な場所を選んでください。
④ は結合されたPDFファイルの名前です。適宜設定してください。
⑤ では結合されたPDFファイルを"プレビュー"で確認するようにしています。


上記のような感じで設定出来たら保存してください。
保存名はなんでも構いませんがこのスクリプトでは"myWorkflow.workflow"としています。
保存場所は"デスクトップ"としてください。


今作成した"myWorkflow"がちゃんと動作するか確認します。
まず、"newFiles"フォルダを作成し、試しにその中に結合したいpdfファイルを複数入れてください。
"newFiles"フォルダも"デスクトップ"に置いてください。その前提で話を進めます。

一旦 "Automator"を終了します。そして改めてコマンドラインで"Automator"を起動します。
アプリケーションフォルダ->ユーティリティフォルダにある"ターミナル"を起動してください。
ターミナルはUNIX系の端末エミュレータです。UNIX系のコマンドを受け付けます。

起動したら、以下のように入力してリターンキーを押してください。

$ automator -i ~/Desktop/newFiles ~/Desktop/myWorkflow.workflow



"i"オプションの後、読み取るべきフォルダと起動と同時に開くワークフローのパスを指定しています。
なのでフォルダ名やワークフロー名、置き場所が違う場合は適宜書き換えてください。
因みに~(チルダ)記号はログインしたログイン名までの"絶対パス"を表しています。

問題がなければしばらくしてプレビューが起動して結合したファイルが表示されると思います。
もしうまくいかなかったらもう一度スペル等チェックしてみてください。

これで後半部分の"PDFファイルを結合"の説明は終わりです。意外に簡単だったのでは無いでしょうか。
あとは"newFiles"にPDFに変換したファイルを入れて、"automator"を起動するスクリプトがあれば(このスクリプトはそうなっている)完成です。
次回は前半部分のスクリプトについて説明したいと思います。それではまた。

"ファイル一括変換->SOCSS

前回まで、SOCSSファイルをSXF(sfc)へ変換するスクリプトを紹介しました。
当然の流れとして、今回はSXF(sfc, p21)ファイルをSOCSSへ変換するスクリプトの紹介です。
ほとんど前回までのスクリプトと変わりません。前提として、変換後のファイルの保存先として"newFiles"というフォルダを作り、
Finderの"良く使う項目"にドラッグドロップしてください。

1tell application "SOCSS"
2set file_list to choose file multiple selections allowed yes

3repeat with i from 1 to the count of file_list

4set f_path to item i of file_list
5set doc to open f_path
6set nm to name of doc
7save_as_socss(nm) of me

8close doc
9end repeat
10end tell


ほとんど同じですね。7行目のハンドラ(関数)がsave_as_sfc()からsave_as_socss()に変わったぐらいです。
2行目 でユーザーにファイルを選択させて、
3~9行目 で取得したファイルパスの配列から一つづつ書類としてオープンして、書類の名前を引数に save_as_socss() を呼び出しています。

実はこのスクリプトには一つ問題があって実行してみるとわかるのですが、5行目 の set doc open f_path の箇所で
"フォント変換"ウィンドウが出たところで処理がストップします。

なのでユーザーのみなさんには手動で"OK"ボタンを押してください。それ以降は普通に動作します。
なぜこのような仕様になっているかと言いと、このスクリプトの中では"フォント変換"ウィンドウのボタンを押せないからです。

5行目のスクリプトの中で"フォント変換"ウィンドウが開くので、押すタイミングが無いのです。
4行目ではウィンドウはまだ出ておらず、6行目ではすでにウィンドウは閉じたあとです。
つまりこのスクリプトの流れの中では、どう逆立ちしても押せないわけです。
ただそうは言ってもせっかくのスクリプトでこれでは不便なので、最後の方で別の方法を提案をします。


次にsave_as_socss()ハンドラ(関数)の説明をします。
ほとんど前回のスクリプトのsave_as_sfc()と同じですが、次のセンテンスを加えています。

1tell sheet 1
2tell outline 1 of scroll area 1 of splitter group 1 of group 2
3set i to 1
4repeat until (name of UI element of row i) as text is equal to fName
5set i to i + 1
6end repeat
7select row i
8end tell

前回のスクリプトでは保存先フォルダの"良く使う項目"での行位置を数字で指定していましたが、今回はスクリプトで位置を探しています。
4行目 のスクリプトで"良く使う項目"の先頭から順に名前が一致するまで繰り返し文を実行しています。
で変数 i に名前が一致する行番号が入ります。7行目でその行番号を選択しています。

ユーザーが指定するより、プログラムにやらせるほうが間違いが入り込む余地が減り、スクリプトとしての質が向上したと思います。
意欲のある方は前回のSOCSS->SXF変換スクリプトでもこの部分を書き換えてみてください。


あとは前回のスクリプトとほとんど同じなので軽く説明をするに留めます。

1tell group 1 of group 1
2click pop up button "フォーマット:"
3repeat until menu 1 of pop up button "フォーマット:" exists
4end repeat

5click menu item "SOCSS original format" menu 1 of pop up button "フォーマット:"

6end tell
7set value of text field "名前:" to name_without_extension(nm) of me & ".socs"
8click button "保存"

2行目 で"フォーマット:"ポップアップボタンを押し、3,4行目でメニューが表示されるのを待っています。
5行目 でメニューから"SOCSS original format"アイテムをクリックしています。
7行目 "名前:"テキストフィールドに拡張子を変えた名前をセットしています。name_without_extension()ハンドラは前回説明しました。
8行目 "保存"ボタンをクリックしています。以上です。

最後に"フォント変換"ウィンドウの中のボタン押しの自動化について話します。

先ほど、このスクリプトの中では"OK"ボタンを押すタイミングが無いという話をしました。
これは、つまり"OK"ボタンを押すには別プロセスで押してもらうしかないということです。別プロセスとはどういう意味かというと、
"フォント変換"ウィンドウの"OK"ボタンを押すためのアプリを作ってそれにやらせちゃおうという話です。


ということでこれから"フォント変換"ウィンドウの"OK"ボタンを押すためのアプリを作る方法を説明します。
まず、スクリプトエディターを起動して、新規ファイルに下のスクリプトを記入してください。

1tell application "System Events"
2tell application process "SOCSS"
3set frontmost to true

4with timeout of 2 seconds
5if window "フォント変換" exists then
6click button "OK" of window "フォント変換"
7end if
8end timeout

9end tell
10end tell

書けたら保存してください。保存名はなんでもかまいませんが、今回は"ClickOKButton"にしています。
また、保存ファイルフォーマットには"アプリケーション"を選んでください。保存先はどこでもかまいません。


新しく作っだアプリ"ClickOKButton"にもコンピュータの制御を許可してください。

最後に、最初に紹介したスクリプトの5行目の上下に次のスクリプトを加えてください。

1tell application "SOCSS"
2set file_list to choose file multiple selections allowed yes

3repeat with i from 1 to the count of file_list

4set f_path to item i of file_list
4'tell application "ClickOKButton" to run
5set doc to open f_path
5'tell application "ClickOKButton" to quit
6set nm to name of doc
7save_as_socss(nm) of me

8close doc
9end repeat
10end tell

これで別プロセスで"OK"ボタンを押すことができたと思います。もしうまくいかなかったらもう一度スペルなどをチェックしてみてください。
ぜひ読者の方にも挑戦してほしいです。

"ファイル一括変換->SXF(後半)

前回までで、保存用シートの"保存"ボタンを押すところまで来ました。
SOCSSではその後、書類情報の入力を促すパネルが表示されます。

この部分のスクリプトを見てみましょう。

1repeat until window "ファイル情報" exists
2end repeat

3tell window "ファイル情報"
4set value of text field 1 to fAuthor
5set value of text field 2 to fOrg
6click button "OK"
7end tell

1~2行目 いつものようにウィンドウ"ファイル情報"が出るまで待っています。
テキストフィールド1は"作者:",テキストフィールド2は"組織:"です。それぞれにプロパティ変数で設定した値を代入しています。
なお、SXFファイルフォーマットの仕様により、両方とも英数字以外は受け付けないようになっているので注意してください。


次に通常、"フォント変換"ウィンドウが表示されます。


ここで一つ問題があります。それはSOCSSの仕様により必ず "フォント変換"ウィンドウ が表示されるとは限らないのです。
ファイルに文字列を含む図形がない場合、ウィンドウは表示されません。その場合、スクリプトはここで無限ループに陥ってしまい
処理がストップします。そこで、そのための対処が必要になります。下のスクリプトを見てください。

1with timeout of 2 seconds

2if window "フォント変換" exists then
3tell window "フォント変換"
4click button "OK"
5end tell
6end if

7end timeout


このスクリプトの意味は、2秒間限定で、その間に"フォント変換"ウィンドウが表示されたら
"OK"ボタンをクリックするというものです。そして、ウィンドウが現れても、現れなくても2秒後には処理を続行します。
これにより、ウィンドウが現れない場合、ここで無限ループに陥ってしまうことを回避しています。

これでこのスクリプトの説明は終わりです。ぜひこのスクリプトを使ってみてください。


前回"System Events"を使ったスクリプトではUI(ユーザーインターフェイス)の階層構造を解明するのが一番の問題だと述べました。
そこで最後に階層構造を調べる方法をひとつ提案したいと思います。
アプリ"Automator"を使うので、まず"Automator"にコンピュータの制御の許可を出してください。

"Automator"を起動し、新規書類からワークフローを選んでください。
そしてウィンドウの右上にある記録ボタンを押して、
今一度、SOCSSの別名保存から良く使う項目にある"newFiles"をクリックしてみてください。

出来たら記録を終了させてください。

こうすると、ユーザーが行った操作をイベントとして"Automator"に記録されます。
その中で "テキスト"newFiles"をクリックします" を下のスペースにドラッグドロップしてください。

イベントの内容がスクリプトとして展開されます。その中をよく見ると

click static text 1 of UI Element 1 of row 8 of outline 1 of scroll area 1 of splitter group 1 of group 2 of sheet 1 of window 7 of application process \"SOCSS\"
が "new Files"のUIの階層構造だとわかります。(私のスクリプトでは一部を省略してます。)
以上です。

"ファイル一括変換->SXF(前半)

前回の簡単な解説を踏まえて、より実践的な "System Events" を活用したスクリプトを紹介します。
今回はファイルの一括変換です。複数のSOCSSファイルをSXFファイルに変換します。

初めにこのスクリプトの前提を見てください。
・新しいファイルを保存するフォルダを"newFiles"とする。
・SXFフォーマットは今回はsfcとする。
・変換後のファイル名は変換まえのものと同じで拡張子だけが違うものとする。

まずフォルダ"newFiles"を作成してください。フォルダはどこに置いてもかまいませんが、
ファインダーウィンドウの"よく使う項目"にドラッグしておいてください。(下図①参照)
また上から何番目かを覚えておいてください。添字で選択するので。(ちなみに下図では8番目です)


スクリプトの前半部分では保存用のシート上で次のような4つの動作をシュミレーションします。

① 保存先を選択する。
② ファイルフォーマットを選択する。(今回はSFCです)。
③ 新しいファイル名を入力する。
④ 保存ボタンをクリックする。

まずはスクリプトをみてください。

1tell application "SOCSS"
2set file_list to choose file multiple selections allowed yes

3repeat with i from 1 to the count of file_list

4set f_path to item i of file_list
5set doc to open f_path
6set nm to name of doc
7save_as_sfc(nm) of me

8close doc
9end repeat
10end tell

メインのスクリプトです。ユーザーが選んだファイルを一つ一つオープンして、別名保存処理した後クローズしています。
肝の部分別名保存の処理はハンドラ(関数)化しています。

これまで何回も出てきた"choose file"コマンドでユーザーにファイルを選ばせています。
5行目 ファイルパスからファイルをオープン。
6行目 変数nmにファイルの名前をセットしています。
7行目 ファイルを変換するためのハンドラ(関数)です。引数にファイルの名前を渡しています。

このスクリプトの肝の部分、"save_as_sfc"の説明をします。

1on save_as_sfc(nm)
2tell application "System Events"
3tell application process "SOCSS"
4set frontmost to true

5tell menu bar 1
6click menu item "別名で保存…" of menu "ファイル" of menu bar item "ファイル"
7end tell

8tell window nm
9repeat until sheet 1 exists
10end repeat

11tell sheet 1
12select row row_nm of outline 1 of scroll area 1 of splitter group 1 of group 2

13tell group 1 of group 1
14click pop up button "フォーマット:"

15repeat until menu 1 of pop up button "フォーマット:" exists
16end repeat

17click menu item "SFC" of menu 1 of pop up button "フォーマット:"
18end tell

19set value of text field "名前:" to name_without_extension(nm) of me & ".sfc"
20click button "保存"

21end tell
22end tell

2~4行目 前回説明した。System Events では決まりのセンテンスです。
5~6行目 これも前回出てきました。メニューバーの"ファイル"項目 → "別名で保存…"(前回は"印刷")をクリック
9~10行目 保存用のシートが出るまで処理を止めています。

12行目 保存先として"良く使う項目"内の"newFiles"フォルダを選択している。
これを見ると"良く使う項目"のUI(ユーザーインターフェイス)に至るUIの階層構造が複雑なのがわかる。
"System Events"を使ったスクリプトの一番の問題はUIの階層構造を把握することです。
この問題の対処方法の一つを次回のコラムで解説したいと思っています。

13~18行目 でsfcファイルフォーマットを選択しています。
19行目 "名前"テキストフィールドに新しいファイル名(元のファイル名に拡張子を変えたもの)を入力しています。
20行目 "保存"ボタンをクリック。

19行目の"name_without_extension"ハンドラ(関数)について説明します。
name_without_extension()は与えられた引数の文字列から拡張子を省いた文字列を返すハンドラです。
スクリプトを見てください。

1on name_without_extension(nm)
2set AppleScript's text item delimiters to "."
3return item 1 of (text items of nm)
4end name_without_extension

2行目 デリミタに"."ドットを指定しています。
デリミタとは文字列の区切りを示す。文字のことです。たとえば表計算ソフト間でよくやり取りするCSVフォーマットでは
データ区切りに "," コンマが使われています。つまりデリミタはコンマという事になります。

"AppleScript's text item delimiters" 変数はAppleが用意したグローバル変数でスクリプトで使うデリミタを指定することが出来ます。
で、文字列に対し"text items"プロパティを呼ぶとデリミタで区切った文字列の配列が返されます。

"item 1 of (text items of nm)"でデリミタで分けられた文字列の前方部分(上記の例では"名称未設定")を返していることになります。
次回はスクリプトの後半部分を説明をしたいと思います。

一括印刷(図面番号順)

今回は以前紹介した一括印刷の改良版です。
前回まで色々説明した"書類メタデータ"の中に図面番号がありますが、
選択したファイル(複数)をこの図面番号順に印刷するスクリプトです。それ以外は以前のままです。
とりあえず。スクリプトも短いので全文を載せてみます。見てください。

1tell application "SOCSS"
2set fList to choose file multiple selections allowed yes
3set sortedList to fList sort files with compare data drawing_number

4repeat with i from 1 to the count of sortedList
5set doc to open item i of sortedList
6tell doc
7set current section to section 1
8set select stroke color to black white
9end tell

10doc print with properties {paper name:"A4", orientation:1, scaling factor:0.33, ¬
left margin:5, right margin:5, top margin:5, bottom margin:5}

11close doc
12end repeat
13end tell

3行目 sort files with compare data drawing_number がこのスクリプトの肝のコマンドです。
ファイルパスのリストを対象に"書類メタデータ"を参照して、図面番号順にソートしたリストを返します。
sort files がコマンド名で compare data が引数名です。 drawing_number がこのコマンドのために作られた
引数用の定数です。現在のところ定数はこれのみで図面番号を昇順にソートします。もし降順にしたい場合は
set sortedList to reverse of sortedList を3行目の後に追加してみてください。
図面番号は純粋な数字でなくても結構です。例えばN○○とかA-○○とかでも問題ありません。内部の数字のみを評価します。
と思っていたら、先ほど試してみたところ。ハイフン付きではうまくいきませんでした。
次のバージョンで修正します。執筆時点のバージョンは1.1.5です。あとは以前説明したままです。

'書類メタデータ'その3

前回に続いてスクリプト"書類メタデータ"の説明をしたいと思います。
まず "プロパティにセットした値をNumbersのセルに反映させるハンドラ" の説明です。

1on set_value_to_table(i)
2tell application "Numbers"
3tell document 1
4tell sheet 1
5tell table 1
6if i is equal to 1 then
7set value of cell "A1" to "ファイルパス"
8set value of cell "B1" to "作図者"
== 一部省略 ==
9set value of cell "J1" to "図面種類"
10set value of cell "K1" to "日付1"
11end if
12set value of cell ("A" & i + 1) to filePath
13set value of cell ("B" & i + 1) to d_author
== 一部省略 ==
14set value of cell ("J" & i + 1) to d_type
15set value of cell ("K" & i + 1) to date_1
16set value of cell ("A" & i + 2) to "end"
17end tell
18end tell
19end tell
20end tell
21end set_value_to_table

1行目 引数として添字iを渡しています。
6行目 添字が1の場合つまり一番最初の時、セルには列のタイトルを入れています。
12~15行目 それぞれのセルにプロパティ変数の値をいれています。i+1としているのは1行目はタイトルが入っているため
一つづつズレているためです。
16行目 A行つまり"ファイルパス"の行の最後にはendが入る様にしています。これは表の値を書類に戻すときに使います。

今度は表計算ー>書類メタデータでおおもとのハンドラ"Numbersのセルの値をプロパティにセットするハンドラ"を見てみましょう。

1on set_document_data()
2tell application "Numbers"
3tell document 1
4tell sheet 1
5tell table 1
6set i to 1
7repeat until value of cell("A" & i+1 ) is equal to "end"
8set filePath to value of cell("A" & i+1)
9set d_author to value of cell("B" & i+1)
== 一部省略 ==
10set d_type to value of cell("J" & i+1)
11set date_1 to value of cell("K" & i+1)
12set_value_to_file() of me
13set i to i+1
14end repeat
15end tell
16end tell
17end tell
18end tell
19end set_document_data

いつものようにアプリケーションー>書類ー>シートー>表(table)ー>セルと階層をたどっています。
7行目 列Aの値が"end"になるまで繰り返すという意味です。
8〜11行目 セル内の値を各プロパティ変数にセットしています。
12行目 各プロパティ変数にセルの値をセットし終わったところでset_value_to_file()ハンドラを呼び出してファイルに反映させています。

最後に"プロパティにセットした値をSOCSSのファイルに反映させるハンドラ"の説明です。

1on set_value_to_file()
2tell application "SOCSS"
3set document meta data filePath with properties {drawing author:d_author, organization name:org,
4contract title:c_title, project name:p_name, contract type:c_type, drawing_name:d_name,
5drawing number:d_num, drawing total number:d_total_num, drawing type:d_type, date 1:date_1}
20end tell
21end set_value_to_file

set document meta data はSOCSSのコマンドで、ダイレクトパラメーターにファイルパスを(ダイレクトパラメーターはここを参照)
with properties 引数名にレコード形式で値を渡しています。レコードの内は"書類メタデータのキー"とプロパティ変数のコンビネーションになっています。

このスクリプトの流れをまとめると以下のような感じです。


最後に書類メタデータの内容はスポットライトの検索対象になっています。
スポットライトはcontrol+space キーでいつでも呼び出す事ができます。一々"Finder"に行くより便利だと思います。試してください。

'書類メタデータ'その2

スクリプト"書類メタデータ"の説明をしたいと思います。
まず復習も兼ねてもう一度あらてめて書くと、アップルの表計算ソフト"Numbers"の階層構造は
アプリケーションー>書類ー>シートー>表(table)ー>セルです。
つまり例としてセル'A1'にアクセスするにはこうなります。

1tell application "Numbers"
2tell document 1
3tell sheet 1
4tell table 1
5set value of cell "A1" to 250
6end tell
7end tell
8end tell
9end tell

書類、シート、表、はそれぞれ配列なので(つまり複数存在する可能性がある)それぞれの後にある"1"は配列の一番初めという意味。
' item 1 of ○○○s 'と同じ意味になります。(複数形に注意)

上記の内容を踏まえて"Numbersを起動するハンドラ"を見てみましょう。

1on open_numbers(row_c, column_c)
2tell application "Numbers"
3activate
4set doc to make new document
5tell doc
6tell sheet 1
7delete every table
8set thisTable to make new table with properties{ row count:row_c, column count:column_c }
9tell thisTable
10set width of column "A" to 250
11end tell
12end tell
13end tell
14end tell
15end open_numbers

3行目 activeでNumbersが前面に表示されます。
4行目 新しい書類を作成しています。
7行目 既に存在している表(table)を削除しています。現状の表では行、列、が足らない可能性があるので
8行目 改めて行数、列数を指定して表を作成している。ここでも make new ○○○ with properties {レコード形式のパラメータ}
になっている点に注目。これはオブジェクトを作成する場合、すべてのソフトで共通の様式なのです。
10行目 列"A"にはファイルパスが入るので幅を長めに設定している。

次に"オープンパネルを表示して書類メタデータをゲットするハンドラ"を説明します。

1on get_document_data()
2tell application "SOCSS"
3set fileList to choose file with multiple selections allowed
4open_numbers((count of fileList)+2, 12) of me

5repeat with i from to the count of fileList
6 set filePath to item i of fileList
7 set aRecord to get document meta data (item i of fileList)
8 set d_author to drawing author of aRecord
9 set org to organization name of aRecord
10set c_title to contract title of aRecord
11set p_name to project name of aRecord
12set c_type to contract type of aRecord
13set d_name to drawing name of aRecord
14set d_num to drawing number of aRecord
15set d_total_num to drawing total number of aRecord
16set d_type to drawing type of aRecord
17set date_1 to short date string of date 1 of aRecord
18set_value_to_table(i) of me
19end repeat

20end tell
21end get_document_data

3行目"choose file"コマンドでオープンパネルを表示します。引数 with multiple selections allowed を指定することで
複数のファイルが選択可能になります。戻り値は選択したファイルのファイルパスの配列です。
4行目上記で説明したopen_numbers()を呼び出して"Nmbers"を起動しています。その際必要な列数、行数を
引数として渡しています。of me については以前説明した、tell 構文を思い出してください。

1tell application "SOCSS"
2open_numbers((count of fileList)+2, 12)
3end tell

1open_numbers((count of fileList)+2, 12) of application "SOCSS"

と同じ意味になります。
つまり、このままではscript内で定義したハンドラ(関数)がSOCSS内で定義されたものと扱われるため、
"そんなハンドラはSOCSS内に存在しない" と言うようなエラーメッセージが出ます。
そこで of application "SOCSS"をキャンセルする意味で of me を付け加える事になっています。

7行目"get document meta data"はSOCSSのコマンドです。引数で指定したファイルパスの書類メタデータをレコード形式で返します。
8行目以降はプロパティ変数にレコードの各項目をセットしています。
18行目 set_value_to_table()で各プロパティ変数の値をNumbersのセルに反映させています。
上記の内容を選択したファイル数分繰り返しています。

最後に書類メタデータの各項目のキーリストを載せておきます。
書類メタデータのレコードにアクセスする場合、このキーリストを参照してください。
残りはまた次回説明します。

名称 key
所属 organization name
作図者 drawing author
事業名 contract title
工事名 project name
契約区分 contract type
図面名 drawing name
受注者 contract reciever
発注者 contract order
図面番号 drawing number
図面総数 drawing total number
図面種類 drawing type
スケール drawing scale
キーワード_1 keyword 1
キーワード_2 keyword 2
キーワード_3 keyword 3
キーワード_4 keyword 4
キーワード_5 keyword 5
日付_1 date 1
日付_2 date 2
日付_3 date 3
日付_4 date 4
日付_5 date 5

'書類メタデータ'その1

今回は書類メタデータを編集するスクリプトです。
今回のスクリプトには色々な要素がつまっています。そこで今後数回に渡って説明することにします。

まず初めにスクリプトの内容を紹介しましょう。
SOCSSでは図面情報と称して下図のようなパネルで各項目を一括で設定できる様にしています。これらの値(情報)をSOCSSでは
書類メタデータと呼んでいます。

例えば"図面名"欄に平面詳細図と入力し、文字列作成でフィールドに"$$D_Name"と入力すると実際の文字列は平面詳細図と表示されます。


つまり図面タイトル等で使われる文字列を書類メタデータとして、このパネルで一括編集出来る様にしているわけです。
ただ、これだけでは特別便利とは言えないでしょう。しかし、複数の書類メタデータを比較しながら編集できればこれは便利だと思います。
今回のスクリプトはこれを実現するスクリプトです。
具体的にはチェックしたい複数の書類メタデータを表計算ソフト(Numbers)で確認編集できる様にしています。

まず使い方を見ていきましょう。
スクリプトを起動すると下記のようなダイアログが表示されます。"書類メタデーター>表計算"ボタンを押します。

オープンパネルが表示されるので書類メタデータを表示させたいファイルを選択します。

表計算ソフト(Numbers)が自動的に起動し、書類メタデータが表示されます。

表をチェックし、必要なら修正をほどこします。
もう一度スクリプトを呼び出します。今度は"表計算ー>書類メタデータ"をクリックします。

これで選択したファイルに編集した書類メタデータが反映されます。
出図時は時間がない場合が多いので、図面タイトル等をチェックするために一つづつファイルを開かずに済むこのスクリプトは便利だと思います。
次回では、このスクリプトの中身をじっくり解説したいと思います。

階段断面を作成する

今回は単純に下図のような階段断面を作成するスクリプトです。

踏面、蹴上、蹴込、段数、スラブ厚、踊り場長さを指定します。

実はMacOS10.10(yosemite)からApple Scriptと同様のことをJava Scriptからでもできる様になりました。
Apple Scriptには欠点が数多く存在しますが、その一つに標準的なライブラリーが存在しないというのがあります。
今回はどうしても三角関数を使いたかったのでJava Scriptで作成することにしました。ゆえに今回のスクリプトは
OS10.10以上の方限定です。使い方も特に問題はないと思うので説明は省略します。
Java ScriptはApple Scriptに比べて格段にメジャーなスクリプトなのでご存知の方も多いと思います。
ご存知の方はMac上での使い方を解説したドキュメント(英語)がAppleよりリリースされているので参考にしてみてください。
introduction to JavaScript for Automation Release Note
以上です。

'レイヤーをスクリプトから作成する'と色について

もし同じ様なレイアーを毎回作成するならこれもスクリプトで自動化してしまいましょう。 今回はとても簡単なのでスクリプトを全文のせてみます。

1tell Application "SOCSS"
2tell current document
3make new layer with properties{ name:"文字列" }
4make new layer with properties{ name:"図面タイトル", layer color:{39321,26214,13107} }
5make new layer with properties{ name:"通り芯", line width code:11, dash code:29,
layer color:{65535,0,0} }
6make new layer with properties{ name:"下図", visible:true, snappable:true, editable:false,
layer color:{32896, 65535, 0} }
7end tell
8end tell

3行目にあるように、レイアー作成に必要な最低限のプロパティはname(名前)のみです。それ以外はお好みで設定してください。
SOCSSでは各レイアーにレイアー色を設定できますが、Apple Scriptでの色は、実際は3つの整数の配列です。
左からR(赤),G(緑),B(青)となっていて各整数は2の16乗つまり、0〜65535までの整数です。0が最も暗く65535が最も明るい数値です。
下に主な色とそのRGBリストを掲載しているので参考にしてください。

色名 RGBリスト
ブラック { 0, 0, 0 }
{ 65535, 65535, 65535 }
ブルー { 0, 0, 65535 }
ブラウン { 39321, 26214, 13107 }
シアン { 0, 65535, 65535 }
グリーン { 0, 65535, 0 }
マゼンタ { 65535, 0, 65535 }
オレンジ { 65535, 32639, 0 }
パープル { 32639, 0, 32639 }
レッド { 65535, 0, 0 }
イエロー { 65535, 65535, 0 }
シルバー { 52428, 52428, 52428 }
モカ { 32896, 16448, 0 }
クローバー { 0, 32896, 0 }
オーシャン { 0, 16448, 32896 }
ミッドナイト { 0, 0, 32896 }
プラム { 32896, 0, 32896 }
マロン { 32896, 0, 16448 }
ライム { 32896, 65535, 0 }
アクア { 0, 32896, 65535 }
グレープ { 32896, 0, 65535 }
ストロベリー { 65535, 0, 32896 }
サーモン { 65535, 26214, 26214 }
バナナ { 65535, 65535, 26214 }
ハチミツ { 52428, 65535, 26214 }
スカイ { 26214, 52428, 65535 }
ラベンダー { 52428, 26214, 65535 }

通り芯と寸法線を自動作成する

だいぶ間があいてしまいましたが、図形をスクリプトから作成するシリーズの最後(とりあえず)は"通り芯と寸法線を作成する"です。
下図のようなものをスクリプトから作成します。

まず使い方から見ていきましょう。スクリプトを起動すると下図のようなパネルが表示されます。

xListとyListに通り芯の間隔を記入し、OKボタンを押すと、通り芯と寸法線が作成されます。今回は寸法線にフォーカスして話を進めます。
まず下記のスクリプトを見てください。

1make new straight dim with properties { x first:fx, y first:fy, x second:sx, y second:sy,
2x third:tx, y third:ty, distance:dis, direction:dir }

いつもの様に new の後に,図形名を指定します。 直線の寸法線は straight dimです。他に angle dim(角度寸法線)、diameter dim(直径寸法線)、radius dim(半径寸法線)があります。
寸法線を作成するのに最低限必要とするプロパティは3点(first, second, third)と距離(distance)、角度(direction)です。
また3点は必ず時計回りとなるようにしてください。

それ以外に下図のようなプロパティを設定することができます。

試しに下記のようにスクリプトを設定すると。下図の様な寸法線が作成されます。

1make new straight dim with properties { x first:0, y first:0, x second:-2, y second:0,
2x third:0, y third:20, distance:2, direction:180, arrow 1 style code:9, arrow 1 scale:0.36,
3arrow 1 direction:inside, arrow 2 style:open arrow, arrow 2 scale:0.36, arrow 2 direction:inside,
4corner 1:4, corner 2:4, extra 1:2, extra 2:2, arrangement:middle right, horizontal offset:5 }

矢印の形はarrow (1or2) style:として名称で指定する方法と、arrow (1or2) style code:としてコード番号で指定する方法があります。

arrow style コード 名称
1 blanked arrow
2 blanked box
3 blanked dot
4 dimension origin
5 filled box
6 filled arrow
7 filled dot
8 integral symbol
9 open arrow
10 slash
11 unfilled arrow


以上です。

文字列の作成とプロパティ変数について

今回は文字列の作成について説明しようと思います。で、お題のスクリプトは"建具番号を作成する"です。
まずスクリプトをダウンロードしてメニューバーから数回呼び出してみてください。
呼び出すたびに画面中央に建築番号が現れます。そして建て具番号が一つづつ増えていることに気づくと思います。

スクリプトの最初の方を見てみましょう。3行目にある aNum が建て具番号を保持する変数です。

1property aRadius : 3.5 (*記号の半径*)
2property aKind : "AW" (*建具の種類*)
3property aNum : 1 (*建具番号*)

ここで proerty 宣言した変数について説明します。 property 変数は一般的なプログラム言語でいうグローバル変数に当たるものです。
スプリクトのどこからでもアクセス出来る変数で、さらに特徴的なのはその変数の寿命です。(プログラム用語ではスコープという)
スクリプトの実行が終了してもproperty 変数はメモリー内に存在し続けています。ゆえに呼び出すたびに番号が増えることが可能なのです。
またMacを再起動してもproperty 変数の値は保持されたままです。では元に戻すにはどうすればいいのでしょう。

今度はスクリプトエディタからこのスクリプトを開いてください。そして property aKind の値を"SD"に変更,保存して、
もう一度メニューバーから呼び出してみてください。

建て具番号が 1 になって変数"aNum"の値が初期化されていると思います。
このようにスクリプトを変更するとproperty 変数は初期化されるのです。これがproperty変数の大きな特徴です。

では引き続きスクリプトを見ていきましょう。

1clear selected shapes
2set vRect to visible rect
3set newRadius to aRadius * ratio

4set cx to (item 1 of vRect) + (item 3 of vRect) * 0.5
5set cy to (item 2 of vRect) + (item 4 of vRect) * 0.5

1行目"clear selected shapes"は選択図形をキャンセルするコマンドです。
2行目で、SOCSSの現在の表示領域を四角形としてvRect変数にセットしています。四角形としていますが、実態は要素4の配列で
"{ 左下X座標, 左下Y座標, 幅, 高さ }"となっています。
3行目 ratioはsection(部分図)のプロパティで縮尺の逆数を表しています。例えば縮尺1/100ならratioは100です。
ratioを掛けることによって全ての縮尺で建て具記号が同じ大きさになる様にしています。
4、5行目で表示領域の中心を求めています。(例えば 4行目は 左下X座標 + 幅×0.5 でX座標の中心を表しています。)
次に文字列の作成を見てみましょう。

1set aShape to make new string with properties{ x origin:cx, y origin:cy, content:aKind, ¬
2font:aFont, placement:middle center }
3add to selected shapes aShape

make new 《図形名》 with properties {} コマンドはもう見慣れてきたと思います。図形名は"string"で x y origin:にそれぞれ
x, yの原点の座標, content:に表示する文字列 font:にフォントを表す文字列 placement:に文字原点の相対位置を指定します。
まずフォント指定する文字列について見てみましょう。

上記の図のように、"フォント名+半角スペース+フォントサイズ"という文字列で指定します。フォント名はPostScript 名を使用します。
フォントのPostScript 名は"フォントブック"で確認できます。

次にプロパティplacementについて説明します。
placementは原点の文字列に対する相対位置を示します。一般的には文字列の原点は左下ですが、"SOCSS"では下図の様に
原点を9か所から指定することができます。

これの利点は例えば円の中心に文字列を配置したいとします。その時に中/中を原点とすれば文字列の幅を考慮せずに
位置を決められるということです。また文字を変更したり、サイズを変更しても位置を調整する必要がないのも利点です。

当然原点の相対位置は"SOCSS"上でも指定できます。

作成時にはTabキーを押すことによってトグルで変化します。

1行目で作成した図形を変数"aShape"として受け取っています。
3行目でsection(部分図)のコマンド"add to selected shapes"で引数にaShapeを渡すことにより
作成した図形を選択状態にしています。

多角形を表計算の座標値から作成する

今回は多角形の作成です。表計算ソフト(Numbers)から座標を読み取って多角形を作成します。
建築系のユーザーなら敷地測量などから敷地図を作成する場面も結構あると思いますが、
その時参考になるスクリプトです。 サンプルとして以下のようなNumbersファイルを同梱しています。
Numbersファイルを開いた状態で、またSOCSSの部分図の縮尺を1/100にしてスクリプトを実行してください。

多角形が作成されると思います。
それではスクリプトを見ていきましょう。今回は簡単なので全文を掲載してみます。

1property xCod : {}
2property yCod : {}
3property num : 16

4tell application "Numbers"
5tell document 1
6tell sheet 1
7tell table 1
8repeat with i from 1 to num
9set xCod to xCod & value of cell ("B" & i+1)
10set yCod to yCod & value of cell ("C" & i+1)
11end repeat
12end tell
13end tell
14end tell
15end tell

16tell application "SOCSS"
17tell current document
18tell current section
19make new polygon with properties { x coordinate:xCod, y coordinate:yCod, closed path:true }
20end tell
21end tell
22end tell

property xCod : {} で変数xCodに空の配列をセットしています。"num" は座標の数です。ここは実際に合わせて調整してください。
document 1 は item 1 of documents と同じ意味です。つまり、documentsという配列の一つ目の要素という意味です。
以下sheet 1, table 1も同じです。で、テーブル内のセル例えば 列A, 行1 のセルの値を得るには value of cell "A1" とします。
逆にセルに値をセットする場合は set value of "A1" to "値" とします。

9,10行目では変数i で順繰りに行にアクセスするので "B" & i+1 としています。つまり iが1なら "B2"となるわけです。
ここで&(アンパサンド)は2つの物をくっつける働きをする記号です。アップルスクリプトでは色々な場面で使われています。
例えば set capital to "東京" & "都"とすれば、変数capital の中には"東京都"が入ります。

同様に"set xCod to xCod & value" も配列xCodに要素valueをくっつけた新い配列xCodを作るという意味です。
アップルスクリプトの配列には新しい要素を追加したり、削除したりする機能はないので、このような形で"要素を追加"を実現しています。
19行目で新しいpolygonを作成しています。x coordinate:, y coordinate: にそれぞれ上記のスクリプトで作成した配列をセットしています。
特に難しい所はないと思います。また興味のある人は19行目以下に下のスクリプトを追加してみてください。

1repeat with i from 1 to the count of xCod
2set x to item i of xCod
3set y to item i of yCod
4make new marker with properties { x origin:x, y origin:y, type:circus }
5end repeat

多角形の各点に円状の点マーカーが追加されると思います。

四角形に斜線を引くスクリプトとスクリプトをメニューバーから呼び出す方法

今後数回に渡ってスクリプトで図形を作成する方法をコラムで紹介していこうと思います。
まず第一弾として、直線を紹介します。題して"四角形に斜線を引くスクリプト"です。例えば間柱に斜線を引きたい時等
活躍する場面は結構有ると思います。


まず、使い方を簡単に説明します。スクリプトを起動するとダイアログが表示されるので、
そこに斜線を入れたい四角形の幅と高さを入力します。で、OKボタンを押すと直線の描画が始まります。


最後に作成した斜線の数をダイアログが表示します。

それではスクリプトの内容を説明しましょう。スクリプトを見てください。で、ざっと流れを説明すと

現在の部分図(section)から四角形の配列(rects)を取り出す

配列から一つづつ四角形をとりだす。

四角形の幅と高さが指定した値かを判断

trueの場合四角形の四隅のうち2点をとりだす

現在の部分図(section)内で取り出した2点を始点、終点とする直線を作成。

上記の繰り返し

ポイントはSOCSSでは四角形の四隅の座標を簡単に得られる様、左下から時計回りにx p0, y p0 〜 x p3, y p3のプロパティ(属性)を設けていることです。

また、今まで説明のせずに使っていた"tell構文"についても、ここで説明したいと思います。下の2つのスクリプトを見てください。

≪ script1 ≫

1set w to width of aRect
2set h to height of aRect
3set sx to x p0 of aRect
4set sy to y p0 of aRect
5set ex to x p2 of aRect
6set ey to y p2 of aRect

≪ script2 ≫

1tell aRect
2set w to width
3set h to height
4set sx to x p0
5set sy to y p0
6set ex to x p2
7set ey to y p2
8end tell

上記2つのスクリプトは同じことを表しています。オブジェクト( この場合aRect )のプロパティ( この場合 width や x p0 )
にアクセスするには基本 "プロパティ名 + of + オブジェクト名" です。≪ script1 ≫
ただ複数回アクセスする場合 面倒なので"tell + オブジェクト 〜 end tell" 構文で囲むことによって
"of + オブジェクト" を省略する方法が用意されているのです。≪ script2 ≫
またtell構文は"いれこ"にすることができるので例えば以下の文は

1tell current document
2tell current section
3tell item 1 of rects
4set w to width
5end tell
6end tell
7end tell

下記の文と同じ意味になります。

1set w to width of item 1 of rects of current section of current document


これがtell構文を使用する理由です。apple scriptでは頻繁に出てくるのでしっかり理解しておきましょう。
次に作図に関するスクリプトを見てみましょう

1tell cSection
2make new line with properties { x start:sx, y start:sy, x end:ex, y end:ey }
3end tell

作図は部分図に対しておこなうので、tell section(部分図)構文で囲んでいます。
オブジェクトを作成するコマンドはすべて "make new + オブジェクト名 + with properties + レコード形式のプロパティ群"
という形になります。もっと突っ込んで説明すると 一般的なコマンド(関数)の構文は以下のようになります。

《コマンド名》 + [引数] + (引数名 + 引数) + (引数名 + 引数)... - ①

引数は必要に応じてなので、ゼロからいくらでも設定出来ます。又、コマンドには一つだけ引数名なしの引数を設定出来ることになっていて
apple scriptではこれを direct-parameter と呼んでいます。 上記のスクリプトを①に従って分解すると

《make》 + [なし] + (new + line) + (with properties + {...})

になります。
引数名with propertiesに設定するレコード形式の各図形のプロパティは以前紹介した"用語説明"の中に書いてあります。

で、apple scriptは一応オブジェクト指向プログラムなので、継承という概念もあります。lineも親クラスはshape(抽象クラス)で
shapeのプロパティを継承しているので、例えば以下のようなスクリプトも可能です。

1tell cSection
2make new line with properties { x start:sx, y start:sy, x end:ex, y end:ey, ¬
2dash code:18, line width code:3, layer name:"見えがかり" }
3end tell


つまり、線種、線幅、線色、レイアー等、必要であれば個別に設定可能となっています。
この辺りのことは今後、おりにふれて紹介していこうと思っています。

つぎにメニューバーからスクリプトを呼び出す方法を紹介します。

このようにメニューバーからスクリプトを選択すると自動的に起動するので何かと便利です。
まずスクリプトを入れるフォルダーを作ります。ここでは仮に"myScripts"という名前にします。そこに使いたいスクリプトを入れます。

次にscriptEditor(AppleSecriptエディタ)を開き、環境設定から"メニューバーにスクリプトメニューを表示"にチェックを入れる。と
メニューバーにスクリプトマークが追加されます。


Finderからメニュー項目の"移動"をoptionキーを押しながらプルダウンするとライブラリーという項目が表示されるのでそれを選択する。
ライブラリーの中に"Scripts"というフォルダーがあるので(無かったら作ってください)先ほど作った"myScripts"フォルダーを
その中に移動させます。
または、"myScripts"フォルダーのエイリアスを作ってそれを"Scripts"フォルダーに移動させてもいいと思います。


あとはメニューバーから使いたいスクリプトを選ぶと自動的に実行されます。

UPしたスクリプト'一括印刷'の説明

Upしたスクリプトの説明第2段です。今回は'一括印刷'です。
複数の図面を一括で印刷する。単純ながらあると便利なスクリプトです。スクリプトも短めなので全文を表記します。

1tell application "SOCSS"
2set _files to choose file multiple selections allowed yes

3repeat with i from 1 to the count of _files
4set doc to open item i of _files
5set current section of doc to section 1 of doc
6set select stroke color of doc to black white

7doc print with properties {paper name:"A4", orientation:1, scaling factor:0.33, ¬
left margin:5, right margin:5, top margin:5, bottom margin:5}

8close doc
9end repeat
10end tell

2行目 choose file コマンドでオープンパネルを表示します。戻り値はファイルパスのリストです。複数選択が可能な設定をしています。
3行目 繰り返し文の一つの型です。 変数iを宣言し1からリストの数まで繰り返すという意味。C言語でのfor文のようなものです。
4行目 open コマンドでファイルを開き、変数docに設定しています。引数はファイルパス。
5行目 現在の部分図をレイアウトに設定しています。このように部分図タブの順番を番号で指定する方法と
section "layout" of doc というふうに部分図の名前で指定する方法があります。
6行目 線色を白黒に指定。他に "by layer", "by stroke width", "by stroke color" があります。

7行目 今回のメインのコマンドprintです。with properties 引数に印刷の設定をレコード形式で渡しています。
paper name: は印刷用紙です。ここで指定出来る用紙はもちろんプリンターによって変わってきます。
orientation: は印刷方向で0 が縦 1が横です。scaling factor: は拡大縮小 * margin: は各辺のマージンです。
それ以外には copies: 印刷枚数、target printer: プリンターの選択などが有ります。
with properties 引数以外に 引数としてprint dialog yesとすると各印刷時にダイアログが表示されます。

8行目 開いたファイルを閉じています。
以上です。簡単な説明でしたが、もし分からないことが有ったら掲示板にて質問してください。

スクリプト'既数値の設定'の説明

前回までApple Scriptの初歩からの説明を試みていましたが、あまりにも先が長いので、ひとまずお休みして、
すぐに役に立つスクリプトとして、今回はサンプル集にアップした'既数値の設定'スクリプトについて説明したいと思います。


SOCSSでは文字列、引き出し線、移動(数値)、等でスクロールホイールを回すとメニューが表示されます。

よく使う値を事前に登録し、素早く使うことが出来る機能です。メニューに表示される値、もしくは文字列は
環境設定で登録することが出来ます。

これらの値はデフォルトの値として、これとは別にユーザーが随時値を登録出来ます。今回はそれを自動化するスクリプトです。
下図はこのスクリプトの内容を図式化したものです。

スクリプトを起動するとまず大項目を表示するリストパネルが表示されます。

例えば文字列を選択すると文字列の中項目リストが表示されます。

仕上材を選択すると文字列編集パネルに新たに文字列が加わります。

AppleScriptの詳細が分からなくてもだいたい感じはつかめると思います。自由に改変して使ってください。
又、分からないことなど有りましたら、掲示板にて質問をしてください。

初めてのApple ScriptⅡの続き

今回は前回で示したScriptを題材に引き続きAppleScriptの説明をしていきたいとおもいます。 SOCSSでもそうですが、AppleScriptに対応したアプリケーションは必ず.sdefという拡張子のついたファイルでscriptで使用する独自のクラス、コマンド等を定義しなけりばなりません。 例えばSOCSSの定義をみたい場合は、スクリプトエディタのファイルメニューから用語説明を開く...を選択し、リストからSOCSSを選択してください。

SOCSSの用語解説が開きます。

用語解説は3つのパートにわかれています。Standard SuiteとText SuiteはAppleが定義したもので従って各アプリケーション共通のものです。
それ以外の Suiteはアプリケーションが独自に定義した用語が納められています。
2番目のカラムにあるはコマンド(関数)を、 はクラス(オブジェクト)を表しています。一番右のカラム内の
クラスの属性を示すパラメーターを表しています。詳細はスクリプトを紹介しつつ、追々説明していきたいと思います。
とにかく、これらの用語を使用して、SOCSSに図形を追加したり、図面から情報を引き出して表計算ソフトに表示したり、印刷処理を自動化したりと
様々なユーザーのやりたいことを自動化出来るので期待してください。
次回からコマンドを使って実際に図形をSOCSS上に描いてみたいと思います。

初めてのApple ScriptⅡ

今回は早速役に立つスクリプトを紹介したいと思います。それは図面上で選択された図形の面積を合計するスクリプトです。
まずSOCSSを起動して、仮にファイル名を"自宅計画案"、部分図名を"平面図"としてみます。数個の図形を描いて選択状態にします。
そして、以下のスクリプトを入力して実行してみてください。

1tell application "SOCSS"
2tell document "自宅計画案"
3tell section "平面図"
4set sshp to selected shapes
5set c to the count of sshp
6set ara to 0.0
7set i to 1
8repeat c times
9set ara to ara + area (item i of sshp)
10set i to i + 1
11end repeat
12end tell
13end tell
14display dialog "面積は " & ara & "m2 です"
15end tell

まず最初にざっくり説明していき、段々と掘り下げて説明していきたいと思います。

2行目  ファイル"自宅計画案"に対してという意味。
3行目  部分図"平面図"に対してという意味。
4行目  変数 sshp に 選択された図形の配列を渡しています。
5行目  変数 c に sshp配列の数をセット。
6行目  面積を入れる変数 ara を 0 で初期化しています。
8行目  繰り返し文の一つの型です。
9,10行目 変数に値を加えていく場合このような方法をとります。
14行目 前回のコラムで登場した display dialog コマンドで合計面積を表示します。(&で文字列を結合させています。)

変数に値を代入する文は次のようになります。

set 変数名 to 値 

値には 数値、文字、ブーリアン、リスト、レコード、クラスなどのタイプがあります。
ここではリストについて説明したいと思います。
リストは値の配列であり、生成文は例えば以下のようにします。

set aList to {1.0, 7, "文字列", true}

配列内に入る値はタイプが異なっていても問題ありません。
配列の要素を取り出すにはこのようにします。

set aValue to item 4 of aList

変数 aValue には配列の4番目の値、ブーリアン値のtrueが入ります。
配列の要素にアクセスする添字は一般的には0から始まりますが、AppleScriptの場合は1からですので注意が必要です。
また、値のタイプを指定した次のようなやり方も出来ます。

set aValue to integer 1 of aList

この場合変数aValueには一番目の整数である 7 が入ります。
また、複数の値を指定することも出来ます。

set aValue to items 2 thru 4 of aList

この場合には変数aVauleには{ 7, "文字列", ture }の配列が入ることになります。
apple scriptについては、様々なサイトで解説があるので、このサイトでは今後はSOCSS特有の
情報を優先して紹介していきたいと思います。

初めてのApple Script

SCSSはApple Scriptを利用する事で機能を拡張する事が出来ます。例えば複数のファイルを一括して印刷するとか、柱、間柱(指定した四角)に斜線を入れる、選択された図形の面積の合計を表示させる等。 面倒な作業を自動化出来ます。又、Apple Scriptは多くのMacアプリで採用されているので他のアプリとの連携した作業も可能です。例えば、表計算ソフト上の座標を基に多角形を作成するとか、連絡先(アプリ)の名簿から宛名印刷を一括して行う等、驚くほど多くの事が可能です。

まず最初はお約束的なところからいきましょう。
Apple Script エディタを開いて以下の文を入力して実行ボタンを押してみてください。

1display dialog "Hello World!"

文字入力に間違いなければ上記のようなダイアログが表示されるはずです。多くのプログラミング言語の入門書では、まず最初に'Hellow Woarld!'と表示されたウィンドウ (この場合はダイアログ)を表示させるのがお約束になっています。
Apple Scriptではたった1行でダイアログを表示させる事が出来ます。又、頼んでもいないのにボタンが2つついてきます。この辺がスクリプト言語の気安さでしょう。
次回から役に立つスクリプトを紹介していきたいと思います。