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ドキュメント内の各オブジェクトは関連付けられたビュー表現オブジェクトを持ち、そのビュー表現オブジェクトはそのオブジェクトがどのように表示されるかを定義する色、ライン幅などの全てのプロパティを保持しています.

In Windows pyuic.py is located in "C:\Python27\Lib\site-packages\PyQt4\uic\pyuic.py" For conversion create a batch file called "compQt4.bat:

In the DOS console type without extension

Into Linux : to do

Since FreeCAD progressively moved away from PyQt after version 0.13, in favour of PySide (Choose your PySide install building PySide), to make the file based on PySide now you have to use:

In Windows uic.py are located in "C:\Python27\Lib\site-packages\PySide\scripts\uic.py" For create batch file "compSide.bat":

In the DOS console type without extension

Into Linux : to do

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

このクラスは全てのマウスボタンイベントを記録します. 登録されたコールバック関数は'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 -- 回転のクォータニオン、つまり四つの浮動小数点数のタプル

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

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

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

削除は次の様にします：

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

from PyQt4 import QtGui,QtCore from PyQt4 import uic def getMainWindow: "returns the main window" # QtGui.qApp.activeWindowの使用は信頼性が高くありません. # これはメインウィンドウではなく別のウィジット（例えばダイアログ）が # アクティブな場合に間違ったウィジットが返されるためです toplevel = QtGui.qApp.topLevelWidgets for i in toplevel: if i.metaObject.className == "Gui::MainWindow": return i   raise Exception("No main window found") def getComboView(mw): dw=mw.findChildren(QtGui.QDockWidget) for i in dw: if str(i.objectName) == "Combo View": return i.findChild(QtGui.QTabWidget) raise Exception("No tab widget found") mw = getMainWindow tab = getComboView(getMainWindow) tab2=QtGui.QDialog tab.addTab(tab2,"A Special Tab") uic.loadUi("/myTaskPanelforTabs.ui",tab2) tab2.show
 * 1) from PySide import QtGui,QtCore
 * 1) tab.removeTab(2)

(Python reminder: the __init__ method of a class is automatically executed whenever a new object is created!) Then, from FreeCAD, we only need to do:

That's all Folks... Now you can try all kinds of things, like for example inserting your widget in the FreeCAD interface (see the Code snippets page), or making much more advanced custom tools, by using other elements on your widget.

The complete script
This is the complete script, for reference:

開いたウェブページのHTMLコンテンツを取得
Here the same window but with an icon on each button.

Download associated icons (click right "Copy the image below ...)"



Here the code to display the icon on the pushButton, change the name for another button, (radioButton, checkBox) and the path to the icon.

The command UserAppData gives the user path AppHomePath gives the installation path of FreeCAD

This command reverses the horizontal button, right to left.

Method 2
Another method to display a window, here by creating a file QtForm.py which contains the header program (module called with import QtForm), and a second module that contains the code window all these accessories, and your code (the calling module).

The calling file that contains the window and your code.

The file my_file.py

The connections are to do, a good exercise.

Other example

Are treated :

The code page and the icons Qt_Example
 * 1) icon for window
 * 2) horizontalSlider
 * 3) progressBar horizontal
 * 4) verticalSlider
 * 5) progressBar vertical
 * 6) lineEdit
 * 7) lineEdit
 * 8) doubleSpinBox
 * 9) doubleSpinBox
 * 10) doubleSpinBox
 * 11) button
 * 12) button
 * 13) radioButton with icons
 * 14) checkBox with icon checked and unchecked
 * 15) textEdit
 * 16) graphicsView with 2 graphes

Icon personalised in ComboView
Here an example to create an object with properties and icon personalised in ComboView

Download the example icon to the same directory as the macro

Use of an icon for three different use cases: icon_in_file_disk (format .png), icon_XPM_in_macro (format .XPM) and icon_resource_FreeCAD



Complete example creating a cube and its icon

Use QFileDialog for writing to a file
Complete code:

Use QFileDialog to read a file
Complete code:

Use QColorDialog to get the color
Complete code:

Some useful commands
By using the characters with accents, where you get the error :

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-2: invalid data

Several solutions are possible.

or with the procedure

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 9: ordinal not in range(128)

or with the procedure

or

or

or