🐷

Revit Python Shell ~基礎編~

2020/12/24に公開

1. Collecting Elements

プロジェクトに含まれるモデルに含まれるデータにアクセスするために使われる FilteredElementCollectorを見てみましょう!!

1.1 FilteredElementCollector

まずは FilteredElementCollector と打ってみましょう!!

<type 'FilteredElementCollector'>

これはFilteredElementCollector型のものであることを表しています。
定番の使い方になりますが、毎回 FilteredElementCollector と打つと入力をミスる可能性が高くなります。
そこで、外部ライブラリから DBをインポートしてみましょう

>>> from Autodesk.Revit import DB

これでインポート完了です。FilteredElementCollectorはDBから呼び出すことができますので、呼び出してみましょう!!

予測変換のように候補が表示されているかと思います。

それでは今回はプロジェクト内で壁カテゴリに属しているインスタンスを集めてみましょう!!この場合、以下のようなコードになります。

walls = DB.FilteredElementCollector(doc).OfCategory(DB.BuiltInCategory.OST_Walls).WhereElementIsNotElementType()

目的が「プロジェクト内で」「壁カテゴリ」に属している「インスタンス」のものですので、以下のように対応しています。

  1. プロジェクト内で : FilteredElementCollector(doc)
  2. 壁カテゴリ : OfCategory(DB.BuiltInCategory.OST_Walls)
  3. インスタンス : WhereElementIsNotElementType()

それぞれの使い方はここにまとまっていますので、詳しくはこちらを確認してみてください。

1.2 rpw.db.Collector

rpwの設定をしていない方はこちらをご確認ください。
先ほどと同様に書いてきましょう。

>>> from rpw import db

ポイントは小文字であるということです。くれぐれも大文字での入力をしないようにしましょう。

walls = db.Collector(of_category='Walls', is_not_type=True)
  1. プロジェクト内で : db.Collector
  2. 壁カテゴリ : of_category='Walls'
  3. インスタンス : is_not_type=True (is_type=Falseでも同様です)

2. Get FamilyName

