Golly:Pythonスクリプト
Golly Help: Python Scriptingの機械翻訳
https://gyazo.com/cf857b03c95df6af767600747788d72c
/icons/hr.icon
Python のインストール
サンプルスクリプト
Golly のスクリプトコマンド
セルリスト
矩形リスト
glife パッケージの使用
起こりうる問題
Python 著作権表示
Python のインストール
※このバージョン以降、Golly は Python 3.x(64 ビット)のインストールを必要とします。Mac ユーザーは、Apple が将来的な macOS リリースに Python を同梱しないと発表しているため、Python 3.x インストーラーを別途ダウンロードする必要があります。
.py スクリプトを実行する前に、Python 3.3 以降がシステムにインストールされている必要があります。ユーザーは www.python.org/download から最新の Python 3 インストーラーをダウンロードできます。警告:Golly は 64 ビット版の Python を必要とします。
バージョン 4.0 以降では、すべてのプラットフォームで Python ライブラリは実行時(スクリプトを初めて実行する際)に読み込まれます。Golly は最初に特定のバージョンの Python ライブラリの読み込みを試みます。Windows では python39.dll、Linux では libpython39.so です。これらの数字は Python バージョン 3.9 に対応しています。このライブラリが見つからない場合は、システムにインストールされている Python 3.x のバージョンに一致する別のライブラリ名を入力するように求められます。一度ライブラリが正常に読み込まれると(GollyPrefs ファイルに記録され)、Python を削除したり新しいバージョンをインストールしない限り、再度入力を求められることはありません。Python がインストールされていない場合は、キャンセルを押すしかなく、.py スクリプトを実行することはできません。
サンプルスクリプト
Golly:Pythonサンプルスクリプト
Golly に付属の Scripts フォルダには、いくつかの Python サンプルスクリプトが含まれています:
- bricklayer.py — p154とp7のグライダー銃を使って、周期的にレンガのような構造を積み上げるパターンを生成します
- density.py — 現在のパターンの密度を計算します
- draw-lines.py — 1 本または複数の直線を描くことができます
- envelope.py — 複数のレイヤーを使ってパターンの生存セルを記憶します
- flood-fill.py — クリックされた領域を現在の描画状態で塗りつぶします
- goto.py — 指定された世代へ移動します
- goto_expression.py — 数式や科学的記法も含む柔軟な指定で目的の世代へジャンプできます
- gun-demo.py — いくつかのスペースシップガンを構築します
- heisenburp.py — クローンされたレイヤーの使用例を示します
- invert.py — 現在の選択範囲のすべてのセル状態を反転させます
- life-integer-gun30.py — 任意の整数列を、グライダー構築可能なパターンに安定化するライフゲームフォントで表示します
- make-Banks-IV-constructor.py — 選択中の状態3セルを Banks-IV ルールの構築機械によって再現可能な構築用 CA パターンに変換します
- make-Codd-constructor.py — 選択中の状態1セルを、Coddのセル・オートマトンルールで再構築可能な構築用パターンに変換します
- make-Devore-tape.py — Devoreの自己複製型セル・オートマトンに対応する、1020億ステップ周期のプログラム&データテープを構築します
- make-torus.py — 現在の選択範囲からトーラス宇宙を作成します
- metafier.py — 現在の選択範囲をメタパターンに変換します
- move-object.py — 接続された生存セルのグループを移動できます
- move-selection.py — 現在の選択範囲を移動できます
- oscar.py — スペースシップを含む振動パターンを検出します
- p1100-MWSS-gun.py — Bill Gosper による純粋周期の p1100 ダブル MWSS ガンを構築します(1984年作)
- pd-glider.py — ペンタデカスロン+グライダーの衝突セットを生成します
- pop-plot.py — 時間に対する個体数のグラフを表示します
- pop-sounds.py — 個体数の変化に応じた異なる音を再生します
- shift.py — 現在の選択範囲を指定した x, y 量だけ移動します
- slide-show.py — Patterns フォルダ内のすべてのパターンを表示します
- tile.py — 現在の選択範囲をその中のパターンでタイル状に並べます
- tile-with-clip.py — クリップボードのパターンで現在の選択範囲をタイル状に並べます
これらのスクリプトを実行するには、File メニューの Show Files を有効にし、Scripts/Python フォルダを開いてスクリプト名をクリックするだけです。File メニューの Run 項目からも実行できます。よく使うスクリプトには、ショートカットキーを割り当てると便利です(Preferences > Keyboard を参照)。
Golly の起動時には、Golly アプリケーションと同じディレクトリ、またはユーザー固有のデータディレクトリ内にある golly-start.py という名前のスクリプトを探します(システム上のパスは getdir コマンドで確認できます)。このスクリプトが見つかると、自動的に実行されます。
スクリプトの実行を中断するには、いくつかの方法があります。Esc キーを押す、ツールバーの停止ボタンをクリックする、または Control メニューの Stop 項目を選択します。
Golly のスクリプトコマンド
このセクションでは、golly モジュールをインポートした後にスクリプト内で使用できるすべてのコマンドについて説明します。以下の例では、次のようにインポートしていることを前提としています:
import golly as g
コマンドは機能別(ファイル操作、編集、制御、表示、レイヤー、その他)に分類されていますが、アルファベット順で個別のコマンドを探すこともできます:
addlayer
advance
autoupdate
check
clear
clone
copy
cut
dellayer
doevent
duplicate
empty
error
evolve
exit
fit
fitsel
flip
getalgo
getbase
getcell
getcells
getclip
getclipstr
getcolor
getcolors
getcursor
getdir
getevent
getgen
getheight
getinfo
getlayer
getmag
getname
getoption
getpath
getpop
getpos
getrect
getrule
getselrect
getstep
getstring
getview
getwidth
getxy
hash
join
load
maxlayers
movelayer
new
note
numalgos
numlayers
numstates
open
opendialog
os
parse
paste
putcells
query
randfill
reset
rotate
run
save
savedialog
select
setalgo
setbase
setcell
setclipstr
setcolor
setcolors
setcursor
setdir
setgen
setlayer
setmag
setname
setoption
setpos
setrule
setstep
setview
show
shrink
sound
step
store
transform
update
visrect
warn
ファイル操作コマンド(FILING COMMANDS)
◆open(filename, remember=False)
指定されたファイルを開き、その種類に応じて処理を行います:
- HTML ファイル(拡張子 .htm または .html)はヘルプウィンドウに表示されます。
- テキストファイル(拡張子 .txt や .doc、または名前に "readme" を含むもの)はテキストエディタで開かれます。
- スクリプトファイル(拡張子 .lua または .py)は実行されます。
- ZIP ファイル(拡張子 .zip)は こちらに記載された方法で処理されます。
- その他のファイルはパターンファイルとして扱われ、現在のレイヤーに読み込まれます。
絶対パスでない場合は、スクリプトのある場所からの相対パスと解釈されます。第 2 引数は省略可能(デフォルトは False)で、指定されたパターンや ZIP ファイル、またはスクリプトを「Open Recent」や「Run Recent」メニューに記憶させるかどうかを指定します。
例:g.open("my-patterns/foo.rle")
◆save(filename, format, remember=False)
現在のパターンを指定されたファイル形式で保存します:
- "rle" — RLE(ランレングス圧縮)形式
- "rle.gz" — 圧縮 RLE
- "mc" — マクロセル形式
- "mc.gz" — 圧縮マクロセル形式
絶対パスでない場合はスクリプトからの相対パスとされます。第 3 引数は省略可能(デフォルトは False)で、保存ファイルを「Open Recent」メニューに記憶させるかどうかを指定します。savexrle オプションが有効な場合は拡張 RLE 形式で保存されます。 (拡張 RLE 形式を保存する(Save Extended RLE)を参照)
例:g.save("foo.rle", "rle", True)
◆opendialog(title, filetypes, initialdir, initialfname, mustexist=True)
標準のファイルを開くダイアログを表示し、選択されたファイルのパスを文字列で返します。すべての引数は省略可能で、デフォルトでは現在のディレクトリを表示し、タイトルは "Choose a file"、ファイルタイプは "All files (*)|*" です。第 5 引数を False にすると、既存ファイルの選択ではなく新しいファイル名を指定可能になります。ファイルタイプに "dir" を指定すると、ファイルではなくディレクトリを選択できます。キャンセルされた場合は空文字列を返します。
例:fname = g.opendialog("Open MCell File", "MCell files (*.mcl)|*.mcl", "C:\\Temp", "sample.mcl")
例:dirname = g.opendialog("Choose a folder", "dir")
◆savedialog(title, filetypes, initialdir, initialfname, suppressprompt=False)
標準の保存ダイアログを表示し、選択された保存先のパスを文字列で返します。すべての引数は省略可能で、デフォルトでは現在のディレクトリを表示し、タイトルは "Choose a save location and filename"、ファイルタイプは "All files (*)|*" です。指定先にすでにファイルがある場合、第 5 引数が True でない限り「上書きしますか?」の確認が表示されます。キャンセルされた場合は空文字列を返します。
例:fname = g.savedialog("Save text file", "Text files (*.txt;*.csv)|*.txt;*.csv", "C:\\Temp", "Params.txt", 1)
◆load(filename)
指定されたパターンファイルを読み込み、セルリストを返します。
例:blinker = g.load("blinker.rle")
◆store(cell_list, filename)
指定されたセルリストを、RLE 形式で指定ファイルに保存します。savexrle オプションが有効な場合は拡張 RLE 形式が使用されます。(拡張 RLE 形式を保存する(Save Extended RLE)を参照)
例:g.store(clist, "foo.rle")
◆getdir(dirname)
指定されたディレクトリのパスを返します:
- "app" — Golly アプリケーションのあるディレクトリ
- "data" — ユーザー固有のデータディレクトリ
- Linux: ~/.golly/
- Mac: ~/Library/Application Support/Golly/
- Windows 7+: C:\Users\username\AppData\Roaming\Golly\
- "temp" — 一時ファイル用のディレクトリ(Golly 終了時に削除されます)
- "rules" — Preferences > Control で設定されたルール用ディレクトリ
- "files" — File > Show Files で表示されるディレクトリ
- "download" — ダウンロードファイルの保存先ディレクトリ
各場合で、現在のプラットフォームに適したパス区切りで終わる完全パスが返されます。
例:g.open(g.getdir("app") + "Patterns/Life/Breeders/breeder.lif")
◆setdir(dirname, dirpath)
指定されたディレクトリ名に、新しいディレクトリパス(既存の完全パス)を設定します。
"app"、"data"、"temp" 以外のすべての名前が使用可能です。
例:g.setdir("download", "/path/to/my-downloads/")
◆getinfo()
現在のパターンに含まれるコメントを返します。
例:comments = g.getinfo()
◆getpath()
現在開いているパターンのファイルパスを返します。新規作成された未保存パターンの場合は空文字列を返します。
例:path = g.getpath()
編集コマンド(EDITING COMMANDS)
◆new(title)
新しい空の宇宙を作成し、ウィンドウタイトルを設定します。タイトルが空文字列の場合は、現在のタイトルは変更されません。
例:g.new("test-pattern")
◆cut()
現在の選択範囲をクリップボードに切り取ります。
◆copy()
現在の選択範囲をクリップボードにコピーします。
◆clear(where)
現在の選択範囲を消去します。where = 0 で内側、where = 1 で外側を消去します。
例:g.clear(1)
◆paste(x, y, mode)
クリップボードのパターンを x, y に、指定されたモード("and", "copy", "or", "xor")で貼り付けます。
例:g.paste(0, 0, "or")
◆shrink(remove_if_empty=False)
現在の選択範囲を、生存セルをすべて含む最小の矩形に縮小します。選択範囲に生存セルがない場合、オプションの引数により選択範囲を維持するか削除するかを指定します。
例:if len(g.getselrect()) > 0: g.shrink(True)
◆randfill(percentage)
現在の選択範囲を、指定した密度(1〜100%)でランダムに生存セルで満たします。
例:g.randfill(50)
◆flip(direction)
現在の選択範囲を反転します。direction = 0 で左右、1 で上下反転。
◆rotate(direction)
現在の選択範囲を 90 度回転します。direction = 0 で時計回り、1 で反時計回り。
◆evolve(cell_list, numgens)
指定されたセルリストを指定世代分進め、結果のセルリストを返します。
例:newpatt = g.evolve(currpatt, 100)
◆join(cell_list1, cell_list2)
2 つのセルリストを結合し、結果のセルリストを返します。両方が one-state の場合は one-state で返され、いずれかが multi-state の場合は multi-state で返されます。ただし両方が空の場合は [0] ではなく [] を返します。 one-state/multi-stateセルリストの説明については下部の<セルリスト>を参照
例:result = g.join(part1, part2)
◆transform(cell_list, x0, y0, axx=1, axy=0, ayx=0, ayy=1)
アフィン変換を指定のセルリストに適用し、変換後のセルリストを返します。 入力リスト内の各 x, y セルに対して、出力リスト内の対応する xn, yn セルは次のように計算されます:
xn = x0 + x\*axx + y\*axy, yn = y0 + x\*ayx + y\*ayy
例:rot_blinker = g.transform(blinker, 0, 0, 0, -1, 1, 0)
◆parse(string, x0=0, y0=0, axx=1, axy=0, ayx=0, ayy=1)
RLE または Life 1.05 形式の文字列をパースし、必要に応じて変換を加えたセルリストを返します。
例:blinker = g.parse("3o!")
◆putcells(cell_list, x0=0, y0=0, axx=1, axy=0, ayx=0, ayy=1, mode="or")
指定のセルリストを、任意のアフィン変換およびモード("and", "copy", "not", "or", "xor")を使って現在の宇宙に貼り付けます。
例:g.putcells(currpatt, 6, -40, 1, 0, 0, 1, "xor")
◆getcells(rect_list)
指定された矩形内のすべての生存セルをセルリストとして返します。与えられたリストは空でもかまいません(その場合、セルリストは空になります)が、そうでない場合は [x, y, width, height] の形式で有効な矩形を表していなければなりません。
例:clist = g.getcells(g.getrect())
◆getclip()
クリップボード内のパターンデータを解析し、セルリストを返します。ただし、最初の 2 つの数値はパターンの幅と高さです(これは必ずしも最小のバウンディングボックスとは限りません。なぜなら、パターンに空白の境界が含まれている可能性があるためであり、あるいはパターン自体が空である場合もあります)。クリップボードのデータがマルチステートであっても、すべてのセル状態がたまたま 0 の場合、返されるセルリストは [wd, ht, 0] ではなく [wd, ht] になります。
例:clist = g.getclip()
◆hash(rect_list)
指定された矩形内のパターンに対して、整数のハッシュ値を返します。2 つのパターンが同一であれば、それらの位置にかかわらず同じハッシュ値が返されます。このコマンドはパターンの等価性を高速に検出する手段を提供しますが、異なるパターンが同じハッシュ値を持つ可能性がごくわずかにあるため、本当に等しいかを確認するには追加の(より遅い)検査が必要になるかもしれません。
例:h = g.hash(g.getrect())
◆select(rect_list)
指定された矩形 [x, y, width, height] で選択範囲を作成します。空リスト [] を渡すと選択を解除します。
例:g.select([-10, -10, 20, 20])
◆getrect()
現在のパターンのバウンディングボックスを [x, y, width, height] のリストで返します。パターンがなければ空リスト []。
例:if len(g.getrect()) == 0: g.show("No pattern.")
◆getselrect()
現在の選択範囲を [x, y, width, height] のリストで返します。選択範囲がなければ空リスト []。
例:if len(g.getselrect()) == 0: g.show("No selection.")
◆setcell(x, y, state)
座標 (x, y) のセルを指定の状態(0 = 死、1 = 生)に設定します。
◆getcell(x, y)
座標 (x, y) のセルの状態を取得します。以下は状態を反転する例です:
例:g.setcell(0, 0, 1 - g.getcell(0, 0))
◆setcursor(string)
カーソルモードを指定の文字列に設定し、以前のカーソルモードを返します。指定文字列は Cursor Mode メニューの項目と一致する必要があります。
例:oldcurs = g.setcursor("Draw")
◆getcursor()
現在のカーソルモードを文字列で返します(つまり Cursor Mode メニューでチェックされている名前)。
制御コマンド(CONTROL COMMANDS)
◆run(numgens)
現在のパターンを指定された世代数だけ進めます。中間世代は表示されず、最終世代も autoupdate 設定が True のときのみ表示されます。実行中にユーザーが +/- キーを押すと numgens 回進まない可能性があるため、getevent コマンドを使ってそれらのキーイベントを無効化すると安全です。
例:g.run(100)
◆step()
現在のパターンを現在のステップサイズで 1 ステップ進めます。中間世代は表示されず、最終世代は autoupdate が True のときのみ表示されます。
◆setstep(exp)
現在のステップの指数値(整数)を一時的に設定します。負の値にするとステップサイズが 1 になり、ステップごとに遅延が入りますが、その遅延は run および step コマンドには影響しません。新しいパターンの作成、パターンファイルの読み込み、アルゴリズムの切り替え時に指数は 0 にリセットされます。
例:g.setstep(0)
◆getstep()
現在のステップ指数を返します。
例:g.setstep(g.getstep() + 1)
◆setbase(base)
現在のベースステップを、2 から 2,000,000,000 の整数で一時的に設定します。必要に応じて、現在の指数が減少することがあります。Golly は、新しいパターンを作成したとき、パターンファイルを読み込んだとき、または異なるアルゴリズムに切り替えたときに、デフォルトのベースステップ(Preferences > Control で設定)を復元します。
例:g.setbase(2)
◆getbase()
現在のベースステップを返します。
◆advance(where, numgens)
現在の選択範囲内(where = 0)または外側(where = 1)だけを指定された世代数だけ進めます。世代カウント自体は変わりません。
例:g.advance(0, 3)
◆reset()
開始時のパターンと世代カウントに戻します。また、アルゴリズム、ルール、スケール、位置、ステップ指数も開始時の値にリセットされます。開始世代は通常 0 ですが、非ゼロの世代を含む RLE やマクロセルファイルを読み込んだ場合は異なることもあります。
◆setgen(gen)
世代数を文字列で設定します。カンマなどの区切り文字を使って読みやすくすることができます。先頭に + または - をつければ現在の世代からの相対指定も可能です。
例:g.setgen("-1,000")
◆getgen(sepchar='\0')
現在の世代数を文字列として返します。オプションのパラメータ(デフォルトは '\0')は、結果の文字列をより読みやすくするために使用できる区切り文字を指定します。たとえば、g.getgen(',') は "1,234,567" のような文字列を返しますが、g.getgen() は "1234567" を返します。世代数に対して算術演算を行いたい場合は後者を使用してください。なぜなら、その場合 int を使って文字列を整数に変換するのが簡単だからです。Python は任意に大きな整数をサポートしていることに注意してください。
例:gen = int(g.getgen())
◆getpop(sepchar='\0')
現在の個体数を文字列として返します。オプションのパラメータ(デフォルトは '\0')は、結果の文字列をより読みやすくするために使用できる区切り文字を指定します。たとえば、g.getpop(',') は "1,234,567" のような文字列を返しますが、g.getpop() は "1234567" を返します。個体数に対して算術演算を行いたい場合は後者を使用してください。以下の例では、個体数を浮動小数点数に変換しています。
例:pop = float(g.getpop())
◆empty()
宇宙が空であれば True を返し、1 つでも生存セルがあれば False を返します。getpop() == "0" をチェックするより効率的です。
例:if g.empty(): g.show("All cells are dead.")
◆numstates()
現在の宇宙で使用されているセル状態の数を返します。アルゴリズムやルールにより 2〜256 の値になります。
例:maxstate = g.numstates() - 1
◆numalgos()
使用可能なアルゴリズム(Set Algorithm メニューの項目数)を返します。
例:maxalgo = g.numalgos() - 1
◆setalgo(string)
指定されたアルゴリズム名に切り替えます。文字列は Set Algorithm メニューにある名前と一致する必要があります。
例:g.setalgo("HashLife")
◆getalgo(index=current)
指定されたインデックスにあるアルゴリズム名を返します。インデックスを指定しない場合は現在のアルゴリズム名を返します。
例:lastalgo = g.getalgo(g.numalgos() - 1)
◆setrule(string)
指定された文字列に従って現在のルールを設定します。現在のアルゴリズムが指定されたルールをサポートしていない場合、Golly はそのルールをサポートする最初のアルゴリズムに自動的に切り替えます。そのようなアルゴリズムが見つからなかった場合は、エラーメッセージが表示され、スクリプトは中断されます。
例:g.setrule("b3/s23")
◆getrule()
現在のルールを標準形式の文字列で返します。
例:oldrule = g.getrule()
◆getwidth()
現在の宇宙の幅(セル数)を返します。無限であれば 0 が返されます。
例:wd = g.getwidth()
◆getheight()
現在の宇宙の高さ(セル数)を返します。無限であれば 0 が返されます。
例:ht = g.getheight()
表示コマンド(VIEWING COMMANDS)
◆setpos(x, y)
ビューポートの位置を変更して、指定されたセルが中央に来るようにします。x, y の座標は文字列で与えられるため、ビューポートは無限の宇宙内の任意の場所に移動できます。大きな数値を読みやすくするために、カンマや他の句読点を使用できます。先頭のマイナス記号を除き、ほとんどの非数字文字は単純に無視されます。アルファベット文字のみがエラーメッセージの原因となります。Golly の座標系では、正の y 値は下方向に増加することに注意してください。
例:g.setpos("1,000,000,000,000", "-123456")
◆getpos(sepchar='\0')
ビューポートの中央のセルの x, y 座標を、2 つの文字列を含む Python のタプルの形式で返します。オプションのパラメータ(デフォルトは '\0')は、結果の文字列をより読みやすくするための区切り文字を指定します。たとえば、g.getpos(',') は "1,234" および "-5,678" のような 2 つの文字列を返すかもしれませんが、g.getpos() は "1234" および "-5678" を返します。x, y の値に対して算術演算を行いたい場合は後者の呼び出しを使用してください。または、glife パッケージに定義されている getposint() 関数を使用してもかまいません。
例:x, y = g.getpos()
◆setmag(mag)
拡大倍率を設定します。0 はスケール 1:1 を意味し、1 は 1:2、-1 は 2:1 です。最大倍率は 5(1:32)です。
例:g.setmag(0)
◆getmag()
現在の拡大倍率を返します。
例:g.setmag(g.getmag() - 1)
◆fit()
パターン全体がビューポートに収まるように表示を調整します。
◆fitsel()
現在の選択範囲がビューポートに収まるように表示を調整します。選択がない場合、スクリプトはエラーで終了します。
◆visrect(rect_list)
指定された矩形がビューポート内に完全に表示されていれば True を返します。矩形は [x, y, width, height] の形式のリストでなければなりません。
例:if g.visrect([0, 0, 44, 55]): ...
◆setview(wd, ht)
ビューポート(表示ウィンドウ)のピクセル幅と高さを設定します。ウィンドウサイズもそれに応じて変更されます。
例:g.setview(3232, 3230)
◆getview(index=-1)
index = -1(デフォルト)の場合、ビューポートのピクセル幅と高さを返します。0 〜 numlayers() - 1 の整数を指定すれば、そのレイヤーのサイズを取得できます。
例:wd, ht = g.getview()
◆autoupdate(bool)
Golly がスクリプトを実行する際、この設定は最初は False になっています。指定された引数が True の場合、Golly は宇宙またはビューポートを何らかの方法で変更する各コマンドの後に、自動的にビューポートとステータスバーを更新します。Python スクリプトのデバッグに便利です。
例:g.autoupdate(True)
◆update()
現在の autoupdate 設定に関わらず、直ちに画面とステータスバーを更新します。スクリプト終了時にも常に自動で更新されます。
レイヤーコマンド(LAYER COMMANDS)
◆addlayer()
現在のレイヤーの直後に新しい空のレイヤーを追加し、そのインデックス(0 〜 numlayers() - 1)を返します。新しいレイヤーは現在のレイヤーとなり、アルゴリズム、ルール、スケール、位置、カーソルモードなど、前のレイヤーの設定を継承します。ただしステップ指数は 0 にリセットされ、選択範囲や原点オフセットはなく、レイヤー名は "untitled" になります。
例:newindex = g.addlayer()
◆clone()
addlayer() と似ていますが、新しいレイヤーは現在のレイヤーと同じ宇宙を共有します。設定も複製され、ほとんどが同期されるため、一方を変更すると他方も自動で変化します。ただしビューポートは別々なので、同じパターンを異なるスケールや位置で同時に表示できます(タイル表示時など)。
例:cloneindex = g.clone()
◆duplicate()
addlayer() と似ていますが、新しいレイヤーは現在のパターンのコピーを持ちます。設定も複製されますが、clone() と異なり同期されません。
例:dupeindex = g.duplicate()
◆dellayer()
現在のレイヤーを削除します。現在のレイヤーは 1 つ前のレイヤーに切り替わります(レイヤー 0 を削除した場合を除く)。
◆movelayer(fromindex, toindex)
指定されたレイヤーを、レイヤーリスト内の新しい位置へ移動します。移動したレイヤーが現在のレイヤーになります。
例:g.movelayer(1, 0)
◆setlayer(index)
指定されたインデックス(0〜numlayers() - 1)のレイヤーを現在のレイヤーに設定します。
例:g.setlayer(0)
◆getlayer()
現在のレイヤーのインデックスを返します。 (0〜numlayers() - 1の範囲)
例:currindex = g.getlayer()
◆numlayers()
現在存在するレイヤー数を返します(1〜maxlayers() の範囲)。
例:if g.numlayers() > 1: g.setoption("tilelayers", 1)
◆maxlayers()
最大レイヤー数を返します(この実装では 10)。
◆setname(string, index=current)
指定されたレイヤー(省略時は現在のレイヤー)の名前を設定します。
例:g.setname("temporary")
◆getname(index=current)
指定されたレイヤー(省略時は現在のレイヤー)の名前を返します。
例:if g.getname() == "temporary": g.dellayer()
◆setcolors(color_list)
現在のレイヤーおよびそのクローン(存在する場合)における、1 つ以上の状態の色を設定します。指定されたリストが 4 の倍数の整数を含む場合、それらは状態、赤、緑、青の値として解釈されます。状態値に -1 を指定すると、すべての生存状態に同じ色が設定されます(状態 0 は変更されません)。指定されたリストがちょうど 6 個の整数からなる場合、それらは r1, g1, b1 から r2, g2, b2 までの色グラデーションとして解釈され、すべての生存状態に適用されます(状態 0 は変更されません)。指定されたリストが空の場合は、すべての状態(状態 0 を含む)の色が、現在のアルゴリズムとルールに応じたデフォルトの色にリセットされます。このコマンドによって行われた色の変更は一時的なものであることに注意してください。新しいパターンを開くか作成するか、アルゴリズムやルールが変更されるか、または Preferences > Color が使用されて現在のレイヤーのアルゴリズムに対するいずれかのデフォルト色が変更されると、デフォルトの色が復元されます。
例:g.setcolors([1,0,0,0, 2,0,0,0])  # 状態 1 と 2 を黒に設定
例:g.setcolors([-1,0,255,0])  # すべての生存状態を緑に設定
例:g.setcolors([255,0,0, 0,0,255])  # 生存状態を赤から青へのグラデーションに設定
例:g.setcolors([])  # デフォルトの色を復元
※ この設定は一時的であり、新しいパターンの読み込み・作成、アルゴリズムやルールの変更、Preferences > Color から色設定が変更されるとリセットされます。
◆getcolors(state=-1)
指定されたセル状態の色を [state, R, G, B] の形式で返します。state = -1 または省略時は、全状態の色をまとめて返します:
[ 0, r0, g0, b0, 1, r1, g1, b1, ..., N, rN, gN, bN ]
ここで N = numstates() - 1。このリストはそのまま setcolors に渡すことができ、色設定の保存と復元が簡単に行えます。
例:allcolors = g.getcolors()
例:deadcolor = g.getcolors(0)
その他のコマンド
◆os()
現在のオペレーティングシステムを返します:"Windows"、"Mac"、または "Linux"。
例:if g.os() == "Mac": do_mac_stuff()
◆sound(command, soundfile, level)
オーディオファイルの再生を制御します。soundfile 引数が指定されている場合、それは再生する音声を含む WAV または OGG 形式のファイルを指していなければなりません。音量 level を指定する場合、それは 0.0(無音)から 1.0(最大音量)までの数値でなければなりません。複数の音を同時に再生することが可能です。
引数なしで関数を呼び出すと、音声サポートの状態を示す整数が返されます:
0 – 音声サポートが利用できない
1 – 音声サポートはあるが初期化に失敗した
2 – 音声サポートが利用可能で使用準備ができている
サウンドコマンドは以下の 7 種類です(音声サポートがないか初期化に失敗した場合、コマンドは何もせず無視されます):
play soundfile (level)
指定された soundfile を指定された音量で非同期に再生し、すぐに戻ります。音量が指定されていない場合は最大音量(1.0)で再生されます。
loop soundfile (level)
指定された soundfile を指定された音量で非同期に再生し、stop コマンドが使われるまでループ再生します。
stop (soundfile)
すべての音声再生、または指定された soundfile の再生を停止します。スクリプトが終了すると、すべての音声は自動的に停止されます。
pause (soundfile)
すべての音声再生、または指定された soundfile の再生を一時停止します。
resume (soundfile)
すべての音声再生、または指定された soundfile の一時停止を解除します。
volume soundfile level
すでに再生中の soundfile の音量を 0.0(無音)から 1.0(最大)で設定します。通常、再生中の音量を変更するために使用されます。
state (soundfile)
いずれかの音声(または指定された soundfile)が再生中であれば "playing"、一時停止中であれば "paused"、再生されていなければ "stopped"、soundfile が見つからなければ "unknown" を返します。
例:
g.sound("play", "beep.wav", 0.5) # beep.wav を半分の音量で再生
g.sound("play", "beep.wav") # beep.wav を最大音量で再生
g.sound("loop", "background.ogg") # background.ogg をループ再生(最大音量)
g.sound("volume", "background.ogg", 0.7) # background.ogg の音量を 0.7 に設定
g.sound("pause", "background.ogg") # background.ogg の再生を一時停止
g.sound("resume") # 一時停止中のすべての音声を再開
g.sound("stop") # 再生中のすべての音声を停止
◆setoption(name, value)
指定されたオプションに指定された値を設定します。元の値が返されるため、設定を元に戻すのが容易になります。以下はすべての有効なオプション名と、それぞれの可能な値です:
- "autofit"     1 または 0(True または False)
- "boldspacing"   2 ~ 1000(セル単位)
- "drawingstate"   0 ~ numstates()-1
- "fullscreen"   1 または 0(True または False)
- "hyperspeed"   1 または 0(True または False)
- "maxdelay"    0 ~ 5000(ミリ秒)
- "mindelay"    0 ~ 5000(ミリ秒)
- "opacity"     1 ~ 100(パーセント)
- "restoreview"   1 または 0(True または False)
- "savexrle"    1 または 0(True または False)
- "showallstates"  1 または 0(True または False)
- "showboldlines"  1 または 0(True または False)
- "showbuttons"   0 ~ 4
- "showcellborders" 1 または 0(True または False)
- "showeditbar"   1 または 0(True または False)
- "showexact"    1 または 0(True または False)
- "showfiles"    1 または 0(True または False)
- "showgrid"    1 または 0(True または False)
- "showhashinfo"  1 または 0(True または False)
- "showicons"    1 または 0(True または False)
- "showlayerbar"  1 または 0(True または False)
- "showoverlay"   1 または 0(True または False)
- "showpopulation" 1 または 0(True または False)
- "showprogress"  1 または 0(True または False)
- "showscrollbars" 1 または 0(True または False)
- "showstatusbar"  1 または 0(True または False)
- "showtimeline"  1 または 0(True または False)
- "showtoolbar"   1 または 0(True または False)
- "smartscale"   1 または 0(True または False)
- "stacklayers"   1 または 0(True または False)
- "swapcolors"   1 または 0(True または False)
- "switchlayers"  1 または 0(True または False)
- "synccursors"   1 または 0(True または False)
- "syncviews"   1 または 0(True または False)
- "tilelayers"   1 または 0(True または False)
例:oldgrid = g.setoption("showgrid", True)
◆getoption(name)
指定されたオプションの現在の値を返します。有効なオプション名の一覧については上記を参照してください。
例:if g.getoption("autofit"): g.fit()
◆setcolor(name, r, g, b)
指定された色に、指定された RGB 値(0 〜 255 の整数)を設定します。元の RGB 値は 3 要素のタプルとして返されるため、元に戻すのが容易です。以下は有効な色名の一覧と、それらの用途です:
- "border" — 有限グリッドの境界の色
- "paste" — パターン貼り付け時の色
- "select" — 選択範囲の色(50% の透明度で表示されます)
- algoname — 指定されたアルゴリズムのステータスバー背景色
例:oldrgb = g.setcolor("HashLife", 255, 255, 255)
◆getcolor(name)
指定された色の現在の RGB 値を 3 要素のタプルで返します。有効な色名の一覧については上記を参照してください。
例:selr, selg, selb = g.getcolor("select")
◆getclipstr()
クリップボードの現在の内容を、変更されていない文字列として返します。
例:illegalRLE = g.getclipstr()
◆setclipstr(string)
任意の文字列(セルパターンである必要はありません)を直接クリップボードにコピーします。
例:g.setclipstr(correctedRLE)
◆getstring(prompt, initial="", title="")
ダイアログボックスを表示し、ユーザーから文字列を取得します。initial 文字列が指定されていれば、それが表示され選択された状態になります。title 文字列が指定されていれば、それがダイアログのタイトルバーに表示されます。ユーザーがダイアログのキャンセルボタンを押すと、スクリプトは中断されます。
例:i = int( g.getstring("Enter a number:", "100") )
◆getevent(get=True)
Golly がスクリプトを実行すると、初期状態ではすべてのユーザーイベントを Golly が処理しますが、スクリプトが getevent() を呼び出すと、それ以降のイベントはキューに追加され、以後の呼び出しで取得できるようになります。これらのイベントは文字列の形式で返されます(構文については以下を参照)。キューにイベントが存在しない場合、返される文字列は空になります。最初の getevent() 呼び出しでは常に空文字列が返されますが、これは通常スクリプト開始直後に発生するため問題にはなりません。スクリプトが getevent(False) を呼び出すと、Golly はそれ以降のイベントを再び処理するようになります。flood-fill.py に良い使用例があります。
キー押下イベント(key-down events)
キーが押されたとき、またはオートリピート時に発生します。返される文字列は "key charname modifiers" の形式で、charname は '!' から '~' の表示可能な ASCII 文字、または以下のいずれかの名前になります:
space, home, end, pageup, pagedown, help, insert, delete, tab, return, left, right, up, down, f1 ~ f24。
modifiers は修飾キーで、押されていない場合は none、そうでない場合は alt、cmd、ctrl、meta、shift の組み合わせになります。なお、cmd は Mac のみで返され、コマンドキーに対応します。Mac の option キーは alt に対応します。
キー離しイベント(key-up events)
キーが離されたときに "kup charname" の形式で返されます。
マウス押下イベント(mouse-down events)
現在のレイヤー内でマウスが押された場合、"click x y button modifiers" という形式になります。x, y はセル座標、button は left、middle、right のいずれかで、modifiers は上記と同様です。
オーバーレイ内の不透明なピクセルで押された場合は、"oclick x y button modifiers" の形式になります。ここでの x, y はオーバーレイ内のピクセル位置(左上が 0,0)です。
マウス離しイベント(mouse-up events)
マウスボタンが離されたとき、"mup button" の形式になります。button は left、middle、right のいずれかです。
マウスホイールイベント(mouse wheel events)
現在のレイヤー内でホイールが使用された場合、"zoomin x y" または "zoomout x y" の形式になります。x, y はビューポート内のピクセル座標です。
オーバーレイ内の不透明なピクセルで使用された場合は、"ozoomin x y" または "ozoomout x y" の形式になります。
ファイルイベント(file events)
ファイルに関するイベントは "file filepath" の形式で返され、filepath は絶対パスです。これらのイベントは以下のいずれかでトリガーされます:
左パネル内のファイルをクリック、ヘルプウィンドウ内の "open:" リンクをクリック、Golly 関連付けファイルをダブルクリック、または Golly ウィンドウへのファイルのドラッグ&ドロップ。ファイルの処理方法はスクリプト側が決定します。
以下は、さまざまなユーザーイベントによって返される文字列の例です:
- "key m none" — ユーザーが M キーを押した
- "key space shift" — ユーザーがスペースバーと Shift キーを同時に押した
- "key , altctrlshift" — ユーザーがカンマと 3 つの修飾キーを押した
- "kup left" — ユーザーが左矢印キーを離した
- "click 100 5 left none" — ユーザーがセル (100,5) を左クリック
- "click -10 9 middle alt" — ユーザーがセル (-10,9) を中クリックし、Alt キーを押していた
- "click 0 1 right altshift" — ユーザーがセル (0,1) を右クリックし、Alt と Shift を押していた
- "oclick 10 5 left none" — ユーザーがオーバーレイのピクセル (10,5) を左クリック
- "mup left" — ユーザーがマウスの左ボタンを離した
- "zoomout 10 20" — ユーザーがビューポート内のピクセル (10,20) でズームアウト
- "ozoomin 10 20" — ユーザーがオーバーレイ内のピクセル (10,20) でズームイン
- "file /path/to/foo.rle" — ユーザーが /path/to/foo.rle ファイルを開こうとした
例:evt = g.getevent()
◆doevent(event)
指定されたイベントを Golly に渡して、通常の方法で処理させます(ただし、現在のパターンを変更する可能性のあるイベントは無視されます)。イベントは、getevent コマンドが返す形式とまったく同じ形式の文字列でなければなりません(詳細は上記参照)。文字列が空であれば、Golly は何もしません。なお、cmd 修飾子は Mac の command キー、または Windows/Linux の control キーに対応します(これにより、どのプラットフォームでも動作する移植性の高いスクリプトを書くことができます)。
例:g.doevent("key q cmd") # Golly を終了する
◆getxy()
マウスの現在のグリッド位置を文字列として返します。マウスがビューポートの外、または有限グリッドの外、あるいは半透明ボタンの上にある場合は空文字列が返されます。それ以外の場合は、x および y のセル座標がスペースで区切られた形式の文字列として返されます(例:" -999 12345")。draw-lines.py にこのコマンドの良い使用例があります。
例:mousepos = g.getxy()
◆show(message)
指定された文字列をステータスバーの最下行に表示します。必要に応じてステータスバーは自動的に表示されます。
例:g.show("Hit any key to continue...")
◆error(message)
警告音を鳴らし、指定された文字列をステータスバーの最下行に表示します。必要に応じてステータスバーは自動的に表示されます。
例:g.error("The pattern is empty.")
◆warn(message, showCancel=True)
警告音を鳴らし、指定された文字列をモーダルの警告ダイアログに表示します。Python スクリプトのデバッグやエラーメッセージの表示に便利です。showCancel が True(デフォルト)の場合、ダイアログには通常の OK ボタンに加えて Cancel ボタンも表示されます。OK をクリックするとダイアログが閉じて処理が続行され、Cancel をクリックするとダイアログが閉じられてスクリプトが中断されます。
例:g.warn("xxx = " + str(xxx))
◆note(message, showCancel=True)
指定された文字列をモーダルの情報ダイアログに表示します。複数行の結果表示に便利です。showCancel が True(デフォルト)の場合、ダイアログには通常の OK ボタンに加えて Cancel ボタンも表示されます。OK をクリックするとダイアログが閉じて処理が続行され、Cancel をクリックするとダイアログが閉じられてスクリプトが中断されます。
例:g.note("Line 1\nLine 2\nLine 3", False)
◆query(query, message, labelYes="Yes", labelNo="No", labelCancel="Cancel")
指定されたクエリ文字列とメッセージ文字列を表示するモーダルダイアログを表示し、カスタマイズ可能なラベルを持つ 2 つまたは 3 つのボタンを表示します(デフォルトは Yes、No、Cancel)。labelCancel が "" の場合、Cancel ボタンは表示されません。Cancel ボタンがある場合、Esc キーで選択できます。labelYes のボタンは常にデフォルトボタンであり、Enter/Return キーで選択できます。選択されたボタンのラベルが返されます。
例:
option = g.query("Choose an option?", "Select Cancel for neither option.", "1", "2")
# option は "1"、"2"、または "Cancel" のいずれか
answer = g.query("Try again?", "The default answer is No.", "No", "Yes", "")
# answer は "Yes" または "No"
◆check(bool)
Golly がスクリプトを実行する際、この設定は初期状態で True になっており、イベントチェックが有効です。指定されたパラメータが False の場合、イベントチェックが無効になります。これは通常、タイミングの悪いマウスクリックなどを無視したいときに使用されます。この設定は短時間のみ無効にするようにしてください。なぜなら、この設定が False の間はスクリプトを中断することができないからです。
例:g.check(False)
◆exit(message="")
オプションのエラーメッセージと共にスクリプトを終了します。非空の文字列が指定された場合、ステータスバーにメッセージが表示され、警告音が鳴ります(これは error コマンドと同様です)。メッセージが指定されないか空文字列の場合、警告音は鳴らず、ステータスバーのメッセージも変更されません。
例:if g.empty(): g.exit("There is no pattern.")
セルリスト
いくつかのスクリプトコマンドは、パターンをセルリストの形式で操作します。Golly は 2 種類のセルリストをサポートしています:one-state(単一状態)と multi-state(多状態)です。
one-state セルリストは偶数個の整数を含み、各セルの x, y 座標を指定します。すべてのセルは状態 1 にあると見なされます:
[ x1, y1, . . . xN, yN ]
multi-state セルリストは奇数個の整数を含み、各セルの x, y, state を指定します。セルの数が偶数の場合は、リスト全体の整数数を奇数にするために末尾にパディングの整数(ゼロ)が追加されます:
[ x1, y1, state1, . . . xN, yN, stateN ] (N が奇数の場合)
[ x1, y1, state1, . . . xN, yN, stateN, 0 ] (N が偶数の場合)
セルリストを入力とするすべてのスクリプトコマンドは、リストの長さを使ってその型を判別します。multi-state セルリストを扱うスクリプトを書く際には、特にリスト内のセルにアクセスする場合に、パディング整数の存在を考慮する必要があるかもしれません。tile.py にその例があります。
すべてのスクリプトコマンドは、結果としてセルが 1 つもない場合、必ず [] を返します。[0] が返されることはありませんが、これは完全に有効な multi-state セルリストであり、すべてのコマンドで入力として使用できます。たとえば、newlist = g.join(list1, [0]) を使えば、非空の one-state リストを multi-state に変換することができます。
one-state セルリストは通常、2 状態の宇宙で使用されますが、2 状態以上の宇宙でも使用できます。multi-state セルリストは、セル状態が 0 または 1 の場合に限り、2 状態の宇宙でも使用できます。
どちらの型のリストでも、セルの並び順に意味はありません。また、Golly の座標系では y の正の値は下方向に増加することに注意してください。
矩形リスト
いくつかのコマンドは、矩形をリストの形式で操作します。空の矩形は、要素を含まないリスト(つまり [])で示されます。空でない矩形は、4 つの整数を含むリストで示されます:
[ left, top, width, height ]
最初の 2 つの要素は、矩形の左上隅にあるセルを指定します。残りの 2 つの要素は、矩形のサイズ(セル単位)を指定します。width と height は 0 より大きくなければなりません。
glife パッケージの使用
Scripts/Python フォルダに含まれている glife フォルダは、Golly のスクリプトコマンドのいくつかに対して高水準のインターフェースを提供する Python パッケージです(これは PLife に含まれている Eugene Langvagen の life パッケージに基づいています)。スクリプトが glife またはそのサブモジュールをインポートすると、Python は自動的に __init__.py モジュールを実行します。このモジュールでは、pattern クラスおよび rect クラスの定義に加え、便利な同義語や補助関数が多数定義されています。たとえば、次のスクリプトを見てください:
from glife import *
blinker = pattern("3o!")
blinker.put(1, 2)
blinker.put(6, 7, rcw) # rcw は rotate clockwise(時計回りに回転)を意味する
これは、glife を使用しない場合、次のように書くことができます:
import golly as g
blinker = g.parse("3o!")
g.putcells(blinker, 1, 2)
g.putcells(blinker, 6, 7, 0, -1, 1, 0)
以下は glife で定義されている補助関数の一部です:
- validint(s) — 指定された文字列が有効な整数であれば True を返す
- getposint() — ビューポートの位置を 2 つの整数のタプルとして返す
- setposint(x, y) — 指定された整数を使ってビューポートの位置を設定する
- getminbox(patt) — 指定されたパターンの最小バウンディングボックスを返す
提供されているほとんどの Python スクリプトは glife をインポートしていますが、それは必須ではありません。自分のスクリプト用に独自の高水準インターフェースを作成することもできます。
潜在的な問題
1. Python インタープリタのメモリアロケータは、必ずしも使用済みメモリをオペレーティングシステムに返すとは限りません。複雑またはバグのあるスクリプトを実行して大量の(Python の)メモリを使用すると、そのメモリは Golly では利用できなくなります。そのため、Golly を終了して再起動する必要があるかもしれません。
2. 特定のモジュールをインポートするスクリプトを最初に実行したとき、Python インタープリタはその結果をキャッシュし、次回そのモジュールがインポートされた際には再読み込みを行いません。これは効率の面では優れていますが、インポートされたモジュールを修正して、その変更をテストしたい場合には問題になります。1 つの解決策は Golly を終了して再起動することです。もう 1 つの解決策は、次のような行を各スクリプトの先頭に追加して、モジュールの再読み込みを強制することです:
import mymodule;reload(mymodule)
モジュールが安定したら、reload コマンドを削除またはコメントアウトできます。
3. 実行中のスクリプトを中断するための Escape キーのチェックは Python によって行われるのではなく、Golly の各スクリプトコマンドによって行われます。つまり、非常に長い Python 計算を行う場合には、スクリプトが適時に中断できるように g.doevent("") のような「何もしない」コマンドを時折呼び出す必要があります。
4. パターンを作成するスクリプトを書く場合、そのスクリプトの冒頭で new を呼び出すようにしてください(あるいは、あまり有用ではありませんが open でパターンを読み込む、または save で保存することも可能です)。そうしないと、スクリプトが大量の一時ファイルを作成したり、大量のメモリを使用したりする可能性があります。Golly の観点では、スクリプトには次の 2 種類があります:
- new、open、または save を呼び出すスクリプトは、何らかのパターンを「作成」していると見なされます。Golly はこれらの呼び出しを検出すると、アンドゥ履歴をクリアし、「このレイヤーは変更済みと見なさず、以降の変更は記録しない」という内部フラグを設定します。
- new、open、または save を呼び出さないスクリプトは、現在のパターンを「変更」していると見なされます。Golly はスクリプトによるすべての変更を記録しておく必要があるため、スクリプトの終了後に Edit メニューから「Undo Script Changes(スクリプトによる変更を元に戻す)」を選択できるようになります。run や step の呼び出しによる生成的変更は一時ファイルに記録され、それ以外の変更はメモリ内に記録されます。
Python 著作権表示
Golly はスクリプトを実行するために組み込みの Python インタープリタを使用しています。Python のライセンス契約は Golly の LICENSE ファイルに含まれています。以下は公式の Python 著作権表示です:
`opyright (c) 2001-2020 Python Software Foundation.
All Rights Reserved.
Copyright (c) 2000 BeOpen.com.
All Rights Reserved.
Copyright (c) 1995-2001 Corporation for National Research Initiatives.
All Rights Reserved.
Copyright (c) 1991-1995 Stichting Mathematisch Centrum, Amsterdam.
All Rights Reserved.
#ライフゲーム
#Golly