ラベル IF の投稿を表示しています。 すべての投稿を表示
ラベル IF の投稿を表示しています。 すべての投稿を表示

2018年8月25日土曜日

if文

条件文ifの構文

ファミリのパラメータには条件文を組み込むことができます。構文は

=if(条件,条件が真の場合の値,条件が偽の場合の値)

です。

【条件は数字しか判断できない】

条件には他のパラメータの値を用いることができますが、その真偽の判断が可能なのは数字のみで、文字は判断できません。たとえば「文字列が一致する」などの判断はできません。

例1
パラメータ名 パラメータタイプ
paramA           文字
paramB           文字

=if(paramA=paramB,…,…)

条件式に用いることができるパラメータタイプは、
  • 数値
  • パラメータタイプが数値のパラメータ名
  • パラメータタイプがはい/いいえのパラメータ名
です。

【異なるタイプを比較するには?】

例2
パラメータ名 パラメータタイプ
paramA           長さ
paramB           実数

=if(paramA=paramB,…,…)


パラメータタイプが異なる場合は直接比較することはできません。そう、Revitは単位にうるさいのです。こういうときは「魔法の/1」を使って
=if(paramA / 1 = paramB, …,…)
とすればOKです。

【以上・以下の判断】

大きい小さいを比較する演算子は>,<,=のみであり、>=や<=を用いることはできません。これは「未満ではない」という理屈でnotを使って条件式を作ります。notは真偽の値を反転します。

例3
パラメータ名 パラメータタイプ
paramA           長さ
paramB           長さ



paramAがparamB以上である
=if(paramA >= paramB, …, …)
=if(not(paramA < paramB), …, …)

【値の差が±1.0に納まっている】

値が±○○以内にあることを判断するには絶対値absを使います。

例4
パラメータ名 パラメータタイプ
paramA           長さ
paramB           長さ



paramA-paramBが±1未満である
=if(abs(paramA - paramB) < 1 , …, …)

paramA-paramBが±1以内(1より大きくない)である
=if(not(abs(paramA - paramB) > 1 ), …, …)

【○○より大きく○○より小さい】

値がある範囲に収まっているかどうかを判断するにはandを使って二つの式を結合します。
andの構文  and(式1,式2)
式1と式2がともに真ならば、真を返します。つまり両方成り立っている場合だけ真を返します。

例5
パラメータ名 パラメータタイプ
paramA           長さ

paramAが1より大きく10より小さい場合


=if(and(paramA>1, paramA<10) , …, …)

paramAが1以上10以下の場合


=if(and(not(paramA < 1), not(paramA > 10)),…, …)

paramAが1以上10未満の場合


=if(and(not(paramA < 1), paramA < 10),…, …)

【条件式をはい/いいえのパラメータが受け取るとき】

条件式を「はい/いいえ」のパラメータが受け取る場合はifは不要です。

例6
パラメータ名 パラメータタイプ
paramA           長さ
paramB           はい/いいえ

paramAが10より小さいとき

paramB = paramA<10

【範囲外】

ある範囲に値がないことを判断するにはORを使います。
orの構文  or(式1, 式2)
式1または式2のどちらかが真であれば真を返します。つまりどちらかが成り立っていればよい、ということです。
例7
パラメータ名 パラメータタイプ
paramA           長さ

paramAが0未満、または10より大きい
=if(or(paramA<0, paramA>10) , …, …)
paramAが0以下、または10以上
=if(or(not(paramA>0), not(paramA<10)) , …, …)

【二つ以上の式を判断する】

andとorは引数として式を2しか受け取ることができませんが、使い方を工夫すれば3つ以上の条件を判断することができます。
考え方のポイントは

  • ☑真=1(0でない整数)
  • □偽=0
  • andは掛け算(式1×式2)----一つでも0があれば答えは0=偽
  • orは足し算(式1+式2)-----一つでも1があれば答えは0ではない=真

とすればわかりやすいと思います。

すべての式が成り立っていることを判断するには
and(and(式1,式2),式3)
                         --------(式1×式2)×式3
and(and(式1, 式2), and(式3, 式4))
                         --------(式1×式2)×(式3×式4)
一つでも偽=0があれば答えは0=偽です。

どれかが成り立っていることを判断するには
or(or(式1,式2),式3)
                         --------(式1+式2)+式3
or(or(式1, 式2), or(式3, 式4))
                         --------(式1+式2)+(式3+式4)
一つでも真=1があれば答えは0ではない=真です。

2017年5月27日土曜日

条件式を使ったファミリ

条件式 IF

前回のファミリを引き続き題材にします。下の図を見てみると、面取距離(A)の値は取りうる値に制限があることがわかります。0より大きくないといけないし、またX、Yの値の半分より小さくないと押し出しフォームを作ることができません。
前回の面取りファミリ
まとめますと
  • 条件1: 面取距離>0
  • 条件2: 面取距離<0.5*X かつ  面取距離<0.5*Y
面取距離=面取長*sin(45°)ですから、二つの条件は
  • 条件1:面取長*sin(45°)>0
  • 条件2:面取長*sin(45°)<0.5*X かつ 面取長*sin(45°)<0.5*Y
となります。この二つの条件をすべて満たしたとき、Aの値を受け入れるようにしてみましょう。
条件式は if 文を使います。書式は

if(条件式, TRUEの場合の値, FALSEの場合の値)


となります。条件式は数字の判断が使えますが、文字列の判断は使えません。

入力用のパラメータを追加

ファミリを開いて、面取りの長さを入力するためのパラメータを追加します。

  1. 作成タブ>プロパティパネル>ファミリタイプ
  2. 新しいタイプ ボタンをクリック
  3. 名前を「面取長」とし、パラメータタイプを「長さ」、パラメータグループを「寸法」としOK
    パラメータ「面取長」を追加

条件を追加

条件1と条件2を評価するためのパラメータを追加します。

  1. 作成タブ>プロパティパネル>ファミリタイプ
  2. 新しいタイプボタンをクリック
  3. 名前を「条件1」としてパラメータタイプを「はい/いいえ」、パラメータグループを「その他」
  4. 同様に、「条件2」を追加
  5. 条件1の式を「面取長 * sin(45) > 0」
  6. 条件2の式を「and(面取長 * sin(45°) < 0.5 * X, 面取長 * sin(45°) < 0.5 * Y)」
    条件1と条件2を追加して式を設定する
    条件2の式は「面取長 * sin(45°) < 0.5 * X」, 「面取長 * sin(45°) < 0.5 * Y」の両方の式が満たされていればTRUE(☑)、そうでなければFALSE(□)を返します。

Lの値を制御する

Lの値をifを使った計算式で制御します。
  1. Lの計算式に「if(and(条件1, 条件2), 面取長, 0.1 * X)」と入力

これは 条件1と条件2がどちらもTRUEならば面取長にLの値をそうでなければXの0.1倍の値をLに設定する という意味です。なお、どちらかがTRUEの場合はandではなくorを使います。
Lの式を設定するとグレーになる

面取長の値をいろいろ変えて適用ボタンをおしてみてください。あまり大きな値を入力するとX*0.1の値になります。
安全なファミリ

これで安全な値しか入力できないようになります。