2026年3月29日日曜日

共有ファミリのネスト

共有ファミリをネストする

ファミリの中にファミリを入れる、入れ子にすることをファミリをネストする、と言いますが、 Revitの「共有ファミリ(Shared Family)」は、プロジェクト内で独立した要素として認識されるファミリのことです。この共有ファミリをファミリにネストすると何が起きるでしょうか?

共有ファミリとは、ファミリのプロパティ「共有」にチェックが入っているファミリのことです。

ファミリを共有に指定する

共有ファミリは親にネストされていてもプロジェクトでは独立した要素として扱われます。ここでは、

  • 窓ファミリの障子を共有ファミリにし、
  • そのファミリをパラメータ化したら、

プロジェクトで何が起こるか確認してみましょう。

次の窓のファミリは枠のファミリに、障子部分のファミリをネストしています。

窓枠ファミリに障子ファミリをネスト

そして、障子のファミリにはファミリパラメータ「障子1x1」が設定されています。

障子のファミリにはタイプパラメータが関連付けされている

このプロジェクトには障子ファミリがロードされていて・・・・

複数の障子ファミリが枠ファミリにロードされている=ネストされている

ファミリに関連付けされたパラメータ「障子1x1」を切り替えることで、障子をFIX窓や引違い窓に変更できるというわけです。

引違窓

FIX窓

枠ファミリにロード(ネスト)されている障子ファミリには、共有ファミリと非共有ファミリがロードされています。

共有ファミリと非共有ファミリがネストされている

プロジェクトにロードするとどうなるのか?

このファミリをプロジェクトにロードしてプロジェクトブラウザのファミリを確認すると、窓のファミリだけではなく、共有ファミリである「窓 障子 FIX」「窓 障子 引違い2枚」もファミリとしてロードされています。

一方、共有ではない「窓 障子 規定値」ファミリはプロジェクトブラウザには表示されていません。

プロジェクトで窓を選択してタイプパラメータを見ると、共有ファミリとファミリ自体が抱えている非共有ファミリを選択できます。また、プロジェクト内の他の窓ファミリはリストアップされていないことにも注意してください。


タイプはプロジェクトで増やせる!!

では、ファミリ「窓 障子 引違い 2枚」のタイプをプロジェクトで複製して新たに「非常用進入口」を増やしてみます。ファミリエディタを開く必要はありません。プロジェクトブラウザで窓 障子 引違い 2枚を右クリック>複製 で新たにタイプを増やすだけです。

窓を選択してタイプ編集をすると、パラメータ「障子1x1」に、プロジェクトで複製して作成した新しいタイプを選ぶことができます。ファミリエディタを開かなくても、プロジェクトで共有ファミリのタイプを増やせば、障子ファミリとして使用できます。

ファミリを開かなくても選択肢を増やせる

新しくロードした共有ファミリも使える!

では、別途作成した障子ファミリ(窓 障子 外倒し.rfa)をプロジェクトにロードしてみます。もちろん共有ファミリにチェックを入れておきます。

共有ファミリをプロジェクトにロードする
すると、この共有ファミリも窓枠ファミリの障子1x1の選択肢に表示され選ぶことができます。
プロジェクトに追加した共有ファミリが選択可能

拘束のルールさえ守っていれば、枠のファミリを開かなくても、プロジェクトに障子だけを追加すればネストのファミリを増やすことができます。これは共有ファミリがプロジェクトでは独立した要素として扱われるために起こる現象です。

共有ネストファミリはプロジェクトでは独立した要素として扱われる


2026年3月21日土曜日

Dynamo Player

Dynamo Player化するには?

前回作成した「3点を通る球体」をDynamo Playerで動くように改造します。必要なことは

  • 入出力ノードを指定する
  • DynamoPlayer用のフォルダを準備しグラフ(Dynamoのファイル)をコピーする

だけです。

入力ノード

今回の入力ノードは、エッジを選択する三つの""ノードと、半径を指定する"Number"ノードの合計4つです。

それぞれのノードを右クリックして"入力"を選びます。

ノードを右クリックして"入力"に✔

次のダイナモプレーヤー上に表示するプロンプト文字列を指定します。それぞれのノードを右クリックし"名前変更"を選択して、編集ダイアログボックスを表示します。プロンプト文字列を編集してENTERキーを押します。ENTERしないですぐ×(閉じる)ボタンを押すと反映されません。

ラベルをダブルクリックしても編集できる

Dynamoプレーヤ

Dynamoプレーヤ用のフォルダを用意します。そしてグラフ(Dynamoのファイル)をそのフォルダに保存して、Dynamoを閉じます。

Revitの管理タブ>ビジュアルプログラミングパネル>DynamoプレーヤをクリックしDynamoプレーヤを起動します。

