FreeCAD Scripting Basics/jp

FreeCADでのPythonによるスクリプト処理
FreeCADはPythonスクリプトで完全に操作できるように一から作られています. FreeCADのほとんどの部分、インターフェースやシーンの内容、そして３Dビューで表示される内容でさえも、内蔵のPythonインタプリタや自作のスクリプトからアクセスすることができます. このためFreeCADは現在利用できるエンジニアリング用アプリケーションの中でも、とことんカスタマイズ可能なアプリの一つでしょう.

しかしいまのところ、３Dオブジェクトを操作するための'ネィティブ'コマンドはほんの僅かしかありません. これは開発がいまだ初期段階であるということだけではなく、アプリケーションとしての特定の利用よりも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+下です.

インタプリタウインドウ内での右クリックで、全てのコマンド履歴のコピー（完全なスクリプトを作成する前に処理を試したい場合に便利です）や、ファイルの絶対パスの挿入などの複数のオプションが利用できます.

pythonのヘルプ
FreeCADのヘルプメニューには”Python help”という名前のついた項目があり、FreeCADで利用可能な全てのPythonモジュールについての、リアルタイムで生成された完全なドキュメントを持ったブラウザが開きます. これには、Python、FreeCAD内蔵モジュール、システムにインストール済みのモジュール、そしてFreeCADの追加モジュールのドキュメントが含まれます. 利用できるドキュメントは、各モジュールの開発者が自分のコードにどれだけドキュメントを入れる努力をしているかによりますが、ほとんどの場合、pythonモジュールはかなりよくドキュメント化されていると定評があります. このドキュメントのシステムを利用するためには、FreeCADウインドウを開いたままにする必要があります.

内蔵モジュール
FreeCADは、グラフィカルユーザーインターフェース抜きでも実行できるように設計されているため、ほとんど全ての機能が2つのグループに分けられています. Appと名づけられたコアとなる機能と、Guiと名づけられたGUIの機能です. このため、２つの主要な内蔵モジュールはAppとGuiと呼ばれています. この2つのモジュールは内蔵インタプリタ外部のスクリプトからも、FreeCADとFreeCADGuiという名前でそれぞれアクセスできます.


 * Appモジュール では、アプリケーション自身に関連する全ての内容が見つかります. ファイルやドキュメントのオープンとクローズのメソッドや、アクティブなドキュメントの設定、その内容のリスト化などです.


 * GUIモジュール では、Guiの構成要素の管理とアクセスのためのツールが見つかります. ワークベンチとそのツールバーや、より興味深い、FreeCADの全内容のグラフィカル表現です.

モジュールの内容を全てリストにするのはFreeCADの開発に伴いその内容も急増していくので少々非生産的な仕事です. しかし提供されている２つの閲覧ツール（クラスブラウザとpythonヘルプ）でいつでもモジュールの最新の完全なドキュメントを得られるはずです.

AppとGuiオブジェクト
先ほど述べたように、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セクションを見てください.