Exemplo n.º 1
0
            //
            // Copied from Revit SDK TraverseSystem example
            //
            // (C) Copyright 2003-2010 by Autodesk, Inc.
            //
            /// <summary>
            /// Get the mechanical or piping system
            /// from the connectors of selected element.
            /// </summary>
            /// <param name="connectors">Connectors of selected element</param>
            /// <returns>The found mechanical or piping system</returns>
            static public MEPSystem ExtractSystemFromConnectors(ConnectorSet connectors)
            {
                MEPSystem system = null;

                if (connectors == null || connectors.Size == 0)
                {
                    return(null);
                }

                // Get well-connected mechanical or
                // piping systems from each connector

                List <MEPSystem> systems = new List <MEPSystem>();

                foreach (Connector connector in connectors)
                {
                    MEPSystem tmpSystem = connector.MEPSystem;
                    if (tmpSystem == null)
                    {
                        continue;
                    }

                    MechanicalSystem ms = tmpSystem as MechanicalSystem;
                    if (ms != null)
                    {
                        if (ms.IsWellConnected)
                        {
                            systems.Add(tmpSystem);
                        }
                    }
                    else
                    {
                        PipingSystem ps = tmpSystem as PipingSystem;
                        if (ps != null && ps.IsWellConnected)
                        {
                            systems.Add(tmpSystem);
                        }
                    }
                }

                // If more than one system is found,
                // get the system contains the most elements

                int countOfSystem = systems.Count;

                if (countOfSystem != 0)
                {
                    int countOfElements = 0;
                    foreach (MEPSystem sys in systems)
                    {
                        if (sys.Elements.Size > countOfElements)
                        {
                            system          = sys;
                            countOfElements = sys.Elements.Size;
                        }
                    }
                }
                return(system);
            }
Exemplo n.º 2
0
        private static MEPSystem GetOrCreateMEPSystemOnConnector(Document m_document, Connector connector)
        {
            if (connector.MEPSystem == null)
            {
                //  if there is no system, let Revit automatically create it.  system will start from the connector and continue to the air terminal
                using (SubTransaction subTransaction = new SubTransaction(m_document))
                {
                    subTransaction.Start();
                    ConnectorSet csi = new ConnectorSet();
                    csi.Insert(connector);

                    MechanicalSystem mechSystem = m_document.Create.NewMechanicalSystem(null, csi, connector.DuctSystemType);
                    subTransaction.Commit();
                }
            }

            return(connector.MEPSystem);
        }
Exemplo n.º 3
0
        private MechanicalSystem CreateMechanicalSystem(ConnectorInfo baseConnector, ConnectorInfo[] connectors, DuctSystemType systemType)
        {
            ConnectorSet cset = null;

            if (connectors != null)
            {
                cset = new ConnectorSet();
                foreach (ConnectorInfo ci in connectors)
                {
                    cset.Insert(ci.Connector);
                }
            }

            MechanicalSystem mechanicalSystem = m_document.Create.
                                                NewMechanicalSystem(baseConnector == null ? null : baseConnector.Connector, cset, systemType);

            return(mechanicalSystem);
        }
Exemplo n.º 4
0
        public static void WriteMechanicalSystem(MechanicalSystem system)
        {
            string flow = InvalidString;

            try { flow = system.GetFlow().ToString(); }
            catch (Exception) { }

            Trace.WriteLine("Flow: " + flow);
            Trace.WriteLine("IsWellConnected: " + system.IsWellConnected);
            Trace.WriteLine("SystemType: " + system.SystemType);
            Trace.WriteLine("+DuctNetwork");
            Trace.Indent();
            foreach (Element element in system.DuctNetwork)
            {
                LogUtility.WriteElement(element, false);
                Trace.WriteLine("");
            }
            Trace.Unindent();
            WriteMEPSystem(system);
        }
