There are 3 ways to create new ducts, flex ducts, pipes and flex pipes. They can be created between two points, between two connectors, or between a point and a connector. Additionally, when creating one of these types of MEPCurves between two points, the static Create() method of the corresponding class can be used.
The following code creates a new pipe between two points using the Autodesk.Revit.Creation.Document.NewPipe() method. New flex pipes, ducts and flex ducts can all be created similarly.
Code Region: Creating a new Pipe using NewPipe() method |
public Pipe CreateNewPipe(Document document) { // find a pipe type FilteredElementCollector collector = new FilteredElementCollector(document); collector.OfClass(typeof(PipeType)); PipeType pipeType = collector.FirstElement() as PipeType; Pipe pipe = null; if (null != pipeType) { // create pipe between 2 points XYZ p1 = new XYZ(0, 0, 0); XYZ p2 = new XYZ(10, 0, 0); pipe = document.Create.NewPipe(p1, p2, pipeType); } return pipe; } |
Code Region: Creating a new FlexPipe using static Create() method |
public FlexPipe CreateFlexPipe(Document document, Level level) { // find a pipe type FilteredElementCollector collector = new FilteredElementCollector(document); collector.OfClass(typeof(FlexPipeType)); ElementId pipeTypeId = collector.FirstElementId(); // find a pipe system type FilteredElementCollector sysCollector = new FilteredElementCollector(document); sysCollector.OfClass(typeof(PipingSystemType)); ElementId pipeSysTypeId = sysCollector.FirstElementId(); FlexPipe pipe = null; if (pipeTypeId != ElementId.InvalidElementId && pipeSysTypeId != ElementId.InvalidElementId) { // create flex pipe with 3 points List<XYZ> points = new List<XYZ>(); points.Add(new XYZ(0, 0, 0)); points.Add(new XYZ(10, 10, 0)); points.Add(new XYZ(10, 0, 0)); pipe = FlexPipe.Create(document, pipeSysTypeId, pipeTypeId, level.Id, points); } return pipe; } |
After creating a pipe, you might want to change the diameter. The Diameter property of Pipe is read-only. To change the diameter, get the RBS_PIPE_DIAMETER_PARAM built-in parameter.
Code Region: Changing pipe diameter |
public void ChangePipeSize(Pipe pipe) { Parameter parameter = pipe.get_Parameter(BuiltInParameter.RBS_PIPE_DIAMETER_PARAM); string message = "Pipe diameter: " + parameter.AsValueString(); parameter.Set(0.5); // set to 6" message += "\nPipe diameter after set: " + parameter.AsValueString(); MessageBox.Show(message, "Revit"); } |
Another common way to create a new duct or pipe is between two existing connectors, as the following example demonstrates. In this example, it is assumed that 2 elements with connectors have been selected in Revit MEP, one being a piece of mechanical equipment and the other a duct fitting with a connector that lines up with the SupplyAir connector on the equipment.
Code Region: Adding a duct between two connectors |
public Duct CreateDuctBetweenConnectors(UIDocument uiDocument) { // prior to running this example // select some mechanical equipment with a supply air connector // and an elbow duct fitting with a connector in line with that connector Connector connector1 = null, connector2 = null; ConnectorSetIterator csi = null; ElementSet selection = uiDocument.Selection.Elements; // First find the selected equipment and get the correct connector foreach (Element e in selection) { if (e is FamilyInstance) { FamilyInstance fi = e as FamilyInstance; Family family = fi.Symbol.Family; if (family.FamilyCategory.Name == "Mechanical Equipment") { csi = fi.MEPModel.ConnectorManager.Connectors.ForwardIterator(); while (csi.MoveNext()) { Connector conn = csi.Current as Connector; if (conn.Direction == FlowDirectionType.Out && conn.DuctSystemType == DuctSystemType.SupplyAir) { connector1 = conn; break; } } } } } // next find the second selected item to connect to foreach(Element e in selection) { if (e is FamilyInstance) { FamilyInstance fi = e as FamilyInstance; Family family = fi.Symbol.Family; if (family.FamilyCategory.Name != "Mechanical Equipment") { csi = fi.MEPModel.ConnectorManager.Connectors.ForwardIterator(); while (csi.MoveNext()) { if (null == connector2) { Connector conn = csi.Current as Connector; // make sure to choose the connector in line with the first connector if (Math.Abs(conn.Origin.Y - connector1.Origin.Y) < 0.001) { connector2 = conn; break; } } } } } } Duct duct = null; if (null != connector1 && null != connector2) { // find a duct type FilteredElementCollector collector = new FilteredElementCollector(uiDocument.Document); collector.OfClass(typeof(DuctType)); // Use Linq query to make sure it is one of the rectangular duct types var query = from element in collector where element.Name.Contains("Mitered Elbows") == true select element; // use extension methods to get first duct type DuctType ductType = collector.Cast<DuctType>().First<DuctType>(); if (null != ductType) { duct = uiDocument.Document.Create.NewDuct(connector1, connector2, ductType); } } return duct; } |
Below is the result of running this code after selecting a VAV Unit - Parallel Fan Powered and a rectangular elbow duct fitting.
Figure 166: New duct added between selected elements
Pipe and duct insulation and lining can be added as separate objects associated with ducts and pipes. The ids of insulation elements associated with a duct or pipe can be retrieved using the static method InsulationLiningBase.GetInsulationIds() while the ids of lining elements can be retreived using the static method InsulationLiningBase.GetLiningIds().
To create new insulations associated with a given duct, pipe, fitting, accessory, or content use the corresponding static method: DuctInsulation.Create() or PipeInsulation.Create(). DuctLining.Create() can be used to create a new instance of a lining applied to the inside of a given duct, fitting or accessory.