ファミリ インスタンスを使用した作業の詳細については、次のコード サンプルを確認してください。NewFamilyInstance()メソッドでは、作成するファミリ インスタンスのタイプを指定するために StructuralType 引数が必要な点に注意してください。次に例を示します。
表 34: NewFamilyInstance()メソッドにおける StructuralType 引数の値
ファミリ インスタンスのタイプ |
StructuralType の値 |
ドア、テーブルなど |
NonStructural |
梁 |
Beam |
ブレース |
Brace |
柱 |
Column |
基礎 |
Footing |
次の関数は、Revit プロジェクトにテーブルのファミリをロードして、このファミリ内のすべての記号からインスタンスを作成する方法を示します。
指定したファミリが既にロードされていた場合は、LoadFamily()メソッドは False を返します。つまり、次の場合は、この関数を呼び出す前にファミリ Table-Dining Round w Chairs.rfa をロードしません。この例では、テーブルは既定でレベル 1 に作成されます。
コード領域 12-3: テーブルを作成 |
void CreateTables(Autodesk.Revit.DB.Document document) { String fileName = @"C:\ProgramData\Autodesk\RVT 2014\Libraries\US Imperial\Furniture\Tables\Table-Dining Round w Chairs.rfa"; // try to load family Family family = null; if (!document.LoadFamily(fileName, out family)) { throw new Exception("Unable to load " + fileName); } // Loop through table symbols and add a new table for each ISet<ElementId> familySymbolIds = family.GetFamilySymbolIds(); double x = 0.0, y = 0.0; foreach (ElementId id in familySymbolIds) { FamilySymbol symbol = family.Document.GetElement(id) as FamilySymbol; XYZ location = new XYZ(x, y, 10.0); FamilyInstance instance = document.Create.NewFamilyInstance(location, symbol, StructuralType.NonStructural); x += 10.0; } } |
テーブル ファミリをロードし、各 FamilySymbol にインスタンスを 1 つ配置した結果:
図 47: ファミリを読み込み、Revit プロジェクトにテーブルを作成
このサンプルでは、多数の FamilySymbol を含むファミリをロードするよりも FamilySymbol を 1 つロードする方が時間がかからないため、ファミリの代わりにファミリ記号をロードします。
コード領域 12-4: 梁を作成 |
// get the active view's level for beam creation Level level = document.ActiveView.Level; // load a family symbol from file FamilySymbol gotSymbol = null; String fileName = @"C:\Documents and Settings\All Users\Application Data\Autodesk\RST 2011\Imperial Library\Structural\Framing\Steel\W-Wide Flange.rfa"; String name = "W10X54"; FamilyInstance instance = null; if (document.LoadFamilySymbol(fileName, name, out gotSymbol)) { // look for a model line in the list of selected elements UIDocument uidoc = new UIDocument(document); ElementSet sel = uidoc.Selection.Elements; ModelLine modelLine = null; foreach (Autodesk.Revit.DB.Element elem in sel) { if (elem is ModelLine) { modelLine = elem as ModelLine; break; } } if (null != modelLine) { // create a new beam instance = document.Create.NewFamilyInstance(modelLine.GeometryCurve, gotSymbol, level, StructuralType.Beam); } else { throw new Exception("Please select a model line before invoking this command"); } } else { throw new Exception("Couldn't load " + fileName); } |
長さ 180 フィートの長い壁を作成し、このサンプルを実行する前に、作成した壁を選択します。ホスト オブジェクトはインスタンスの挿入をサポートする必要があります。サポートしていない場合 NewFamilyInstance()メソッドは失敗します。ホストで作成する必要のあるインスタンスにホスト要素が提供されない場合や、インスタンスを指定されたホスト要素に挿入できない場合は、NewFamilyInstance()メソッドは何も実行しません。
コード領域 12-5: ドアを作成 |
void CreateDoorsInWall(Autodesk.Revit.DB.Document document, Wall wall) { // get wall's level for door creation Level level = document.GetElement(wall.LevelId) as Level; FilteredElementCollector collector = new FilteredElementCollector(document); ICollection<Element> collection = collector.OfClass(typeof(FamilySymbol)) .OfCategory(BuiltInCategory.OST_Doors) .ToElements(); IEnumerator<Element> symbolItor = collection.GetEnumerator(); double x = 0, y = 0, z = 0; while (symbolItor.MoveNext()) { FamilySymbol symbol = symbolItor.Current as FamilySymbol; XYZ location = new XYZ(x, y, z); FamilyInstance instance = document.Create.NewFamilyInstance(location, symbol, wall, level, StructuralType.NonStructural); x += 10; y += 10; z += 1.5; } } |
Revit における前述のコードの結果は、次の図のようになります。指定された場所が指定されたレベルにない場合、NewFamilyInstance()メソッドはレベルの高さではなく位置の高さを使用することに注意してください。
図 48: 壁にドアを挿入
特定の方向に項目を挿入するには、参照の方向を使用します。
コード領域 12-6: 参照の方向を使用して FamilyInstances を作成 |
// Get a floor to place the beds FilteredElementCollector collector = new FilteredElementCollector(document); Floor floor = collector.OfClass(typeof(Floor)).FirstElement() as Floor; if (floor != null) { // Find a Bed-Box family Family family = null; FilteredElementCollector famCollector = new FilteredElementCollector(document); famCollector.OfClass(typeof(Family)); ICollection<Element> collection = famCollector.ToElements(); foreach (Element element in collection) { if (element.Name.CompareTo("Bed-Box") == 0) { family = element as Family; break; } } if (family != null) { // Enumerate the beds in the Bed-Box family FilteredElementCollector fsCollector = new FilteredElementCollector(document); ICollection<Element> fsCollection = fsCollector.WherePasses(new FamilySymbolFilter(family.Id)).ToElements(); IEnumerator<Element> symbolItor = fsCollection.GetEnumerator(); int x = 0, y = 0; int i = 0; while (symbolItor.MoveNext()) { FamilySymbol symbol = symbolItor.Current as FamilySymbol; XYZ location = new XYZ(x, y, 0); XYZ direction = new XYZ(); switch (i % 3) { case 0: direction = new XYZ(1, 1, 0); break; case 1: direction = new XYZ(0, 1, 1); break; case 2: direction = new XYZ(1, 0, 1); break; } FamilyInstance instance = document.Create.NewFamilyInstance(location, symbol, direction, floor, StructuralType.NonStructural); x += 10; i++; } } } |
前のコードの結果は次の図のとおりです。
図 49: 異なる参照方向を使用してファミリ インスタンスを作成