レベル・ファミリ名を指定した構造フレームの抽出について

レベル・ファミリ名を指定した構造フレームの抽出について

meme1
Explorer Explorer
1,400件の閲覧回数
6件の返信
メッセージ1/7

レベル・ファミリ名を指定した構造フレームの抽出について

meme1
Explorer
Explorer

Revit2021、Dynamo2.6.1でDynamo作成中です。

開いているRevitファイルの中に配置された構造フレームの要素について
「カテゴリ"構造フレーム"のレベル"1階"に配置されたファミリ名"XXX"の要素」という抽出をおこないたいです。

①カテゴリ
②ファミリ名
までは抽出できましたが、3つめの条件「レベル」を指定するためにどうやって書き換えたらいいのか分かっておりません。
ご存じの方いらっしゃいましたらご意見いただけますと幸いです。
よろしくお願いいたします。

0 件のいいね
解決済み
1,401件の閲覧回数
6件の返信
返信 (6)
メッセージ2/7

sbo_bimcim
Enthusiast
Enthusiast

レベルに限らず、各要素が持っているパラメータを使って抽出が可能です。

例として、カテゴリとレベルで抽出するグラフを作成してみました。

 

1点分からないことがありまして、

レベル同士を==ノードで比較したら、同一レベルでもfalseになってしまいました。

そこで、レベルから要素IDを取得し、これを比較しました。

 

なお、各要素がどんなパラメータを持っているかは、Element.Parametersを使えば分かります。

 

 

レベルで要素取得.png

メッセージ3/7

meme1
Explorer
Explorer

@sbo_bimcim さま
とても丁寧にご回答いただきましてありがとうございます。大変助かりました。
流れは理解することができ、実際に自分でもノードを配置して試してみました。

もう少しだけお聞きしたいのですが、①カテゴリ②レベル③ファミリ名の3つを指定してファミリを抽出したい場合のノードの組み方を教えていただくことは可能でしょうか。
自分では添付のように2回BoolMaskをかけたりしてみましたがうまくいかずにおります。
1つの建物モデル内にファミリ名が異なる構造フレームが複数配置されているので、その中の1階レベルの決められたファミリ名のみを対象としてDynamoを実行したいです。

何度もご質問して申し訳ありませんが、ご対応よろしくお願いいたします。

0 件のいいね
メッセージ4/7

sbo_bimcim
Enthusiast
Enthusiast

ファミリ名が2つ入力されているのは、「どちらかの名前と一致したら抽出する」という理解で作ってみました。

Filterを増やす必要はなく、AndやOrでboolを操作してあげれば良いです。

 

 

カテゴリ、レベル、ファミリ名で要素取得.png

 

 

メッセージ5/7

meme1
Explorer
Explorer

@sbo_bimcim さま

迅速にご回答くださいましてありがとうございます。

とても勉強させていただいております。

 

頂戴したDynamoを修正せずそのまま試してみたところ、OrとANDの部分が添付のようにnullとなり、うまく処理できませんでした。
何か原因等お分かりでしょうか。他のノードに置き換える等手段が必要でしょうか。
加えてご質問したいのですが、わたしが自分でOrのノードを配置した際にはノード右側のboolという表示は出てきません。こちらはバージョンの違いなどで特に気にする必要はないのでしょうか。

 

お聞きしてばかりで申し訳ありませんが、ご回答よろしくお願いいたします。

0 件のいいね
メッセージ6/7

sbo_bimcim
Enthusiast
Enthusiast
解決済み

使用されているのはRevit2021だと予想して、そちらで試してみました!

すると色々問題があることが分かりました・・・。

 

たぶん、ORやANDノードがリストに対応していません。

なので、nullになってしまうのだと思います。

 

ノードのみでどうにかしようとトライしましたが、

うまくいかず・・・すみません、諦めました。

代わりにORやANDの動きをするPython Scriptを作りました。

とりあえず、こちらを使用していただければ、乗り切れると思います。

 

また、==ノードも挙動がおかしかったので、List.Equalsに変更しています。

 

長くなりそうですが、下に色々添付します。

 


@meme1 さんは書きました:

加えてご質問したいのですが、わたしが自分でOrのノードを配置した際にはノード右側のboolという表示は出てきません。こちらはバージョンの違いなどで特に気にする必要はないのでしょうか。

これは、気にする必要はないですし、ORノードは使う必要もないです。

 

レベル等による要素抽出.png

 

ANDのコード

# リスト入力じゃなかったら強制リスト化
bools1 = IN[0] if isinstance(IN[0], list) else [IN[0]]
bools2 = IN[1] if isinstance(IN[1], list) else [IN[1]]

# AND処理
and_bools = []
for bool1, bool2 in zip(bools1, bools2):
	if bool1 and bool2:
		and_bools.append(True)
	else:
		and_bools.append(False)

OUT = and_bools

 

ORのコード

# リスト入力じゃなかったら強制リスト化
bools1 = IN[0] if isinstance(IN[0], list) else [IN[0]]
bools2 = IN[1] if isinstance(IN[1], list) else [IN[1]]

# OR処理
or_bools = []
for bool1, bool2 in zip(bools1, bools2):
	if bool1 or bool2:
		or_bools.append(True)
	else:
		or_bools.append(False)

OUT = or_bools

 

ついでに、ノードとかもPython化したもの

import clr
clr.AddReference("RevitNodes")
from Revit.Elements import *

elements = IN[0]
level = IN[1]
family_name1 = IN[2]
family_name2 = IN[3]

list = []
for element in elements:
	element_lvl = Element.GetParameterValueByName(element, "参照レベル")
	element_family_name = element.Type.FamilyName
	if element_lvl == level:
		if (element_family_name == family_name1
				or element_family_name == family_name2):
			list.append(element)

OUT = list

 

メッセージ7/7

meme1
Explorer
Explorer

@sbo_bimcim さま
ご回答ありがとうございます!

無事Dynamoでやりたかったファミリの抽出ができました。
まだまだスクリプトを書くレベルまでは程遠いですが、いただいたデータを見せていただいて勉強します。

本当にありがとうございました。とても助かりました。