Code snippets/ja

Introduction
このページにはフォーラムでユーザーが作成したり議論した中から集めたFreeCAD用Pythonコードのサンプル、コード片、コードの一部を集めて載せています. あなたのスクリプトの参考にしてください・・・

典型的なInitGui.pyファイル
全てのモジュールにはメインモジュールファイルに加えてメインGUIにモジュールを挿入するためのInitGui.pyファイルが含まれていなければなりません. これはその単純な例です.

Every module must contain, besides your main module file, an InitGui.py file, responsible for inserting the module in the main Gui. This is an example of a simple one.

典型的なモジュールファイル
モジュールが行う処理の全てが記載されているメインモジュールファイルの例です. 前の例で呼び出されるScripts.pyファイルです. 自作のコマンドの全てをここに記載します.

This is an example of a main module file, containing everything your module does. It is the Scripts.py file invoked by the previous example. You can have all your custom commands here.

新しいファイルタイプをインポート
FreeCADでは簡単に新しいファイルタイプ用のインポート処理を作成することができます. FreeCADはデータを開かれているドキュメントからインポートするか、たんに直接新しいファイルタイプを開くかを区別しません. やらなければならないのは新しいファイル拡張子を FreeCADのリストに追加し、そのファイルを読み込んで欲しいFreeCADオブジェクトを作成するコードを書くことだけです：

Making an importer for a new filetype in FreeCAD is easy. FreeCAD doesn't consider that you import data in an opened document, but rather that you simply can directly open the new filetype. So what you need to do is to add the new file extension to FreeCAD's list of known extensions, and write the code that will read the file and create the FreeCAD objects you want:

リストに新しいファイル拡張子を追加するためには以下の行をInitGui.pyに追加しなければなりません：

FreeCAD.addImportType("Your new File Type (*.ext)","Import_Ext")
 * 1) .extファイルを開いて読み込むためのコードがあるファイルをImport_Ext.pyとします

Import_Ext.pyファイルには以下のように書きます：

新しいファイルタイプへのドキュメントのエクスポートも以下の行を使用する以外は同様にして行います： FreeCAD.addExportType("Your new File Type (*.ext)","Export_Ext")

ラインの追加
ラインは2点を持ちます：

import Part,PartGui doc=App.activeDocument l=Part.Line l.StartPoint=(0.0,0.0,0.0) l.EndPoint=(1.0,1.0,1.0) doc.addObject("Part::Feature","Line").Shape=l.toShape doc.recompute
 * 1) ライン要素をドキュメントに追加し、その点を設定

A line simply has 2 points.

ポリゴンの追加
ポリゴンはつながった線分の集合（AutoCADでいうポリライン）です. 線分の集合が閉じている必要はありません.

A polygon is simply a set of connected line segments (a polyline in AutoCAD). It doesn't need to be closed.

グループに対するオブジェクトの追加と削除
注意：　グループにグループを追加することも可能です・・・

オブジェクト表現へのアクセスと変更
FreeCADドキュメント内の各オブジェクトは関連付けられたビュー表現オブジェクトを持ち、そのビュー表現オブジェクトはそのオブジェクトがどのように表示されるかを定義する色、ライン幅などの全てのプロパティを保持しています.

Each object in a FreeCAD document has an associated view representation object that stores all the parameters that define how that object appears: i.e. color, linewidth, etc... See also List the components of an object snippet below

Replace the form of mouse with one image (cross) include
The image is created by Gimp exported in a .XPM file. Copy and use the code between the bracket "{" code to copy  "}"

Observe camera change in the 3D viewer via Python
This can be done adding a Node sensor to the camera. from pivy import coin

Pythonから3Dビューアーのマウスイベントを監視
Inventorフレームワークでは　複数のコールバック用ノードをビューアーへのシーングラフへ追加することができます. デフォルトではFreeCADはビューアーごとに一つのコールバック用ノードがインストールされており、それを使うとグローバルまたはスタティックなC++関数を追加することができます. 適切なPythonバインディングではこのテクニックをPythonコードから利用するためのメソッドが提供されています.

The Inventor framework allows to add one or more callback nodes to the scenegraph of the viewer. By default in FreeCAD one callback node is installed per viewer which allows to add global or static C++ functions. In the appropriate Python binding some methods are provided to make use of this technique from within Python code.

このクラスは全てのマウスボタンイベントを記録します. 登録されたコールバック関数は'down'イベントと'up'イベントで
 * 1) 二回、ファイヤーします. これをハンドリングするためのブール値フラグが必要です.

さあ、3Dビューアーの領域のどこかをピックして出力ウィンドウにメッセージが表示されるのを見てください. 監視を終了するには次のようにします.

次のイベント型がサポートされています.
 * SoEvent -- 全ての種類のイベント
 * SoButtonEvent -- 全てのマウスボタンイベントとキーイベント
 * SoLocation2Event -- 2D動作イベント（通常はマウス動作）
 * SoMotion3Event -- 3D動作イベント（通常はスペースボール）
 * SoKeyboardEvent -- キーダウンイベントとキーアップイベント
 * SoMouseButtonEvent -- マウスのボタンダウンイベントとボタンアップイベント
 * SoSpaceballButtonEvent -- スペースボールのボタンダウンイベントとボタンアップイベント

