global

affine

gdi affine $x0 $y0 ... $xn $yn $X0 $Y0 ... $Xn $Yn

return {1 | 0}

アフィン変換パラメータを設定します
$xi $yi : 変換前の座標値
$Xi $Yi : 変換後の座標値
実際のアフィン変換はgdi $olist.transformで行います

axis

gdi axis [$xysystem]

return xysystem

gdi bl2xyで参照される投影座標系を設定します
アーギュメント$xysystemには座標系番号を与えます
  1〜19 公共座標系
  51〜56 UTM
  100 真球メルカトル
省略すると現在の座標系が返ります

回転楕円体はgdi ellipseで設定します

area

gdi Area $x1 $y1 [$x2 $y2....]

return area

x,y座標列で囲まれた範囲の面積を求めます
重心を求めるのはgdi Gareaです

参考 gdi $obj.area

batchmode

gdi batchmode $bool

return bool

$boolに1か"on"を与えるとバッチモードに設定します
$boolに0か"off"を与えるとバッチモードを解除します
変更前の状態が返ります
バッチモードにあるとUndo/Redoスタックに積む下記のコマンドが無効(何もしない)になります
gdi $obj.pushBefore
gdi $obj.pushAfter
gdi $obj.pushCreateObj
gdi $olist.pushBefore
gdi $olist.pushAfter
gdi $olist.pushCreateObj
gdi $canvas.undoStart
gdi $canvas.undoFinish

bl2xy

gdi bl2xy $k $i

return {x y}

経緯度座標を直角座標系のx,y座標に変換します
経緯度は秒単位の実数で与えます
x,y座標はM単位の実数値で返ります

測地系、投影座標系はそれぞれ
  gdi ellipse
  gdi axis
で設定します

このコマンドと反対の処理をするのがgdi xy2blです

clock

gdi Clock $x1 $y1 [$x2 $y2....]

return clock

座標列の方向を返します
1が返れば「時計回り」0が返れば「反時計回り」です

参考 gdi $obj.clock

closeprinter

gdi closePrinter

return success

gdi openPrinterで開いたプリンタを閉じます
成功したら1,失敗したら0が返ります

clip

gdi clip

クリップボードコマンド群

gdi clip.copytext [$hwnd] $text

return success

文字列をクリップボードにコピーします
hwndは省略可能なウインドウハンドル
成功すると1が返ります

gdi clip.gettext [$hwnd]

return text

クリップボードから文字列を取り出します
hwndは省略可能なウインドウハンドル
文字列がクリップボードになく失敗したらNULL文字列を返します

gdi clip.copybmp $canvas $x $y $w $h

return success

canvasに表示されている画像をビットマップでクリップボードにコピーします
x,yはコピー範囲の原点で、canvas内のピクセル座標です
w,hはコピー範囲の幅と高さでピクセル座標です
成功すると1が返ります
hwndに0を与えるとデスクトップ指定になります

クリップボードから画像を取り出すコマンドはありません
コピーした画像は、pasteコマンドを実装しているアプリケーションで利用します

cmpbinbase64

gdi CmpBinBase64 $datapointer $datasize $before $after

return base64text

サイズがdatasize、メモリアドレスがdatapointerのデータをzlib圧縮してさらにBase64エンコードしたデータを返します
失敗したら空文字を返します
エンコードデータに付け加えるヘッダとフッダデータをbeforeとafterに指定します

参照
 gdi CmpBase64
 gdi CmpHex
 gdi UnCmpHex

cmpbase64

gdi CmpBase64 $data $datasize $before $after

return base64text

サイズがdatasizeのデータdata(アドレスにあらず)をzlib圧縮してさらにBase64エンコードしたデータを返します
失敗したら空文字を返します
エンコードデータに付け加えるヘッダとフッダデータをbeforeとafterに指定します

参照
 gdi CmpBinBase64
 gdi CmpHex
 gdi UnCmpHex

cmphex

gdi CmpHex $infile $outfile $before $after

return err

infileファイルを読みoutfileにzlib圧縮してさらにBase64エンコードしたデータを書き出します
エンコードデータに付け加えるヘッダとフッダデータをbeforeとafterに指定します
成功したら0を返します