Exemplo n.º 5
0
        private MEPSystem ExtractSystemFromConnectors(ConnectorSet connectors, Element selectEle)
        {
            MEPSystem system = null;

            if (connectors == null || connectors.Size == 0)
            {
                return(null);
            }

            List <MEPSystem> systems = new List <MEPSystem>();

            foreach (Connector connector in connectors)
            {
                MEPSystem tmpSystem = connector.MEPSystem;
                if (tmpSystem == null)
                {
                    continue;
                }

                MechanicalSystem ms = tmpSystem as MechanicalSystem;
                if (ms != null)
                {
                    systems.Add(tmpSystem);
                }
                else
                {
                    PipingSystem ps = tmpSystem as PipingSystem;
                    systems.Add(tmpSystem);
                }
            }
            //if there is more than one system is found, get system contain the selected element;
            foreach (MEPSystem sys in systems)
            {
                if (sys.GetParameters(selectEle.Name) != null)
                {
                    system = sys;
                }
            }
            return(system);
        }
Exemplo n.º 6
0
        //This method sets an element as the base equipment in a system
        public static void AddBaseEquipConnector(MEPSystem currentSys, Element e)
        {
            FamilyInstance   fi         = e as FamilyInstance;
            ConnectorSet     connSet    = null;
            MechanicalSystem mechSystem = currentSys as MechanicalSystem;
            List <ElementId> elementIds = new List <ElementId>();

            elementIds.Add(e.Id);


            if (fi == null || fi.MEPModel == null || mechSystem == null)
            {
                return;
            }

            connSet = fi.MEPModel.ConnectorManager.Connectors;


            foreach (Connector conn in connSet)
            {
                if (conn.MEPSystem == null || currentSys.Id == null)
                {
                    continue;
                }

                if (conn.MEPSystem.Id == currentSys.Id)
                {
                    //Revit defaulted the equipment to behave like a node
                    //To make it the base equipment for the system, we have to remove it as a node first
                    mechSystem.Remove(elementIds);

                    //Now we can set it as base equipment
                    mechSystem.BaseEquipmentConnector = conn;
                    continue;
                }
            }
        }
Exemplo n.º 7
0
        public Result Execute(
            ExternalCommandData commandData,
            ref string message,
            ElementSet elements)
        {
            UIApplication app   = commandData.Application;
            UIDocument    uidoc = app.ActiveUIDocument;
            Document      doc   = uidoc.Document;

            Transaction tx = new Transaction(doc,
                                             "New Duct System");

            tx.Start();

            ConnectorSet connectorSet = new ConnectorSet();

            Connector baseConnector = null;

            ConnectorSetIterator csi;

            // select a Parallel Fan Powered VAV
            // and some Supply Diffusers prior to running
            // this command

            //ElementSet selection = uidoc.Selection.Elements; // 2014

            foreach (ElementId id in uidoc.Selection.GetElementIds()) // 2015
            {
                Element e = doc.GetElement(id);

                if (e is FamilyInstance)
                {
                    FamilyInstance fi = e as FamilyInstance;

                    Family family = fi.Symbol.Family;

                    // assume the selected Mechanical Equipment
                    // is the base equipment for new system:

                    if (family.FamilyCategory.Name
                        == "Mechanical Equipment")
                    {
                        // find the "Out" and "SupplyAir" connectors
                        // on the base equipment

                        if (null != fi.MEPModel)
                        {
                            csi = fi.MEPModel.ConnectorManager
                                  .Connectors.ForwardIterator();

                            while (csi.MoveNext())
                            {
                                Connector conn = csi.Current as Connector;

                                if (conn.Direction == FlowDirectionType.Out &&
                                    conn.DuctSystemType == DuctSystemType.SupplyAir)
                                {
                                    baseConnector = conn;
                                    break;
                                }
                            }
                        }
                    }
                    else if (family.FamilyCategory.Name == "Air Terminals")
                    {
                        // add selected Air Terminals to
                        // connector set for new mechanical system

                        csi = fi.MEPModel.ConnectorManager
                              .Connectors.ForwardIterator();

                        csi.MoveNext();

                        connectorSet.Insert(csi.Current as Connector);
                    }
                }
            }

            // create a new SupplyAir mechanical system

            MechanicalSystem ductSystem = doc.Create.NewMechanicalSystem(
                baseConnector, connectorSet, DuctSystemType.SupplyAir);

            tx.Commit();
            return(Result.Succeeded);
        }
