Expressions/ja

概要

オブジェクトのプロパティーを数式で定義することが可能です。GUIでは、プロパティーを表す数値調整ボックスまたは入力フィールドを選択すると、青いアイコンが表示されます。アイコンをクリックするか等号記号=をキーボードから入力すると、そのプロパティーの数式エディターが開きます。もしインプットフィールドに青いアイコンではなく...ボタンが表示されている場合は、プロパティーを右クリックし、コンテキスト・メニューから数式...を選択すると数式エディターが開きます。

FreeCADにおける数式は、以下で説明する演算子関数定義済み定数を組み合わせた数式です。これらに加えて、他のオブジェクト・プロパティー(の値)を参照したり、条件式も使えます。数式における数値に単位を与えることも可能です。

数値の整数部分と小数部分を分けるには、コンマ,または小数点.のどちらも使えます。小数点(または小数コンマ)がある場合、少なくとも1桁以上の小数が必須です。したがって、1. + 2.1, + 2,は正しい数式ではありませんが、1.0 + 2.01,0 + 2,0は正しい数式です。

もし単位が与えられた場合、演算子や関数は単位が正しく揃っていることを要求します。例えば、2mm + 4mmは正しい数式ですが、2mm + 4は正しい数式ではありません。これは他のオブジェクト・プロパティーを参照するときにも適用されます。オブジェクトプロパティーが長さを表している場合、Pad001.Length + 1は、長さと無次元数を加算しようとしているので、正しい数式ではありません。これは、Pad001.Length + 1mmのように書かなければなりません。

単位に関連するエラーは直感的でない場合があります。式が拒否されたり、式の結果の単位が設定するプロパティの単位と一致しないことがあります。以下にいくつかの例を示します:

1/2mmは0.5ミリメートルになりません。これは1/(2mm)と解釈された結果、0.5 mm^-1になります。

sqrt(2)mmは正しい数式ではありません。なぜなら、関数(sqrt)は数ではないためです(訳注:単位の前は数でなければならない)。したがってsqrt(2) * 1mmのように記述する必要があります。

関数の引数

関数に複数の引数を与える場合、各引数は、セミコロン;またはコンマ+空白, で区切る必要があります。後者の場合、コンマは入力後セミコロンに置き換えられます。セミコロンを使う場合、その後に空白をつける必要はありません。

スプレッドシートのセルを引数として使うこともできます。セルの参照は、A1のように大文字の列名に行番号をつなげて表した形で参照できます。あるいは、セルに別名が定義されている場合、Spreadsheet.MyPartWidthのように別名でも参照できます。

オブジェクトの参照

既に上で例を示したとおり、オブジェクトをデータName(名前)あるいはデータLabel(ラベル)で参照できます。データLabelで参照する場合、ラベル名を<<>>で括り、<<ラベル>>のようにしなければなりません。

オブジェクトのプロパティーも参照できます。例えば、円柱(Cylinder)の高さ(Height)は、Cylinder.Heightあるいは<<Cylinderのラベル>>.Heightで参照できます。

オブジェクトの参照の詳細については、CADデーターの参照を参照してください。

Top

定義済み定数

以下が定義済みの定数です。

定数 説明
e ネイピア数(自然対数の底)
pi 円周率(π)

Top

演算子

以下の演算子を使えます。

演算子 説明
+ 加算
- 減算
* 乗算
/ 浮動小数点の除算
% 剰余
^ べき算(指数)

Top

関数

数学関数

以下の数学関数を使えます。

三角関数

三角関数はデフォルトで度を単位として使います。もしラジアンを使いたい場合は、最初の引数の後にradを続けてください。例えば、cos(45)cos(pi rad / 4)は同じです。数式が度であることを表すには、例えば360deg - atan2(3; 4) or 360° - atan2(3; 4)のように、degまたは°をつけてください。もし数式が無次元数で、度またはラジアンに変換したい場合は、例えば(360 - X) * 1deg(360 - X) * 1°(0.5 + pi / 2) * 1radのように、1deg、あるいは1radを乗じてください。

