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

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年1月17日土曜日

Dynamo - PanelSurface

Dynamo Primer 2 は学習に最適だが・・・

ダイナモの勉強には「ダイナモ入門」が最適です。 考え方を基礎から学べ、各項目にはステップバイステップの演習がついていて、サンプルのモデルやダイナモのグラフもダウンロードできます。

Dynamoの学習に最適

ただ、少々古い部分もあり、手が止まってしまうところもあります。例えば[Revit用のDynamo]>[カスタマイズ]の演習です。この中で[LunchBox for Dynamo」]をインストールするところがあります。しかし、LunchBox for Dynamoは現在、残念ながら開発が中止されており、過去のパッケージは現在のDynamo3.6では機能しません。

Lunch Box for Dynamoは開発中止に((+_+))

今回はこの部分をちょっと書き換えて、以後の演習が続けられるようにしてみます。

PanelSurface

2026年1月時点でのDynamoの最新バージョンは3.6です。Revit2026を使用して説明します。

現在のバージョン
このバージョンではGeometry>Panel Surfaceが追加されているので、これを使えばこの演習を進めることができます。

PanelSurface

演習のリライト

Geometry.PanelSurface.ByQuadノードをキャンバスに追加します。このノードのsurface入力に、パラメトリックサーフェスを接続します。IntegerSliderノードを追加し値を15に設定して、numU入力とnumV入力に接続します。boundaryCondition入力には特に何も接続しません。

PanelSurface.ByQuadsを追加

すると複数の長方形のパネルからなるサーフェスがDynamoのプレビューに表示されます。

Geometry.PanelSurface.GetPanelPointノードをキャンバスに追加します。ByQuadノードのPanelSurface出力を、panelSurface入力に接続します。出力が4点の組み合わせのリストになっていることを確認してください。これは長方形パネルの四隅の点を表す点のリストです。

PanelSurface.GetPanelPointsを追加

これから Revit 内の多数のジオメトリをインスタンス化するので、必ず事前に Dynamo のソルバを[手動]に切り替えてください。

Family Types ノードをキャンバスに追加し、[ROOF-PANEL-4PT]を選択します。

AdaptiveComponent.ByPoints ノードをキャンバスに追加し、その points 入力に PointSurface.GetPanelPointsノードの Point[]...[] 出力を接続します。familySymbol 入力に Family Types ノードを接続します。

AdaptiveComponent.ByPoints

[実行]をクリックします。

アダプティブコンポーネントが配置される

さあ、これで以降の演習を続けることができます。Dynamoの開発はどんどん進んでいますので、ブログをみて更新情報をチェックしておきましょう。

2022年4月9日土曜日

Dynamoで隣地斜線

面の要素

隣地斜線は敷地境界線の法線方向に傾いた「面」です。面の要素はRevitの要素で作成することはできませんが、Dynamoとダイレクトシェイプを利用することで作成することができます。隣地斜線を面の要素として作成してみましょう。

隣地斜線のモデルを作成する

動画のご案内

Dynamoの説明はなかなか文字と図では難しいので、動画を作成しました。AKNとYouTubeで公開していますのでご視聴ください。なお、法的な数値はあくまで参考として取り扱ってください。あくまでも考え方を説明した動画ととしてご視聴ください。


参考データ

ダイナモのグラフはこちらからダウンロードできます。



2021年1月17日日曜日

駐車場のライン

折れ曲がった面に白線を描く

前回は舗装に複雑な勾配を作成する方法をご紹介しました。駐車場で水勾配を考慮して舗装を作成すると、困ってしまうのが駐車スペースのライン引きです。駐車場ファミリを配置すると、面に対して浮いてしまったり、めり込んだりします。

駐車場ファミリが舗装にめり込んだ状態になる

今回はダイナモを使って、勾配面に対してきれいに駐車場ラインを作る方法をご紹介します。ダイナモの初心者でも十分に取り組める内容だと思います。

勾配成りにライン引き

YouTubeAKNで動画を公開しておりますので、ご視聴ください。



2019年9月29日日曜日

タイプ名の一覧をエクセルに出力するには?

ダイナモで簡単にできます!

現在のプロジェクトに設定されている壁タイプの一覧が必要になった場合、ダイナモを使えば簡単にその一覧を取得することができます。
もちろん壁タイプに限らず、床や屋根、構造フレームなどのファミリ名、配管タイプなど、様々な一覧をエクセルに出力することができます。

