Python scripting tutorial/jp

Pythonはプログラミング言語で使い方はとても簡単、すぐに修得することができます. オープンソースかつマルチプラットフォームで簡単なシェルスクリプトから非常に複雑なプログラムのプログラミングまでさまざま用途で使用できます. ですがもっとも広く使われている用途はスクリプト言語として使うというものです. これは他のアプリケーションに簡単に組み込むことができるためです. FreeCAD内部でもまさにその様にして使用されています. Pythonコンソール、または自作のスクリプトからFreeCADを操作したり、まだグラフィカルユーザーインターフェイスのツールがない非常に複雑な動作を行わせることもできます.

例えばPythonスクリプトからは次の様な操作を行うことができます；
 * 新しいオブジェクトの作成
 * 既存のオブジェクトの変更
 * それらのオブジェクトの3D表示の変更
 * FreeCADのインターフェイスの変更

FreeCADではPythonを使う複数の方法が存在します：
 * FreeCADパイソンインタープリター. "コマンドライン"スタイルのインターフェイスでシンプルなコマンドを実行することができます.
 * マクロ. 存在しないツールをFreeCADインターフェイスに手軽に追加するのには便利な方法です.
 * 外部スクリプト. より複雑なプログラムに使用できます. 例えばワークベンチ全体といったものです.

このチュートリアルでは入門的なサンプルスクリプトをいくつか作成しますが、このWikiにはこれ以外にもたくさんの利用可能なPythonスクリプトについてのドキュメントがあります. もしPythonを使うのが初めてでその機能を知りたいのであれば基礎的なPyton入門もあります.

Pythonのコードを書く
FreeCADでPythonのコードを書く場合には二つの手軽な方法があります：Pythonコンソール（View -> Views -> Python consoleメニューから利用可能）、またはマクロエディター（Tools -> Macros）です. コンソールの場合Pythonコマンドを一つ一つ書いていき、コマンドはリターンキーを押したタイミングで実行されます. 一方、マクロでは複数行からできたより複雑なスクリプトを保存できます. このスクリプトはマクロが実行されたタイミングでだけ実行されます.



このチュートリアルでは両方の方法を使うことができます. 各行を一行ずつPythonコンソールにコピー/ペーストして各行ごとにキーを押すか、コード全体を新しいマクロウィンドウにコピー/ペーストしてください.

FreeCADの調査
さてまずは新しい空のドキュメントを作成しましょう：

doc = FreeCAD.newDocument

このコマンドをPythonコンソールに入力すると"FreeCAD."と入力した直後に行の残りをすばやく自動補完できるようにウィンドウがポップアップします. さらには自動補完リストの各エントリーにはそれが何を行うものかの説明のツールチップさえ備わっているのです. これを使えば利用可能な関数を簡単に調べることができます. "newDocument"を選択する前に他の利用可能なオプションも見ておいてください.



さて新しいドキュメントが作成されました. これはツールバーの"新しいドキュメント"ボタンを押した場合と同じです. 実際はFreeCADのボタンのほとんどは一、二行のPythonコードを実行しているだけに過ぎません. Edit -> Preferences -> General -> Macroにある"show script commands in python console"オプションを設定するとよくわかります. こうするとボタンを押した時に実行されるPythonコードが全てコンソールに表示されます. Pysonで操作を再現する方法を学ぶのにとても便利です.

さあ、ドキュメントに戻りましょう. ドキュメントを使って何ができるのかを確認してみましょう.

doc.

利用可能なオプションを調べてください. 通常、大文字から始まる名前は値が保持されている属性で、小文字から始まる名前は"処理を行うための"関数（メソッドとも呼ばれます）です. アンダースコアで始まる名前は通常はモジュールの内部動作のためのもので、気にする必要はありません. それではドキュメントに新しいオブジェクトを追加するためのメソッドの一つを使って見ましょう.

box = doc.addObject("Part::Box","myBox")

何も起きません. なぜでしょう？これはFreeCADが大きな展望に立って作られているからです. いつの日かそれぞれ独立した数百もの複雑なオブジェクトをFreeCADで操作できる時が来るでしょう. どこかを少し変更するだけで大きな影響が現れ、ドキュメント全体を再計算しなければならなくなるかもしれません. それには長い時間がかかることでしょう・・・こういった事情からほとんどのコマンドではシーンが自動的に更新されることはありません. 手動で更新を行う必要があるのです：