関数 説明 入力の定義域
acos(x) 逆余弦(arccosine) -1 <= x <= 1
asin(x) 逆正弦(arcsine) -1 <= x <= 1
atan(x) 逆正接(arctangent)、-90° < 返り値 < 90° すべて
atan2(y; x) y/x逆正接(arctangent)、象限によって-180° < 返り値 <= 180° すべて、ただし無効入力である x = y = 0 の場合は0を返す
cos(x) 余弦(cos) すべて
cosh(x) 双曲線余弦関数(cosh) すべて
sin(x) 正弦(sin) すべて
sinh(x) 双曲線正弦(sinh) すべて
tan(x) 正接(tan) all, except x = n*90 with n = odd integer
tanh(x) 双曲線正接(tanh) すべて
hypot(x; y) ピタゴラス和(訳注:関数名は斜辺(hypotensue)から)、例えば hypot(4; 3) = 5 x >=0 かつ y >= 0
cath(x; y) 直角三角形の斜辺と一辺が与えられたとき、残る一辺を返す。例えば cath(5; 3) = 4 x >= y >= 0

指数関数・対数関数

関数 説明 入力の定義域
exp(x) 指数関数 すべて
log(x) 自然対数(eを底とする対数) x > 0
log10(x) 常用対数(10を底とする対数) x > 0
pow(x; y) べき乗 すべて
sqrt(x) 平方根 x >= 0
cbrt(x) introduced in 0.21 立方根 すべて

端数処理関数・剰余関数

関数 説明 入力の値域
abs(x) 絶対値 すべて
ceil(x) 切り上げ、xと同じかそれよりも大きい最小の整数 すべて
floor(x) 切り捨て、xと同じかそれよりも小さい最大の整数 すべて
mod(x; y) 剰余、xをyで割ったときの余り。結果の符号は、被除数(x)の符号と一致。 y = 0 以外
round(x) 四捨五入、もっとも近い整数。 すべて
trunc(x) 0への丸め、0の方向にも最も近い整数。 すべて

Top

統計関数・集約関数

集約関数は1または複数の引数を取ります。

集約関数の個々の引数には、セルのレンジ(範囲)を指定することができます。セルのレンジは、2つのセルを:でつなげたもので、例えばaverage(B1:B8)sum(A1:A4; B1:B4)という形をしています。 average(StartTemp:EndTemp)のように、セルの参照は別名でも可能です。

以下の集約関数を使うことができます。

関数 説明 入力の定義域
average(a; b; c; ...) 引数の値の平均、sum(a; b; c; ...) / count(a; b; c; ...) と同じ。 すべて
count(a; b; c; ...) 計数、すなわち引数の個数。セルのレンジとともに使われることが多い。 すべて
max(a; b; c; ...) 引数の中の最大値 すべて
min(a; b; c; ...) 引数の中の最小値 すべて
stddev(a; b; c; ...) 引数の標準偏差 すべて
sum(a; b; c; ...) 引数すべての合計。セルのレンジとともに使われることが多い。 すべて

Top

文字列操作

文字列の定義

数式中の文字列は、ラベルと同じように、<<>>で括る必要があります。

以下の例では、<<TEXT>>は文字列「TEXT」の意味です。

文字列の連結

文字列は「+」を使って連結することができます。

<<MY>> + <<TEXT>>は「MYTEXT」という文字列になります。

文字列への変換

数値はstr関数を使って文字列に変換できます。

str(Box.Length.Value)

文字列の整形

Pythonの(旧式の)%スタイル整形(フォーマッティング)をサポートしています。

すべての%指定子は、Pythonドキュメンテーションに定義されています。

例として、「Box」という名前の、一辺が10mmの立方体があるとします。式<<Cube length : %s>> % Box.Lengthは「Cube length : 10.0 mm」になります。

一つ以上の%指定子を使う場合、次のようにしてください:<<Cube length is %s and width is %s>> % tuple(Box.Length; Box.Width)。あるいは連結を使ってください:<<Cube length is %s>> % Box.Length + << and width is %s>> % Box.Width。どちらも、「Cube length is 10.0 mm and width is 10.0 mm」になります。

