施工建模

Revit API允许将图元划分为子零件或收集到程序集中,以支持构造建模工作流,这与使用Revit用户界面的方法大致相同。零件和程序集都可以独立地进行明细表、标记、过滤和导出。您也可以将零件分割成更小的零件。创建程序集类型后,可以在项目中放置其他实例并生成独立的程序集视图。

与构造建模相关的主要类有:

  • AssemblyInstance -这个类结合了多个元素,用于标记、过滤、调度和创建隔离的装配视图。
  • AssemblyType - 表示构造程序集元素的类型。在项目中创建的每个新的唯一程序集都会自动创建一个相应的AssemblyType。可以从现有AssemblyType将新AssemblyInstance放置到文档中。
  • PartUtils - 这个实用程序类包含通用的程序集实用程序方法,包括创建程序集、划分程序集和获取程序集信息的能力。
  • AssemblyViewUtils - 用于创建各种类型的装配视图的实用程序类。

本节中的页面

  • 程序集和视图
  • 部分

程序集和视图

可以组合任意数量的模型图元以创建程序集,然后可以编辑、标记、创建明细表和过滤程序集。

创建程序集

AssemblyInstance类的静态Create()方法用于在项目中创建新的程序集实例。Create()方法必须在事务内部创建,并且必须在对新创建的程序集实例执行任何操作之前提交事务。在事务处理完成后分配装配件类型。每个唯一程序集都有自己的AssemblyType。

下面的示例创建一个新的程序集实例,更改其AssemblyType的名称,然后为该程序集实例创建一些视图。

代码区域:创建程序集和视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
AssemblyInstance CreateAssemblyAndViews(Autodesk.Revit.DB.Document doc, ICollection elementIds)
{
AssemblyInstance assemblyInstance = null;
using (Transaction transaction = new Transaction(doc))
{
ElementId categoryId = doc.GetElement(elementIds.First()).Category.Id; // use category of one of the assembly elements
if (AssemblyInstance.IsValidNamingCategory(doc, categoryId, elementIds))
{
transaction.Start("Create Assembly Instance");
assemblyInstance = AssemblyInstance.Create(doc, elementIds, categoryId);
transaction.Commit(); // commit the transaction that creates the assembly instance before modifying the instance's name

if (transaction.GetStatus() == TransactionStatus.Committed)
{
transaction.Start("Set Assembly Name");
assemblyInstance.AssemblyTypeName = "My Assembly Name";
transaction.Commit();
}

if (assemblyInstance.AllowsAssemblyViewCreation()) // create assembly views for this assembly instance
{
if (transaction.GetStatus() == TransactionStatus.Committed)
{
transaction.Start("View Creation");
View3D view3d = AssemblyViewUtils.Create3DOrthographic(doc, assemblyInstance.Id);
ViewSchedule partList = AssemblyViewUtils.CreatePartList(doc, assemblyInstance.Id);
transaction.Commit();
}
}
}
}

return assemblyInstance;
}

创建AssemblyInstance的另一种方法是使用现有AssemblyType。若要使用AssemblyType创建AssemblyInstance,请使用静态方法AssemblyInstance.PlaceInstance(),并指定要使用的AssemblyType的ElementId和放置程序集的位置。

程序集视图

可以使用AssemblyViewUtils类的静态方法为程序集实例创建各种程序集视图,包括正交三维程序集视图、详图截面程序集视图、材质提取多类别明细表程序集视图、明细表多类别明细表程序集视图、单类别明细表和图纸程序集视图。除图纸视图外,所有这些视图都具有重载的创建方法,这些方法从样板创建明细表或视图。除了模板ID之外,这些重载还有一个参数来指示是否将分配或应用模板。

请注意,程序集视图必须全部指定给程序集类型的同一程序集实例。如果程序集实例可以接受新的程序集视图(因为它已经有视图,或者因为没有程序集实例有视图),则AssemblyInstance.AllowsAssemblyViewCreation()返回true。

下面的示例从给定模板为装配创建新的单一类别明细表。

代码区域:从模板创建程序集视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private ViewSchedule CreateScheduleForAssembly(Document doc, AssemblyInstance assemblyInstance, ElementId viewTemplateId)
{
ViewSchedule schedule = null;
if (assemblyInstance.AllowsAssemblyViewCreation()) // create assembly views for this assembly instance
{
using (Transaction transaction = new Transaction(doc))
{
transaction.Start("Create Schedule");

// use naming category for the schedule
if (ViewSchedule.IsValidCategoryForSchedule(assemblyInstance.NamingCategoryId))
{
schedule = AssemblyViewUtils.CreateSingleCategorySchedule(doc, assemblyInstance.Id, assemblyInstance.NamingCategoryId, viewTemplateId, false);
}
transaction.Commit();

if (schedule != null && transaction.GetStatus() == TransactionStatus.Committed)
{
transaction.Start("Edit Schedule");
schedule.ViewName = "AssemblyViewSchedule";
transaction.Commit();
}
}
}

return schedule;
}

在使用任何这些新创建的程序集视图之前,必须重新生成文档。在上面的示例中,您会注意到事务是在创建新的组装视图之后提交的。Commit()方法自动重新生成文档。

部分

可以从具有分层结构的元素生成零件,例如:

  • 墙(不包括叠层墙和幕墙)
  • 楼层(不包括形状编辑的楼层)
  • 屋顶(不包括有屋脊的屋顶)
  • Ceilings 天花板
  • 结构板基础

在Revit API中,可以使用PartUtils类将图元划分为多个部分。静态方法PartUtils.ObjectParts()用于从一个或多个元素创建程序集。请注意,与API中的大多数元素创建方法不同的是,RectorParts()实际上并不创建或返回程序集,而是实例化一个名为PartMaker的元素。在再生过程中,PartMaker使用其嵌入的规则来驱动所需零件的创建。

API还提供了一个细分程序集的接口。PartUtils. DivideParts()接受一个程序集ID集合、一个”相交元素” ID集合(可以是层和网格)和一个曲线集合作为输入。该例程使用相交的元素和曲线作为边界,从中分割并生成新零件。

The GetAssociatedParts() method can be called to find some or all of the parts associated with an element, or use HasAssociatedParts() to determine if an element has parts.
可以调用GetAssociatedParts()方法来查找与元素关联的部分或全部部分,或者使用HasAssociatedParts()来确定元素是否有部分。

您可以通过API删除零件,方法是删除单个零件元素,或删除与零件关联的PartMaker(这将在下次再生后删除此PartMaker生成的所有零件)。

可以在Revit API中操作零件,操作方式与在Revit用户界面中操作零件的方式大致相同。例如,可以使用PartUtils. SetFaceOffset()偏移零件的外部边界。

下面的示例将偏移零件的所有可以偏移的面。

代码区域:零件的偏移面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Part part = doc.GetElement(uidoc.Selection.PickObject(ObjectType.Element)) as Part;
Autodesk.Revit.DB.GeometryElement geomElem = part.get_Geometry(newOptions());

foreach(GeometryObject geomObject in geomElem)
{
if (geomObjectisSolid)
{
Solidsolid = geomObject as Solid;
FaceArray faceArray = solid.Faces;
foreach (FacefaceinfaceArray)
{
if (part.CanOffsetFace(face))
{
part.SetFaceOffset(face, 1);
}
}
}
}

偏移选定零件的面之前和之后

注:翻译自Revit API Developers Guide