作り方


  1. [管理]タブ>[ビジュアルプログラミング]パネル>[Dynamo]
  2. 新規作成
  3. 左下の自動を手動に変更。
    自動→手動
  4. 次のノードを追加する。
    • [Revit]>[Selection]>[ElementTypes]
    • [Revit]>[Selection]>[All Elements of Type]
    • [Revit]>[Elements]>[Element]>[Name]
  5. 下の図のように接続する。
    三つのノードを接続
  6. 次のノードを追加する
    • [ImportExport]>[Data]>[ExportExcel]
    • [ImportExport]>[File System]>[File Path]で任意のファイル名を指定
    • [Input]>[Basic]>[String]、値を壁タイプ
    • [Input]>[Basic]>[Number]
    • [Input]>[Basic]>[Boolean]
  7. 下の図のように接続する
    ノードを接続
  8. 実行ボタンをクリックすると、エクセルが立ち上がって結果が表示される。
    壁タイプが出力される

例えば!~線種パターンの一覧

同じグラフを使って様々な要素タイプの名前を一覧出力できます。線種パターンを出力するには
  • [Element Types]にLinePatternElement
  • [String]に線種
    線種パターンを出力する
として実行ボタンを押すだけです。ほかにも様々な要素タイプがあるので試してみてください。

2019年2月9日土曜日

ダイナモ白熱教室~床の躯体天端レベルをタグに表示する

Dynamoでパラメータを操作する

躯体天端レベルをタグに表示するにはどうすればよいでしょうか?残念ながら床タグでは床レベルのパラメータはありませんし、ましてや躯体の天端レベルというパラメータはありません。「レベルからのオフセット」すらタグに表示できないのです。
躯体天端レベルをタグに表示するには?
「上部躯体の高さ」というパラメータが使用可能ですが、惜しいかなこの値は高さ(Z)の座標値で、レベルからの相対距離ではありません。
床の「上部躯体の高さ」はzの値でレベルからの相対距離ではない
APIを使えはもちろん可能ですが、この「床の躯体天端レベルをタグに表示する」というお題をダイナモで解いてみます。

共有パラメータの準備

タグに値を表示するのですから、まずは床に躯体天端レベルの値を表示するインスタンスパラメータを共有パラメータとして作成します。
共有パラメータを作成し、床のインスタンスパラメータとして設定する。
ここでは「スラブレベル」という共有パラメータを作成し、床のインスタンスプロパティとして設定しました。

Dynamo:構造の床を集める

まず、すべての床を集めます。ただし、床のインスタンスプロパティ「構造」にチェックが入っているものだけです。そうでないと「上部躯体の高さ」の値が「なし」になってしまうからです。


  1. [Revit]>[Selection]>[Categories]を追加し「床」を選択。
  2. [Revit]>[Selection]>[All Elements of Category]を追加し、1と接続。
  3. [Revit]>[Element]>[GetParameterValurByName]を追加し、2のElementsをElementに接続。
  4. [Input]>[Basic]>[String]を追加し「構造」と入力、3のParameterNameに接続。
  5. [Math]>[Operaters]>[==]を追加し、Xに4のvar[]..[]を接続。
  6. [Input]>[Basic]>[Number]を追加し、値を1とし、==のyに接続。(これによりパラメータの値の1/0をTrue/Falseに変換する)
  7. [List]>[Modify]>[FilterByBoolMask]を追加し、==のvar[]..[]とmaskを接続。
  8. 7のlistと2のElementsを接続。
これでFilterByBoolMaskの[in]に、パラメータ「構造」にチェックが入った床のインスタンスを集めることができました。

Dynamo:スラブレベルを計算する

スラブレベルを「上部躯体の高さ-床の参照レベルの高さ」で計算します。床のレベルの高さはまず床の参照レベルをパラメータでもとめ、さらにレベルの高さパラメータの値を取得します。
  1. [Revit]>[Element]>[GetParameterValurByName]を追加し、[in]と[element]を接続。
  2. [Input]>[Basic]>[String]を追加し「レベル」と入力、2のParameterNameに接続。
  3. [Revit]>[Element]>[GetParameterValurByName]を追加し、1のvar[]..[]と接続。
  4. [Input]>[Basic]>[String]を追加し「高さ」と入力、3のParameterNameに接続。これで床の参照レベルの高さを取得できました。
  5. [Revit]>[Element]>[GetParameterValurByName]を追加し、[in]と[element]を接続。
  6. [Input]>[Basic]>[String]を追加し「上部躯体の高さ」と入力、5のParameterNameに接続。
  7. [Math]>[Operators]>[-]を追加し、[x]には5(上部躯体の高さ)のvar[]..[]、[y]には3(レベルの高さ)を接続
ここでWatchノードなどで値を確認してください。

Dynamo:スラブレベルの値を床にセットする

