前回「Revit ファミリAPI - その1」では、Revit APIをもちいてファミリを作成する方法の前半をお話しました。
1.計画
2.参照面の設定
3.パラメータの追加
4.タイプの追加
5.パラメトリックな動作のテスト - フレックス(Flex)
今回は、その続きにあたる、「6.ジェオメトリの追加」からのお話をしたいと思います。
6.ジェオメトリの追加
7. 拘束(alignment)の追加
8.ステップ5~8を繰り返す
6.ジェオメトリの追加
参照面が定義され、パラメータを追加し、意図する動きが定義されたら、ここでようやくジェオメトリを追加します。繰り返しになりますが、パラメトリックのモデルでは、ジェオメトリは骨格(参照面)・筋肉(パラメータ)に追従するスキンにすぎません。
まずは、以下のようなソリッドを追加します。作成には、FamilyCreate.NewExtrusion() メソッドを使用し、断面形状を下限と上限の参照面間で押し出しする方法を用います。
手順としては、
(1)最初にL字型のプロファイル(断面形状)を定義します。
(2)スケッチ面を作成します。
(3)押し出しの高さを定義します。高さは下限と上限の参照間の距離にあたります。
(4)押し出しソリッドの作成。
ここで、注意していただきたいのは、この時点では、あくまで初期値の値を持ったソリッドです。実際にはソリッドは参照面に拘束されていません。拘束のついか追加は後ほどおこないます。
Function CreateSolid() As Extrusion
' (1) L字型のプロファイル(断面形状)を定義
Dim pProfile As CurveArrArray = CreateProfileLShape() ' 以下で定義
' (2) スケッチ面を作成
Dim pRefPlane
As
ReferencePlane = _
Utils.FindElement(m_rvtDoc,
GetType(ReferencePlane), "Reference Plane")
Dim pSketchPlane As SketchPlane = _
SketchPlane.Create(m_rvtDoc,
pRefPlane.Plane)
' (3) 押し出しの高さは下限と上限の参照間の距離にあたります。
Dim dHeight As Double = Utils.mmToFeet(4000)
' (4) 押し出しを作成。
Dim bIsSolid As Boolean = True '' Falseにすると負のソリッド
Dim pSolid As Extrusion = _
m_rvtDoc.FamilyCreate.NewExtrusion(
_
bIsSolid, pProfile, pSketchPlane,
dHeight)
Return pSolid
End Function
以下のような断面形状を定義します。
以下がコードです。何をしたいのかがわかると、これは簡単だと思います。
Function CreateProfileLShape() As CurveArrArray
Dim w As Double = Utils.mmToFeet(600)
Dim d As Double = Utils.mmToFeet(600)
Dim tw As Double = Utils.mmToFeet(150)
Dim td As Double = Utils.mmToFeet(150)
' 頂点を定義します(最後頂点はループを簡単にするために用いています。)
Const nVerts As Integer = 6 ' 頂点の数
Dim pts() As XYZ = { _
New XYZ(-w / 2, -d / 2, 0), _
New XYZ(w / 2, -d / 2, 0), _
New XYZ(w / 2, -d / 2 + td, 0), _
New XYZ(-w / 2 + tw, -d / 2 + td, 0), _
New XYZ(-w / 2 + tw, d / 2, 0), _
New XYZ(-w / 2, d / 2, 0), _
New XYZ(-w / 2, -d / 2, 0)}
' ループを定義。個々のエッジを定義し、curveArrayに追加します。
Dim pLoop As CurveArray = m_rvtApp.Create.NewCurveArray
Dim lines(nVerts - 1) As Line
For i As Integer = 0 To nVerts - 1
lines(i) = Line.CreateBound(pts(i), pts(i + 1))
pLoop.Append(lines(i))
Next
' さらにcurveArrArrayにループを追加し、プロファイルを定義
Dim pProfile As CurveArrArray = m_rvtApp.Create.NewCurveArrArray
pProfile.Append(pLoop)
Return pProfile
End Function
7. 拘束(alignment)の追加
上記までのプロセスで、ソリッドを単に追加しただけでは、実はソリッドは参照面には追従しません。ソリッドはとんでもないところにおかれてしまったり、また、別のタイプを選んでも意図した形状には変更してくれません。そういった、「賢い」振る舞いをさせるには、ソリッドの面を参照面に拘束させる必要があります。と同時に、ソリッドから該当する面を見つけるのも少々数学の知識を知識を必要とするところです。
以下ようなOffesetVの参照面にソリッド面を拘束する例を見てみましょう。
以下がコードのサンプルです。参照面とソリッドの面をFamilyCreate.NewAlignment()メソッドで拘束します。
コードに出てくるUtilsといったヘルパークラスは、Labsのコードにあります。FindElementはエレメントフィルタを用いたコードを一般化したもので、難しくないと思いますが、FindFaceに関しては、少々高校での数学の授業を思い出させるかと思いますが :-) 、必要に応じてLabsのコードを参考にしてください。
Sub AddAlignment_ReferencePlane(ByVal pSolid As Extrusion, _
ByVal normal As XYZ, ByVal
nameRefPlane As String)
' 拘束するビューを取得します
Dim pViewPlan As View = _
Utils.FindElement( _
m_rvtDoc, GetType(ViewPlan), "Lower Ref. Level")
' 参照面を取得します
Dim refPlane As ReferencePlane = _
Utils.FindElement( _
m_rvtDoc, GetType(ReferencePlane), nameRefPlane)
' ソリッドの面の取得。
' ここでは、面の法線を照らし合わせることでチェックしています。
Dim pFace As PlanarFace = Utils.FindFace(pSolid, normal, refPlane)
' ロックされた位置合わせの拘束を定義します。
m_rvtDoc.FamilyCreate.NewAlignment( _
pViewPlan, refPlane.Reference, pFace.Reference)
End Sub
以下がレベルの位置合わせの例です。
Sub AddAlignment_Level( _
ByVal pSolid As Extrusion, _
ByVal normal As XYZ, _
ByVal nameLevel As String)
' どの方向に見ているのか。
Dim pView As View = Utils.FindElement( _
m_rvtDoc, GetType(View), "Front")
' 上部の基準レベルを見つける。 FindElement()はヘルパー関数です。
Dim pLevel As Level = Utils.FindElement( _
m_rvtDoc, GetType(Level), nameLevel)
' ソリッドの面を見つける。 FindFace()はヘルパー関数です。
Dim pFace As PlanarFace = Utils.FindFace(pSolid, normal)
' 位置合わせの拘束を作成
m_rvtDoc.FamilyCreate.NewAlignment( _
pView, pLevel.PlaneReference, pFace.Reference)
End Sub
上記で定義したAddAlignment_Level()とAddAlignment_ReferencePlane()を用いることにより、すべての面を拘束することができます。
Sub AddAlignments(ByVal pSolid As Extrusion)
AddAlignment_Level( _
pSolid, New XYZ(0.0, 0.0, 1.0), "Upper Ref Level")
AddAlignment_Level( _
pSolid, New XYZ(0.0, 0.0, -1.0), "Lower Ref. Level")
AddAlignment_ReferencePlane( _
pSolid, New XYZ(1.0, 0.0, 0.0), "Right")
AddAlignment_ReferencePlane(_
pSolid, New XYZ(-1.0, 0.0, 0.0), "Left")
AddAlignment_ReferencePlane( _
pSolid, New XYZ(0.0, -1.0, 0.0), "Front")
AddAlignment_ReferencePlane( _
pSolid, New XYZ(0.0, 1.0, 0.0), "Back")
AddAlignment_ReferencePlane( _
pSolid, New XYZ(1.0, 0.0, 0.0), "OffsetV")
AddAlignment_ReferencePlane( _
pSolid, New XYZ(0.0, 1.0, 0.0), "OffsetH")
End Sub
8.ステップ5~8を繰り返す
これで、基本的なジェオメトリの追加でできました。フレックス(Flex)テストを行います。
さらに必要であればジェオメトリを追加し、テスト・追加を繰り返します。
プロジェクトファイルにロードして、テストします。
これで、APIを用いたファミリーの作成の基本をご理解いただけたかと思います。APIでのファミリの作成に興味をお持ちの方、ぜひ試してみてください。
(コードは、Revit ADN Open のサイトにポストしてあるRevit 2013/2014 API Labs にあります。必要に応じて参考にしてください。)
原田
コメント
コメントフィードを購読すればディスカッションを追いかけることができます。