シートと列とセルの名称

RunSVLはシートの1行目の記述内容を見て、そのシートと列の役目を理解して動作します。 役目によりシートと列に名称をつけています。 RunSVLはキー文字「 %, * 」で役目を解釈しています。


Javascript, RunSVLシート

Javascriptシート
1行1列目に「%%%javascript」が記述されたシートを「Javascriptシート」と呼ぶことにします。 RunSVL実行時にはこのシートは純粋なJavascriptコードとして実行します。
[セルへのアクセス] 実行中、このシート内のセルへアクセスすることはできません。
[呼出] Javascriptシート内で定義された関数はどこからも直接呼び出せます。

RunSVLシート
1行目に「%, %*Label, %*Label(arg1,arg2)」、「%%SVL=...」あるいは「*Label, *Label(arg1,arg2), *」が記述されている列があれば、「RunSVLシート」と呼ぶことにします。 %, * から始まる列には、RunSVLの実行コードが記述されます。


%, %%, * 列

%列(スクリプト列)
1行目に「%, %*Label, %*Label(arg1,arg2)」が記述された列を「%列」あるいは「スクリプト列」と呼ぶことにします。 この列の2行目以降にJavascriptコードが記述されます。そのコードは「%」が記述されたセルまで続きます。 「%」がなければその列の最終行までがコードであるとみなします。
[セルへのアクセス] 実行中、この列内のセルへアクセスすることはできません。
[呼出] %*Labelは Label(); または Sheet名.Label(); で呼び出せます。
    %*Label(arg1,arg2)は Label(arg1,arg2); または Sheet名.Label(arg1,arg2); で呼び出せます。
    他のシートから呼び出す場合「Sheet名.」が必要です。

%%列(アプリ列)
1行目に「%%SVL=...」が記述された列を「%%列」あるいは「SVLアプリ列」と呼ぶことにします。 この列の2行目以降にアプリの入力変数(iv変数名, ie変数名または番号)と出力変数(ov変数名, oe変数名または番号)が記述されます。入出力変数は「%%」が記述された行まで続きます。 「%%」がなければその列の最終行までが入出力変数があるとみなします。
[セルへのアクセス] 実行中、この列内のセルへアクセスすることはできません。
[呼出] %%列(アプリ列)はスクリプト内から直接呼び出せません。


*列(入出力列)
1行目に「*Label, *Label(arg1,arg2), *」が記述された列を「*列」あるいは「入出力列」と呼ぶことにします。 この列の右列に「SVLアプリ」があれば、入力変数の行を「入力セル」、出力変数の行を「出力セル」と呼びます。 RunSVL実行時にこの列が実行されると、入力セルの値が入力変数にセットされてSVLを実行します。 そして出力結果の図形は図面Windowへ出力し、出力変数の値は対応する出力セルへ吐き出されます。
[セルへのアクセス] 実行中、この列の1行目のセルへアクセスすることはできません。
[呼出] *Labelは Label(); または Sheet名.Label(); で呼び出せます。
    *Label(arg1,arg2)は Label(arg1,arg2); または Sheet名.Label(arg1,arg2); で呼び出せます。
    他のシートから呼び出す場合「Sheet名.」が必要です。



<, > セル

セルの先頭文字が「<, >」である場合、セル値は特別な約束で値が決まります。


<式
入力セルで使われます。
このセル値はSVLアプリの入力変数への代入計算で設定されます。
このセルへ代入できません。

<?
入力セルで使われます。
このセル値はSVLアプリの入力要素をユーザーのマウス入力で設定されます。
このセルへ代入できません。

<<式
このセルは値を参照する度に式を計算します。
このセルへ代入できません。

>変数[=変数2=...]
出力セルで使われます。
このセルへの代入は変数への代入となります。このセル値は最後に代入した値です。
変数を省略した場合、代入はセル値を設定します。
複数の変数を「=」でつないだ場合、その変数すべてに値が代入されます。



実行順序

RunSVLの実行順序は以下のフローにしたがって実行します。



例1. 先頭行「%,*」である列が並んでいれば、実行の流れが右隣へ移ります。



例2. 右隣の列の先頭が「not(*,%)」である場合、呼び出し側に戻ります。



例3.「Javascriptシート」があれば、それらを最初に実行します。




SVLアプリ

SVLアプリ列のフォーマット

「SVLアプリ列」は「%%SVL="SVLファイルパス またはURL"」で始まり、 SVLプログラムの「入力変数・入力要素と出力変数・出力要素」情報を記述し、 最後に「%%」で締めくくります。

入力変数のフォーマット
  iv変数名=type:コメント・・・ type=数値,num, 文字列,str
コメント=SVL作成での入力変数のメッセージ
入力要素のフォーマット
  ie要素名=type:コメント
  ie番号=type:コメント
・・・ type=点,point, (固定点の場合)固,fixpt, (自由点の場合)自,freept, 直線,line, 円,circle, 楕円,ellipse, 曲線,curve, 記事,text
(要素名,コメント)=SVL作成での入力要素のメッセージ 最初の%要素名%コメント 番号=入力要素の順番(0~)
出力変数のフォーマット
  ov変数名=type:コメント・・・ type=数値,num, 文字列,str