まずはRevitLookUpをつかって壁の FamilyName にアクセスするための方法を確認してみましょう!!
RevitLookUpの開き方は下図のとおりです。 壁を選択した後、‘Snoop Current Selection`を選択してください。

確認してみるとGetTypeIdまたはWallTypeから取得することができそうです。

中をみてみると下図のようになっています。

2.1 GetTypeId()

まずはTypeIdを取得してみましょう!!

for wall in walls:
	wall.GetTypeId

以下のようなものが表示されているかと思います。

<built-in method GetTypeId of Wall object at 0x00000000000004B5>

これは()を忘れたときに出てきますので、()をつけてやり直してみましょう。

>>> for wall in walls:
		wall.GetTypeId()
<Autodesk.Revit.DB.ElementId object at 0x00000000000004B6 [198367]>

これでElementIdを取得することができました。
ElementIdからElementを取得するためによく利用するのがGetElement()になります。
以下のようになります。

>>> for wall in walls:
... 	wt_id = wall.GetTypeId()
... 	doc.GetElement(wt_id)
... 
<Autodesk.Revit.DB.WallType object at 0x00000000000004B9 [Autodesk.Revit.DB.WallType]>

最後に Name を取得してみましょう!!

>>> for wall in walls:
... 	wt_id = wall.GetTypeId()
... 	wt = doc.GetElement(wt_id)
... 	wt.Name
... 
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
AttributeError: Name

エラーになってしまいました。取得したいものは FamilyName なので、試してみましょう!!

>>> for wall in walls:
... 	print("Type Name:")
... 	wall.Name
... 	wt_id = wall.GetTypeId()
... 	wt = doc.GetElement(wt_id)
... 	print("Family Name: ")
... 	wt.FamilyName
... 
Type Name:
'Wall - Timber Clad'
Family Name: 
'Basic Wall'

無事取得することが来ました。

2.2 WallType

先ほど同様に取得していきましょう。ただしこの方法はWallのみで有効な方法です。壁のみ取得されることが確定している場合にのみオススメの方法です!!

>>> for wall in walls:
... 	wt = wall.WallType
... 	wt.FamilyName
... 
'Basic Wall'

2.3 rpw.db.Element

rpwを使って取得する場合を見ていきましょう。rpwもすべて同様の取得の仕方になります。

>>> from rpw import db
>>> rpw_wall = db.Element(wall)
>>> rpw_wall.get_symbol().FamilyName
'Basic Wall'

RevitAPIを使う場合には下記のようなエラーが出ますので、注意してください。

>>> wall.Symbol.FamilyName
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
AttributeError: 'Wall' object has no attribute 'Symbol'

3. Get Parameter

パラメータを取得する方法は4種類あります。

  1. LookupParameter()
  2. GetParameters()
  3. get_Parameter()
  4. db.Element.parameters[]
    それぞれの方法について見ていきましょう。

3.1 LookupParameter()

LookupParameter()では文字列(日本語が含まれる場合も可能)で指定したパラメータ名のうち最初に見つかったものの値を返します。同じ名前が複数ある場合には最初の一つしか返ってきません。また、値が存在しない場合には None が返ってきます。

>>> wall.LookupParameter('Area')
<Autodesk.Revit.DB.Parameter object at 0x000000000000041F [Autodesk.Revit.DB.Parameter]>
>>> wall_area_param = wall.LookupParameter('Area')
>>> wall_area_param.StorageType
Autodesk.Revit.DB.StorageType.Double
>>> wall_area_param.AsDouble()
460.17654535313488

この場合パラメータのタイプは小数を含む値になっていますので、Doubleとなっています。
また、返ってきた値はSQF(スクエアフィート)になりますので、SQM(平方メートル)の値を取得する場合には単位換算が必要です。

3.2 GetParameters()

GetParameters()では文字列でしていしたパラメータをすべての値をリスト形式で返します。そのため、パラメータの値を得るためには、一旦値を得たいパラメータを指定する必要があります。ただし、パラメータが存在しない場合には空のリストが返ってきます。

>>> wall.GetParameters('Area')
List[Parameter]([<Autodesk.Revit.DB.Parameter object at 0x0000000000000420 [Autodesk.Revit.DB.Parameter]>])
>>> wall_area_param = wall.GetParameters('Area')[0]
>>> wall_area_param.StorageType
Autodesk.Revit.DB.StorageType.Double
>>> wall_area_param.AsDouble()
460.17654535313488

3.3 get_Parameter()

'get_Parameter()'ではBuiltin Parameterを使って値を取得することができます。また、値が存在しない場合には None が返ってきます。こちらは使用するRevitの言語に依存することなく値の取得が可能です。特に日本語バージョンとは限らない場合にはこちらの方法がオススメです。

>>> wall.get_Parameter(DB.BuiltInParameter.HOST_AREA_COMPUTED)
<Autodesk.Revit.DB.Parameter object at 0x0000000000000480 [Autodesk.Revit.DB.Parameter]>
>>> wall_area_param = wall.get_Parameter(DB.BuiltInParameter.HOST_AREA_COMPUTED)
>>> wall_area_param.StorageType
Autodesk.Revit.DB.StorageType.Double
>>> wall_area_param.AsDouble()
460.17654535313488

3.4 db.Element.parameters[]

db.Element.parameters[]の方法ではパラメータの型を気にすることなく値の取得が可能です。
値を取得するまでの手間を省くことができます。

>>> db.Element(wall).parameters['Area']
<rpw:Parameter [name:Area] [value:460.1765] [type:float]>
>>> db.Element(wall).parameters['Area'].value
460.17654535313488

ここで新しくfloatという型が出てきていますが、これはDoubleと同義になります。

Discussion