先頭の"フォルダを選択"の右側にあるフォルダに+が付いた"フォルダを追加ボタン"をクリックし、作成したDynamoプレーヤ用のフォルダを指定します。

フォルダを追加ボタン

するとそのフォルダ内のグラフが一覧に表示されます。

再生ボタン(▶)をクリックすると、ユーザーに入力を促す項目が表示されます。

各項目を指定すると、最下部にある"実行"ボタンが有効になります。

グラフプロパティを設定する

動作が確認出来たら、グラフプロパティを設定しましょう。[戻る]ボタンでグラフの一覧に戻り、グラフの鉛筆アイコンをクリックして、Dynamoを開きます。
Dynamoで編集

[拡張機能]>[グラフプロパティを表示]をクリックし、説明、イメージ、作成者、詳細URLを編集します。
グラフプロパティを設定する
保存してDynamoを閉じ、プレーヤに反映されていることを確認します。
Dynamoプレーヤ
グラフをクリックすると、作成者とURLが表示されます。


出力について

3点と半径で球体を作るグラフは、結果出力は図形なので特に必要なかったのですが、結果をプレーヤ上に表示したい場合は最終結果を示すノードを右クリックして「出力」にチェックを入れます。
例えば、次のグラフは”選択した面の面積を求める”という簡単なものです。

最終出力は数字としての面積なので、最後のWatch(一つ手前のConvert By UnitsでもOK)を右クリックして"出力”にチェックを入れています。

これをプレーヤで実行すると、出力結果がプレーヤ上に表示されます。

2026年3月8日日曜日

3点を通る球体~Dynamo

回転球体法

避雷針の保護範囲を計測する方法として回転球体法(JIS Z 9290‑3)があります。様々なパターンがありますが、3つの避雷針で保護される範囲はそれぞれの先端に接する半径R(レベルによる)の下側ということになります。

このような「3点A,B,Cに接する半径Rの球」をDynamoで作成してみましょう。

3点に接する半径Rの球を作成するには?

幾何学的には案外単純

3点A,B,Cを通る半径Rの球体の中心点は、△ABCの外接円の中心を、面の法線方向に伸ばした線上にあります。幾何学的には割と単純な話ですがこれをDynamoで解くとなると一工夫必要です。

Dynamoの新規グラフを作成する

[管理]タブ>[ビジュアルプログラミング]パネル>[Dynamo]をクリックし[新規作成]を選択

プログラムの実行モードは[手動]に切り替えておきましょう。


Dynamoでは点が指定できない

現在のDynamoの仕様ではユーザーが指定した点を取得することはできません。そこで要素のエッジを選択してその両端のうちZの値が大きいほうを選ぶようにしてみます。以下はその部分を示すグラフです。

選択したエッジの両端のうちZが大きいほうを選ぶ

ここで使用しているノードは次の通りです。

  • SelectEdge : ユーザーにエッジを選択を促す
  • Curve.StartPoint/EndPoint : エッジの始点と終点
  • List.Create : エッジの始点と終点をリストにする
  • List.MaximumItemByKey : リストのうちPoint.Zの値が最大のアイテムを返す

これを複製して3つ追加します。

3点を選ぶために複写

この状態でSelectEdgeの選択ボタンを押して、3つの避雷針のエッジを選択しておきます。

半径を入力

半径を入力するのですが、入力自体はm単位で、計算は基本的にmmなのでメートルからミリに変換します。1000を掛ければいいのですが、今回は単位変換ノードを使用します。

半径を取得
ここで使用しているノードは次の通りです。

  • Number : 半径をユーザーが入力
  • Convert By Unit : メートルをミリメートルに変換

3点を通り半径Rの球体の中心点を求める

幾何学的には簡単、と申し上げましたがDynamoのノードだけでこれを行うのはなかなか大変です。そこでPythonスクリプトを使って求めることにします。

まず、Puthon Scriptノードを追加し+ボタンをおして、入力端子をIN[0]~[3]まで作成します。


次にノードを右クリックして[編集]を選択してエディタを開きます。そして既存のコードを削除して、以下を丸ごと張り付けてください。


# Python 標準ライブラリおよび DesignScript ライブラリをロード
# Dynamo Python Node
# IN[0]=p1, IN[1]=p2, IN[2]=p3 : Geometry.Point
# IN[3]=r : radius (same unit as points)
# OUT = c1 : Geometry.Point (higher Z)
import math
import clr
clr.AddReference('ProtoGeometry')
from Autodesk.DesignScript.Geometry import Point, Vector
# このノードへの入力は、リスト形式で IN 変数に格納されます。
p1 = IN[0]
p2 = IN[1]
p3 = IN[2]
r  = float(IN[3])
# この行の下にコードを配置します
def circumcenter(p1, p2, p3, eps=1e-12):
    a = Vector.ByTwoPoints(p1, p2)
    b = Vector.ByTwoPoints(p1, p3)
    n0 = a.Cross(b)
       
    if n0.Length < eps:
        raise Exception("3 points are nearly collinear")
      
    aLen2 = a.Dot(a)
    bLen2 = b.Dot(b)
    n0Len2 = n0.Dot(n0)
    term1 = b.Cross(n0).Scale(aLen2)
    term2 = n0.Cross(a).Scale(bLen2)
    c_vec = term1.Add(term2).Scale(1.0 / (2.0 * n0Len2))
    c = p1.Add(c_vec)
    n = n0.Normalized()
    return c, n
    