Exemplo n.º 8
0
        private void Stream( ArrayList data, MechanicalSystem mechSys )
        {
            data.Add( new Snoop.Data.ClassSeparator( typeof( MechanicalSystem ) ) );

              data.Add( new Snoop.Data.Object( "Base equipment connector", mechSys.BaseEquipmentConnector ) );
              data.Add( new Snoop.Data.Enumerable( "Duct network", mechSys.DuctNetwork ) );
              data.Add( new Snoop.Data.Double( "Flow", mechSys.Flow ) );
              data.Add( new Snoop.Data.Bool( "Is well connected", mechSys.IsWellConnected ) );
              data.Add( new Snoop.Data.Double( "Static pressure", mechSys.StaticPressure ) );
              data.Add( new Snoop.Data.String( "System type", mechSys.SystemType.ToString() ) );
        }
Exemplo n.º 9
0
        /// <summary>
        /// Write basic information of the MEP system into the XML file
        /// </summary>
        /// <param name="writer">XMLWriter object</param>
        private void WriteBasicInfo(XmlWriter writer)
        {
            MechanicalSystem ms = null;
            PipingSystem     ps = null;

            if (m_isMechanicalSystem)
            {
                ms = m_system as MechanicalSystem;
            }
            else
            {
                ps = m_system as PipingSystem;
            }

            // Write basic information of the system
            writer.WriteStartElement("BasicInformation");

            // Write Name property
            writer.WriteStartElement("Name");
            writer.WriteString(m_system.Name);
            writer.WriteEndElement();

            // Write Id property
            writer.WriteStartElement("Id");
            writer.WriteValue(m_system.Id.IntegerValue);
            writer.WriteEndElement();

            // Write UniqueId property
            writer.WriteStartElement("UniqueId");
            writer.WriteString(m_system.UniqueId);
            writer.WriteEndElement();

            // Write SystemType property
            writer.WriteStartElement("SystemType");
            if (m_isMechanicalSystem)
            {
                writer.WriteString(ms.SystemType.ToString());
            }
            else
            {
                writer.WriteString(ps.SystemType.ToString());
            }
            writer.WriteEndElement();

            // Write Category property
            writer.WriteStartElement("Category");
            writer.WriteAttributeString("Id", m_system.Category.Id.IntegerValue.ToString());
            writer.WriteAttributeString("Name", m_system.Category.Name);
            writer.WriteEndElement();

            // Write IsWellConnected property
            writer.WriteStartElement("IsWellConnected");
            if (m_isMechanicalSystem)
            {
                writer.WriteValue(ms.IsWellConnected);
            }
            else
            {
                writer.WriteValue(ps.IsWellConnected);
            }
            writer.WriteEndElement();

            // Write IsDefaultSystem property
            writer.WriteStartElement("IsDefaultSystem");
            writer.WriteValue(m_system.IsDefaultSystem);
            writer.WriteEndElement();

            // Write HasBaseEquipment property
            writer.WriteStartElement("HasBaseEquipment");
            bool hasBaseEquipment = ((m_system.BaseEquipment == null) ? false : true);

            writer.WriteValue(hasBaseEquipment);
            writer.WriteEndElement();

            // Write TerminalElementsCount property
            writer.WriteStartElement("TerminalElementsCount");
            writer.WriteValue(m_system.Elements.Size);
            writer.WriteEndElement();

            // Write Flow property
            writer.WriteStartElement("Flow");
            if (m_isMechanicalSystem)
            {
                writer.WriteValue(ms.Flow);
            }
            else
            {
                writer.WriteValue(ps.Flow);
            }
            writer.WriteEndElement();

            // Close basic information
            writer.WriteEndElement();
        }
