How to export each assembly to a separate PCF file

Martin Schmid Martin Schmid January 8, 2019

1 min read

A comment was recently posted to my previous blog post on Exporting PCF Files from Revit 2018 – Part 2 (Assemblies), asking:

Thanks for the awesome code Martin! Is there a way to make the file name match the Assembly Name?

I’ve provided a revised example below.  The example has been modified to export each assembly to a separate PCF file, naming the file based on the assembly name.  Note that with this modification any element that is NOT in an assembly will NOT be exported to a PCF file… the code for this is shown below.

           public void ExportSelectoinToPCF()
           {
                 // get the selected element ids
                 List<ElementId> elementIdsToPCF = new List<ElementId>();
                 List<ElementId> selectedElementIds =
                 this.ActiveUIDocument.Selection.GetElementIds().ToList();
                 elementIdsToPCF.AddRange(selectedElementIds);
                 
                 // output PCF for each assembly
                 OutputAssemblyPCFs(
                      elementIdsToPCF,
                       this.ActiveUIDocument.Document);
           }  // ExportSelectoinToPCF
      
           
           public void OutputAssemblyPCFs(
                 List<ElementId> selectedElementIds,
                 Document theDocument)
           {
                 foreach (ElementId id in selectedElementIds)
                 {
                      // check if this is an assembly
                      AssemblyInstance assemblyInst =
                            theDocument.GetElement(id) as AssemblyInstance;
                      if (assemblyInst == null)
                            continue;
                      
                      // get the items IDs the assembly
                      List<ElementId> lstElemIds = new List<ElementId>();
                      lstElemIds.AddRange(assemblyInst.GetMemberIds());
                      
                      // get the name of the assembly
                      string assemblyName = assemblyInst.AssemblyTypeName;
                      string fileName = "C:\\temp\\" + assemblyName + ".pcf";
                      
                      // create the PCF file using the assembly name
                 Autodesk.Revit.DB.Fabrication.FabricationUtils.ExportToPCF(
                            this.ActiveUIDocument.Document,
                            lstElemIds,
                            fileName);            
                 } // foreach
           } // OutputAssemblyPCFs
           
           
           // Get the element ids in the selected assemblies
           public  List<ElementId> GetElementIdsInAssembly(
                 List<ElementId> selectedElementIds,
                 Document theDocument)
           {
                 List<ElementId> lstElemIds = new List<ElementId>();
                 foreach (ElementId id in selectedElementIds)
                 {
                      AssemblyInstance assemblyInst =
                            theDocument.GetElement(id) as AssemblyInstance;
                      if (assemblyInst == null)
                            continue;
                      
                      lstElemIds.AddRange(assemblyInst.GetMemberIds());
                 }  // foreach
                 
                 return lstElemIds;
           } // GetElementIdsInAssembly

The same comment asked:

Know of any way to find/replace text in the same export so we don’t have to in Notepad++ etc?   For our .pcf import to work correctly I need to replace the SCH40, SCH80, STD pipe weights with other text.

There are a wide variety of ways to programmatically parse text written to a file, but doing so is beyond the scope of this example.

Get AEC updates in your inbox

By clicking subscribe, I agree to receive the AEC newsletter and acknowledge the Autodesk Privacy Statement.