def sphere_center_z_higher(p1, p2, p3, r):
    
    c, n = circumcenter(p1, p2, p3)
    rho = c.DistanceTo(p1)
    if r < rho:
        raise Exception("r is smaller than circumradius")
    h = math.sqrt(r*r - rho*rho)
    cA = c.Add(n.Scale(h))
    cB = c.Add(n.Scale(-h))
    return cA if cA.Z >= cB.Z else cB
# 出力を OUT 変数に割り当てます。
OUT = sphere_center_z_higher(p1, p2, p3, r)


ここでは詳細な説明は省きますが、コピーするときは一度メモ帳などに貼り付けて書式を解除したうえで貼り付けてください。

球体の中心は三角形ABC(p1-p2-p3)の上側と下側の両方にあるので、ここでは上側の中心点のみをOUTのポートに返すようにしています。

[保存して実行]を押して閉じたらIN[0]~[2]に指定した3点を、IN[3]に半径を接続します。

Python Scriptノードに入力を接続

球体をダイレクトシェイプで作成

中心がわかったのでダイレクトシェイプを使って球体を作成します。まずはSOLIDで球体を作成し、それをもとにダイレクトシェイプを作成します。

ダイレクトシェイプの作成

ここで使用しているノードは

  • Sphere.ByCenterPointRadius : 中心点と半径で球体SOLIDを作成
  • DirectShape.ByGeometry : ジオメトリとカテゴリを指定してダイレクトシェイプを作成
  • Categories : カテゴリを選択


Sphere.ByCenterPointRadiusのcenterPonintに球体の中心点を、Radiusに半径を接続します。

中心点と半径を接続


これで実行してみましょう。球体の大きさが避雷針の互いの距離よりも短かければ球体が作成されるはずです。

3点を通る半径Rの球体

2026年3月1日日曜日

配管・ダクト・ケーブルラックの片寄せ

 位置合わせ=片寄せ

ダクト・配管・ケーブルラックなど片寄で配置したい場合は、「位置合わせ」の機能を活用します。隣り合う2つ以上のセグメントを上下左右中心の9か所を基準に片寄せ行うことができます。角ダクトを例に使い方を説明します。

サイズの異なるダクトの連結

位置合わせを行いたい、継手を介して連続したダクトセグメントを選択します。
連続したダクトセグメントを選択

修正|ダクトタブ>編集パネル>位置合わせ


位置合わせエディタタブが表示されます。


まず、制御点ボタンで位置合わせの基準となるセグメントを決定します。クリックするたびに各ダクトセグメントの始点と終点に矢印が現れます。始点でも終点でもどちらでも結果は同じなので、基準となるセグメント内に矢印が表示されるまで制御点をクリックします。
基準となるダクトセグメント内に矢印が表示されるまで制御点をクリック

次に、位置合わせパネルに表示されている9つの小さなボタンで決定します。
位置合わせの基準位置を指定


終了ボタンを押すと選択したダクトセグメントおよび継手の位置が"片寄せ"になります。
継手(レデューサ)の形状に注目!

3D表示で位置合わせパネルの"位置合わせ線分"を使えばより直感的に基準点を選択できます。制御点ボタンで基準のセグメントに矢印を表示します。
基準となるセグメントに矢印を表示

この状態で、位置合わせ線分をクリックすると、青い点線が上下左右中心の9か所に表示されます。
位置合わせの基準線が9本表示される

任意の基準線をクリックすることで位置合わせ基準を設定することができます。
基準位置を指定

終了ボタンを押すと、位置合わせが完了します。
位置合わせが完了

配管やケーブルラックにも同じように適用できます。
ケーブルラックの例

最初から位置合わせしておくには

最初から位置合わせをして描画することもできます。例えば「すべて下端を合わせ」などの場合です。ダクト・配管・ケーブルラックコマンドを起動し、配置ツールパネルの「位置合わせ」ボタンをクリックします。
位置合わせボタンをクリック

位置合わせ設定ダイアログボックスで、水平位置合わせや鉛直位置合わせを指定します。


OKをおして、配管・ダクト・ケーブルラックを描画すると、指定した位置合わせで描画できます。
下-中心合わせで作成された配管

片寄せ用に特別なレデューサを作成する必要はありません。標準的なレデューサ(継手)で片寄せ配置が可能です。