諸事情によりお知らせが遅くなってしまいましたが、RINEARNでは先月(2020年8月)中旬、リニアングラフ3DやVCSSLなどの各ソフトウェアの最新版をリリースいたしました。
そこで今回は、各ソフトウェアごとに更新点をリストアップしてご紹介いたします。
※ 更新点のリストは、各ソフトウェア同梱のリリースノートにも記載されています。
「プログラム」メニューでの自動処理機能などに使用される、同梱のVCSSL処理系のバージョンが、最新版の 3.4.22 になりました。 詳細は後述のVCSSLの項目をご参照ください。
起動用のバッチファイルやシェルスクリプト類を更新しました。 主に内容の整理目的ですが、シェルスクリプトにおいて複数の引数を渡せなかった挙動の修正なども行いました。
「ツール」>「アニメーション」機能において、 アニメーションの各コマの画像を、連番の画像ファイルとして一括保存できるようになりました。 アニメーション機能のウィンドウ右下の、「連番画像を保存」ボタンを押すと保存できます。 保存先は指定可能ですが、デフォルトでは「 AnimationOutput 」フォルダに保存されます。
これまで、「プログラム」メニュー内にあるアニメーション関連のプログラムにおける デフォルトの入出力フォルダは、それらのプログラムのある場所に配置されていました。 具体的には、 「 RinearnGraph3DProgram 」フォルダ内の「 animation3d_input 」や「 animation3d_output 」フォルダ などが使用されていました。
一方で、一つ上で述べた項目のように、このバージョンから「ツール」>「アニメーション」メニューも画像を保存可能になりました。 メニューによってデフォルトの入出力フォルダが異なるのはややこしいため、このバージョン以降、「プログラム」メニューも含めて、 アニメーション関連の全ての入出力フォルダを、ソフトのフォルダ直下にある 「 AnimationInput 」と「 AnimationOutput 」フォルダへと移行しました。
点プロットにおいて、単純な点の代わりに、任意の記号などの文字(必要であれば記号以外の任意文字列も使用可能)のマーカーを描画できるようになりました。
メニューバーから「オプション」>「点プロット」を一旦無効化し、再度有効化すると、 点プロットの設定ウィンドウが表示されます。 そこで「マーカーを使用する」の項目を有効化すると、マーカーが描画されます。 マーカーの記号文字は、上記のウィンドウ上で自由に指定できます。
マーカーの記号は「,」区切りで複数指定でき、描画時には系列ごとに記号が切り替わります。 複数系列のデータの記述方法については、書式によって異なるため、詳しくは下記ガイドページをご参照ください。
例えば3カラム書式では、データファイル内に2行連続した空白行があると、そこが系列の区切りと見なされ、マーカーの記号が変わります。
例として「SampleDataFile」フォルダ内に、 実際に3カラム書式による複数系列のサンプルファイル「 MultiSeriesSample_複数系列サンプル.txt 」が同梱されています。
「グラデーション」オプション有効時において、色の変化をなめらかに補間する処理を無効化できるようになりました。
グラデーションオプションはデフォルトで有効なため、一旦OFFにして再度ONにすると、設定画面が表示されます。 その設定画面上にある「 色変化をなめらかに補間 」項目をOFFにすると、彩色の補間を無効化できます。 無効化すると、色が区間ごとにベタ塗りされるようになります。 色区間の数は、グラデーションオプション設定画面の「カラーリスト」項目に記載した色の数がそのまま採用されます。 色区間の数や境界が、望む数や位置になるように、カラーリストの色や個数などを調整してください。
(必要に応じて、同じ色を連続して記載するなども有効です。例えばカラーリスト内の一部で、 同じ色を3連続で記載すると、3区間が同じ色で塗られるため、実質的に3倍の長さの1区間を表す事ができます)。
なお、グラフ左上に表示されているカラーバーの目盛りの区間数は、 「編集」>「目盛りの設定」>「目盛り区間数(カラーバー)」から設定できます。
Z軸以外に、X軸とY軸の座標値に基づくグラデーションが可能になりました。
等高線の高さと完全に同じ(かつ水平な)面/辺がある場合などに、異なる高さの等高線を繋ぐ尖った三角形が描画される場合がある問題を修正しました。 また、等高線の描画アルゴリズムを一部改善し、メッシュのセル内に等高面との交点が3点以上ある場合の描画精度が少し向上しました。
(この場合は、セル内のみに注目した際の等高線の引き方に任意性があるため、 全体に渡って連続的な等高線を引きたい場合は、「テッセレーション」オプションを併用し、 メッシュ全体を細かく補間分割してください。 補間モードについては、「PARABOLIC」モードは二次曲面的な補間を行うため、曲面的なデータに対しては滑らかになります。 一方、フラットであるべき領域がある場合などには、曲面的に補間するとおかしい場合もあるため、直線的に補完する「GRAVITIC」モードの方が無難です。)
グラフの角度に応じて、各辺の目盛りの表示/非表示を自動で切り替えるアルゴリズムを一部改修しました。 これにより、目盛りの邪魔な箇所を非表示にする精度が改善しました。
グラフの枠から、目盛りの数字の位置に引かれている細かい線を、枠の内側に描画する機能をサポートしました。
メニューバーから「編集」>「目盛りの設定」を選んで目盛り設定ウィンドウを表示し、 そこで「線の長さ」項目の下にある「内向きに描画」項目を有効化すると、 内向きに描画されるようになります。
なお、単純に内向きに設定しただけの状態だと、目盛りの数字がグラフの枠に接近するため、 X/Y/Z各次元の端で数字が重なってしまいやすくなります。 そのため、「数字の余白」項目で余白を増やして調整してください。
または、「編集」>「フォントの設定」から、目盛りフォントの文字サイズを小さくして調整してください。
Ver.5.6以降、目盛り数値のフォントサイズは標準で15ptでしたが、 少し大きすぎる気がするため、12ptにしました。
( 昔のバージョンではアンチエイリアス描画に対応していなかった関係で、 小さい数字がギザギザで見づらくなってしまう問題があり、そのため大きめの値になっていたのですが、 現在はアンチエイリアスが利用可能で、標準で有効になっているため、綺麗に描画されます。 )
なお、フォントサイズはメニューバーから「編集」>「フォントの設定」で自由に調整可能です。
データファイル内で、「 # 」で始まる行は、コメントとして読み飛ばされるようになりました。
データファイルを開く際に選択できるフォーマット名の一部を、以下のように変更して整理しました。
「4-COLUMNS (旧 3-COLUMN + COMMENT)」形式は、 従来は座標点の横にコメントを付けるためにだけ使用する形式でしたが、 本バージョンからグラデーション彩色でも有用になりました(すぐ後の項目参照)。
上記の 4-COLUMNS 書式(旧名: 3-COLUMN + COMMENT 書式)は、1行ごとに空白やカンマ区切りで、 x y z 値を3列の記載する 3-COLUMNS 書式の右に、もう一列を追加したものです。 これまでは「 コメントプロット / With Comments 」オプションにおいて、 各座標点にコメントなどを表示するためだけの書式でした。
今回のバージョンからは、4列目のデータに数値を記載して、 その数値に応じてグラデーション彩色が可能になりました。
使用するには、「 グラデーション / Gradation 」オプションを無効化して再び有効化すると表示される 設定画面の上部から、「 基準軸 / AXIS 」項目で「 COLUMN-4 」を選択してください。
例として「 SampleDataFile 」フォルダ内に、 サンプルのデータファイル「 4ColumnsSample_4列書式サンプル 」が付属しています:
プロット結果は以下の通りです(上記の一番右の列の値に応じて彩色されます):
これまで、書式に「 AUTO 」を選択した状態で4列データを読み込んだ場合、 「 MATRIX 」書式で読み込まれていました。これは、それ以外に4列データに適合する書式が無かったためです。
一方、このバージョンより「 4-COLUMNS 」書式によるグラデーション彩色(上の項目参照)をサポートした都合上、 今後は「 4-COLUMNS 」書式のファイルを開くケースが増加する事が見込まれます。 そのため、今後は「 AUTO 」選択状態で4列データを開いた場合に、 「 MATRIX 」と「 4-COLUMNS 」のどちらで開くか尋ねられるように挙動が変わりました。
VCSSLでの制御用APIライブラリである「 tool.Graph3D 」ライブラリにおいて、 独立した関数として用意されていないような細かい設定項目は、従来は設定ファイルを用意し、 setGraph3DConfigurationFile 関数によって読み込ませる必要がありました。
今回のバージョンから、ファイルを用意しなくても、設定ファイルと同様の書式で記述したコードを 文字列として読み込ませて反映できる、以下の関数が利用可能になりました:
詳細は lib/toolフォルダ内の仕様書 Graph3D.html をご参照ください。
設定ファイルの書式においていくつかの設定パラメータ名を変更し、整理しました。 なお、互換措置として、旧来の設定パラメータ名もこれまで通り読み込み可能です。
目盛り設定条件などによっては、平面化(Flat)オプションを有効化した際、 座標軸の一部の線が、本来の1ピクセルから2ピクセル程度に太く描画されてしまう場合がある挙動を修正しました。
「プログラム」>「連番画像ファイルのアニメーション再生.vcssl」使用時に、
ソフトウェアを起動してから既に読み込んだ画像ファイルと、全く同じパス(場所と名前)の画像ファイルを差し替えて再生した場合、
初回読み込み時にキャッシュされた画像内容が使用され、更新(再読み込み)されない挙動を修正しました。
(これは VCSSL での Graphics ライブラリの loadImage 関数の挙動に起因するもので、後のVCSSLの項目に記載の通り、同関数の挙動が修正されまいた。)
従来では、配列引数を参照渡しする際、以下のように宣言する必要がありました:
本バージョンより、単純に以下の形でも宣言できるようになりました:
これは、VCSSLのアプリケーション組み込み用サブセットである Vnano と互換性を保つためのものです。 VCSSLでは引き続き前者の形も使用できますが、Vnano では(少なくとも現状では)後者のみ有効な形となります。
起動用のバッチファイルやシェルスクリプト類を更新しました。 主に内容の整理目的ですが、シェルスクリプトにおいて複数の引数を渡せなかった挙動の修正なども行いました。
VCSSL 3 以降のバージョン (3.0.0 〜 3.4.20) において、 3次元以上の配列に対して、alloc 文で領域を再確保(要素数を再設定)した際、 再確保前の値が正しい順序で保持されない挙動を修正いたしました。
配列の再確保と解放において、alloc 文および free 文と同等の機能を関数として提供する、 下記の関数を System ライブラリに追加しました:
この追加の主な目的は、 VCSSLのアプリケーション組み込み用サブセットである Vnano のコードと互換性を保つためですが、 そもそも文による配列の領域操作は他言語において一般的ではないため、 今後は上記関数を使用する方が、可読性の点でも好ましいかもしれません。 VCSSLでは引き続き alloc / free 文も使用できますが、Vnano では上記関数のみ使用可能となります。
これまでも、float 型の最小値を表す定数として、System ライブラリの FLOAT_MIN が存在しました。 一方で、「 float 型の最小値 」という概念には、「 正の範囲で最も小さい値 = (0以外の)最小絶対値 」と、 「 負の範囲も含めて最も小さい値 = 絶対値が最も大きなマイナスの値 」の2つが考えられます。 さらに両者において、正規化数と非正規化数のどちらの範囲内での値かによって、値が2通り存在します。
従来から存在した System.FLOAT_MIN は、 「 非正規仮数 」の範囲内での「 正の範囲で最も小さい値 = (0以外の)最小絶対値 」を格納していました。 しかし、その事が名前からは一目でわからないため、より具体的な名前を持つ、同じ値の定数として、
を System ライブラリに追加しました。 また、同様に正規化数の範囲内で「 正の範囲で最も小さい値 = (0以外の)最小絶対値 」を格納する、
も追加しました。従来の FLOAT_MIN も引き続き使用できますが、 float 型のこのような値が必要になるような特殊な場面においては、 上記の新しい定数を使用する方が、名前の曖昧性による混乱を予防できるかもしれません。
従来からの float/varfloat 値を丸める round 関数に加えて、 新たに string 値の中身を浮動小数点数と見なして丸め、string 値を返す、 以下の関数を System ライブラリに追加しました。
この関数は、float 値を文字列に変換したり print 関数で表示した際と同じ内容 (内部で暗黙の丸め処理が行われます / 後述)を基準として、さらに意図通り丸めたい場合などに使用します。 float 型の値を直接丸める場合と比べて、2進/10進変換誤差の影響が僅かに異なる場合があります(後述)。
そもそも float型の値は、内部では2進数の浮動小数点数のデータとして保持されており、 一方で round 関数での丸め処理は10進数基準で行われます。 その際、float値の2進数と10進数の変換は、理論上有限の桁に収まらないケースがあり、微小な変換誤差が生じ得ます。
一方、float 値を print 関数で表示したり、文字列へ変換したりする際にも、10進数への変換が行われますが、 それもまた理論上有限の桁数に収まらない場合があるため、適当な桁数に収まるよう、内部で暗黙的な丸め処理が行われます。 従って、float 値の print 結果や文字列表現(10進数)と、float 値の内部的な値(2進数)は、 わずかに食い違っている場合があります。
従って、float 値そのものを直接 round 関数で丸めるのと、 「 float 値の文字列表現(= print 表示した際の内容)」をround 関数で丸めるのとでは、 round 関数の指定桁数や丸めモードが同じであっても、結果が僅かに食い違う場合があります。 前者の処理はこれまでも行えましたが、後者の操作を行う関数は存在しませんでした。 そこで後者の操作をサポートするため、今回の関数 round(string, ...) を追加しました。
スクリプト実行開始時点からの経過時間を返す time 関数は、これまで Time ライブラリで提供されてきましたが、 Time ライブラリの関数の中でも使用頻度が特に高いため、System ライブラリでも提供されるようになりました。
System ライブラリは import 不要で使用できるため、今後は何も import しなくても標準で time 関数を使用できます。
グラフソフトの制御用APIライブラリである「 tool.Graph2D / Graph3D 」ライブラリにおいて、 独立した関数として用意されていないような細かい設定項目は、従来は設定ファイルを用意し、 setGraph2DConfigurationFile / setGraph3DConfigurationFile 関数によって読み込ませる必要がありました。
今回のバージョンから、ファイルを用意しなくても、設定ファイルと同様の書式で記述したコードを 文字列として読み込ませて反映できる、以下の関数が利用可能になりました:
詳細は lib/toolフォルダ内の仕様書 Graph2D.html / Graph3D.html をご参照ください。
rad 関数と deg 関数に関する説明文が混同を含む(引数/戻り値仕様などが互いに逆な)内容になっていたため、訂正いたしました。 関数の挙動自体は以前と同一です。
関数名や引数名、引数や戻り値の型情報などは、シグネチャ(文法的定義)の項目から把握可能であるため、 各関数仕様のテーブルにおいて、これまでは独立な項目としては記載していませんでした。 しかし、慣れないと分かり辛いため、独立な項目としても記載されるようにしました。
また、いくつかの関数(Mathライブラリ内のよく用いる数学関数等)については、 簡単な使用例のコードが記載されるようになりました。
同一のファイルパスの画像ファイルを Graphics ライブラリの loadImage 関数で複数回読み込んだ場合、 その間に画像ファイルの内容が変更されていても、 これまでは起動後初回に読み込んだのと同一の内容が返されてしまっていました。 本バージョンにおいて、変更が反映されるように修正しました。
main 関数やイベントハンドラ関数から始まるフローにおいて、exit 関数をコールしてプログラムを終了させた場合、 その後VCSSLランタイムや搭載ソフトウェアを動作させたまま(再起動せずに)リセットや別プログラムを実行すると、 プログラムの解釈画面(青い画面)から先に進まない場合がある現象を修正しました。 (この現象は、プログラム内での制御文の組み合わせ方と、その中での exit コール位置に依存するため、発生条件は複雑です。)
その他のソフトウェアについては、プログラム機能などで使用される同梱のVCSSL処理系を更新すると共に、ソフトウェアの起動用スクリプト類(シェルスクリプト&バッチファイル)の更新などを行いました。 加えてリニアングラフ2Dについては、リニアングラフ3Dと同様に、アニメーションツール関連の機能も更新しました。
今回の更新では、本記事中に記載した通り、何点かの不具合の修正を含んでいます。 この不具合および修正においてご迷惑をお掛けしてしまった方々には、深くお詫び申し上げます。
また、各ソフトウェアにて今回追加/修正されたいくつかの機能におきましては、ユーザー様からのご意見・ご要望や、先行開発版による動作検証などのご協力をいただきました。 今回ご協力くださった方々には、この場をお借りして、改めて御礼申し上げます。
これからも、RINEARNでは貢献活動の一環として、本記事に挙げた各ソフトウェアのメンテナンスや改良を継続してまいりますので、どうぞ今後ともご愛用いただけますと幸いです。