最後に、求めたスラブレベルを床のインスタンスプロパティ「スラブレベル」にセットします。
スラブレベルの値を床にセットする
  1. [Revit]>[Element]>[SetParameterValurByName]を追加し、
    1. elementsを[List.FilterByBoolMask]の[in]へ接続。
    2. valueを[-]のvar[]..[]に接続
  2. [Input]>[Basic]>[String]を追加し「スラブレベル」と入力し、1のParameterNameに接続。
以上で床にスラブ(躯体)レベルを設定することができました。
スラブレベルの値が設定された
あとは、共有パラメータ「スラブレベル」を使った床タグを配置すればスラブレベルが表示されます。Dynamoを開いておけば、床の変更にリアルタイムに追随します。
モデルの変更にリアルタイムに追随する
躯体の天端なので、仕上があってもスラブレベルを表示します。
また、躯体境界よりも上にレイヤがあっても問題ありません。

仕上が入っても躯体レベルを表示する
このグラフはこちらからダウンロードできます

2018年9月24日月曜日

スラブのレベルごとに色分けする

パラメータの値で色分けするには?

躯体図や構造伏図でスラブをレベルごとに色分けできるとわかりやすいのですが、その方法としてはフィルタを使う方法があります。しかしながら、「レベル高さからのオフセット(2018)」の値を指定しなくてはいけないので、新しい値が発生するたびにフィルタを追加する必要があります。
ダイナモを使って、ダイナミックに色を更新してみましょう。
床のパラメータの値で色分けするには?

Dynamo:現在のビューに表示されている床を選択する




  1. [Revit]>[Views]>[View]>[All Elements In Active View]①
  2. [List]>[Modify]>[RemoveIfNot]②を追加し、①のelementsとlistを接続。
  3. [Input]>[Basic]>[String]を追加し、「Floor」と設定し、②のtypeに接続。
これで現在のビューに表示されている床をすべて選択できました。

Dynamo:パラメータの値を取り出す


  1. [Revit]>[Element]>[GetParameterValueByName]③を追加し、②のVar[]..[]とelementを接続。
  2. [Input]>[Basic]>[String]を追加し、「レベルからの高さオフセット」と設定し、③のparameterNameと接続。
パラメータの名前は各バージョンで異なりますので、床を選択してパラメータの名称を確認してください。

Dynamo:色範囲を設定する

取得した値を色に割り当てます。そのために割り当てる「色の範囲」を決めます。今回は一番低い値を赤、一番高い値を青色としてそのグラデーションを使ってパラメータの値を表現してみましょう。

  1. [Input]>[Basic]>[Number]①を二つ追加し、それぞれ「0」と[255]を入力。
  2. [Display]>[Color]>[ByARGB]②をつ追加。
  3. ①の255を②のrと接続し、g、bを①の0のノードと接続。これが赤です。
  4. [Display]>[Color]>[ByARGB]をもう一つ追加。
  5. bに255のノードを、他を0のノードと接続。これが青です。
  6. [List]>[Generate]>[List Create]を追加し、[+]をクリックしてItem1を追加。
  7. item0に赤、item1に青を接続
  8. [Display]>[Color Range]>[Color Range]を追加し、List Createのlistをcolorsに追加。
カラーが左から右に向かって赤から青へ色が変化していることを確認してください。エラーになりますが気にしないでください。

Dynamo:パラメータの値を0~1に再割り当てする


Color Rangeのvalueは0~1の値しか受け付けないので、取得したパラメータの値を0から1の値に再割り当てする必要があります。

  1. [Math]>[RemapRange]を追加し[Element.GetParameterValueByName]のvar[]..[]とnumberを接続。
  2. Input]>[Basic]>[Number]を二つ追加し、それぞれ「0」と[1]を入力。
  3. [RemapRang]のnewMinに0、newMaxに1を接続。
これで、パラメータの値が、0~1の値に再割り当てされます。

Dynamo:要素の色付け

現在のビューで要素を色付けしてみます。

  1. [Math.RemapRange]のlistを[Color Range]のvalue に接続。
  2. [Revit]>[Elements]>[Element]>[OverrideColorInView]を追加し、[Color Range]のcolorをcolorに接続。
  3. [List.RemoveIfNot]のvar[]..[]をelementに接続。
以上で、現在のビューにある床をレベルごとに色分けすることができました。

試しに、床の「レベルからのオフセット」の値を変更してみると・・・

色が自動的に再割り当てされることがわかります。これはもちろん3Dビュー(隠線処理・シェーディング・べた塗りのみ)でも有効です。

こちらのグラフを参考にしていろいろと試してみてください。