Wings3D Memo for developer side

Wings3D関係のメモ(主に開発者向け)です。
Wings3dに、Erlangからcompileモジュールのファイルを、Wings3dのソースからwings.hrlのヘッダを持ってこれば,WindowsでもMacOSでも、大掛かりなインストールなしでWings3d/Erlangモジュールの開発環境が整います。
閲覧補助機能: bookmark[+]で現在の表示位置をいくつか記憶できます、また参照先としてhogehoge.html?line=10000でアクセスすると10000行目の位置を表示できますが、長期的な参照には向きません。(※行数が増減すると参照位置も変動するため)

はじめに

Wings3Dのプラグインを作るにはどうすればいいか...という書きかけの内容です。

この文書の目的 ★Wingsfontの作成法について、さらにまとめたもの
予備知識1:この開発者向けメモの内容 及びフォーラムの情報
予備知識2:Exploring Wings3D through the Erlang ShellWings3dの仕組みをErlangShellを通して調べてみよう (英語,Erlang言語)
を読んでおくと理解が進むかもしれません。
wings3dとプラグインとフォント作成方法について
How to make plugin and wingsfont?

★解明したいこと
・メニュー登録方法(メニューの意図した場所に入れるには...?)
・コマンド発動のトリガー
・GUIの構築方法&自身にパラメータを投げる仕組み

プラグインの構造
・保存系プラグイン(objとか任意のフォーマットで保存)(海外の方がwpc_ex.erlという形で公開しているものがある。)
・コマンド系プラグイン(オブジェクトを加工する2ndaySelectionを持つコマンド系プラグイン、解説がほとんどない)
・プリミティブ系プラグイン(特定の立体を生成するタイプ)

参考サイト

ユーザー向け 開発者向け

テスト版、開発中断プラグイン

これらは様々な人によって、Erlangの学習・Wings3dプラグインの作成や実験のために作られた物です。プラグイン作成の参考になるかもしれません。
使用には充分注意し、開発途上版なので予期せぬ不具合が発生することもあります。頓挫していたり、引き継ぐ人がなく開発が中断しているものもあります。
Newbie Programmer Plugin help in PROGRAMMING Forum
Wings3d Coding Guildeline要約してみました。(日本語)

バージョン履歴

Wings3dの開発は10年くらい掛けて緩やかなペースで進められてきました。
最新版では、古いWings3D v0.80,v0.92以前で作成したWings形式のファイルは読込めないようです

Wings3D v1.5.3 (2014-04-13) Erlang/OTP 17.0を使用,様々なバグフィクス,機能追加少々。
Wings3D v1.5.2 (2013-11-16) Windows環境でユーザー名にUnicode含まれていて起動が失敗する問題を解決との事。
Wings3D v1.5.1(2013-10-14) 入力結果のプレビュー機能の追加(リアルタイム更新/数値を入力後に更新/手動更新を選べる)他インターフェースの改善。
Wings3D v1.4(2011-02-05) インターフェースや処理の改善、スカルプトモード追加、Tweakモードのコアモジュール化
Wings3D v1.3.1 からMacOS X10.5.8以降 Intel Mac のみの対応です。 
Wings3D v1.3.2でCJKフォントとエンコーディングに対応。
Wings3D v1.2(2010-01-17) いくつかの変更。以降で Wings3D 1.1.7以前のWings形式ファイルを読込んだ場合、オブジェクトモードの頂点属性が無視される
Wings3d v1.1 (2009-06-27)以降、辺や頂点データの格納には gb_treeではなくarrayを使用しています。古い情報をあたるときは注意してください。
Wings3d v1.1 (2009-5-17)ではエッジデータをarray で管理することになった。
Wings3d v1.1.xy(2009-5-23〜)では 面と頂点のテーブルをarray で管理することになった。
Wings3d v1.0(2009-05-17) 正式リリース

Wings3d v0.99.60(2009-04-25)
Wings3d v0.99.53(2008-11-xx) Installer only support Windows 2000 later(98/ME 非対応), Kerkythea plugin追加
Wings3d v0.99.00(2007-12-15) Added more Shader(toon brick enviroment etc),ISO-8859-9 font support
WindowsXP(SP2),OSX 10.4-PPC/10.5(Intel)
Wings3d v0.98.36(2006-11-22) Support Universal binary on Mac version
Wings3d v0.98.27(2005-01-14)
Wings3d v0.98.00(2002-11-02)
Wings3d v0.90(2002-01-29)
Wings3d v0.80(2001-10-19)最初のバージョン

Wings3dは、IZwareの作ったNendo, Miraiという3D統合ソフト(2Dペイントやアニメーション機能もある)に影響を受けて開発されました。

