オブジェクトのプロパティーを数式で定義することが可能です。GUIでは、プロパティーを表す数値調整ボックスまたは入力フィールドを選択すると、青いアイコンが表示されます。アイコンをクリックするか等号記号=をキーボードから入力すると、そのプロパティーの数式エディターが開きます。もしインプットフィールドに青いアイコンではなく...ボタンが表示されている場合は、プロパティーを右クリックし、コンテキスト・メニューから数式...を選択すると数式エディターが開きます。
FreeCADにおける数式は、以下で説明する演算子、関数、定義済み定数を組み合わせた数式です。これらに加えて、他のオブジェクト・プロパティー(の値)を参照したり、条件式も使えます。数式における数値に単位を与えることも可能です。
数値の整数部分と小数部分を分けるには、コンマ,
または小数点.
のどちらも使えます。小数点(または小数コンマ)がある場合、少なくとも1桁以上の小数が必須です。したがって、1. + 2.
や1, + 2,
は正しい数式ではありませんが、1.0 + 2.0
や1,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データーの参照を参照してください。
以下が定義済みの定数です。
定数 | 説明 |
---|---|
e | ネイピア数(自然対数の底) |
pi | 円周率(π) |
以下の演算子を使えます。
演算子 | 説明 |
---|---|
+ | 加算 |
- | 減算 |
* | 乗算 |
/ | 浮動小数点の除算 |
% | 剰余 |
^ | べき算(指数) |
以下の数学関数を使えます。
三角関数はデフォルトで度を単位として使います。もしラジアンを使いたい場合は、最初の引数の後に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
、1°
、あるいは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の方向にも最も近い整数。 | すべて |
集約関数は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; ...)
|
引数すべての合計。セルのレンジとともに使われることが多い。 | すべて |
数式中の文字列は、ラベルと同じように、<<
と>>
で括る必要があります。
以下の例では、<<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のサンプルファイルがフォーラムにあります。
以下のオブジェクトは、数式の中で下記の関数を使って生成することが可能です。
型 | 関数 | 説明 |
---|---|---|
Tuple
|
tuple(a; b; ...)
|
例:tuple(2; 1; 2)
|
List
|
list(a; b; ...)
|
例:list(2; 1; 2)
|
Vector
|
vector(x; y; z)
|
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列の行列を行優先順で作成:
例: |
create(<<matrix>>; a11; a12; ...; a44)
| ||
Rotation
(回転) |
rotation(axis; angle)
|
Rotation を、その軸axis (ベクトル )と角度angle (角度 の単位または無次元数)、あるいは3つのオイラー角α 、β 、γ を与えて生成。
例:
|
rotation(α; β; γ)
| ||
create(<<rotation>>; axis; angle)
| ||
create(<<rotation>>; α; β; γ)
| ||
Placement
(配置 = 位置 + 回転) |
placement(base; rotation)
|
Placement を、以下のようなパラメターから生成します。
例:
|
placement(base; rotation; center)
| ||
placement(base; axis; angle)
| ||
placement(matrix)
| ||
create(<<placement>>; ...)
|
以下のベクトル関数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)
|
Rotation
とPlacement
はMatrix
(行列)として表現できます。以下の関数は、すべてMatrix
、Rotation
、またはPlacement
を最初の引数に取ります。この最初の引数を、以下ではm
と表しています。返されるオブジェクトの型は、最初の引数として渡されたオブジェクトの型と同じですが、例外として、Rotation
に対してmtranslate
を使用した場合はPlacement
が返されます。
関数 | 説明 |
---|---|
minvert(m)
|
逆行列を計算。 |
mrotate(m; rotation)
|
下記のいずれかで回転
|
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)
|
条件式は条件 ? 真の場合の結果 : 偽の場合の結果
という形式です。条件部分も数式で定義します。0
は偽、0以外は真と解釈します。
ブール型プロパティを条件の式に入れる場合、VarSet.MyBool == 1 ? 10 mm : 15 mm
のように書く必要があることに注意してください。
以下の関係演算子が定義されています。
演算子 | 説明 |
---|---|
== | 等しい |
!= | 等しくない |
> | 大きい |
< | 小さい |
>= | 以上 |
<= | 以下 |
単位は数式中に直接書くことができます。数式パーザーは、直前の値に単位を与えます。例えば、2mm
や2 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 |
数式は非常に強力である反面、いくつかの文字の使用に制約があります。これに対応するため、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を参照してください。
数式の中から、モデル自身のデーターを参照することができます。プロパティーを参照するには、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つ目のスプレッドシートに(またはその逆に)表示することが可能です。
循環依存関係を回避する別の方法として、個々の式でhref
やhiddenref
関数を使用して参照を非表示にする方法があります。例えば、href(Box.Length)
のように記述します。
なお、これらの回避策はいずれも慎重に使用する必要があります。報告されるプロパティが同じスプレッドシート内の寸法に基づいている場合、これらの方法は機能しないことに注意してください。
現時点では、FreeCADにはグローバル変数はありません。変わりに、このような変数をスプレッドシート・ワークベンチを使ったスプレッドシートのセルとして定義できます。そのセルに(セル上を右クリックして)別名を与えます。この別名は、おコアのオブジェクトのプロパティーと同じように、ドキュメント中のすべての数式から参照可能です。
あるドキュメント中のオブジェクトのプロパティーを、数式から別のドキュメント(".FCstd" file)中のオブジェクトのプロパティーを参照して定義するのは、(制約はあるが)可能である。例えば、あるファイル中のスプレッドシートのセルやPart直方体のデータLength、といったものを定義するために、別のファイル中のオブジェクトの位置のx座標の値やその他のプロパティーの値を数式から参照して使うことができます。
ドキュメントは、ファイル名で参照できます。初めてセーブするときは、デフォルトの「Unnamed1」のようなものとは違う名前をファイル名として指定すると思います。マスタードキュメントの名前がセーブの時に変わってしまってリンクが破損するのを防ぐために、まず最初にマスターファイルを作成し、スプレッドシートを作成し、まずセーブするようにしてください。その後で、ファイルの中身やスプレッドシートを編集してもいいのですが、ファイル名は変えないようにしてください。
一旦スプレッドシートを含むマスタードキュメントを作成し、名前をつけて保存すれば、それを参照するドキュメントは安全に作れます。例えば、マスタードキュメントの名前がmaster
で、その中のスプレッドシートがmodelConstants
、セルの別名がLength
だったとします。この値は次のようにして参照できます。
master#modelConstants.Length
それを参照するドキュメントから値を取得できるよう、マスタードキュメントを開いておく(ロードしておく)必要があることに注意してください。
何かを修正したい時に、後でそれを参照するドキュメントを読み込むかどうかはあなた次第です(訳注:マスタードキュメントを変更するだけでは、それを参照する子ドキュメントが自動的に更新されることはありません)。
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}")