doc.recompute

見えましたか？作成したボックスが表示されました！FreeCADのオブジェクト追加ボタンの多くは実のところ2つの処理を行います. オブジェクトの追加と再計算です. もし上で説明した"show script commands in python console"オプションを有効にしていれば今度はGUIのボタンで球を追加してみてください. 二行のPythonコードが順番に実行されるのが見て取れるでしょう.

"Part::Box"は何かですって？どうすれば他の種類のオブジェクトを追加できるかですって？これを使うとわかります：

doc.supportedTypes

さて、作成したボックスの中身を調べてみましょう：

box.

すぐにとても興味をそそられるものがいくつか見つかるでしょう. 例えばこれです：

box.Height

これを使うとボックスの現在の高さを表示できます. 変更してみましょう：

box.Height = 5

マウスでボックスを選択するとプロパティパネルの"Data"タブに"Height"プロパティが表示されているのがわかるでしょう. ここ（と後で説明する"View"タブ）に表示されるFreeCADオブジェクトのプロパティは全てPythonによって直接アクセスすることができます. アクセスは先ほど"Height"プロパティでやったように名前で行います. ボックスの別の寸法も変更してみてください.

ベクトルと配置
ベクトルは3Dアプリケーションにおいて非常に基礎的な概念です. ベクトルとは3つの数字（x、y、z）のリストで、3D空間ないでの点や位置を表します. ベクトルを使うと加算、減算、投影やその他にも色々なことを行うことができます. FreeCADでは次のようにしてベクトルを使用します：

myvec = FreeCAD.Vector(2,0,0) myvec myvec.x myvec.y othervec = FreeCAD.Vector(0,3,0) sumvec = myvec.add(othervec)

FreeCADオブジェクトに共通する機能の一つが配置です. 各オブジェクトはPlacement属性を持ち、そこにはオブジェクトの位置（Base）と方向（Rotation）が保持されています. 操作は簡単です. 一例として私たちのオブジェクトを動かしてみましょう.

box.Placement. box.Placement.Base box.Placement.Base = sumvec otherpla = FreeCAD.Placement box.Placement = otherpla

さて、さらに進む前にいくつかの重要な概念を理解しておく必要があります.

AppとGui
FreeCADは最初、ユーザーインターフェイス無しのコマンドラインアプリケーションとして動作するように作成されていました. その結果、ほとんど全ての物が"幾何"コンポーネントと"表示"コンポーネントに分割されています. コマンドラインモードで動作させている際には幾何部分は存在しますが表示部分は無効化されるています. こうした理由からFreeCADのほとんどのオブジェクトは二つの部分、つまりObjectとViewObjectから構成されています.

このコンセプトの説明のために私たちの立方体を見てください. 寸法や位置など立方体の幾何プロパティはObjectの中に保持されています. 一方、色や線の太さなどの表示プロパティはViewObjecの中に保持されています. そしてそれがプロパティウィンドウの"Data"タブと"View"タブに対応しているのです. オブジェクトのViewObjecには次のようにしてアクセスすることができます：

vo = box.ViewObject

これで"View"タブのプロパティを変更することもできるようになりました：

vo.Transparency = 80 vo.hide vo.show

FreeCADが起動するとすぐにPythonコンソールは2つの基本モジュールをロードします. FreeCADとFreeCADGuiです（これらにも短縮名のAppとGuiによってアクセスることが可能です）. この二つにはドキュメントとそのオブジェクトを操作するための一般的な機能が保持されています. このコンセプトの説明のためにFreeCADとFreeCADGuiの両方にActiveDocument属性があることを確認してください. これが現在、開かれているドキュメントです. FreeCAD.ActiveDocumentとFreeCADGui.ActiveDocumentは同じオブジェクトではありません. FreeCADドキュメントを￥の二つのコンポーネントであり、異なる属性とメソッドが保持されています. 例えばFreeCADGui.ActiveDocument にはActiveViewがありますが、これは現在開かれている3Dビューです.