さらに、Lisp:Geometry (日本語)の記事によれば、Wings3dの先祖は Nend, Mirai 、それより遡れば Nicimen Geometry、元祖は Lispで書かれたモデリングツールまで行き当たるようです。
フォーラムの書き込み(#1, deerwood氏)によると...
  1. Wings3dは v1.4.1現在、 Erlangによる並列/マルチプロセスアプリケーションではない。(例外として、マルチプロセスとしてのプログレスバー処理は存在する)そのためメッセージをWings3dへ送るより、関数を呼び出す形で処理を行うことになります。

  2. 全体的なイベントの呼び出しはOSを経由しESDLまたはその他へ委ねられている。例えばモーダルダイアログが表示されている間、Wings/ErlangはOSから委ねられた一部のルーチン制御するために、ユーザーによるインタラクション(たとえばマウスクリックなどの入力)が発生するまで待機しづつける そして、ユーザーからの入力が行われると、再びWings/Erlangはアクティブになり、OSのイベントまたは何か(実装者がフック定義をしている場合)が処理します。

  3. また注意すべきことは、あらゆるイベントの発生後にはダイアログを再表示する必要があります。 それは ESDLからのユーザーの入力結果を使用して(OK/Cancel)選択肢で停止させたままという意味ではなく、定型的に末尾再帰(tail recursion)するなどして、 パラメータを、新規の状態データによってダイアログを完全に再構築してください。



これから、Wings3dを ErlangShell(実際の動作)と ソースコード の2つの視点で見ていきます。

Wings3dをErlangShell視点で見る


Wings3Dというアプリケーションは Erlang という関数型プログラミング言語で作られています。

MacOSX版の構成
  • Wings3D Loader ........ 起動時に読込まれる。
  • Beam ........  Erlang仮想マシン。Erlang言語でかかれたソース変換やアプリの実行担当。
  • ESDL ......... Erlang 用のSDLライブラリ: キーボードやマウス入力、GUIインターフェースなど担当?
  • Wings3D....アプリケーション


  • BEAM (Bogdan's Erlang Abstruct Machine)とはErlang言語の仮想マシンと呼ばれるものの1つです。
    コマンド入力で対話するための Erlang Shell はこれをエミュレートして動作するそうです。


    仮想マシンBEAMは、Erlangで書かれたソースコード hoge.erlをBEAMで実行可能な hoge.beam にコンパイル(変換)したり、実行をサポートするようです。(各.erlファイルは、モジュールと呼ばれます。)

    Wings3dのバイナリ版は、既に.beamファイルに変換済です。これらが実行されることで、アプリケーションが起動するようです。
    このとき、仮想マシンBEAMも.beamファイルの実行のために働くようです。

    Wings3Dは、オブジェクトの頂点や辺などのデータをウイングドエッジデータ構造として管理しています。
    Wings3Dの内部構成についての、日本語の情報はyst memoさんが詳しいです。

    Erlang言語って何?

  • Wikipedia - Erlang
  • Erlang land (日本語)Erlangの基本的な使い方の情報があります。基本構文、データ構造、関数の書き方、beamファイルの作り方、パターンマッチ
  • Erlang クエックブック(日本語) より高度な内容
  • Erlang World(日本語)インストール方法から、並列処理まで色々
  • 参考文献:『プログラミング言語 Erlang入門』,柏原正三著, ASCII


  • また、Wings3d本体には、Erlang言語をすぐに試せる、Erlang Shellが組み込まれています。
  • How To Write Wings3D Plugins (for beginners) プラグインの作り方
  • Exploring Wings3D through the Erlang Shell Wings3Dと Erlang Shellを起動し、Wings3D内部の情報を見たり弄ったりする方法。
    Erlang shell上で、Wingsの編集状態や辺や面の選択領域を加工するには、Wings3Dのソースコードをダウンロードしてwings.hrl(ヘッダファイル)を入手して、読込ませる必要があります。
  • ErlangShellとモジュールファイルの違い

    ※ここで注意しないといけないことがあります。

    ErlangShellで対話する時 と モジュールファイル(xxx.erl)としてプラグインを書く時に、
    同じことをするのに命令/関数が違ったり、ErlangShell独特の書き方あったりします。これは日本語における書き言葉と話し言葉の違いみたいなものです。

    たとえば、ErlangShellでは、rr(wings)命令 なのが、モジュールでは -include("wings.hrl").と書いたりします。

    また、チュートリアルのExploring Wings3D through the Erlang ShellではErlangShell上から レコードstの情報を St としてゲットするのにwpa:get_state()を利用しています。

    しかし実際には、プラグインのソースコードを検索してもwpa:get_state()は現れません。おそらくWingsコア側が既にこの情報を持っていて、プラグインへ送るのでwpa:get_state()を使って明示的に取得する必要がないのかもしれません。

    プラグインモジュールの場合は、モジュール内にあるcommand()関数が、Wingsのコアから レコードstの情報 St を受け取るようになっています。

    Erlang Shellを準備する。Erlang言語を試す。

    Wings3Dのパッケージ中には、もうコンパイル済のErlangShell環境が内包されているので、手っ取り早くそれを使う事にします。
    ※Erlangコンパイラは入ってません、yst memoさんの記事を参考に試したところ、
    Erlang R13bの場合は本体をダウンロードして/Desktop/otp_src_R13B04/lib/ 内にある compiler というディレクトリを
    Wings3D1.2.app/Contents/Resources/lib ディレクトリへコピーすると、Wings3DのErlang Shellでも c()モジュールが使えるようになります。
     
    なお、今回は.erlファイルを.beamファイルにコンパイルしたりしないので、OSに ErlangやESDLのインストールはしません
    ターミナル上で、bashに一時的にPathを通せば、Erlang Shellを通してWings3Dと対話することができます。(MacOSX10.4.11 PPCの場合)
    bash
    export ROOTDIR="/Applications/Wings3D 1.2.app/Contents/Resources"
    export BINDIR=$ROOTDIR/bin
    export ESDL_DIR=$ROOTDIR/lib
    export EMU=beam
    export PROGNAME=`echo $0 | sed 's/.*\///'`
    exec "$BINDIR/erlexec" -run wings_start start_halt ${1+"$@"}
    
    するとWings3Dが起動します。またTerminal 上ではErlang Shellが起動します。また、これを終了するにはq().と入力します
    もし
    erlexec: Error 2 executing '/Applications/Wings3D 1.2.app/Contents/Resources/bin/beam.smp'.
    このようなエラーが出た場合、実行ファイル、/Applications/Wings3D 1.2.app/Contents/Resources/bin/にある「beam」の複製を同じディレクトリに作って、 複製したファイル名を「beam.smp」にして、もう一度挑戦してみて下さい。 (MacOSX10.5.8 Intelの場合)


    Erlang言語で、標準で使えるモジュールおよび関数を使えば、Shell上から何か試すこともできます(Hello World!!とか)。
    Erlang Shellでは最初からユーティリティとして使える内部コマンドのほか、 モジュールCコマンド( c:ls() , c:cd()など 互換ぽい機能?)があります。

    Erlangでディレクトリリストを表示するプログラムを作るより、これらユーティリティを使いましょう。
    カレントディレクトリ、標準出入力、環境変数等を確認したりできます。
    Erlangプログラムやコマンドの最後は、必ずピリオド「.」で終わることになっています。
    環境変数の表示
    os:getenv().
    
    Hello Worldを出力(※ioモジュール;fwrite関数)
    io:fwrite("Hello World!!\n").
    
    カレントディレクトリのpathを表示(※fileモジュール;get_cwd関数)
    file:get_cwd().
    
    カレントディレクトリのpathを表示(※Cモジュールコマンド)
    pwd().
    
    カレントディレクトリをデスクトップに変更(※Cモジュールコマンド)
    cd("./Desktop").
    
    カレントディレクトリ内のファイルを表示(※Cモジュールコマンド)
    ls().
    
    全ての束縛変数を破棄する。(※内部コマンド)
    f().
    
    Erlang Shell を終了する場合は次の内部コマンドを使って下さい(Wings3Dも一緒に終了します)。
    q().
    
    入力しても反応がなくなってどうしようもなくなった場合、CTRL+C でErlangShellを強制終了できます。
    また、CTRL+Cで次のようなリストが表示された場合 a を押して改行キーで終了できます。
    BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
           (v)ersion (k)ill (D)b-tables (d)istribution
    
    Wings3Dと対話する場合は次の説明を見て下さい。

    Erlang Shell でWings3Dと対話する その1


    Exploring Wings3D through the Erlang Shellにあった例で、で結果を表示できたもの↓
    rr("c:/erlang/wings/src/wings.hrl")を利用しないタイプのプログラムであれば、Wings3Dのヘッダファイルを用意しない状態でも結果を得る事ができます。



  • Non-State Functions (Wings3dの状態を出力)
  • Modifying Objects(オブジェクトの頂点情報)
  • Hotkeys List to HTML Table を実行した時の結果(ホットキー(ショートカット)情報をHTML形式で書き出す)↓



  • Erlang Shell でWings3Dと対話する その2

    Exploring Wings3D through the Erlang Shellの例にはヘッダファイルwings.hrlが必要なものもあります。
    このファイルはWings3Dのソースコードに含まれています。
    入手するにはWings3Dの公式ページから Source のリンクを辿ってダウンロードしてください。
    wings.hrlは、解凍したディレクトリの中のsrcディレクトリの中に入ってます。

    このwings.hrlというファイルを任意の場所にコピーして下さい。
    例題プログラム中にある rr("c:/erlang/wings/src/wings.hrl")のファイルパス部分をwings.hrlのあるパスに置き換えれば、動作します。

    たとえばファイルをデスクトップに置いてそこから読込みたい場合は
    /Users/ユーザー名/Desktop/wings.hrl

    Wings3Dの中に置く場合は
    /Applications/Wings3D 1.2.app/Contents/Resources/wings.hrl

    に変更するとよいでしょう。


    Wings3dで、選択している頂点(2つ以上)の座標を取得するプログラム「Vertex Selection Example」を試した結果
    最初にWings3Dのほうで立方体を出現させ、頂点を選択しておいてから、これを実行します。



    起動しているErlangプロセスを表示することもできます

    Erlang Shellでの やり方
    f(),i().
    を試してみると、Wings3dのErlang Shell 起動直後には20位のErlangプロセスが立ち上がっていることがわかります。
    ※しかしこれらはWings3dのプロセスではなく、おそらくErlangVM関連だと思われます。(Wings3d自体はErlang並列処理アプリケーションではないため)

    wings.erlの最初はどうなってるの?

    少し寄り道、プロセスからコードへ目を向けてみます。
    Wings3d と エラーログ書き出しについて考察。

    ProcessID ---- Registered name
    <x,x,x>----- init          otp_ring0:start/2 init:loop/1
    <x,x,x>----- wings         erlang:apply/2 wings_io_sdl:wait_for_event/1 erlang:apply/2

    さっき挙げたプロセスの中から2つのピックアップします。wings.erl ソースを見ると、この2つの発生源を伺えます。 start/2 関数と、do_spawn の spawn_option 動的に関数を呼び出す apply()関数を見つけることができでしょう。 これらはErlag備え付けの、erlang:spawn()またはspawn_opt()関数により発生していると思われます。
    また、init()関数内での最初でregister()関数により自らのプロセスIDを「wings」と関連づけてもいます。

    Wings3dはモジュールが沢山あり複雑にみえますが、最もコアな部分であるwings.erlモジュールの最初の部分を読んでみると、 次のような仕組みになっているようです。
    ・Wings3dはサーバープロセス(親)を立ち上げ、次に関連プロセス(子)を発生させる。
    ・サーバーはそれらの動作を監視していて、関連プロセスが、なんらかのメッセージをシグナルとして返してきたらサーバーは捕捉する
    ・「シグナル処理のカスタマイズ」をしているので、エラーを捕捉した場合は、エラーログとしてそれを書き出す。
    これがどういうことかは、次のサイトの解説がわかりやすく、とても助かりました。
    Wings3dは「シグナル処理のカスタマイズ」をしている典型的なアプリケーションといえるでしょう。
    分かってきたこと
    ・wings.erlモジュールではプロセスの終了を監視している。また、init();では、様々な機能を初期化している模様。
    ・それに続いて、キーボード、マウス、メニュー等のイベントハンドラ関連の関数が動き出すようです。
    ・最終的には、ユーザーの動作がイベントハンドラによって伝えられ、プラグインの関数に渡されたパラメータがマッチすれば、それぞれの処理が実行されるようです。

    wings.erlはプラグインを作ろうとする場合、触れることは一切ありませんが、Wings3dの全体の動きを知ったり、他のErlangアプリケーションを作ったり する時の参考にはなるかもしれません。

    次は、ソースコードを見てみましょう。

    Wings3dをソースコード視点で見る

    ソースを読むためのメモ

    これらは、Wings3dのソースを読むために調べたものですが、試してなかったり、環境によってうまくいかない事もあると思います。
    まず、仕様が書かれたモジュールのファイルが、解凍ディレクトリの構成のどこにあるか情報が足りないです。

    各ファイルの構成及び、プラグインモジュールがアクセス可能な分野は、次のような図で表せます。 ●Wings3dではプラグインを作成できるような仕組みが用意されています。まずはそこをを見てみよう。 解凍ディレクトリ内にあるソースのファイル構成を知る      ↓ Erlangの解説書/サイト,Wings3dの開発フォーラム等の情報      ↓ Wingsで扱うデータ=レコードの構造を知る(.hrl) src ディレクトリ以下にあるファイルに仕様が書いてあるので読む。      ↓ Wingsコア,E3dモジュールにどんなAPIが用意されているか調べる      ↓ 各プラグインで使用例を探す (※複数ファイルを一括で検索するような手段で) ●Wings3dのプラグインのサンプル wpc_ex1.erl を読むのがおすすめ。 作者による説明がたっぷりあり、init , menu , command 関数などの役割が判明します。 これら関数はほぼすべてのプラグインのコードに存在して、プラグインの制御を担ってます。 ●Internal function, Local Fanction 外部からアクセスする必要のない内部処理がかかれているので、 使う目的だけの場合、読む必要はあまりない。

    Wings3d ソースコードファイルの格納先

    ●内容
    Wingsx.x/src-------------------Wingsコアモジュール
    Wingsx.x/e3d ------------------e3dモジュール
    Wingsx.x/plugins_src-----------各種プラグイン
    
    ●srcには、コアモジュールwings_****.erl で始まるファイルがあります。
    Wingsの基本的な機能(移動、回転、拡大縮小等)はここに集約されています。
    また、 はプラグインモジュールの最初の方でincludeする。wings.hrl
    拡張子.hrl のファイルにデータ構造が定義されている事が多い。
    
    
    ●e3dには、e3dモジュール e3d_***.erlのファイルがあり
    数学(ベクトル、行列)や2D画像、出入力関連を担当します
    
    ●plugins_srcには主に第三者から提供されたプラグインが入ってます。
    
    ●Wings3dのダイアログやGUI構築関連
    
    • src/wings_wpa.erl -- プラグインAPI。プラグインを書くときの機能の窓口担当。         このwpaモジュールを通じてGUIを記述した場合、          wings_askやそのほかのモジュールへ渡される仕組みになっている。
    • src/wings_ask.erl -- 詳細なダイアログ使い方と仕様が書かれてる。内容はこの文書内で後述します。          GUI部品を構築する関数が定義されている。          より専門的にGUIを記述する場合 wings_ask.erl) モジュールを呼び出して使います。
    • plugins_src/wings_test_ask.erl -- ダイアログの使い方の具体例。 enable();を使うと有効らしい。
    • src/wings_drag.erl -- インタラクティブなコマンドのためのモジュール
    • src/wings_io.erl -- 他のライブラリやソフトと連携するための出入力に用いるらしい。          (Wings3dのプラグインが外部ライブラリと連携している 例:Manifold-LabがQhull Libraryを利用)
    ★wpa:askで簡単に(モーダル)ダイアログを作成 ★wpa:askよりも柔軟にダイアログを設計する場合は次の情報を参考に...

    プラグインの種類

    src/wing_plugin.erl によると
    プラグインのファイル名には命名ルールがあって、3つのタイプが定義されています。
    3種類のプラグインが作れるようです
    
    wp*_example.erl
    
    このようなファイ名の * にあたる文字でプラグインの種類が分かります。
    	c    一般的なコマンド拡張プラグイン Command extension plugin-in.
    	8   外部ユーザインターフェースプラグイン  External user-interface plugin.
    	9   デフォルトユーザインターフェースプラグインDefault user-interface plugin.
    
    ファイル出入力、コマンド(メニューバーと右クリックメニュー)、プリミティブ作成プラグイン。
    wpc_circlarise.erl ,  wpc_obj.erl , wpc_cube.beam ,  wpc_bend.beam など
    
    
    その他のものは、OSネイティブのダイアログを構築する為のプラグインに用いられます。
    plugins_src/wp9_dialogs.erl  例:一般的なダイアログのためのプラグイン
    
    plugins_src/win32_file/wp8_file.erl 例:Win32ネイティブなファイルダイアログボックス
    plugins_src/wx_file/wp8_file.erl 例:Win32ネイティブなファイルダイアログボックス(wxヘッダ使用)
    plugins_src/qt_file/wp8_qt_file.erl 例:UnixのQtによるダイアログ
    plugins_src/mac_file/wp8_mac_file.erl 例;MacOSXのダイアログ
    plugins_src/jpeg/wp8_jpeg_image.erl 例:jpegの出入力
    
    wp8とwp9は、OSのインターフェースに関するものなので、
    Wings3dに関する一般的なプラグインを作ろうとする場合は、
     c のwpc_で始まるファイル名のプラグインとして、作ることが
    多いと思います。
    

     

    レコード(Wings.hrl)

    Erlangのレコード(C言語の構造体のようなもの)
    Erlangではデータ型も、型関数として存在していて、そのデータがどんなデータを扱うのかを説明しています。
    これはAPIがどのデータを受け渡し加工するのがわかるので、ソースを読み解く手がかりになります。
    
    型関数は、英小文字から始まって括弧()で終わる関数です。term()はすべての型をとる
    
    参考:
    Erlang -- Types and Function Specifications
    Erlangの型記法(Type Notation) - 檜山正幸のキマイラ飼育記
    
    
    -type edge_num() :: non_neg_integer().
    edge_num() という型は、正の整数型をとる。
    
    
    gb_tree は 一般的な木構造データ。キーとデータの組をとる。データの追加/削除/検索を想定している。
    Erlang -- gb_trees
    
    以下wings.hrl より
    
    %%
    %% Types. 型 
    %%
    
    
    %この型は、あとのレコードにも適用される
    % http://www.erlang.org/doc/reference_manual/typespec.html
    
    % number()  はinteger() または float() 
    %integer() は (〜-1 , 0 , 1〜)
    % non_neg_integer() は(0〜)
    %  pos_integer() は (1〜)
    % neg_integer()は(〜 -1)
    
    % 頂点数 vertex_num() は 正の整数(non_neg_integer)をとる。(0〜)
    % 辺の数 edge_num() は 正の整数(non_neg_integer)をとる。(0〜)
    % 面の数 face_num() は 整数(integer)をとる。(〜-1 , 0 , 1〜)
    % 表示可能な面の数 visible_face_num() は 正の整数(non_neg_integer)をとる。(0〜)
    % 要素の数elem_num()は 正の整数(non_neg_integer)をとる。
    
    -type vertex_num() :: non_neg_integer().
    -type edge_num() :: non_neg_integer().
    -type face_num() :: integer().
    -type visible_face_num() :: non_neg_integer().
    -type elem_num() :: vertex_num() | edge_num() | face_num().
    
    % 選択モードのフラグ sel_mode()は 'vertex' | 'edge' | 'face' | 'body' のいずれか。
    % バウンディングボックスは、3つのfloat型のリストをとり、xyz各々の寸法値を表す。
    
    -type sel_mode() :: 'vertex' | 'edge' | 'face' | 'body'.
    -type bounding_box() :: [{float(),float(),float()}].
    
    % コマンド wings_cmd() は アトムまたは、タプルをとる。
    % コマンド maybe_wings_cmd() は wings_cmd() または アトム' ignore'をとる
    -type wings_cmd() :: tuple() | atom().
    -type maybe_wings_cmd() :: 'ignore' | wings_cmd().
    
    %頂点バッファwings_vtx_buffer() は 何もないアトム 'none' または、 整数とバイナリデータの組の タプルをとる
    -type wings_vtx_buffer() :: 'none' | {integer(),binary()}.
    
    
    %% State and records
    %% Main state record containing all objects and other important state.
    
    
    % レコード st は  編集状態とオブジェクト情報を格納します
    % 全オブジェクトと 編集状態(ファイル名、直前のコマンドのパラメータ、選択領域、バウンディングボックス、アンドゥ情報など)です。
    
    
    -record(st,
    	{shapes=gb_trees:empty() :: gb_tree(),	% 表示されている全てのオブジェクト(デフォルトは空のBツリー) 
    	 selmode=face :: sel_mode(),		% 選択モード (デフォルトは face[辺選択モード])
    	 sh=false :: boolean(),			% ハイライトがアクティブになっている。.
    	 sel=[],				% 現在選択中の領域 : 中身は、IDとGBsetの組のリスト  [{Id,GbSet}] 
    	 ssels=gb_trees:empty() :: gb_tree(),   % 保存された選択領域 (デフォルトは空のBツリー) 、
    	 % ユーザーはメニューから選択領域を登録しておき 呼び出して使うことができる。
    
    	 %% 一時的な選択領域 かどうか?  これは アトム'none' または {選択モード, 真偽値値}のタプルをとる。 (デフォルトは none)
    	 temp_sel=none :: 'none' | {sel_mode(),boolean()},
    
    	 mat=gb_trees:empty() :: gb_tree(),	% 定期済みのマテリアル (GbTree, デフォルトは空のBツリー).
    	 pal=[],                                % パレット
    	 file,					% 現在編集中のファイル名
    	 saved=false :: 'false'  | 'true' | 'auto' | integer(), % 保存フラグ,してない|した|自動セーブ|整数値 のいずれかをとる。(デフォルトは false)
    	 onext=1 :: pos_integer(),		%次のオブジェクトで使うためのID (デフォルトID=1) (1〜)
    
    	 %% 保存済みのバウンディングボックス(AutoUVは それ自身の目的により、したがって型にもタプルが許容されます。
    	 %% バウンディングボックスは、 none または bounding_box() または タプルをとる。(デフォルトはnone)
    	 bb=none :: 'none' | bounding_box() | tuple(),
    
    	 edge_loop=none,			%一つ前の辺ループ (デフォルトはnone)
    	 views={0,{}},				% 現在表示されているもののタプル   {Current,TupleOfViews}
    	 pst=gb_trees:empty() :: gb_tree(),     % プラグイン状態の情報
    						% gb_treeの  キーはプラグインモジュールです。(デフォルトは空Bツリー)
    						
    	 %% 直前に実行された(複数の)コマンド
    	 repeatable=ignore :: maybe_wings_cmd(), % 最後に実行したコマンドでリピート可能なコマンド
    	 ask_args,				% ユーザーがコマンド実行中にtabキーを押して出す、Ask ダイアログ で入力した値(移動距離、回転角度など)
    	 drag_args,			        % ユーザーがコマンド実行したドラッグによる変位量(移動距離、回転角度など)
    
    	 %% デフォルトコマンド (LMB, RMB).
    	 def={ignore,ignore} :: {maybe_wings_cmd(),maybe_wings_cmd()},
    
    
    	 %% アンドゥ情報
    	 last_cmd=empty_scene,		        %最後に実行したコマンド(デフォルトは、空のシーン)
    	 undo=queue:new() :: queue(),		%アンドゥー用の(デ)キュー (デフォルトは 新規作成状態)
    	 next_is_undo=true :: boolean(),	% フラグ; アンドゥー/リドゥー状態のトグル(デフォルトはtrue)
    	 undone=[] :: list()		        % アンドゥー用の複数の状態
    	}).
    
    %% ウイングドエッジ構造データ(The Winged-Edge data structure)
    %% See http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/model/winged-e.html
    -record(we,
    	{id :: non_neg_integer(),		%Shape id (シェイプID = 3D空間上のオブジェクトにつけられる) (0〜)
    	 perm=0,				% パーミッション(デフォルトは0)
    						% 0 - 全て許可
    						% 1 - 表示状態だけど選択不可 (ロックされている)
    						% [] or {Mode,GbSet} -
    						% 非表示状態で選択不可、
    						%  Gbsetにはオブジェクトの
    						%   選択領域が含まれる
    	 name="" :: string() | tuple(),		%  名前(AutoUVは他の物をここに格納します)
    	 es=array:new() :: array(),		% 辺データが格納される array (型はarray、デフォルトでは新規作成)
    	 lv=none :: 'none' | array(),	        % 左の頂点の(複数の)属性 (型はarray、デフォルトはnone)
    	 rv=none :: 'none' | array(),	        %右の頂点の(複数の)属性 (型はarray、デフォルトはnone)
    	 fs :: gb_tree(),		        % (複数の)面データ (型は Bツリー)
    	 he=gb_sets:empty() :: gb_set(),	%(複数の)ハードエッジ(デフォルトは 空のBツリー)
    	 vc :: array(),		                % 頂点のための接続情報  (=インシデントエッジ)(型はarray、デフォルトは空のBツリー)
    	 vp=array:new() :: array(),		%(複数の)頂点の位置 (型はArray 、デフォルトは新規作成)
    	 pst=gb_trees:empty(),                  % プラグイン状態の情報、(デフォルトは空のBtree ) 
    						%    gb_treeの  キーはプラグインモジュールです。
    	 mat=default,				% (複数の)マテリアル
    	 next_id=0 :: non_neg_integer(),	%辺、面、頂点のための、次にあるフリーなID(0〜)
    						% (weレコードがIDを全く再利用しないために このIDが必要です)
    	 mirror=none :: 'none' | non_neg_integer(),	% ミラー情報 ,  none または | Face を取る。(デフォルトは none )
    	 light=none,				%光源データ : none|Light
    	 holes=[] :: [integer()]		%複数の面のリスト 
    	}).
    	
    		
    	-record(edge,
    	{vs=0 :: vertex_num(),			% 始点 (Start vertex for edge)
    	 ve=0 :: vertex_num(),			% 終点 (End vertex for edge)
    	 lf=0 :: face_num(),			% 左面(Left face)
    	 rf=0 :: face_num(),			% 右面  (Right face)
    	 ltpr=0 :: edge_num(),			%左先行辺 (Left traversal predecessor)
    	 ltsu=0 :: edge_num(),			%左後続辺 (Left traversal successor)
    	 rtpr=0 :: edge_num(),			%右先行辺 (Right traversal predecessor)
    	 rtsu=0	:: edge_num()			%右後続辺 ( Right traversal successor)
    	}).
    
    %% 現在のビュー/カメラ 
    -record(view,
    	{origin,
    	 distance,				% 原点からの距離
    	 azimuth,
    	 elevation,
    	 pan_x,					%  X方向へのパン 
    	 pan_y,					% Y方向へのパン 
    	 along_axis=none,			% 視点がどの軸方向に沿っているか 
    	 fov,					% 視野 ( Field of view.)
    	 hither,				% カメラに映る最も近い平面までの距離  (Near clipping plane.)
    	 yon					% カメラに映る最も遠い平面までの距離 (Far clipping plane.)
    	}).
    	
     
    %% オブジェクトごとのディスプレイリスト
    %% これらは Wings3d の編集画面の表示方式を記録しています。
    %%  重要: プレーンな整数と、リスト内の整数は明確にディスプレイリストであると思われるでしょう。
    %% 任意の整数をディスプレイリストとして解釈されないように、
    %%  タプルかレコードで格納しなければなりません。
    -record(dlo,
    	{work=none,				% ワークモード表示 ( デフォルト; none )
    	 smooth=none,				% 面のスムースな陰影 ( デフォルト; none )
    	 edges=none,				%  ワイヤーフレームの辺表示  ( デフォルト; none )
    	 vs=none,				% 選択されていない複数の頂点   ( デフォルト; none )
    	 hard=none,				%(複数の)ハードエッジ  ( デフォルト; none )
    	 sel=none,				% 選択済みの(複数の)アイテム( デフォルト; none )
    	 orig_sel=none,				%オリジナルの選択領域.( デフォルト; none )
    	 normals=none,				% 法線表示( デフォルト; none )
    
    	 vab     = none,                        %% 頂点array(下をみて)
    	 tri_map = none,			%Tri -> Face map (ピッキングのための)
    
    	 %% Miscellanous.
    	 hilite=none,				% ハイライトしたディスプレイリスト
    	 mirror=none,				% バーチャルミラーデータ
    	 ns=none,				% 面ごとの 法線/位置
    	 plugins=[],                            % プラグインのための描画リスト
    	 proxy=false,                           %Proxy データを使うか?.
    
    	 %% ディスプレイリストの為のソース
    	 src_we=none,				% ソースオブジェクト
    	 src_sel=none,				% ソースの選択領域
    	 orig_mode=none,			% オリジナルの選択モード
    	 split=none,				% 分割データ
    	 drag=none,				% マウスドラッグ用
    	 transparent=false,			% 透明度を含むオブジェクト 
    	 proxy_data=none,			% スムースプロキシの為のデータ
    	 open=false,				% 穴が開いてるか?
    
    % ディスプレイリストのリストは、   存在していないか否かに関係なく、
    % ディスプレイモードベースでのみで必要であることが知られています。
    
    	 %% Example: [work,edges]
    	 needed=[]
    	}).
    
    %% 頂点arrayバッファ
    -record(vab, 
    	{
    %   頂点バッファ。 それぞれの頂点バッファ{Stride,Binary},に似ています。
    %   そこでは、Strideが、頂点バッファをセットアップするとき使用されるべきストライドです)。
    
    	  face_vs  = none :: wings_vtx_buffer(), %面描画のための Vertex binary
    	  face_fn  = none :: wings_vtx_buffer(), %面の(複数の)法線 (平坦ですが頂点単位で)
    	  face_sn  = none :: wings_vtx_buffer(), %面の(複数の)法線 (スムーズ)
    	  face_uv  = none :: wings_vtx_buffer(), %(複数の)UV座標
    	  face_vc  = none :: wings_vtx_buffer(), %頂点色の(複数の)座標 
    	  face_map = none,                       %FaceId -> {BinPos,TriCount}
    	  mat_map  = none                        %マテリアルごとの面描画情報
    	 }).
    
    

    Winged-edge構造

    Wings3Dは、頂点や辺や面の位置関係データ構造に、「ウイングドエッジデータ構造」を採用しています。
    wings.hrlを読むと、レコードのWe(=Winged edge)にそれが格納されていることが分かります。

    これは稜線と接続する辺の稜線の性質を利用した構造です。もしかしたらWings3Dという名前はそこから由来しているのかもしれない?

    もし、始点と終点の順序が変わった場合(A→Bが、B→Aになる) 辺ABの名前以外のデータはすべて変化します。
    また、これらの位置関係を整理すると、任意の頂点や辺に対応するインシデントな辺を求めることができるようです

    面に穴があいていた場合は、穴の面を構成する辺は反時計回りになってしまいますが、一筆書きの要領で辿ると時計回り順序で扱えるようです。 詳しい説明は次のリンク先を見て下さい
    どの辺とどの辺が隣り合っているか等の位置関係を素早く把握できるらしい。

    Wings3dの頂点ナンバーの割当て

    オブジェクトの複製によるナンバーの割当には違いがあります。Body|Dupliate と 複数のFace|RegionExtract、それを Combineコマンドで1オブジェクトにしたケースが考えられます。

    Body|Duplcateは概ね元のオブジェクトの割当をトレースするようですが、複数 Face|RegionExtractは割当が
    また、Wings3dでは、割り振られた頂点番号は頂点や面を追加/削除するたびに、並び順が変わります。
    たとえば「#0,#6,#7,#1,#8,#9#2,#10,#11,,#3,#12,#13,#4,#14,#15#5,#16,#17
    今の所、頂点の再ナンバリングをする方法は不明です。

    オブジェクト作成プラグインによって、順番が違う?
    Extractで増やしたオブジェクトをCombineで1つのオブジェクトにした場合の頂点ナンバーの割当て。(Wings3D v1.2の場合)

    Wingsコアモジュールについて

    これらsrcディレクトリ内にある、モジュールのファイルには、APIとして利用可能な関数が書かれてます。
    Wings3に備わっている機能(押し出しやカメラ操作、GUI)を利用したい場合は、各モジュールの関数をつかってWingsの機能にアクセスできます。
    ただし、よりー般的なな処理....ベクトルや行列操作、画像ファイルの出入力は、e3dモジュールとして分離しているのでそれを使って下さい。
    
    wpa.erl  ** プラグイン作成のために提供される便利API (選択領域,コンソール,ダイアログ等)
    
  • wings_wm.erl **ウインドウマネジャ wings_wm_toplevel.erl **直接アクセス不可
  • wings_we.erl** Wings3d の中心となる We: wings recorde 構造体 データの構築と操作 wings_we_util.erl**We構造体用ユーティリティ wings_we_build.erl ** ポリゴンメッシュのWe構造体の構築用
  • wings_view.erl ** Viewメニューのコマンド関連
  • wings_vertex.erl ** 頂点関連のユーティリティ、BB wings_vertex_cmd.erl
  • wings_vec.erl ** ベクトルとその 2ndary selection
  • wings_va.erl **頂点属性モジュール
  • wings_util.erl ** 様々なユーティリティ関数 gb_tree 大小 キーフォーマット , Unicode対応format関数 wings_util:format/2 は、io_lib:format/2に近いですが、書式が厳格です。しかし~t の引数はユニコードを含むリストを使えます。 現在~tsはアジア文字の翻訳用に対応しており、また、Format ディレクティブは~s~pを使えます。 また、Wings本体の基本メニュー構成と文字列を確認できます。(280行以降)。 メニューに項目を追加する場合はここではなく、プラグインやlangファイルのほうで行います。 (プラグインのメニュー構成や翻訳文字列ははWings本体実行時に、プラグインのcommand()関数や.lang ファイルから自動的に抽出するようです。)
  • wings_undo.erl ** アンドゥ関連
  • wings_u.erl ** 様々なユーティリティ関数 エラーmsg, クラッシュログ
  • wings_tweak.erl ** もともとプラグインだったTweak機能をWingsコアに引き入れました。
  • wings_toolbar.erl ** AutoUV と ジオメトリのツールバーにアクセス
  • wings_theme.erl ** ウインドウテーマの色セットデータが直接書かれている
  • wings_text.erl ** テキストとフォントのサポート
  • wings_tesselation.erl ** Tesselation/subdivision コマンド
  • wings_shaders.erl ** シェーダ関連
  • wings_sel_conv.erl ** 選択領域の変換
  • wings_sel_cmd.erl ** selectionメニューのコマンド
  • wings_sel.erl ** 選択領域のユーティリティ関数
  • wings_scale.erl ** Scale コマンドとベベル(面) のインタラクティブ部分を実装します。
  • wings_rotate.erl ** Rotateコマンドの実装
  • wings_render.erl ** シーン内の すべてのオブジェクトと、ヘルパー(軸の補助表示)ニ関するレンダー GeometryとAutoUVウインドウで使用されている
  • wings_proxy.erl ** スムース Proxy表示 (実際のポリゴンを非破壊的にスムース表示させる機能)
  • wings_pref_dlg.erl ** 環境設定の管理(ダイアログ文字列など)
  • wings_pref.erl ** 環境設定の管理
  • wings_plugin.erl ** プラグインマネジャを含む、プラグインのサポート
  • wings_pick.erl ** OpenGLをつかったPick処理。選択域のハイライト
  • wings_pb.erl ** GUI (プログレスバーの処理)
  • wings_palette.erl ** 頂点パレットウインドウの維持
  • wings_outliner.erl **アウトライナーウインドウの維持
  • wings_msg.erl ** メッセージ表示と定型表示(formatting)のための補助関数
  • wings_move.erl ** Moveコマンド
  • wings_menu_util.erl ** メニュー補助とユーティリティ関数(方向,平均化,回転のサブメニュー等)
  • wings_menu.erl ** GUI (プルダウンメニュー の仕様) menuデータはseparator または { Text , Name(Atom) , hotkey , HelpSrting, Propaties } HelpStringは2種類あり、String または L,M,R(マウスボタンで異なる機能を持つ場合)のセット が存在する。
  • wings_material.erl ** 面のマテリアル管理(例えば色やテクスチャ等)
  • wings_magnet.erl ** マグネットコマンド
  • wings_light.erl ** 光源の実装
  • wings_lang.erl ** 多言語管理
  • wings_job.erl ** プラグイン作成者のための OS job handling サポート
  • wings_io_wx.erl ** Low-level WX GUI のための制御モジュール
  • wings_io_sdl.erl ** Low-level SDLのための制御モジュール マウスカーソルの形状(通常、砂時計など)がソースに埋め込まれている。 マウスの状態、修飾キー判別、イベントハンドラ、グラブ
  • wings_io.erl ** 異なるバックエンドへのラッパーモジュール
  • wings_init.erl ** Wings のビデオとイベントハンドリングの初期化
  • wings_import.erl ** 外部オブジェクトのインポートを扱うモジュール
  • wings_subdiv.erl ** 全体と面モードにおける Smoothコマンド
  • wings_start.erl ** Wings 3D起動時にパッチ; might enable installed patches.
  • wings_shapes.erl ** このモジュールは立方体や球のように作成された全ての立体の定義を含みます。
  • wings_shape.erl ** Shape レコード
  • wings_face.erl ** このモジュールは面(例えば 面 の反復子の高階関数)を補助するルーチンが含まれます
  • wings_extrude_face.erl ** (複数の)面のための押し出しコマンドを含む。
  • wings_extrude_edge.erl ** このモジュールはExtrude (edge), Bevel (face/edge) Bumpコマンドを含む。(全てedge の押し出しをベースにしている)
  • wings_export.erl ** 他のファイルフォーマット(画像)の出力を扱う
  • wings_edge_loop.erl **辺ループコマンド
  • wings_edge_cmd.erl ** 辺コマンドとそのユーティリティ関数 (ハードネスとセットカラー)
  • wings_edge.erl ** 辺コマンドとそのユーティリティ関数
  • wings_draw_setup.erl** 描画用バイナリデータのセットアップと作成
  • wings_draw.erl ** OpenGLを使ってオブジェクトを描画する為のモジュール
  • wings_drag.erl ** コマンドのマウスドラッグによるインタラクティブ操作。
  • wings_dl.erl ** ジオメトリとAutoUVウインドウのオブジェクトのためのディスプレイリスト管理(ディスプレイリストのガーベジコレクションを提供)
  • wings_dissolve.erl ** 面の削除(ディゾルブ)
  • wings_develop.erl ** プラグイン制作者のための開発メニューにある便利な機能
  • wings_deform.erl **頂点のデフォーム関連
  • wings_convert
  • wings_console.erl ** Wings3d コンソール I/O およびコンソールサーバ機能
  • wings_color.erl ** カラー関連のユーティリティ
  • wings_collapse.erl ** 面の削除(コラプス)
  • wings_camera.er ** カメラ関連の処理(rotation, zooming, panning).l
  • wings_body.erl ** これはオブジェクト全体の為のコマンドの大部分を含む。
  • wings_ask.erl ** ダイアログ GUI関連 API
  • wings_align.erl ** 配置と整列に関するコマンドのモジュール( Align と Center )
  • wings.icon
  • wings.hrl ** Weデータ構造体
  • wings.erl ** メイン部分(初期化処理など)
  • wings_image.erl ** イメージ管理用モジュール(画像の出入力とスクリーンショット)
  • wings_hotkey.erl** ホットキーの翻訳 バインドとアンバインド
  • wings_help.erl **
  • wings_gl.erl ** 一部のOpenGL関連ユーティリティ(GSGLのエクスポートなど)
  • wings_font_table.erl ** 表示されるグリフを構成するetsにおいて蓄積されたフォントテーブルへアクセスする関数を提供。 表示できるものはグリフを、そうでないものは、'undefined'を返し、全フォントテーブル内のグリフを検索処理を行います。
  • wings__font.erl ** 一般的なフォント操作関数
  • wings_file.erl ** Fileメニューのコマンド関連
  • wings_ff_wings.erl ** .wings 形式のファイルの出入力
  • wings_ff_ndo.erl ** .ndo形式のファイルの出入力
  • wings_facemat.erl ** このモジュールは面の番号からマテリアルの名前までマッピングの動向をおさえます。
  • wings_face_cmd.erl ** 面コマンドのほとんどが実装されている  user_default.erl ** Wings ユーティリティによってErlang shell を拡張する。(相互参照 Xref や, Erlangの 静的解析ツール dializer サポート) array.erl ** arrayモジュール(Ericsson製)
  • wings_s.erl ** テキスト文字列 環境設定のカメラ、方向、修飾キーなど

  • メインモジュールと繋がるモジュールの調査

      メインモジュール wings.erl で初期化されるものをリストしてみた
        wings_pref:init(),
        wings_hotkey:set_default(),
        wings_pref:load(),
        wings_lang:init(),
        wings_init:init(),
        wings_text:init(),
        wings_image:init(wings_io:get_process_option()),
        wings_plugin:init(),
        wings_color:init(),
        wings_io:init(),
        wings_camera:init(),
        wings_vec:init(),
        wings_view:init(),
        wings_sel_cmd:init(),
        wings_file:init(),
        wings_u:caption(St),
        wings_wm:init(),
        wings_file:init_autosave(),init_menubar(),
        wings_pb:init(),
        wings_ask:init(),
        wings_job:init(),
        wings_develop:init(),
        wings_tweak:init(),
    

    コアモジュールの中でも、比較的、用途・目的がはっきりしてるもの

  • wpa.erl ** プラグイン作成のために提供される便利API (選択領域,コンソール,ダイアログ等)
  • wings_menu.erl ** GUI (プルダウンメニュー の仕様)
  • wings_pb.erl ** GUI (プログレスバーの処理)
  • wings_ask.erl ** ダイアログ GUI関連 API
  • wings.hrl ** Weデータ構造体
  • wings.erl ** メイン部分(初期化処理など)
  • wings_theme.erl ** ウインドウテーマの色セットデータが直接書かれている
  • wings_io.erl ** 異なるバックエンドへのラッパーモジュール wings_io_wx.erl ** Low-level WX GUI のための制御モジュール wings_io_sdl.erl ** Low-level SDLのための制御モジュール この2つのexportはほぼ一緒。マウス、キーボード、アイコン等
  • wings_job.erl ** プラグイン作成者のための OS job handling サポート
  • wings_plugin.erl ** プラグインマネジャを含む、プラグインのサポート
  • wings_develop.erl ** プラグイン制作者のための開発メニューにある便利な機能
  • plugins_srcディレクトリ内
    wpc_test_ask.erl

    e3dモジュールについて

    Introducing e3d and Dan Gudmundsson(2001年)によると、以下のように紹介されています。
    ---------引用-----------
    e3dとはWingsの一部として分類されますが、実際にはスタンドアロンのErlangモジュール
    セットです。現在 出入力(3ds,obj,rib,objなどの出入力)とベクトル、行列関数、2Dイメージ(BMPとTGA)
    の読み込みをサポートしています。(これは2001年時点なので、現在はPNGの形式もサポートされています)
    
    利点
    1)いくつかのe3dモジュールはwingsモジュールよりはるかに小さく理解しやすい。
     Erlang言語を学ぶ好例です。(e3d_bmp,e3d_tga、e3d_tdsをみてどのようにバイナリ
    データを扱うのか見てください)
    
    2)プラグインからe3dにアクセスできます。ベクトルと行列の関数が必要となるのは確実でしょう。
    出入力プラグインはe3d.hrlで定義されているレコードのメッシュデータを渡す
    でしょう。また、他のプラグイン形式はそのフォーマットを使用するかもしれません。s
    
    Dan Gudmundsson氏 (a.k.a. dgud) はe3dを思いつきました。
    彼の主張によりWingsコアモジュールの中で一般的に役立つルーチンを、
    コアモジュールのコード中に埋めずにe3dにそれらを入れることになりました。
    
    彼は今のe3dの2D画像や最初の3ds出入力ルーチンを書きました、そして現在TIFF読込み機能を
    実装していると思います。(2001年時点)
    ---------引用-----------
    

    E3dのソースコード

    これらは、行列やベクトルに関連する制御、または3dデータの変形や出入力、画像の出入力に用いられます。
    
    
    ●使用頻度の調査
    
  • command系プラグインでよく使われているもの。e3d_vecはかなり多くのプラグインから利用されていました。 e3d_vec: sub,add,dot,mul,norm e3d_dist: (TurnEdgeのみ)
  • import_export系プラグインでよく使われるもの e3d_image, e3d_mesh , e3d_object, 固有のファイル形式の保存には、たとえば、wpc_3ds では、e3d_tds,e3d_imageが使われている。
  • 種類問わず使われているもの e3d_util ( 3ds, stl , geodome,ncube プラグインから ) e3d_q (クォータニオン) は auv_texture で使われたりしています。 ファイルの出入力に、3Dデータ、2D画像データ、テキストデータの3種類があり このうち、前2つは e3dを利用していますが、テキストデータの場合は直接Erlangのfile:open関数を使っているもの(wpc_ai.erl)も見受けられました。 wpa_save_image →wings_export:save → e3d
    ●定義 e3d.hrl **メモリ内の3dデータに関する定義。各データのレコードの定義がある。type やrecord ベクトル(座標),点(座標),4x4行列の再現, 正規化された4x4行列 (e3d_vector, e3d_point, e3d_bv,e3d_matrix(),e3d_transf,e3d_face,e3d_mesh,e3d_object,e3d_file) 変形行列、面、ポリゴンメッシュ、オブジェクト、ファイルの定義 ●数学、幾何学関連の機能。
  • e3d_util.erl ** ユーティリティ。 rawデータ(生座標) ←→ indexd形式(頂点/面リスト) 変換
  • e3d_kd3.erl orig_kd3.erl ** kd tree (Kd木)の実装 。空間分割データ構造 (http://ja.wikipedia.org/wiki/kd木) 三次元空間上の探索に用いられる。
  • e3d_qbvh.erl ** QVBHの実装。 面の交差判定に利用されるらしい。 QVBH(Quad-tree Bounding Volume Hierarchy:4分木空間分割階層構造) 論文: http://www.uni-ulm.de/fileadmin/website_uni_ulm/iui.inst.100/institut/Papers/QBVH.pdf (日本語の情報。明日ではないから--[CG][programming]QBVHを実装した) QBVHを実装した - 明日ではないから ●ベクトル関連
  • e3d_vec.erl ** ベクトルの加減乗除、 ベクトル正規化(normalize)、正規化さえれたベクトルの平均、バウンディングボックス 2つのベクトルのとる角度(ゼロ除算対策済)
  • e3d_q.erl ** クォータニオンユニット (指定ベクトルを回転軸に、空間上の2地点の球面最短経路を通る回転を行う) ●行列関連
  • e3d_mat.erl ** 3Dの行列関連の基本機能 translate, scale , rotate(移動、拡大縮小、回転) , identify (正規化)
  • e3d_transform.erl ** 行列関連の機能。 平行投影、透視投影 、逆行列、行列の合成など。 ●画像関連
  • e3d_image.hrl ** 2D画像データのレコード
  • e3d_image.erl ** 2D画像の出入力と変換を扱う tif , png, bmp,tga 、内部書き出し、法線マップ、ミップマップ
  • e3d_file.erl ** e3d_file レコードのユーティリティ
  • e3d__tif.erl
  • e3d__tga.erl
  • e3d__bmp.erl
  • e3d__png.erl ●3Dファイル形式
  • e3d_tds.erl ** 3ds Studio Max 形式のファイル(.tds)の出入力
  • e3d_obj.erl ** Wavefront OBJ形式ファイル(.obj)の出入力
  • e3d_bzw.erl ** BZFlag 用データの出入力 ●メッシュ関連
  • e3d_mesh.erl ** e3dのユーティリティ( クリーンナップと三角ポリゴン化)
  • e3d_bv.erl ** バウンディングボックスと Quickhull(凸包アルゴリズム), eigen-vec(固有ベクトル)計算の実装
  • e3d__tri_quad.erl ** メッシュの三角形分割、四角形分割
  • e3d__meshclean.erl ** e3dメッシュのクリーン(内部モジュール)

  • wpa.erl及びダイアログ構築

    このファイルは、API作者がプラグインを作りやすくする為の便利な機能を提供するために
    他の複数のモジュールへデータを受け渡す窓口的役割をしています。
    具体例はソースフォルダ内を「wpa:」で複数のファイルの内容を検索すると見つかります。
    wpa:ask(title,Qs,Fun)のように使う。
    
    複雑な部分は隠蔽されているので、専門的なことをやりたい場合は、
    wpaを使わずそれぞれのモジュールを調べて直接呼び出してやることもできます。
    
    ↓次に説明するものは例は最も簡単なダイアログです。
    

    askとdialog

    例えば、Wings3dで移動コマンドを実行した時に、移動量を決めるのにマウスドラッグで調節する他に、
    Tabキーを押して、モーダルダイアログから入力する方法があります。
    このaskとdialog関数はその時にダイアログを出現させる機能を提供します
    (wpaでは複雑な部分は隠蔽されており、実際にはwings_ask.erlへバイパスされている)。
    
    wpa:askは定型的で単純なものが多いです。
    Wings3dの様々なプラグインのコードを比較してみると、
    自由度の高いダイアログを作成する場合は、wpa:dialog のAPIを使っているようです。


    Wings3Dの GUIのフォームからどのように値を取得するかについては、全く文書化されていないので、調べてみたところ仕組みは多分このようになってるかと思われます(後で検証予定)。 プラグインの wpc_ncube.erl や wpc_torus.erl を読むと参考になるでしょう。
    Scaleコマンドの例


    Sweepコマンドの例
    例:import_export/wpc_hlines.erl
    
    wpaモジュールには、機能に合わせて2つのタイプ4種類が用意されています。
    askもdialogも、簡単な書式で定型ダイアログが構築出来るように設計されています。
    
    これらはどちらもダイアログを表示させる基本的APIです。
    複雑な部分は外から見えなくなっていて、これらは、そのままwings_ask.erl へ渡されます。
    
    ask は 最も単純な定型ダイアログを作成します。
    タイトルと 、Qs(レイアウト記述のデータ) 、関数 を指定します
    Qs をどのように書けばいいかは、この文書内で後述しています。
    
    ask(Title, Qs, Fun) ->
        wings_ask:ask(Title, Qs, Fun).
    
    ask(Bool, Title, Qs, Fun) ->
        wings_ask:ask(Bool, Title, Qs, Fun).
    
    dialog(Title, Qs, Fun) ->
        wings_ask:dialog(Title, Qs, Fun).
    
    dialog(Bool, Title, Qs, Fun) ->
        wings_ask:dialog(Bool, Title, Qs, Fun).
    
    ask/3  と 4 関数の違いは、 wings_ask.erl を読んで下さい。
    ask/3はbool は trueフラグ が最初から省略されているタイプで、
    ask/4で  ask(true, Title, Qs, Fun) すると同じになります。
    
    %	ask(Title, Qs, Fun) -> ask(true, Title, Qs, Fun).
    % 	ask(Bool, Title, Qs0, Fun) ->
    %    {Labels,Vals} = ask_unzip(Qs0),
    %    Qs = [{hframe,
    %	   [{vframe,Labels},
    %	    {vframe,Vals}]}],
    %    dialog(Bool, Title, Qs, Fun).
    
    このQsを見てみると、
    おそらく、コンテナ hframe の中に 、横並び(vframe)で ラベルと値がレイアウトされると思われます。
    %    Label  [Val]    Label  [Val]   
    
    ------------------------------------------------------------------------------------
    どのような種類の関数でwings_ask:dialog/3 を使うのですか?
    http://nendowingsmirai.yuku.com/topic/7315/wings-ask-dialog-3
    
    例えば command/2 のような関数を指し示す有効なタプル
    {select,{similar_normals,Args}}, これは
    command({select,{similar,Args}}, St).として呼び出されます。
    
    それが、そのダイアログから呼び出したコマンドである理由です。
    ダイアログの問い合わせによる結果を再び別のコマンドから呼び出す用途に使われます。
    ------------------------------------------------------------------------------------
    
    これら小型ダイアログは、wings_uモジュールへバイパスされます。
    %% エラーメッセージのダイアログ
    error_msg(String) ->
        wings_u:error_msg(String).
    
    error_msg(Format, Args) ->
        wings_u:error_msg(Format, Args).
    

    %% Yes, No , Cancel 選択ダイアログ。 小型のダイアログ。
    %% Yes型 :エラー通知やシステム上の確認に使われる事が多い。
    yes_no(Question, Yes) ->
        wings_u:yes_no(Question, Yes).
    
    %% Yes、No型
    yes_no(Question, Yes, No) ->
        wings_u:yes_no(Question, Yes, No).
    
    %% Yes, No , Cance型
    %% 例 「保存して終了しますか?」 Yes(保存して終了)、No(すぐ終了)、Cancel(終了をあきらめる)
    yes_no_cancel(Question, Yes, No) ->
        wings_u:yes_no_cancel(Question, Yes, No).
    
    %% キーとコマンドを結びつける何らかの関数 未調査
    bind_unicode(Key, Command) ->
        wings_hotkey:bind_unicode(Key, Command, plugin).
    
    bind_virtual(Key, Mods, Command) ->
        wings_hotkey:bind_virtual(Key, Mods, Command, plugin).
    

    Import

    %%% Import/export support.
    %% St を返す。
    import(#e3d_file{}=E3dFile, St) ->
        wings_import:import(E3dFile, St).
    
    %% 何も返さないタイプ :  最終的に import_filename
    
    import(Props, Importer, St0) ->
    
    %% import_filename([Prop], Continuation). は Continuation(Filename). と同じように呼ばれます
    
    import_filename(Ps, Cont) ->
        wings_file:import_filename(Ps, Cont).
    

    Export

    %% export([Property], ExporterFun, St)
    %%  
    %%  Recognized values for Property:
    %%       {subdivisions,Levels}
    %%       {tesselation,none|triangulation|quadrangulation}
    %%       {include_colors,Bool}
    %%       {include_uvs,Bool}
    %%       {include_hard_edges,Bool}
    %%       {include_normals,Bool}
    
    %% Export には、全部を保存するタイプと、選択部分だけを保存するものがある。
    
    export(none, Exporter, St) ->
    export_selected(Props, Exporter, #st{selmode=Mode}=St)  when Mode == body; Mode == face ->
    
    穴そのものの面形状が書き出しされるのを防ぐ為に、選択領域を補う形で穴を作成します。
    通常我々はメモリを節約する為に穴の面形状を削除(ディゾルブ)しますが、この
    Weデータは、一時的なものなのでその必要はありません。
    
    wings_we:create_holes(Holes, We).
    %% この _filenameがついた関数は、 Continuation(Filename). と同じように呼ばれます。
    %% export_filename([Prop], Continuation).
    
    export_filename(Prop, Cont) -> wings_file:export_filename(Prop, Cont).

    %% export_filename([Prop], St, Continuation).
    %% この St (Wingsの状態レコード) の中には、ファイル名のデータも含まれていて、それが使用されます。
    
    export_filename(Prop, St, Cont) -> wings_file:export_filename(Prop, St, Cont).

    %% save_images(E3DFile0, Directory, DefaultFiletype) -> E3DFile
    %%  全マテリアル内のすべてのイメージを保存し、保存されたイメージそれぞれに、ファイル名を挿入します。
    %%    E3DFile = #e3d_file{}
    %%    DefaultFiletype = Extension (list), 例えば ".bmp"
    
    save_images(E3DFile, Directory, Filetype) ->
        wings_export:save_images(E3DFile, Directory, Filetype).
    

    ダイアログテンプレート

    3Dファイル形式ファイルの出入力の際に定型的に用いられる、部分的なGUIレイアウトを提供します。
    いくつか種類があります。たとえば、X/Y軸を入れ替えるかどうかのチェックボックスや、
    テッセレーションをどのくらいにするかを、指定するラベルと入力欄などです。
    これらGUIのまとまりを組み合わせて、ダイアログウインドウに埋め込むことができます。 impor_export/wpc_3ds, bzw,collada,exl,obj,ply,wle,x.erlに使用例があります。 また、import_export/wpc_obj.erl に、わかりやすい具体例があります。 実際のレイアウトは、wings3d アプリケーションで、file >export >obj形式で 保存する時のダイアログに見ることができます。 一般的なダイアログを返す。 %% dialog_template(Module, Type) -> Template %% Module = callers module (used as preference key) %% Type = import|export
    dialog_template(Mod, import) ->
    dialog_template(Mod, export) ->
    dialog_template(Mod, tesselation) ->
    

    %% dialog_template(Module, Type, ExcludeKeys) -> Template
    一般的なダイアログを返します。
    %%  Return a template for a standard dialog. The flags argument makes
    %%  it possible to exclude certain keys.
    %%  Module = callers module (used as preference key)
    %%  Type = import|export
    %%  Flags = List of keys to exclude from the dialog template
    
    定型ダイアログ中に表示させたくない項目がある場合。取り除きたい項目のキーのリストを
    Flags に指定する事で非表示にできます。
    
    
    dialog_template(Mod, Type, Flags) ->
    
    
    import_scale_s() -> ?__( 1, "Import scale").
    export_scale_s() -> ?__( 1, "Export scale").
    
    import_matrix(Attr) ->
    export_matrix(Attr) ->
    

    環境設定データ

    %%% Preferences.
    %%%   Mod には  ?MODULE が渡されます。
    内部的に wings_prefモジュールへ渡されます。
    
    pref_get(Mod, Key) ->
    pref_get(Mod, Key, Default) ->
    pref_set(Mod, KeyVals) when is_list(KeyVals) ->
    pref_set(Mod, Key, Value) ->
    pref_set_default(Mod, Key, Value) ->
    pref_delete(Mod, Key) ->
    

    %%% Scene preferences.
    %%%   Mod には  ?MODULE が渡されます。
    これらは、レンダラー関連のプラグインimport_export/wpc_kerky,  wpc_povlay, wpc_yafaray に使用例があります。
    
    これら set/delete 関数は、値のリストをセットまたは削除し、そしてもしも値の変更があったならば、ジオメトリウインドウにメッセージを送ることで、Wings3d をグローバルなneed_save 状態へ更新させます。
    
    scene_pref_get(Mod, Key) ->
    
    scene_pref_get(Mod, Key, Default) ->
    scene_pref_set(Mod, KeyVals) when is_list(KeyVals) ->
    scene_pref_set_default(Mod, KeyVals) when is_list(KeyVals) ->
    scene_pref_delete(Mod, Keys) when is_list(Keys) ->
    

    選択領域ユーティリティ

    %%% Selection utilities.
    これらはauto_uv プラグインで使用例があります。
    
    sel_set(Sel, St) ->
    
    これら面は、同じ領域に属すために少なくとも1つの編を共有しなければなりません(頂点を共有するのは十分ではありません)。(wings_selモジュールのface_region関数と同じ)
    sel_face_regions(Faces, We) ->wings_sel:face_regions(Faces, We).
    
    同じ領域に属させるために、少なくとも1つの頂点(または辺)を共有する複数の面でなければいけません。 このwpaモジュールのsel_strict_face_regions関数は、wings_selモジュールのstrict_face_regions関数へ丸投げしています。
    sel_strict_face_regions(Faces, We) -> wings_sel:strict_face_regions(Faces, We).
    

    その他(未調査)

    %%%
    %%% Picking. (3D画面で、選択した領域のことか?)
    %%%
    
    %% pick(X, Y, St0) -> {add|delete,{Id,Item,original|mirror},St}.
    %%  Pick the item (body, face, edge, or vertex, depending on the selection
    %%  mode in St0) and either add it to the selection or delete it from
    %%  the selection.
    %%
    %%  The first element in the returned tuple will indicate whether
    %%  something was added or deleted from the selection, and the second
    %%  element will indicate which item in which object was picked.
    %%
    
    %%%
    %%% Drag and drop support
    %%%
    
    drag(Tvs, Units, St) ->
        wings_drag:setup(Tvs, Units, [], St).
    
    drag(Tvs, Units, Flags, St) ->
        wings_drag:setup(Tvs, Units, Flags, St).
    
    drop(WindowName, DropData) ->
        wings_wm:send(WindowName, {drop,DropData}).
    
    %%%
    %%% Vertex functions.
    %%%
    
    
    %%% Camera info.
    %%%
    
    camera_info(As) ->
        wings_view:camera_info(As, wings_view:current()).
    
    %%%
    %%% Get all lights.
    %%%
    
    lights(St) ->
    import_lights(Lights, St) ->
    
    
    %%% Images.
    %%%
    
    image_formats() ->
        wings_image:image_formats().
    
    image_read(Ps) ->
        wings_image:image_read(Ps).
    
    image_write(Ps) ->
        wings_image:image_write(Ps).
    
    %%%
    %%% Virtual mirror.
    %%%
    
    vm_freeze(We) -> wings_we:freeze_mirror(We).
    
    %%%
    %%% Tesselation/subdivision.
    %%%
    
    triangulate(We) ->
        wings_tesselation:triangulate(We).
    
    triangulate(Faces, We) ->
        wings_tesselation:triangulate(Faces, We).
    
    quadrangulate(We) ->
        wings_tesselation:quadrangulate(We).
    
    quadrangulate(Faces, We) ->
        wings_tesselation:quadrangulate(Faces, We).
    
    %%%
    %%% Console
    %%%
    
    popup_console() ->
        wings_console:popup_window().
    
    %%% 
    %%% External commands
    %%%
    
    
    
    

    2ndarySelection関連

    今まで調べてきて、いまいちよくわからないのがユーザーから軸や頂点を選択(入力)してもらい、その入力を元に変形処理を行う2ndarySelectionのやり方です。
    プラグイン wpc_bend.erl,wpc_intersect_edge.erl, wpc_shift,intersect_vertex.erlにそのヒントがあった。
    ソースコードを読んでいくと、そのコマンドがどんなユーザー入力を必要として、どのような順番で2ndarySelectionが進行していくのか、手がかりを追ってみることにした。
    例えば....
    submenu(3, Ns) ->
        wings_menu:build_command(
    	{'ASK',{[{axis_point, ?__(6,"Pick axis perpendicular to plane (plane will pass through axis's base)")}],[],[]}}, Ns).
    
    とか
    
    submenu_items(1, Clamped) ->
        {{plastic_bend,Clamped},
         {'ASK',{[{point, ?__(1,"Pick rod center")},
    	      {point, ?__(2,"Pick rod top")},
    	      {axis,  ?__(3,"Pick bend normal")}]
                  ++ submenu_clamp(Clamped),[],[]}}};
    
    こういう記述が見つかります。 point, axis と関連するメッセージがリストされています。
    上も下も最終的に、wings_menu:build_command関数へ渡しています。

    これは何をやってるか、コアモジュールであるwings_menu.erlの build_command関数の部分を探してると、 そこでは単純に、list:foldl(リストの畳み込み関数(左))によって'ASK'関数へ、リストをまるごと処理させているようです。
    list:foldlというのは、畳み込み関数といってErlangに最初から用意されている関数です。

    さて、ややこしい括弧を解きほぐすと、
    wings_menu:build_command({ {送るコマンド名} ,{ 'ASK' , {[選択箇所&メッセージのリスト],[],[]} , Ns);
    のようになり、さらに選択箇所&メッセージのリストの構造を(マクロなどを省いて)分解して、単純に表すと->
    [
    {axis_point, "軸と点を選択してください" },
    {axis , "軸を選択してください" },
    {point , "点を選択してください" }
    ]
    このように分解できます。
    現在調べたのはここまで。

    Todo:
    ・list:foldlの仕組み(畳み込み関数)について調べる
    ・どんな値が返ってくるのかを調べる。返ってきた値はどう処理されるのか?
    ・wings_menu:build_command()を使っていない大半のプラグインは、どのようにユーザーが選択(入力)した軸や頂点を取得しているかを調べる。

    wings_ask.erlのメモ

    より高度なダイアログを使うためのGUIの書式とAPIがあるようです。
    
    
    GUIを構築する  Qs(クエリ文字列)は wpc_test_ask.erlに説明がありますが、
    次のURLも参考になります→More information about dialogs - wings_ask.erl in PROGRAMMING Forum
    
     wpc_test_ask.erlの説明は、一応下でも日本語訳してあるのでリファレンスとしては使えるかもしれません。
    ただ正規表現風に一括して書かれているので理解しにくい人もいるでしょう。
    プラグイン等のコードから実際に使われている部分を探して読むのが一番かもしれません。
    
    とは言っても、Qs 書式がわかりにくいのは、Erlang の文法のせいで、大量のカッコ開きカッコ閉じにうんざりします!!!!
    しかし、ちょっと見方を変えるだけで、ソースを読むとっかかりが見えて来ます。
    
    Erlang のややこしいカッコの入れ子もXML風に考えると、絡まった思考もほぐれてきます。
     
    
    ★直接wings_askモジュールの wings_ask:dialog を利用しているプラグインのリスト
    
  • wpc_numeric_camera.erl
  • wpc_snap.erl
  • wpc_grid_snap.erl (Origin of virtual Grid:Mボタン実行時にTabでダイアログを出す)
  • wpc_absolute_move.erl
  • wpc_absolute_scale.erl
  • wpc_bbox.erl
  • wpc_untrianglate.erl
  • wpc_sculpt
  • auv_texture.erl 動的に
  • wpc_plane_cut.erl
  • wpc_yafray.erl
  • wpc_pov.erl
  • wpc_test_ask.erl
  • wp9_dialogs.erl 内容はかなり多彩になります。 ★wings_ask.erl で使える関数。 -export([init/0,ask/3,ask/4,dialog/3,dialog/4, hsv_to_rgb/1,hsv_to_rgb/3,rgb_to_hsv/1,rgb_to_hsv/3] wings_ask:dialog( ほげほげ ) 例: 状態フラグ→ inert|disabled|enabled inert , disabled , enabled のいずれかが該当する。 === ダイアログ関連のデータ構造 ===================================================== -record(s, {w, h, ox, oy, call, focus, %フィールドインデックス focusable, %フィールドインデックス群のタプル mouse_focus=false, % フィールドをマウスがクリックしたか判定 fi, % 全フィールドの静的データ n, %フィールド数 coords, % 判定のための座標群 store, %全フィールドのデータ level, %入れ子レベル owner, %結果を送る場所 grab_win % ひとつ前にフォーカスを取得したウインドウ }). %% フィールド毎の静的データ -record(fi, {handler, % 無名関数のハンドラ key=0, % フィールドのキー index, %フィールドのインデックス state=inert, % 状態フラグ→ inert|disabled|enabled minimized, % 最小化フラグ→ true|false|undefined hook, % アリティ(引数)2を持つ、フィールドに対する(無名)フック関数 fun/2 flags=[], % 複数フィールドのリスト x,y, % 左上の位置 w,h, % 縦横サイズ stretch=0, %水平伸張による影響 extra % コンテナまたは、末葉データ }). %% (複数の様々なフィールドを格納できる)コンテナフィールドのための静的データ拡張 -record(container, {type, % コンテナタイプ(フレーム) → vframe|hframe|oframe x,y, % コンテナ位置 w,h, %コンテナサイズ fields, % フィールドやタプル tuple()が 含まれている selected, % 整数値または未定義 integer()|undefined stretch, % 伸張された要素の合計 w0,h0 % 未伝播な外側(フィールド)のサイズ }). %% 末葉フィールドのための静的データ拡張 -record(leaf, {w,h % あるべき (最小)サイズ }). ==== Qs の 書式===================================================================== 具体的な使用例は wpc_test_ask.erl で見ることが出来ます。 共通タイプ String = string() テキスト Boolean = true または false (アトム) Fields = [Field] 複数フィールドが集まったリスト。 Field -- フィールド、どんなフィールドのタプルも以下に挙げるものの集合です。 Key = term() キーに用いる値には、整数値 integer() は フィールドの相対的アドレス(場所)を指し、 それ以外の term() は絶対的な識別子を表します。 キーの意味合いからいうと float()を使うのは好ましくありません、 動く事は動きますが、パターンのミスマッチや間違いの元になります。 フィールド共通データ( 共通フィールドのタイプを指定したもの、これはダイアログツリーの走査等に使われる ) はダイアログツリーに格納されており、#fi{}レコードの入れ子で構成されています。 フィールドのプライベードデータ (特別なフィールドタイプを指定したもの) とフィールドの値は 同じ gb_tree に格納される。 全フィールドは、ダイアログツリー内に整数値1から始まるフィールドインデックスを持っており、 それは ツリー走査(traversal)順にカウントアップされる( Qs と同じく 深さ優先 ) 書いたもの順に番号が割り振られる [1 [2[3[4[5]]]]6 [7[8]]9--- 深さ優先 [1 [4[6[8[9]]]]2 [5[7]]3---幅優先 参考解説サイト:情報処理概論(Java)より tree traversal フィールドプライベートデータは、 キーが負のインデックス番号として gb_tree に格納されており、 フィールドタイプに依存するタイプのレコードとは異なります。 フィールドの値は、 キーとしてフィールドインデックス(デフォルト)を伴った gb_treeに格納されており もしキーに整数値が使われている場合はフィールドは他のフィールドと値を共有しており そのキーは相対的フィールドインデックスのオフセットとして扱われる。 もしも、キーが整数以外の項 term ならば、それは格納されている実際のキーとして使われる。 非整数のキーを持つ全てのフィールドは、ダイアログの結果として {Key , Value}を返すでしょう ほとんどのフィールドは、下に書いた場合を除き、値を返します。 Hook = function() ボタンなどを押した時にフックして呼び出す関数はアリティ(引数)2 と void を返すものでなければいけません。 void はあらゆる値が来た時にそれをスルーさせるため必須です。 たとえば fun (is_disabled, {Var,I,Store}) -> Bool; 全てのフィールドが再描画された時に呼び出される。 コンテナ内のフィールドはアクセス不能 ですが、コンテナフィールドそのものはそうではありません。 (is_minimized, {Var,I,Store}) -> Bool; 全てのフィールドが配置された時に呼び出される。(フレームに重なったものを除く) (update, {Var,I,Val,Store}) ->keep|{store,NewStore}|done|{done,NewStore}|{layout,NewStore} 確実に値をNewStore 内に格納させてください。 done または {done, _} はダイアログが終了(あるいは再始動したとき)に返されます。 {layout,_}は レイアウトにフォーカスが渡された時 フィールドが変化した時に呼び出されます。 (menu_disabled, {Var,I,Store}) -> [Disabled]; Disabled = Val|{Val,MenuFlags} Val = menu 値 MenuFlags = 他のメニューフラグを準備する為のフラグ Only called for menu fields. (_, _) -> void end Qs は 1つ下のフィールド( 参照可能な内容のあるフィールドがまだある、またはフィールドのリストで {hframe,...} でくくられている内に2つの{vframe , ...}が内包されている) 場合、それぞれ最初のものをQsとして、 二番目の内容をOK と Cancel ボタンを含むようにするのが望ましいです。 ●●●フィールドコンテナ(ダイアログツリーノード)●●● ●フレーム要素    {hframe,Fields[,Flags]} -- Horizontal frame    {vframe,Fields[,Flags]} -- Vertical frame    Flags = [Flag]    Flag = {title,String}|{minimized,Boolean}|{key,Key}|{hook,Hook}|layout|    checkbox|invert フレーム要素のみ、 'title' と 'minimized' フラグ両方とも返します。 'checkbox' フラグは、ヘッダを含むチェックボックスを持つフレームのスタイルがが最小化したときに 返されます。(おそらくクリックでオプションが折りたたまれるタイプのもの) 'invert' フラグは チェックボックス値と返り値が最小化の反対が行われた(最大化、クリックで広がった状態) ことを示します。 ●オーバーレイ要素    {oframe,Fields[,Flags]} -- Overlay frame    Flags = [Flag]    Flag = {title,String}|{style,Style}|{key,Key}|{hook,Hook}|layout    Style = menu|buttons -- menu is default ●●●コンポジットフィールド(他の複数のフィールドで構成されている)●●● ●複合要素    {vradio,Alts,DefaultValue[,Flags]} -- 複数のラジオボタンの垂直配置    {hradio,Alts,DefaultValue[,Flags]} --複数のラジオボタンの水平配置    Alts = [{PromptString,Value}]    Flags = [Flag]    Flag = {key,Key}|{title,String}|{hook,Hook}    例: wpc_am.erl. をみてください。 これらは{hframe,...} / {vframe,...}内に {key,...}/{key_alt,...} フィールドが構成されています。 ●ラベルの列    {label_column,Rows} -- ラベルフィールドの行と列    Rows = [Row]    Row = {String,Field}    これは、 {vframe,...} フィールドと1つの{vframe,Fields}がその分野を含んでいる1つの {label,String}を含む {hframe,...}です。 ●スライダーとカラーボックス/テキストフィールドのコンボ    {slider,{text,Def,Flags}} -- Slider on text field    {slider,{color,Col,Flags}} -- Slider on color box    下のスライダーの通常のフィールドを見てください。 これは{hframe、…}2つを含むフィールドです。 ●ボタン押すと、テキストフィールドになにか出る    {button,{text,Def,Flags}} -- 参照ボタンのテキストフィールド    Flags = [Flag]    Flag = {props,DialogBoxProperties}|{dialog_type,DialogType}|    {drop_flags,DropFlags}|RegularFlags    DialogType = open_dialog|save_dialog    DropFlags = [{index,Index}|{key,Key}|{hook,Hook}]       ボタンが押されたら、データをドロップする場所を指定したフィールドへ格納します。    Index = integer() ドロップターゲットの相対的フィールドインデックス。    Key = ターゲットをドロップするフィールドのキー    Hook = ターゲットフィールドをドロップするときに呼び出すフック関数 ●●●一般的なフィールド (ダイアログツリーの末葉)●●● ●追加タイプ:    RegularFlags = [RegularFlag]    RegularFlag = {key,Key}|{hook,Hook}|{info,String}|    {stretch,Stretch}|layout 注意: 'layout'フラグは、フィールドの値に変更があれば強制的に、layout に渡されます。 デフォルトではStretch は 0 に設定してあり、フィールドが使われるhframe 内に含まれる時に 水平パディングがどのくらいあるか定義します。 水平パディングは 均等にStretch因数に広げられます。 ●空白要素    panel -- 単純スペースを空ける stretch 1    {panel,RegularFlags} 値を返さない。 ●不可視フィールド    {value,Value} -- 不可視フィールドによる、値を保持    {value,Value,RegularFlags} ●ラベル    {label,String} -- ラベル文 値を返さない。 ●分割線    separator -- 水平セパレータ (メニューの分割線) 値を返さない。 ●カラー選択ダイアログ    {color,Col[,RegularFlags]} -- サブダイアログで カラー調整ボックスを出す    Col = {R,G,B}|{R,G,B,A}    R = G = B = A = X, 0.0 =< X, X =< 1.0 ●ラジオボタン    {alt,Def,String,Val[,RegularFlags]} -- ラジオボタン    Def = term() -- ラジオボタングループの初期値      1つのラジオボタングループにつき最初にどれか選択済みでなければいけない。    Val = term() -- ボタンの値    {key_alt,{Key,Def},String,Val[,Flags]} -- ラジオボタン    -> {alt,Def,String,Val,[{key,Key}|Flags]} ●ポップアップメニュー    {menu,Alts,Def[,RegularFlags]} -- ポップアップメニュー    Def = term() -- メニューの初期値    1つのメニュー選択肢には、この値が設定しておかなければいけない。    Alts = [Alt]    Alt = {String,Val}|{String,Val,MenuFlags} -- 記述と 値    Val = term()    MenuFlags = [{info,String}] ●ボタン    {button[,String],Action[,RegularFlags]} -- ボタン    Action = ok|cancel|done|function(Result)    Only Action == 実行後に返る値 もしStringが省略されて、Actionが アトムだった場合、Stringには アトムの文字列表現(英大文字)が入ります。 もし アトムが存在しない場合、Stringは必須です。 ●カスタム表示    {custom,W,H,DrawFun[,RegularFlags]} -- ビュアーのカスタム表示    W = H = integer() -- Field size    DrawFun = function(X, Y, W, H, Store)       フィールド描画させ、おそらく'keep'.が返って来ます。       他の返り値も可能です--詳細はソースを読んでください。   ●スライダ    {slider,{text,Def,Flags}} -- テキスト欄上にスライダがある    {slider,{color,Col,Flags}} --カラーボックス上にスライダがある    {slider,Flags} -- 単一のスライダ    Flags = [Flag]    Flag = {range,{Min,Max}}|{color,true}|{color,ColKeySpec}|    value|RegularFlag    ColKeySpec = {r,KeyG,KeyB}|{g,KeyR,KeyB}|{b,KeyR,KeyG}|    {h,KeyS,KeyV}|{s,KeyH,KeyV}|{v,KeyH,KeyS} 'range'フラグは必須。 R,G,B,H,S スライダの範囲には 0.0〜1.0を越える範囲を使っていはいけません。 V カラースライダの範囲には0.0〜360.0を超える範囲を使っていはいけません。 キー "Key*" にはスライダーに反応して背景色が変化するような、プロパティを読込む為に使われます。 {text,_,_} または{color,_,_} フィールドに同じフラグが渡されています。 もし'value'フラグが使用されていたなら、値のみ返ります。 ● 数値欄またはテキスト欄    {text,Def[,Flags]} -- 数値欄またはテキスト欄    Def = integer()|float()|String -- 初期値    Flags = {range,{Min,Max}}|{width,CharW}|{password,Bool}|    {charset,Charset}|RegularFlag    CharW = integer() >= 1       Min と Max は Defと同じタイプでなければならず、       テキスト欄では許可されていません。       Min にはまた '-infinity' 、 Max には 'infinity'が指定可能です。       CharW には文字列が。デフォルト幅は30       integer()なら 8, float()なら12が設定されます。.       文字列には latin1 または unicode が可能です(デフォルトは latin1です) ●チェックボックス    {String,Bool[,RegularFlags]} -- チェックボックス ● ヘルプボタン    {help,Title,HelpLines} -- ヘルプボタン    Title = String    HelpLines = [HelpLine] | fun() -> [HelpLine]    HelpLine = String ●右クリックメニューとサブメニュー 右クリックメニューリストへプラグイン自身の名前を追加するために、サンプルでは一番末尾に名前を追加するのですが 他のプラグインのソースを覗いてみると、再帰を使ってリストを分離しながら再構成して、任意のコマンド名にマッチしたらその次へ、自身の項目を追加するといった様子です。  Fun(無名関数)とメニュー構築はリストへの追加が一番単純な方式、メニュー項目をリストの途中へ挿入する場合は関数の再帰を使ってリストを分離しながら再構成して、任意のコマンド名を見つけてその次に挿入するようになっています。あと、リストの逆順に戻しておくことがポイント。 役立つ情報;サブメニューを作る方法。 [primitives] adding a submenu in PROGRAMMING Forum

  • wings_plugin.erlのメモ

    wings_plugin.erl のソースコードのあらすじ。
    ※注意:プラグインを作成する場合はこのジュールを隅々まで読む必要はないと思いますが、プラグイン全体の情報を取得するとかに興味ある人は読んでおくといいかも。

    このモジュールがプラグインインストール及び、使用/不使用の管理、プラグイン実行時のパイパスを行っています。
    プラグイン実行時には、wings_plugin.erlが、それぞれのモジュール名を引き出し共通する関数(たとえば、init(), menu(), command() )を呼び出してるようです。

    
    init(): prefデータから、インストールされてるプラグインリストを取得、使用/不使用プラインの有無を調べているらしい。
    		インストールディレクトリも調べる
    		→→ [line:163] init_plugin()    case catch M:init(Ui0) of ...
    		おそらく、各プラグインのinit()関数を呼び出しているのだと思われる
    
    最後に put により wings_plugins へデータが入れられる。
    このwings_pluginsのデータをもとに、プラグイン管理が行われるようです。
    
    
    ↓
    またmenu, command も 2種類ある
    ■ プラグインバイパス用
    [line:113]
    menu()
     menu_1(get(wings_plugins), Name, Menu).→→ menu_1([M|Ps], Name, Menu0) →→  case catch M:menu(Name, Menu0) of ...
    
    command()command(Cmd, St) ->  Ps = get(wings_plugins),
    	  command([M|Ps], Cmd, St) ->  case check_result(?MODULE, Other, St) of
    		next -> command(Ps, Cmd, St);
    		Res -> Res
    また、ここで Plugin-Manager へ分岐する
    ↓
    ↓
    ↓
    ■ Plug-In Managerのメニュー用
    [line:339]
    manager_menu()
    [line:360]
    manager_command()→→[line:418]cat_xxx()それぞれの関数→→ try_menu();→→ Caregory リストに入れられる。
    		xxxには Command , Tool ,Select , Rende ,Import/Export , Primitives が該当する
    		[line:441]cat_command_fun() ->command_menus() ->ここでは、属するカテゴリ名をゲット
    				    Modes = [{vertex},{edge},{face},{body}],
    		    Cmds = [move,scale,rotate,flatten],
    		    Modes ++ [{Mode,Cmd} || {Mode} <- Modes, Cmd <- Cmds]
    		    ++ [{vertex,deform},{face,tesselate}].
    ↓
    ↓
    ↓
        Categories = [cat_command_fun(),fun cat_tool/1,fun cat_select/1,
    		  fun cat_render/1,fun cat_import_export/1,
    		  fun cat_primitive/1],
    
        Cps0 = [{category(Categories, P),P} || P <- Ps],
    ↓
    ↓
    ↓
    [line:373]
    	Cps = wings_util:rel2fam(Cps0),
    
        Fun = fun(Res) -> 
    		  Disabled = [M || {M,false} <- Res],
    		  put(wings_plugins, Ps -- Disabled),
    		  update_disabled(Disabled, St)
    	  end,
    
    ダイアログの構築、タイトルバーに Plug-In Manager と表示される。またその時に実行されるのが 上の Fun 関数。
    	Dialog = mk_dialog(Cps, false),
        wings_ask:dialog(?__(1,"Plug-In Manager"), Dialog, Fun);
    ↓
    ↓
    ↓
    ダイアログ構築開始
    [line:387]
    mk_dialog()
    ↓
    GUIの構築、水平フレームに、ボタンとプラグイン名、それを垂直フレームに入れることで、リストを並べている。
    plugin_modules(C, Ms) ->
        {hframe,[{vframe,[{atom_to_list(M),member(M, get(wings_plugins)),
    		       [{key,M},
    			{info,?__(1,"Enable or disable this plug-in ")++
    			 ?__(2,"(a disbled plug-in does not show up in menus)")}]} ||
    			 M <- Ms]},
    	     {vframe,[plugin_info(C, M) || M <- Ms]}]}.
    ↓
    ↓
    ↓
    [line:455]
    それぞれのコマンドのカテゴリが渡された時に、 それに対応する処理を行う
    plugin_info(export_import, M) -> export_import_info(M); → ラベル名関係の関数
    ↓
    [line:553] 関連づけられているホットキーの取得? → その後 collectmenu();へ
    normalize_menu([{Name,[_|_]=Menu}|T]) ->
        case plugin_key(Menu) of
    	none ->
    	    normalize_menu(T);
    	Key ->
    	    Cmd = wings_menu:build_command(Key, reverse(tuple_to_list(Name))),
    	    [Cmd|normalize_menu(T)]
    
    ↓
    [line:441]
    			command_menus() ->ここでは、属するカテゴリ名をゲット
    				    Modes = [{vertex},{edge},{face},{body}],
    		    Cmds = [move,scale,rotate,flatten],
    ↓
    [line:512]
    plugin_menu_info([]) -> panel;
    各メニュー情報を取得
    ↓
    [line:545]
    plugin_root_menu(body) -> ?__(1,"body: ");
    文字列表示
    
    ↓
    完了&戻る。plugin_modulesへデータが返ってGUIへ文字が送られる?
    
    
    

    wpa全API

    -module(wpa).
    -export([ask/3,ask/4,dialog/3,dialog/4,error_msg/1,error_msg/2,
    	 yes_no/2,yes_no/3,yes_no_cancel/3,
    	 bind_unicode/2,bind_virtual/3,
    	 import/2,import/3,import_filename/2,
    	 export/3,export_selected/3,
    	 export_filename/2,export_filename/3,
    	 save_images/3,
    	 dialog_template/2,dialog_template/3,
    	 import_matrix/1,export_matrix/1,
    	 send_command/1,
    	 pref_get/2,pref_get/3,pref_set/2,pref_set/3,
    	 pref_set_default/3,pref_delete/2,
    	 scene_pref_get/2,scene_pref_get/3,
    	 scene_pref_set/2,scene_pref_set_default/2,scene_pref_delete/2,
    	 sel_get/1,sel_set/2,sel_set/3,sel_map/2,sel_fold/3,sel_convert/3,
    	 sel_edge_regions/2,sel_face_regions/2,sel_strict_face_regions/2,
    	 drag/3,drag/4,drop/2,
    	 pick/3,
    	 vertices/1,vertex_pos/2,vertex_flatten/3,vertex_center/2,
    	 faces/1,face_vertices/2,face_outer_vertices_ccw/2,face_outer_edges/2,
    	 face_dissolve/2,face_dissolve_complement/2,
    	 edge_loop_vertices/2,
    	 obj_name/1,obj_id/1,
    	 camera_info/1,lights/1,import_lights/2,
    	 image_formats/0,image_read/1,image_write/1,
    	 vm_freeze/1,
    	 triangulate/1,triangulate/2,quadrangulate/1,quadrangulate/2,
    	 popup_console/0,version/0
    	]).
     

    wpc_ex1.erl のサンプルコード

    プラグインのサンプル wpc_ex1.erlで使用されるモジュールは wpa、e3d_mesh、wings_uがあります。
    特にwpa.erlはプラグイン制作者のための便利APIを提供しています。
    
    これらは各モジュールから特に有用な物だけをピックアップして利用できるようにしたもの。
    wpa.erlから各モジュールにバイパスされるため複雑な部分は隠蔽されている。
    さらに専門的な事をする場合は、各モジュールから提供される関数をつかいましょう。
    (例えばGUIの詳細仕様は src/wings_ask.erlにあり、また使用例は、 plugins_src/wpc_test_ask.erl で読むことができます。 )
    
      wins_ask:  ダイアログ(ask と dialog, テンプレート)
      wings_u:    Yes Noダイアログ
      wings_hotkey
      wings_import(+wings_pb)
      wings_file
      wings_export(+wings_sel)
      wings_we
      wings_wm  メッセージ送信
      wings_pref シーン情報と環境設定
      wings_sel  選択領域へのアクセスと制御
      wings_pick 選択領域のピック
      wings_drag ドラッグ&ドロップ
      
      面頂点情報の取得
      wings_util   Array key   
      array
      wings_vertex
      wingss_edge_loop
      wings_face
      wings_view
      
      処理
      wings_tesselation
      
      コンソール
      wings_console
    

    プラグインの手がかり

    ほとんどのWings3dのwpcプラグインは
    Wings本体とやりとりする窓口は、ほとんどinit, menu, command の3つの関数に集約されます。
    
    ★プラグイン内の menu , command 関数に渡されるアリティ(引数)は、そのプラグインが
    どの選択モードで右クリックメニューを出したときに項目名が表示されるのか。
    また、ツールメニューのどの項目を選んだ場合に使われるかが、手がかりになります。
    また、加工する頂点や辺の座標のデータはレコードSt内にあることがわかります。
    
    vertex, edge, face , body ,shape ....3Dオブジェクト選択モード
    tool, file, select ....ツールバーのメニュー 
    St.... Wings3d の情報 (ファイル名や現在選択中の頂点や辺などの情報)
    
    ★init は trueを返します。そのプラグインが有効かどうかを確認するために使われるのかもしれません。
    
    ★menuは 各モード(頂点、辺、面, 全体、 シェイプ)のメニュー項目の構築と、atom識別子の定義
    Shape= シェイプとはBody(全体)選択モードで無選択の時に、立方体や円柱などのプリミティブ立体を配置する場合のモードです。
    渡されたメニュー項目に、プラグインの項目名を挿入、追加するものが多いです。
    
    ただし、この項目追加のやり方が各プラグインで様々で、それぞれの書き手の好きな方法でやってます。
    そのため、単純にメニューの最後に追加するやり方が無難です。
    
    また、大量のコマンドを追加するタイプのプラグイン作者は、メニューあたりの項目を増やしすぎないように、
    サブメニューを作ってそこに自分の作ったコマンド項目を展開させるようにしていて、インターフェースに配慮しているようです。
    
    ★commandはメニュー項目が選択されたら呼び出され、atom識別子及び、Wings3dの各種状態(State)情報を格納した
    St レコードが渡されます。このStレコードはwings.hrlで定義されていて、プラグインはこのSt内のデータを
    加工することになります。
    
    
    。またバイナリのWings3dを起動して、実際にダイアログを出したり操作してみて
    ソースコードのテキスト文字列とあわせて追うのも。理解の手がかりとなります。
    プラグインのソースコードを追っていくにあたり、複数ファイルを開いて比較検討するのは骨が折れます。
    そこで、比較対象のために一部をここに引用します
    
     

    プリミティブ系プラグイン

    wpc_ncube menu({shape}, []) -> ncube_menu(); menu({shape}, Menu) -> Menu ++ [separator|ncube_menu()]; menu(_, Menu) -> Menu. command({shape,{ncube, Arg}},_St) -> make_ncube(Arg); command({shape,{ngon, Arg}},_St) -> make_ngon(Arg); command(_, _) -> next. wpc_plane menu({shape}, []) -> plane_menu(); menu({shape}, Menu) -> Menu ++ [separator|plane_menu()]; menu(_, Menu) -> Menu. command({shape,{regularplane ,Ask}},_St) -> make_regular_plane(Ask); command({shape,{lumpyplane ,Ask}},_St) -> make_lumpy_plane(Ask); command({shape,{wavyplane ,Ask}},_St) -> make_wavy_plane(Ask); command({shape,{sombreroplane ,Ask}},_St) -> make_sombrero_plane(Ask); command(_, _) -> next. wpc_torus menu({shape}, []) -> torus_menu(); menu({shape}, Menu) -> Menu ++ [separator|torus_menu()]; menu(_, Menu) -> Menu. command({shape,{uvtorus,Ask}}, _St) -> make_uv_torus(Ask); command({shape,{lutorus,Ask}}, _St) -> make_lu_torus(Ask); command({shape,{sptorus,Ask}}, _St) -> make_sp_torus(Ask); command(_, _) -> next. wpc_image menu({shape}, Menu) -> insert_before_image(Menu); menu(_, Menu) -> Menu. command({shape,image_plane}, _St) -> make_image(); command({shape,{image_plane,Name}}, _St) -> make_image(Name); command(_, _) -> next. wpc_bend menu({vertex}, Menu) -> menu(_,Menu) -> Menu. command({vertex,{bend,Type}}, St) -> bend_cmd(Type, St); command(_,_) -> next.

    Command系プラグイン

    wpc_absolute_move menu({Mode},Menu) when Mode == vertex; Mode == edge; Mode == face; Mode == body; Mode == light -> parse(Menu, Mode); menu(_,Menu) -> Menu. command({_,{absolute,Mode}},St) when Mode == move; Mode == snap; Mode == csnap; Mode == nsnap -> Mirror = check_mirror(St), move -> move(St); snap -> wings:ask(selection_ask([reference,target]), St, fun snap/2); csnap -> wings:ask(selection_ask([target]), St, fun csnap/2); nsnap -> wings:ask(selection_ask([reference,target]), St, fun nsnap/2) command(_,_) -> next. wpc_circularise menu({Mode}, Menu) when Mode =:= edge; Mode =:= {auv,edge} -> lists:reverse(parse(Menu, [], Mode, false)); menu(_,Menu) ->Menu. command({Mode,circularise}, St) when Mode =:= edge; Mode =:= {auv,edge} -> process_circ_cmd(find_plane, St); command({edge,{circularise,Plane}}, St) -> process_circ_cmd(Plane, St); command({edge, circularise_center}, St) -> process_cc_cmd(none, St); command({edge,{circularise_center,Data}}, St) -> process_cc_cmd(Data, St); command(_, _) -> next. wpc_shear menu({vertex,deform}, Menu) -> menu(_,Menu) -> Menu. command({vertex,{deform,{shear,{GlidePlane0,{Radial0,{rmb,{'ASK',Ask}}}}}}},St) -> command({vertex,{deform,{shear,{GlidePlane0,{Radial0,lmb}}}}},St) -> command({vertex,{deform,{shear,{GlidePlane0,{rmb,{'ASK',Ask}}}}}},St) -> command({vertex,{deform,{shear,{GlidePlane0,{mmb,{'ASK',Ask}}}}}},St) -> % match 'Repeat Drag' arguments from 'ASK' selections command({vertex,{deform,{shear,{GlidePlane0,{Radial0,{rmb,{Origin,GlidePoint}}}}}}},St) -> command({vertex,{deform,{shear,{GlidePlane0,{rmb,{Radial,Origin,GlidePoint}}}}}}, St) -> command({vertex,{deform,{shear,{GlidePlane0,{mmb,{Radial,Origin}}}}}}, St) -> command({vertex,{deform,{shear,Data}}},St) ->

    出入力系プラグイン

    wpc_obj init() -> true. menu({file,import}, Menu) -> menu({file,export}, Menu) -> import /exprt で判別してそれぞれ分岐 menu({file,export_selected}, Menu) -> menu(_, Menu) -> Menu. command({file,{import,{obj,Ask}}}, St) -> do_import(Ask, St); command({file,{export,{obj,Ask}}}, St) -> command({file,{export_selected,{obj,Ask}}}, St) -> command(_, _) -> next. wpc_ps init() -> true. menu({file,import}, Menu) -> menu(_, Menu) -> Menu. command({file,{import,{ps,Ask}}}, _St) when is_atom(Ask) -> command({file,{import, ps, [Nsub]}}, St) -> command(_, _) -> next. wpc_x init() -> true. menu({file, export}, Menu) -> menu({file, export_selected}, Menu) -> menu(_, Menu) -> Menu. command({file,{export,{x,Ask}}}, St) -> command({file,{export_selected,{x,Ask}}}, St) -> command(_, _) -> next. ==================================================================================== Credit of code. ==================================================================================== % wpc_turnedge.erl -- Plug-in for turning edges Copyright (c) 2002 Chris Osgood, 2003-2011 Bjorn Gustavsson. % wpc_circularise.erl -- making them circular. Copyright (c) 2008-2011 Richard Jones. % wpc_ncube.erl -- N-Cube and N-Gon Plugin Copyright (c) 2003-2011 Anthony D'Agostino % wpc_x.erl -- DirectX export plugin Copyright (c) 2004-2011 Sean Hinde, Danni Coy, Dan Gudmundsson, and Ed Kolis % wpc_image.erl -- Image plane plug-in Copyright (c) 2002-2011 Bjorn Gustavsson. % wpc_absolute_move.erl -- Copyright (c) 2006-2011 Andrzej Giniewicz % wpc_shear, ps.erl -- Copyright (c) 2010-2011 Richard Jones. % wpc_cylindrilize.erl -- Copyright (c) 2008-2011 Richard Jones. % wpc_constraints.erl -- Copyright (c) 2008-2011 Richard Jones. % wpc_ambocc,plane,torus.erl-- CopyRight (c) 2008-2011 Anthony D'Agostino, Dan Gudmundsson % wpc_bend.erl -- Plug-in for bending vertices Copyright (c) 2005-2011 Dave Rodgers

    プラグインのメモ1

    (未検証!)プラグインで作れるものは、新規立体作成。変形コマンド、ファイル出入力(Importer/Exporter)の3つが考えられます。

    Wings3DプラグインのErlangコードを読解するための手がかり。

    Wings3Dのソースコード中によく登場する ?__( 6,"hogehoge") というのはマクロで、これは「__」という名前で、他国語版のデフォルト翻訳文字列に関係あると思われます。ひょっとしたらマクロによって「〜.lang」ファイルの各国語のメニュー表示に置き換わるのかもしれない!? また、Wings3dのソースコード intl_tools/wings_intl.hrl を探すと、 -define(__(Key,Str), wings_lang:str({?MODULE,Key},Str)). が定義されているのが分かります。
    各プラグインに共通の関数は init(), menu() , command() 関数。menu()では 右クリックMenuリストへ、セパレータや項目を追加したりしてるらしい。

  • 参考:Question about translations... (technical) - PROGRAMMING - Wings - 


  • Exploring Wings3D through the Erlang Shell
  • のFirstExampleの解説
    レコードはC言語の構造体と似ている。また名前付きのデータ領域として利用できます。


    ※Wings3d v1.1 以降、内部エレメントデータの格納には gb_treeではなくarrayを使用しています
    <ソースはExploring Wings3D through the Erlang Shellより引用>
    1: f(), 2: rr("c:/erlang/wings/src/wings.hrl"), 3: St = wpa:get_state(), 4: #st{shapes=Shapes,sel=Sel} = St, % レコードからデータを取り出されたものが、右辺の変数 Shapes、Selに代入されます。 5: We = gb_trees:get(1, St#st.shapes), % Shapesの内容は St#st.shapes と同じです(この例では) 6: Vs = gb_trees:values(We#we.vp).
    1行目 全ての束縛変数を破棄し、リセットする。
    2行目 rr()関数で、wings.hrlにある State-Record(状態データ/選択部分など) と、Wingd-Edgeデータ(オブジェクトの座標など)の定義を読込む
    3行目 変数 St にレコードの状態データ(States)を束縛
    4行目 Stの全データのうちから shape と sel というフィールド名を持つデータを絞り込み、条件にマッチしたものを、レコードSt#st として左辺へ取得。

    このサンプルコードで、ややこしい部分がこの4行目です。#st{shapes=Shapes,sel=Sel} でマッチした右辺の変数ShapeとSelの内容が変化することがポイントです。英文の解説では、4行目はレコードからのデータを取り出すやり方を示しただけなので、ShapesとSelの2つの変数は5行目以降に直接関係しないと書かれています。 ただしShapes にはSt#st.shapesと同じ内容が入っているとも説明されています。

    それから、#st{shapes=Shapes,sel=Sel} = St というのは、#st{shapes=Shapes,sel=Sel} = #st{shapes=GBTREE,sel=LIST}. と同じ意味らしいです。
    これによりレコードのフィールドデータにアクセスするためには、St#st.shapes と書きます。(作成名#レコード名.フィールド名)
    また、shapesはGBTREE(General Balanced Trees 平衡ツリー)データ、sel はLISTデータであることがわかる

    平衡木とは 【balanced tree】 - 意味/解説/説明/定義 : IT用語辞典


    5行目は We というのは(Wingd-edgeの略で) 1つの稜線に接続する辺や頂点に関するデータを束縛するものです。
    6行目は Winged-Edgeデータのうち、vpにリストされたデータの値をVsに束縛すると思われる。


    まだまだ不明な点が多いです。
     

    プラグインを開発する方法

    いまのところ、2種類の作成方法が見つかっています。
    注意: 最新の Wings3D v1.3.1 は、Erlang(OTP/R14)以降で動作します。もし古いErlangのバージョンを使ってるなら make時に ./array.erl:253: function error/1 undefined というエラーが出ます。
    また Wings3D v1.3.1以降 は Intel Macのみで動作するようです。
    その1:Wings3D内のErlangShell上でプラグインをコンパイル その2:Wings3Dソースコードと一緒にプラグインをコンパイル
    必要な物:
    ソースコード一式(Erlang , Wings3D )
    ・makeやinstall必要なし、必要なファイルを拝借するのに必要。

    Wings3Dアプリケーション(※Erlangソースコードからcompilerモジュールを持ってくる)
    ターミナル.app (ターミナルを起動して、bashで作業するため)

    必要な物:
    ソースコード一式( Erlang ,SDL ,esdl ,Wings3D )
    ・Erlang,esdl,Wings3Dは、ビルド、makeし、インストール済であることが条件
    ・SDLは、ビルド、makeし、Home以下にインストールしてあることが条件

    ターミナル.app (ターミナルを起動して、bashで作業するため)
    あまり手間がかからない。
    Wings3D内にあるErlang Shell上で、プラグインをコンパイルする。 ただし、初期状態ではコンパイルする機能c()は使えないのでErlang言語本体から拝借する。 また、bashでpathを通しておきWings3Dと対話できる状態にしておく。

    システムにインストールしないので手軽そうですが、正式な方法ではないのでリスクがあります。
    準備に時間を要する
    例えば、Wings3Dをビルドするとき、デフォルトプラグインに紛れさせて一緒にコンパイルさせる。   Makefileへ設定を追加してから、コマンドライン上(bash) から make するだけ。

    前準備のインストールが大変ですが、正式な手順で作成されます。
  • なお、Wings3dプラグインのモジュール名は、wpc_から始まる必要があるようです。


  • Getting camera transforms - PROGRAMMING - Wings - Wings3D Wings3Dのプラグインに関するトピック
  • How to Create Wings3D Plugins with C - PROGRAMMING - Wings - Wings3D どのようにして Wings3Dのプラグインを作るのか? HelloWorld。C言語のソースもあるようです。
  • wpc_ex1.erl Wings3Dプラグインの例。モジュール名 wpc_ex1
  • その1:Wings3D内のErlangShell上でプラグインをコンパイルする方法

    あらかじめ、Erlang本体ソースコードのディレクトリから compilerを拝借してWings3Dへ入れておきます。
    1. とりあえず、作ったプラグインのソース モジュール名.erlをホームディレクトリ直下へ置いておく。
    2. ターミナル.appを起動
    3. bashに一時的にPathを通して、Wings3Dと対話できるようにしておく。
    4. ErlangShell が立ち上がるので、ErlangShell上でコンパイルのためのコマンドを入力
    5. c(モジュール名). %% (モジュール名部分は、ファイル名から拡張子を除いた名前)
      カレントディレクトリ(デフォルトではホームディレクトリ直下)を確かめておくこと。

    6. このとき、プラグインがソース中でヘッダファイルをincludeしている場合は別途、ヘッダファイルを用意する。
    7. これらはWings3Dソースコードにある、例えば「wpc_ex1.erl:122: can't find include file "e3d.hrl"」という エラーが出たら、それらファイルを Wings3Dのソースコードのe3dディレクトリから拝借して、 いまコンパイルしようとしているソースコードと同じ場所にコピーしておきます。 それで、もう一回c()を実行してみる。
    Erlang Shell上でのコンパイルと Include path
    通常 c( ) を使ってerlファイルをコンパイル場合は、 erlファイル内でinclude されているヘッダファイル(.hrl)を 同階層のディレクトリにおけば自動的にinclude されます。
    もし、他の場所に .hrl ファイルがある場合は、c()関数のオプションに、その場所のディレクトリパスを指定すると、走査されます。 タプル{}を追加することで、複数の場所を指定することが出来ます
    wpc_ex1.erl
    include_directory_path/e3d.hrl
    include_directory_path/e3d_image.hrl
    このように、別ディレクトリにIncludeすべきファイルがある時には、Erlang Shell上では、
    compile:file("wpc_ex1.erl",[{i,"./include_directory_path/"}]).
    または、
    c ("wpc_ex1.erl",[{i,"./include_directory_path/"}]).
    のように書くとコンパイルが通ります。
    これでおしまい。あとは、Wings3Dでプラグインをインストールするために、beam ファイルを指定します。

    その2:Wings3Dソースコードと一緒にプラグインをコンパイルする。(ただし、Wings3D自体のコンパイルは失敗しました)

    Wings3DのMacOSX版をビルドしようとして失敗した記録。(一応プラグイン類はコンパイルされた)
    必要なものは、Erlang,SDL,ESDL,Wings3Dで、順番でビルド、インストールしていきます。

    BUILD.unix の説明書によればOSX版のWings3Dを完璧にビルドするには、fbx library(FBX SDK?)が必要とのことですが、今回はインストールしていません。
    fbx libraryは Autodesk - Autodesk FBXから入手することができます(要ユーザー登録)。日本語の解説(ダイキン)
    ■環境。CPU=Intel Core Duo 2 GHz,   OS= MacOSX 10.5.8
    Wings3Dを解凍したディレクトリ直下に、ビルドのやり方を説明した BUILD.unix 
    というテキストファイルがあるので、これを参考に進めていきます。
    
    ■準備
    Wings3D 1.2     のソースコード をダウンロード  http://www.wings3d.com
    Erlang/OTP R13B04  のソースコード をダウンロード http://www.erlang.org
    SDL-1.2.14     のソースコードをダウンロード  http://www.libsdl.org.
    ESDL 1.0.1     のソースコードをダウンロード   http://esdl.sf.net
     
    
    ■順番にインスト−ル
    ===========================================================================
    ■Erlang/OTP R13B04をインストールする。
    Terminalを起動し、Erlangのアーカイブを解凍したディレクトリに入って
    
    ./configure --enable-threads --disable-hipe
    
    途中、fop is missing. The documentation can not be built.というエラーメッセージが出ますが気にしない。
    そして
    
    make
    
    結構時間がかかるので、お茶でも飲みます。makeが終わったら....インストールします。
    
    sudo make install
    
    これにより
    /usr/local/lib/erlang にErlangのファイルがインストールされます。また、
    /usr/local/bin/に  typer,to_erl.run_erl,escript, erlc,erl,epmd,dialyzer が
    インストールされます。
    
    ===========================================================================
    ■SDLライブラリ:(prefixにより、ホームディレクトリにインストールされます。
    ドキュメントによれば、既にシステムにインストールされたSDLと混じらないようにするためらしい。)
    SDLを解凍したディレクトリに移動してから
    
    ./configure --disable-video-aalib --disable-video-directfb --prefix=$HOME
    make 
    
    10分くらい待つ
    
    sudo make install
    
    これにより、ホームディレクトリ以下の/share, /bin, /lib, include/ にSDL関連のファイルが保存されます。
    
    ===========================================================================
    ■ESDLライブラリ:
    ESDLをビルドする前に、やっておく。
    which sdl-config
    sdl-config --libs
    
    もし、sdl-config が見つからなかったら
    cd /Users/User名/bin  
    という場所に移動して、sdl-config を直接実行する。
    以下のコマンドを入力し、コンフィグを設定する。
    
    ./sdl-config --libs
    
    ターミナルに、-L/Users/ユーザー名/lib -lSDLmain -lSDL -Wl,-framework,Cocoa
    という感じで表示されればOK
    
    その後で、ESDLをビルドします。ESDLを解凍したディレクトリに移ります。それで
    make 
    sudo make install
    これにより、usr/local/lib/erlang/addons/esdl-1.0.1 以下にESDLがインストールされます。
    
    ===========================================================================
    ■Wings3D:
    いよいよWings3Dのビルドが始まります。いきなりエラーがでて失敗です。
    エラーを回避するため、各ソースのヘッダファイルまでのpathを書き換えました。
    もっとスマートな回避方法が、あるかもしれない....。
    
    ヘッダファイルが足りないというエラーが出た!
    ./wings.hrl:17: can't find include lib "esdl/include/sdl.hrl" というエラーが表示されたので
    準備として esdl 内のヘッダファイルをWingsのあるディレクトリにコピーする
    
    例えば、/usr/local/lib/erlang/addons/esdl-1.0.1から、 Include ディレクトリをWings3Dの解凍ディレクトリ直下に コピーする。
    また、コピーしたディレクトリの中に、一緒に sdl_util.hrl も入れて下さい。
    
    テキストエディタで、 /wings-1.2/src/wings.hrl 内の include_lib のパスを相対パスに書き換え、つじつまを合わせる。
    -include_lib("../include/sdl.hrl").
    -include_lib("../include/sdl_events.hrl").
    -include_lib("../include/sdl_video.hrl").
    -include_lib("../include/sdl_keyboard.hrl").
    -include_lib("../include/sdl_mouse.hrl").
    -include_lib("../include/sdl_util.hrl").
    
    
    -include_lib("../include/gl.hrl").
    -include_lib("../include/glu.hrl").
    
    また、/wings-1.2/src/wings_body.hr の include_lib のパスを相対パスに書き換える。
    -include("../include/sdl_keyboard.hrl").
    
    /wings-1.2/plugins_src/primitives/wpc_image.erl の include_lib のパスを相対パスに書き換える。
    -include_lib("../include/gl.hrl").
    
    
    /wings-1.2/plugins_src/commands/wpc_constraints.erl  の include_lib のパスを相対パスに書き換える。
    -include("../include/sdl_keyboard.hrl").
    
    ターミナルで、Wings3Dを解凍したディレクトリに移ります。  
    export ESDL_PATH='/usr/local/lib/erlang/addons/esdl-1.0.1'
    make macosx
    
    
    Makefile の以下の行(71行目)をコメントアウトすると、FBX形式のプラグインを省略させて進めます。
    #	(cd plugins_src/fbx; $(MAKE))
    #	(cd plugins_src/fbx; $(MAKE) lang)
    
    
    export ESDL_PATH='/usr/local/lib/erlang/addons/esdl'
    make macosx
    ↑最後の最後でアプリケーション作成に失敗。プラグインはコンパイルされる。
    

    テスト用のプラグインをコンパイルしよう。

    Wings3Dのプラグイン作成の例題として公開されているテストコードがあります。
    Dan Gudmundssonさんの作成した「wpc_ex1.erl
    今回は、コンパイルしたコードが本当にWings3Dで動作するのかを試したいと思います。

    ●プラグインをコンパイルする
    ソースコードをダウンロードし、/wings-1.2/plugins_src/import_export/へ放り込む
    Makefileに追加記述する: /wings-1.2/plugins_src/import_export/Makefile を開き、MODULES = のリストに「wpc_ex1」を加える
    /wings-1.2/ 直下で make
    /wings-1.2/plugins/import_export/ 以下に「wpc_ex1.beam」が生成される。
    これを任意の場所(デスクトップなど)に、コピーする。

    うっかりミス← .beamファイルが生成されない? wpc_ex1.erl ファイル名の拡張子の後に、半角スペースがくっついてたのが原因

    ●プラグインをインストールする
    とても簡単。Wings3Dを起動し、File>Install-Plugin を選択。
    ファイルダイアログが現れるので、先ほどのwpc_ex1.beamを選択する。
    これでWings3Dで使えるようにインストールされます。

    ●プラグインを使ってみる
    すると、Wings3Dのメニューに、File>ExportにExample-exporter が追加されます。
    この形式で出力する場合は、あらかじめオブジェクトのUVマップを書き出しておく必要があります。
    Exportを実行すると、hogehoge.wex1(バイナリファイル)、auvBG.tga(テクスチャ)の2つのファイルとして保存されます。

    エラーログ

    Wings3Dで内部エラーが出たときアプリケーションがクラッシュせずに、Geometryウインドウをクリックすることでで、何事も無く続行できます。
    このとき、Users/ユーザー名/wings_crash.dump というテキストファイルにエラーログが吐き出されます。その内容は、エラー報告の時に役立ちます。
    ログには、実行経過を記録したスタックトレース情報が保存されます。 (Short stack trace と、 Long stack trace)
    エラー発生した関数と引数、そして呼び出し元の関数をどのくらい経由していたのかがわかります。
    トレースデータは一番先頭から 2,3行くらいの内容が重要だそうです。

    エラーについての情報は、Erlang実験室:分かりにくいと評判のErlangエラーのまとめ - 檜山正幸のキマイラ飼育記 が詳しいです。

    エラーの例↓
    Wing3D1.3.0.1にて、Geometryウインドウにあるメニューから Window>Tewak_palette を出そうとしたところ、エラーが発生した。
    Dump written 2010-4-20_22-17
    Version: 1.3.0.1
    Window: geom <----- Geometry ウインドウの操作中に発生
    Reason: function_clause  <-----エラーの原因 呼出時にマッチする関数節 が見つからない とのこと
    
    Short stack trace:
    [{wings,command_1,2},  <----------- 最後に、この関数、 wingsモジュールに存在する wings:command_1/2 関数(引数2)でエラーが出た
     {wings_develop,time_command,2},
     {wings,raw_command,4},
     {wings_wm,handle_event,3},
     {wings_wm,send_event,2},
     {wings_wm,do_dispatch,2},
     {wings_wm,get_and_dispatch,0},
     {wings,init,1}]
    
    Long stack trace:
    [{wings,command_1,
            [{window,tweak_palette}, <----- 引数に渡された内容。 
             {st,{0,nil},
                 face,false,[],
                 {0,nil},
                 none,
                 {1,
                  {default,[{maps,[]},
                            {opengl,[{ambient,{1.0,1.0,1.0,1.0}},
                                     {diffuse,{1.0,1.0,1.0,1.0}},
                                     {emission,{0.0,0.0,0.0,0.0}},
                                     {shininess,1.0},
                                     {specular,{1.0,1.0,1.0,1.0}},
                                     {vertex_colors,set}]}],
                           nil,nil}},
                 [],undefined,true,1,none,none,
                 {0,{}},
                 {0,nil},
                 ignore,none,none,
                 {ignore,ignore},
                 {window,tweak_palette},
                 {[],[]},
                 true,[]}]},
     {wings_develop,time_command,2},
     {wings,raw_command,4},
     {wings_wm,handle_event,3},
     {wings_wm,send_event,2},
     {wings_wm,do_dispatch,2},
     {wings_wm,get_and_dispatch,0},
     {wings,init,1}]
    
    Argument #2:
    
    参考:Not a programmer but want to help? - PROGRAMMING - Wings - Wings3D - Official Development Forum - Message Board Yuku

    ソースコードからデータ抽出

    ソースコードをデーターベースという視点で眺めれば、ドキュメントを自動生成する事は可能です。様々なプログラム言語で、ソースコードから関数やコメント文を抽出してドキュメントを自動生成するツールはたくさんあります。これは、プログラマ中心で使うドキュメントであり、主にAPIの構成を把握するのに役立ちます。

    しかし一方、プログラマがなるべく面倒なことをしたくないのと同じように、ユーザーやドキュメント作成者も面倒なことはしたくありません。
    メニュー構成やインターフェースについて知りたいなると、メニューを何回も開いたり閉じたり途方も無い労力が必要です。
    さらに多言語化、度重なる更新、UIとドキュメントのギャップ(日本語ユーザーで、あえて英語版を使う場合に日本語表記のマニュアルが役立たない。 また3Dソフトは他のソフトの操作体系に切り替える事ができるものが多いので、1つのやり方でドキュメントを書いても対応しきれない。)を考えると割に合いません。

    メニュー文字列はどこに?


    wings3dはコード中に「?__()」マクロを埋め込んでいて、翻訳ライブラリで有名なgettextと似た方式でメッセージデータを作っています。
    gettextと違う点は、翻訳文字列が書かれているlangファイルは、[ ]や{ }の入れ子でコード中の関数名の構造をトレースしているので
    ソースコードを知っている者はその文字列が、コードのどの局面で使われているかを予想することができます。

    しかし色々試していくと、デメリットもあり、それらがソースコードの構造に依存しすぎているため
    ヘルプ文字列やコマンド名が混在することが多く第三者がデーターベースのように分類したり抽出することは
    難しい事が分かっていきました。


    例えば、コマンド名と対応する文字列が混在していて、機械的にメッセージを抜き出しにくい。
    さらに、他の欧米言語版のlangファイルを見ると、機能追加された部分のメッセージデータが、重複キーで追加されている。
    これだと、元の場所に入れ直すの間違えればデータを壊しかねない。

    ちなみにJSONデータの場合重複キーがあると後ので上書きされてしまう。 またデータによっては、改行を ¥n で表現するタイプと、複数の引用符を並べる方式があってそれも
    JSONデータの変換の壁になっている。

    メニュー文字列の場所

    実は、wings3d本体のメニューに表示される文字列はwings_xx.langの
    (注:データは入れ子構造になっていて、この文書ではデータ内の場所を、親ー>子 の順に表記することにします。)
    "wings"ー>"init_menubar"
    "wings"ー>"tools_menu"
    "wings_view"ー> "menu"
    "wings_sel_cmd"ー> "menu"
    "wings_vertex_cmd"ー> "menu"
    "wings_shapes"ー>"prim_name"
    に分散されている。これら場所はファイル中の一カ所にまとまっている訳ではない。

    一応、"menu_util"ー>"translation_strings" という部分に
    あらゆるメニュー文字列からプリミティブ立体のコマンド名まで290個リストされてるのですが、
    イタリア語版をはじめ欧米言語のlangファイルではこの部分は未翻訳、英語のままになっている。



    もし各言語リソースに該当のキーがない場合(翻訳漏れが発生していたとしても)、英語版の項目名が適用されます。

    JSON版でデータのシミュレートを行ったときに、"wings_sel_cmd"ー>"menu"データに食い違いがあり ・未選択領域をロック
    ・undefined
    ・undefined
    ・選択領域の記憶
    ・選択領域の呼出
    このように表示されました。

    この現象は、実際のWings3dではメニューでもundfinded の項目はなぜか英語表示であったことと一致します。
    全ての翻訳構造のベースとなる英語版langファイルでは
    "104": "Unhide All Objects",
    "105": "Unlock All Objects",
    と定義されています。おそらく後で追加されたコマンドの文字列なのでしょう。
    これは、日本語版ファイルに、キー"104"と"105"に対応する文日本語字列を追加すれば実際のメニューにも表示されるようになると思います。


    もし翻訳してもメニューに変化がない場合は、キー情報が間違っている可能性があります。 本体英語メッセージ(wings_en.lang)のキー情報も一緒に確認して変更点がないか確かめた方がいいかもしれません。

    ドキュメント整備プロジェクト

    『作業メモ』
    目的:ソースコードを元に、javascript + HTMLでwings3dの全言語ヘルプのデータベースを作る。
    本体と、プラグインで別々になっているのが厄介...。一部文字コードも、追加の仕方もバラバラ、データの並び順も、組み合わせ順も不定。 また、各プラグインの英語版langファイルがない(既に埋め込まれてるから)。 まず本体リソースから。 1. 各wings_言語.langを JSONに整形 2.JSONlintとJSONeditorを活用してエラーでなくなるまで修正。 3.現在イタリア語やスウェーデン語などのデータのエラーがなくせないので、中断しています。 --再開-- 4.ドイツ語は、find grep段階でISO8859→UTF8にする際に、一部のウムラウト付きの文字が全て同じ文字に化けしてしまい、オンライン辞書の助けをかり手動で置換....。 5.ポーランド語で、引用符でかこってあるのに「,」や「[]」があるとうまくJSON化できない現象が発生。とりあえず別の文字に置き換える。 5.重複キーがあったとき対策の変換を作ったのに上手くいかない。チェコ語は3カ所同じキーで追加していたので、同じキーの場所へデータを集めた。 進捗状況 pt,svは一部文字化け
    fr,cs,pl完了

    deは文字化け修正
    zh-cn,zh-tw,ru,ko完了
    it は 保留
    あとはリリースに向けての調整作業とか。   プラグインリソースから変換。 1.shellから、各プラグインのlangファイルをfind grep catして収集、各(人間用の)言語ごと1ファイルにまとめる。 2.Javascript でErlangデータを JSONデータに整形するスクリプトを書く。
    3.JSONlintとJSONeditorを活用して、フランス語〜イタリア語までJSONデータにミスがあれば直す。 4.Javascriptで JSONデータから、メニュー別にHTMLテーブルで表示するスクリプトを書く。 5.重複キーのせいでうまくメニュー構成が生成されないので、 重複するキーに含まれるJSONデータをまとめるスクリプトを書く。 6.しかし順繰り表示は断念、Wings3dの実際のメニューの並びを元に、JSONデータの各所に散らばっているメニュー項目文字列を探して正しい並びで表示させる。 7.プラグインでは、言語よって項目が翻訳されてない場合があり、そこを英語版で補完しようとしたが、そもそもプラグイン全体で英語のlangファイルは存在しない。 8.そこでshellから、各プラグインのerlファイルを find cat してテキストファイル(1.8MB程度)を作り、そこから英語のlangデータを作ることに。 9.そのデータを元に、他言語のプラグインのJSONデータ中のキーワードを元に関数名で検索して、関数名と、その中に含まれる(であろう)文字列を抽出 10.ゴミデータを除去したりして、なんとか読めるJSONデータを生成。 11.JSONlintとJSONeditorを活用して、正しいJSONデータになるまで修正を行う。 12.langファイルに著作権表示のあるものは、その部分をCopyrightキーとして、JSONデータに格納する。 英語版はソースコードに直接メッセージとして書かれているので プラグインのen.langファイルは存在しない、 そのため、各ソースコードから関数名とメッセージデータを収集してJSONツリーを作ることにしました。 特に、Fun(無名関数)内にあるメッセージの場合、上手く収集してくれなかったりした。 しかし一部、他のlangファイルと食い違ったり、キー名を取り損ねたり。不完全なデータ。 例えば↓
    ソースコードから、関数名と文字列を抽出した英語版
    "wpc_turnedge": {
                "turn_menu": {
                    "turn": "Turn"
                },
    ----------------------------
    フランス語版や他の言語のlangファイルでは なぜか command_menu キーに登録してある。
    "wpc_turnedge":
     {
       "command_name":
       {
        "turn":"Tourner"
    
    他に抽出の際key名が消失した部分をMISSING_KEY+連番数として保留にしておいた。

    13.ビュアーの体裁を作る。また、JSONデータの複数同時読み込みは面倒なので、とりあえず対策を練る。
    14.メニューの並びを再現するために、JSONデータのあちこちに散在しているデータを拾い集め、正しい順序で並び替える。
    15.メニュー別に並び替える。
    16.言語切り替え、サブメニューの開閉を作成する。
    == ヘルプ文字列再構築の伏線 ==
    17.ヘルプ文字列データを検索できるようにする(本体&プラグイン)。
    18.この逆で、英語版ヘルプ文字列を検索して、検索結果を英語版と任意の言語版とで比較可能できるようにする。
    19.ヘルプ文字列データの存在するJSONの階層パスを、検索結果表の左側の言語の方をクリックで取得可能する。ついでに文字列も取得。
    20.取得したパスは、取得欄に収集される。また欄のリセットも行えるようにする。
    21.ヘルプに含まれる文字列を検索フレーズにして、メニュー項目順に「|」で区切ってOR検索すると必要な文字列をあぶり出せる。
      あとは関連づけたい項目を探して、コマンド名と説明文をクリックすると、関連づけに必要な中間データが出てくるようにする。
    22.中間データのテストデータを作り、それを元に表として生成させるようにする。別言語であれば、英語メニューの名称も併記させる。
    == ヘルプ文字列の関連づけ ==
    23.最後はひたすら全データを関連づける(通常メニュー)。
    24.マウス右クリックメニューは、押すボタンによってさらに1〜3通りあるので、それも関連づけ、および表示させる。(Todo)
    == 
    
    26.変則的なデータをまとめるために、中間データの書式を拡張。
    27. Plane cut など、英語データのKey名を変換できなかった部分を他の言語版の構造と照らし合わせて訂正。
    ==
    28.デザイン、UIの整備,Charaset を en に変更。
    29.Firefox のローカル環境でテスト
    30.Safariのローカル環境でテスト失敗  JSONの配列オブジェクトが Undefined is not Object とかエラー。
    
    どうやらファイルが全部読み込まれてないらしい。
    $.getを $.ajaxに変更したらさらにひどくなったので戻す。
    非同期処理にJavascript のジェネレータを利用しようとしたら yieldが定義されてない!? 謎のエラー。
    コンソールログ流して調べたら、両ブラウザReady関数が起動するタイミングが全く違う
    とりあえず、Ready待ちで表示させるか、$getの際にカウントして、規定数以上読み込んだら表示処理に移行させるかにした。
    
    31.Firefox,Safari ローカルとサーバー環境で読み込みテスト。
    
    

    仮データ

    作業停止中。

    そこでその差を少しでも埋める仕組み(Documentation Interface)を考えることにしました。例えばソースコードからそれら情報を取得できれば便利かもしれません。

    以下の表は(不完全ですが) Wings3dのソースコードの中から言語ファイル(Erlangのリスト)をJSON形式に無理矢理変換し、ソースコードからメニュー構成を調べ、HTMLとして人間に分かる形で再構築したものです。今のところ英語版と日本語版を作成する事ができました。
    (( File Menu ))
    NameD.2S.Description
    新建
    (New)
    --創建一個新的空的場景
    打開 ...
    (Open...)
    --打開一個以前保存的場景
    合併 ...
    (Merge...)
    --合併以前保存的場景到當前的場景
    保存
    (Save)
    --保存當前場景
    (( File Menu ))
    NameD.2S.Description
    Neu
    (New)
    --Neue, leere Szene erzeugen
    Öffnen...
    (Open...)
    --Gespeicherte Szene Öffnen
    Zusammenfähren...
    (Merge...)
    --Gespeicherte Szene in die aktuelle Szene einfügen
    (( File Menu ))
    NameD.2S.Description
    Nowy
    (New)
    --Tworzy nową, pustą scenę
    Otwórz...
    (Open...)
    --Otwiera wcześniej zapisaną scenę
    Dołącz...
    (Merge...)
    --Dołącza zapisaną wcześniej scenę do aktualnie otwartej
    Zapisz
    (Save)
    --Zapisuje aktualną scenę
    Zapisz jako...
    (Save As...)
    --

    wings_en

    FileEditViewSelectToolsWindowHelp
    • New
    • Open...
    • Load...
    • Merge...
    • Save
    • Save As...
    • Save Selected...
    • Save Incrementally
    • Save Unused Materials
    • Revert
    • Import
    • Export
    • Export Selected
    • Import Image...
    • Install Plug-In
    • Exit
    • Undo/Redo
    • Redo
    • Undo
    • Repeat
    • Plug-in Manager...
    • Plug-in Preferences
    • Show
      • Ground Plane
      • Axes
      • Show Info Text
      • Show Saved BB
      • Show BB Center
      • Clipping Planes
      • Show Normals
      • Show Colors
      • Show Materials
      • Show Textures
    • Wireframe
    • Shade
    • Toggle Wireframe
    • Show Edges
    • Show Backfaces
    • Show Wireframe Backfaces
    • Workmode
    • Toggle Proxy Mode
    • Quick Smoothed Preview
    • Shaders:
    • Scene Lights
    • One Light
    • Orthographic View
    • Reset View
    • Aim
    • Aim the camera at the selected element
    • Frame
    • Frame Disregards Mirror
    • Align to Selection
    • Saved Views:
    • Numeric Camera Position
    • View Along
    • Camera Settings...
    • Auto Rotate
    • Deselect
    • Clear the selection
    • More
    • Less
    • Similar
    • Edge Loop
      • Edge Loop
      • Edge Loop to Region
      • Edge Ring
      • Every Nth Ring
        • Second
        • Third
        • Nth...
        • 6 or More
      • Previous Edge Loop
      • Next Edge Loop
      • Select the next edge loop
      • Grow Edge Loop
      • Shrink Edge Loop
      • Grow Edge Ring
      • Shrink Edge Ring
      • To Complete Loops
    • Adjacent
      • Adjacent
      • Vertices
      • Edges
      • Faces
      • Objects
    • By
      • Hard Edges
      • Isolated Vertices
      • Vertices With
        • 2 Edges
        • 3 Edges
        • 4 Edges
        • 5 Edges
      • Faces With
        • 2 Edges
        • 3 Edges
        • 4 Edges
        • 5 or More
      • Non Quadrangle Faces
        • All Non Quadrangle Faces
        • Odd Non Quadrangle Faces
        • Even Non Quadrangle Faces
      • Random
      • Short Edges
      • Sharp Edges
      • Vertex Path
        • Fewest Edges Path
        • Shortest Path (Dijkstra)
        • Shortest Path (A-Star)
      • Material Edges
      • UV-Mapped Faces
      • Id...
    • Lights
    • Select all elements
    • Inverse
    • Hide Selected
    • Hide Unselected
    • Lock Unselected
    • Unhide All Objects
    • Unlock All Objects
    • Store Selection
    • Recall Selection
    • New Group...
    • Align
    • Center
    • Bounding Box
    • Set Default Axis
    • Virtual Mirror
    • Screenshot
    • Scene Info: Area & Volume
    • Put on Ground
    • Unitize
    • Tweak
    • Connect
    • Magnet Mask
    • Snap Image
    • Geometry Graph
    • Outliner
    • Palette
    • New Geometry Window
    • Console
    • Tweak Palette
    • Getting Started
    • Using a Mouse With One or Two Buttons
    • French and German Keyboards
    • Defined Hotkeys
    • How To Define Hotkeys
    • Light Basics
    • Default Commands
    • Performance Tips
    • OpenGL Info
    • About Wings 3D
    • Tweak
    VertexEdgeFaceBodyShape(Primitive)
    • Move
    • Rotate
    • Scale Uniform
    • Scale Axis
    • Scale Radial
    • Absolute Commands
    • Shift

    • Extrude

    • Flatten
    • Intersect

    • Connect
    • Tighten
    • Bevel
    • Dissolve
    • Collapse
    • Weld
    • Deform
      • Inflate elements
      • Crumple
      • Inflate Cylindrical
      • Inflate
      • Taper
      • Twist
      • Torque

    • Vertex Color

    • Set Constraint

    • Bend
    • Bend Clamped
    • Move
    • Rotate
    • Scale Uniform
    • Scale Axis
    • Scale Radial
    • Slide
    • Absolute Commands
    • Shift

    • Extrude
    • Crease

    • Flatten
    • Intersect

    • Cut
    • Corner
    • Connect
    • Bevel
    • Flow Connect

    • Dissolve
    • Collapse

    • Hardness

    • Circularise
    • Loop Cut
    • Vertex Color

    • Set Constraint

    • Turn
    • Move
    • Rotate
    • Scale Uniform
    • Scale Axis
    • Scale Radial
    • Absolute Commands
    • Shift

    • Extrude
    • Extract
    • Shell Extrude
    • Sweep

    • Flatten

    • Inset
    • Intrude
    • Bevel
    • Bridge
    • Plane Cut

    • Bump
    • Lift
    • Put On

    • Mirror
    • Dissolve
    • Collapse
    • Smooth
    • Tesselate

    • Hide
    • Hole

    • Material
    • Vertex Color

    • Set Constraint
    • UV Mapping
    • Move
    • Rotate
    • Scale Uniform
    • Scale Axis
    • Scale Radial
    • Absolute Commands
    • Shift

    • Flip...
    • Explode

    • Invert

    • Tighten
    • Smooth
    • Doo Sabin Subdivision
    • Combine
    • Separate

    • Weld
    • Plane Cut

    • Cleanup
    • Auto-Smooth

    • Duplicate
    • Delete
    • Rename

    • Unhide Faces
    • vertex attributes
    • Object To Area Light
    • Vertex Color

    • UV Mapping
    • Tetrahedron
    • Octahedron
    • Octotoad
    • Dodecahedron
    • Icosahedron

    • Cube

    • Cylinder
    • Cone
    • Sphere
    • Torus

    • Grid

    • Text
    • Light
    • Material...
    • Image...
    • Image Plane...

    • Bounding Box...

    • More
    • Gear
    • Tube

    • GeoDome

    • Torus Knot

    • N-Cube
    • N-Gon

    • Regular Plane

    • Spiral

    • UV Torus
    • Lumpy Torus
    • Spiral Torus
    VertexEdgeFaceBodyShape(Primitive)
    • Scale Snap Image
      • Horizontal
      • Vertical
      • Free
      • Uniform
      • Proportional
    • Move Snap Image
      • Horizontal
      • Vertical
      • Free

      • Center
      • Center X
      • Center Y
    • Fit Snap Image
      • Both
      • Horizontal
      • Vertical
    • Exit Snap Mode
    • Scale Snap Image
      • Horizontal
      • Vertical
      • Free
      • Uniform
      • Proportional
    • Move Snap Image
      • Horizontal
      • Vertical
      • Free

      • Center
      • Center X
      • Center Y
    • Fit Snap Image
      • Both
      • Horizontal
      • Vertical
    • Exit Snap Mode
    • Snap Image
    • Scale Snap Image
      • Horizontal
      • Vertical
      • Free
      • Uniform
      • Proportional
    • Move Snap Image
      • Horizontal
      • Vertical
      • Free

      • Center
      • Center X
      • Center Y
    • Fit Snap Image
      • Both
      • Horizontal
      • Vertical
    • Exit Snap Mode
    • Scale Snap Image
      • Horizontal
      • Vertical
      • Free
      • Uniform
      • Proportional
    • Move Snap Image
      • Horizontal
      • Vertical
      • Free

      • Center
      • Center X
      • Center Y
    • Fit Snap Image
      • Both
      • Horizontal
      • Vertical
    • Exit Snap Mode
    • Scale Snap Image
      • Horizontal
      • Vertical
      • Free
      • Uniform
      • Proportional
    • Move Snap Image
      • Horizontal
      • Vertical
      • Free

      • Center
      • Center X
      • Center Y
    • Fit Snap Image
      • Both
      • Horizontal
      • Vertical
    • Exit Snap Mode
    Vertex
    (Segmenting mode )
    Edge
    (Segmenting mode )
    Face
    (Segmenting mode )
    ▶▶▶    



    Projection/Feat.Detect
    by AutoSegmenting

    or

    MarkEdge/Select Chart
    by User



     Continue ▶▶
    Unfold
    (Segmenting mode )
    • Continue

    • Segment by
      • Projection
      • FeatureDetection
    • Continue

    • Segment by
      • Projection
      • FeatureDetection

    • MarkEdgesforCut
    • UnmarkEdges

    • SelectMarkedEdges
    • Continue

    • Segment by
      • Projection
      • FeatureDetection

    • chart1
    • chart2
    • chart3
    • chart4
    • chart5
    • chart6
    • chart7
    • chart8
    • chart9
    • IgnoreFaces

    • Select
    • Unfolding
    • ProjectionNormal
    • ProjectionCamera
    • SphereMap
    • CylindricalMap
    Vertex
    (AutoUV mode )
    Edge
    (AutoUV mode )
    Face
    (AutoUV mode )
    Body
    (AutoUV mode )
    CreateTexture
    (No Selection )
    • Move
      • Free
      • Horizontal
      • Vertical
    • Scale
      • Uniform
      • Horizontal
      • Vertical
    • Rotate
      • Free
      • Chart to X
      • Chart to Y

    • Flatten
    • Tighten

    • Unfold
    • SphereMap

    • Create Texture
    • Move
      • Free
      • Horizontal
      • Vertical
    • Scale
      • Uniform
      • Horizontal
      • Vertical
    • Rotate
      • Free
      • Chart to X
      • Chart to Y
    • Slide
    • Distribute

    • Stitch
    • Cut

    • Create Texture
    • Move
      • Free
      • Horizontal
      • Vertical
    • Scale
      • Uniform
      • Horizontal
      • Vertical
    • Rotate

    • Project-Unfold

    • Create Texture
    • Move
      • Free
      • Horizontal
      • Vertical
    • Scale
      • Uniform
      • Horizontal
      • Vertical

      • Max Uniform
      • Max Horizontal
      • Max Vertical
      • Normalize Sizes
    • Rotate

    • Move to
    • Flip

    • Tighten

    • Hide
    • Delete

    • ReMap UV

    • Create Texture
    • Create Texture

    wings_jp

    ファイル編集表示選択ツールウインドウヘルプ
    • 新規作成
    • 開く...
    • 読込み...
    • 合流...
    • 保存
    • 別名で保存...
    • 選択領域を保存...
    • 連番ファイル名で保存
    • 未使用マテリアルを保持
    • 復帰
    • 読込み
    • 書き出し
    • 選択領域の書き出し
    • イメージの読み込み...
    • プラグインのインストール
    • 終了
    • 取り消し/やり直し
    • やり直し
    • 取り消し
    • 繰り返し
    • プラグイン管理...
    • プラグイン環境設定
    • 補助情報の表示
      • 地面
      • 情報テキストを表示
      • 保存されたBBを表示
      • BBの中心を表示
      • クリッピング平面
      • 法線を表示
      • カラー表示
      • マテリアル表示
      • テクスチャ表示
    • ワイヤフレーム表示
    • 陰影表示
    • ワイヤフレーム表示の切替
    • 辺を表示
    • 面の裏側を表示
    • ワイヤフレームの裏側を表示
    • フラット/スムーズ表示切替
    • Proxyモード切替(選択のみ)
    • Proxyモード切替(すべて)
    • シェーダー:
    • シーン光源
    • 1つの光源
    • 正投影ビュー
    • ビューをリセット
    • 注視
    • 注視(選択部分)
    • 注視(選択部分をフレームイン)
    • ミラー選択領域をフレームに入れない
    • 選択領域の法線に垂直なビュー
    • 記憶済みのビュー:
    • カメラ位置を数値指定...
    • 正面図ビュー(各軸の垂直面)
    • カメラ設定...
    • 自動回転
    • 全選択解除
    • 選択領域をすべて解除します
    • 選択領域を拡張
    • 選択領域を縮小
    • 類似要素を選択
    • 辺をループ/リング状に選択
      • 辺ループ選択
      • 辺ループを領域化
      • 辺リング選択
      • N番目毎にリング選択
        • 2番目
        • 3番目
        • N番目...
        • 6番目以上
      • 1つ前の辺ループ
      • 1つ後の辺ループ
      • 1つ後にある辺のループを選択
      • 辺ループを拡張
      • 辺ループを縮小
      • 辺リングを拡張
      • 辺リングを縮小
      • 完全なループにする
    • 選択モード切替
      • 選択モード切替
      • 頂点
      • オブジェクト
    • 共通の特徴で抽出
      • ハードエッジ
      • 孤立点
      • 頂点に繋がる辺の数
        • 2辺で
        • 3辺で
        • 4辺で
        • 5辺で
      • 面を取り囲む辺の数
        • 2辺で
        • 3辺で
        • 4辺で
        • 5辺以上
      • 非四角ポリゴン
        • すべての非四辺形(正方形,長方形,菱形等)の面
        • Odd Non Quadrangle Faces
        • Even Non Quadrangle Faces
      • ランダムな確率で選択
      • 短い辺を選択
      • 鋭利な辺を選択
      • 頂点パス
        • 最短経路で辺選択
        • 最短経路で辺選択(Dijkstra)
        • 最短経路で辺選択(A-Star)
      • マテリアルが設定された辺
      • UVマッピングされた面
      • Id...
    • 光源
    • 全ての要素を選択
    • 選択領域の反転
    • 選択領域を隠す
    • 未選択領域を隠す
    • 未選択領域をロック
    • undefined
    • undefined
    • 選択領域の記憶
    • 選択領域の呼出
    • 新規グループ作成...
    • 整列
    • 中心に配置
    • バウンディングボックス
    • デフォルト軸を設定
    • バーチャルミラー
    • スクリーンショット
    • シーン情報:エリアとボリューム
    • 地面に接地
    • ユニタイズ
    • Tweak
    • コネクトモード
    • マグネットマスク
    • イメージにスナップ
    • ジオメトリグラフ
    • アウトライナー
    • パレット
    • 新規ジオメトリウインドウ
    • コンソール
    • Tweakパレット
    • Wings3D入門
    • 1ボタン・2ボタンマウスを使う
    • 仏/独語配列キーボードの問題
    • 定義済みホットキーリスト
    • ホットキーの登録方法
    • 光源の基本
    • デフォルトコマンドについて
    • 効率よく制作するヒント
    • OpenGL情報
    • Wings 3D について
    • Tweak機能について
    頂点全体Shape(Primitive)
    • 移動
    • 回転
    • 拡大縮小(一様に)
    • 拡大縮小(軸方向)
    • 拡大縮小(放射状に)
    • 絶対座標コマンド
    • シフト

    • 押し出し

    • 平均化
    • 交差と接地(頂点)

    • 接続
    • 緊縮
    • ベベル
    • 削除
    • 削除(コラプス)
    • 接合
    • デフォルメ
      • 膨張要素
      • もみくちゃ
      • 膨張(円柱状)
      • 膨張
      • テーパ
      • 途中をひねる
      • ねじる

    • 頂点カラー

    • コンストレイント定規

    • 曲げる(くの字)
    • 曲げる(コの字)
    • 移動
    • 回転
    • 拡大縮小(一様に)
    • 拡大縮小(軸方向)
    • 拡大縮小(放射状に)
    • スライド
    • 絶対座標コマンド
    • シフト

    • 押し出し
    • 折り目

    • 平均化
    • 接地&交差

    • 分割
    • コーナー
    • 接続
    • ベベル
    • Flow Connect

    • 削除
    • 削除(コラプス)

    • ハード属性の切替

    • Circularise
    • 輪切り
    • 頂点カラー

    • コンストレイント定規

    • ターン
    • 移動
    • 回転
    • 拡大縮小(一様に)
    • 拡大縮小(軸方向)
    • 拡大縮小(放射状に)
    • 絶対座標コマンド
    • シフト

    • 押し出し
    • 面を剥がす
    • 押し出し(造殻型)
    • 旋回

    • 平均化

    • Inset
    • くり抜き
    • ベベル
    • ブリッジ
    • 平面で分割

    • でこぼこ
    • リフト
    • 対象面に乗せる

    • ミラー
    • 削除(ディゾルブ)
    • 削除(コラプス)
    • スムーズ(Catmull-Clark)
    • テッセレート

    • 隠す
    • 穴を開ける

    • マテリアル
    • 頂点カラー

    • コンストレイント定規
    • UVマッピング
    • 移動
    • 回転
    • 拡大縮小(一様に)
    • 拡大縮小(軸方向)
    • 拡大縮小(放射状に)
    • 絶対座標コマンド
    • シフト

    • 反転...
    • 爆散(Explode)

    • 法線を反転

    • 緊縮
    • スムーズ(Catmull-Clark)
    • スムーズ(Doo Sabin)
    • 合体
    • 分離

    • 接合
    • 平面で分割

    • クリーンナップ
    • 自動スムージング(Auto-Smooth)

    • 複製
    • 削除
    • リネーム

    • undefined
    • 頂点属性
    • 選択オブジェクトをエリア光源に変換
    • 頂点カラー

    • UVマッピング
    • 正四面体
    • 正八面体
    • 斜方八面体
    • 正十二面体
    • 正二十面体

    • 立方体

    • 円柱
    • 錐体
    • トーラス

    • グリッド

    • テキスト
    • 光源
    • マテリアル...
    • イメージ...
    • 平面(イメージ)...

    • バウンディングボックス...

    • More
    • 歯車
    • チューブ

    • ジオドーム

    • トーラス(結び目)

    • N-立方体
    • N-角形

    • 正規平面

    • らせん

    • トーラス(UV)
    • トーラス(数珠)
    • トーラス(らせん)
    頂点全体Shape(Primitive)
    • イメージをスナップして拡大縮小
      • 水平方向に反転
      • 垂直方向に反転
      • 自由回転
      • 拡大縮小(一様に)
      • 画像を拡大縮小(一様に)
    • スナップしたイメージを移動
      • 水平方向に反転
      • 垂直方向に反転
      • 自由回転

      • 中央へ
      • 中央へ(X方向)
      • 中央へ(Y方向)
    • フィット
      • フィット(全体)
      • 水平方向に反転
      • 垂直方向に反転
    • スナップモードを終了
    • イメージをスナップして拡大縮小
      • 水平方向に反転
      • 垂直方向に反転
      • 自由回転
      • 拡大縮小(一様に)
      • 画像を拡大縮小(一様に)
    • スナップしたイメージを移動
      • 水平方向に反転
      • 垂直方向に反転
      • 自由回転

      • 中央へ
      • 中央へ(X方向)
      • 中央へ(Y方向)
    • フィット
      • フィット(全体)
      • 水平方向に反転
      • 垂直方向に反転
    • スナップモードを終了
    • スナップイメージ
    • イメージをスナップして拡大縮小
      • 水平方向に反転
      • 垂直方向に反転
      • 自由回転
      • 拡大縮小(一様に)
      • 画像を拡大縮小(一様に)
    • スナップしたイメージを移動
      • 水平方向に反転
      • 垂直方向に反転
      • 自由回転

      • 中央へ
      • 中央へ(X方向)
      • 中央へ(Y方向)
    • フィット
      • フィット(全体)
      • 水平方向に反転
      • 垂直方向に反転
    • スナップモードを終了
    • イメージをスナップして拡大縮小
      • 水平方向に反転
      • 垂直方向に反転
      • 自由回転
      • 拡大縮小(一様に)
      • 画像を拡大縮小(一様に)
    • スナップしたイメージを移動
      • 水平方向に反転
      • 垂直方向に反転
      • 自由回転

      • 中央へ
      • 中央へ(X方向)
      • 中央へ(Y方向)
    • フィット
      • フィット(全体)
      • 水平方向に反転
      • 垂直方向に反転
    • スナップモードを終了
    • イメージをスナップして拡大縮小
      • 水平方向に反転
      • 垂直方向に反転
      • 自由回転
      • 拡大縮小(一様に)
      • 画像を拡大縮小(一様に)
    • スナップしたイメージを移動
      • 水平方向に反転
      • 垂直方向に反転
      • 自由回転

      • 中央へ
      • 中央へ(X方向)
      • 中央へ(Y方向)
    • フィット
      • フィット(全体)
      • 水平方向に反転
      • 垂直方向に反転
    • スナップモードを終了
    Vertex
    (Segmenting mode )
    Edge
    (Segmenting mode )
    Face
    (Segmenting mode )
    ▶▶▶    



    Projection/Feat.Detect
    by AutoSegmenting

    or

    MarkEdge/Select Chart
    by User



     Continue ▶▶
    Unfold
    (Segmenting mode )
    • 続ける

    • セグメント化する...
      • 投影
      • 自動セグメント化
    • 続ける

    • セグメント化する...
      • 投影
      • 自動セグメント化

    • マークを付けた辺でカットします
    • 辺に付けたマークを消します

    • 選択した辺をマークします
    • 続ける

    • セグメント化する...
      • 投影
      • 自動セグメント化

    • UVチャート1
    • UVチャート2
    • UVチャート3
    • UVチャート4
    • UVチャート5
    • UVチャート6
    • UVチャート7
    • UVチャート8
    • UVチャート9
    • 面を無視

    • 選択
    • UV展開する
    • 法線で投影
    • カメラ視点で投影
    • 球面マップ
    • 円柱マップ
    Vertex
    (AutoUV mode )
    Edge
    (AutoUV mode )
    Face
    (AutoUV mode )
    Body
    (AutoUV mode )
    CreateTexture
    (No Selection )
    • 移動
      • 最大拡張(一様に)
      • 水平に最大拡張
      • 垂直に最大拡張
    • 拡大縮小
      • 拡大縮小(一様に)
      • 水平
      • 垂直
    • 回転
      • 自由回転
      • チャートをX軸に回転
      • チャートをY軸に回転

    • 平均化
    • 緊縮

    • UV展開
    • 球面マップ

    • テクスチャを作成
    • 移動
      • 最大拡張(一様に)
      • 水平に最大拡張
      • 垂直に最大拡張
    • 拡大縮小
      • 拡大縮小(一様に)
      • 水平
      • 垂直
    • 回転
      • 自由回転
      • チャートをX軸に回転
      • チャートをY軸に回転
    • スライド
    • 分布

    • スティッチ
    • カット

    • テクスチャを作成
    • 移動
      • 最大拡張(一様に)
      • 水平に最大拡張
      • 垂直に最大拡張
    • 拡大縮小
      • 拡大縮小(一様に)
      • 水平
      • 垂直
    • 回転

    • UV展開(投影)

    • テクスチャを作成
    • 移動
      • 最大拡張(一様に)
      • 水平に最大拡張
      • 垂直に最大拡張
    • 拡大縮小
      • 拡大縮小(一様に)
      • 水平
      • 垂直

      • Max Uniform
      • Max Horizontal
      • Max Vertical
      • サイズの正規化
    • 回転

    • 移動先...
    • 反転...

    • 緊縮

    • 隠す
    • 削除

    • UVを再マッピング

    • テクスチャを作成
    • テクスチャを作成

    wings_fr

    About Authors
    %%     French language strings.
    %%  Copyright (c) 2004 Nicolas Bouillard
    %%  Revised and corrected by Vital Proulx (aka TulipVorlax) in 2007-2009
    %%  See the file "license.terms" for information on usage and redistribution
    %%  of this file, and for a DISCLAIMER OF ALL WARRANTIES.
    
    FichierÉditionVueSélectionnerOutilsFenêtresAide
    • Nouveau
    • Ouvrir...
    • Load...
    • Fusionner...
    • Sauvegarder
    • Sauvegarder sous...
    • Sauvegarder la sélection...
    • Sauvegarder une version
    • Enregistrer les matériaux non utilisés
    • Rétablir
    • Importer
    • Exporter
    • Exporter la sélection
    • Importer une image...
    • Installer un plugiciel
    • Quitter
    • Annuler/Rétablir
    • Rétablir
    • Annuler
    • Répéter
    • Gestionnaire de plugiciels...
    • Préférences des plugiciels
    • Montrer
      • Plan du sol
      • Axes
      • Montrer le texte d'informations
      • Montrer la boite englobante mémorisée
      • Montrer le centre de la boîte
      • Plans de rognure
      • Montrer les normales
      • Montrer les couleurs
      • Montrer les matériaux
      • Montrer les textures
    • Fil de fer
    • Ombrage
    • Bascule le fil de fer
    • Montrer les arêtes
    • Show Backfaces
    • Montrer les facettes arrières en fil de fer
    • Mode de travail
    • Bascule le mode subdivision simulée
    • Prévisualisation lissée
    • Ombrages :
    • Lumières de la scène
    • Une lumière
    • Vue orthographique
    • Rétablir la vue
    • Viser
    • Pointe la caméra vers les éléments sélectionnés
    • Recadrer
    • Recadrer sans souci du miroir virtuel
    • Aligner sur la sélection
    • Vues mémorisées :
    • Positionnement numérique de la caméra
    • Vue le long
    • Paramètres de la caméra...
    • Rotation automatique
    • Désélectionner
    • Enlever la sélection
    • Plus
    • Moins
    • Similaire
    • Boucle d'arête
      • Boucle d'arête
      • Boucle d'arête en région
      • Anneau d'arêtes
      • Every Nth Ring
        • Second
        • Third
        • Nth...
        • 6 ou plus
      • Boucle d'arêtes précédente
      • Boucle d'arêtes suivante
      • Sélectionne la boucle d'arêtes suivante
      • Prolonger la boucle d'arêtes
      • Raccourcir la courbe d'arêtes
      • Prolonger l'anneau d'arêtes
      • Raccourcir l'anneau d'arêtes
      • À la boucle complète
    • Adjacent
      • Adjacent
      • Sommets
      • Arêtes
      • Facettes
      • Objets
    • Par
      • Arêtes dures
      • Sommets isolés
      • Sommets avec
        • 2 arêtes
        • 3 arêtes
        • 4 arêtes
        • 5 arêtes
      • Facettes avec
        • 2 arêtes
        • 3 arêtes
        • 4 arêtes
        • 5 ou plus
      • Les facettes non quadrangulaires
        • Toutes les facettes non quadrangulaires
        • Les facettes non quadrangulaires impaires
        • Les facettes non quadrangulaires paires
      • Aléatoire
      • Arêtes courtes
      • Arêtes pointues
      • Chemin de sommets
        • Chemin avec moins d'arêtes
        • Chemin le plus court (Dijkstra)
        • Chemin le plus court (A-Star)
      • Matériau des arêtes
      • Facettes avec mappage UV
      • Id...
    • Lumières
    • Sélectionne tous les éléments
    • Inverser
    • Cacher sélectionés
    • Cacher désélectionés
    • Verrouiller désélectionés
    • Unhide All Objects
    • Unlock All Objects
    • Mémoriser la sélection
    • Rappelle la sélection
    • Nouveau groupe...
    • Aligner
    • Centrer
    • Bounding Box
    • Établir l'axe par défaut
    • Miroir virtuel
    • Capture d'écran
    • Informations sur la scène : Aire et volume
    • Placer au sol
    • Uniformiser
    • Tweak
    • Connecter
    • Masque d'aimant
    • Épingler l'image
    • Graphique des géométries
    • Profil de scène
    • Palette
    • Nouvelle fenêtre de géométrie
    • Console
    • Tweak Palette
    • Premiers pas...
    • Utiliser une souris à un ou deux boutons
    • Claviers AZERTY ou autres
    • Raccourcis clavier définis
    • Comment définir un raccourci clavier
    • Lumières : les bases
    • Commandes par défaut
    • Conseils sur la performance
    • Informations OpenGL
    • À propos de Wings 3D...
    • Tweak
    SommetArêteFacetteCorpsShape(Primitive)
    • Déplacer
    • Faire tourner
    • Mise à l'échelle uniforme
    • Mise à l'échelle par axe
    • Mise à l'échelle radiale
    • Commandes absolues
    • Décalage

    • Extruder

    • Aplanir
    • Intersection

    • Connecter
    • Resserer
    • Biseauter
    • Dissoudre
    • Réduire
    • Souder
    • Déformer
      • Dilater les éléments
      • Froisser
      • Rendre cylindrique
      • Dilater
      • Effiler
      • Tordre
      • Enrouler

    • Couleur de sommets

    • Set Constraint

    • Pli
    • Pli serré
    • Déplacer
    • Faire tourner
    • Mise à l'échelle uniforme
    • Mise à l'échelle par axe
    • Mise à l'échelle radiale
    • Glisser
    • Commandes absolues
    • Décalage

    • Extruder
    • Crease

    • Aplanir
    • Intersection

    • Couper
    • Corner
    • Connecter
    • Biseauter
    • Flow Connect

    • Dissoudre
    • Réduire

    • Dureté

    • Circulariser
    • Sectionner par une boucle
    • Couleur de sommet

    • Set Constraint

    • Tourner
    • Déplacer
    • Faire tourner
    • Mise à l'échelle uniforme
    • Mise à l'échelle par axe
    • Mise à l'échelle radiale
    • Commandes absolues
    • Décalage

    • Extruder
    • Extraire
    • Extruder coquille
    • Extrusion giratoire

    • Aplanir

    • Insérer
    • Évider
    • Biseauter
    • Ponter
    • Plane Cut

    • Bosseler
    • Soulever
    • Déposer sur

    • Miroir
    • Dissoudre
    • Réduire
    • Subdiviser
    • Polygoniser

    • Cacher
    • Trou

    • Matériau
    • Couleur de sommet

    • Set Constraint
    • Mappage UV
    • Déplacer
    • Faire tourner
    • Mise à l'échelle uniforme
    • Mise à l'échelle par axe
    • Mise à l'échelle radiale
    • Commandes absolues
    • Décalage

    • Basculer
    • Explode

    • Inverser

    • Resserrer
    • Subdiviser
    • Subdivision Doo-Sabin
    • Combiner
    • Séparer

    • Souder
    • Plane Cut

    • Nettoyer
    • Lissage automatique

    • Dupliquer
    • Supprimer
    • Renommer...

    • Unhide Faces
    • propriétés du sommet
    • Objet vers aire de lumière
    • Couleur de sommet

    • Mappage UV
    • Tétraèdre
    • Octaèdre
    • Rhombicuboctaèdre
    • Dodécaèdre
    • Icosaèdre

    • Cube

    • Cylindre
    • Cône
    • Sphère
    • Tore

    • Grille

    • Texte
    • Lumière
    • Matériau...
    • Image...
    • Image sur une surface...

    • Boite englobante

    • More
    • Engrenage
    • Tube

    • Dôme géodésique

    • Noeud de tore

    • Cube N
    • Polygone

    • Plan régulier

    • Spirale

    • Tore UV
    • Tore boursoufflé
    • Tore en spirale
    SommetArêteFacetteCorpsShape(Primitive)
    • Mise à l'échelle épinglée de l'image
      • Horizontalement
      • Verticalement
      • Libre
      • Uniforme
      • undefined
    • Déplacement épinglé de l'image
      • Horizontalement
      • Verticalement
      • Libre

      • undefined
      • undefined
      • undefined
    • undefined
      • undefined
      • Horizontalement
      • Verticalement
    • Quitter mode épinglage
    • Mise à l'échelle épinglée de l'image
      • Horizontalement
      • Verticalement
      • Libre
      • Uniforme
      • undefined
    • Déplacement épinglé de l'image
      • Horizontalement
      • Verticalement
      • Libre

      • undefined
      • undefined
      • undefined
    • undefined
      • undefined
      • Horizontalement
      • Verticalement
    • Quitter mode épinglage
    • Épingler l'image
    • Mise à l'échelle épinglée de l'image
      • Horizontalement
      • Verticalement
      • Libre
      • Uniforme
      • undefined
    • Déplacement épinglé de l'image
      • Horizontalement
      • Verticalement
      • Libre

      • undefined
      • undefined
      • undefined
    • undefined
      • undefined
      • Horizontalement
      • Verticalement
    • Quitter mode épinglage
    • Mise à l'échelle épinglée de l'image
      • Horizontalement
      • Verticalement
      • Libre
      • Uniforme
      • undefined
    • Déplacement épinglé de l'image
      • Horizontalement
      • Verticalement
      • Libre

      • undefined
      • undefined
      • undefined
    • undefined
      • undefined
      • Horizontalement
      • Verticalement
    • Quitter mode épinglage
    • Mise à l'échelle épinglée de l'image
      • Horizontalement
      • Verticalement
      • Libre
      • Uniforme
      • undefined
    • Déplacement épinglé de l'image
      • Horizontalement
      • Verticalement
      • Libre

      • undefined
      • undefined
      • undefined
    • undefined
      • undefined
      • Horizontalement
      • Verticalement
    • Quitter mode épinglage
    Vertex
    (Segmenting mode )
    Edge
    (Segmenting mode )
    Face
    (Segmenting mode )
    ▶▶▶    



    Projection/Feat.Detect
    by AutoSegmenting

    or

    MarkEdge/Select Chart
    by User



     Continue ▶▶
    Unfold
    (Segmenting mode )
    • Continuer

    • Segmenter par
      • Projection
      • Détection des caractéristiques
    • Continuer

    • Segmenter par
      • Projection
      • Détection des caractéristiques

    • Marque les arêtes pour coupure
    • Enlever la marque

    • Sélectionner les arêtes marquées
    • Continuer

    • Segmenter par
      • Projection
      • Détection des caractéristiques

    • carte1
    • carte2
    • carte3
    • carte4
    • carte5
    • carte6
    • carte7
    • carte8
    • carte9
    • Ignorer les facettes

    • Selectionner
    • Dépliage
    • Projection normale
    • Projection de la caméra
    • Mappage sphériquue
    • Mappage cylindrique
    Vertex
    (AutoUV mode )
    Edge
    (AutoUV mode )
    Face
    (AutoUV mode )
    Body
    (AutoUV mode )
    CreateTexture
    (No Selection )
    • Déplacer
      • Maximum uniforme
      • Maximum horizontal
      • Maximum vertical
    • Mise à l'échelle
      • Uniforme
      • Horizontalement
      • Verticalement
    • Faire tourner
      • Libre
      • Carte à X
      • Carte à Y

    • Aplanir
    • Resserrer

    • Déplier
    • Mappage sphérique

    • Créer une texture
    • Déplacer
      • Maximum uniforme
      • Maximum horizontal
      • Maximum vertical
    • Mise à l'échelle
      • Uniforme
      • Horizontalement
      • Verticalement
    • Faire tourner
      • Libre
      • Carte à X
      • Carte à Y
    • Glisser
    • Répartir

    • Coudre
    • Couper

    • Créer une texture
    • Déplacer
      • Maximum uniforme
      • Maximum horizontal
      • Maximum vertical
    • Mise à l'échelle
      • Uniforme
      • Horizontalement
      • Verticalement
    • Faire tourner

    • Projection-Déplier

    • Créer une texture
    • Déplacer
      • Maximum uniforme
      • Maximum horizontal
      • Maximum vertical
    • Mise à l'échelle
      • Uniforme
      • Horizontalement
      • Verticalement

      • Max Uniform
      • Max Horizontal
      • Max Vertical
      • Normaliser les tailles
    • Faire tourner

    • Déplacer vers
    • Retourner

    • Resserrer

    • Cacher
    • Supprimer

    • Remapper les UV

    • Créer une texture
    • Créer une texture


    ■各言語データを比較することもできます。これは日本語と英語版の比較(データ量が多すぎるため、menu関連以外のキーの文字列リストは省略してあります)。
    *wings_enwings_jp
    wings
    area_info
    area_volume_info
    cannot_repeat
    crash_handler
    define_command
    edit_menu
    • 1 : Delete undo history to reclaim memory
    • 3 : Undo/Redo
    • 4 : Undo or redo the last command
    • 5 : Redo
    • 6 : Redo the last command that was undone
    • 7 : Undo
    • 8 : Undo the last command
    • 9 : Repeat
    • 10 : Repeat Args
    • 11 : Repeat Drag
    • 12 : Plug-in Preferences
    • 13 : Purge Undo History
    • 1 : メモリから作業履歴を消去します
    • 3 : 取り消し/やり直し
    • 4 : 最後に実行したコマンドの取り消し、またはやり直し
    • 5 : やり直し
    • 6 : 最後に実行したコマンドをやり直します
    • 7 : 取り消し
    • 8 : 最後に実行したコマンドを取り消します
    • 9 : 繰り返し
    • 10 : 繰り返し:入力値を参照
    • 11 : 繰り返し:マウスドラッグ量を反映
    • 12 : プラグイン環境設定
    • 13 : 作業履歴を消去
    enhanced_info
    geom_title
    handle_drop_1
    hole_info
    info_1
    info_line
    init_menubar
    • 1 : File
    • 2 : Edit
    • 3 : View
    • 4 : Select
    • 5 : Tools
    • 6 : Window
    • 7 : Help
    • 1 : ファイル
    • 2 : 編集
    • 3 : 表示
    • 4 : 選択
    • 5 : ツール
    • 6 : ウインドウ
    • 7 : ヘルプ
    item_list
    measure
    patches
    purge_undo
    shape_info
    tool_dirs
    tools_menu
    • 8 : Align
    • 9 : Center
    • 10 : Save Bounding Box
    • 11 : Scale to Saved BB
    • 12 : Scale to Saved BB Proportionally
    • 13 : Move to Saved BB
    • 14 : Set Default Axis
    • 15 : Define and store axis (with ref. point) for later use with any
    • 16 : "Default Axis" command (e.g. Scale|Default Axis)
    • 17 : Virtual Mirror
    • 18 : Create
    • 19 : Given a face selection, set up a virtual mirror
    • 20 : Break
    • 21 : Remove virtual mirrors for all objects
    • 22 : Freeze
    • 23 : Create real geometry from the virtual mirrors
    • 24 : Screenshot
    • 25 : Grab an image of the window (export it from the outliner)
    • 26 : Scene Info: Area & Volume
    • 27 : Calculate area and volume for each object in the scene
    • 28 : Put on Ground
    • 29 : Put selected objects on the ground plane
    • 30 : Unitize
    • 31 : Scale selected objects to fit inside a unit sphere and move to origin
    • 32 : Move BB to Selection
    • 33 : Scale BB to Selection
    • 34 : Set Axis and Point
    • 35 : Set Axis
    • 36 : Set Point
    • 37 : Bounding Box
    • 38 : Bounding boxes are useful for scaling or aligning objects
    • 39 : Create bounding box around current selection
    • 40 : Tweak
    • 41 : Open the Tweak menu
    • 8 : 整列
    • 9 : 中心に配置
    • 10 : バウンディングボックス(BB)のサイズを保存
    • 11 : BBのサイズに置き換え
    • 12 : BBのサイズに比率保持で置き換え
    • 13 : BBの位置へジャンプ
    • 14 : デフォルト軸を設定
    • 15 : 後で使用するための (点を参照する)軸の定義と記憶
    • 16 : "デフォルト軸"コマンド(例 拡大縮小|デフォルト軸)
    • 17 : バーチャルミラー
    • 18 : 作成
    • 19 : 選択済みの面を指定して、バーチャルミラーを設定します
    • 20 : 削除
    • 21 : すべてのオブジェクトに対応するバーチャルミラーを削除します
    • 22 : 凍結
    • 23 : バーチャルミラーから,実際の幾何形状を作り出します。
    • 24 : スクリーンショット
    • 25 : ウインドウの内容を画像として取込みます(アウトライナーへ出力されます)
    • 26 : シーン情報:エリアとボリューム
    • 27 : シーン内の各オブジェクトのエリアとボリュームを計算します
    • 28 : 地面に接地
    • 29 : 選択オブジェクトを地面に着地させます
    • 30 : ユニタイズ
    • 31 : 選択オブジェクトを原点に移動し,半径1の単位球面(Unit sphere)内に収まるサイズに変換。
    • 32 : BBを選択領域へ移動します。
    • 33 : BBを選択領域と同じサイズに変形させます
    • 34 : 軸と点を設定します
    • 35 : 軸を設定します
    • 36 : 点を設定します
    • 37 : バウンディングボックス
    • 38 : バウンディングボックスは、オブジェクトのサイズや位置を変更するのにとても便利です
    • 39 : 現在の選択領域を包括するバウンディングボックスを作成
    • 40 : Tweak
    • 41 : Tweakメニューを開く
    undo_info
    vtx_attributes
    window_menu
    • 1 : Geometry Graph
    • 2 : Geometry Graph #
    • 3 : Outliner
    • 4 : Open the outliner window (showing materials and objects)
    • 5 : Open a Geometry Graph window (showing objects)
    • 6 : Palette
    • 7 : Open the color palette window
    • 8 : New Geometry Window
    • 9 : Open a new Geometry window
    • 10 : Console
    • 11 : Open a console window for information messages
    • 12 : Tweak Palette
    • 13 : Open palettes from which tweak tools may be selected or bound to modifier keys
    • 1 : ジオメトリグラフ
    • 2 : ジオメトリグラフ#
    • 3 : アウトライナー
    • 4 : アウトライナーウインドウを開きます(マテリアルとオブジェクトを表示します)
    • 5 : ジオメトリウインドウを開きます(オブジェクトを表示します)
    • 6 : パレット
    • 7 : パレットウインドウを開きます
    • 8 : 新規ジオメトリウインドウ
    • 9 : 新規ジオメトリウインドウを開きます
    • 10 : コンソール
    • 11 : 情報や進捗状況を表示するためのコンソールウインドウを開きます
    • 12 : Tweakパレット
    • 13 : Tweakツールが揃ったパレットを開きます。修飾キーの設定もできます。
    wings_ask
    button_label
    frame_event
    mktree
    wings_body
    arealight_conv
    auto_smooth
    clean_isolated_vertices
    cleanup
    cleanup_rep_1
    cleanup_waists_1
    color_material
    delete_2edged_faces_1
    flip_ask
    flip_str
    menu
    • 2 : Move
    • 3 : Flip...
    • 10 : Invert
    • 11 : Flip all normals, turning the object inside out
    • 12 : Tighten
    • 13 : Move vertices towards average midpoint
    • 14 : Smooth
    • 15 : Subdivide all faces to give the object a smoother apperance
    • 16 : Combine
    • 17 : Combine multiple objects into a single object
    • 18 : Separate
    • 19 : Separate a combined objects into its components
    • 20 : Weld
    • 21 : Merge pair of faces that are nearly coincident
    • 22 : Cleanup
    • 23 : Remove various defects
    • 24 : Auto-Smooth
    • 25 : Set edges hard or soft depending on the angle between faces
    • 26 : Duplicate
    • 27 : Delete
    • 28 : Delete the selected objects
    • 29 : Rename
    • 30 : Rename selected objects
    • 32 : Show all faces for this object
    • 33 : Vertex Attributes
    • 34 : Flip the object along ~s axis
    • 35 : Pick point to flip object along the ~s axis
    • 36 : Flip object along the global ~s axis
    • 37 : Pick
    • 38 : Pick axis to flip object along
    • 39 : Pick axis and point to flip object along
    • 40 : Pick global axis to flip object along
    • 41 : Colors to Materials
    • 42 : Convert vertex colors to materials
    • 43 : Materials to Colors
    • 44 : Convert materials to vertex colors
    • 45 : Remove Colors
    • 46 : Remove all vertex colors
    • 47 : Remove UV Coordinates
    • 48 : Remove all UV coordinates
    • 49 : Remove All Attributes
    • 50 : Remove all vertex colors and UV coordinates
    • 51 : Add a common prefix to each selected object
    • 52 : Unhide Faces
    • 2 : 移動
    • 3 : 反転...
    • 10 : 法線を反転
    • 11 : 全ての法線を反転させて、オブジェクトの表裏を裏返します
    • 12 : 緊縮
    • 13 : 各頂点から平均的な中間点に向かって移動させます
    • 14 : スムーズ(Catmull-Clark)
    • 15 : オブジェクトの全ての面を細分割して滑らかにします(再分割曲面:Catmull-Clarkアルゴリズム)
    • 16 : 合体
    • 17 : 複数のオブジェクトを1つのオブジェクトとして合体します
    • 18 : 分離
    • 19 : 合体オブジェクトをその構成部分へと分離します
    • 20 : 接合
    • 21 : ぼぼぴったり一致した2つの面同士を接合します
    • 22 : クリーンナップ
    • 23 : データ上の様々な欠陥を取り除きます
    • 24 : 自動スムージング(Auto-Smooth)
    • 25 : 面同士のなす角度を基準にハードエッジ、ソフトエッジ属性を自動的に振り分けます
    • 26 : 複製
    • 27 : 削除
    • 28 : 選択済みのオブジェクトを削除します
    • 29 : リネーム
    • 30 : 選択済みのオブジェクトの名称を変更します
    • 31 : 全てを表示
    • 32 : このオブジェクトの全ての面を表示します
    • 33 : 頂点属性の設定
    • 34 : オブジェクトを ~ts 軸で反転
    • 35 : オブジェクトを ~ts 軸で反転させるための基準点を選択してください
    • 36 : オブジェクトをグローバル座標の ~ts 軸で反転させます
    • 37 : 基準の選択
    • 38 : オブジェクトを反転させるための基準軸を選択してください
    • 39 : オブジェクトを反転させるための基準軸と基準点を選択してください
    • 40 : オブジェクトを反転させるための(グローバル座標の)基準軸を選択してください
    • 41 : 頂点カラーをマテリアルカラーに変換
    • 42 : 頂点カラーをマテリアルカラーに変換します
    • 43 : マテリアルカラーを頂点カラーに変換
    • 44 : マテリアルカラーを頂点カラーに変換します
    • 45 : カラーの削除
    • 46 : 全ての頂点カラーの削除
    • 47 : UV座標の削除
    • 48 : 全てのUV座標を削除
    • 49 : 全ての属性を削除
    • 50 : 全ての頂点カラーとUV座標を削除
    • 51 : 選択された各オブジェクト名に共通の接頭辞を追加
    rename_1
    rename_prefix
    vertex_color_item
    weld
    weld_error
    weld_objects
    wings_camera
    desc
    help
    info
    message
    mode_help
    prefs
    scroll_help
    wings_collapse
    check_consistency
    check_vertices_1
    wings_color
    choose_1
    wings_console
    do_window
    handle_action
    popup_menu
    • 1 : Write to File
    • 2 : Write console contents to a file
    • 1 : ファイルに出力
    • 2 : コンソールの内容をファイルに出力します
    server_loop
    wings_deform
    check_range
    crumple_dirs
    dir
    inflate_fun
    sub_menu
    • 1 : Inflate elements
    • 2 : Pick center and radius
    • 3 : Crumple
    • 4 : Randomly move vertices
    • 5 : Inflate
    • 6 : Taper
    • 7 : Twist
    • 8 : Torque
    • 1 : 膨張要素
    • 2 : 基準となる半径と中心点を選択してください
    • 3 : もみくちゃ
    • 4 : 頂点をランダムに移動
    • 5 : 膨張
    • 6 : テーパ
    • 7 : 途中をひねる
    • 8 : ねじる
    taper_item
    wings_dissolve
    dissolve_1
    wings_drag
    drag_help
    help_message
    make_query_1
    numeric_input
    plus_drag_string
    qstr
    standard_mode_fun
    switch
    wings_edge
    dissolve_edges
    wings_edge_cmd
    command
    cut_ask_entry
    cut_command
    cut_entry
    cut_fun
    cut_pick_error
    loop_cut
    menu
    • 2 : Move
    • 3 : Slide
    • 4 : Slide edges along neighbor edges
    • 5 : Extrude
    • 6 : Connect
    • 7 : Create a new edge by connecting midpoints of selected edges
    • 8 : Bevel
    • 9 : Round off selected edges
    • 10 : Dissolve
    • 11 : Eliminate selected edges
    • 12 : Collapse
    • 13 : Delete edges, replacing them with vertices
    • 14 : Hardness
    • 15 : Soft
    • 16 : Hard
    • 17 : Loop Cut
    • 18 : Cut into two objects along edge loop
    • 19 : Vertex Color
    • 20 : Apply vertex colors to selected edges
    • 21 : Delete edges, replacing them with vertices and remove any newly created isolated vertices
    • 22 : Crease
    • 23 : Extrusion commonly used for adding wrinkles to organic models
    • 50 : Eliminate selected edges and remove remaining isolated verts
    • 2 : 移動
    • 3 : スライド
    • 4 : 辺を隣リの辺の向きに追随して移動させます
    • 5 : 押し出し
    • 6 : 接続
    • 7 : 選択された辺同士の中間点を接続する辺を作成します
    • 8 : ベベル
    • 9 : 選択された辺に傾斜をつけます
    • 10 : 削除
    • 11 : 選択された辺を削除します
    • 12 : 削除(コラプス)
    • 13 : 辺を削除した所へ周囲の頂点が崩れ込みます
    • 14 : ハード属性の切替
    • 15 : ソフト属性
    • 16 : ハード属性
    • 17 : 輪切り
    • 18 : 輪状に繋がった辺に従い、オブジェクトを2つに分割します
    • 19 : 頂点カラー
    • 20 : 選択された頂点に頂点カラーを適用します
    • 21 : 辺を削除した所へ周囲の頂点が崩れ込み、その際作成されたあらゆる孤立点も削除されます
    • 22 : 折り目
    • 23 : 一般的な押し出し効果は、有機的なモデルに対してしわを寄らせます
    • 50 : 選択された辺を削除し、その際生成された孤立点も削除されます
    plain_cut_menu
    • 2 : Cut into edges of equal length
    • 2 : 辺を等分します
    slide_help_mode
    wings_export
    export
    wings_extrude_edge
    bevel_faces
    extrude_problem
    wings_face_cmd
    bridge_1
    bridge_error
    clone_on
    clone_on_selection
    create_hole_1
    intrude
    lift_check_selection
    lift_fun
    lift_sel_mismatch
    lift_selection
    lift_vtx_sel_mismatch
    menu
    • 2 : Move
    • 3 : Extrude
    • 8 : Intrude
    • 9 : Carve out interior of object, making selected faces holes
    • 10 : Bevel
    • 11 : Round off edges of selected faces
    • 12 : Bridge
    • 13 : Create a bridge or tunnel between two faces
    • 14 : Bump
    • 15 : Create bump of selected faces
    • 16 : Lift
    • 17 : Put On
    • 18 : Move and rotate object, aligning the selected face to another element
    • 19 : Clone object on to one or more elements
    • 20 : Mirror
    • 21 : Mirror object around selected faces and merge to object
    • 22 : Mirror and create separate objects
    • 23 : Dissolve
    • 24 : Eliminate all edges between selected faces
    • 25 : Collapse
    • 26 : Delete faces, replacing them with vertices
    • 27 : Smooth
    • 28 : Subdivide selected faces to smooth them (Catmull-Clark)
    • 29 : Tesselate
    • 30 : Vertex Color
    • 31 : Apply vertex colors to selected faces
    • 32 : Hide
    • 33 : Hide the selected faces
    • 34 : Eliminate selected faces and remove remaining isolated verts
    • 35 : Extract
    • 36 : Shell Extrude
    • 37 : Hole
    • 38 : Create hole
    • 39 : Remove holes adjacent to selected faces
    • 40 : or face regions
    • 41 : Unhide faces adjacent to selection
    • 2 : 移動
    • 3 : 押し出し
    • 8 : くり抜き
    • 9 : 選択された面に穴を開けてオブジェクトの内部をくり抜いて空洞にします
    • 10 : ベベル
    • 11 : 選択された面に傾斜をつけます。
    • 12 : ブリッジ
    • 13 : 選択された2つの面の間を橋またはトンネルのように連結します
    • 14 : でこぼこ
    • 15 : 選択された面に凹凸をつけます
    • 16 : リフト
    • 17 : 対象面に乗せる
    • 18 : オブジェクトを移動又は回転させて別の要素の選択面に配置します
    • 19 : 1つまたは複数の要素を複製します
    • 20 : ミラー
    • 21 : 選択した面の周りに鏡対称のオブジェクトを作成しひとつのオブジェクトに合体します
    • 22 : ミラーリングしオブジェクトを分割されたオブジェクトを作成します
    • 23 : 削除(ディゾルブ)
    • 24 : 選択さたれた面と、それに関連するすべての辺を削除します
    • 25 : 削除(コラプス)
    • 26 : 面を削除した所へ周囲の頂点が崩れ込みます
    • 27 : スムーズ(Catmull-Clark)
    • 28 : 選択された面を細分割して滑らかにします(再分割曲面:Catmull-Clarkアルゴリズム)
    • 29 : テッセレート
    • 30 : 頂点カラー
    • 31 : 選択された面に頂点カラーを適用します
    • 32 : 隠す
    • 33 : 選択された面を隠します
    • 34 : 選択された面を削除し、その際作成されたあらゆる孤立点も削除されます
    • 35 : 面を剥がす
    • 36 : 押し出し(造殻型)
    • 37 : 穴を開ける
    • 38 : 穴を作成します
    • 39 : 選択された面または面の領域に隣接して
    • 40 : 穴を削除してください
    put_on
    put_on_check_selection
    put_on_selection
    smooth
    wings_ff_ndo
    check_size
    clean_bad_edges
    import
    import_1
    read_edges
    read_object_1
    read_objects
    read_vertices
    skip_faces
    wings_ff_wings
    export
    import
    import_1
    import_image
    import_props
    import_vsn2
    translate_map_images_2
    wings_file
    autosave
    command
    confirmed_open
    confirmed_open_dialog
    export_filename_1
    import_filename_1
    import_image
    import_ndo
    install_plugin
    menu
    • 3 : New
    • 4 : Create a new, empty scene
    • 5 : Open...
    • 6 : Open a previously saved scene
    • 7 : Merge...
    • 8 : Merge a previously saved scene into the current scene
    • 9 : Save
    • 10 : Save the current scene
    • 11 : Save As...
    • 12 : Save the current scene under a new name
    • 13 : Save Selected...
    • 14 : Save only the selected objects or faces
    • 15 : Save Incrementally
    • 16 : Revert
    • 17 : Revert current scene to the saved contents
    • 18 : Import
    • 19 : Export
    • 20 : Export Selected
    • 21 : Import Image...
    • 22 : Import an image file
    • 23 : Render
    • 24 : Install Plug-In
    • 25 : Exit
    • 26 : Generate new filename and save
    • 27 : Install a plug-in
    • 28 : Exit Wings 3D
    • 29 : Save Unused Materials
    • 30 : Include unused materials when saving a .wings file
    • 31 : Save Preference Subset...
    • 32 : Save a preference subset from your current settings
    • 33 : Load Preference Subset
    • 35 : Load...
    • 36 : Load a previously saved preference subset
    • 3 : 新規作成
    • 4 : 空の新規シーンを作成
    • 5 : 開く...
    • 6 : 以前に保存したシーンを開く
    • 7 : 合流...
    • 8 : 以前に保存したシーンを現在のシーンに合流させます
    • 9 : 保存
    • 10 : 現在のシーンを保存します
    • 11 : 別名で保存...
    • 12 : 現在のシーンを別のファイル名で保存します
    • 13 : 選択領域を保存...
    • 14 : 選択されているオブジェクトや面のみを保存します
    • 15 : 連番ファイル名で保存
    • 16 : 復帰
    • 17 : 現在のシーンを保存時の内容に戻します
    • 18 : 読込み
    • 19 : 書き出し
    • 20 : 選択領域の書き出し
    • 21 : イメージの読み込み...
    • 22 : 画像ファイルを指定して読込みます(読込んだテクスチャはアウトライナーへ追加されます)
    • 23 : レンダリング
    • 24 : プラグインのインストール
    • 25 : 終了
    • 26 : 新規ファイルを作成して保存します
    • 27 : プラグインをインストールします
    • 28 : Wings 3Dを終了します
    • 29 : 未使用マテリアルを保持
    • 30 : .wingsファイルを保存する時に未使用のマテリアルデータを含めます
    • 31 : 環境設定の一部を保存...
    • 32 : 現在カスタマイズされた環境設定で保存可能な項目を保存します
    • 33 : 環境設定の一部を読込み
    • 35 : 読込み...
    • 36 : 以前に保存した環境設定の一部を読込みます
    merge
    recent_files
    save_as
    save_now
    save_selected
    str_save_changes
    use_autosave_1
    wings_prop
    wings_help
    def_commands
    def_hotkeys
    edit_prefs
    getting_started
    header
    help_window
    international
    lights
    message
    one_or_two
    opengl_info
    performance_tips
    splash_contents
    use_one_or_two
    wings_hotkey
    keyname
    list_header
    list_keys
    vkeyname
    wings_image
    create_default
    create_image
    event
    event_1
    screenshot
    window_params
    wings_init
    display_actual_mode
    try_video_modes
    video_mode_failure
    wings_light
    attenuation
    color
    edit
    edit_ambient_dialog
    edit_dialog
    export_camera_lights
    info
    info_1
    light_types
    menu
    • 2 : Move
    • 3 : Position Highlight
    • 4 : Position the aim point or location of light
    • 5 : Color
    • 6 : Interactively adjust hue, value, and saturation
    • 7 : Attenuation
    • 8 : Linear
    • 9 : Interactively adjust how much light weakens as it travels away from its source (linear factor)
    • 10 : Quadratic
    • 11 : Interactively adjust how much light weakens as it travels away from its source (quadratic factor)
    • 12 : Spot Angle
    • 13 : Interactivly adjust the angle of the spotlight cone
    • 14 : Spot Falloff
    • 15 : Interactivly adjust how much light weakens farther away from the center of the spotlight cone
    • 16 : Edit Properties...
    • 17 : Edit light properties
    • 18 : Duplicate
    • 19 : Duplicate and move selected lights
    • 20 : Delete
    • 21 : Delete seleced lights
    • 2 : 移動
    • 3 : 強調表示させた位置
    • 4 : 光源の位置または照射点の位置
    • 5 : カラー
    • 6 : 色相,明度,彩度をリアルタイムに調整します.
    • 7 : 減衰
    • 8 : リニア減衰
    • 9 : 光源から光が届くまでどのくらい弱まるかをリアルタイムに調整します(距離に比例したリニア減衰)
    • 10 : 二次減衰
    • 11 : 光源から光が届くまでどのくらいの弱まるかをリアルタイムに調整します(距離の2乗で減衰,実際の光に近い)
    • 12 : スポット角度
    • 13 : スポット光源の照射する範囲を表す円錐の角度をリアルタイムに調整します.
    • 14 : スポット減衰
    • 15 : スポット光源の中心から縁まで,光がどのくらい弱まるのかをリアルタイムに調整します
    • 16 : プロパティ編集...
    • 17 : 光源のプロパティを編集します.
    • 18 : 複製
    • 19 : 選択された光源を移動して複製を作ります.
    • 20 : 削除
    • 21 : 選択された光源を削除します.
    plugin_results
    qs_att
    qs_specific
    selected_light
    spot_angle
    spot_falloff
    wings_magnet
    check_radius
    common_dialog
    dialog
    drag_help
    info_string
    magnet_route
    magnet_shape_str
    wings_material
    edit
    edit_dialog
    load_map_1
    material_fun
    material_menu
    • 4 : Material
    • 4 : マテリアル
    new_1
    plugin_results
    rename
    show_map
    show_maps
    wings_menu
    handle_key_event
    help_text_1
    hotkey_delete_dialog
    hotkey_key_message
    hotkey_mouse_message
    magnet_help
    menu_toolbar_help
    • 1 : Open the Tools menu
    • 2 : Open the Select menu
    • 3 : Recall Stored Selection
    • 4 : Store Selection
    • 5 : Deselect | Select All
    • 6 : Deselect and close menu
    • 7 : Repeat Drag
    • 8 : Repeat Args
    • 9 : Repeat
    • 1 : ツールメニューを開きます
    • 2 : 選択メニューを開きます
    • 3 : 記憶された選択領域を再呼び出しします
    • 4 : 選択領域を記憶します
    • 5 : 選択解除 | 全選択
    • 6 : 選択解除してメニューを閉じます
    • 7 : コマンド繰り返しにドラッグ入力値を反映します
    • 8 : コマンド繰り返しに入力値を反映します
    • 9 : コマンドを繰り返し実行します
    mk_dialog
    mmb_menu_toolbar_help
    • 1 : Edge Ring
    • 1 : 辺のリング選択
    norm_help_adv
    normalize_menu
    • 1 : More...
    • 1 : 続く...
    rmb_menu_toolbar_help
    • 1 : Edge Loop
    • 2 : Edge Loop to Region
    • 3 : Select edges which have both vertices selected
    • 1 : 辺のループ選択
    • 2 : 辺のループ選択を領域にする
    • 3 : 選択した頂点を両方とも持つような辺を選択します
    scroll_help
    wings_menu_util
    adv_scale_1
    dir_help
    dir_help_1
    dirs
    dirs_help
    flatten
    flatten_edge_loops
    flatten_fun_1
    rotate
    rotate_1
    rotate_fun
    scale
    scale_fun
    uniform_scale
    wings_outliner
    command
    common_image_menu
    • 1 : Export...
    • 2 : Export the image
    • 3 : Duplicate
    • 4 : Duplicate selected image
    • 5 : Delete
    • 6 : Delete selected image
    • 7 : Rename
    • 8 : Rename selected image
    • 9 : Pick up Image
    • 10 : Pick up the Image to it put on a material as a texture
    • 1 : 書き出し...
    • 2 : イメージを書き出します
    • 3 : 複製
    • 4 : 選択したイメージを複製します
    • 5 : 削除
    • 6 : 選択したイメージを削除します
    • 7 : リネーム
    • 8 : 選択したイメージの名称を変更します
    • 9 : イメージをピックアップ
    • 10 : ピックアップしたイメージはマテリアル項目上で右クリックメニューから「項目をドロップ」すると,テクスチャを関連づけられます.
    delete_image
    do_menu
    • 1 : Edit Material...
    • 2 : Edit material properties
    • 3 : Assign to Selection
    • 4 : Assign the material to the selected faces or bodies
    • 5 : Select
    • 6 : Select all faces that have this material
    • 7 : Duplicate
    • 8 : Duplicate this material
    • 9 : Delete
    • 10 : Delete this material
    • 11 : Rename
    • 12 : Rename this material
    • 13 : Duplicate
    • 14 : Duplicate this object
    • 15 : Delete
    • 16 : Delete this object
    • 17 : Rename
    • 18 : Rename this object
    • 19 : Edit Light...
    • 20 : Edit light properties
    • 21 : Duplicate
    • 22 : Duplicate this light
    • 23 : Delete
    • 24 : Delete this light
    • 25 : Rename
    • 26 : Rename this light
    • 121 : Drop picked object
    • 122 : Drop a previously picked object on this material
    • 1 : マテリアル編集...
    • 2 : マテリアルの特性を編集します
    • 3 : 選択領域に割り当て
    • 4 : 選択した面やオブジェクトにマテリアルを割り当てます
    • 5 : 選択
    • 6 : このマテリアルが適用されている面を全て選択します
    • 7 : 複製
    • 8 : このマテリアルを複製します
    • 9 : 削除
    • 10 : このマテリアルを削除します
    • 11 : リネーム
    • 12 : このマテリアルの名称を変更します
    • 13 : 複製
    • 14 : このオブジェクトを複製します
    • 15 : 削除
    • 16 : このオブジェクトを削除します
    • 17 : リネーム
    • 18 : このオブジェクトの名称を変更します
    • 19 : 光源編集...
    • 20 : 光源の特性を編集します
    • 21 : 複製
    • 22 : この光源を複製します
    • 23 : 削除
    • 24 : この光源を削除します
    • 25 : リネーム
    • 26 : この光源の名称を変更します
    • 121 : ピックアップ項目をドロップ
    • 122 : ピックアップした「オブジェクト/イメージ項目」をこのマテリアルへを関連づけることができます
    event
    handle_drop
    image_menu
    • 1 : Show
    • 2 : Show the image in a window
    • 1 : 表示
    • 2 : イメージをウインドウに表示します
    image_menu_1
    • 1 : Make External...
    • 2 : Refresh
    • 3 : Make Internal
    • 11 : Update image to the contents of the saved file
    • 1 : 外部テクスチャを書き出し...
    • 2 : リフレッシュ
    • 3 : 内部テクスチャに変換
    • 11 : 保存ファイルの内容を更新してください
    make_external
    refresh_image
    rename_image
    title
    wings_palette
    command
    do_menu
    • 1 : Edit
    • 2 : Edit color
    • 3 : Interpolate
    • 4 : Interpolate Empty Colors
    • 5 : Clear All
    • 6 : Clear palette
    • 7 : Compact
    • 8 : Compact Palette
    • 9 : Scan Colors
    • 10 : Scan colors from selection
    • 11 : Export
    • 12 : Export palette to file
    • 13 : Import
    • 14 : Import palette from file
    • 1 : 編集
    • 2 : カラー編集
    • 3 : カラーを補完
    • 4 : 空のカラーを補完
    • 5 : すべての色をクリア
    • 6 : パレットの全色をクリアして空のカラーにします
    • 7 : コンパクトに並び替え
    • 8 : カスタム色が設定されている欄を一カ所にまとめます.
    • 9 : カラーを取り込む
    • 10 : 選択領域にあるカラーを取り込みます
    • 11 : パレット書き出し...
    • 12 : パレット情報をファイルに書き出します
    • 13 : パレット読込み...
    • 14 : パレット情報ファイルを読込みます
    event
    title
    wings_pb
    loop
    wings_pick
    area_info
    enhanced_hl_info
    handle_hilite_event
    marquee_message
    wings_plugin
    cat_label
    def_ui_plugin
    install
    install_beam
    install_file_type
    install_verify_files
    manager_command
    manager_entry
    plugin_dir
    plugin_menu_info_3
    • 1 : (The Plug-In Manager was unable to find more information)
    • 1 : (プラグイン管理機能はこれ以上の情報を探せませんでした)
    plugin_modules
    plugin_root_menu
    • 1 : body:
    • 2 : edge:
    • 3 : face:
    • 4 : vertex:
    • 5 : Select|
    • 6 : Tools|
    • 1 : 全体:
    • 2 : 辺:
    • 3 : 面:
    • 4 : 頂点:
    • 5 : 選択|
    • 6 : ツール|
    wings_pref
    pref
    recent_pref_help
    wings_pref_dlg
    advanced_prefs
    command
    constraint_prefs
    gen_prefs
    menu
    • 1 : Preferences...
    • 2 : Edit the preferences for Wings
    • 1 : 環境設定...
    • 2 : Wings 3Dの環境設定を編集します
    misc_prefs
    smart_set_value_1
    ui_prefs
    viewer_prefs
    workaround_1
    wings_rotate
    edges_to_vertices
    faces_to_vertices
    wings_s
    accept
    camera_mode
    cancel
    dir
    mod
    mouse_b
    no
    scroll
    yes
    wings_scale
    edges_to_vertices
    faces_to_vertices
    wings_sel_cmd
    ask
    faces_with
    group_mode_string
    group_title
    groups_menu
    • 1 : Delete Group
    • 2 : Delete group "
    • 4 : Add to Group
    • 5 : Add current selection to group "
    • 7 : Subtract from Group
    • 8 : Subtract current selection from group "
    • 10 : Select Group
    • 11 : Select group "
    • 13 : Union Group
    • 14 : Union group "
    • 15 : " with current selection
    • 16 : Subtract Group
    • 17 : Subtract group "
    • 18 : " from current selection
    • 19 : Intersect Group
    • 20 : Intersect group "
    • 21 : " with current selection
    • 22 : Selection Groups
    • 24 : Next Group
    • 25 : Previous Group
    • 26 : Cycle In Selection Mode
    • 27 : Cycle Prev/Next only within active selection mode
    • 1 : グループを削除
    • 2 : グループを削除します"
    • 4 : グループを追加
    • 5 : 現在の選択領域をグループに追加します"
    • 7 : グループから削減
    • 8 : グループから現在の選択領域を削減します"
    • 10 : グループを選択
    • 11 : グループを選択します"
    • 13 : グループを統合
    • 14 : グループ"
    • 15 : "と現在の選択領域を統合します
    • 16 : グループ削減
    • 17 : 現在の選択領域から,グループ"
    • 18 : "を削減します.
    • 19 : グループ交差
    • 20 : グループ"
    • 21 : "と現在の領域の交差部分を作成
    • 22 : グループを選択
    • 24 : 次のグループ
    • 25 : 前のグループ
    • 26 : Cycle In Selection Mode
    • 27 : Cycle Prev/Next only within active selection mode
    item_by_id
    less_help
    menu
    • 1 : Deselect
    • 2 : Clear the selection
    • 3 : More
    • 4 : Less
    • 5 : Similar
    • 6 : Edge Loop
    • 7 : Edge Loop
    • 8 : Expand edge selection to loop;
    • 9 : convert face selection to selected border edges
    • 10 : Edge Loop to Region
    • 11 : Select all faces on one side of an edge loop
    • 12 : Edge Ring
    • 13 : Expand edge selection to ring
    • 14 : Previous Edge Loop
    • 15 : Select the previous edge loop
    • 16 : Next Edge Loop
    • 17 : Select the next edge loop
    • 18 : Grow Edge Loop
    • 19 : Grow edge selection by one edge in loop directions
    • 20 : Shrink Edge Loop
    • 21 : Shrink edge selection by one in loop direction
    • 22 : Grow Edge Ring
    • 23 : Grow edge selection by one edge in ring direction
    • 24 : Shrink Edge Ring
    • 25 : Shrink edge selection by one edge in ring directions
    • 26 : Adjacent
    • 27 : Vertices
    • 28 : Edges
    • 29 : Faces
    • 30 : Objects
    • 31 : By
    • 32 : Hard Edges
    • 33 : Select all hard edges
    • 34 : Isolated Vertices
    • 35 : Select all isolated vertices
    • 36 : Vertices With
    • 37 : 2 Edges
    • 38 : 3 Edges
    • 39 : 4 Edges
    • 40 : 5 Edges
    • 41 : Faces With
    • 42 : 2 Edges
    • 43 : 3 Edges
    • 44 : 4 Edges
    • 45 : 5 or More
    • 46 : Random
    • 56 : Short Edges
    • 57 : Select (too) short edges
    • 58 : Material Edges
    • 59 : Select all edges between different materials
    • 60 : UV-Mapped Faces
    • 61 : Select all edges that have UV coordinates
    • 62 : Id...
    • 63 : Select by numeric id
    • 64 : Lights
    • 65 : Select all lights
    • 66 : Select all elements
    • 67 : Inverse
    • 68 : Invert the selection
    • 69 : Hide Selected
    • 70 : Hide all (partly or wholly) selected objects
    • 71 : Hide Unselected
    • 72 : Hide objects that have no selection
    • 73 : Lock Unselected
    • 74 : Lock objects that have no selection
    • 76 : Show all objects that have been hidden
    • 78 : Unlock all locked objects
    • 79 : Store Selection
    • 80 : Store the selection into the selection group named "StoredSelection"
    • 81 : Recall Selection
    • 82 : Recall the selection from the selection group named "StoredSelection"
    • 83 : New Group...
    • 84 : Create a new selection group
    • 85 : Non-planar Faces
    • 86 : Select all non-planar faces
    • 87 : Sharp Edges
    • 88 : Select sharp edges
    • 89 : Fewest Edges Path
    • 90 : Select the path with the fewest edges between two vertices
    • 91 : Shortest Path (Dijkstra)
    • 92 : Select the shortest path between two vertices (Dijkstra)
    • 93 : Shortest Path (A-Star)
    • 94 : Select the shortest path between two vertices (A-Star)
    • 95 : Vertex Path
    • 96 : To Complete Loops
    • 97 : Switches to Edge mode and completes loop selection
    • 98 : ; convert consecutive vertices to edges
    • 99 : (from selection or all visible objects (if no selection))
    • 100 : Every Nth Ring
    • 101 : Second
    • 102 : Third
    • 103 : Nth...
    • 104 : Unhide All Objects
    • 105 : Unlock All Objects
    • 106 : Objects
    • 401 : 6 or More
    • 402 : Specify...
    • nq0 : Non Quadrangle Faces
    • nq1 : All Non Quadrangle Faces
    • nq2 : Odd Non Quadrangle Faces
    • nq3 : Even Non Quadrangle Faces
    • 1 : 全選択解除
    • 2 : 選択領域をすべて解除します
    • 3 : 選択領域を拡張
    • 4 : 選択領域を縮小
    • 5 : 類似要素を選択
    • 6 : 辺をループ/リング状に選択
    • 7 : 辺ループ選択
    • 8 : 選択辺を含むループ状に選択領域を拡張します
    • 9 : 面の選択領域から輪郭の辺を選択済みにします
    • 10 : 辺ループを領域化
    • 11 : 辺ループで2つに分けられた一方の面を全て選択します
    • 12 : 辺リング選択
    • 13 : 選択辺を含むリング状に選択領域を拡張します
    • 14 : 1つ前の辺ループ
    • 15 : 1つ手前の辺のループを選択
    • 16 : 1つ後の辺ループ
    • 17 : 1つ後にある辺のループを選択
    • 18 : 辺ループを拡張
    • 19 : ループ方向にある辺を1段階、選択領域へ取り込みます
    • 20 : 辺ループを縮小
    • 21 : 辺のループから1段階、選択領域を縮小します
    • 22 : 辺リングを拡張
    • 23 : リング方向にある辺を1段階、選択領域へ取り込みます
    • 24 : 辺リングを縮小
    • 25 : 辺のリングから1段階、選択領域を縮小します
    • 26 : 選択モード切替
    • 27 : 頂点
    • 28 : 辺
    • 29 : 面
    • 30 : オブジェクト
    • 31 : 共通の特徴で抽出
    • 32 : ハードエッジ
    • 33 : ハードエッジ属性を持つ辺をすべて選択します
    • 34 : 孤立点
    • 35 : 全ての孤立点を選択します
    • 36 : 頂点に繋がる辺の数
    • 37 : 2辺で
    • 38 : 3辺で
    • 39 : 4辺で
    • 40 : 5辺で
    • 41 : 面を取り囲む辺の数
    • 42 : 2辺で
    • 43 : 3辺で
    • 44 : 4辺で
    • 45 : 5辺以上
    • 46 : ランダムな確率で選択
    • 56 : 短い辺を選択
    • 57 : 短い(過ぎる)辺を選択
    • 58 : マテリアルが設定された辺
    • 59 : マテリアルが(種類を問わず)設定された全ての辺を選択
    • 60 : UVマッピングされた面
    • 61 : UV座標を持っている全ての辺を選択します
    • 62 : Id...
    • 63 : 数値IDで選択
    • 64 : 光源
    • 65 : 全ての光源を選択
    • 66 : 全ての要素を選択
    • 67 : 選択領域の反転
    • 68 : 選択領域を反転します
    • 69 : 選択領域を隠す
    • 70 : 選択されたオブジェクトをすべて(部分的または全体)を隠します
    • 71 : 未選択領域を隠す
    • 72 : 未選択領域を隠します
    • 73 : 未選択領域をロック
    • 74 : 未選択領域をロックします
    • 75 : すべてを表示
    • 76 : 隠されていたオブジェクトをすべて表示します
    • 77 : すべてをロック解除
    • 78 : すべてのオブジェクトのロックを解除します
    • 79 : 選択領域の記憶
    • 80 : 選択領域を"StoredSelection"という特殊グループ名で記憶します
    • 81 : 選択領域の呼出
    • 82 : 選択領域が記憶された,特殊グループ名"StoredSelection"を呼び出します
    • 83 : 新規グループ作成...
    • 84 : 選択領域のグループを新規作成します
    • 85 : 非平面の面を選択
    • 86 : 平面ではないすべての面を選択
    • 87 : 鋭利な辺を選択
    • 88 : 鋭利な辺を選択します
    • 89 : 最短経路で辺選択
    • 90 : 2頂点間を最短経路で結ぶ辺を探して選択します
    • 91 : 最短経路で辺選択(Dijkstra)
    • 92 : 2頂点間を最短経路で結ぶ辺を選択. 最短距離を均等に探索するので比較的高速(ダイクストラ法)
    • 93 : 最短経路で辺選択(A-Star)
    • 94 : 2頂点間を最短経路で結ぶ辺を選択. ゴールに近い経路を優先的に探索, より無駄が少ない(A-Star法)
    • 95 : 頂点パス
    • 96 : 完全なループにする
    • 97 : 完全なループを作るために辺選択モードに切替えて、選択をループ状にします
    • 98 : ;(選択領域または(もし選択領域が存在しなければ)表示されているすべてのオブジェクトから)
    • 99 : 選択領域から条件に合致する頂点/面だけを残します
    • 100 : N番目毎にリング選択
    • 101 : 2番目
    • 102 : 3番目
    • 103 : N番目...
    • 401 : 6番目以上
    • nq0 : 非四角ポリゴン
    • nq1 : すべての非四辺形(正方形,長方形,菱形等)の面
    • nq2 : Odd Non Quadrangle Faces
    • nq3 : Even Non Quadrangle Faces
    more_help
    new_group
    new_group_name
    nonplanar_faces
    oriented_faces
    oriented_faces_menu
    • 1 : Similar Normals
    • 2 : Select faces with normals similar to those of the already selected faces
    • 1 : 類似した法線
    • 2 : 既に選択された面と類似した法線を持つ面を選択します
    random
    random_help
    sel_all_str
    select_nth_ring
    sharp_edges
    short_edges
    shortest_path
    similar_area
    similar_area_faces_menu
    • 1 : Similar Area
    • 2 : Select faces with areas similar to that of the already selected face
    • 1 : 類似したエリア
    • 2 : 選択エリアと類似した面を選択し,選択済みの面にします
    similar_help
    similar_material
    similar_material_faces
    valid_sel
    vertices_with
    wings_shape
    create_folder
    create_folder_dialog
    do_menu
    • 1 : Duplicate
    • 2 : Duplicate selected objects
    • 3 : Delete
    • 4 : Delete selected objects
    • 5 : Rename
    • 6 : Rename selected objects
    • 7 : Create Folder
    • 8 : Rename Folder
    • 9 : Delete Folder
    • 10 : Delete folder and its contents
    • 11 : Move to Folder
    • 12 : Move selected objects to this folder
    • 13 : Empty Folder
    • 14 : Remove From Folder
    • 15 : Remove Selected From Folders
    • 1 : オブジェクトを複製
    • 2 : 選択されたオブジェクトを複製します
    • 3 : オブジェクトを削除
    • 4 : 選択されたオブジェクトを削除
    • 5 : リネーム
    • 6 : 選択されたオブジェクトをリネーム
    • 7 : フォルダを新規作成
    • 8 : フォルダをリネーム
    • 9 : フォルダと中身を削除
    • 10 : フォルダごと選択オブジェクトを削除
    • 11 : 選択オブジェクトを入れる
    • 12 : ジオメトリで選択中(アクティブ状態)のオブジェクトをこのフォルダへ移動します
    • 13 : オブジェクト全てを出す
    • 14 : 選択オブジェクトを出す
    • 15 : フォルダから出す
    help
    rename_folder_dialog
    title
    wings_shapes
    cone
    cube
    cylinder
    dodecahedron
    grid
    icosahedron
    prim_help
    prim_name
    sphere
    tetrahedron
    torus
    wings_subdiv
    face_centers
    smooth
    wings_tesselation
    submenu
    • 1 : Triangulate
    • 2 : Quadrangulate
    • 1 : 三角ポリゴン化
    • 2 : 四角ポリゴン化
    wings_theme
    menu
    • 1 : Themes
    • 2 : Classic Green Theme
    • 3 : Change the display colors to the original Wings3D theme with the green titlebars
    • 4 : Olive Theme
    • 5 : Grey Blue Theme
    • 6 : Dark Blue Theme
    • 7 : Change color scheme
    • 1 : ウインドウ外観の変更
    • 2 : グリーン(クラッシック)
    • 3 : ウインドウデザインを緑色タイトルバーの Wings3Dの元のテーマに切替えます
    • 4 : オリーブ
    • 5 : グレイブルー
    • 6 : ダークブルー
    • 7 : 配色を変更
    wings_toolbar
    button_help_1
    button_help_2
    button_help_3
    messages
    wings_tweak
    axis_string
    cam_conflict
    camera_msg
    constraints_menu
    • 1 : Locks movement to the selection's Normal.
    • 2 : Locks movement to the Default Axis.
    • 3 : Locks movement to the Radial of the current Tweak Axis.
    • 5 : Locks movement to the ~s axis.
    • 6 : Constrained movement to normal of element marked by Tweak Vector.
    • 7 : Scale from mouse cursor.
    • 8 : Scale from element marked by Tweak Vector.
    • 9 : Scale from Default Point.
    • 10 : Clear Constraints
    • 11 : Clear all locked axes.
    • 1 : 移動を選択領域の法線方向へ固定する.
    • 2 : 移動をデフォルト軸方向に固定する.
    • 3 : 移動を現在軸から放射状に固定する.
    • 5 : 移動を ~ts 軸方向に固定します.
    • 6 : 移動方向がTweakベクトルでマークされた要素の法線へ制限されます.
    • 7 : マウスカーソルのドラッグで拡大縮小します.
    • 8 : Tweakベクトルでマークされた要素で拡大縮小.
    • 9 : デフォルト位置で拡大縮小.
    • 10 : 固定軸をクリア
    • 11 : 固定されたすべての軸設定をクリアします.
    extra_msg
    help_msg_axes
    help_msg_basic
    help_msg_hotkeys
    help_msg_keys
    help_msg_magnet
    help_msg_palette
    help_msg_using_keys
    help_window
    mag_thelp
    magnet_type
    menu
    • 1 : Tweak is a collection of tools for quickly adjusting a mesh.
    • 2 : Enable Tweak
    • 3 : Disable Tweak
    • 4 : Magnets
    • 5 : Axis Constraints
    • 6 : Move selection relative to screen, or constrained to an axis.
    • 7 : Move selection along average normal.
    • 8 : Scale selection relative to screen, or constrained to an axis.
    • 9 : Scale elements uniformly from the selection center.
    • 10 : Relax selection toward the average plane of neighbors.
    • 11 : Slide elements along adjacent edges.
    • 13 : Tweak Preferences
    • 14 : Preferences for Tweak
    • 1 : Tweakは直感的にメッシュを編集する機能が揃ったパレットです.
    • 2 : ツールを有効に
    • 3 : 【有効】: 無効に
    • 4 : マグネット形状
    • 5 : 軸を固定する
    • 6 : 選択要素ドラッグ方向が画面の上下左右/軸方向の移動に対応。
    • 7 : 選択領域を平均した法線方向へ移動.
    • 8 : 選択要素ドラッグ方向が画面の上下左右/軸での拡大縮小に対応。
    • 9 : 選択要素ドラッグで画面の中心から同比率で拡大縮小する.
    • 10 : 選択領域を周りと平均的になるよう形状を崩さずに整える.
    • 11 : 周囲に接続する辺方向に選択要素をスライド.
    • 13 : Tweak環境設定...
    • 14 : Tweakツールの環境設定
    menu_conflict
    • 1 : Key combo was not assigned. Those keys would conflict with the right click Tweak menu.
    • 1 : キーの組合せは割り当てられませんでした. これらのキーは右クリックメニューと衝突するでしょう.
    mode
    palette_title
    spacebar_msg
    toggle_bold
    tweak_disabled_msg
    tweak_info_line
    tweak_magnet_help
    tweak_magnet_menu
    • 1 : Disable Magnet
    • 2 : Enable Magnet
    • 3 : Tweak magnets are similar to 'soft selection'.
    • 5 : Radius Adjust Key
    • 6 : Press [Insert] to customize hotkey for adjusting the magnet radius.
    • 7 : Without a hotkey assigned, the magnet radius is adjusted by holding [Alt].
    • 8 : Reset Radius
    • 9 : Reset the magnet radius to 1.0
    • 10 : Next Magnet Type
    • 11 : Can be hotkeyed to cycle through the magnets.
    • 1 : 【有効】: 無効に
    • 2 : ツールを有効に
    • 3 : Tweakメニューのマグネット効果は'soft selecton'と似ています
    • 5 : 半径調整キー設定
    • 6 : [Insert]キーを押し、マグネット半径の調整のためのホットキーを設定ください.
    • 7 : [Alt]キーも同時に押すと,ホットキー割り当て無しで,マグネットの半径を調節できます.
    • 8 : 半径をリセット
    • 9 : マグネット効果の及ぶ半径を1.0にリセットします
    • 10 : 次のマグネットタイプ
    • 11 : マグネット効果を通してホットキーをローテーションできます.
    tweak_magnet_radius_help
    tweak_menu_item
    • 1 : Binding:
    • 2 : Set:
    • 3 : Swap:
    • 4 : Hold modifiers and/or press any mouse button.
    • 5 : Press another tool's key binding.
    • 6 : Unbind:
    • 1 : 現在の設定:
    • 2 :  設定方法:
    • 3 : 交換方法:
    • 4 : 修飾キー押しながらマウスボタン(左/右)を押す.
    • 5 : 別ツールのキー組合せを押す.
    • 6 : 関連取消:
    tweak_preferences_dialog
    xyzkey_help
    wings_u
    caption
    wings_util
    translation_string
    wings_vec
    add_help_text
    add_magnet
    check_magnet_point
    check_point
    common_magnet_message
    common_message
    exit_menu
    • 2 : Cancel current command
    • 2 : 現在のコマンドを取消し
    get_vec
    guard_string
    magnet_message
    wings_vertex_cmd
    menu
    • 2 : Move
    • 3 : Extrude
    • 4 : Connect
    • 5 : Create a new edge by connecting selected vertices
    • 6 : Tighten
    • 7 : Move selected vertices towards average midpoint
    • 8 : Bevel
    • 9 : Create faces of selected vertices
    • 10 : Dissolve
    • 11 : Delete selected vertices (clearing selection)
    • 12 : Collapse
    • 13 : Delete selected vertices (creating a face selection)
    • 14 : Deform
    • 15 : Vertex Color
    • 16 : Apply vertex colors to selected vertices
    • 17 : Connect vertices and return the new edge selected
    • 2 : 移動
    • 3 : 押し出し
    • 4 : 接続
    • 5 : 選択された複数の頂点を接続することで新しい辺を作ります
    • 6 : 緊縮
    • 7 : 選択された頂点を平均距離に向かって移動させます
    • 8 : ベベル
    • 9 : 選択された複数の頂点を囲むような面を張ります
    • 10 : 削除
    • 11 : 選択した頂点を削除します(削除により選択部分のない状態になります)
    • 12 : 削除(コラプス)
    • 13 : 選択した頂点を削除します(崩壊により生成された面が選択状態になります)
    • 14 : デフォルメ
    • 15 : 頂点カラー
    • 16 : 頂点カラーを選択された頂点へ割り当てます
    • 17 : 頂点同士を接続し,それによって新規に生成された辺を選択状態にします
    wings_view
    auto_rotate_help
    camera
    help
    menu
    • 1 : Ground Plane
    • 2 : Show the ground plane
    • 3 : Axes
    • 4 : Show the coordinate axes
    • 5 : Workmode
    • 6 : Toggle flat/smooth shading
    • 7 : Wireframe
    • 8 : Display selected objects as a wireframe (same for all objects if nothing is selected)
    • 9 : Shade
    • 10 : Display selected objects as shaded (same for all objects if nothing is selected)
    • 11 : Toggle Wireframe
    • 12 : Toggle display mode for selected objects (same for all objects if nothing is selected)
    • 13 : Toggle Proxy Mode
    • 14 : Toggle the smooth proxy mode for selected objects
    • 15 : Quick Smoothed Preview
    • 16 : Toggle the smooth proxy mode for all objects
    • 17 : Show Saved BB
    • 18 : Display any saved bounding box
    • 19 : Show Edges
    • 20 : Show edges in workmode
    • 21 : Show Wireframe Backfaces
    • 22 : Show wireframe backfaces
    • 23 : Show Normals
    • 24 : Show normals for selected elements
    • 25 : Reset View
    • 26 : Reset view to the default position
    • 27 : Aim
    • 28 : Aim the camera at the selected element
    • 29 : Frame
    • 30 : Dolly to show all selected elements (or all objects if nothing is selected)
    • 31 : Orthographic View
    • 32 : Toggle between orthographic and perspective views
    • 33 : Saved Views:
    • 34 : Camera Settings...
    • 35 : Set field of view, and near and far clipping planes
    • 36 : Scene Lights
    • 37 : Use the lights defined in the scene
    • 38 : Two Lights
    • 39 : One Light
    • 40 : Use two work lights
    • 41 : Use one work light
    • 42 : Show Colors
    • 43 : Show vertex colors
    • 44 : Show Materials
    • 45 : Show materials
    • 46 : Show Textures
    • 47 : Show textures
    • 48 : Show Info Text
    • 49 : Show an informational text at the top of this Geometry window
    • 50 : View Along
    • 51 : +X
    • 52 : +Y
    • 53 : +Z
    • 54 : -X
    • 55 : -Y
    • 56 : -Z
    • 57 : Align to Selection
    • 58 : Align the view to the normal of the selection
    • 59 : Auto Rotate
    • 60 : Spin the view
    • 61 : Clipping Planes
    • 62 : Toggle extra clipping planes (use default axis)
    • 65 : Frame Disregards Mirror
    • 66 : Highlight Aim
    • 67 : Aim camera at mouseover highlight. (Requires 'Use Highlight as Temporary Selection' enabled, and an assigned hotkey)
    • 68 : Show
    • 69 : Show BB Center
    • 70 : Display the Center of any saved bounding box
    • 71 : Nearest Axis
    • 72 : Show Backfaces
    • 73 : Show backfaces when there is a hole or hiddwn faces in an object
    • 1 : 地面
    • 2 : 地面を表示する
    • 3 : 軸
    • 4 : 座標軸を表示
    • 5 : フラット/スムーズ表示切替
    • 6 : フラット/スムーズシェーディングを切替え
    • 7 : ワイヤフレーム表示
    • 8 : 選択したオブジェクトをワイヤフレーム表示に切替えます(もし未選択ならすべてのオブジェクトが対象)
    • 9 : 陰影表示
    • 10 : 選択したオブジェクトを陰影表示モードに切替えます(もし未選択ならすべてのオブジェクトが対象)
    • 11 : ワイヤフレーム表示の切替
    • 12 : 選択したオブジェクトの表示モードを切替えます(もし未選択ならすべてのオブジェクトが対象)
    • 13 : Proxyモード切替(選択のみ)
    • 14 : 選択オブジェクトを非破壊的にスムーズ(Catmull)表示します。これは元のメッシュを動かすことで制御可能な代替オブジェクトです)
    • 15 : Proxyモード切替(すべて)
    • 16 : 全オブジェクトを非破壊的にスムーズ(Catmull)表示します。これは元のメッシュを動かすことで制御可能な代替オブジェクトです)
    • 17 : 保存されたBBを表示
    • 18 : 保存されたバウンディングボックスを表示
    • 19 : 辺を表示
    • 20 : ワークモード(フラット/スムーズ表示)で辺を表示
    • 21 : ワイヤフレームの裏側を表示
    • 22 : ワイヤフレームの裏側を表示
    • 23 : 法線を表示
    • 24 : 選択した要素の法線を表示します
    • 25 : ビューをリセット
    • 26 : 視点を初期位置にリセットする
    • 27 : 注視
    • 28 : 注視(選択部分)
    • 29 : 注視(選択部分をフレームイン)
    • 30 : ウインドウ枠いっぱいに選択要素が収まるように表示.(未選択ならすべてのオブジェクトが対象)
    • 31 : 正投影ビュー
    • 32 : 「正投影ビュー」と「遠近法ビュー」を切替えます
    • 33 : 記憶済みのビュー:
    • 34 : カメラ設定...
    • 35 : 視野角,前方/後方クリッピング平面を設定します
    • 36 : シーン光源
    • 37 : シーン内で定義された光源を使用
    • 38 : 2つの光源
    • 39 : 1つの光源
    • 40 : 2つの光源を使用
    • 41 : 1つの光源を使用
    • 42 : カラー表示
    • 43 : 頂点カラーを表示します
    • 44 : マテリアル表示
    • 45 : マテリアルを表示します
    • 46 : テクスチャ表示
    • 47 : テクスチャを表示します
    • 48 : 情報テキストを表示
    • 49 : このジオメトリウインドウの上部に情報テキストを表示します
    • 50 : 正面図ビュー(各軸の垂直面)
    • 51 : +X軸(Z←↑Y)
    • 52 : +Y軸(Z↓→X)
    • 53 : +Z軸(Y↑→X)
    • 54 : −X軸(Y↑→Z)
    • 55 : −Y軸(Z↑→X)
    • 56 : −Z軸(X←↑Y)
    • 57 : 選択領域の法線に垂直なビュー
    • 58 : 選択領域の法線と重なるラインに視点を変更します
    • 59 : 自動回転
    • 60 : ビューを自動回転させます
    • 61 : クリッピング平面
    • 62 : 拡張クリッピング平面を切替える(デフォルト軸使用時)
    • 65 : ミラー選択領域をフレームに入れない
    • 66 : 注視(選択部分)
    • 67 : 選択部をマウスオーバーすると視点が移動します(高度な設定で'強調表示部を臨時選択として使用'が有効でキーが割当られている場合)
    • 68 : 補助情報の表示
    • 69 : BBの中心を表示
    • 70 : 保存されたバウンディングボックスの中心を表示します
    • 71 : 最も近い軸
    • 72 : 面の裏側を表示
    • 73 : オブジェクトの面を隠したり穴がある場合にその裏側を表示します
    shader_submenu
    • 1 : Next
    • 2 : Previous
    • 3 : Shaders:
    • 1 : 次の項目
    • 2 : 前の項目
    • 3 : シェーダー:
    view_legend
    views
    views_jump
    views_jumpmenu
    • 1 : Jump
    • 2 : No saved views!
    • 3 : Jump to prev[
    • 5 : Jump to current[
    • 7 : Jump to next[
    • 9 : Jump to [
    • 11 : Jump
    • 1 : 直接指定
    • 2 : 保存済みのビューがありません!
    • 3 : 前の項目へ[
    • 5 : カレント項目へ[
    • 7 : 次の項目へ[
    • 9 : ジャンプ[
    • 11 : ジャンプ
    views_move
    views_movemenu
    • 1 : Move Current
    • 2 : No saved views!
    • 3 : Move "
    • 5 : ] to prev[
    • 7 : Move "
    • 9 : ] nowhere
    • 10 : Move "
    • 12 : ] to next[
    • 14 : Move "
    • 16 : ] to [
    • 18 : Move Current
    • 1 : カレントビューへ移動
    • 2 : 記憶済みのビューがありません
    • 3 : 移動"
    • 5 : ]前へ[
    • 7 : 移動"
    • 9 : ]不明
    • 10 : 移動"
    • 12 : ]次へ[
    • 14 : 移動"
    • 16 : ]から[
    • 18 : カレントビューへ移動
    views_rename_qs
    views_save_dialog
    views_submenu
    • 1 : Next
    • 2 : Current
    • 3 : Prev
    • 4 : Save
    • 5 : Save this view at
    • 7 : Rename...
    • 8 : Delete
    • 9 : Delete All...
    • 1 : 次へ
    • 2 : カレントビュー
    • 3 : 前へ
    • 4 : ビューを記憶
    • 5 : このビューを記憶:
    • 7 : リネーム...
    • 8 : ビューを削除
    • 9 : すべて削除...
    views_submenu_help
    • 1 : No saved views!
    • 2 : Jump to "
    • 5 : Rename "
    • 8 : Delete "
    • 11 : Delete all saved views
    • 1 : ビューが記憶されていません!
    • 2 : ジャンプ先"
    • 5 : リネーム"
    • 8 : 削除"
    • 11 : 記憶したビューを削除
    virtual_mirror
    virtual_mirror_fun
    wings_we
    all_soft
    mixed_edges
    normals_2
    wings_wm
    message_event
    wings_wm_toplevel
    close_event
    ctrl_command
    ctrl_menu
    • 1 : Fit
    • 2 : Both
    • 3 : Let window use all available space by expanding in all directions
    • 4 : Horizontal
    • 5 : Let window use all available space by expanding it horizontally
    • 6 : Vertical
    • 7 : Let window use all available space by expanding it vertically
    • 8 : Size
    • 9 : Set window size numerically
    • 1 : 余白一杯に広げる
    • 2 : 両方広げる
    • 3 : 余白があれば、ウインドウを全方向に拡張します
    • 4 : 水平
    • 5 : 水平方向に余白があれば、ウインドウの横幅をいっぱいに拡張します
    • 6 : 垂直
    • 7 : 垂直方向に余白があれば、ウインドウの高さをいっぱいに拡張します
    • 8 : サイズ
    • 9 : ウインドウサイズをダイアログで入力した数値で指定します
    ctrl_menu_toolbar
    • 1 : Hide Toolbar
    • 2 : Hide the toolbar
    • 3 : Show Toolbar
    • 4 : Show the toolbar
    • 1 : ツールバーを隠す
    • 2 : ツールバーを隠す
    • 3 : ツールバーを表示
    • 4 : ツールバーを表示
    ctrl_message
    ctrl_resize
    resize_event
    wpa
    dialog_template
    do_import
    export_scale_s
    export_selected
    format_error
    import
    import_scale_s


    Last modified

    2012/10/28 言語別の翻訳文字列データーベース構築作業中。
    2012/10/11 言語別の翻訳文字列データベースを追加(Segmenting、 UV、スナップモード時のメニューなど)。
    2012/10/04 2ndary Selection について少し調べてみた。
    2012/09/29 言語別の翻訳文字列データベースの構築(一部のみ)。
    2012/09/17 ソースコードをデータベースという視点から眺める を追加。
    2012/09/17 wings_util.erl にメニュー構成の情報があるということを追加。
    2012/03/22 プラグイン管理モジュール wings_plugin.erlの 概要を追加
    2012/01/14 wings3dとプラグインとフォント作成方法について
    2011/12/07 GUIを構築する Qs(クエリ文字列)の読み方と、GUIの値の受け取りに関する予想
    2011/10/03 Wings3dのプロセスについて追加
    2011/06/23 各章構成の見直し、Wings,hrlレコード情報の追加
    2011/06/13 最初の版


    <arolf_infoseek_jp> Tsukubado