コメント=SVL作成での出力変数の出力コメント
出力要素のフォーマット
  oe要素名=type:コメント
  oe番号=type:コメント
・・・ type=点,point, 直線,line, 円,circle, 楕円,ellipse, 曲線,curve, 記事,text
(要素名,コメント)=SVL作成での出力要素の出力コメント 最初の%要素名%コメント 番号=出力要素の順番(0~)

SVLアプリ列の右側にある入出力列において、入力変数・入力要素の右側のセルを「入力セル」、入力変数・入力要素の右側のセルを「出力セル」と呼びます。


「入出列(*列)」実行

SVLアプリ列」の右隣にある「入出力列(*列)」はSVLが実行できる列です。 「スクリプト列」へ擬似変換して、どのように実行されるかをみていきましょう。


① 単純な入出力列の場合

入力変数にセルの値を代入、入力要素はセルに値が記述されていないのでGetElement擬似関数でユーザーに入力させます。 入力が済んだら、executeSVL擬似関数でSVLを実行し、出力変数を対応するセルへ代入します。



② <,>セルを使った入出力列の場合

<式は、式の結果を入力変数とその裏シートのセルへ代入されます。<?は、GetElement擬似関数で入力要素と裏シートのセルに代入されます。 出力結果は>から、出力変数の値を裏シートのセルへ代入します。



③ 入出力列にスクリプトを挿入

SVLアプリ列で「%」のある行に対応する入出力列のセルにはスクリプトが記述できます。 「スクリプト列」への擬似変換ではその部分はそのままコピーされます。
複数行スクリプトが続く場合には、SVLアプリ列で「%{」で始まり「%}」で締めくくってもよいです。



④ 入出力列が連続してある場合

「SVLアプリ列」の右隣に「*列」が続いた場合、同じSVLを実行します。



SVL入力要素セル

SVLアプリ列の入力要素の右側の入力セルを特に「SVL入力要素セル」と呼ぶことにします。
SVL入力要素セルの内容によって,「ie要素,ie番号」への代入は以下のようになります。
セルの内容ie要素名(ie番号)へ代入されるもの
 空
<?
ユーザーがマウス入力した要素
xx,yy
<xx,yy
点(xx,yy)
{id:0,x:xx,y:yy}
<{id:0,x:xx,y:yy}
ペーパー座標(xx,yy)を現座標系へ変換した点
{id:no}
<{id:no}
要素番号noの要素
{type:1,x:xx,y:yy}
<{type:1,x:xx,y:yy}
点(xx,yy)
<で始まるセルの場合、xx,yy,noは計算式で与えれ、その計算結果を裏シートのセルにバイナリーで保存されます。


SVL出力要素セル

SVLアプリ列の出力要素の右側の出力セルを特に「SVL出力要素セル」と呼ぶことにします。
SVL実行結果「oe要素,oe番号」には、要素タイプ別に以下の値がセットされてます。
要素の値がCADのDBに登録されていなければ、「id:no」は省かれます。
要素タイプ要素の値
{type:1,[id:no,] x:xx, y:yy}
直線{type:2,[id:no,] x1:xx1, y1:yy1, x2:xx2, y2:yy2}
{type:3,[id:no,] x:xx, y:yy, r:rr, sa:ssa, da:dda}
その他{id:no}
>で始まるセルの場合、要素の値が裏シートのセルにバイナリーで保存されます。
>で始まっていない場合、要素の値を文字列化して( )付きでSVL出力要素セルへ書き込まれます。



セルへの代入と値参照

セル位置指定

シートのセル指定に次の3つのフォーマットがあります。
Sheet[行番号][列番号]
  alert( Sheet[2][2] ); // ABCD
  Sheet[3][2] = 1234;


Sheet.Label[列番号-1]
 1行目に*Labelを置いた列のセルを指定します。
  alert( Sheet.Xs[2] ); //同じシート内なら alert(Xs[2]); あいうえお
  Sheet.Xs[3] = -4321; //同じシート内なら Xs[2] = -4321;


Sheet.Label.id
 「%%列」の「id=」とその右側にある「*列」のLabelとの組み合わせでセルを指定します。
  alert( Sheet.Dom.x ); //同じシート内なら alert(Dom.x); 100
  Sheet.Dom.y = 200; //同じシート内なら Dom.y = 200;



<, > セル

先頭文字が「<, >」であるセルのアクセスはメモリー上の裏シートや式の計算と係わります。

<式, <?
[代入] SVLアプリの入力セルとして式が計算されて(<式)、ユーザーからマウス入力されて(<?)、裏シートのセルに値がセットされます。 セルはそれ以外では値がセットされません。このセルへ代入は無視されます。
[値参照] 裏シートのセルの値がこのセルの値です。
>変数, >変数=変数2=・・・,
[代入] SVLアプリの出力セルとして結果が出力されるとき、裏シートのセルに値がセットされます。 このとき同時に変数、変数2、...にも値がセットされます。
また、スクリプト内でもこのセルへ代入がおこなえますが、変数、変数2、...はグローバルにアクセスできるものでなければいけません。
[値参照] 裏シートのセルの値がこのセルの値です。
<<式
[代入] 代入は無視されます。
[値参照] 毎回式を計算し、その結果がセルの値となります。計算できない場合にはundefined値になります。