文字列の整形を使ったFreeCADのサンプルファイルがフォーラムにあります。

Top

オブジェクト生成関数

以下のオブジェクトは、数式の中で下記の関数を使って生成することが可能です。

関数 説明
Tuple tuple(a; b; ...) 例:tuple(2; 1; 2)
List list(a; b; ...) 例:list(2; 1; 2)
Vector vector(x; y; z) 3つの無次元数または長さの単位を持つ数でベクトルを生成する。

例:vector(2; 1; 3)

create(<<vector>>; x; y; z)
Matrix
matrix(
  a11; a12; a13; a14;
  a21; a22; a23; a24;
  a31; a32; a33; a34;
  a41; a42; a43; a44
)
4行4列の行列を行優先順で作成:

matrix(1)のように引数を1つだけ与えることもできます。これは恒等行列(訳注:((1,0,0,0)(0,1,0,0)(0,0,1,0)(0,0,0,1)))を作成します。

例: matrix(1; 2; 3; 4; 5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16)

create(<<matrix>>; a11; a12; ...; a44)
Rotation

(回転)

rotation(axis; angle) Rotationを、その軸axisベクトル)と角度angle角度の単位または無次元数)、あるいは3つのオイラー角αβγを与えて生成。

例:

  • rotation(vector(0; 1; 0); 45)
  • create(<<rotation>>; 30; 30; 30)
rotation(α; β; γ)
create(<<rotation>>; axis; angle)
create(<<rotation>>; α; β; γ)
Placement

(配置 = 位置 + 回転)

