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); }
private void UpdatePluntSystem(List <FamilyInstance> allPlunts, ref List <FamilyInstance> failedPlunts) { UI.ProgressBar pBar = new UI.ProgressBar("Назначение систем", allPlunts.Count); foreach (FamilyInstance plunt in allPlunts) { Space space = GetSpaceOfPlant(plunt); string systemName = null; if (space != null) { string systemTypeName = plunt.get_Parameter(BuiltInParameter.RBS_DUCT_SYSTEM_TYPE_PARAM).AsValueString(); string systemClassName = plunt.get_Parameter(BuiltInParameter.RBS_SYSTEM_CLASSIFICATION_PARAM).AsString(); if (systemTypeName == suplySystemTypeName) { systemName = space.LookupParameter(supplySystemParameterName).AsString(); } else if (systemTypeName == exhaustSystemTypeName) { systemName = space.LookupParameter(exhaustSystemParameterName).AsString(); } /*else if (systemTypeName == "Не определено") * { * if (systemClassName == "Приточный воздух") systemName = space.LookupParameter(supplySystemParameterName).AsString(); * else if (systemClassName == "Отработанный воздух") systemName = space.LookupParameter(exhaustSystemParameterName).AsString(); * }*/ if (systemName != null) { ConnectorSet connectors = plunt.MEPModel.ConnectorManager.Connectors; Connector baseConnector = connectors.Cast <Connector>().FirstOrDefault(); MEPSystem fromSystem = baseConnector?.MEPSystem; MEPSystem toSystem = new FilteredElementCollector(doc).OfClass(typeof(MEPSystem)).Cast <MEPSystem>().Where(x => x.Name == systemName).FirstOrDefault(); if (fromSystem?.Id.IntegerValue == toSystem?.Id.IntegerValue) { continue; } if (fromSystem == null && toSystem == null) { DuctSystemType ductType = DuctSystemType.UndefinedSystemType; if (systemTypeName == suplySystemTypeName) { ductType = DuctSystemType.SupplyAir; } else if (systemTypeName == exhaustSystemTypeName) { ductType = DuctSystemType.ExhaustAir; } toSystem = doc.Create.NewMechanicalSystem(null, connectors, ductType); toSystem.Name = systemName; } else if (fromSystem == null && toSystem != null) { toSystem.Add(connectors); } else if (fromSystem != null && toSystem == null) { fromSystem.Name = systemName; } else if (fromSystem != null && toSystem != null) { try { if (fromSystem.ConnectorManager.Connectors.Size > 1) { ConnectorSet smallSet = new ConnectorSet(); smallSet.Insert(baseConnector); fromSystem.Remove(smallSet); toSystem.Add(smallSet); } else { failedPlunts.Add(plunt); } } catch (Autodesk.Revit.Exceptions.ArgumentException) { failedPlunts.Add(plunt); } finally { pBar.StepUp(); } } } else { failedPlunts.Add(plunt); } } pBar.StepUp(); } }
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); }
public static Connector GetProperConnector(FamilyInstance fi, FlowDirectionType dir, DuctSystemType dst) { if (fi.MEPModel == null) { return(null); } foreach (Connector conn in fi.MEPModel.ConnectorManager.Connectors) { if ((conn.Direction == dir) && (conn.DuctSystemType == dst)) { return(conn); } } return(null); }