Exemplo n.º 10
0
        //  Document doc;
        public Autodesk.Revit.UI.Result Execute(ExternalCommandData revit, ref string message, ElementSet elements)
        {
            //  doc = revit.Application.ActiveUIDocument.Document;
            // bg.DoWork += Bg_DoWork;

            //// TaskDialog.Show("Revit", "Hello World");
            // string value= UnitFormatUtils.Format(doc.GetUnits(), UnitType.UT_Piping_Slope, 0.0041, false, false);
            // revit.Application.ActiveUIDocument.Application.DialogBoxShowing += Application_DialogBoxShowing;
            // revit.Application.ActiveUIDocument.Application.ViewActivating += Application_ViewActivating;
            // if (value!=null)
            // {


            // }
            //  bg.RunWorkerAsync();


            // Form1 frm = new Form1(revit);
            // frm.Show();

            //var engine = Python.CreateEngine();
            //var paths = engine.GetSearchPaths();
            //List<string> src_path_list = new List<string>();
            //// src_path_list.Add(@"C:\Program Files (x86)\IronPython 2.7\Platforms\Net40\IronPython.Wpf.dll'");
            //paths.Add(@"D:\Revit-project\Api\DemoAddin\DemoAddin\Lib");
            //paths.Add(@"D:\Revit-project\Api\DemoAddin\DemoAddin\bin\Debug");
            //paths.Add(@"C:\Users\User\Downloads\pyRevit-4.7.4-final\pyRevit-4.7.4-final\pyrevitlib");
            //engine.SetSearchPaths(paths);
            // var source1 = engine.CreateScriptSourceFromFile(@"C:\Users\User\Downloads\pyRevit-4.7.4-final\pyRevit-4.7.4-final\bin\engines\pyRevitLoader.py");

            //  var scope1 = engine.CreateScope();
            //executing script in scope
            //  source1.Execute(scope1);
            // var builtin = IronPython.Hosting.Python.GetBuiltinModule(engine);
            // builtin.SetVariable("__revit__", revit.Application);
            // var source2 = engine.CreateScriptSourceFromFile(@"C:\Users\User\Downloads\pyRevit-4.7.4-final\pyRevit-4.7.4-final\extensions\pyRevitTools.extension\pyRevit.tab\Modify.panel\edit1.stack\Patterns.splitpushbutton\Make Pattern.pushbutton\patmaker.py");
            // // engine.ImportModule("framework");
            //// engine.SetSearchPaths(src_path_list);
            // var scope2 = engine.CreateScope();

            // //executing script in scope
            // source2.Execute(scope2);


            //var executor = new PyRevitLoader.ScriptExecutor(revit.Application); // uiControlledApplication);
            //Autodesk.Revit.UI.Result res = executor.ExecuteScript(@"C:\Users\User\Downloads\pyRevit-4.7.4-final\pyRevit-4.7.4-final\bin\engines\pyRevitLoader.py");


            //Autodesk.Revit.UI.Result res1 = executor.ExecuteScript(@"C:\Users\User\Downloads\pyRevit-4.7.4-final\pyRevit-4.7.4-final\extensions\pyRevitTools.extension\pyRevit.tab\Modify.panel\edit1.stack\Patterns.splitpushbutton\Make Pattern.pushbutton\patmaker.py");
            // PatTry(revit);

            Document       doc       = revit.Application.ActiveUIDocument.Document;
            Selection      s         = revit.Application.ActiveUIDocument.Selection;
            List <Element> elem_list = new List <Element>();

            if (s.GetElementIds().Count > 0)
            {
                FamilyInstance fi = doc.GetElement((s.GetElementIds().Cast <ElementId>().ToList().FirstOrDefault())) as FamilyInstance;
                foreach (Connector con in  fi.MEPModel.ConnectorManager.Connectors)
                {
                    if (con.MEPSystem != null)
                    {
                        if ((con.MEPSystem as PipingSystem) != null)
                        {
                            PipingSystem ps = (con.MEPSystem as PipingSystem);
                            foreach (Element elem in ps.PipingNetwork)
                            {
                                elem_list.Add(elem);
                            }
                        }
                        else if ((con.MEPSystem as MechanicalSystem) != null)
                        {
                            MechanicalSystem ms = (con.MEPSystem as MechanicalSystem);
                            foreach (Element elem in ms.DuctNetwork)
                            {
                                elem_list.Add(elem);
                            }
                        }
                    }
                }
            }
            if (elem_list.Count > 0)
            {
            }
            return(Result.Succeeded);
        }
