Code snippets/ja

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

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

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

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

リストに新しいファイル拡張子を追加するためには以下の行を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) ライン要素をドキュメントに追加し、その点を設定

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

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

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

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

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

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

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

The Python function that can be registered with addEventCallback expects a dictionary. Depending on the watched event the dictionary can contain different keys. For all events it has the keys: For all button events, i.e. keyboard, mouse or spaceball events For keyboard events: For mouse button event For spaceball events: And finally motion events:
 * Type -- the name of the event type i.e. SoMouseEvent, SoLocation2Event, ...
 * Time -- the current time as string
 * Position -- a tuple of two integers, mouse position
 * ShiftDown -- a boolean, true if Shift was pressed otherwise false
 * CtrlDown -- a boolean, true if Ctrl was pressed otherwise false
 * AltDown -- a boolean, true if Alt was pressed otherwise false
 * State -- A string 'UP' if the button was up, 'DOWN' if it was down or 'UNKNOWN' for all other cases
 * Key -- a character of the pressed key
 * Button -- The pressed button, could be BUTTON1, ..., BUTTON5 or ANY
 * Button -- The pressed button, could be BUTTON1, ..., BUTTON7 or ANY
 * Translation -- a tuple of three floats
 * Rotation -- a quaternion for the rotation, i.e. a tuple of four floats

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でシーングラフを取得して変更することも可能です.

from pivy.coin import *               # pivyモジュールをロード view = Gui.ActiveDocument.ActiveView  # アクティブなビューアーを取得 root = view.getSceneGraph           # ルートはSoSeparatorノード root.addChild(SoCube) view.fitAll

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

type = SoType.fromName("SoFCSelection") node = type.createInstance

The Python API of pivy is created by using the tool SWIG. As we use in FreeCAD some self-written nodes you cannot create them directly in Python. However, it is possible to create a node by its internal name. An instance of the type 'SoFCSelection' can be created with

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

from pivy import coin sg = Gui.ActiveDocument.ActiveView.getSceneGraph co = coin.SoCoordinate3 pts = 0,0,0],[10,0,0 co.point.setValues(0,len(pts),pts) ma = coin.SoBaseColor ma.rgb = (1,0,0) li = coin.SoLineSet li.numVertices.setValue(2) no = coin.SoSeparator no.addChild(co) no.addChild(ma) no.addChild(li) sg.addChild(no)

削除は次の様にします：

sg.removeChild(no)

To remove it, simply issue:

Adding custom widgets to the interface
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:

Adding a Tab to the Combo View
The following code allows you to add a tab to the FreeCAD ComboView, besides the "Project" and "Tasks" tabs. It also uses the uic module to load an ui file directly in that tab.

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

Other example with ViewObserver on a object select or view

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 "View Report" window (View > Views > View report)

Manual search of an element with label
PS: Usually the angles are given in Radian to convert :


 * 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"

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

Find 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