URLの引数

エクスプローラバーの「お気に入り」内の RunSVLスクリプト項目のプロパティに 「URL」とその引数が表示されます。その引数によってRunSVLスクリプトの実行開始位置が決まります。


① RunSVLスクリプト項目のプロパティの出し方は以下のとうりです。


     ↓


② 引数によって以下のように実行開始位置が決まります。
  ただし,「Javascriptシート」があればそれらを先に実行した後、以下の位置から実行を開始します。


URL書式 実行開始位置
file://アドレス/RunSVLスクリプト.jssファイルを呼び出し表形式で表示
http://アドレス/RunSVLスクリプト.jss実行モードによって実行開始位置が決まる


以下 http: , file: どちらも開始位置がおなじです。
URL書式 実行開始位置
http://アドレス/RunSVLスクリプト.jss?実行モードによって実行開始位置が決まる
http://アドレス/RunSVLスクリプト.jss?Sheet#Sheet(シート)の1列目から実行開始
http://アドレス/RunSVLスクリプト.jss?Sheet#LabelSheet(シート)のLabel列から実行開始
http://アドレス/RunSVLスクリプト.jss?Sheet#Label(arg1,arg2)Sheet(シート)のLabel列から引数arg1,arg2を与えて実行開始
http://アドレス/RunSVLスクリプト.jss?JavascriptコードJavascriptコードから実行開始


例を示すために,JSSファイル「http://www.xyz/sample.jss」が以下の内容になっているとします。


例1. 指定シートから実行したい場合
  http://www.xyz/sample.jss?Sheet2# ・・・ Sheet2の1列目から実行開始


例2. 指定シートのラベルから引数を渡して実行したい場合
  http://www.xyz/sample.jss?Sheet2#B(1000,500) または
  http://www.xyz/sample.jss?Sheet2.B(1000,500) ・・・ Sheet2のラベルB列目から引数(1000,500)を渡して実行開始


例3. 「Javascriptシート」にある関数を実行したい場合
  http://www.xyz/sample.jss?ABC() ・・・ Sheet1にある関数ABC()を実行



スコープ

変数・関数・ラベルの参照

RunSVLスクリプト内の変数・関数・ラベルは次の3つの規則で参照されます。

Javascriptシート内で定義された変数・関数はどのJavascriptシート、どのRunSVLシート内のスクリプト列・入出力列からでもその変数名・関数名で参照できます。
RunSVLシート内で定義されたスクリプト列・入出力列のラベルは、そのシート内ではそのラベル名で参照できます。
③ あるRunSVLシート(その名前をAsheetとしておく)内にあるスクリプト・入出力列のラベルを、他のRunSVLシートやJavascriptシートから参照するには「Asheet.ラベル名」で参照します。


以下のRunSVLスクリプトサンプルに参照規則をコメントしました。


参照とスコープ

変数名・関数名・ラベル名の参照は、定義位置とその有効範囲で決まります。 RunSVLスクリプト内には、
 ① シート名
 ② スクリプト列・入出力列ラベル名
 ③ Javascriptシート・スクリプト列・入出力列内の変数名関数名
が定義されており、Javascript言語の文法に従ってこの4つの名前を操るプログラムが記述されます。
それぞれの名前は定義された場所で、参照できる範囲が決まります。この範囲をスコープと呼びます。


各シートに記述されたスクリプトは下図のイメージで配置され、実線枠がスコープとなります。
Javascriptシートは、RunSVLスクリプト全体のグローバルスコープに配置されます。
RunSVLシートは、そのシート名を名付けたスコープ内にスクリプト列、入出力列が配置されます。



スコープ内に定義された変数・関数・ラベルは、そのスコープの内側にあるスコープから、参照できます。 逆に、変数・関数・ラベルは、そのスコープの外側スコープで定義されていれば、参照できます。

例1. グローバルスコープ内で定義された関数C()は、LabelDスコープ(-> Sheet1スコープ -> グローバルスコープ)内から呼び出せます。
例2. Sheet1スコープ内で定義されたラベルLabelEは、LabelDスコープ(->Sheet1スコープ)内から呼び出せます。


関数とスコープ

関数内やスクリプト列内に関数を定義できます。関数の本体部分はスコープを形作ります。 関数内からその外側にあるスコープの変数、関数、ラベルに上記の規則で参照できます。


スコープ4はスコープ2の内側にあるので B(); は呼び出せます。
しかし、x3 は、スコープ4の外側で定義されていないので参照エラーとなります。

名前探索とスコープ

変数名、関数名、ラベル名が現在実行中のスコープ内にない場合、1つ上のスコープからその名前を探します。 なければさらに1つ上のスコープからその名前を探します。見つかるまで上位のスコープを辿って探索を繰り返します。


スコープ3で、x2はスコープ2にある変数を参照します。
x1 はスコープ1の変数x1でなく、スコープ2の変数x1を参照します。