モジュール
あなたはきっと今、"Part::Box"以外には何ができるんだろう？と思っているに違いありません. FreeCADベースのアプリケーションは多少の違いは荒れ空の入れ物です. モジュールがなければできることは新しい空のドキュメントを作ることがせいぜいです. FreeCADの真価はそれに付き従うモジュールなのです. それぞれのモジュールはインターフェイスに新しいワークベンチを付け加えるだけでなく、新しいPythonコマンドや新しいオブジェクト型の追加も行います. それによって複数の異なるオブジェクト型、場合によっては全く互換性のないオブジェクト型まで同じドキュメントに共存させることができるのです. 後でこのチュートリアルでも見ていきますが、FreeCADで最も重要なモジュールはPart、Mesh、Sketcher、そしてDraftです.

SketcherとDraftは両方とも形状の作成と制御にPartモジュールを使用しています. これらで扱われる形状はBRepですが一方のMeshは完全に独立し、独自のオブジェクトを制御します. 詳細については下記にあります.

現在のドキュメントでの利用可能な基底オブジェクト型は次のようにしてチェックすることができます：

doc.supportedTypes

さまざまなFreeCADモジュールはFreeCADに独自のオブジェクト型を追加しますがpythonコンソールでは自動的に読み込まれません. これは起動が遅くなることを防ぐためです. モジュールはそれが必要になった時にのみ読み込まれます. 例えばPartモジュールの内部を調べたい時は以下のようにします：

import Part Part.

しかし今はここまでにしておいてPartモジュールについては後で詳しく説明します.

さて、FreeCADのさまざまなモジュールについて多少は理解できたと思います. コアモジュール（FreeCAD、FreeCADGui）とワークベンチモジュール（Part、Mesh、Sketcher）です. それ以外にも3Dシーンモジュール（pivy）とインターフェイスモジュール（pyqt）という重要なモジュールがありますが、それについても後で説明を行います.

さあ重要なワークベンチモジュールの一つについてもう少し詳しく見て行くことにしましょう.

Mesh
メッシュは非常に単純な3Dオブジェクトで例えばSketchup、Blender、3D studio Maxで使用されています. メッシュは3つの要素でできています. 点（頂点とも呼ばれます）、線（エッジとも呼ばれます）、そして面です. FreeCADを含む多くのアプリケーションでは面は点を三つだけ持つことができます. しかし、もちろん同一平面上にある複数の三角形からなるもっと大きな平面を作ることができます

メッシュは非常に単純なのでそれが短所になることもありますが上にあげたような多くのアプリケーションではむしろ利点になります. 単純ゆえに一つのドキュメントの中に数百万ものメッシュを持つことが容易にできるからです. しかしFreeCAD内部ではあまり使われず、ほとんどの場合は他のアプリケーションから出力されたメッシュ形式（.stl、.obj）のオブジェクトをインポートする用途に使われます. またFreeCADが誕生した初めの一ヶ月間はメインテストモジュールとして広く使われました.

MeshオブジェクトとFreeCADオブジェクトは別物です. FreeCADオブジェクトをMeshオブジェクトの入れ物と考えるといいでしょう（後で見るようにPartオブジェクトについても同じことが言えます）. FreeCADにメッシュオブジェクトを追加するためにはまず最初にFreeCADオブジェクトとMeshオブジェクトを作成しなければなりません. それが終わったらFreeCADオブジェクトにMeshオブジェクトを追加します：

import Mesh mymesh = Mesh.createSphere mymesh. mymesh.Facets mymesh.Points meshobj = doc.addObject("Mesh::Feature","MyMesh") meshobj.Mesh = mymesh doc.recompute

標準的な例です. createSphereメソッドを使って自動で球を作成していますが、もちろん頂点と面を定義してゼロから自作のメッシュを作成することもできます.

メッシュのスクリプト処理についてもっと読む・・・

Part
FreeCAD全体で最も強力なモジュールがパートモジュールです. これを使うとBRepオブジェクトを作成し、操作することができます. メッシュと異なりこのオブジェクトには幅広いコンポーネントが用意されています. すこし説明しておくとBrepとは境界表現（Boundary Representation）を意味します. つまりこのオブジェクトは内部体積を定義する閉じた表面によって定義されるのです. これらの表面は平面から非常に複雑なNURBS面までさまざまに変化します. またこれに体積の概念はこれらの表面に基づきます.

Partモジュールは強力な機能を持つOpenCasCadeライブラリをその基盤としています. このライブラリはブーリアン演算、フィレット処理、ロフト処理などの幅広い複雑な操作を簡単にそのオブジェクトに対して行うための機能を提供しています.