Exemplo n.º 11
0
        public static List <TracedSpace> GetDownstreamRoomNames(FamilyInstance vavFamilyInstance, Document m_document, bool includeUnterminated)
        {
            List <TracedSpace> tracedSpaces         = new List <TracedSpace>();
            Element            terminalEquipElement = (Element)vavFamilyInstance;

            //string notTerminatedInRoomString = "ClosedDuctNotInSpace";

            //List<string> servedRoomNames = new List<string>();

            //  get connectors
            Connector[] familyInstanceConnectors = Util.GetConnectorsFromFamilyInstance(terminalEquipElement);

            List <Connector> downstreamConnectors = GetDownstreamConnectors(familyInstanceConnectors);

            if (downstreamConnectors.Count == 0)
            {
                return(tracedSpaces);
            }


            foreach (Connector terminalEquipConnector in downstreamConnectors)   // most terminal equipment would have just one downstream connector
            {
                //  get system for this connector
                MEPSystem connectorMEPSystem = null;
                connectorMEPSystem = GetOrCreateMEPSystemOnConnector(m_document, terminalEquipConnector);

                List <ElementId> elementIds = new List <ElementId>();
                elementIds.Add(terminalEquipElement.Id);

                MechanicalSystem connectorMechSystem = connectorMEPSystem as MechanicalSystem;

                ElementSet terminalElements = connectorMEPSystem.Elements;  // terminal element = elements at the end of the end of the branches; can return duct or family instances

                //Create a string of all Room Names & Numbers
                //Here we gather all elements connected to the system
                foreach (Element terminalElement in terminalElements)
                {
                    //  terminalElements contains the original equipment element.  need to ignore that when iterating because we just want the termination points
                    if (terminalElement.Id == vavFamilyInstance.Id)
                    {
                        continue;
                    }

                    FamilyInstance famInst        = terminalElement as FamilyInstance;
                    MEPCurve       ductInst       = terminalElement as Duct;
                    MEPCurve       flexDuctInst   = terminalElement as FlexDuct;
                    MEPCurve       ductEndSegment = ductInst ?? flexDuctInst;

                    //For each air terminal and equipment, identify the space it belongs to and add that as a parameter
                    //to the air terminal.  That way, the information is stored in case we want to unload the link.

                    if (famInst != null && famInst.Category.Id == m_document.Settings.Categories.get_Item(BuiltInCategory.OST_DuctFitting).Id)
                    {
                        continue;
                    }

                    TracedSpace tracedSpace = null;

                    if (famInst != null)
                    {
                        tracedSpace = GetServedSpaceForFI(famInst, terminalEquipElement.Id.IntegerValue);
                        tracedSpaces.Add(tracedSpace);
                    }
                    else if (ductEndSegment != null)
                    {
                        if (includeUnterminated)
                        {
                            tracedSpace = GetServedSpaceForOpenDuctEnd(m_document, ductEndSegment, terminalEquipElement.Id.IntegerValue);
                            tracedSpaces.Add(tracedSpace);
                        }
                    }
                }
            }

            return(tracedSpaces);
        }
