zhangyk-c
2024-07-30 e5b04afb7062a908c700f66a1a33aaa5eb98b7bb
HStation.RevitDev/RevitDataExport/Utility/ParameterOperator.cs
@@ -1,19 +1,248 @@
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>
@@ -55,6 +284,50 @@
            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)
@@ -64,14 +337,14 @@
                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)
@@ -79,7 +352,7 @@
                    var elemId = parameter.AsElementId();
                    return elem.Document.GetElement(elemId) as PipingSystemType;
                }
            }
            return null;
        }
@@ -146,7 +419,7 @@
                //获取实例 族与类型 参数值
                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;
                }
@@ -155,7 +428,7 @@
            }
            catch (Exception)
            {
                return String.Empty;
                return string.Empty;
            }
        }
@@ -268,7 +541,7 @@
            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;
        }
@@ -285,33 +558,41 @@
            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;
@@ -413,7 +694,7 @@
            }
            return result;
        }
        /// <summary>
        /// 获取参数值 AsDouble
        /// </summary>
@@ -439,7 +720,8 @@
                            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());
                            }
@@ -465,7 +747,46 @@
            }
            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>
@@ -476,7 +797,7 @@
            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);
@@ -496,7 +817,7 @@
            value = Convert.ToDouble(newStr);
            return value;
        }
        /// <summary>
        /// 获取参数值 AsString
        /// </summary>
@@ -534,7 +855,7 @@
            }
            return result;
        }
        /// <summary>
        /// 获取参数值 AsValueString
        /// </summary>
@@ -579,7 +900,6 @@
                        //不处理
                        break;
                    case StorageType.String:
                        result = StringToInt(para.AsString());
                        break;
                    case StorageType.ElementId:
                        result = para.AsElementId().IntegerValue;
@@ -613,11 +933,20 @@
                        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;
@@ -627,32 +956,7 @@
            }
            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>
@@ -808,7 +1112,7 @@
            {
                para = null;
            }
            return para == null ? GetParameterByProName(element, parameterName) : para;
        }
        /// <summary>