FreeCADはPythonスクリプトで完全に操作できるように一から作られています。FreeCADのほとんどの部分、インターフェースやシーンの内容、そして3Dビューで表示される内容でさえも、内蔵のPythonインタプリタや自作のスクリプトからアクセスすることができます。このためFreeCADは現在利用できるエンジニアリング用アプリケーションの中でも、とことんカスタマイズ可能なアプリの一つでしょう。
しかしいまのところ、3Dオブジェクトを操作するための'ネィティブ'コマンドはほんの僅かしかありません。これは開発がいまだ初期段階であるということだけではなく、アプリケーションとしての特定の利用よりもCAD開発のためのプラットフォームを提供すること背景にある設計思想として優先しているからです。しかしFreeCADのpythonスクリプトは簡単なので、パワーユーザーやpythonプログラムを少しかじったことのあるユーザーが開発中の新しい機能を素早く調べる上で、大きな手助けとなるでしょう。Pythonは最も人気のあるインタプリタ言語の一つで、それは学ぶのが簡単であると言われているためでもあります。あなたもすぐに独自のFreeCAD'パワーユーザー'スクリプトを作成できる様になるでしょう。
もしPythonに慣れていなければ、インターネット上でチュートリアルを検索することをお勧めします。まずはPythonの構造をざっと見ることです。Pythonはとても簡単に学ぶことのできる言語で、これは特にインタプリタで実行できることが大きいでしょう。単純なコマンドから完全なプログラムまで、一切コンパイルする必要がなく、その場で実行することができるのです。FreeCADは内蔵のpythonインタプリタを持っています。もし以下に示すような"Python console"という名前のウインドウが見つからなければ、View -> Views -> Python consoleからインタプリタを起動してください。
インタプリタから、システムにインストールされている全てのPythonモジュールにアクセスすることができます。また内蔵のFreeCADモジュールや、後から追加インストールしたFreeCADモジュールへもアクセスが可能です。次のスクリーンショットはPythonインタプリタです。
インタプリタではPythonコードの実行と利用可能なクラスや関数の閲覧が可能です。またFreeCADはFreeCADの新世界を探索するためのとても便利なクラスブラウザを提供しています。既知のクラス名に続いてピリオドをタイプすると(これはそのクラスから何かを追加するという意味です)、クラスブラウザウインドウが開き、利用可能なサブクラスとメソッドをナビゲートすることができます。ここで何かを選択すると関連するヘルプテキストが(ある場合ですが)表示されます。
ではGui. やApp. をタイプして何が起こるのか見てください。モジュールやクラスの内容を調べるもう一つのより一般的な方法は、print dir()コマンドを使うことです。たとえば、print dir() とタイプすると、現在FreeCADで読み込まれている全てのモジュールをリストします。print dir(App) はAppモジュールに含まれている全ての内容を表示します。
インタプリタのもう一つの便利な機能は、コマンドの履歴を遡ることができ、前に入力したコードの行を取り出せることです。コマンドの履歴の移動は、Ctrl+上、またはCtrl+下です。
インタプリタウインドウ内での右クリックで、全てのコマンド履歴のコピー(完全なスクリプトを作成する前に処理を試したい場合に便利です)や、ファイルの絶対パスの挿入などの複数のオプションが利用できます。
FreeCADのヘルプメニューには”Python help”という名前のついた項目があり、FreeCADで利用可能な全てのPythonモジュールについての、リアルタイムで生成された完全なドキュメントを持ったブラウザが開きます。これには、Python、FreeCAD内蔵モジュール、システムにインストール済みのモジュール、そしてFreeCADの追加モジュールのドキュメントが含まれます。利用できるドキュメントは、各モジュールの開発者が自分のコードにどれだけドキュメントを入れる努力をしているかによりますが、ほとんどの場合、pythonモジュールはかなりよくドキュメント化されていると定評があります。このドキュメントのシステムを利用するためには、FreeCADウインドウを開いたままにする必要があります。
FreeCADは、グラフィカルユーザーインターフェース抜きでも実行できるように設計されているため、ほとんど全ての機能が2つのグループに分けられています。Appと名づけられたコアとなる機能と、Guiと名づけられたGUIの機能です。このため、2つの主要な内蔵モジュールはAppとGuiと呼ばれています。この2つのモジュールは内蔵インタプリタ外部のスクリプトからも、FreeCADとFreeCADGuiという名前でそれぞれアクセスできます。
モジュールの内容を全てリストにするのはFreeCADの開発に伴いその内容も急増していくので少々非生産的な仕事です。しかし提供されている2つの閲覧ツール(クラスブラウザとpythonヘルプ)でいつでもモジュールの最新の完全なドキュメントを得られるはずです。
先ほど述べたように、FreeCADの全ての機能はコアと表現に別れています。これには3Dオブジェクトも含まれています。Appモジュールを介してオブジェクトのプロパティ定義(FreeCADで機能と呼ばれるもの)にアクセスすることができ、そしてGuiモジュールを介してそれらのスクリーン上での表現方法を変えることができます。たとえば立方体はそれを定義するプロパティである長さや幅、高さなどを持ち、これらはAppオブジェクトに格納されています。また表現のプロパティである、面の色や描画方法などは対応するGuiオブジェクトに格納されています。
このようなやり方は、視覚的な部分をまったく気にすることなくアルゴリズムをその機能の定義部分でのみ動作するようにさせたり、ドキュメントの内容をリストやスプレッドシートや要素解析などのノングラフィカルなアプリケーションへ出力するなどの、幅広い利用を可能にしています。
ドキュメント内のどのAppオブジェクトも対応するGuiオブジェクトが存在します。ドキュメントそれ自体も実際にはAppとGuiオブジェクトを持っています。これはもちろんFreeCADを完全なインターフェイスで実行したときに有効になります。コマンドラインバージョンではGUIが存在しないのでAppオブジェクトのみが利用できます。オブジェクトのGui部分はAppオブジェクトが"再計算する"とマークされたときに再び生成されます(例えばパラメータがひとつ変更された時)、そのためGuiオブジェトに対して直接行った操作が消えてしまう可能性があることに注意してください。
App部分にアクセスするためには、次のように入力します。
myObject = App.ActiveDocument.getObject("ObjectName")
ここで"ObjectName"はオブジェクトの名前です。また次のように入力することもできます。
myObject = App.ActiveDocument.ObjectName
同じオブジェクトのGUI部分へアクセスするには、次のように入力します。
myViewObject=Gui.ActiveDocument.getObject("ObjectName")
ここで"ObjectName"はオブジェクトの名前です。また次のように入力することもできます。
myViewObject = App.ActiveDocument.ObjectName.ViewObject
GUIを持っていない場合には(例えばコマンドラインモード)、最後の行はNoneが帰ってきます。
FreeCAD上であなたが行った全ての内容はドキュメントの中に存在しています。ドキュメントはジオメトリを持ち、ファイルに保存することができます。また複数のドキュメントを同時に開くこともできます。ドキュメントはジオメトリと同じくAppやGUIオブジェクトを内部に持っています。Appオブジェクトには実際のジオメトリ定義が含まれていますが、一方でGUIオブジェクトはドキュメントのさまざまなビューを含んでいます。あなたは複数のウインドウを開き、そのそれぞれで異なる倍率や視点でビューを表示することができます。これらのビューは全てドキュメントのGUIオブジェクトの一部です。
現在開いている(アクティブな)ドキュメントのApp部分にアクセスするには次のように入力します。
myDocument = App.ActiveDocument
新しいドキュメントを作成するには次のように入力します。
myDocument = App.newDocument("Document Name")
現在開いている(アクティブな)ドキュメントのGui部分にアクセスするには次のように入力します。
myGuiDocument = Gui.ActiveDocument
現在のビューにアクセスするには次のように入力します。
myView = Gui.ActiveDocument.ActiveView
FreeCADモジュールとFreeCADGuiモジュールが果たす役割はFreeCADドキュメントでのオブジェクトの作成と管理だけです。これらのモジュールはジオメトリーの作成や変更といった処理は全く行いません。ジオメトリーの種類は複数にわたり、それらはそれぞれの特定のジオメトリー型の管理に特化した追加モジュールによって管理されるためです。例えばパートモジュール はOpenCascadeカーネルを使用してOpenCascadeが作成された目的であるところのB-rep型ジオメトリーの作成と操作を行うことができます。メッシュモジュールはメッシュオブジェクトの作成と変更を行うことができます。この様にFreeCADは幅広い種類のオブジェクト型を扱うことができ、それらを同じドキュメント内で同時に保持することができます。また今後も新しい型を簡単に追加していくことができるのです。
各モジュールはそれぞれの方法でジオメトリーを取り扱いますが一つだけ全てのモジュールで行うことのできる処理があります。ドキュメント内でのオブジェクトの作成です。一方でFreeCADドキュメントの方でもモジュールによって提供される利用可能なオブジェクト型を認識することができます:
FreeCAD.ActiveDocument.supportedTypes() 上記を行うと作成することのできる全てのオブジェクトがリストアップされます。例としてメッシュ(メッシュモジュールによって扱われます)とパート(パートモジュールによって扱われます)を作ってみましょう: myMesh = FreeCAD.ActiveDocument.addObject("Mesh::Feature","myMeshName") myPart = FreeCAD.ActiveDocument.addObject("Part::Feature","myPartName")
一つ目の引数はオブジェクトの型で、二つ目の引数はオブジェクトの名前です。作成した二つのオブジェクトはほとんど同じように見えます。ジオメトリーはまだ設定されておらず、dir(myMesh)やdir(myPart)で調べるとそのプロパティはほとんど同じです。一つだけ異なるのはmyMeshには"Mesh"プロパティがあり、"Part"には"Shape"プロパティがあることです。これがメッシュやパートのデータが保存される場所です。例として立方体パートを作成してmyPartオブジェクトに設定してみましょう:
import Part cube = Part.makeBox(2,2,2) myPart.Shape = cube
試しにcubeをmyMeshのMeshプロパティに設定してみてください。は間違った型である、というエラーメッセージでエラーが返されるはずです。これらのプロパティは特定の型のみ設定できるように作られているからです。myMeshのMeshプロパティにはMeshモジュールで作成したインスタンスしか保存できないのです。またほとんどのモジュールにはドキュメントにそのジオメトリーを追加するためのシュートカットがあることを憶えておいてください。
import Part cube = Part.makeBox(2,2,2) Part.show(cube)
オブジェクトの変更も同じように行います:
import Part cube = Part.makeBox(2,2,2) myPart.Shape = cube
それではもう少し形状を大きく変更しましょう:
biggercube = Part.makeBox(5,5,5) myPart.Shape = biggercube
以下のようにするといつでもオブジェクトの型を見ることができます:
myObj = FreeCAD.ActiveDocument.getObject("myObjectName") print myObj.Type
またオブジェクトが基本オブジェクト(Part FeatureやMesh Featureなど)から継承されたものかどうか調べるには以下のようにします:
print myObj.isDerivedFrom("Part::Feature")
さあ、これで本当にFreeCADで遊び始めることができます!パートモジュールを使って何ができるかについてはパートのスクリプト処理ページを、 メッシュモジュールを使った作業についてはメッシュのスクリプト処理ページを読んでください。パートモジュールやメッシュモジュールはほぼ完成して幅広く使用されていますが、製図モジュールなどの他のモジュールにも便利なスクリプト処理用APIがあることを憶えておいてください。各モジュールの完全なリストとそこで利用可能なツールについてはCategory:API/jpセクションを見てください。