public static Duct MakeDuct(Document doc, XYZ p1, XYZ p2, ElementId typ, ElementId mst, object diameter, object insulationThick) { if (typ == null) { throw new ArgumentNullException("A Duct Type must be specified"); } // use default level (actually - it appears that this doesn't work??? ElementId level = new ElementId(-1); IList <Level> levelsBelow = getAllLevelsBelow(doc, Math.Min(p1.Z, p2.Z)); Level levElement = null; if (levelsBelow != null) { levElement = levelsBelow[0]; } else { levElement = getClosestLevel(doc, Math.Min(p1.Z, p2.Z)); } Duct d = Duct.Create(doc, mst, typ, levElement.Id, p1, p2); if (diameter != null) { if (diameter is String) { d.get_Parameter(BuiltInParameter.RBS_CURVE_DIAMETER_PARAM).SetValueString(diameter.ToString()); } if (diameter is double) { d.get_Parameter(BuiltInParameter.RBS_CURVE_DIAMETER_PARAM).Set(Convert.ToDouble(diameter)); } } if (insulationThick != null) { //if (insulationThick is String) //{ // d.get_Parameter(BuiltInParameter.RBS_PIPE_INSULATION_THICKNESS).SetValueString(insulationThick.ToString()); //} //if (insulationThick is double) //{ // double ins = Convert.ToDouble(insulationThick); // if (ins != 0) d.get_Parameter(BuiltInParameter.RBS_PIPE_INSULATION_THICKNESS).Set(Convert.ToDouble(insulationThick)); //} double thick = Convert.ToDouble(insulationThick); if (thick > 0) { DuctInsulation test = DuctInsulation.Create(doc, d.Id, new ElementId(-1), Convert.ToDouble(insulationThick)); } } return(d); }
private int IsHorizontal(Duct el) { var top = el.get_Parameter(BuiltInParameter.RBS_DUCT_TOP_ELEVATION).AsDouble(); var bottom = el.get_Parameter(BuiltInParameter.RBS_DUCT_BOTTOM_ELEVATION).AsDouble(); var height_p1 = el.get_Parameter(BuiltInParameter.RBS_CURVE_HEIGHT_PARAM); var height_p2 = el.get_Parameter(BuiltInParameter.RBS_CURVE_DIAMETER_PARAM); var height = height_p1 != null?height_p1.AsDouble() : height_p2.AsDouble(); var diff = Math.Abs(top - bottom - height); var state = diff * 304.8 < 0.1; return(Convert.ToInt32(state)); }
private string GetSizeText(Duct el) { // вычисляемый стандартный параметр "Размер" string currentSize = el.get_Parameter(BuiltInParameter.RBS_CALCULATED_SIZE).AsString(); // прямоугольные воздуховоды if (currentSize.Contains("x")) { List <int> partSize = new List <int>(); Regex regex = new Regex(@"\d+"); foreach (Match match in regex.Matches(currentSize)) { int x; if (Int32.TryParse(match.Value, out x)) { partSize.Add(x); } } // соединяем обратно от большего к меньшему string reorderedSize = String.Join("x", partSize.OrderByDescending(i => i)); return(reorderedSize); } // круглые воздуховоды else { return(currentSize); } }
//============================================== /// <summary> /// Generate a Transform instance which as Transform property of BoundingBoxXYZ, /// when the user select a beam, this method will be called /// </summary> /// <returns>the reference of Transform, return null if it can't be generated</returns> Transform GenerateDuctTransform() { Transform transform = null; Duct instance = m_currentComponent as Duct; // First check whether the beam is horizontal. // In order to predigest the calculation, only allow it to be horizontal //double startOffset = instance.get_Parameter(BuiltInParameter.STRUCTURAL_BEAM_END0_ELEVATION).AsDouble(); //var startOffset2 = instance.get_Parameter(BuiltInParameter.RBS_DUCT_SLOPE); double ductSlope = instance.get_Parameter(BuiltInParameter.RBS_DUCT_SLOPE).AsDouble(); if (ductSlope != 0) { m_errorInformation = "Please select a horizontal duct."; return(transform); } int nDucts = 0; int nCurves = 0; LocationCurve lc = instance.Location as LocationCurve; Debug.Assert(null != lc, "expected duct to have valid location curve."); if (null != lc) { ++nCurves; Curve c = lc.Curve; // Now I am sure I can create a transform instance. transform = Transform.Identity; // Third find the middle point of the line and set it as Origin property. Autodesk.Revit.DB.XYZ startPoint = c.GetEndPoint(0); Autodesk.Revit.DB.XYZ endPoint = c.GetEndPoint(1); Autodesk.Revit.DB.XYZ midPoint = XYZMath.FindMidPoint(startPoint, endPoint); transform.Origin = midPoint; // At last find out the directions of the created view, and set it as Basis property. Autodesk.Revit.DB.XYZ basisZ = XYZMath.FindDirection(startPoint, endPoint); Autodesk.Revit.DB.XYZ basisX = XYZMath.FindRightDirection(basisZ); Autodesk.Revit.DB.XYZ basisY = XYZMath.FindUpDirection(basisZ); transform.set_Basis(0, basisX); transform.set_Basis(1, basisY); transform.set_Basis(2, basisZ); } return(transform); }
private string GetDuctClass(Duct el) { bool isInsul = el.get_Parameter(BuiltInParameter.RBS_REFERENCE_INSULATION_THICKNESS).AsDouble() > 0; /* 23.06.2020 Попросили убрать логику с поиском огнезащиты, теперь просто маркируем все с изоляцией * * string insulType = el.get_Parameter(BuiltInParameter.RBS_REFERENCE_INSULATION_TYPE).AsString(); * Element[] insulTypes = new FilteredElementCollector(doc).OfClass(typeof(DuctInsulationType)).Where(x => x.Name == insulType).ToArray(); * // Параметр "Комментарий к типоразмеру" * string comment = insulTypes.Length > 0 ? insulTypes[0].get_Parameter(BuiltInParameter.ALL_MODEL_TYPE_COMMENTS).AsString() : ""; * if (insulTypes.Length > 0 && comment?.IndexOf("огнезащит", StringComparison.OrdinalIgnoreCase) >= 0) return "B с огнезащитой"; */ if (isInsul) { return("B в изоляции"); } else { return("А"); } }
private void CreateDucts(int jndex) { if (sortedlocalsTech.ElementAt(jndex).ElementAt(0).Name.Contains("GT24")) { Debug.WriteLine("TEST GAINE 24"); } Debug.WriteLine(jndex); ElementId levelId = ElementId.InvalidElementId; tiltingSpaces.Clear(); GetBestPath(); GetTiltingSpace(); GetBestPosition(); currentConn = null; for (int i = 0; i < sortedlocalsTech.ElementAt(jndex).Count();) { if (sortedlocalsTech.ElementAt(jndex).Count() == 1) { Debug.WriteLine("i: " + i); break; } Element e = doc.GetElement(sortedlocalsTech.ElementAt(jndex).ElementAt(i).Id); var space = doc.GetElement(sortedlocalsTech.ElementAt(jndex).ElementAt(i).Id) as Space; try { if (i >= RevitDataContext.lazyInstance.SpacesInfo.Count()) { break; } SpatialElementGeometryCalculator calculator = new SpatialElementGeometryCalculator(doc); SpatialElementGeometryResults results = calculator.CalculateSpatialElementGeometry(space); // compute the room geometry Solid roomSolid = results.GetGeometry(); List <Face> lf = new List <Face>(); List <XYZ> Edges = new List <XYZ>(); List <XYZ> temp = new List <XYZ>(); foreach (Face face in roomSolid.Faces) { foreach (EdgeArray item in face.EdgeLoops) { List <XYZ> lc = JtBoundingBoxXyzExtensionMethods.GetPolygon(item); foreach (var subitem in lc) { temp.Add(subitem); } } } XYZ tempXYZ = null; #region delete identical points, Distinct() linq not that smart foreach (var item in temp) { if (tempXYZ == null) { tempXYZ = item; Edges.Add(item); } else { bool isPresent = false; foreach (var item2 in Edges) { if (item.X == item2.X && item.Y == item2.Y && item.Z == item2.Z) { isPresent = true; } } if (isPresent == false) { Edges.Add(item); } } } #endregion Level currentLevel = null; //Get the duct Type FilteredElementCollector collector1 = new FilteredElementCollector(doc); collector1.OfClass(typeof(DuctType)); DuctType ductType = null; foreach (Element elem in collector1) { /** * Raccord avec té et coude droit * Raccord par té avec coude segmenté * Raccord par piquage et coude segmenté * Raccord par té et coude droit * Raccord par piquage et coude droit * Raccord avec té et coude segmenté * Raccord par piquage et coude à rayon * Raccord par piquage et coude segmenté * Raccord par piquage et coude droit * Raccord par piquage et coude lisse * Raccord avec té et coude lisse * Synoptique de désenfumage * Raccord par piquage et coude droit chanfreiné * Raccord avec té et coude à rayon **/ if (elem.Name == "Raccord avec té et coude lisse" || elem.Name == "Connection with tee and smooth elbow") // gerer english { ductType = elem as DuctType; } } FilteredElementCollector collector2 = new FilteredElementCollector(doc); collector2.OfClass(typeof(MechanicalSystemType)).OfCategory(BuiltInCategory.OST_DuctSystem); MechanicalSystemType mechType = null; foreach (Element e1 in collector2) { /** * Désenfumage air neuf * Conduit de Fumée * Soufflage * Reprise * Extraction * VMC * Desenfumage Extraction * Air Neuf * Rejet * Desenfumage Air Neuf * Soufflage Recylage * Reprise Recyclage * Soufflage VC * Soufflage CTA * .. **/ if (e1.Name == "VMC" || e1.Name == "CMV") // gerer english { mechType = e1 as MechanicalSystemType; } } /** * Get next space **/ bool GetMe = false; int at = 0; foreach (var key in RevitDataContext.lazyInstance.SpacesInfo.Keys) { if (key.Number == space.Number) { GetMe = true; } if (GetMe == true) { if (at != 0) { at -= 1; } break; } at += 1; } currentLevel = e.Document.GetElement(e.LevelId) as Level; XYZ startingPoint = null; XYZ endingPoint = null; /** * Get the starting point shifted depending on next space location * */ Utils.lazyInstance.GetLowestAndHighestPolygon(RevitDataContext.lazyInstance.SpacesInfo.ElementAt(i).Value.Item2, space.Level); List <XYZ> test1 = new List <XYZ>(); List <XYZ> test2 = new List <XYZ>(); test1 = Utils.lazyInstance.lowestPolyg; test2 = Utils.lazyInstance.highestPolyg; if (test1.Count() != 0 && test2.Count() != 0) { startingPoint = Utils.lazyInstance.GetCenterOfPolygon(test1); endingPoint = Utils.lazyInstance.GetCenterOfPolygon(test2); } Utils.lazyInstance.GetLowestAndHighestPolygon(RevitDataContext.lazyInstance.SpacesInfo.ElementAt(correspSmallestSpaces[i]).Value.Item2, RevitDataContext.lazyInstance.SpacesInfo.ElementAt(correspSmallestSpaces[i]).Key.Level); List <XYZ> test5 = new List <XYZ>(); List <XYZ> test6 = new List <XYZ>(); test5 = Utils.lazyInstance.lowestPolyg; test6 = Utils.lazyInstance.highestPolyg; XYZ SendingPoint = Utils.lazyInstance.GetCenterOfPolygon(test6); startingPoint = Utils.lazyInstance.GetCenterOfPolygon(test5); Duct duct = null; Connector ductStart = null; Connector ductEnd = null; Utils.lazyInstance.GetLowestAndHighestPolygon(RevitDataContext.lazyInstance.SpacesInfo.ElementAt(i).Value.Item2, RevitDataContext.lazyInstance.SpacesInfo.ElementAt(i).Key.Level); List <XYZ> test3 = new List <XYZ>(); List <XYZ> test4 = new List <XYZ>(); test3 = Utils.lazyInstance.lowestPolyg; test4 = Utils.lazyInstance.highestPolyg; endingPoint = new XYZ(SendingPoint.X, SendingPoint.Y, Utils.lazyInstance.GetCenterOfPolygon(test4).Z); if (tiltingSpaces.Contains(correspSmallestSpaces[i]) && i != RevitDataContext.lazyInstance.SpacesInfo.Count() - 1) { XYZ nSt = new XYZ(startingPoint.X - 0.1, startingPoint.Y, startingPoint.Z - 0.8); startingPoint = nSt; } Debug.WriteLine("i: " + i); if (!tiltingSpaces.Contains(i) || i == 0 || i == tiltingSpaces.LastOrDefault()) { if (currentConn != null) { XYZ nStart1 = currentConnOrigin; endingPoint = nStart1; } using (Transaction tr = new Transaction(doc)) { tr.Start("Create New Duct"); { if (currentConn == null) { duct = Duct.Create(doc, mechType.Id, ductType.Id, RevitDataContext.lazyInstance.SpacesInfo.ElementAt(i).Key.LevelId, startingPoint, endingPoint); } else { duct = Duct.Create(doc, ductType.Id, RevitDataContext.lazyInstance.SpacesInfo.ElementAt(i).Key.LevelId, currentConn, startingPoint); Debug.WriteLine("currentConn.Origin: " + currentConn.Origin); Debug.WriteLine("startingPoint Origin: " + startingPoint); } Parameter parameter = duct.get_Parameter(BuiltInParameter.RBS_CURVE_DIAMETER_PARAM); parameter.Set(diameter); List <Connector> lC = new List <Connector>(); foreach (Connector conn in duct.ConnectorManager.Connectors) { if (conn.ConnectorType == ConnectorType.End) { lC.Add(conn); } } if (lC.ElementAt(0).Origin.Z > lC.ElementAt(1).Origin.Z) { ductStart = lC.ElementAt(1); ductEnd = lC.ElementAt(0); } else { ductStart = lC.ElementAt(0); ductEnd = lC.ElementAt(1); } if (currentConn == null) { currentConnectors.Add("start" + i, ductStart); currentConnectors.Add("end" + i, ductEnd); } else { currentConnectors.Add("start" + i, currentConn); currentConnectors.Add("end" + i, ductEnd); doc.Create.NewElbowFitting(ductStart, currentConn); } Debug.WriteLine("Passed, ductStart.Origin : " + ductStart.Origin); tr.Commit(); currentConn = ductEnd; } } } // is getting tilted if (tiltingSpaces.Contains(correspSmallestSpaces[i]) && i != RevitDataContext.lazyInstance.SpacesInfo.Count() - 1 && correspSmallestSpaces[i] != RevitDataContext.lazyInstance.SpacesInfo.Count() - 1) { Utils.lazyInstance.GetLowestAndHighestPolygon(RevitDataContext.lazyInstance.SpacesInfo.ElementAt(correspSmallestSpaces[i + 1]).Value.Item2, RevitDataContext.lazyInstance.SpacesInfo.ElementAt(correspSmallestSpaces[i + 1]).Key.Level); List <XYZ> test7 = new List <XYZ>(); test7 = Utils.lazyInstance.lowestPolyg; var tempZ = startingPoint.Z; endingPoint = new XYZ(Utils.lazyInstance.GetCenterOfPolygon(test7).X, Utils.lazyInstance.GetCenterOfPolygon(test7).Y, tempZ); if (currentConn != null) { Utils.lazyInstance.GetLowestAndHighestPolygon(RevitDataContext.lazyInstance.SpacesInfo.ElementAt(correspSmallestSpaces[correspSmallestSpaces[i] + 1]).Value.Item2, RevitDataContext.lazyInstance.SpacesInfo.ElementAt(correspSmallestSpaces[i + 1]).Key.Level); List <XYZ> test77 = new List <XYZ>(); test77 = Utils.lazyInstance.lowestPolyg; var tempZZ = startingPoint.Z; endingPoint = new XYZ(Utils.lazyInstance.GetCenterOfPolygon(test77).X, Utils.lazyInstance.GetCenterOfPolygon(test77).Y, tempZ); } using (Transaction tr2 = new Transaction(doc)) { tr2.Start("Create New Tilting Duct"); { duct = Duct.Create(doc, mechType.Id, ductType.Id, RevitDataContext.lazyInstance.SpacesInfo.ElementAt(i).Key.LevelId, startingPoint, endingPoint); Debug.WriteLine("startingPoint Origin: " + startingPoint); Debug.WriteLine("endingPoint.Origin: " + endingPoint); Parameter parameter = duct.get_Parameter(BuiltInParameter.RBS_CURVE_DIAMETER_PARAM); parameter.Set(diameter); List <Connector> lC = new List <Connector>(); foreach (Connector conn in duct.ConnectorManager.Connectors) { if (conn.ConnectorType == ConnectorType.End) { lC.Add(conn); } } int tempi = i + 1; if (i != 0) { tempi = correspSmallestSpaces[correspSmallestSpaces[i] + 1]; } // getting the right start and end duct Utils.lazyInstance.GetLowestAndHighestPolygon(RevitDataContext.lazyInstance.SpacesInfo.ElementAt(tempi).Value.Item2, RevitDataContext.lazyInstance.SpacesInfo.ElementAt(tempi).Key.Level); List <XYZ> test8 = new List <XYZ>(); test8 = Utils.lazyInstance.lowestPolyg; lC = Utils.lazyInstance.GetClosestConnector(lC, Utils.lazyInstance.GetCenterOfPolygon(test8)); ductStart = lC.ElementAt(0); ductEnd = lC.ElementAt(1); currentConnOrigin = ductStart.Origin; test11 = ductEnd.Origin; Debug.WriteLine("Start of tilting is :" + ductStart.Origin); Debug.WriteLine("end of tilting is :" + ductEnd.Origin); currentConn = ductStart; doc.Create.NewElbowFitting(ductEnd, currentConnectors.ElementAt(currentConnectors.Count() - 1).Value); currentConnectors.Add("startTilted" + i, ductStart); currentConnectors.Add("endTilted" + i, ductEnd); } tr2.Commit(); } } i = correspSmallestSpaces[i] + 1; currentElement = e; } catch (Exception ex) { break; } } }
private double GetDuctThickness(Duct el) { double thickness = -1; bool isInsul = el.get_Parameter(BuiltInParameter.RBS_REFERENCE_INSULATION_THICKNESS).AsDouble() > 0; string systemType = el.get_Parameter(BuiltInParameter.RBS_DUCT_SYSTEM_TYPE_PARAM).AsValueString(); bool isRect = false; bool isRound = false; double size; try { size = el.Width >= el.Height ? el.Width : el.Height; isRect = true; } catch { size = el.Diameter; isRound = true; } size = UnitUtils.ConvertFromInternalUnits(size, DisplayUnitType.DUT_MILLIMETERS); if (systemType.IndexOf("дым", StringComparison.OrdinalIgnoreCase) >= 0) { thickness = 1.0; } else { if (isRect) { if (size <= 250) { thickness = isInsul ? 0.8 : 0.5; } else if (250 < size && size <= 1000) { thickness = isInsul ? 0.8 : 0.7; } else if (1000 < size && size <= 2000) { thickness = isInsul ? 0.9 : 0.9; } } else if (isRound) { if (size <= 200) { thickness = isInsul ? 0.8 : 0.5; } else if (200 < size && size <= 450) { thickness = isInsul ? 0.8 : 0.6; } else if (450 < size && size <= 800) { thickness = isInsul ? 0.8 : 0.7; } else if (800 < size && size <= 1250) { thickness = isInsul ? 1.0 : 1.0; } } } thickness = UnitUtils.ConvertToInternalUnits(thickness, DisplayUnitType.DUT_MILLIMETERS); return(thickness); }