placement(base; rotation) Placementを、以下のようなパラメターから生成します。
  • base: ベース位置(Vector
  • center: 中心位置(Vector
  • rotation: Rotation
  • axis: Rotation(回転)軸(Vector
  • angle: Rotation(回転)角(無次元数または角度の単位付きの値)
  • matrix: Matrix

例:

  • placement(vector(2; 1; 3); rotation(vector(0; 0; 1); 45))
  • create(<<placement>>; create(<<vector>>; 2; 1; 2); create(<<rotation>>; create(<<vector>>; 0; 1; 0); 45))
placement(base; rotation; center)
placement(base; axis; angle)
placement(matrix)
create(<<placement>>; ...)

Top

ベクトル関数

以下のベクトル関数introduced in 1.0を使えます。

関数・演算子 説明
v1 + v2 2つのベクトルの加算。
v1 - v2 2つのベクトルの減産。
v * s ベクトルをs倍一様に拡大縮小する。
vangle(v1; v2) 2つのベクトルの間の角度(度)。
vcross(v1; v2) 2つのベクトルの外積
v1 * v2 2つのベクトルの内積
vdot(v1; v2)
vlinedist(v1; v2; v3) ベクトルv1(で表される点)と、ベクトルv2(で表される点)を通り方向がベクトルv3である直線との距離を求める。
vlinesegdist(v1; v2; v3) ベクトルv1(で表される点)と、ベクトルv2(で表される点)とベクトルv3(で表される点)を結んだ線分上の最も近い点との距離を求める。
vlineproj(v1; v2; v3) ベクトルv1(で表される点)を、ベクトルv2(で表される点)を通り向きがベクトルv3である直線に投影する(訳注:直線上v1に最も近い点を求める)。
vnormalize(v) ベクトルを単位ベクトル(長さ1のベクトル)に正規化する。
vplanedist(v1) ベクトルv1(で表される点)と、ベクトルv2で表される点を通り法線の方向がベクトルv3である平面との距離を求める。
vplaneproj(v1) ベクトルv1(で表される点)を、ベクトルv2で表される点を通り法線の方向がベクトルv3である平面に投影する(訳注:平面上v1に最も近い点を求める)。
vscale(v; sx; sy; sz) x軸方向へsx倍、y軸方向へsy倍、z軸方向へsz倍拡大縮小する。
vscalex(v; sx)
vscaley(v; sy)
vscalez(v; sz)

Top

行列関数

RotationPlacementMatrix(行列)として表現できます。以下の関数は、すべてMatrixRotation、またはPlacementを最初の引数に取ります。この最初の引数を、以下ではmと表しています。返されるオブジェクトの型は、最初の引数として渡されたオブジェクトの型と同じですが、例外として、Rotationに対してmtranslateを使用した場合はPlacementが返されます。

関数 説明
minvert(m) 逆行列を計算。
mrotate(m; rotation) 下記のいずれかで回転
  • Rotation
  • 軸(Vector)と角度(Angle 単位付きまたは無次元数)
  • 3つのオイラー角 αβγ
mrotate(m; axis; angle)
mrotate(m; α; β; γ)
mrotatex(m; angle) x軸回りの回転
mrotatey(m; angle) y軸回りの回転
mrotatez(m; angle) z軸回りの回転
mtranslate(m; vector) vector (Vector) またはX、Y、Z値に基づく平行移動Rotationを平行移動すると、返り値はPlacementになる。
mtranslate(m; x; y; z)
mscale(m; vector) vector (Vector) またはX、Y、Z値に基づく拡大縮小
mscale(m; x; y; z)

Top

条件式

条件式は条件 ? 真の場合の結果 : 偽の場合の結果という形式です。条件部分も数式で定義します。0は偽、0以外は真と解釈します。

ブール型プロパティを条件の式に入れる場合、VarSet.MyBool == 1 ? 10 mm : 15 mmのように書く必要があることに注意してください。

以下の関係演算子が定義されています。

演算子 説明
== 等しい
!= 等しくない
> 大きい
< 小さい
>= 以上
<= 以下

Top

単位

単位は数式中に直接書くことができます。数式パーザーは、直前の値に単位を与えます。例えば、2mm2 mmは正しい数式ですが、mmは単位の前に値がないので正しくありません。

すべての値は単位を持っていなければいけません。したがって、一般的にはスプレッドシートに値を書くときは単位も指定すべきです。
単位を指定しなくても動く場合もあります。例えば、スプレッドシートのセルB1に無次元数1.5があったとして、押し出しの高さとしてそれを参照する場合です。この場合、押し出しの高さは単位mmが事前に定義されているので、単位がない場合それが使われて動きます。しかし、例えばSketch1.Constraints.Width - Spreadsheet.B1を押し出しの高さに使うと失敗します。Sketch1.Constraints.Widthは単位を持っているのに対してSpreadsheet.B1は無次元数だからです。

単位のべき乗は直接入力できます。例えば、mm^3 はmm³、m^3はm³として解釈されます。

もし変数の名前が単位と同じ場合、誤って単位と解釈されないように、変数名を<< >>で括る必要があります。たとえば、寸法を表すSketch.Constraints.Aがあった場合、電流のアンペア(A)に誤認されないよう、Sketch.Constraints.<<A>>と書かなければなりません。

数式パーザーは、以下を単位として認識します。

物質量

単位 説明
mmol Milliミリ・モル
mol モル

角度

単位 説明
° 度(°) 単位degの別名
deg 度(°) 単位°の別名
rad ラジアン
gon グラジアン
M 角度の分(1/60度) 単位 ′ の別名
角度の分(1/60度) これはプライム記号(U+2032)で単位Mの別名。
S 角度の秒(1/3600度) 動作しない。単位 ″ の別名。
角度の秒(1/3600度) これはダブル・プライム記号(U+2033)で単位 Sの別名。

電流

単位 説明
mA ミリアンペア
A アンペア
kA キロアンペア
MA メガアンペア

静電容量

単位 説明
pF ピコファラッド
nF ナノファラッド
uF マイクロファラッド 単位µFの別名
µF マイクロファラッド 単位uFの別名
mF ミリファラッド
F ファラッド 1 F = 1 s4·A2/m2/kg

電荷

単位 説明
C クーロン 1 C = 1 A*s

コンダクタンス

単位 説明
uS マイクロジーメンス 単位µSの別名
µS マイクロジーメンス 単位uSの別名
mS ミリジーメンス
S ジーメンス 1 S = 1 s3·A2/kg/m2
kS キロジーメンス
MS メガジーメンス

インダクタンス

単位 説明
nH ナノヘンリー
uH マイクロヘンリー 単位µHの別名
µH マイクロヘンリー 単位uHの別名
mH ミリヘンリー
H ヘンリー 1 H = 1 kg·m2/s2/A2

電圧

単位 説明
mV ミリボルト
V ボルト
kV キロボルト

電気抵抗

単位 説明
Ohm オーム(Ω) 1Ω = 1 kg·m2/s3/A2
kOhm キロオーム(Ω)
MOhm メガオーム(Ω)

エネルギー・仕事

単位 説明
mJ ミリジュール(J)
J ジュール(J)
kJ キロジュール(J)
eV 電子ボルト(eV) 1 eV = 1.602176634e-19 J
keV キロ電子ボルト(eV)
MeV メガ電子ボルト(eV)
kWh キロワット時 1 kWh = 3.6e6 J
Ws ワット秒 単位Jの別名
VAs VA秒 単位Jの別名
CV クーロン・ボルト 単位Jの別名
cal カロリー(cal) 1 cal = 4.184 J
kcal キロカロリー(cal)

単位 説明
mN ミリニュートン(N)
N ニュートン(N)
kN キロニュートン(N)
MN メガニュートン(N)
lbf Pound of force

長さ

単位 説明
nm ナノ(10-9メートル
um マイクロ(10-6メートル 単位 µmの別名
µm マイクロ(10-6メートル 単位 um の別名
mm ミリ(10-3メートル
cm センチ(10-2メートル
dm デシ(10-1メートル
m メートル
km キロ(103メートルmeter
mil 1/1000インチ 単位 thou の別名
thou 1/1000インチ 単位 mil の別名
in インチ 単位 " の別名
" インチ 単位 in の別名
ft フィート 単位 ' の別名
' フィート 単位 ft の別名
yd ヤード
mi マイル

光度

単位 説明
cd カンデラ

磁束

単位 説明
Wb ウェーバー 1 Wb = 1 kg*m2/s2/A

磁束密度

単位 説明
G ガウス 1 G = 10-4 T
T テスラ 1 T = 1 kg/s2/A

質量

単位 説明
ug マイクログラム 単位µgの別名
µg マイクログラム 単位ugの別名
mg ミリグラム
g グラム
kg キロ(103グラム
t トン
oz Ounce
lb Pound; alternative to the unit lbm
lbm Pound; alternative to the unit lb
st Stone
cwt Hundredweight

仕事率

単位 説明
W ワット
kW キロワット

圧力

単位 説明
Pa パスカル
kPa キロパスカル
MPa メガパスカル
GPa ギガパスカル
uTorr マイクロトル。単位µTorrの別名。
µTorr マイクロトル。単位uTorrの別名
mTorr ミリトル
Torr トル。1 Torr = 101325/760 Pa
psi Pound-force per square inch; 1 psi = 6.895 kPa
ksi Kilopound-force per square inch

温度

単位 説明
uK マイクロケルビン。単位 µK の別名
µK マイクロケルビン。単位 uK の別名
mK ミリケルビン
K ケルビン

時間

単位 説明
s
min
h
Hz ヘルツ s-1
kHz キロヘルツ
MHz メガヘルツ
GHz ギガヘルツ
THz テラヘルツ

容積

単位 説明
ml ミリリットル
l リットル
cft Cubicfoot

その他のヤード・ポンド法の単位

単位 説明
mph マイル毎時
sqft 平方フィート

サポート外の単位

以下は、よく使われるが現時点ではサポートされない単位です。代替も提示しています。

単位 説明 代替
°C セルシウス温度 [°C] + 273.15 K
°F Fahrenheit; ([°F] + 459.67) × ​5/9
u 統一原子質量単位。単位Daの別名。 1.66053906660e-27 kg
Da ダルトン。単位uの別名。 1.66053906660e-27 kg
sr Steradian 直接的な代替はない
lm ルーメン 直接的な代替はない
lx ルクス 直接的な代替はない
px ピクセル 直接的な代替はないy

Top

使えない文字や名前

数式は非常に強力である反面、いくつかの文字の使用に制約があります。これに対応するため、FreeCADではオブジェクトの名前よりもラベルを使用することを推奨しています。ラベルには、ほとんどすべての特殊文字を使えます。

ラベルを使えない局面、例えばスケッチの拘束条件の名前などでは、使えない文字について注意する必要があります。

ラベル

ラベルでは、使えない文字はないですが、いくつかの文字はエスケープする必要があります。

文字 説明
', \, " これらの文字の前には\をつけてエスケープする必要があります。

例えば、Sketch\002というラベルを参照するには<<Sketch\\002>>と表記する必要があります。

名前

寸法、スケッチといったオブジェクトの名前に、以下の文字を含めると不正な名前になってしまう。

文字 / 文字列 説明
+, -, *, /, ^, _, <, >, (, ), {, }, [, ], ., ,, = 演算子や数式の構成要素に使われる文字
A, kA, mA, MA, J, K, ' , ft , °, その他 単位に使われる文字列(詳細は単位を参照)
#, !, ?, §, $, %, &, :, ;, \, |, ~, , ¿, その他 特別な操作や意味をもつ文字
pi, e 数学定数
´, `, ' , " アクセント文字
空白 空白は名前の終わりを意味しているため、名前の一部には含められません

例えば次の名前は正しい名前である:<<Sketch>>.Constraints.T2üßµ@。次の名前は不正な名前である: <<Sketch>>.Constraints.test\result_2 (\rは「復回」の意味にある)、<<Sketch>>.Constraints.mol(molは単位である)。

短い名前(特に1文字、2文字の名前)は不正な名前になりやすいので、長い名前をつけるなど、適切な命名規則を採用することを検討してください。

セルの別名

スプレッドシートのSetAliasを参照してください。

Top

CADデーターの参照

数式の中から、モデル自身のデーターを参照することができます。プロパティーを参照するには、object_name.propertyまたは<<object_label>>.propertyと記述してください。ラベルは<<>>で括る必要があります。ラベルを使う場合、ラベルはユニーク(別のものに同じラベルを与えない)である必要があります。

以下の例はすべてオブジェクトを名前で参照しています、常にラベルを使うことも可能です。

もしプロパティーが複合フィールドの場合、個々のフィールドはobject_name.property.fieldで参照することができます。

リストを参照するには、object_name.list[list_index]としてください。スケッチの拘束条件を参照するには、Sketch.Constraints[16]のようにしてください。同じスケッチ内であれば、名前を省略してConstraints[16]で参照できます。インデックス(添字)は0から始まることに注意してください。したがって、Constraint17はConstraints[16]で参照できます。

オブジェクト自身を参照するには、_self擬プロパティーを使って、object_name._selfのようにしてください。

以下のテーブルに、いくつか例を示します。

CADデーター 数式での参照 結果
Part Boxの長さ Box.Length 長さ(mm)
Boxの体積 Box.Shape.Volume mm³単位の体積(単位はなし)
Boxの形状タイプ Box.Shape.ShapeType 文字列「Solid」
Boxのラベル Box.Label 文字列「Label」
Boxの質量中心のx座標 Box.Shape.CenterOfMass.x mm単位のx座標(単位はなし)
Box位置のx座標 Box.Placement.Base.x x座標(mm)
Box位置の回転軸のx座標成分 Box.Placement.Rotation.Axis.x 単位ベクトルのmm単位のx座標成分(単位なし)
Box位置の回転角 Box.Placement.Rotation.Angle 回転角(deg)
Boxオブジェクト全体 Box._self <Part::PartFeature>型のオブジェクト
スケッチの拘束条件の値 Constraints.Width もし式がスケッチの中で使われた場合、同じスケッチの中の名前がWidthという拘束条件の値
スケッチの拘束条件の値 MySketch.Constraints.Width もし式がスケッチの外で使われた場合、MySketchの中の名前がWidthという拘束条件の値
スプレッドシート別名の値 Spreadsheet.Depth Spreadsheetという名前のスプレッドシートのDepthという名前の別名の値
ローカルなプロパティーの値 Length ある(たとえば押し出し)オブジェクトのデータLengthという名前のプロパティーの値。同じオブジェクトの別のプロパティー(例えばデータLength2)の数式から呼び出す場合。

循環参照

FreeCAD は、依存関係をプロパティではなくオブジェクト間の関係に基づいてチェックします。したがって、あるオブジェクトにデータを提供し、その同じオブジェクトから結果を取得することはできないことを意味します。プロパティ自体に循環依存が存在しない場合でも、スプレッドシートから寸法を取得するオブジェクトを作成し、そのオブジェクトの体積を同じスプレッドシートに表示することはできません。この場合、モデルを制御するスプレッドシートと、結果を報告するスプレッドシートの2つを使用する必要があります。

回避策として、セルバインディングを使用し、バインディングの依存関係を非表示オプションを有効にすることで、2つ目のスプレッドシートのセル範囲を1つ目のスプレッドシートに(またはその逆に)表示することが可能です。

循環依存関係を回避する別の方法として、個々の式でhrefhiddenref関数を使用して参照を非表示にする方法があります。例えば、href(Box.Length)のように記述します。

なお、これらの回避策はいずれも慎重に使用する必要があります。報告されるプロパティが同じスプレッドシート内の寸法に基づいている場合、これらの方法は機能しないことに注意してください。

Top

ドキュメント全体からアクセス可能なグローバル変数

現時点では、FreeCADにはグローバル変数はありません。変わりに、このような変数をスプレッドシート・ワークベンチを使ったスプレッドシートのセルとして定義できます。そのセルに(セル上を右クリックして)別名を与えます。この別名は、おコアのオブジェクトのプロパティーと同じように、ドキュメント中のすべての数式から参照可能です。

Top

ドキュメントをまたがった参照

あるドキュメント中のオブジェクトのプロパティーを、数式から別のドキュメント(".FCstd" file)中のオブジェクトのプロパティーを参照して定義するのは、(制約はあるが)可能である。例えば、あるファイル中のスプレッドシートのセルやPart直方体のデータLength、といったものを定義するために、別のファイル中のオブジェクトの位置のx座標の値やその他のプロパティーの値を数式から参照して使うことができます。

ドキュメントは、ファイル名で参照できます。初めてセーブするときは、デフォルトの「Unnamed1」のようなものとは違う名前をファイル名として指定すると思います。マスタードキュメントの名前がセーブの時に変わってしまってリンクが破損するのを防ぐために、まず最初にマスターファイルを作成し、スプレッドシートを作成し、まずセーブするようにしてください。その後で、ファイルの中身やスプレッドシートを編集してもいいのですが、ファイル名は変えないようにしてください。

一旦スプレッドシートを含むマスタードキュメントを作成し、名前をつけて保存すれば、それを参照するドキュメントは安全に作れます。例えば、マスタードキュメントの名前がmasterで、その中のスプレッドシートがmodelConstants、セルの別名がLengthだったとします。この値は次のようにして参照できます。

master#modelConstants.Length

それを参照するドキュメントから値を取得できるよう、マスタードキュメントを開いておく(ロードしておく)必要があることに注意してください。

何かを修正したい時に、後でそれを参照するドキュメントを読み込むかどうかはあなた次第です(訳注:マスタードキュメントを変更するだけでは、それを参照する子ドキュメントが自動的に更新されることはありません)。

Top

既知の問題・残課題

Top

スクリプトからの利用

import FreeCAD as App

doc = App.ActiveDocument
box = doc.addObject("Part::Box", "Box")
cyl = doc.addObject("Part::Cylinder", "Cylinder")
cyl_name = cyl.Name

box.setExpression("Height", f"{cyl_name}.Height / 2")
box.setExpression("Length", f"{cyl_name}.Radius * 2")
box.setExpression("Width", "Length")

doc.recompute()

# Expressions are stored in the ExpressionEngine property:
for prop, exp in box.ExpressionEngine:
    val = getattr(box, prop)
    print(f"Property: '{prop}' -- Expression: '{exp}' -- Current value: {val}")

Top