この要素タイプには、プロジェクトやファミリ ドキュメントでの読み込み操作や計算で取得した任意のジオメトリを格納できます。
DirectShape 要素と関連するクラスは、外部で作成されたジオメトリの形状を Revit ドキュメントに格納する機能をサポートします。ジオメトリには閉じたソリッドやメッシュを含めることができます。DirectShape は、「実際の」Revit 要素を作成するための十分な情報が利用できない IFC や STEP といった他のデータ形式から形状を読み込むことを主な目的としています。
DirectShape オブジェクトは、Wall カテゴリなどの最上位の Model カテゴリに割り当てることができます。DirectShape 要素にサブカテゴリを割り当てることはできません。IsValidCategoryId プロパティではカテゴリ ID をテストして最上位の組み込みカテゴリであることを確認することができ、Category.CategoryType 列挙値はカテゴリ タイプが Model であるかどうかを示します。カテゴリを割り当てると、Revit でのオブジェクトの表示方法が影響を受け、利用可能なパラメータのコレクションといくつかの制限された動作がオブジェクトに付与されます。
静的 CreateElement()メソッドは、インスタンス レベルの新しい DirectShape を作成します。DirectShape が追加されるドキュメントと適切な組み込みカテゴリの ID が必要です。DirectShape には追加のフィールドがあります。これは、DirectShape 要素を管理するために、作成するアプリケーションによって使用され、2 つの文字列パラメータを CreateElement()に渡します。これらのフィールドには、作成した形状のソースのコンテキストを取得するために、必要に応じて後でアプリケーションからアクセスできます。
DirectShape を作成したら、オーバーロードしたいずれかの SetShape()メソッドを使用して形状を設定できます。形状は ShapeBuilder オブジェクトから直接設定することも、GeometryObjects のリストから設定することもできます。ShapeBuilder オブジェクトを使用して DirectShape のジオメトリを構築する場合、ShapeBuilder 入力を使用すると Revit で入力ジオメトリを繰り返し検証しなくても済むため、パフォーマンスがわずかに向上します。AppendShape ()メソッドのバージョンを使用すると、DirectShape にジオメトリ オブジェクトを追加することもできます。AppendShape()では受け取ったジオメトリを既に存在するジオメトリに合成したり結合したりすることはできません。ジオメトリは別々に格納されます。
DirectShape では次のジオメトリ タイプを入力として使用できます。
さらに、DirectShape のビュー固有の表現で使用するジオメトリを指定できます。このジオメトリは、DirectShapeTargetViewType の入力値とともに入力されます。ビュー固有の形状の表現を設定する場合、該当するタイプのビューでのみ使用されます。現在、サポートされているビュー固有の表現は平面図ビュー用のみです。
次の例は、GeometryCreationUtilities クラスを使用して作成された球から単純な DirectShape を作成する方法を示しています。
|
コード領域: DirectShape を作成 |
// Create a DirectShape Sphere
public void CreateSphereDirectShape(Document doc)
{
List<Curve> profile = new List<Curve>();
// first create sphere with 2' radius
XYZ center = XYZ.Zero;
double radius = 2.0;
XYZ profile00 = center;
XYZ profilePlus = center + new XYZ(0, radius, 0);
XYZ profileMinus = center - new XYZ(0, radius, 0);
profile.Add(Line.CreateBound(profilePlus, profileMinus));
profile.Add(Arc.Create(profileMinus, profilePlus, center + new XYZ(radius, 0, 0)));
CurveLoop curveLoop = CurveLoop.Create(profile);
SolidOptions options = new SolidOptions(ElementId.InvalidElementId, ElementId.InvalidElementId);
Frame frame = new Frame(center, XYZ.BasisX, -XYZ.BasisZ, XYZ.BasisY);
Solid sphere = GeometryCreationUtilities.CreateRevolvedGeometry(frame, new CurveLoop[] { curveLoop }, 0, 2 * Math.PI, options);
using (Transaction t = new Transaction(doc, "Create sphere direct shape"))
{
t.Start();
// create direct shape and assign the sphere shape
DirectShape ds = DirectShape.CreateElement(doc, new ElementId(BuiltInCategory.OST_GenericModel),
"Application id",
"Geometry object id");
ds.SetShape(new GeometryObject[] { sphere });
t.Commit();
}
}
|
DirectShape のジオメトリは、ShapeBuilder クラスのサブクラスを使用して作成することも、TessellatedShapeBuilder から作成することもできます。
ViewShapeBuilder や WireframeBuilder を使用すると DirectShape クラスに格納するジオメトリを作成できます。ViewShapeBuilder クラスはビュー固有の形状の表現を構築、検証します。これは、平面図ビューの曲線をベースにした表現に限定されます。WireframeBuilder は点と曲線で構成される 3D 形状表現を作成します。ShapeBuilders の両方のタイプとも、ShapeBuilder パラメータを使用する DirectShape.SetShape()または DirectShape.AppendShape()オーバーロードを使って DirectShape 要素に適用できます。
TessellatedShapeBuilder を使用すると、接続された一連の切り子面を境界に持つソリッド、シェル、ポリメッシュを作成できます。これは TessellatedFace オブジェクトを 1 つずつ追加することによって作成されます。面は面のセットが「開いている」場合にのみ、ビルドに追加できます。面のセットを開くには、OpenConnectedFaceSet()メソッドを使用します。すべての TessellatedFaces を追加したら、CloseConnecedFaceSet()を呼び出して面のセットを閉じます。ビルダでは複数の面のセットを使用できます。そのような場合、最初のセットがボディの外側の「サーフェス」を表し、それ以後のセットが内部のボイドを表します。入力されたデータに矛盾や欠落がある場合でも、ビルダは、Revit で有効なジオメトリを作成しようとします。
すべての面を設定して面のセットを閉じたら、Build()メソッドを呼び出して、格納されている面のセットから指定したジオメトリ オブジェクトを作成します。Build()メソッドは、TessellatedShapeBuilderResult オブジェクトを返します。次の例に示すように、TessellatedShapeBuilderResult.GetGeometricalObjects()メソッドは、対応する DirectShape.SetShape()や DirectShape.AppendShape()オーバーロードで使用できる GeometryObjects のリストを返します。
|
コード領域: TessellatedShapeBuilder を使用して DirectShape を作成 |
// Create a pyramid-shaped DirectShape using given material for the faces
public void CreateTessellatedShape(Document doc, ElementId materialId)
{
List<XYZ> loopVertices = new List<XYZ>(4);
TessellatedShapeBuilder builder = new TessellatedShapeBuilder();
builder.OpenConnectedFaceSet(true);
// create a pyramid with a square base 4' x 4' and 5' high
double length = 4.0;
double height = 5.0;
XYZ basePt1 = XYZ.Zero;
XYZ basePt2 = new XYZ(length, 0, 0);
XYZ basePt3 = new XYZ(length, length, 0);
XYZ basePt4 = new XYZ(0, length, 0);
XYZ apex = new XYZ(length / 2, length / 2, height);
loopVertices.Add(basePt1);
loopVertices.Add(basePt2);
loopVertices.Add(basePt3);
loopVertices.Add(basePt4);
builder.AddFace(new TessellatedFace(loopVertices, materialId));
loopVertices.Clear();
loopVertices.Add(basePt1);
loopVertices.Add(apex);
loopVertices.Add(basePt2);
builder.AddFace(new TessellatedFace(loopVertices, materialId));
loopVertices.Clear();
loopVertices.Add(basePt2);
loopVertices.Add(apex);
loopVertices.Add(basePt3);
builder.AddFace(new TessellatedFace(loopVertices, materialId));
loopVertices.Clear();
loopVertices.Add(basePt3);
loopVertices.Add(apex);
loopVertices.Add(basePt4);
builder.AddFace(new TessellatedFace(loopVertices, materialId));
loopVertices.Clear();
loopVertices.Add(basePt4);
loopVertices.Add(apex);
loopVertices.Add(basePt1);
builder.AddFace(new TessellatedFace(loopVertices, materialId));
builder.CloseConnectedFaceSet();
TessellatedShapeBuilderResult result = builder.Build(TessellatedShapeBuilderTarget.Solid, TessellatedShapeBuilderFallback.Abort, ElementId.InvalidElementId);
using (Transaction t = new Transaction(doc, "Create tessellated direct shape"))
{
t.Start();
DirectShape ds = DirectShape.CreateElement(doc, new ElementId(BuiltInCategory.OST_GenericModel),
"Application id",
"Geometry object id");
ds.SetShape(result.GetGeometricalObjects());
t.Commit();
}
}
|
下のイメージは、コンクリート マテリアル ID を指定して上の例を実行したときの結果を示しています。
DirectShapeOptions クラスを使用すると、DirectShape オブジェクトの動作をコントロールできます。DirectShape オブジェクトで使用するオプションを設定するには、DirectShape.SetOptions()を使用します。GetOptions()メソッドは、現在 DirectShape オブジェクトが使用している DirectShapeOptions を返します。
既定では、DirectShape 要素は、寸法、位置合わせ、面のホスト、スナップなどの要素参照をサポートします。この既定の動作は DirectShapeOptions.ReferencingOption プロパティを使用して変更できます。このプロパティが、NotReferenceable と設定されている場合には、寸法記入、スナップ、位置合わせ、面のホストにジオメトリを使用できない場合があります。ただし、個々のジオメトリ オブジェクトを参照しない操作であれば、ユーザが要素を選択できる場合があります。
さらに、DirectShape 要素が部屋の境界の計算に適したカテゴリであり、関連する「部屋の境界」パラメータが true に設定されている場合は、DirectShape 要素を部屋の境界の計算に加えることができます。プロパティ DirectShapeOptions.RoomBoundingOption は、DirectShape が部屋の境界の計算への参加を許可する「部屋の境界」パラメータのオプションをサポートしているかどうかを特定します。既定値は NotApplicable ですが、適用可能な DirectShape の場合は自動的に SetByParameter に変更されます。