Exemplo n.º 12
0
        public Result Run()
        {
            Trace.Listeners.Clear();
            Trace.AutoFlush = true;
            string outputFileName = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), "AutoRoute.log");

            if (File.Exists(outputFileName))
            {
                File.Delete(outputFileName);
            }
            TextWriterTraceListener listener = new TextWriterTraceListener(outputFileName);

            Trace.Listeners.Add(listener);

            //
            ElementClassFilter       systemTypeFilter = new ElementClassFilter(typeof(MEPSystemType));
            FilteredElementCollector C = new FilteredElementCollector(m_document);

            C.WherePasses(systemTypeFilter);
            foreach (MEPSystemType type in C)
            {
                if (type.SystemClassification == MEPSystemClassification.SupplyAir)
                {
                    m_systemTypeId = type.Id; //送风系统
                    break;
                }
            }

            Transaction transaction = new Transaction(m_document, "Sample_AutoRoute");

            try
            {
                transaction.Start();

                //标高
                m_level = Level.Create(m_document, 0.0);

                //Element
                List <Autodesk.Revit.DB.ElementId> ids = new List <ElementId>();
                ids.Add(new ElementId(730127)); //baseEquipment
                ids.Add(new ElementId(730237));
                ids.Add(new ElementId(730244));

                //Init Elements Info
                FamilyInstance[] instances = new FamilyInstance[3];
                BoundingBoxXYZ[] boxes     = new BoundingBoxXYZ[3];
                Connector[]      conns     = new Connector[3];

                ConnectorSetIterator csi = null;
                for (int i = 0; i < ids.Count; i++)
                {
                    Element element = m_document.GetElement(ids[i]);
                    if (null == element)
                    {
                        return(Result.Failed);
                    }

                    instances[i] = element as FamilyInstance;
                    csi          = ConnectorInfo.GetConnectors(element).ForwardIterator();
                    csi.MoveNext();
                    conns[i] = csi.Current as Connector;
                    boxes[i] = instances[i].get_BoundingBox(m_document.ActiveView);
                }

                //Find the "Out" and "SupplyAir" connector on the base equipment
                //the first element is base equipment
                var baseEquipment = instances[0];
                csi = ConnectorInfo.GetConnectors(baseEquipment).ForwardIterator();
                while (csi.MoveNext())
                {
                    Connector conn = csi.Current as Connector;
                    if (conn.Domain == Domain.DomainHvac ||
                        conn.Domain == Domain.DomainPiping)
                    {
                        //conn.Direction 只有DomainHvac和DomainPiping有
                        if (conn.Direction == FlowDirectionType.Out)
                        {
                            DuctSystemType ductSystemType = DuctSystemType.UndefinedSystemType;
                            try
                            {
                                //DuctSystemType PipeSystemType ElectricalSystemType
                                //每个连接件只有上述三个中的一个,调用其他时回报异常
                                ductSystemType = conn.DuctSystemType;
                            }
                            catch { continue; }
                            if (ductSystemType == DuctSystemType.SupplyAir)
                            {
                                conns[0] = conn;
                                break;
                            }
                        }
                    }
                }

                //mechanicalSystem
                m_mechanicalSystem = CreateMechanicalSystem(
                    //[378728][SupplyAir][Out][RectProfile][OST_MechanicalEquipment]
                    new ConnectorInfo(baseEquipment, conns[0].Origin.X, conns[0].Origin.Y, conns[0].Origin.Z),
                    new ConnectorInfo[] {
                    //[378707][SupplyAir][In][RectProfile]
                    new ConnectorInfo(instances[1], conns[1].Origin.X, conns[1].Origin.Y, conns[1].Origin.Z),
                    //[378716][SupplyAir][In][RectProfile]
                    new ConnectorInfo(instances[2], conns[2].Origin.X, conns[2].Origin.Y, conns[2].Origin.Z)
                },
                    DuctSystemType.SupplyAir
                    );

                //Get the boundary of the system
                double minX = conns[0].Origin.X;
                double minY = conns[0].Origin.Y;
                double maxX = conns[0].Origin.X;
                double maxY = conns[0].Origin.Y;
                double maxZ = conns[0].Origin.Z;
                for (int i = 1; i < boxes.Length; ++i)
                {
                    if (conns[i].Origin.X < minX)
                    {
                        minX = conns[i].Origin.X;
                    }
                    if (conns[i].Origin.Y < minY)
                    {
                        minY = conns[i].Origin.Y;
                    }
                    if (conns[i].Origin.X > maxX)
                    {
                        maxX = conns[i].Origin.X;
                    }
                    if (conns[i].Origin.Y > maxY)
                    {
                        maxY = conns[i].Origin.Y;
                    }
                    if (conns[i].Origin.Z > maxZ)
                    {
                        maxZ = conns[i].Origin.Z;
                    }
                }

                //Calculate the optional values(可选值) for the trunk ducts
                double   midX        = (minX + maxX) / 2;
                double   midY        = (minY + maxY) / 2;
                double[] baseXValues = new double[3] {
                    midX, (minX + midX) / 2, (maxX + midX) / 2
                };
                double[] baseYValues = new double[3] {
                    midY, (minY + midY) / 2, (maxY + midY) / 2
                };

                //ductType
                m_ductType = m_document.GetElement(m_ductTypeId) as DuctType;

                List <XYZ> points = new List <XYZ>();

                //conn[0]相关点
                #region conn[0]
                XYZ connectorDirection = conns[0].CoordinateSystem.BasisZ;
                if (0 == connectorDirection.DistanceTo(new XYZ(-1, 0, 0)))
                {
                    points.Add(new XYZ(conns[0].Origin.X - min1FittingLength, conns[0].Origin.Y, conns[0].Origin.Z));
                    points.Add(new XYZ(conns[0].Origin.X - min2FittingsLength, conns[0].Origin.Y, conns[0].Origin.Z + min1FittingLength));
                    points.Add(new XYZ(conns[0].Origin.X - min2FittingsLength, conns[0].Origin.Y, maxZ + verticalTrunkOffset - min1FittingLength));
                }
                else if (0 == connectorDirection.DistanceTo(new XYZ(1, 0, 0)))
                {
                    points.Add(new XYZ(conns[0].Origin.X + min1FittingLength, conns[0].Origin.Y, conns[0].Origin.Z));
                    points.Add(new XYZ(conns[0].Origin.X + min2FittingsLength, conns[0].Origin.Y, conns[0].Origin.Z + min1FittingLength));
                    points.Add(new XYZ(conns[0].Origin.X + min2FittingsLength, conns[0].Origin.Y, maxZ + verticalTrunkOffset - min1FittingLength));
                }
                else if (0 == connectorDirection.DistanceTo(new XYZ(0, -1, 0)))
                {
                    points.Add(new XYZ(conns[0].Origin.X, conns[0].Origin.Y - min1FittingLength, conns[0].Origin.Z));
                    points.Add(new XYZ(conns[0].Origin.X, conns[0].Origin.Y - min2FittingsLength, conns[0].Origin.Z + min1FittingLength));
                    points.Add(new XYZ(conns[0].Origin.X, conns[0].Origin.Y - min2FittingsLength, maxZ + verticalTrunkOffset - min1FittingLength));
                }
                else if (0 == connectorDirection.DistanceTo(new XYZ(0, 1, 0)))
                {
                    points.Add(new XYZ(conns[0].Origin.X, conns[0].Origin.Y + min1FittingLength, conns[0].Origin.Z));
                    points.Add(new XYZ(conns[0].Origin.X, conns[0].Origin.Y + min2FittingsLength, conns[0].Origin.Z + min1FittingLength));
                    points.Add(new XYZ(conns[0].Origin.X, conns[0].Origin.Y + min2FittingsLength, maxZ + verticalTrunkOffset - min1FittingLength));
                }
                #endregion

                //开始创建风管
                List <Duct>      ducts          = new List <Duct>();
                List <Connector> connectors     = new List <Connector>();
                List <Connector> baseConnectors = new List <Connector>();

                ducts.Add(Duct.Create(m_document, m_ductTypeId, m_level.Id, conns[0], points[0]));
                ducts.Add(Duct.Create(m_document, m_systemTypeId, m_ductTypeId, m_level.Id, points[1], points[2]));

                connectors.Add(ConnectorInfo.GetConnector(ducts[0], points[0]));
                connectors.Add(ConnectorInfo.GetConnector(ducts[1], points[1]));
                connectors.Add(ConnectorInfo.GetConnector(ducts[1], points[2]));

                //连接管道,二选一,效果是一样的
                //connectors[0].ConnectTo(connectors[1]);
                m_document.Create.NewElbowFitting(connectors[0], connectors[1]);

                baseConnectors.Add(connectors[2]);

                //Create the vertical ducts for terminals
                points.Clear();
                ducts.Clear();

                //conn[1] conn[2] 相关点
                points.Add(new XYZ(conns[1].Origin.X, conns[1].Origin.Y, maxZ + verticalTrunkOffset - min1FittingLength));
                points.Add(new XYZ(conns[2].Origin.X, conns[2].Origin.Y, maxZ + verticalTrunkOffset - min1FittingLength));

                ducts.Add(Duct.Create(m_document, m_ductTypeId, m_level.Id, conns[1], points[0]));
                ducts.Add(Duct.Create(m_document, m_ductTypeId, m_level.Id, conns[2], points[1]));
                baseConnectors.Add(ConnectorInfo.GetConnector(ducts[0], points[0]));
                baseConnectors.Add(ConnectorInfo.GetConnector(ducts[1], points[1]));


                ////最顶部的 baseConnectors 相关
                //SortConnectorsByX(baseConnectors);
                //for (int i = 0; i < baseYValues.Length; ++i)
                //{
                //    if (ConnectSystemOnXAxis(baseConnectors, baseYValues[i]))
                //    {
                //        LogUtility.WriteMechanicalSystem(m_mechanicalSystem);
                //        return Autodesk.Revit.UI.Result.Succeeded;
                //    }
                //}

                SortConnectorsByY(baseConnectors);
                for (int i = 0; i < baseXValues.Length; ++i)
                {
                    if (ConnectSystemOnYAxis(baseConnectors, baseXValues[i]))
                    {
                        LogUtility.WriteMechanicalSystem(m_mechanicalSystem);

                        transaction.Commit();
                        return(Autodesk.Revit.UI.Result.Succeeded);
                    }
                }


                ////如果任然无法连接,把干管放到maxbbox外
                //SortConnectorsByX(baseConnectors);
                //if (ConnectSystemOnXAxis(baseConnectors, maxY + horizontalOptionalTrunkOffset))
                //{
                //    LogUtility.WriteMechanicalSystem(m_mechanicalSystem);
                //    return Autodesk.Revit.UI.Result.Succeeded;
                //}

                //SortConnectorsByY(baseConnectors);
                //if (ConnectSystemOnYAxis(baseConnectors, maxX + horizontalOptionalTrunkOffset))
                //{
                //    LogUtility.WriteMechanicalSystem(m_mechanicalSystem);
                //    return Autodesk.Revit.UI.Result.Succeeded;
                //}


                ////如果任然无法连接,随便连一个,让revit报错吧
                //connectors.Clear();
                //SortConnectorsByX(baseConnectors);
                //connectors.AddRange(CreateDuct(new XYZ(baseConnectors[0].Origin.X + min1FittingLength, baseYValues[0], maxZ + verticalTrunkOffset), new XYZ(baseConnectors[1].Origin.X - min1FittingLength, baseYValues[0], maxZ + verticalTrunkOffset)));
                //connectors.AddRange(CreateDuct(new XYZ(baseConnectors[1].Origin.X + min1FittingLength, baseYValues[0], maxZ + verticalTrunkOffset), new XYZ(baseConnectors[2].Origin.X - min1FittingLength, baseYValues[0], maxZ + verticalTrunkOffset)));
                //ConnectWithElbowFittingOnXAxis(baseConnectors[0], connectors[0]);
                //ConnectWithElbowFittingOnXAxis(baseConnectors[2], connectors[3]);
                //ConnectWithTeeFittingOnXAxis(baseConnectors[1], connectors[1], connectors[2], false);
            }
            catch (Exception ex)
            {
                transaction.RollBack();
                Trace.WriteLine(ex.ToString());
                return(Autodesk.Revit.UI.Result.Failed);
            }
            finally
            {
                Trace.Flush();
                listener.Close();
                Trace.Close();
                Trace.Listeners.Remove(listener);
            }

            transaction.RollBack();
            return(Result.Succeeded);
        }