このコマンドは、当初HEXコードを生成するものから、現在はBase64エンコードに変更されています

参照
 gdi CmpBinBase64
 gdi CmpBase64
 gdi UnCmpHex

createcavas

gdi CreateCavas $hwnd $x $y $w $h

return canvas

キャンバスを作成します
hwndは親ウインドウハンドルです
x,yは親ウインドウ内の作成キャンバスの原点座標です
w,hは作成キャンバスの幅と高さです
キャンバスハンドルを返します

createprinterdc

gdi createPrinterDC [$copy]

return hdc

プリンタDC(デバイスコンテキスト)を作成します。その後に用紙サイズ取得や印刷が可能になります
このコマンドに先立ちgdi openPrinter,gdi loadPrinterコマンドでプリンタが開かれている必要があります
$copyには印刷枚数をセットします(デフォルト=1)

プリンタDCを削除するのはgdi deletePrinterDcコマンドです
ただし印刷を実行した場合は自動的に削除されます

 参照
  gdi openPrinter
  gdi loadPrinter
  gdi freePrinter
  gdi deletePrinterDC
  gdi PrinterProp
  gdi PaperSize
  gdi PaperSizeDot
  gdi setPaperSize
  gdi setPaperLayout
  gdi $canvas.print
  gdi $canvas.mapPrint
  gdi $canvas.hardcopy

crossex

gdi CrossEx $Ax1 $Ay1 $Ax2 $Ay2 $Bx1 $By1 $Bx2 $By2

return {x y}

線分Aと線分Bの交点を計算し交点座標を返します
延長線上の交点も計算されます
交点が無い場合はNULLが返ります

参照 gdi Cross

cross

gdi Cross $Ax1 $Ay1 $Ax2 $Ay2 $Bx1 $By1 $Bx2 $By2

return {x y}

線分Aと線分Bの交点を計算し交点座標を返します
延長線上の交点は交点とみなされません
交点が無い場合はNULLが返ります

参照
 gdi CrossEx
 gdi $obj.cross

ddmmss2sec

gdi DDMMSS2sec $ddmmss1 ...

return {ew1 ns1 ...}

DDMMSS書式の経緯度を秒単位経緯度に変換します

 経緯度 DDMMSS書式
 東経132度42分30.23秒 1324230.23
 北緯42度5分2.3秒 420502.3

この逆の処理を行うのがgdi sec2ddmmssです

deleteprinterdc

gdi deletePrinterDC $hdc

プリンタDCを削除します

 参照
  gdi openPrinter
  gdi loadPrinter
  gdi freePrinter
  gdi createPrinterDC
  gdi PrinterProp
  gdi PaperSize
  gdi PaperSizeDot
  gdi setPaperSize
  gdi setPaperLayout
  gdi $canvas.print
  gdi $canvas.mapPrint
  gdi $canvas.hardcopy

dib2bitmap

gdi dib2bitmap $dib [free]

return bitmapfile_image

MYDIBハンドル($dib)のビットマップファイルイメージ(バイナリィ)を返します
0が返されたら失敗です
"free"を与えると処理後にdibを解放します

返されたイメージはputsコマンドでファイルに保存できます
その際、ファイルは"binary"モードで作成してください
ファイルはWindows BMPファイルとして作成されます


 set img [gdi dib2bitmap $dib]
 set fp [open mybmp.bmp w]
 fconfigure $fp -translation binary
 puts $fp $img
 close $fp

dib2gif

gdi dib2gif $dib [free] [$transeparent] [$bgcolor]

return giffile_image

MYDIBハンドル($dib)のGIFファイルイメージ(バイナリィ)を返します
dibに格納されている入力イメージは24ビットカラーにのみ対応しています
"free"が与えられるとdibを解放します
$tranceparent : "TRUE" | "FALSE"
$bgcolor : RGB値(32bit値) <-- [expr $r<<24+$g<<16+$b<<8]