addEventCallbackによって登録されるPython関数は辞書を要求します. 検知されたイベントに従って辞書には様々なキーが保持されます. 全てのイベントは次のキーを持ちます： 全てのボタンイベント、つまりキーボードイベント、マウスイベント、スペースボールイベントの場合： キーボードイベントの場合： マウスボタンイベントの場合： スペースボールイベントの場合： そして最後にモーションイベントの場合：
 * Type -- イベント型の名前、つまりSoMouseEvent、SoLocation2Event、・・・などです.
 * Time -- 文字列形式での現在時刻
 * Position -- マウス位置を表す二つの整数のタプル
 * ShiftDown -- ブール値. Shiftが押されている場合はtrue、それ以外の場合はfalse.
 * CtrlDown -- ブール値. Ctrlが押されている場合はtrue、それ以外の場合はfalse.
 * AltDown -- ブール値. Altが押されている場合はtrue、それ以外の場合はfalse.
 * State -- ボタンが離された場合は'UP'、押された場合は'DOWN'、それ以外の場合は'UNKNOWN'の文字列
 * Key -- 押されたキーの文字
 * Button -- 押されたボタン. BUTTON1、・・・、BUTTON5など.
 * Button -- 押されたボタン. BUTTON1、・・・、BUTTON7など.
 * Translation -- 三つの浮動小数点数のタプル
 * Rotation -- 回転のクォータニオン、つまり四つの浮動小数点数のタプル

Display keys pressed and Events command
This macro displays in the report view the keys pressed and all events command

Pythonでのシーングラフ操作
Coin用のPythonバインディングである'pivy'モジュールを使ってPythonでシーングラフを取得して変更することも可能です.

It is also possible to get and change the scenegraph in Python, with the 'pivy' module -- a Python binding for Coin.

pivyのPythonAPIはSWIGというツールを使って作られています. FreeCADで使用する場合、自作ノードをPythonで直接作成することはできません. ただし、内部的な名称を使ってノードを作成することはできます. 'SoFCSelection'型のインスタンスは次のようにして作成することが可能です：

シーングラフに対するオブジェクトの追加と削除
シーングラフへの新しいノードの追加は以下のようにして行うことができます. オブジェクトのジオメトリー、座標、マテリアルの情報の追加のためには常にSoSeparatorの追加が必要なことに注意してください. 次の例では (0,0,0)から(10,0,0):に引かれた赤いラインを追加しています.

Adding new nodes to the scenegraph can be done this way. Take care of always adding a SoSeparator to contain the geometry, coordinates and material info of a same object. The following example adds a red line from (0,0,0) to (10,0,0):

削除は次の様にします：

Save the sceneGraph in 3 series of 36 files
View the code snippet by expanding this section

コンボビューへのタブの追加
次のコードを使うとFreeCADのコンボビューの"Project"タブ、"Tasks"タブの隣にタブを追加することができます. またuiファイルを直接そのタブに読み込むためにuicモジュールを使用しています.

You can create custom widgets with Qt designer, transform them into a python script, and then load them into the FreeCAD interface with PySide.

The python code produced by the Ui python compiler (the tool that converts qt-designer .ui files into python code) generally looks like this (it is simple, you can also code it directly in python):

Then, all you need to do is to create a reference to the FreeCAD Qt window, insert a custom widget into it, and "transform" this widget into yours with the Ui code we just made:

Add a Tab to the Combo View
The following code allows you to add a tab to the Combo view, separate from the preexisting "Model" and "Tasks" tabs. It also uses the module to load an UI file directly in that tab.

Enable or disable a window
This script give the ability to manipulate the UI from the Python console to show/hide different components in the FreeCAD interface such as:
 * Report view
 * Tree view
 * Property view
 * Selection view
 * Combo View
 * Python console
 * draftToolbar

Function resident with the mouse click action
Here with SelObserver on a object select

Other example with ViewObserver on a object select or view

List the components of an object
This function list the components of an object and extracts:
 * this object its XYZ coordinates,
 * its edges and their lengths center of mass and coordinates
 * its faces and their center of mass
 * its faces and their surfaces and coordinates

Search and data extraction
Examples of research and decoding information on an object.

Each section is independently and is separated by "############" can be copied directly into the Python console, or in a macro or use this macro. The description of the macro in the commentary.

Displaying it in the "Report View" window (View > Views > Report view)

Manual search of an element with label
Note: Usually the angles are given in Radian. To convert them:


 * 1) angle in Degrees to Radians :
 * 2) *Angle in radian = pi * (angle in degree) / 180
 * 3) *Angle in radian = math.radians(angle in degree)
 * 4) angle in Radians to Degrees :
 * 5) *Angle in degree = 180 * (angle in radian) / pi
 * 6) *Angle in degree = math.degrees(angle in radian)

Cartesian coordinates
This code displays the Cartesian coordinates of the selected item.

Change the value of "numberOfPoints" if you want a different number of points (precision)

Other method display on "Int" and "Float"

Get the normal vector on the surface
This example show how to find normal vector on the surface by find the u,v parameters of one point on the surface and use u,v parameters to find normal vector

Get the normal vector of a surface from a STL file
you are done then run for quit:

Create one object to the position of the Camera
here same code simplified

Create a Sketch on a Surface in PartDesign
This snippet can be useful, if you want to create a sketch on a surface in PartDesign from inside a macro. Note, that body might be None, if no active body is selected and that the Selection might be empty.

How to Simulate a Mouse Click at a given Coordinate
The position is relative to the GL widget. See forum thread.

If you have a 3d point and want to get the 2d point on the opengl widget then use this:

How to create a face with holes using Python API
This snippet demonstrates how to create a face with internal holes through the Python API. See forum thread.

Coin3D
See Coin3d snippets

Related

 * Scripted objects
 * Macros