Mindが採用したGUIエンジンであるTcl/Tkは簡単なドロー系ソフトが作れるぐらいの高機能なグラフィック機能を持っています。そのグラフィック機能はすべて「キャンバス」と呼ばれるウィジェットによって実現されます。
■座標とサイズについて
・座標の原点
図形などの座標を指定する場合、キャンバス左上隅が原点(0, 0)となります。
・座標とサイズの単位
以降の構文に書かれている座標、サイズ、移動量 などは断りの無い限り、ピクセル単位です。個々の構文内では触れませんのでご注意願います。
■キャンバスウィジェットのID取得
構文=
プログラム例:
キャンバスは ID。 *1
・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・
・・この間で各種イベントの処理を記述・・ *1
・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・
メインとは
メインウィンドウと 600と 460と 白色で
キャンバスを立て キャンバスに 入れ
・・・・し
・・・・すること。
注1:イベント処理でキャンバスを操作することが多く、
どのソース位置からもIDを参照できるよう、IDは
大域変数に格納しておきます
指定したウィジェット内に指定したサイズと背景色でのキャンバスを設置します。自動的に有効化と配置までおこなうため明な有効化や配置は不要です。
返されたキャンバスIDは後続する図形の作成や操作で必要になるので変数に記憶してください。通常は”メインの外”にキャンバスIDを使う多くの処理単語を定義することになるため、IDは大域変数に記憶しておくのが良いでしょう。
- 注
-
キャンバスIDを格納する変数は「○○は ID」で宣言します。
一方、図形のIDを格納するには「○○は 図形ID」で宣言します。キャンバスを扱うプログラムては両者混在するため注意が必要です。
■キャンバスのクリア
構文=
プログラム例:
キャンバスをクリアします。描画されていたすべての図形や図形タグは削除され、キャンバス設置直後の状態になります。
直線や円など、線を使った多くの作画機能があります。
■図形IDと変数宣言について
作画機能の単語(たとえば「直線のIDを取得」や「直線を描く」)を呼び出すと、”図形ID”と呼ぶIDをスタックに返して来ます。それを変数に格納してから使ってください。
図形IDを格納するための変数の宣言は、例えば、
直線1は 図形ID。 ←大域変数
直線1は 図形ID ←局所変数
のように行います。上記は大域変数あるいは局所変数としての宣言ですが、次のように配列としても宣言できます。
図形群は 10個の 図形ID。
「図形ID」は実は「倍精度整数」の等価語であり、64bit長の整数を記憶することができます。一般のID(32ibt長)とはデータ幅が違います。
図形IDを指示する多くの処理単語は図形IDを格納している変数名をその直前に明記する必要があることに注意してください。以下のようなものです。
プログラム例:
○○とは
直線1は 図形ID
・・と ・・で 直線のIDを取得し 直線1に 入れ
直線1を 描画し
↑
変数名の記述が必須!
描画系の処理単語の直前に図形ID変数が記述必須になっているのは、変数に副作用を与えることがあるからです。上記例では、「描画」を実行することにより,変数に ”描画済みである”ことを表す情報が書き込まれます。
アプリケーションによっては、図形を描画した後になって、たとえば削除したり、属性を変更することがあるかも知れません。そのような場合は、後の処理のため、図形IDを格納する変数は局所変数ではなく大域変数として宣言してください。
プログラム例2:
直線1は 図形ID。 ←イベント処理でも参照する場合は大域変数として確保
イベント処理とは ↓ここからもアクセスする
・・を 直線1に ○○設定し
直線1を 変更を反映し。
○○とは
・・と ・・で
直線のIDを取得し 直線1に 入れ ←最初の変数格納
直線1を 描画し。
このことと関係しますが、図形IDを格納する変数のコピーを他の場所に作らず、
変数は1つだけで管理 するようにしてください 。図形IDの変数は処理単語の実行によって書き換わることがあり、複数の場所にコピーが存在すると不整合が起きてしまうからです。(ただ、多くの場合は見た目上はうまく動作しているように見えてしまいますが)
逆に、1度描画した後は、その図形を削除したり属性変更することが無いのであれば、図形IDの変数は局所変数としておくのが良いでしょう。(局所変数であれば名前の使い回しができます)
例えば、サンプルプログラム "canvas-basic.src" に 「基本作画とは」 から始まる処理単語定義がありますが、ここでの描画に使う図形IDの変数はすべて局所変数としています。後からそれらの図形を操作することが無いからです。
他方、 「無属性タグを付け一つ円を表示とは」 から始まる定義では図形IDを大域変数に格納しています。後から操作できるようにするためです。
■直線
【形式1】 (ID取得と描画を別々に)
構文=
(ID取得)
<キャンバスID>と
<始点X> <始点Y> <終点X> <終点Y>で
直線のIDを取得 → 図形ID
(属性設定)
・・・を <図形ID>に ・・設定する
(描画)
<図形ID変数>を 描画 → ・
↑変数名の記述必須
【形式2】 (ID取得と描画を同時に)
構文=
<キャンバスID>と
<始点X> <始点Y> <終点X> <終点Y>で
直線を描く → 図形ID
プログラム例: (形式2を使う)
直線1は 図形ID
キャンバスと 18 18 68 68で 直線を描き 直線1に 入れ
(形式1)
直線を描画するための準備を行います。図形IDが返されます。
このタイプではIDの取得のみを行い、後続して属性を設定したのち、「描画」により実際の描画がおこなわれます。
(形式2)
このタイプではID取得から描画まで一気に行います。線の太さや色などがデフォルトのままで良く、明に属性を付与しなくて済む場合はこちらが簡便です。
(記:描画時点での属性設定はできませんが、描画後の再設定は可能です)
■正方形
記: 以降の構文図では、先の「直線のIDを取得」で解説したような ID取得、 属性設定、 描画 ・・の3ステップでの手順説明は煩雑なので省きます。しかし直線の時と同様に属性設定して構いません。
構文=
(形式1)
<キャンバスID>と
<始点X> <始点Y> <一辺の長さ>で
正方形のIDを取得 → 図形ID
(形式2)
<キャンバスID>と
<始点X> <始点Y> <一辺の長さ>で
正方形を描く → 図形ID
記:形式2はID取得から描画まで一気に行いますが
描画時点での属性設定はできません
プログラム例:
正方形1は 図形ID
(形式1)
キャンバスと 428 18 50で 正方形のIDを取得し
正方形1に 入れ
正方形1を 描画する
(形式2)
キャンバスと 428 18 50で 正方形を描き
正方形1に 入れ
正方形を描画するための準備を行います。図形IDが返されます。
正方形の左上隅の座標および一辺の長さを指定します。
■長方形
構文=
(形式1)
<キャンバスID>と
<始点X> <始点Y> <終点X> <終点Y>で
長方形のIDを取得 → 図形ID
(形式2)
<キャンバスID>と
<始点X> <始点Y> <終点X> <終点Y>で
長方形を描く → 図形ID
記:形式2はID取得から描画まで一気に行いますが
描画時点での属性設定はできません
プログラム例:
長方形1は 図形ID
(形式1)
キャンバスと 218 18 368 68で 長方形のIDを取得し
長方形1に 入れ
長方形1を 描画する
(形式2)
キャンバスと 218 18 368 68で 長方形を描き
長方形1に 入れ
長方形を描画するための準備を行います。図形IDが返されます。
長方形の左上隅を始点とし、右下隅を終点とする2つの座標を指定します。
■折れ線
構文=
(形式1)
<キャンバスID>と
<X1> <Y1>と ※座標1
<X2> <Y2>と ※座標2
<X3> <Y3>と ※座標3
・・・・・と
<座標個数>で ←これを忘れないで
折れ線のIDを取得 → 図形ID
(形式2)
<キャンバスID>と
<X1> <Y1>と ※座標1
<X2> <Y2>と ※座標2
<X3> <Y3>と ※座標3
・・・・・と
<座標個数>で ←これを忘れないで
折れ線を描く → 図形ID
記:座標個数は X,Y のセットを1個と数えます。最大100座標まで
記:最後に個数を積むことを忘れないでください
記:形式2はID取得から描画まで一気に行いますが
描画時点での属性設定はできません
プログラム例:
折れ線1は 図形ID
(形式1)
キャンバスと
88 18 128 63 170 63 190 25と 4個で
折れ線のIDを取得し 折れ線1に 入れ
折れ線1を 描画する
(形式2)
キャンバスと
88 18 128 63 170 63 190 25と 4個で
折れ線を描き 折れ線1に 入れ
折れ線を描画するための準備を行います。図形IDが返されます。
折れ線を構成する各点の座標を列挙し、
最後に座標の個数を積んでから処理単語を呼びます。座標個数はXとYが1セットで1個と数えます。
■多角形
構文=
(形式1)
<キャンバスID>と
<X1> <Y1>と ※座標1
<X2> <Y2>と ※座標2
<X3> <Y3>と ※座標3
・・・・・と
<座標個数>で ←これを忘れないで
多角形のIDを取得 → 図形ID
(形式2)
<キャンバスID>と
<X1> <Y1>と ※座標1
<X2> <Y2>と ※座標2
<X3> <Y3>と ※座標3
・・・・・と
<座標個数>で ←これを忘れないで
多角形を描く → 図形ID
記:座標個数は X,Y のセットを1個と数えます。最大100座標まで
記:最後に個数を積むことを忘れないでください
記:形式2はID取得から描画まで一気に行いますが
描画時点での属性設定はできません
プログラム例:
多角形1は 図形ID
(形式1)
キャンバスと
18 372 68 320 118 370 93 440 53 440と 5個で
多角形のIDを取得し 多角形1に 入れ
多角形1を 描画する
(形式2)
キャンバスと
18 372 68 320 118 370 93 440 53 440と 5個で
多角形を描き 多角形1に 入れ
多角形を描画するための準備を行います。図形IDが返されます。
多角形を構成する各点の座標を列挙し、最後に座標の個数を積んでから処理単語を呼びます。座標個数はXとYが1セットで1個と数えます。
なお、本処理単語が描画するのは
「正多角形」ではなく「多角形」なので注意してください。正多角形を描画するにはユーザがそのための精密な座標を指定する必要があります。
■円
構文=
(形式1)
<キャンバスID>と
<中心X> <中心Y> <半径>で
円のIDを取得 → 図形ID
(形式2)
<キャンバスID>と
<中心X> <中心Y> <半径>で
円を描く → 図形ID
記:形式2はID取得から描画まで一気に行いますが
描画時点での属性設定はできません
プログラム例:
円1は 図形ID
(形式1)
キャンバスと 453 43 25で 円のIDを取得し 円1に 入れ
円1を 描画する
(形式2)
キャンバスと 453 43 25で 円を描き 円1に 入れ
円を描画するための準備を行います。図形IDが返されます。
円の中心の座標および半径をピクセル単位で指定します。
■楕円
構文=
(形式1)
<キャンバスID>と
<始点X> <始点Y> <終点X> <終点Y>で
楕円のIDを取得 → 図形ID
(形式2)
<キャンバスID>と
<始点X> <始点Y> <終点X> <終点Y>で
楕円を描く → 図形ID
記:形式2はID取得から描画まで一気に行いますが
描画時点での属性設定はできません
プログラム例:
楕円1は 図形ID
(形式1)
キャンバスと 218 18 368 68で 楕円のIDを取得し
楕円1に 入れ
楕円1を 描画する
(形式2)
キャンバスと 218 18 368 68で 楕円を描き
楕円1に 入れ
楕円を描画するための準備を行います。図形IDが返されます。
座標は、
楕円に外接する長方形の始点・終点の座標となります。つまり、座標指定に関しては長方形の描画と同じになります。
■円弧
構文=
<キャンバスID>と
<中心X> <中心Y> <半径>で
円弧のIDを取得 → 図形ID
<開始角度> <描画角度>を
<図形ID>に 開始・描画角度を設定 → ・
<円弧の種類>を *1
<図形ID>に 円弧の種類を設定 → ・
<図形ID変数>を 描画
↑変数名の記述必須
注1:円弧の種類は文字列で、以下のいずれかのシンボルを指定
円弧単独
円弧と中心点を結ぶ
円弧と始点終点を結ぶ
プログラム例:
円弧1は 図形ID
キャンバスと 453 43 25で 円弧のIDを取得し
円弧1に 入れ
0と 270で 円弧1に 開始・描画角度を設定し
円弧と始点終点を結ぶで 円弧1に 円弧の種類を設定
円弧1を 描画する
円弧を描画するための準備を行います。図形IDが返されます。
円弧の中心の座標および半径をピクセル単位で指定します。
開始角度は描画を開始する点を円弧の中心から見たときの角度です。X軸の正方向が起点(0度)となります。
描画角度は開始角度を起点としてどのぐらいの角度だけ描画するかの指定となります。360度で全周となります。
円弧の種類についてはサンプルプログラム "canvas-basic.exe" を実際に操作してお確かめください。「図形の描画」−「基本作画」をたどると基本的な作画が行われますが、上から3行目が円弧で、左から順に、
円弧単独
円弧と中心点を結ぶ
円弧と始点終点を結ぶ
を使った描画となります。
■楕円弧
構文=
<キャンバスID>と
<始点X> <始点Y> <終点X> <終点Y>で
楕円弧のIDを取得 → 図形ID
<開始角度> <描画角度>を
<図形ID>に 開始・描画角度を設定 → ・
<円弧の種類>を
<図形ID>に 円弧の種類を設定 → ・
<図形ID変数>を 描画
↑変数名の記述必須
注1:円弧の種類は文字列で、以下のいずれかのシンボルを指定
円弧単独
円弧と中心点を結ぶ
円弧と始点終点を結ぶ
プログラム例:
楕円弧1は 図形ID
キャンバスと 218 18 368 68で 楕円弧のIDを取得し
楕円弧1に 入れ
0と 270で 楕円弧1に 開始・描画角度を設定し
円弧と始点終点を結ぶで 楕円弧1に 円弧の種類を設定
楕円弧1を 描画する
楕円弧を描画するための準備を行います。図形IDが返されます。
座標は
楕円に外接する長方形の始点・終点の座標です。つまり、座標指定に関しては長方形の描画と同じになります。
開始角度は描画を開始する点を楕円弧の中心から見たときの角度です。X軸の正方向が角度の起点(0度)となります。
描画角度は開始角度を起点としてどのぐらいの角度だけ描画するかの指定となります。360度で全周となります。
円弧の種類についてはサンプルプログラム "canvas-basic.exe" を実際に操作してお確かめください。「図形の描画」−「基本作画」をたどると基本的な作画が行われますが、上から2行目が楕円弧で、左から順に、
円弧単独
円弧と中心点を結ぶ
円弧と始点終点を結ぶ
を使った描画となります。
■描画
構文=
<図形ID変数>を 描画する → ・
↑変数の記述必須
処理単語 「○○のIDを取得」 で取得した図形IDを描画します。
ソース上、本処理単語の前にはIDを格納している変数の名前が必ず書かれている必要があります。
本処理単語から戻って来るとID変数の内容が変化します(変数が強制的に書き換わります)
属性設定があるなら、”描画する”より前におこなってください。
処理単語 「○○のIDを取得」 でIDを取得した図形は、「描画」の前に属性を設定することができます。
いずれも、図形描画後に属性を変更した場合は最後に「変更を反映」を実行して変更を反映させる必要があります。
注1: 以下で 「IDorタグ」 と書いた部分は、図形IDまたは図形タグIDを指定することを意味します。
注2: ある図形に対して各種属性だけをおこない、「描画」または「変更を反映」せずにさらに別の図形の属性の設定をおこなうような書き方では、確定が保留される図形数は7個に制限されます。
7個あるから大丈夫と思われるかも知れませんが、保留している間にイベントが発生してそこでも属性設定をおこなう可能性もあるため、原則としては1つの図形への一連の属性設定のあとその都度「描画」または「変更を反映」して確定するようにしてください。
■線の太さ
構文=
<ピクセル数>を <IDorタグ>に 線の太さを設定 → ・
プログラム例:
図形の枠線の太さを設定します。
0を指定すると枠線無しになり、円や長方形など閉じた図形では塗りつぶしと併用して使われることがあります。
■線の色
構文=
<色指定>を <IDorタグ>に 線の色を設定 → ・
プログラム例:
図形の線の色を設定します。デフォルトは黒です。
<色指定>については既に、
「ウィジェットの属性指定」−「ウィジェットの文字色と背景色」 にて解説したので参照してください。
■満たす色
構文=
<色指定>を <IDorタグ>に 満たす色を設定 → ・
プログラム例:
円、楕円、長方形など、閉領域を作る図形は描画時、あるいは後から、指定した色で塗ることができます。(後からでも塗れます)
<色指定>については既に、
「ウィジェットの属性指定」−「ウィジェットの文字色と背景色」 にて解説したので参照してください。
■スムージング
構文=
<レベル>を <IDorタグ>に スムージングを設定 → ・
レベル:正数で0あるいは1〜12程度
プログラム例:
折れ線や多角形など複数の直線から成る図形描画では、直線で結ぶのではなく、わざとなめらかな曲線で結ぶことができます。
レベルは1で一番軽い(まだカクカクとした)スムージングで、1より大ききなるにしたがってなめらかになり、最大12程度で最もなめらかとなります。
最大のなめらかさにしたい場合は12を使うよりむしろ、0を指定してください。(サンプルプログラムではすべて0を指定しています)
サンプルプログラム "canvas-basic.exe" を実際に操作してお確かめください。
「図形の描画」−「基本作画」をたどると基本的な作画が行われますが、一番右の列にある”なめらかな折れ線”が本機能を使っています。
さらに、この基本作画の図形のうち最下段の左から2番目に、五角形と内接する卵形がありますが、五角形と卵型はどちらも同じパラメータで五角形(厳密には多角形)を描いており、後者はスムージングの属性を追加しているため違いが出ています。(卵型を作るために特別な描画単語を呼んでいるわけではなく、基本はどちらも五角形です)
■矢印
構文=
<矢印シンボル>を <IDorタグ>に 矢印を設定 → ・
矢印シンボルとして以下のいずれかの語を指定:
始点に矢印
終点に矢印
両端に矢印
プログラム例:
直線または折れ線については両端に矢印を加えることができます。
■変更を反映
構文=
プログラム例:
既に描画してある図形に対して後から属性を設定した場合、本単語を使って実際の描画に反映させてください。(一つ一つの属性設定の段階ではまだ反映されていません)
複数の図形を描画したとき、それぞれの図形ごとにレイヤが割り当てられます。
図形を2つ描画した場合、1番目の図形より2番目の図形が手前になります。
2つの図形が重なっている場合は1番目の一部が2番目の後ろに隠されることになりますが2番目の図形を取り除くと1番目のすべてが自動的に表示されます。
既に描画済みの複数の図形のレイヤをプログラムにより手前や奥に調整することができます。
サンプルプログラム "canvas-basic.exe" の「図形の描画」−「円を5つ表示」を選ぶと5つの円がそれぞれ重なって表示されていることが分かります。このあと、「図形の操作」−「5つ円の2番を3番の上へ」を選ぶと本来であれば2番は3番の後ろに隠れているはずなのに3番より手前に表示されるようになります。
本セクションはこのようなレイヤの操作をプログラムから行う方法を解説します。
■図形の重なりの操作
構文=
<IDorタグ>を 図形の重なりを最上位へ → ・
<IDorタグ>を 図形の重なりを最下位へ → ・
<IDorタグ1>を <IDorタグ2>にたいし 図形の重なりを上へ → ・
<IDorタグ1>を <IDorタグ2>にたいし 図形の重なりを下へ → ・
↑注:「対し」ではなく「たいし」
注:「たいし」という送り仮名はプログラムとしては意味がありませんが
意図を示すために書いています
読んで字のごとくの機能です。
サンプルプログラム "canvas-basic.exe" の「図形の描画」−「円を5つ表示」によって5つの円を表示したあと「図形の操作」−「5つ円の2番を3番の上へ」〜以降のメニュー選ぶことで実際の見え方を確認してください。
■図形にタグを使う理由
図形に対して線の色や幅、塗りつぶしなどの修飾を行うには、個々の図形に対して直接修飾を施す方法もありますが、それとは別に、まずタグを作成しそのタグに対して各種属性を付与し、そのあと図形に対してタグを適用する方法もありますす。
たとえば複数の図形に対して統一した線の色や太さで描画する際、図形ごとにそのような属性を設定するのはプログラムが煩雑になり、あまり合理的ではありません。
一方、まずタグに対して属性設定を行い、そのタグを複数の図形に一気に適用するほうが遠回りに見えて結局はプログラムが簡潔になります。また後になって属性を変更したり、あるいは属性自体を取り除くような場合もプログラミングが容易になります。
もう一つのタグの用途に図形のグループ化があります。属性無しのタグをまず用意しそれを複数の図形に付与しておきます。そのあと、そのタグに対して図形移動などを指示することで、複数図形をまとめて(グループとして)座標移動させたり削除することができます。
■図形タグの生成と属性設定
構文=
<キャンバスID>で 図形タグのIDを取得 → タグID
〜略〜 (各種属性設定)
プログラム例:
円のタグは 図形ID
キャンバスで 図形タグのIDを取得し 円のタグに 入れ
「#c000c0」を 円のタグに 満たす色を設定し
図形タグを生成しそのIDを得ます。
タグIDは後続して各種属性設定をおこなったり、タグを任意の図形に適用するのに使われます。
この段階ではタグは無属性であり、後続して線の太さや色などを設定できますが、タグを無属性のまま使う用途もあります(グループ化目的の場合)。
図形に対して属性を設定できたのとまったく同じに、タグに対しても属性を設定できます。少し前の解説、
図形への属性設定 を参照願います。
■図形にタグを付与
構文=
<タグID>を <図形ID>に 図形にタグを付与 → ・
プログラム例:
円は 図形ID
円のタグは 図形ID
キャンバスで 図形タグのIDを取得し 円のタグに 入れ
「#c000c0」を 円のタグに 満たす色を設定し
円のタグを 円に 図形にタグを付与し
指定するタグを図形に付与して適用します。タグが既に属性を持っている場合はタグの属性が図形にも移ります。
同じタグを複数の図形に付与したあと、タグを対象として座標移動・削除などの操作をおこなうと、複数の図形をまとめて操作することができます。これはグループ化目的のタグと言えます。グループ化目的のときはあえてタグに属性を設定しないこともあります。(無属性タグ)
サンプルプログラム "canvas-basic.exe" の
「図形の描画」−「無属性タグを付け一つ円と二つ円を表示」
によって2つの円を表示したあと、
「図形の操作」−「二つの円の色を変更(タグ変更:黄)」
をおこなってみてください。タグの属性を変えただけで2つの図形がまとめて色変更されました。
- 注
-
描画前の図形へのタグの付与は1個までしか効きません。描画後に付与して最後に「変更を反映」する方法であれば何個でも付与できま。
■図形からタグを取り除き
構文=
<図形ID>から <タグIDを>を 図形からタグを取り除き → ・
プログラム例:
図形から指定したタグを取り除きます。
タグに属性が設定されていた場合、タグ経由で図形に付与されていた属性はタグを取り除いた後も図形に
”残ります”。
サンプルプログラム "canvas-basic.exe" の
「図形の描画」−「無属性タグを付け一つ円と二つ円を表示」
によって2つの円を表示したあと、
「図形の操作」−「二つの円に太線のタグを付与」
をおこない、さらに、
「図形の操作」−「右下の円だけ太線タグを取り除き」
を操作してください。右下円のタグは除去されますが画面上は変化が無いことが分かります。このあとさらに、
「図形の操作」−「太線タグを使い図形削除」
をおこなうと左上の円だけがキャンバスから消え、右下円は削除対象とならなかったことが分かります。
- 注
- タグを指定しての「図形を削除」と、「図形からタグを取り除き」を混同しないように注意してください。後者は図形を削除する機能ではありません。
キャンバスにはイメージを描画(貼り付け)することができます。
記: イメージの描画は例外的に「描画」は不要です。
「図形として・・を描く」という単語名になっているのは
それを表すためです
■図形としてイメージを描く
構文=
<キャンバスID>と <イメージID>と
<中心X> <中心Y>と <基準点指示>で
図形としてイメージを描く → 図形ID
基準点として以下のいずれかのシンボルを記述(文字列定数)
上端
下端
左端
右端
左上隅 ←デフォルト
左下隅
右上隅
右下隅
中央
プログラム例:
猫のイメージは 変数
猫のIDは 図形ID
(ステップ1) ※描画のための準備
"mage\cat.png"を イメージをロードし 猫のイメージに 入れ
(ステップ2) ※描画処理
キャンバスと 猫のイメージと
200, 300と 中央で
図形としてイメージを描き 猫のIDに 入れ
イメージIDは「イメージをロード」によって得ておく必要があります。
基準点についてはこの先
基準点について で詳しく解説しますが、たとえば「左上隅」を基準点にしたときは指定座標がイメージの左上隅と合致するような場所に表示されます。
サンプルプログラム "canvas-basic.exe" の
「図形の描画」−「イメージ作画」
を操作するとキャンバス内にイメージを表示ささせることができます。(このサンプルではビットマップも併せて表示しています)
■図形としてビットマップを描く
構文=
<キャンバスID>と <ビットマップ名>と <背景色>と
<中心X> <中心Y>と <基準点指示>で
図形としてビットマップを描く → 図形ID
プログラム例:
○○とは
ビットマップ1は 図形ID
キャンバスと ビットマップ・questheadと 黄色と
200, 300と 右下隅で
図形としてビットマップを描き
ビットマップ1に 入れ
ビットマップの背景色は描画後でも変更できます。マニュアルの、
「ウィジェットの属性指定」−「ウィジェットの文字色と背景色」 を参照してください。
基準点については次の項目 「基準点について」 で詳しく解説しますが、たとえば「左上隅」を基準点にしたときは指定座標がビットマップの左上隅と合致するような場所に表示されます。
■基準点について
イメージやビットマップを希望する配置するのに使います。
イメージを描画するのに座標を指定しますが、点の位置である座標に比べ、描画されるイメージは広さのある領域であり、最終的な表示位置があいまいです。このあいまいさを解消するための指示となります。
基準点として以下のシンボル単語(文字列定数として定義)を指定します。
−−−−−−−−−−−−−−
上端
下端
左端
右端
左上隅
左下隅
右上隅
右下隅
中央
−−−−−−−−−−−−−−
プログラム例:
キャンバスと 猫のイメージと
200, 300と 左上隅で ←−ここで指定
図形としてイメージを描き 猫のIDに 入れ
上の例では猫のイメージはイメージの左上隅がキャンバス上の 200, 300 になる位置で表示されます。
キャンバスにテキストを描画(貼り付け)することができます。
構文=
<キャンバスID>で
<文字列>を <X> <Y>に
図形としてテキストのIDを取得 → 図形ID
・・属性設定・・
<図形ID>を 描画する
指定したパラメータを積み、貼り付けるテキストの図形IDを取得します。
<文字列>は表示すべきテキストの文字列です。
<X>と<Y>は表示すべき座標です。
描画されるテキストは広さのある領域であり厳密な表示位置があいまいです。このあいまいさを解消するため、「基準点を設定」と組み合わせて使用します(「基準点を設定」は少し前の解説
基準点について を参照してください)。
たとえば「左上隅」を基準点にしたときは、指定座標がテキストの左上隅と合致するような場所に表示されます。
テキストの表示幅ですが、表示されるテキストは「テキストの幅を設定」で設定した長さで折り畳まれます。この幅を広くとってもテキストが引き延ばされることはなく、あくまで「どこで折り畳みするか」の意味での幅とななります。
逆に描画すべきテキストの長さが短い時は、「テキストの幅を設定」で設定した長さより短く終わり、引き延ばされたりしません。
テキストの描画のための属性設定として以下のものが使えます。
構文=
<色指定>を <図形ID変数>に 文字色を設定 → ・
<色指定>を <図形ID変数>に 背景色を設定 → ・
<フォント情報>を <図形ID変数>に フォントを設定 → ・
<ピクセル数>を <図形ID変数>に テキストの幅を設定 → ・
※注1,2
<揃え指定>を <図形ID変数>に テキスト揃えを設定 → ・
※注3
<基準点指示>を <図形ID変数>に 基準点を設定 → ・
※注4
注1:幅の指定はピルセル単位です。詳細は
「ウィジェットの属性指定」−「ウィジェットのサイズの指定」
と同じなので参考にしてください
注2:テキストの高さは設定できません
注3:テキスト揃えのデフォルトは「左揃え」です。詳細は
「ウィジェットの属性指定」−「ウィジェット中の文字の揃え方」
を参照してください
注4:「基準点を設定」は少し前の 基準点について を参照してください
(例1 − 描画前の属性設定)
プログラム例:
キャンバスは ID。
○○とは
テキスト1は 図形ID
〜略〜
キャンバスと 「こんにちは」を
102 102で 図形としてテキストのIDを取得し テキスト1に 入れ
140を テキスト1に テキストの幅を設定し
中央揃えを テキスト1に テキスト揃えを設定し
左上隅を テキスト1に 基準点を設定し
テキスト1を 描画し
テキストを描画後に属性変更をしたい時は通常のウィジェットと同様に「変更を反映」を実行してください。
構文=
<図形ID変数>を 変更を反映 → ・
↑変数の記述必須
プログラム例: (描画後の属性設定)
○○押下処理とは
赤色を テキスト1記憶に 文字の色を設定し
テキスト1記憶を 変更を反映し
サンプルプログラム:
"canvas-basic.exe"を実行し、「図形の描画」−「テキスト作画」で
動作を確認してください。
キャンバスに一般のウィジェット(ラベルやボタンなど)を描画できます。
構文=
<キャンバスID>と <ウィジェットID>を
<X> <Y>に
図形としてウィジェットのIDを取得 → 図形ID
プログラム例:
ラベル1は ID
図形のラベル1は 図形ID
(ステップ1−ラベルウィジェットを作成)
キャンバスで ラベルのIDを取得し ラベル1に 入れ
「ラベル」を ラベル1に テキストを設定し
ラベル1を 有効化し
(ステップ2−ラベルウィジェットを描画)
キャンバスで ラベル1を
130 250で 図形としてウィジェットのIDを取得し
図形のラベルに 入れ
図形のラベルを 描画し
描画したいウィジェットは予めIDを取得し、必要であれば属性も設定し、「有効化」しておきます(配置はしません)。ここまでは一般のウィジェットの準備と同じです。
そのあと、座標を指定し「図形としてウィジェットのIDを取得」おこなうと図形IDが得られ、「描画」すれば描画されます。
図形の削除、移動、拡大/縮小、レイヤの操作など各種操作について解説します。(レイヤの操作は本セクションではなく
レイヤ をお読みください)
■図形を削除
構文=
<図形ID変数>を 図形を削除 → ・
↑変数の記述必須
指定する図形を削除します。明記したID変数の内容は最後に強制クリアされます。
図形IDとして図形タグを指定した場合、そのタグが付与されている複数の図形がまとめて削除され、次いでタグが削除され、最後にタグを表す図形ID変数が強制クリアされます。
記: タグ経由での図形削除の場合、間接的に削除されることになる図形については、そのIDを格納する変数はクリアはされずに残ります
サンプルプログラム "canvas-basic.exe" について、
(例1)
「図形の描画」−「無属性タグを付け一つ円と二つ円を表示」
によって1つ円と2つ円を表示したあと、
「図形の操作」−「円1と円3を削除」
をおこなうと、1番目の円と3番目の円が削除されます。
次に、一つ円と二つ円を再描画した後、
(例2)
「図形の操作」−「円1と円3に太線のタグを付与」
「図形の操作」−「太線タグを使い図形削除」
をおこなうとタグを指定しての図形削除が行われます。
注: タグを指定しての図形を削除と、”図形からタグを取り除き”を混同しないように注意してください。後者は図形を削除する機能ではありません。
■図形を拡大・縮小
構文=
<IDorタグ>を
<基準点X> <基準Y>と
<比率X> <比率Y>で
図形を拡大・縮小 → ・
注:比率は小数で指定します
プログラム例:
(縮小)
円1を 50 100 0.7 0.7で 図形を拡大・縮小
(拡大)
円1を 50 100 1.3 1.3で 図形を拡大・縮小
拡大・縮小における基準点について説明します。
図形を拡大・縮小する際、「どの位置から見て拡大・縮小するのか」の指定が必要になります。
たとえば図形が円なら、円の中心を基準にすることが一つ考えられます。その場合は円を描画した際の中心座標をそのまま基準点にし拡大・縮小すると同心円のように描かれます。
一方、別の場所を基準点に設定することもできます。たとえば円の左端を指定して縮小すれば、円を左端位置で保持したまま右側のほうが左に寄せる形で縮小されることになります。
サンプルプログラム "canvas-extension.exe" の (←canvas-basicでなく)
「図形の描画」−「円を一つ表示」
によって1つ円を表示したあと、
「図形の操作」−「円一つを縮小」
をおこなうと、円を左端に固定したまま縮小するのが確認できます。この場合は基準点を円左端に置いています。
引き続き、
「図形の操作」−「円一つを拡大」
を操作すると、円が拡大されますが、こちらは基準点を円の中心にしているので中央位置は変わらずそのまま拡大されます。
さらに、
「図形の描画」−「円を二つ表示」
によって二つ円を表示したあと、
「図形の操作」−「円二つを拡大」
をおこなうと、二つ円が一緒に拡大するのが確認できます。これはタグを指定する例となります。(基準点は二つの円の真ん中ぐらいを指定しています)
■図形を移動
構文=
<IDorタグ>を
<移動量X> <移動量Y>だけ
図形を移動 → ・
プログラム例:
図形を指定する移動量(ピクセル数)だけ移動します。タグ指定でそのタグが複数の図形に付与されている場合は複数の図形がまとめて移動します。
サンプルプログラム "canvas-extension.exe" の (←canvas-basicでなく)
「図形の描画」−「円を一つ表示」
によって二つ円を表示したあと、
「図形の操作」−「円一つを移動」
をおこなうと、移動の様子が確認できます。
■図形を絶対値で移動
構文=
<IDorタグ>を
<移動先X> <移動先Y>に
図形を絶対値で移動 → ・
プログラム例:
図形を指定する座標(キャンバス左上隅が原点)に移動します。タグ指定で、そのタグが複数の図形に付与されている場合は複数の図形がまとめて移動します。
タグを使った図形グループを移動する場合の移動先ですが、グループ内で最初に描画した図形が代表となります。その代表図形の位置を別の位置に移動させる扱いになります。
サンプルプログラム "canvas-extension.exe" の (←canvas-basicでなく)
「図形の描画」−「円を一つ表示」
によって二つ円を表示したあと、
「図形の操作」−「円一つを絶対値で移動」
をおこなうと、移動の様子が確認できます。
■図形の座標を得る
図形を(相対量で)移動した際、移動後にどの座標となったのかを知りたいことがあり、そのための機能が提供されています。もちろん、元の位置にある図形であっても(描画直後であっても)得ることができます。
構文=
<図形ID>で 図形の座標を得る
→ X、Y、 X、Y、 X、Y、・・・、個数
記:返される座標は整数でGUIエンジン内部仕様です
記:返すことのできる座標数は最大100個(X/Yのペアで1個)まで
上記により図形の現在の座標を得ることができます。
返される座標はその図形の描画に必要な数だけ返されるのでデータ数は不定で変則的な戻値となります。(スタックトップにはデータ数が積まれています)
たとえば、
キャンバスと 18 18 68 68で 直線を描き 直線1に 入れ
によって描画された直線をの座標を得ると以下のようなデータが返されます。
→ 18 18 68 68 4
上のように、スタックトップには 4 が積まれています。データ数です。
他の例としては、
キャンバスと 100,100 50で 円を描き 円1に 入れ
で描画した円は描画直後であれば、
→ 50 50 150 150 4
となります。
■不定個数の座標をモニタ表示する
上記の「図形の座標を得る」で返される座標群はデータ数が不定であることもあって、モニタ表示するのに手間がかかります。デバッグ目的で簡便に表示できるようにするため、以下の処理単語を用意しています。
構文=
X、Y、 X、Y、 X、Y、・・・、<個数>を
座標ペア群を文字列化 → 文字列
記:個数自身は文字列化されません
たとえば、
プログラム例:
キャンバスと 453 43 25で 円を描き 円1に 入れ
円1の 図形の座標を得て 座標ペア群を文字列化
とすると、文字列 「50,50 150,150」 が得られ、動作確認に役立ちます。(注:XとYの間にカンマが入ります。個数自身は文字列化されません)
■Mindでの座標指示とGUIエンジンの座標との違い
たとえば円を描画することを考えます。
Mindレベルでは中心点座標と半径を与えれば描画できます。
しかし,GUIエンジン内部の処理としては、円は楕円として扱われておりさらには、楕円の座標とはその楕円が内接する長方形の対角2点の座標を指定する仕様になっています。
GUIエンジンの仕様のままでは扱いずらいため、MindのGUIライブラリが介入をおこなうことで、円については中心点と半径で指定できるようになっています。
ほかにも、Mindで正方形の描画は左上隅座標と一辺の長さとなっていますが、GUIエンジンの仕様としては正方形であっても長方形扱いであり、長方形の対角2点の座標を指定するようになっています。
このような座標扱いの違いが生じる図形は以下の通りです。
・正方形(GUIエンジンでは長方形扱い)
・円(GUIエンジンでは楕円扱い)
・円弧(GUIエンジンでは楕円弧扱い)
座標扱いの違いについて以下のことを考慮願います。
まず、円については座標変換の過程で0.5ピクセルの誤差が生じることがあります(半径を倍にしたり半分にしたりするため)。通常は問題にならないのですが、円を描画したあと、その座標を得たときに座標または半径が1ピクセルだけずれることがあります。これは仕様としてご承知願います。
もう一つは、「図形の座標を得る」が返して来る座標がGUIエンジン仕様のものである点です。たとえば円を描画したあとで座標を得た場合、
(円の座標例)
Mindでの描画 :100 100 50
図形の座標を得る:50,50 150,150
となります。Mindでは3つのデータですが、「図形の座標を得る」は4つのデータ(個数自身を含めると5つ)を返してきます。(円を収容する長方形の対角2点の座標)
■座標変換をおこなう処理単語
以下の変換用の処理単語が利用できます。以下で「ネイティブ座標」とはGUIエンジンでの座標のことです。
構文=
(ネイティブ座標 → Mind座標)
<始点X> <始点Y> <終点X> <終点Y>を
ネイティブ座標を円座標に変換
→ 中心X、中心Y、半径
<始点X> <始点Y> <終点X> <終点Y>を
ネイティブ座標を正方形座標に変換
→ 始点X、始点Y、一辺の長さ
(Mind座標 → ネイティブ座標)
<中心X> <中心Y> <半径>を
円座標をネイティブ座標に変換
→ 始点X、始点Y、終点X、終点Y
<始点X> <始点Y> <一辺の長さ>を
正方形座標をネイティブ座標に変換
→ 始点X、始点Y、終点X、終点Y
プログラム例:
○○とは
円1は 図形ID
始点Xは 変数
始点Yは 変数
半径は 変数
〜略〜
円1の 図形の座標を得て 4と 異なる
ならば 「図形の座標を得てのデータ数異常」で 重大エラー
つぎに
ネイティブ座標を円座標に変換し
始点Xと 始点Yと 半径に 入れ
キャンバス内のある図形をマウスでクリックしたとして、人なら「この図形」と分かることですが、プログラムでそれを特定するには特別な仕組みが必要になります。このセクションではそのような仕組みを解説します。
記: サンプルプログラム "canvas-event.exe" を使うと本項のすべての機能を動作確認できます。このサンプルを動かしながら以下をお読みください。
マウスイベント
既に
「バインドとイベント名」−「マウスイベントのバインド」 の項でマウスのイベント登録とその処理を解説しましたが本項の機能を理解するのに必要になりますのでそちらと合わせてお読みください。
マウスはキャンバスのみならず他のウィジェットでも使われるものですが、キャンバスで図形を操作するのに有効なのでよく使われます。
マウスイベントの登録とイベントが発生したときの処理については既に
「バインドとイベント名」−「マウスイベントのバインド」 で解説したのでそちらを参照してください。
マウスイベント処理(クリックなどのイベントが発生したときに実行される処理単語)の例を改めて掲載します。
プログラム例: (再度掲載)
マウスイベント処理とは (イベント名、X座標、Y座標、3(パラメータ数) → ・)
イベント名は 文字列
X座標は 変数
Y座標は 変数
(パラメータ数が) 3と 異なる
ならば 「マウスイベント処理においてパラメータ数誤り」で
重大エラー
つぎに
イベント名と X座標と Y座標に 入れ
イベント名が 左クリックに 等しい文字列
ならば ※−−−−−−−※
※ 左クリック ※
※−−−−−−−※
・・左クリック時の処理・・
さもなければ
〜略〜
マウスイベントが発生し、ユーザが書いたイベント処理に飛んできた時、上記のようにスタックからイベント名と座標が与えられます。
まずイベント名を見れば何のイベントなのか(たとえば、左クリック)が分かります。
次に X・Y座標は、キャンバス内の座標なので、「どの図形がクリックされたのか」を判定するのに大きな手がかりになります。
図形の登録
ここで言う図形の登録とは、図形の特定・検索をおこなうのに必要な、事前の図形の登録作業のことを指します。
サンプルプログラム "canvas-event.exe" で
メニューバー −「右クリックでの動作」−「座標近傍の図形群を得る」
を選び、何かの図形を右クリックすると、図形のIDが情報ボックスに表示され図形が認識されたことが分かります。しかしキャンバス右のほうにある「クリック可能な図形」領域にある図形を右クリックしても反応しないはずです。
この理由は、「クリック可能な図形」域にある図形群は図形登録していないため、図形の検出対象とならないからです。
このように、図形検出の機構を使うには、あらかじめ検出対象としたい図形を登録しておく必要があります。
■図形の登録を開始
構文=
一連の図形の登録の前に実行し、以前の登録情報をリセットします。
■検索対象の図形を登録
構文=
<図形ID>を 検索対象の図形を登録 → ・
指定する図形は描画済みである必要があります
プログラム例:
円を一つ表示とは (・ → ・)
円1は 図形ID
キャンバスと 100 100 50で 円のIDを取得し 円1に 入れ
円1を 描画し
円1を 検索対象の図形を登録し
指定する図形のIDを検索対象として1つ登録します。これを繰り返すことで多くの図形を登録できます。
なお、図形を削除した場合は検索対象から自動的に抹消されます。(タグ指定での間接的な削除であっても)
■登録図形を抹消
構文=
登録しておいた図形を1つ抹消します。
なお、図形を削除した場合は検索対象から自動的に抹消されるので明に抹消する必要はありません。
検出データ
「検出データ型」と呼ぶ型紙(構造体の型)があります。これはGUIライブラリ内部に既に定義されているもので、複数の図形データを返すような処理単語で使われます。
■検出データ型という型紙について
たとえば、「このタグを持つ図形群を得る」という処理単語があります。タグを指定すると、そのタグを持っている図形群を調べ、検出情報をユーザが指定した構造体に格納して戻って来ます。
型紙「検出データ型」はGUIライブラリ内に定義されています。
構文=
(この型紙はライブラリ内に定義済みです)
検出データ型は 型紙
検出図形数は 変数
・・・・・・・・
・・・・・・・・
全体は
検出図形数と
・・・・・・・・
・・・・・・・・
「検出データ型」が型紙名です。ユーザはこの型紙名を引用することで検出データ構造体の実体を定義してから使います。
■検出データ構造体の宣言
<構造体名>は 構造体 検出データ型
上記のように構造体を確保します。
図形の検出からその後処理まですべて1つの処理単語の中で行えるのなら、構造体を局所変数として定義することもできます。
■検出した図形の数を得るには
検出データ構造体の要素「検出図形数」には検出された図形の数が格納されています。検出図形数を得るプログラムは次のにようになります。
<検出データ構造体>の 検出図形数が ・・・
上記のように親構造体と要素名を1組で記述します。
■検出した図形のIDを得るには
構文=
<検出データ構造体>の <位置>での 指定位置の検出図形を得る → 図形ID
上記によって、検出した図形群のうち一つの図形IDを得ることができます。
位置は1から始まる整数ですが、特別に負数を指定することもできます。その場合、末尾から数えた位置という扱いとなります。たとえば位置として -1 を指定すると複数図形のうち末尾のものを参照できます。
プログラム例:
○○とは
タグ1は 図形ID
検出データは 構造体 検出データ型
(図形の検索)
タグ1と
1番と (=識別番号) 検出データで
このタグを持つ図形群を得て
(検出図形の処理)
検出データの 検出図形数を
回数指定し
検出データの 回数での 指定位置の検出図形を得て
・・何らかの処理し・・
繰り返し
■複数の検出図形のうち1つだけ得るには
複数の図形が重なっている個所を座標指定した場合は複数の図形が検出されます。このうち1つだけの図形を扱いたい場合に推奨するのが”最も手前にある”図形を使うことです。たとえば座標位置にある図形を削除する場合など、最も手前の1つを対象とするのは納得できるからです。
次のようにしてください。
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
検出データは 構造体 検出データ型
検出データの −1の 指定位置の検出図形を得て ・・・
\_____________________/
上記プログラムは検出された図形群の最後の要素をアクセスしています。
図形群の検出は描画された順序となるため、末尾要素が最も手前の図形となります (レイヤを操作していなければという前提であり、レイヤを操作している場合は末尾図形が最も手前とはならないこともあります)。
図形検出をおこなう処理単語
■このタグを持つ図形群を得る
構文=
<タグID>と
<識別番号>と <検出データ構造体>で
このタグを持つ図形群を得る → ・
注1:識別番号は1から始まる整数(1〜4を指定)
注2:あらかじめ検出対象としたい図形を登録しておく
必要があります。図形の登録 を参照ください。
指定したタグが付与されている図形を探します。
識別番号は1から4までの整数を指定してください。通常は1を指定すれば良いですが、図形検出にともなう処理が続いている間にさらに別の図形検出をおこなう場合 (2種類の図形検出が重複する場合) は、後者は2など別の識別番号を使います。
プログラム例:
○○とは
タグ1は 図形ID
検出データは 構造体 検出データ型
(図形の検索)
タグ1と
1番と (=識別番号) 検出データで
このタグを持つ図形群を得て
(検出図形の処理)
検出データの 検出図形数を
回数指定し
検出データの 回数での 指定位置の検出図形を得て
・・何らかの処理し・・
繰り返し
上記例のように、検出データ構造体は局所変数として獲得すれば良いでしょう。(そうすることで他の処理単語が同じ名前の「検出データ」を使うことができます)
サンプルプログラム "canvas-event.exe" にて、
メニュー「図形の操作」−「二つ円のタグを持つ図形を得る」
を押してみてください。図形IDが2つダンプされます。2つの赤い円には共に「二つ円」というタグが付与されているので、その2つの図形が検出されます。
■図形に含まれるタグ群を得る
構文=
<図形ID>と <検出データ構造体>で
図形に含まれるタグ群を得る → ・
注:あらかじめ検出対象としたい図形を登録しておく
必要があります。図形の登録 を参照ください。
先に書いた処理単語とは逆のことをする機能です。
指定した図形に付与されているタグ群を調べます(1つの図形に複数のタグが付与されていることもあります)。
プログラム例:
○○とは
タグ1は 図形ID
検出データは 構造体 検出データ型
(図形の検索)
タグ1と
1番と (=識別番号) 検出データで
図形に含まれるタグ群を得て
(検出タグの処理)
検出データの 検出図形数を
回数指定し
検出データの 回数での 指定位置の検出図形を得て
・・何らかの処理し・・
繰り返し
サンプルプログラム "canvas-event.exe" で、「左クリックの動作」において図形選択を有効にし、そのあと左の赤い円を左クリックして選択状態とし、最後に「図形の操作」−「円2が含むタグを得る」を押してみてください。
円2(左の赤円)には現在、「二つ円」というタグと「選択タグ」の2種類のタグがが付与されているため、それら2つのタグの図形がダンプされます。
■タグを持つ図形群にこの図形が含まれる?
構文=
<タグID>にたいし <図形ID>が
タグを持つ図形群にこの図形が含まれる? → 真偽
注:図形の登録は不要です
プログラム例:
○○とは
タグ1は 図形ID
図形1は 図形ID
タグ1にたいして
図形1が
タグを持つ図形群にこの図形が含まれる?
ならば ・・・・
つぎに
図形タグを指定し、そのタグを持つ図形群の中に指定した図形が含まれるかどうかを調べます。
この機能は図形登録と無関係に処理されます。
■座標近傍の図形群を得る
構文=
<キャンバスID>と
<X座標>と <Y座標>と
<許容値>と
<識別番号>と <検出データ構造体>で
座標近傍の図形群を得る → ・
注:許容値としてシンボル「標準許容値」が使えます
(このシンボルの値は3です)
注:あらかじめ検出対象としたい図形を登録しておく
必要があります。図形の登録 を参照ください。
プログラム例:
キャンバスは ID。
○○とは
検出データは 構造体 検出データ型
キャンバスと
Xと Yと
標準許容値と
1番と 検出データで
座標近傍の図形群を得て
指定した座標近傍に存在する図形群を調べます。見つからないこともあれば複数の図形が検出されることもあります。
座標としては、マウスがクリックされたときの座標を使うのが簡便です。
(マウスイベントでは必ず座標が伝達されます)
指定座標ぴったりでなく、その近傍も含めた図形を検出できます。この機能を使うことで線画など判定か厳しい図形も指し示し易くなります。<許容値>はその”座標近傍”の度合いを示す値です。
- 注
-
線画(直線や塗りつぶさない円など)は許容値が小さいと本当に線の上をクリックしないとヒットしません。塗りつぶしのある図形は図形内のどこをクリックしてもヒットします
許容値は整数で単位はピクセル数です。指定座標を中心とし、許容値を一辺の長さとする正方形域に図形が含まれていれば検出されます(円領域ではありません)。
許容値が大きくなれば検出が緩やかになり、離れた図形も検出されます。
許容値として整数を記述する代わりに「標準許容値」というシンボルを使うこともできます。これはデフォルト値で数値 3 です。たとえば8を指定すれば標準より広い範囲でヒットします。
サンプルプログラム "canvas-event.exe" においてメニューバー「右クリックでの動作」−「マウス近傍の図形群を得る」を選び、キャンバス上の任意の場所で右クリックすると本単語が呼ばれるので動作を確認できます。(重なった図形がある個所では2つの図形がダンプされます)
■座標近傍の図形を一つ得る
構文=
<キャンバスID>と
<X座標>と <Y座標>と <許容値>で
座標近傍の図形を一つ得る → 図形ID
注:許容値としてシンボル「標準許容値」が使えます
(このシンボルの値は3です)
注:図形の登録は不要です
プログラム例:
キャンバスは ID。
○○とは
発見図形は 図形ID
キャンバスと
Xと Yと
標準許容値で
座標近傍の図形を一つ得て 発見図形に 入れ
発見図形が ゼロ以外
ならば ※ 発見した ※
・・何らかの処理し・・
つぎに
1つ前に解説した「座標近傍の図形群を得る」とよく似た機能ですが、こちらのほうは図形を1つだけ検出します。
1つの図形IDを返せば良いため、検出データという構造体は使用せず、単に図形IDをスタックに積んで戻って来ます。
ヒットしなかった場合、ID=0 となるのでそれで判定してください。
返される図形のIDは下位処理となる「座標近傍の図形群を得る」が返す図形群のうち最後に描画された図形(=最も手前の図形)です。ただし、レイヤを操作していなければ最も手前ということでであり、レイヤを操作している場合は末尾図形が最も手前とはならないこともあります。
マウスをクリックして図形を選択する場面は、多くのアプリケーションに見られるものです。本ライブラリでも図形選択の機能を提供しますが、ライブラリとして統一した仕様として提供するには、たとえば次のような難しさがあります。
・図形を選択したときのユーザへのフィードバックがさまざま考えられる
→本ライブラリでは選択された図形の枠線を太くしますがアプリケーションによってはそれ以外の方法をとりたいかも知れません
図形選択は本来、ライブラリ機能と言うよりは、アプリケーション寄りの機能であると言えます。実際、本ライブラリが使っているGUIエンジンに図形選択の機構は無く、ライブラリ内で構築したものです。
本ライブラリは最低限の図形選択の機能を提供するものであり、「このような機能でよかったらお使いください」というものであることをご承知願います。もちろんユーザが別途プログラムを組むことによって独自の図形選択を構築することは可能です。
図形選択の実際の動きは、サンプルプログラム "canvas-event.exe" において
メニューバー「左クリックでの動作」−「左クリックで図形を選択できるように」
のチェックをオンにしてから図形をクリックすることて試してみてください。
■図形選択を利用する前提
- 選択対象となる図形については、あらかじめ 図形の登録 で解説する図形の登録を済ませておく必要があります。
- 選択のトリガは、サンプル "canvas-event.exe" においてはマウス左クリックで行いますが、他の事象をトリガとしても構いません 。
- ただ1つの図形選択、複数選択いずれも対応できますがサンプルプログラムでは複数選択の方法によっています。アプリケーションによっては、たとえば最初の選択は「左クリック」で、後続する選択追加は「Ctrl-左クリック」でおこなうようにしたいかも知れませんがそれはアプリケーション側のことなので可能です。
- 「図形が選択状態にある」は、内部的には「選択タグ」と呼ぶタグがその図形に付与されることで実現しています。したがって、たとえば選択されている図形をすべて削除するには、その「選択タグ」を指示して図形の削除を行うことで実現できます
■選択タグ
ライブラリ内部に定義した専用のタグ(変数名は「選択タグ」)があり、このタグが図形に付与されることをもって「選択状態にある」としています。
選択タグは配列状になっています。次のように定義された配列です。
(ライブラリ内定義)
選択タグは 選択タグレコード数の 図形ID。
選択動作が始まるとライブラリは選択タグを自動生成し、上記配列に記憶する仕組みになっています。配列状にしている理由は、複数キャンバスにおいて同時利用ができるようにするためで、キャンバス毎に独立して管理されます。
選択タグへのデータ書き込みはライブラリが自動的に行いますが、グローバルなシンボルなのでユーザがアクセスすることもできます。
「キャンバスをクリア」を実行したとき、またはキャンバスに対し「ウィジェットを削除」したときは該当する選択タグが自動的にクリアされます。
しかしそれ以外で選択タグか無用になった場合、たとえば選択された図形群をすべて削除した時・・などはユーザが明に選択タグの変数をクリアしてください。(サンプルプログラム "canvas-event.exe" はそのようにしています)
■選択を開始
構文=
プログラム例:
キャンバスは ID。
○○とは
〜略〜
キャンバスを 選択を開始する
〜略〜
一連の選択操作に先立って、「選択を開始」を実行してください。GUIライブラリ内部の選択情報がリセットされます。
■選択管理番号を得る
構文=
<キャンバスID>で 選択管理番号を得る → 管理番号
プログラム例:
キャンバスは ID。
○○とは
管理番号は 変数
キャンバスで 選択管理番号を得て 管理番号に 入れ
(タグが有効か検査)
選択タグ(管理番号)が ゼロ?
ならば 終り
つぎに
(タグを使う)
選択タグ(管理番号)を ・・・・し
選択タグは配列状になっているため、ユーザがアクセスするには配列添字が必要になり、この処理単語を使って添字を得てから、
選択タグ(管理番号)
のように使います。
■この図形の選択状態を反転
構文=
<キャンバスID>と <図形ID>で
この図形の選択状態を反転 → 新しい選択状態
”新しい選択状態”は真偽値(整数)です
指定した図形の選択状態を反転(offならonに、onならoffに)します。
off→on の場合、図形に選択タグを付与し、さらに図形の枠線を太くすることでアプリの利用者に視覚的なフィードバックを行います。
on→off の場合はその逆で、選択タグを図形から取り除き、太くした枠線を元に戻します。
この処理単語は戻るときに新しい選択状態を返してきます。
枠線を太くするときの内部処理ですが、元々太い線の場合はもっと太くする必要があるため、以下の通り動的な計算によっています。
※−−−−−−−−−−−−−−−−
※ 旧太さ 新太さ
※−−−−−−−−−−−−−−−−
※ 8まで 4を加算
※ 20まで (旧×0.3 + 4)を加算
※ 20超 (旧×0.2 + 4)を加算
※−−−−−−−−−−−−−−−−
■この図形は選択中?
構文=
指定した図形が現在選択中であるかを調べます。(選択タグが付与されていれば選択中と判断します)
■すべての図形の選択状態を解除
構文=
<キャンバスID>を すべての図形の選択状態を解除 → ・
文字通りの機能です。
「この図形の選択状態を反転」を別の図形に対して適用することで複数の図形を選択することができますが、そうではなく、ただ1つだけの図形のみが選択できる・・つまり別の図形を選択したなら前の選択を解除し、結果的に1つだけの図形が選択される・・ようにするために本機能が使えます。
その目的で使うには、
1. すべての図形の選択状態を解除
2. この図形の選択状態を反転
の順でおこなってください。
■選択された図形群を操作するには
アプリ利用者による図形選択が終り、それらについて何かアクションを起こすときのプログラム例をお見せします。
プログラム例: (選択された図形を削除する例)
キャンバスは ID。
○○とは
管理番号は 変数
キャンバスで 選択管理番号を得て 管理番号に 入れ
(タグが有効か検査)
選択タグ(管理番号)が ゼロ?
ならば 終り
つぎに
(タグを使い図形操作)
選択タグ(管理番号)を 図形を削除し
選択タグ(管理番号)を クリアし
上記はタグを指定しての図形削除をおこなっています。(選択タグが付与された図形すべてが削除されます)
処理の最後に選択タグのクリアをおこなっている点に注目してください。図形を削除してしまったので選択状態は意味がなくたったため念のためクリアをかけています。
プログラム例: (選択された図形を相対移動する例)
キャンバスは ID。
○○とは 管理番号は 変数
キャンバスで 選択管理番号を得て 管理番号に 入れ
(タグが有効か検査)
選択タグ(管理番号)が ゼロ?
ならば 終り
つぎに
(タグを使い図形操作)
選択タグ(管理番号)と
移動量Xと 移動量Yで
図形を移動し
上記はタグを指定しての図形移動をおこなっています。(選択タグが付与された図形すべてが同時に移動します)
図形は移動したものの、選択状態はまだ維持されているため、選択タグはクリアしていません。
■選択図形をダンプ
構文=
デバッグ機能です。
現在選択されている図形群のIDをコンソールにダンプします。
あらかじめ「コンソールを開き」を実行しておく必要があります。
図形が存在するか調べる
■図形存在?
構文=
指定した図形が現在存在しているか(描画されているか)を調べます。
図形タグには適用できません。
以前の
「メニューバー」−「バインドの概念」 の解説が本項の機能を理解するのに必要になりますので合わせてお読みください。
キーイベントやマウスイベントに対するバインドと同様に、図形をイベントの発生元として(マウス左クリック)バインドを行うことができます。つまり、
すべての図形はボタンとして動作させることができます。
■図形イベントのバインドを登録
構文=
(ステップ1:登録時)
↓イベント処理語の実行情報
<イベント名>と <実行情報>と <引数>を
<図形ID>に 図形イベントのバインドを登録 → ・
(ステップ2:イベント発生時に渡されるパラメータ)
↓登録時の引数が空列のとき
スタック→ イベント名、X座標列、Y座標列、3(引数個数)
↓登録時の引数が1つのとき
スタック→ イベント名、X座標列、Y座標列、ユーザ引数、4(引数個数)
↓登録時の引数が2つのとき
スタック→ イベント名、X座標列、Y座標列、ユーザ引数1、ユーザ引数2、5(引数個数)
注:X座標、Y座標は、整数値ではなく整数を表す文字列です
プログラムによって整数値に変換してから使ってください。
プログラム例:
正方形クリックのイベント処理とは (引数,引数、・・、引数個数 → ・)
・・すること。
正方形にバインドを登録とは (・ → ・)
正方形1は 図形ID
〜略〜
左クリックと ←イベント名
正方形クリックのイベント処理の 実行情報と ←実行情報
「abc "def"」と ←イベント引数
正方形1で ←図形ID
図形イベントのバインドを登録する。
イベントと図形とのバインドを登録します。
イベント名のほか、イベント発生時に呼び出すべき処理単語の実行情報および、引数を指定します。
(バインドの登録時)
もし引数を与える必要が無ければ、
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
正方形クリックのイベント処理の 実行情報と
空列と ←★
正方形1で
図形イベントのバインドを登録する
\_________________/
のように書いて空列を渡してください。
引数を与える場合は文字列定数として、
「abc」を ・・
のように指定します。複数の引数は
「abc def」を ・・
のように空白で区切って並べてください。引数に空白文字を含む場合には
「"ab c" def」を ・・
のように指定してください。
なお、引数(群)文字列末尾に \ 記号は付けられません。また、{ } 記号は使えるものの、開きと閉じでバランスが取れている必要があります。(アンバランスで使うとエラーを検出します)
(クリック時の反応)
図形がクリックされるための条件ですが、線分や円弧など、線だけから成る図形は要注意です。本当に線の真上をクリックしないと反応しないので操作性が悪くなります。
対策として以下の方法も検討してください。
(1) 円や長方形など、閉じている図形の場合、あえて
キャンバスの背景色で塗りつぶす
→見た目の変化はありませんが図形内部をクリックすることでも反応できます
(2) 図形をバインドせず、「座標近傍の図形を一つ得る」を使う
→線の真上でなくても反応できるようになります
クリックした個所に複数の座標が存在する場合、最も手前にある図形が反応します。
(イベント処理語の起動)
バインド登録時の引数が2つの場合、イベント処理語が起動された段階で以下ようなスタック並びとなります。
登録時の引数が2つのとき
→ イベント名、X座標列、Y座標列、ユーザ引数1、ユーザ引数2、5(引数個数)
ユーザ引数は2個なのですが、イベント引数全体としては5個積まれて来ることに注意が必要です。奥から4番目のイベント引数がユーザ引数1となります。また、X座標とY座標については整数ではなく、整数を表す文字列であることも注意します(イベント引数はすべて文字列です)。
イベント処理語の定義例を示します(ユーザ引数が2個の場合)。
プログラム例:
正方形クリックのイベント処理とは
(イベント名、X座標列、Y座標列、ユーザ引数1、ユーザ引数2、 5 → ・)
イベント名は 文字列
X座標列は 文字列
Y座標列は 文字列
引数1は 文字列
引数2は 文字列
X座標は 変数
Y座標は 変数
(パラメータ数が) 5に 等しい
でなければ
「正方形クリックのイベント処理でのパラメータ数異常」で
重大エラー
つぎに
イベント名と X座標列と Y座標列と 引数1と 引数2に 入れ
X座標列を 数値変換し 捨て X座標に 入れ
Y座標列を 数値変換し 捨て Y座標に 入れ
・・・・・・・・
。
■図形イベントのバインドを抹消
バインドを後から抹消することもできます。使い方は登録時と似ています。
構文=
<イベント名> <図形ID>で 図形イベントのバインドを抹消 → ・
プログラム例:
正方形のバインドを抹消とは (・ → ・)
左クリックと 正方形1で 図形イベントのバインドを抹消する
■図形としてボタンを描画している場合
既に
ウィジェットの描画 で解説したように、キャンバス内に一般のウィジェットを描画することができます。もちろんボタンも描画できるのですが、そのボタンを押したときのイベントについて補足します。
キャンバス内のボタンウィジェットについては、一般のウィジェットとしてのボタンと同じやりかたでイベントを登録してください。つまり、「図形イベントのバインドを登録」を使うのではなく、普通のボタンウィジェットのようにイベント登録を行います。
(サンプルプログラム "canvas-event.exe" にもキャンバス内ボタンがありますが、そのようにしています)
プログラム例: (canvas-event.src から抜粋)
○○とは
キャンバスで ボタンのIDを取得し ボタン1に 入れ
「ボタン」を ボタン1に テキストを設定し
ボタン押下処理の 実行情報を ボタン1に イベント処理を登録し ←★
ボタン1を 有効化し
キャンバスで ボタン1を 150 380で 図形としてウィジェットのIDを取得し
ボタンの図形に 入れ
ボタンの図形を 描画し
ポップアップメニューについては既に、「テキストウィジェット」−「ポップアップメニュー」 にて解説していますが、まったく同じ手順によりキャンバス内でも使うことができます。
重複しますが要点のみ解説します。詳細は
「テキストウィジェット」−「ポップアップメニュー」 を参照してください。
■ポップアップメニューを準備
構文=
<キャンバスID>で ポップアップメニューを準備 → メニューID
■メニュー項目としてボタンを追加
構文=
(ステップ1:ボタンの登録)
<メニューID>と <テキスト>と
<実行情報>と <引数>で
メニュー項目としてボタンを追加 → ・
(ステップ2:イベント発生時に渡されるパラメータ)
↓登録時の引数が空列のときはゼロのみ渡される
スタック→ 0(引数個数)
↓登録時の引数が非空列のとき
スタック→ 引数1,引数2,・・、 n(引数個数)
↑
引数が1個ならn=1
例として、サンプルプログラム "canvas-event.exe/.src" がポップアップメニューを使っているので参考にしてください。
■ポップアップメニューのイベント処理でのマウス位置の参照
マウスクリックのイベント処理においては、処理単語が呼ばれたときスタックにマウス座標が積まれていますが、ポップアップメニューのイベント処理ではマウス座標は渡されません。
もしマウス座標が必要であれば次の処理単語を使って参照してください。
構文=
ポップアップ時のマウス位置を得る → X座標、Y座標
注:座標はキャンバス左上隅を0,0とするものです
■ポップアップメニューとマウス右クリックイベントとの競合
ポップアップメニューの登録とマウス右クリックのイベント登録は競合関係にあります。
もしマウス右クリックを「マウスイベントのバインドを登録」によってバインドした場合、ポップアップメニューを出そうとしてマウスを右クリックすると、
1. マウス右クリックのイベントが発生
2. ポップアップが表示される
の順で両方の事象が発生し、対応が面倒になります。
したがってポップアップメニューを使うのであれば、マウス右クリックはバインドしないでください。
例外的に、サンプルプログラム "canvas-event.exe" においては、ポップアップメニュー登録をする/しないを選択できのようなプログラム構造であるため上記のような競合が発生しています。対処として、ポップアップメニューを出している状態では、マウス右クリックのイベント処理は何もせずリターンするようにしています。
■キャンバス全体をイメージとして得る
既に本章の
イメージの描画 にて、キャンバス中にイメージを埋め込む方法を解説しましたが、それとは逆に、キャンバス全体を1つのイメージとして出力できます。
一つに、一般的なウィジェットをイメージ出力する方法があります。つまり、キャンバスもまたウィジェットの一つなので、その方法でキャンバスをイメージ出力する方法です。マニュアルでは以下の個所を使うことになります。
「イメージ」
−「イメージの出力」
−「イメージをファイルに出力」
以下、重複しますがあたらめて解説します。
構文=
(ステップ1)
<キャンバスID>を ウィジェットのイメージを取得
→ イメージID
(ステップ2)
<イメージID>を
<フォーマット>と <ファイル名>で
イメージをファイルに出力 → ・
フォーマットとして以下のいずれかの文字列を与える
"gif"
"jpeg"
"png"
"bmp"
上記でステップ1はキャンバスのイメージを取得して内部メモリに保存する手続きです。
ステップ2はメモリに保存したイメージデータをファイルとして出力する手続きとなります。
以下はプログラム例です。
プログラム例:
○○とは
キャンバスイメージは ID
キャンバスの ウィジェットのイメージを取得し
キャンバスイメージに 入れ
キャンバスイメージを
"png"と "c:\temp\canvas.png"で イメージをファイルに出力
サンプルプログラム "canvas-extension.exe" を使い、キャンバスのイメージファイルへの出力を試してみてください。メニューバーの、
図形の描画
− 円を一つ表示
− 円を二つ表示
した後、同じくメニューバーの、
その他の操作
− キャンバスをイメージファイルに出力
をおこなってください。ダイアログで出力ファイル名を尋ねて来るので、出力先ファイル名を入力してください。(例:c:\temp\canvas.png)
■キャンバスを印刷データ(psファイル)として出力
もう一つ、キャンバス自身が持つ機能として、印刷データとして出力する方法があります。
一般的に印刷用紙の解像度はディスプレイの解像度より高いことが多く、イメージデータを印刷すると粗く見えてしまうことがありますが、最初から印刷用の出力をおこなうときれいに印刷できることが多いです。
注意すべきこととして、本GUIライブラリがプリンタを直接駆動する機能は無いことにご留意ください。印刷する手段としてデータファイルを出力できるというところまでです。正確には、.ps という拡張子を持ったファイルです。
拡張子が.psというファイルは「ポストスクリプト(PostScript)」と呼ばれる印刷データの形式です。以下では簡単に「psファイル」と呼ぶことにします。
- 注
-
PostScriptは単なるデータではなくスクリプトです。
ps対応プリンタはこれをプログラムとして解読・実行することで印刷をおこないます。
MindはFORTHと呼ぶプログラム言語が動作原理になっていますが上位概念としてはスタック指向言語です。
偶然にもPostScriptはスタック指向のプログラム言語です。
構文=
<キャンバスID>と
<出力ファイル名>と <カラー指定>で
キャンバスを印刷ファイルに出力 → ・
注:出力ファイル名の拡張子は .ps f必須です
注:カラー指定は次のいずれかのシンボルを指定します
カラー出力
グレー出力
グレイ出力
モノクロ出力
プログラム例:
キャンバスを
"c:\temp\canvas.ps"と カラー出力で
キャンバスを印刷ファイルに出力する
上記手続きによりキャンバスをpsファイルとして生成できます。
サンプルプログラム "canvas-basic.exe" を使い、キャンバスのファイルへの出力を試してみてください。メニューバーの、
図形の描画 − 基本作画
した後、同じくメニューバーの、
その他の操作 − キャンバスを印刷ファイルに出力
をおこなってください。ダイアログで出力ファイル名を尋ねて来るので、出力先ファイル名を入力してください。そこで c:\temp\canvas.ps を入力したと仮定すると、次のようなファイルが生成されます。
c:\temp\canvas.ps
■印刷データ(psファイル)をPDFに変換
一般的なプリンタではpsファイルを受け付けないことが多いため、便宜のためさらにPDFに変換する機能があり、その利用方法を解説します。
- 注
-
この機能はサードパーティが提供する別のソフトウェア "Ghostscript" を利用します。本GUIライブラリはそれを利用する手段を提供するものの確実な動作を保証するものではありませんので業務用にお使いの場合にはその点をご留意願います。
- 注
-
PDFへの変換時にGhostscriptが起動する際にわずかな間、Ghostscriptのウィンドウが開くことがありますがそのような仕様としてご了承ください。
- 注
-
** Windows 10 以上の環境でのみ利用できます **
GhostscriptのPCへの設置は既に終わっているとしその先の手順を解説します。
構文=
↓出力ファイル名は空列でも可
<psファイル名>を <PDFファイル名>に 印刷ファイルをPDFに変換 → ・
注:psファイル名の拡張子は .ps 必須です
注:PDFファイル名の拡張子は .pdf 必須です
注:PDFファイル名として空列を指定すると
psファイル名の拡張子をpdfに置換した
ファイル名として自動計算します
プログラム例:
"c:\temp\canvas.ps"を
"c:\temp\canvas.pdf"に
印刷ファイルをPDFに変換する
サンプルプログラム "canvas-extension.exe" を使い、キャンバスのファイルへの出力を試してみてください。メニューバーの、
図形の描画 − 基本作画
した後、同じくメニューバーの、
その他の操作 − 印刷ファイルをPDFに変換
をおこなってください。ダイアログで印刷ファイル名を尋ねて来るので先の実験で出力したpsファイル名を入力してください。たとえば c:\temp\canvas.ps を入力したと仮定すると次のファイルが生成されます。
c:\temp\canvas.pdf
■キャンバスをPDFファイルとして出力
これは先に解説した処理単語「キャンバスを印刷ファイルに出力」と、処理単語「印刷ファイルをPDFに変換」のコンビネーションです。
構文=
<キャンバスID>と
<出力ファイル名>と <カラー指定>で
キャンバスをPDFに出力 → ・
出力ファイル名の拡張子は .pdf 必須です
カラー指定は次のいずれかのシンボルを指定します
カラー出力
グレー出力
グレイ出力
モノクロ出力
プログラム例:
キャンバスを
"c:\temp\canvas.pdf"と カラー出力で
キャンバスをPDFに出力する
上記手続きによりキャンバスをPDFファイルとして生成できます。
プログラム例は "canvas-extension.src" をお読みください。
記: 指定したpdfと同じ主ファイル名で拡張子.psを持つファイルが臨時に生成されることをご承知ください。
bin\ ディレクトリに以下のファイルが入っています。
calcmove.exe
calcmove.mco
コンソールアプリなのでコマンド プロンプト内から起動します。
描画した図形の位置を少しずらしたい場合、ソースコード内の座標値を訂正する必要があるのですが、その際の計算を容易にするものです。
単純起動するとUsageを表示してきます。
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
>calcmove
Usgae: calcmove MODX MODY num1 num2 num3 ..
MODX, MODY 移動量を+/-を頭に付け指定します
XまたはYの片方が移動無しの場合
は +0 を指定してください
符号が無い場合は絶対値として解釈
します。たとえば、直線の端点を新
しい絶対値として指定し、別の端点
の予想座標を計算させるのに使えます)
num1 num2 num3 .. 複数の座標を並て書きます
(奇数でも構いません)
\___________________________/
たとえば、
キャンバスと 218 18 368 68で 長方形を描き
というようなソース記述によって描画される長方形に対し30ピクセルだけ右に寄せたい・・というとき以下のように使います。
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
<-移動量-> <---元の座標--->
>calcmove +30 +0 218 18 368 68
248 18 398 68 ←この新しい座標をソースコードにコピー・ペーストして使う
\___________________________/
座標値を手計算するのは大変ですが本プログラムを使うことで作業が軽減されます。上記例では相対値を指示していますが、絶対値で指定することもでき、その場合は先頭の座標に対しての指示とされ、他の点の座標も連動して計算されます。
- 注
-
サードパーティが提供するソフトウェア "Ghostscript" をMindから利用することについて、本GUIライブラリはその確実な動作を保証するものではありません。業務用にお使いの場合にはその点をご留意願います。
(** Windows 10 以上の環境でのみ利用できます **)
Ghostscriptは以下のURLからダウンロードできます。
Ghostscript : Downloads
https://www.ghostscript.com/releases/gsdnld.html
上記のWebページから、
↓ダウンロード時期によりここの番号が変わることがあります
Ghostscript 10.04.0 for Windows (64 bit)
→ Ghostscript AGPL Release
というリンクをクリックしてダウンロードしてください。
次にダウンロード先の、
gs10040w64.exe ←ダウンロード時期により番号が変わることがあります
をダブルクリックしてインストーラを起動します。
重要: 重要:
インストール先を尋ねられますが、デフォルトの場所ではなく、
ディレクトリを明示してください。(デフォルトのディレクトリは空白を含んでしまうため)
たとえば弊社では、
C:\myprog
というフォルダを指定しました。この場合、
C:\myprog\gs\gs10.04.0
←ダウンロード時期により番号が変わることがあります(以下同様なので略します)
のようなディレクトリ内にインストールされます。
イントールが終るとWindows OS にPATHが追加されており、
C:\myprog\gs\gs10.04.0\bin
にPATHが通っているはずです。
・・ ここからコマンド プロンプトでの作業 ・・
Ghostscriptのプログラムを引数無しで起動してみます。カレントディレクトリは安全のため c:\temp のようなところにしてきおきます。
コマンド プロンプトを開き、次のように gswin64c.exe を単純起動してみます。
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
>cd c:\temp
>gswin64c
・・・
・・・ ←コピーライトなどが表示されれば起動しています
・・・
GS> ←Ctrl-C打鍵で終了してください
\_________________/
次に、カレントディレクトリ上(たとえば c:\temp)に、先のマニュアル個所、
<既解説>
・・サンプルプログラム "canvas-basic.exe" を使い、キャンバスのファイルへの出力を試してみてください。・・
でおこなったサンプルプログラム実行で得たpsファイルの複製(たとえば canvas.ps)を置き、次のようにコマンドを実行してください。
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
↓ブラウザ上は改行されていますが1行でこの通りに入力してください
>gswin64c -q -dNOPAUSE -dBATCH -o canvas.pdf -sDEVICE=pdfwrite
-sPAPERSIZE=a4 -dFIXEDMEDIA -f canvas.ps
\_________________/
上記は、 canvas.ps を入力ファイルとし、canvas.pdf を出力ファイルとしてPDF変換を指示するものです。
何も表示されずにプロンプトに戻ってくれば正しく動作しています。次のファイルが生成されているはずです。Acrobatなどのアプリケーションで開いてみてください。
c:\temp\
canvas.pdf ←生成されたファイル
- 注
-
一般的に印刷用紙の解像度はディスプレイの解像度より高いことが多くキャンバスを素直に印刷データとして出力すると小さく印刷されることが多くなります。そのようなものとご理解ください。
次に、Mind 9 のインストールディレクトリの bin\ にある次のファイルをエディタで開きます。
pmind\bin\
ghostpath.txt
上記テキストファイルには以下の内容が記入されています。
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
↓ここを開発者の環境に合わせて訂正
←−−−→
C:\myprog\gs\gs10.04.0\bin\gswin64c.exe -q -dNOPAUSE -dBATCH
-sDEVICE=pdfwrite -sPAPERSIZE=a4 -dFIXEDMEDIA
(ブラウザの都合で2行に見えますが実際は1行です)
\___________________/
上記「←−−→」の個所を開発者の環境に合わせて修正してセーブしてください。
・・ ここまでコマンド プロンプトでの作業 ・・
最後に、
印刷データ(psファイル)をPDFに変換する のセクションで解説したサンプルプログラムの実行例に従ってPDFへの変換を試してください。