返されたイメージはputsコマンドでファイルに保存できます
その際、ファイルは"binary"モードで作成してください


 set img [gdi dib2gif $dib free TRUE ]
 set fp [open mybmp.gif w]
 fconfigure $fp -translation binary
 puts $fp $img
 close $fp

dib2png

gdi dib2png $dib [free] [$transeparent] [$bgcolor]

return pngfile_image

MYDIBハンドルdibのpngファイルイメージ(バイナリィ)を返す
0が返されたら失敗
"free"を与えるとdibを解放する
$tranceparent : "TRUE" | "FALSE"
$bgcolor : RGB値(32bit値) <-- [expr $r<<24+$g<<16+$b<<8]

downcolordepth

gdi DownColorDepth $onoff

タイルマップ作成時に24bitカラー画像を8bitカラー画像に減色する場合は
$onoffに1をセットします

dumpmap

gdi DumpMap $mapfile $htmlfile

return err

マップファイルの情報をhtmlファイルにはき出します
-1が返ったら失敗,0が返れば成功です

情報はヘッダ情報,レイヤ名と各オブジェクト数です

ellipse

gdi ellipse [$ellipse]

gdi bl2xyで参照される回転楕円体を設定します
アーギュメント$ellipseには楕円体名を与えます
  BESSEL WGS84 GRS80 GRS83 CLARKE IAU65 GRS67
アーギュメントを省略すると現在の楕円体が返ります

投影座標系はgdi axisで設定します

filename

gdi filename $mapid

return filename

mapid(referenceid)のファイル名を返します

foreach

gdi foreach obj $olist $script

$olistから順にオブジェクトを抽出し、objに代入してから$scriptを実行するループ処理を行います
$olistがmdbリストでも有効です

freeprinter

gdi freePrinter

gdi loadPrinterでloadしたプリンタを使用後に解放します

garea

gdi Garea $x1 $y1 [$x2 $y2....]

return {gx gy}

x,y座標列で囲まれた空間の重心を求めます

参照 gdi $obj.center

getmargin

gdi GetMargin

return {left right top bottom}

印刷マージンを返します

参照 gdi SetMargin

getcolorindex

gdi GetColorIndex $r $g $b

return index

(r,g,b)色のカラー番号を返します
-1が返れば256テーブルに無い色です
デフォルトのカラーテーブルはAutoCADと同じです

getindexrgb

gdi GetIndexRGB $index

return {r g b}

カラー番号$indexのRGB値を返します
NULLが返れば失敗です
デフォルトのカラーテーブルはAutoCADと同じです

getmousecanvas

gdi GetMouseCanvas

return canvas

gdi GetMouseXYで得られる座標が属するキャンバスを返します

getmousepos

gdi GetMousePos

return {x y}

現在のマウスポインタの位置をスクリーン座標で返します

参照 gdi GetMouseXY

getmousexy

gdi GetMouseXY

return {x y}

最後にキャンバスでクリックされたマウスポインタの座標をマップ座標で返します

参照 gdi GetMousePos

icon

gdi icon

アイコンコマンド群

gdi icon.extract $filename

return {icon1 icon2}

exeファイル,dllファイルのアイコンリソースを抽出します
icon1は小さいアイコンハンドル,icon2は大きいアイコンハンドルです

gdi icon.load $iconfile

return icon

アイコンファイル(*.ico)からアイコンイメージを作成しアイコンハンドルを返します

gdi icon.delete $icon

与えられたアイコンハンドルのアイコンイメージを削除します

jgd2tokyo

gdi jgd2tokyo $kei $ido

return {kei ido}

世界測地系の経緯度を東京測地系経緯度に変換します
単位は秒です
参照 gdi tokyo2jgd

listprinters

gdi listPrinters

return printer_name_list

プリンタ名のTclリストを返します
先頭要素がデフォルトプリンタ名です

loadprinter

gdi loadPrinter

return success

レジストリに記憶されているデフォルトプリンタをロードします
このコマンドの実行結果はgdi openPrinterと同格です
プリンタ使用後にgdi freePrinterで解放してください

 参照
  gdi freePrinter
  gdi createPrinterDC
  gdi deletePrinterDC
  gdi PrinterProp
  gdi PaperSize
  gdi PaperSizeDot
  gdi setPaperSize
  gdi setPaperLayout
  gdi $canvas.print
  gdi $canvas.mapPrint
  gdi $canvas.hardcopy

