Autodesk Fabrication 是一款产品,它和 Revit 做了集成。这是 SDK 中对于它们集成提供的 API 例子。
运行命令 Ancillaries
获取预制构件对应的辅助设备:
从 Revit UI 上不能完全找到对应的内容,从字面上猜测,应该是垫圈、连接、铆钉等的设置。
命令文件:Revit 2021 SDK\Samples\FabricationPartLayout\CS\Ancillaries.cs
整体逻辑:
FabricationConfiguration.GetFabricationConfiguration(doc)
FabricationPart
fabPart.GetPartAncillaryUsage()
ancillaryUsage.UsageType
、config.GetAncillaryName(ancillaryUsage.AncillaryId)
// 得到预制相关的配置
FabricationConfiguration config = null;
config = FabricationConfiguration.GetFabricationConfiguration(doc);
// 选择一个预制零件
FabricationPart fabPart = null;
Reference refObj = uidoc.Selection.PickObject(ObjectType.Element, "Pick a fabrication part to start.");
fabPart = doc.GetElement(refObj) as FabricationPart;
// 获取辅助设备
IList<FabricationAncillaryUsage> ancillaries = fabPart.GetPartAncillaryUsage();
List<string> ancillaryDescriptions = new List<string>();
// 创建一个包含辅助设备作用和名称的列表
foreach (var ancillaryUsage in ancillaries)
{
FabricationAncillaryType ancilType = ancillaryUsage.Type;
FabricationAncillaryUsageType usageType = ancillaryUsage.UsageType;
ancillaryDescriptions.Add($"{ancilType.ToString()}: {usageType.ToString()} - "
+ $"{config.GetAncillaryName(ancillaryUsage.AncillaryId)}");
}
运行命令的结果,把特定的按钮和组排除出去,在 UI 上体现为多了一个红色的叉:
命令文件:Revit 2021 sdk\samples\FabricationPartLayout\CS\ButtonGroupExclusions.cs
核心逻辑:
// 通过名称获得对应的 service
FabricationConfiguration config = FabricationConfiguration.GetFabricationConfiguration(doc);
IList<FabricationService> allLoadedServices = config.GetAllLoadedServices();
FabricationService selectedService = allLoadedServices.FirstOrDefault(x => x.Name == serviceName);
// 从 service 排除单个按钮或者一个组
selectedService.OverrideServiceButtonExclusion(rectangularGroupIndex, i, true);
selectedService.SetServiceGroupExclusions(new List<int>() { roundGroupIndex });
运行命令的结果:
实际上就是修改了服务的类型:
实际效果和UI上的更改服务是一样的:
命令文件:Revit 2021 sdk\samples\FabricationPartLayout\CS\ChangeService.cs
核心逻辑:
FabricationNetworkChangeService applychange = new FabricationNetworkChangeService(doc);
// Set the selection of element identifiers to be changed
applychange.SetSelection( selIds );
// Set the service to the second service in the list (ductwork exhaust service)
applychange.SetServiceId( allLoadedServices[1].ServiceId );
// Set the group to the second in the list (round)
applychange.SetGroupId( 1 );
applychange.SetMapOfSizesForStraights( sizeMappings );
applychange.SetMapOfInLinePartTypes( swapinlineIds );
FabricationNetworkChangeServiceResult result = applychange.ApplyChange();
把原生 Revit 构件转成 FabricationPart
。
输出 MAJ 文件:
ISet<ElementId> exported = FabricationPart.SaveAsFabricationJob(doc, elementIds, filename, new FabricationSaveJobOptions(true));
输出 PCF 文件:
FabricationUtils.ExportToPCF(doc, fabParts, filename);
输出几何图形:
IList<Mesh> main = getMeshes(part.get_Geometry(options));
IList<Mesh> ins = getMeshes(part.GetInsulationLiningGeometry());
自动创建一系列的预制构件。需要将 Revit 切换为英文版才能正常运行,原因是代码里面参数名称写成了英文,而不是通过 id 去查找。
用官方的例子,经常死机,有时间可以调查一下。