Partモジュールの使い方はMeshモジュールと同じです. FreeCADオブジェクトとPartオブジェクトを作成し、PartオブジェクトをFreeCADオブジェクトに追加します：

import Part myshape = Part.makeSphere(10) myshape. myshape.Volume myshape.Area shapeobj = doc.addObject("Part::Feature","MyShape") shapeobj.Shape = myshape doc.recompute

（Meshモジュールと同様に）Partモジュールにも自動でFreeCADオブジェクトを作成して形状を追加するためのシュートカットが存在します. それを使えば上のコードの最後の3行を省略することができます：

Part.show(myshape)

myshapeの中身を調べるとFaces、Edges、Vertexes、Solids、Shellsといったたくさんの興味をそそられる利用可能サブコンポーネントや切り取り（減算）、共通集合（交差）、フューズ（結合）といった幅広い形状操作があることに気がつくでしょう. 幾何データスクリプト処理のページではこれら全てについて詳細に説明を行なっています.

パートのスクリプト処理についてもっと読む・・・

Draft
FreeCADにはSketcherやDraftといったさらに多くのモジュールが備わっています. これらのモジュールはPartオブジェクトを作成するだけでなくそれにパラメーターを追加していたり、そのPartの形状を制御するための全く新しい手段を持っていることさえあります. 上のボックスのサンプルはちょうどパラメトリックオブジェクトの良い例になっています. ボックスを定義するために必要なことは高さや幅といったいくつかのパラメーターを指定することだけです. パラメーターに基いてオブジェクトはPart形状を自動で計算します. FreeCADではPythonを使ってこういったオブジェクトを作成する手段が用意されています.

Draftモジュールではlines、circlesといったいくつかの2Dパラメトリックオブジェクト型が追加されており（全Partオブジェクトも含まれています）、またDraft製オブジェクトだけでなく、全てのPartオブジェクトに対して使用可能なジェネリック関数もいくつか用意されています. 何が利用可能か調べるためには次の様にするだけです：

import Draft Draft. rec = Draft.makeRectangle(5,2) mvec = FreeCAD.Vector(4,4,0) Draft.move(rec,mvec) Draft.move(box,mvec)

Interface
FreeCADのユーザーインターフェイスはQtによって作られています. Qtは強力なグラフィカルインターフェイスシステムであり、3Dビューの周りに配置されたメニュー、ツールバー、ボタンといった全てのコントロールの描画と制御を行なっています. QtにはPyQtと呼ばれるモジュールが用意されています. これを使うとPythonでFreeCADで採用されているようなQtインターフェイスへアクセスしたり変更を加えることができます. Qtインターフェイスをいじって簡単なダイアログを作成してみることにしましょう：

from PyQt4 import QtGui QtGui.QMessageBox.information(None,"Apollo program","Houston, we have a problem")

ツールバーにFreeCADのアイコンがあるダイアログが表示されます. つまりQtはこの命令がFreeCADアプリケーション内部から発行されたものであることをわかっているのです. 従って私たちはFreeCADのインターフェイスのどの部分でも簡単に直接操作することが可能なのです.

Qtは非常に強力なインターフェイスシステムで非常に複雑なことも可能です. またそれだけでなくQt Designerのように簡単に使えるツールもいくつか提供されています. Qt Designerを使えばグラフィカルにダイアログをデザインすることができ、数行のPythonコードを書くだけでそれをFreeCADのインターフェイスに追加することができます.

pyqtについてもっと読む・・・

マクロ
さて基本的なことについて十分理解できたかと思います. それではPythonスクリプトの保存はどこでできるのでしょうか？またどうやればFreeCADから簡単にそれを起動できるのでしょうか？そのための簡単な仕組みがあり、マクロと呼ばれています. マクロはたんなるPythonスクリプトで、ツールバーに追加してマクスクリックするだけで起動することが可能です. FreeCADには簡単なテキストエディター（Macro -> Macros -> Create）が用意されており、それを使ってスクリプトを書いたり、ペーストすることができます. それができたらTools -> Customize -> Macrosを使ってスクリプトに対してボタンを設定してツールバーに追加することができます.

これでFreeCADのスクリプト処理についてもっと詳細に知る準備ができました. パワーユーザーハブへ進んでください！