openprinter

gdi openPrinter $hwnd [$copies] [$changeflag]

return success

プリンタ設定ダイアログを開きます
プリンタの選択や用紙サイズ、向きを設定できます
つまりデフォルトプリンタを変更するために使用します
ダイアログを「OK」で終了するとgdi loadPrinterを実行した状態と同じになります
選択されたプリンタはレジストリに記憶されます
レジストリに記憶済みのプリンタを再選択するのがgdi loadPrinterコマンドです

$hwnd はウインドウハンドルです
 ウインドウハンドルはキャンバスハンドルか、またはguiウインドウハンドルです
 ([gui get $win hwnd])
$changeflagは用紙サイズと向きの変更を許す場合に1を与えます
0または省略すると余白しか設定できません(プリンタ変更は可能)
成功したら1,失敗したら0が返ります

プリンタを開いたら、次にgdi createPrinterDCコマンドを実行し、プリンタの
DC(デバイスコンテキスト)を作成します。その後に用紙サイズ取得や印刷が可能に
なります

プリンタ使用後にgdi closePrinterを実行してください

 参照
  gdi closePrinter
  gdi loadPrinter
  gdi freePrinter
  gdi createPrinterDC
  gdi deletePrinterDC
  gdi PrinterProp
  gdi PaperSize
  gdi PaperSizeDot
  gdi setPaperSize
  gdi setPaperLayout
  gdi $canvas.print
  gdi $canvas.mapPrint
  gdi $canvas.hardcopy

プリンタを閉じるのはgdi closePrinterです

papersizedot

gdi PaperSizeDot $printerDC

return {w h}

マージンも考慮した実際の印刷範囲(dot)を取得します
このコマンドに先立ちgdi createPrinterDCが実行されている必要があります

 参照
  gdi openPrinter
  gdi closePrinter
  gdi loadPrinter
  gdi freePrinter
  gdi createPrinterDC
  gdi deletePrinterDC
  gdi PrinterProp
  gdi PaperSize
  gdi setPaperSize
  gdi setPaperLayout
  gdi $canvas.print
  gdi $canvas.mapPrint
  gdi $canvas.hardcopy

papersize

gdi PaperSize $printerDC

return {w h}

マージンも考慮した実際の印刷範囲(mm)を取得します
このコマンドに先立ちgdi createPrinterDCが実行されている必要があります

 参照
  gdi openPrinter
  gdi loadPrinter
  gdi freePrinter
  gdi createPrinterDC
  gdi deletePrinterDC
  gdi PrinterProp
  gdi PaperSizeDot
  gdi setPaperSize
  gdi setPaperLayout
  gdi $canvas.print
  gdi $canvas.mapPrint
  gdi $canvas.hardcopy

past

gdi Past $canvas

貼り付け

pointisinside

gdi PointIsInside $x $y $px0 $py0 .....$pxn $pyn

return inside

指定位置(x,y)が空間(px0,py0...)の内部にあるか調べます
内部なら1,オンラインなら2,外部なら0を返します
空間座標は($px0,$py0)==($pxn,$pyn)とし閉じた座標列を与えます

inside
0 : 外
1 : 中
2 : オンライン

参照 gdi $obj.inside

printerprop

gdi printerProp

return {printername layout size}

プリンタ情報を返します
プリンタ名,用紙向き,用紙サイズのリストで返します
このコマンドに先立ちgdi selectPrinterまたはgdi loadPrinterが実行されている必要があります

 参照
  gdi openPrinter
  gdi loadPrinter
  gdi freePrinter
  gdi createPrinterDC
  gdi deletePrinterDC
  gdi PaperSizeDot
  gdi PaperSize
  gdi setPaperSize
  gdi setPaperLayout
  gdi $canvas.print
  gdi $canvas.mapPrint
  gdi $canvas.hardcopy

printmargin

gdi PrintMargin [$left $top]

return {left top}

print

