| | |
| | | using Autodesk.Revit.Creation; |
| | | using Autodesk.Revit.DB; |
| | | using Autodesk.Revit.DB.Architecture; |
| | | using Autodesk.Revit.DB; |
| | | using Autodesk.Revit.DB.Mechanical; |
| | | using Autodesk.Revit.DB.Plumbing; |
| | | using HStation.RevitDev.RevitDataExport; |
| | | using HStation.RevitDev.RevitDataExport.Common; |
| | | using HStation.RevitDev.RevitDataExport.Utility; |
| | | using Newtonsoft.Json.Linq; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text.RegularExpressions; |
| | | using Document = Autodesk.Revit.DB.Document; |
| | | |
| | | namespace Glodon.Revit.Utility |
| | | { |
| | | public class ParameterOperator |
| | | { |
| | | public static bool ProcessingManualParameter(Element elem, JObject ret, string paramName) |
| | | { |
| | | if (paramName.ToUpper() == "名称") |
| | | { |
| | | var name = GetParameterValueAsString(elem, "名称"); |
| | | if (string.IsNullOrEmpty(name)) |
| | | { |
| | | name = elem.Name; |
| | | } |
| | | ret["名称"] = name; |
| | | return true; |
| | | } |
| | | else if (paramName.ToUpper() == "ID") |
| | | { |
| | | ret["ID"] = elem.Id.IntegerValue.ToString(); |
| | | return true; |
| | | } |
| | | else if (paramName == "编码") |
| | | { |
| | | var code = GetParameterValueAsString(elem, "编码"); |
| | | if (string.IsNullOrEmpty(code)) |
| | | { |
| | | code = elem.Id.IntegerValue.ToString(); |
| | | } |
| | | ret["编码"] = code; |
| | | return true; |
| | | } |
| | | else if (paramName == "位置") |
| | | { |
| | | SetPosition(elem, ret); |
| | | return true; |
| | | } |
| | | else if (paramName == "属性值列表") |
| | | { |
| | | SetParameters(elem, ret); |
| | | return true; |
| | | } |
| | | else if (paramName == "上游节点编码") |
| | | { |
| | | return SetUpperElement(elem, ret); |
| | | } |
| | | else if (paramName == "下游节点编码") |
| | | { |
| | | return SetDownElement(elem, ret); |
| | | } |
| | | else if (paramName == "标签") |
| | | { |
| | | return SetFlag(elem, ret); |
| | | } |
| | | else if (paramName == "标高") |
| | | { |
| | | Level level = elem.GetLevel(); |
| | | double offsetValue = 0; |
| | | var offset = elem.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM); |
| | | if (offset != null) |
| | | { |
| | | offsetValue = offset.AsDouble(); |
| | | } |
| | | ret["标高"] = (level?.Elevation + offsetValue).InnerToMM(); |
| | | return true; |
| | | } |
| | | else if (paramName == "池底标高") |
| | | { |
| | | Level level = elem.GetLevel(); |
| | | double offsetValue = 0; |
| | | var offset = elem.get_Parameter(BuiltInParameter.INSTANCE_FREE_HOST_OFFSET_PARAM); |
| | | if (offset != null) |
| | | { |
| | | offsetValue = offset.AsDouble(); |
| | | } |
| | | ret["池底标高"] = (level?.Elevation + offsetValue).InnerToMM(); |
| | | return true; |
| | | } |
| | | else |
| | | { |
| | | return false; |
| | | } |
| | | } |
| | | |
| | | private static bool SetFlag(Element elem, JObject ret) |
| | | { |
| | | string strFlag = GetParameterValueAsString(elem, "标签"); |
| | | JArray jArray = new JArray(); |
| | | if (!string.IsNullOrEmpty(strFlag)) |
| | | { |
| | | var flags = strFlag.Split(','); |
| | | foreach (var flag in flags) |
| | | { |
| | | jArray.Add(new JValue(flag)); |
| | | } |
| | | } |
| | | ret["标签"] = jArray; |
| | | return true; |
| | | } |
| | | |
| | | private static bool SetDownElement(Element elem, JObject ret) |
| | | { |
| | | var id = elem.Id.IntegerValue.ToString(); |
| | | if (elem is FamilyInstance fi) |
| | | { |
| | | var mepModel = (elem as FamilyInstance)?.MEPModel; |
| | | if (mepModel == null) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | var ids = GetConnectElements(mepModel.ConnectorManager.Connectors, FlowDirectionType.Out); |
| | | var strIds = ids.Select(x => x.IntegerValue.ToString()).ToArray(); |
| | | var retStr = string.Join(",", strIds); |
| | | ret["下游节点编码"] = retStr; |
| | | return true; |
| | | } |
| | | else if (elem is Pipe pipe) |
| | | { |
| | | var ids = GetConnectElements(pipe.ConnectorManager.Connectors, FlowDirectionType.Out); |
| | | var strIds = ids.Select(x => x.IntegerValue.ToString()).ToArray(); |
| | | var retStr = string.Join(",", strIds); |
| | | ret["下游节点编码"] = retStr; |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | private static bool SetUpperElement(Element elem, JObject ret) |
| | | { |
| | | var id = elem.Id.IntegerValue.ToString(); |
| | | if (elem is FamilyInstance fi) |
| | | { |
| | | var mepModel = (elem as FamilyInstance)?.MEPModel; |
| | | if (mepModel == null) |
| | | { |
| | | return false; |
| | | } |
| | | |
| | | var ids = GetConnectElements(mepModel.ConnectorManager.Connectors, FlowDirectionType.In); |
| | | var strIds = ids.Select(x => x.IntegerValue.ToString()).ToArray(); |
| | | var retStr = string.Join(",", strIds); |
| | | ret["上游节点编码"] = retStr; |
| | | return true; |
| | | } |
| | | else if (elem is Pipe pipe) |
| | | { |
| | | var ids = GetConnectElements(pipe.ConnectorManager.Connectors, FlowDirectionType.In); |
| | | var strIds = ids.Select(x => x.IntegerValue.ToString()).ToArray(); |
| | | var retStr = string.Join(",", strIds); |
| | | ret["上游节点编码"] = retStr; |
| | | return true; |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | private static void SetParameters(Element elem, JObject ret) |
| | | { |
| | | var parameters = elem.Parameters; |
| | | JObject jObj = new JObject(); |
| | | foreach (Parameter parameter in parameters) |
| | | { |
| | | ConvertParameter2Jobject(parameter, ref jObj); |
| | | } |
| | | ret["属性值列表"] = jObj; |
| | | } |
| | | |
| | | private static void SetPosition(Element elem, JObject ret) |
| | | { |
| | | if (elem is Pipe pipe) |
| | | { |
| | | Location location = pipe.Location; |
| | | LocationCurve lCurve = location as LocationCurve; |
| | | Line line = lCurve.Curve as Line; |
| | | XYZ st = line.GetEndPoint(0); |
| | | XYZ end = line.GetEndPoint(1); |
| | | XYZ center = (st + end) / 2; |
| | | |
| | | var minObj = new JObject(); |
| | | minObj["X"] = st.X.InnerToMM(); |
| | | minObj["Y"] = st.Y.InnerToMM(); |
| | | minObj["Z"] = st.Z.InnerToMM(); |
| | | |
| | | var centerObj = new JObject(); |
| | | centerObj["X"] = center.X.InnerToMM(); |
| | | centerObj["Y"] = center.Y.InnerToMM(); |
| | | centerObj["Z"] = center.Z.InnerToMM(); |
| | | |
| | | |
| | | var maxObj = new JObject(); |
| | | maxObj["X"] = end.X.InnerToMM(); |
| | | maxObj["Y"] = end.Y.InnerToMM(); |
| | | maxObj["Z"] = end.Z.InnerToMM(); |
| | | |
| | | var outObj = new JObject(); |
| | | outObj["Min"] = minObj; |
| | | outObj["Center"] = centerObj; |
| | | outObj["Max"] = maxObj; |
| | | ret["位置"] = outObj; |
| | | } |
| | | else |
| | | { |
| | | var box = elem.get_BoundingBox(null); |
| | | |
| | | var minObj = new JObject(); |
| | | minObj["X"] = box.Min.X.InnerToMM(); |
| | | minObj["Y"] = box.Min.Y.InnerToMM(); |
| | | minObj["Z"] = box.Min.Z.InnerToMM(); |
| | | |
| | | var centerObj = new JObject(); |
| | | if (elem is FamilyInstance fi) |
| | | { |
| | | if (fi.Location is LocationPoint lp) |
| | | { |
| | | var position = lp.Point; |
| | | centerObj["X"] = position.X.InnerToMM(); |
| | | centerObj["Y"] = position.Y.InnerToMM(); |
| | | centerObj["Z"] = position.Z.InnerToMM(); |
| | | } |
| | | } |
| | | |
| | | var maxObj = new JObject(); |
| | | maxObj["X"] = box.Max.X.InnerToMM(); |
| | | maxObj["Y"] = box.Max.Y.InnerToMM(); |
| | | maxObj["Z"] = box.Max.Z.InnerToMM(); |
| | | |
| | | var outObj = new JObject(); |
| | | outObj["Min"] = minObj; |
| | | outObj["Center"] = centerObj; |
| | | outObj["Max"] = maxObj; |
| | | ret["位置"] = outObj; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 构件属性 |
| | | /// </summary> |
| | |
| | | return null; |
| | | } |
| | | |
| | | public static List<ElementId> GetConnectElements(ConnectorSet connectors, FlowDirectionType direction) |
| | | { |
| | | if (connectors == null || connectors.Size == 0) { return null; } |
| | | var retIds = new List<ElementId>(); |
| | | |
| | | foreach (Connector connector in connectors) |
| | | { |
| | | if (!connector.IsConnected || |
| | | (connector.ConnectorType != ConnectorType.End && |
| | | connector.ConnectorType != ConnectorType.Curve && |
| | | connector.ConnectorType != ConnectorType.Physical)) |
| | | { |
| | | continue; |
| | | } |
| | | if (connector.Direction == direction) |
| | | { |
| | | var refElems = connector.AllRefs; |
| | | foreach (Connector item in refElems) |
| | | { |
| | | if (!connector.IsConnected || |
| | | (connector.ConnectorType != ConnectorType.End && |
| | | connector.ConnectorType != ConnectorType.Curve && |
| | | connector.ConnectorType != ConnectorType.Physical)) |
| | | { |
| | | continue; |
| | | } |
| | | var owner = item.Owner; |
| | | if (owner.Id != connector.Owner.Id) |
| | | { |
| | | if (owner is PipingSystem) |
| | | { |
| | | continue; |
| | | } |
| | | else |
| | | { |
| | | retIds.Add(item.Owner.Id); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return retIds; |
| | | } |
| | | |
| | | public static PipingSystemType GetElementPipingSystemType(Element elem) |
| | | { |
| | | if (elem is Pipe pipe) |
| | |
| | | var typeId = mepSystem.GetTypeId(); |
| | | return elem.Document.GetElement(typeId) as PipingSystemType; |
| | | } |
| | | else if(elem is FamilyInstance fi) |
| | | else if (elem is FamilyInstance fi) |
| | | { |
| | | var parameter = fi.LookupParameter("系统类型"); |
| | | if (parameter == null) { return null; } |
| | | if (parameter.StorageType == StorageType.String) |
| | | { |
| | | var name = parameter.AsString(); |
| | | var pst = new FilteredElementCollector(elem.Document).OfClass(typeof(PipingSystemType)).ToElements()?.Cast<PipingSystemType>().ToList()?.Find(x=>x.Name == name); |
| | | var pst = new FilteredElementCollector(elem.Document).OfClass(typeof(PipingSystemType)).ToElements()?.Cast<PipingSystemType>().ToList()?.Find(x => x.Name == name); |
| | | return pst; |
| | | } |
| | | else if (parameter.StorageType == StorageType.ElementId) |
| | |
| | | var elemId = parameter.AsElementId(); |
| | | return elem.Document.GetElement(elemId) as PipingSystemType; |
| | | } |
| | | |
| | | |
| | | } |
| | | return null; |
| | | } |
| | |
| | | //获取实例 族与类型 参数值 |
| | | Parameter param = eachElement.get_Parameter(BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM); |
| | | string value = GetParemeterValue(param); |
| | | if (!String.IsNullOrEmpty(value)) |
| | | if (!string.IsNullOrEmpty(value)) |
| | | { |
| | | return value; |
| | | } |
| | |
| | | } |
| | | catch (Exception) |
| | | { |
| | | return String.Empty; |
| | | return string.Empty; |
| | | } |
| | | } |
| | | |
| | |
| | | if (elem != null && elem.get_Parameter(builtInParameter) is Parameter para) |
| | | { |
| | | if (para == null || !para.HasValue) { return result; } |
| | | result =para.AsDouble(); |
| | | result = para.AsDouble(); |
| | | } |
| | | return result; |
| | | } |
| | |
| | | double? result = null; |
| | | if (elem != null) |
| | | { |
| | | Parameter para = elem.GetParameterByProName(paramName); |
| | | if (para == null || !para.HasValue) { return result; } |
| | | switch (para.StorageType) |
| | | try |
| | | { |
| | | case StorageType.None: |
| | | break; |
| | | case StorageType.Integer: |
| | | result = para.AsInteger(); |
| | | break; |
| | | case StorageType.Double: |
| | | if (innerTo != null && para.GetUnitTypeId() != UnitTypeId.General) |
| | | { |
| | | result = innerTo(para.AsDouble()); |
| | | } |
| | | else |
| | | { |
| | | result = para.AsDouble(); |
| | | } |
| | | break; |
| | | case StorageType.String: |
| | | result = StringToDouble(para.AsString()); |
| | | break; |
| | | case StorageType.ElementId: |
| | | //不处理 |
| | | break; |
| | | default: |
| | | break; |
| | | Parameter para = elem.GetParameterByProName(paramName); |
| | | if (para == null || !para.HasValue) { return result; } |
| | | switch (para.StorageType) |
| | | { |
| | | case StorageType.None: |
| | | break; |
| | | case StorageType.Integer: |
| | | result = para.AsInteger(); |
| | | break; |
| | | case StorageType.Double: |
| | | //if (innerTo != null && para.GetUnitTypeId() != UnitTypeId.General) |
| | | if (innerTo != null && para.DisplayUnitType != DisplayUnitType.DUT_GENERAL) |
| | | { |
| | | result = innerTo(para.AsDouble()); |
| | | } |
| | | else |
| | | { |
| | | result = para.AsDouble(); |
| | | } |
| | | break; |
| | | case StorageType.String: |
| | | result = StringToDouble(para.AsString()); |
| | | break; |
| | | case StorageType.ElementId: |
| | | //不处理 |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return result; |
| | | } |
| | | } |
| | | return result; |
| | |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取参数值 AsDouble |
| | | /// </summary> |
| | |
| | | result = para.AsInteger(); |
| | | break; |
| | | case StorageType.Double: |
| | | if (innerTo != null && para.GetUnitTypeId() != UnitTypeId.General)//传入了单位转换方法 且参数设置了单位 |
| | | //if (innerTo != null && para.GetUnitTypeId() != UnitTypeId.General)//传入了单位转换方法 且参数设置了单位 |
| | | if (innerTo != null && para.DisplayUnitType != DisplayUnitType.DUT_GENERAL) |
| | | { |
| | | result = innerTo(para.AsDouble()); |
| | | } |
| | |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取参数值 AsString |
| | | /// </summary> |
| | | /// <param name="elem"></param> |
| | | /// <param name="paramName"></param> |
| | | /// <returns></returns> |
| | | public static void ConvertParameter2Jobject(Parameter para, ref JObject jObj) |
| | | { |
| | | var name = para.Definition.Name; |
| | | if (para != null) |
| | | { |
| | | switch (para.StorageType) |
| | | { |
| | | case StorageType.Integer: |
| | | var intRet = para.AsInteger(); |
| | | jObj[name] = intRet; |
| | | break; |
| | | case StorageType.Double: |
| | | var doubleRet = para.AsDouble(); |
| | | jObj[name] = doubleRet; |
| | | break; |
| | | case StorageType.String: |
| | | var strRet = para.AsString(); |
| | | jObj[name] = strRet; |
| | | break; |
| | | case StorageType.ElementId: |
| | | var elemIdRet = para.AsElementId().IntegerValue; |
| | | jObj[name] = elemIdRet; |
| | | break; |
| | | case StorageType.None: |
| | | default: |
| | | jObj[name] = null; |
| | | break; |
| | | } |
| | | |
| | | } |
| | | return; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 值是字符串,可能是由是数字+单位组成,也可能没有单位 |
| | | /// </summary> |
| | |
| | | double? value = null; |
| | | if (string.IsNullOrWhiteSpace(str)) |
| | | return value; |
| | | //Regex r = new Regex(@"([1-9]\d*\.?\d*)|(0\.\d*[1-9])"); |
| | | |
| | | Regex r = new Regex(@"([+-]?(\d*\.\d+([eE]?[+-]?\d+)?|\d+[eE][+-]?\d+))|([+-]?\d*)|([1-9]\d*\.?\d*)|(0\.\d*[1-9])"); |
| | | //开始匹配 |
| | | Match m = r.Match(str); |
| | |
| | | value = Convert.ToDouble(newStr); |
| | | return value; |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取参数值 AsString |
| | | /// </summary> |
| | |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取参数值 AsValueString |
| | | /// </summary> |
| | |
| | | //不处理 |
| | | break; |
| | | case StorageType.String: |
| | | result = StringToInt(para.AsString()); |
| | | break; |
| | | case StorageType.ElementId: |
| | | result = para.AsElementId().IntegerValue; |
| | |
| | | result = para.AsInteger(); |
| | | break; |
| | | case StorageType.Double: |
| | | //不处理 |
| | | break; |
| | | { |
| | | var ret = para.AsDouble(); |
| | | result = (int)ret; |
| | | break; |
| | | } |
| | | case StorageType.String: |
| | | result = StringToInt(para.AsString()); |
| | | break; |
| | | { |
| | | var str = para.AsString(); |
| | | if (int.TryParse(str, out int ret)) |
| | | { |
| | | return ret; |
| | | } |
| | | break; |
| | | } |
| | | case StorageType.ElementId: |
| | | result = para.AsElementId().IntegerValue; |
| | | break; |
| | |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 将特殊的字符串转成int表示的bool |
| | | /// </summary> |
| | | /// <param name="str"></param> |
| | | /// <returns></returns> |
| | | private static int? StringToInt(string str) |
| | | { |
| | | if (str == "是" || str == "正确" || str == "true" || str == "True" || str == "真" || str == "对" || str == "有") |
| | | { |
| | | return 1; |
| | | } |
| | | else if (str == "否" || str == "错误" || str == "不正确" || str == "false" || str == "False" || str == "假" || str == "不对" || str == "没有") |
| | | { |
| | | return 0; |
| | | } |
| | | else if(int.TryParse(str, out int result)) |
| | | { |
| | | return result; |
| | | } |
| | | else |
| | | { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 获取参数值 AsElementId |
| | | /// </summary> |
| | |
| | | { |
| | | para = null; |
| | | } |
| | | |
| | | |
| | | return para == null ? GetParameterByProName(element, parameterName) : para; |
| | | } |
| | | /// <summary> |