// // 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); }
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); }
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); }
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); }
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); }
//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; } } }
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); }
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() ) ); }
/// <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(); }
// 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); }
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); }
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); }