gdi Print $canvas $prnhdc $scale [$title [$dpi]]

gdi Print $canvas $prnhdc $xmin $ymin $xmax $ymax $scale [$title [$dpi]]

projection

gdi Projection [$ellipse] [$xy]

$ellipse "BESSEL", "WGS84", "GRS80", "JGD2000" , "JGD2011.parfilename" "GRS83","CLARKE"
$xy 1-19 (19系)
51-56(UTM)

renamemaplayer

gdi renameMapLayer $mapname $oldname1 $newname1 ....

return 0:success -1:read error -2:write error

releaseprinter

gdi releasePrinter

gdi selectPrinterで開いたプリンタを閉じます

sec2ddmmss

gdi sec2ddmmss $keido $ido

return DDMMSS

秒単位の経緯度座標をDDMMSS書式で返します
この逆の処理がgdi ddmmss2secコマンドです

selectprinter

gdi selectPrinter $printername

プリンタをオープンします

$printername プリンタ名
gdi listPrintersで取得できます

各種パラメータの取得・設定が可能になります
印刷する際にはこの後gdi createPrinterDCを実行します
使い終わったらgdi releasePrinterを実行します

setmousexy

gdi SetMouseXY $x $y

直前に入力された座標値としてセット
マウス入力エミュレーション時に使用する

setcolorindex

gdi SetColorIndex $index $r $g $b

256色カラーテーブルのrgb値を変更します
デフォルトはAutoCADのカラーテーブルです

setmargin

gdi SetMargin $left $right $top $bottom

mm単位で印刷マージンを設定します
参照 gdi GetMergin

setmonitorwidth

gdi SetMonitorWidth $wmm

mm単位でモニターの幅(長い方)をセットします

setpaperlayout

gdi setPaperLayout {h|v}

return success

印刷用紙方向を設定します
横方向なら"h",縦方向ならが"v"を与えます
このコマンドに先立ちgdi createPrinterDCが実行されている必要があります

 参照
  gdi openPrinter
  gdi loadPrinter
  gdi freePrinter
  gdi createPrinterDC
  gdi deletePrinterDC
  gdi PrinterProp
  gdi PaperSize
  gdi PaperSizeDot
  gdi setPaperSize
  gdi $canvas.print
  gdi $canvas.mapPrint
  gdi $canvas.hardcopy

setpapersize

gdi setPaperSize $papername [$length $width]

return success

プリンタの用紙サイズを選択します
papernameにはA0,A1,A2,A3....等の用紙規格文字列を与えます
特殊サイズの場合は length,widthにmm単位でサイズを与えます

このコマンドに先立ちgdi selectPrinterまたはgdi loadPrinterが実行されている必要があります

 参照
gdi selectPrinter
  gdi loadPrinter
  gdi freePrinter
gdi releasePrinter
  gdi createPrinterDC
  gdi deletePrinterDC
  gdi PrinterProp
  gdi setPaperSize
  gdi PaperSizeDot
  gdi setPaperLayout
  gdi $canvas.print
  gdi $canvas.mapPrint
  gdi $canvas.hardcopy

tokyo2jgd

gdi tokyo2jgd $kei $ido

return {kei ido}

東京測地系の経緯度を世界測地系経緯度に変換します
単位は秒です
参照 gdi jgd2tokyo

uncmphex

gdi UnCmpHex $cmpressed_data

return uncompressed_data

gdi CmpHex,gdi CmpBinBase64,gdi CmpBase64で作成されたデータを
解凍する。Base64デコード、zlib解凍の順で処理される。
Base64コードだけでなくHEXコードも解凍することもできる。

xy2bl

gdi xy2bl $x $y

return {kei ido}

直角座標系のx,y座標を経緯度座標に変換します
x,y座標はM単位の実数値で与えます
xが東西,yが南北座標です
経緯度は秒単位の実数で返ります

測地系、投影座標系はそれぞれ
  gdi ellipse
  gdi axis
で設定します

このコマンドと反対の処理をするのがgdi bl2xyです

zip.encode

gdi zip.encode $unzdata $unzsize

return zdata

gdi zip.decode $zdata $zsize

return unzdata