From e358beb08f5be49703009b64f058ecfbcfeefbd9 Mon Sep 17 00:00:00 2001
From: qin <a@163.com>
Date: 星期六, 28 九月 2024 14:27:52 +0800
Subject: [PATCH] 测试standard2.1

---
 HStation.RevitDev/RevitDataExport/Utility/ParameterOperator.cs | 2414 +++++++++++++++++++++++++++++----------------------------
 1 files changed, 1,229 insertions(+), 1,185 deletions(-)

diff --git a/HStation.RevitDev/RevitDataExport/Utility/ParameterOperator.cs b/HStation.RevitDev/RevitDataExport/Utility/ParameterOperator.cs
index 5b5c2a5..fcfbc88 100644
--- a/HStation.RevitDev/RevitDataExport/Utility/ParameterOperator.cs
+++ b/HStation.RevitDev/RevitDataExport/Utility/ParameterOperator.cs
@@ -1,1185 +1,1229 @@
-锘縰sing 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;
-
-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>
-        /// <param name="doc"></param>
-        /// <param name="inputElement"></param>
-        /// <param name="attributeName"></param>
-        /// <returns></returns>
-        public static Parameter GetParameterByEnum(Document doc, Element inputElement, string attributeName)
-        {
-            Parameter useParameter = null;
-            try
-            {
-                var fi = inputElement as FamilyInstance;
-                if (null != fi)
-                {
-                    useParameter = fi.LookupParameter(attributeName);
-                    if (useParameter != null)
-                    {
-                        return useParameter;
-                    }
-                    useParameter = fi.Symbol.LookupParameter(attributeName);
-                    if (null != useParameter) { return useParameter; }
-                }
-
-                useParameter = inputElement.LookupParameter(attributeName);
-                if (null != useParameter) { return useParameter; }
-
-                Element element = doc.GetElement(inputElement.GetTypeId());
-                if (null != element)
-                {
-                    useParameter = element.LookupParameter(attributeName);
-                    if (null != useParameter) { return useParameter; }
-                }
-            }
-            catch (Exception)
-            {
-            }
-
-            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 mepSystem = pipe.MEPSystem;
-                if (mepSystem == null) { return null; }
-                var typeId = mepSystem.GetTypeId();
-                return elem.Document.GetElement(typeId) as PipingSystemType;
-            }
-            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);
-                    return pst;
-                }
-                else if (parameter.StorageType == StorageType.ElementId)
-                {
-                    var elemId = parameter.AsElementId();
-                    return elem.Document.GetElement(elemId) as PipingSystemType;
-                }
-
-            }
-            return null;
-        }
-
-        /// <summary>
-        /// 鑾峰彇灞炴��
-        /// </summary>
-        /// <param name="doc"></param>
-        /// <param name="inputElement"></param>
-        /// <param name="attributeName"></param>
-        /// <returns></returns>
-        public static Parameter GetParameter(Document doc, Element inputElement, string attributeName)
-        {
-            return GetParameterByEnum(doc, inputElement, attributeName);
-        }
-
-        /// <summary>
-        /// 鑾峰彇灞炴�у��
-        /// </summary>
-        /// <param name="inputParameter"></param>
-        /// <returns></returns>
-        public static string GetParemeterValue(Parameter parameter)
-        {
-            if (parameter == null)
-            {
-                return string.Empty;
-            }
-
-            var result = string.Empty;
-            if (parameter.StorageType == StorageType.Integer)
-            {
-                result = parameter.AsInteger().ToString();
-            }
-            else if (parameter.StorageType == StorageType.Double)
-            {
-                result = parameter.AsDouble().ToString();
-            }
-            else if (parameter.StorageType == StorageType.ElementId)
-            {
-                result = parameter.AsValueString();
-            }
-            else
-            {
-                result = string.IsNullOrWhiteSpace(parameter.AsString()) ? parameter.AsValueString() : parameter.AsString();
-            }
-            if (result == null)
-            {
-                return string.Empty;
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鍚嶇О灞炴�у��
-        /// </summary>
-        /// <param name="doc"></param>
-        /// <param name="inputElement"></param>
-        /// <param name="attributeName"></param>
-        /// <returns></returns>
-        public static string GetElementName(Element eachElement)
-        {
-            try
-            {
-                //鑾峰彇瀹炰緥 鏃忎笌绫诲瀷 鍙傛暟鍊�
-                Parameter param = eachElement.get_Parameter(BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM);
-                string value = GetParemeterValue(param);
-                if (!string.IsNullOrEmpty(value))
-                {
-                    return value;
-                }
-
-                return eachElement.Name;
-            }
-            catch (Exception)
-            {
-                return string.Empty;
-            }
-        }
-
-        /// <summary>
-        /// 鑾峰彇鏃忎笌绫诲瀷鍙傛暟
-        /// </summary>
-        /// <returns></returns>
-        public static string GetElementFamilyAndTypeValue(Element eachElement)
-        {
-            try
-            {
-                //鑾峰彇瀹炰緥 鏃忎笌绫诲瀷 鍙傛暟鍊�
-                Parameter param = eachElement.get_Parameter(BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM);
-                string value = GetParemeterValue(param);
-                if (!string.IsNullOrEmpty(value))
-                {
-                    return value;
-                }
-
-                //濡� 鏃忎笌绫诲瀷 鑾峰彇澶辫触锛屽彧鎻愬彇绫诲瀷鍚嶇О
-                var type = eachElement.Document.GetElement(eachElement.GetTypeId());
-                return type == null ? string.Empty : type.Name;
-            }
-            catch (Exception)
-            {
-                return string.Empty;
-            }
-        }
-
-        /// <summary>
-        /// 灞炴�у�兼槸鍚﹀彲鐢�
-        /// </summary>
-        /// <param name="lstParametet"></param>
-        /// <param name="paraValue"></param>
-        /// <returns></returns>
-        private static bool ExtractParameter(IList<Parameter> lstParametet, out string paraValue)
-        {
-            paraValue = string.Empty;
-
-            foreach (var item in lstParametet)
-            {
-                var value = GetParemeterValue(item);
-
-                var succeed = value != null
-                    && !string.IsNullOrWhiteSpace(value)
-                    && value != "0";
-
-                if (succeed)
-                {
-                    paraValue = value;
-                    return succeed;
-                }
-            }
-
-            return false;
-        }
-
-        /// <summary>
-        /// 鏄惁涓簃ep鏋勪欢
-        /// </summary>
-        /// <returns></returns>
-        private static bool IsMEPInstace(BuiltInCategory instanceCategory)
-        {
-            switch (instanceCategory)
-            {
-                case BuiltInCategory.OST_DuctSystem:
-                case BuiltInCategory.OST_PipingSystem:
-                    return true;
-                default:
-                    return false;
-            }
-        }
-
-        public static string GetPipeSystemTypeName(Pipe pipe)
-        {
-            try
-            {
-                var parameter = pipe.get_Parameter(BuiltInParameter.RBS_PIPING_SYSTEM_TYPE_PARAM);
-                return parameter.AsValueString();
-            }
-            catch (Exception)
-            {
-                return string.Empty;
-            }
-        }
-
-        public static string GetDuctSystemTypeName(Duct duct)
-        {
-            try
-            {
-                var parameter = duct.get_Parameter(BuiltInParameter.RBS_DUCT_SYSTEM_TYPE_PARAM);
-                if (parameter == null) { return null; }
-                return parameter.AsValueString();
-            }
-            catch (Exception)
-            {
-                return string.Empty;
-            }
-        }
-
-        /// <summary>
-        /// 鑾峰彇鍙傛暟鍊� AsDouble
-        /// </summary>
-        /// <param name="elem"></param>
-        /// <param name="builtInParameter"></param>
-        /// <returns></returns>
-        public static double? GetParameterValueAsDouble(Element elem, BuiltInParameter builtInParameter)
-        {
-            double? result = null;
-            if (elem != null && elem.get_Parameter(builtInParameter) is Parameter para)
-            {
-                if (para == null || !para.HasValue) { return result; }
-                result = para.AsDouble();
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鍙傛暟鍊� AsDouble
-        /// </summary>
-        /// <param name="elem"></param>
-        /// <param name="paramName"></param>
-        /// <param name="innerTo">鍗曚綅杞崲鏂规硶</param>
-        /// <returns></returns>
-        public static double? GetParameterValueAsDouble(Element elem, string paramName, Func<object, double?> innerTo = null)
-        {
-            double? result = null;
-            if (elem != null)
-            {
-                try
-                {
-                    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;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鍙傛暟鍊� AsDouble
-        /// </summary>
-        /// <param name="elem"></param>
-        /// <param name="paramNames"></param>
-        /// <param name="innerTo"></param>
-        /// <returns></returns>
-        public static double? GetParameterValueAsDouble(Element elem, string[] paramNames, Func<object, double?> innerTo = null)
-        {
-            double? result = null;
-            foreach (var paramName in paramNames)
-            {
-                var res = GetParameterValueAsDouble(elem, paramName, innerTo);
-                if (res != null)
-                {
-                    result = res;
-                    break;
-                }
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鍙傛暟鍊� AsString
-        /// </summary>
-        /// <param name="elem"></param>
-        /// <param name="paramName"></param>
-        /// <returns></returns>
-        public static string GetParameterValueAsString(Element elem, string paramName)
-        {
-            string result = null;
-            if (elem != null)
-            {
-                Parameter para = elem.GetParameterByProName(paramName);
-                if (para == null || !para.HasValue) { return result; }
-                switch (para.StorageType)
-                {
-                    case StorageType.None:
-                        result = para.AsString();
-                        break;
-                    case StorageType.Integer:
-                        result = para.AsInteger().ToString();
-                        break;
-                    case StorageType.Double:
-                        result = para.AsValueString();
-                        break;
-                    case StorageType.String:
-                        result = para.AsString();
-                        break;
-                    case StorageType.ElementId:
-                        result = para.AsElementId().IntegerValue.ToString();
-                        break;
-                    default:
-                        break;
-                }
-
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鍙傛暟鍊� AsValueString
-        /// </summary>
-        /// <param name="elem"></param>
-        /// <param name="paramName"></param>
-        /// <returns></returns>
-        public static string GetParameterValueAsValueString(Element elem, string paramName)
-        {
-            string result = null;
-            if (elem != null)
-            {
-                Parameter para = elem.GetParameterByProName(paramName);
-                if (para == null || !para.HasValue) { return result; }
-                switch (para.StorageType)
-                {
-                    case StorageType.None:
-                        result = para.AsString();
-                        break;
-                    case StorageType.Integer:
-                        result = para.AsInteger().ToString();
-                        break;
-                    case StorageType.Double:
-                        result = para.AsValueString();
-                        break;
-                    case StorageType.String:
-                        result = para.AsString();
-                        break;
-                    case StorageType.ElementId:
-                        result = para.AsElementId().IntegerValue.ToString();
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鍙傛暟鍊� AsDouble
-        /// </summary>
-        /// <param name="elem"></param>
-        /// <param name="paramName"></param>
-        /// <param name="builtInParameter"></param>
-        /// <param name="innerTo">鍗曚綅杞崲鏂规硶</param>
-        /// <returns></returns>
-        public static double? GetParameterValueAsDouble(Element elem, string paramName, BuiltInParameter builtInParameter, Func<object, double?> innerTo = null)
-        {
-            double? result = null;
-            try
-            {
-                if (elem != null)
-                {
-                    Parameter para = elem.GetParameter(paramName, builtInParameter);
-                    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 null;
-            }
-            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>
-        /// <param name="str"></param>
-        /// <returns></returns>
-        private static double? StringToDouble(string str)
-        {
-            double? value = null;
-            if (string.IsNullOrWhiteSpace(str))
-                return value;
-
-            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);
-            string newStr = "";
-            while (m.Success)
-            {
-                //鍖归厤鎴愬姛
-                newStr += m.Groups[0].Value;
-
-                //浠庝笂涓�涓尮閰嶇粨鏉熺殑浣嶇疆寮�濮嬩笅涓�涓尮閰�
-                m = m.NextMatch();
-            }
-            if (newStr == "")
-            {
-                return value;
-            }
-            value = Convert.ToDouble(newStr);
-            return value;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鍙傛暟鍊� AsString
-        /// </summary>
-        /// <param name="elem"></param>
-        /// <param name="paramName"></param>
-        /// <param name="builtInParameter"></param>
-        /// <returns></returns>
-        public static string GetParameterValueAsString(Element elem, string paramName, BuiltInParameter builtInParameter)
-        {
-            string result = null;
-            if (elem != null)
-            {
-                Parameter para = elem.GetParameter(paramName, builtInParameter);
-                if (para == null || !para.HasValue) { return result; }
-                switch (para.StorageType)
-                {
-                    case StorageType.None:
-                        result = para.AsString();
-                        break;
-                    case StorageType.Integer:
-                        result = para.AsInteger().ToString();
-                        break;
-                    case StorageType.Double:
-                        result = para.AsValueString();
-                        break;
-                    case StorageType.String:
-                        result = para.AsString();
-                        break;
-                    case StorageType.ElementId:
-                        result = para.AsElementId().IntegerValue.ToString();
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鍙傛暟鍊� AsValueString
-        /// </summary>
-        /// <param name="elem"></param>
-        /// <param name="paramName"></param>
-        /// <param name="builtInParameter"></param>
-        /// <returns></returns>
-        public static string GetParameterValueAsValueString(Element elem, string paramName, BuiltInParameter builtInParameter)
-        {
-            string result = null;
-            if (elem != null)
-            {
-                Parameter para = elem.GetParameter(paramName, builtInParameter);
-                if (para == null || !para.HasValue) { return result; }
-                result = para.AsValueString();
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鍙傛暟鍊� AsInt
-        /// </summary>
-        /// <param name="elem"></param>
-        /// <param name="paramName"></param>
-        /// <param name="builtInParameter"></param>
-        /// <returns></returns>
-        public static int? GetParameterValueAsInt(Element elem, string paramName, BuiltInParameter builtInParameter)
-        {
-            int? result = null;
-            if (elem != null)
-            {
-                Parameter para = elem.GetParameter(paramName, builtInParameter);
-                if (para == null || !para.HasValue) { return result; }
-                switch (para.StorageType)
-                {
-                    case StorageType.None:
-                        break;
-                    case StorageType.Integer:
-                        result = para.AsInteger();
-                        break;
-                    case StorageType.Double:
-                        //涓嶅鐞�
-                        break;
-                    case StorageType.String:
-                        break;
-                    case StorageType.ElementId:
-                        result = para.AsElementId().IntegerValue;
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鍙傛暟鍊� AsInt
-        /// </summary>
-        /// <param name="elem"></param>
-        /// <param name="paramName"></param>
-        /// <param name="builtInParameter"></param>
-        /// <returns></returns>
-        public static int? GetParameterValueAsInt(Element elem, string paramName)
-        {
-            int? result = null;
-            if (elem != null)
-            {
-                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:
-                        {
-                            var ret = para.AsDouble();
-                            result = (int)ret;
-                            break;
-                        }
-                    case StorageType.String:
-                        {
-                            var str = para.AsString();
-                            if (int.TryParse(str, out int ret))
-                            {
-                                return ret;
-                            }
-                            break;
-                        }
-                    case StorageType.ElementId:
-                        result = para.AsElementId().IntegerValue;
-                        break;
-                    default:
-                        break;
-                }
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鍙傛暟鍊� AsElementId
-        /// </summary>
-        /// <param name="elem"></param>
-        /// <param name="paramName"></param>
-        /// <param name="builtInParameter"></param>
-        /// <returns></returns>
-        public static ElementId GetParameterValueAsElementId(Element elem, string paramName, BuiltInParameter builtInParameter)
-        {
-            ElementId result = null;
-            if (elem != null)
-            {
-                Parameter para = elem.GetParameter(paramName, builtInParameter);
-                if (para == null || !para.HasValue) { return result; }
-                result = para.AsElementId();
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鍙傛暟鍊� AsElementId
-        /// </summary>
-        /// <param name="elem"></param>
-        /// <param name="paramName"></param>
-        /// <param name="builtInParameter"></param>
-        /// <returns></returns>
-        public static ElementId GetParameterValueAsElementId(Element elem, BuiltInParameter builtInParameter)
-        {
-            ElementId result = null;
-            if (elem != null)
-            {
-                Parameter para = elem.get_Parameter(builtInParameter);
-                if (para == null || !para.HasValue) { return result; }
-                result = para.AsElementId();
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// 鑾峰彇鍙傛暟鍊� AsElementId
-        /// </summary>
-        /// <param name="elem"></param>
-        /// <param name="paramName"></param>
-        /// <param name="builtInParameter"></param>
-        /// <returns></returns>
-        public static ElementId GetParameterValueAsElementId(Element elem, string paramName)
-        {
-            ElementId result = null;
-            if (elem != null)
-            {
-                Parameter para = elem.GetParameterByProName(paramName);
-                if (para == null || !para.HasValue) { return result; }
-                result = para.AsElementId();
-            }
-            return result;
-        }
-
-        /// <summary>
-        /// 鑾峰彇绯荤粺绫诲瀷鍚嶇О瀛楃涓�
-        /// </summary>
-        /// <param name="elem"></param>
-        /// <param name="paramName"></param>
-        /// <param name="builtIn"></param>
-        /// <returns></returns>
-        public static string GetSystemTypeName(Element elem, string paramName, BuiltInParameter builtInParameter = BuiltInParameter.INVALID)
-        {
-            string res = null;
-            try
-            {
-                if (builtInParameter != BuiltInParameter.INVALID)
-                {
-                    Parameter para = elem.GetParameter(paramName, builtInParameter);
-                    if (para != null)
-                    {
-                        if (para.StorageType == StorageType.ElementId)
-                        {
-                            var elemId = para.AsElementId();
-                            if (elemId != null && elemId != ElementId.InvalidElementId)
-                            {
-                                var tempElem = elem.Document.GetElement(elemId);
-                                res = tempElem.Name;
-                            }
-                        }
-                        else
-                        {
-                            res = para.AsValueString();
-                        }
-                    }
-                }
-                else
-                {
-                    Parameter para = elem.GetParameterByProName(paramName);
-                    if (para != null)
-                    {
-                        if (para.StorageType == StorageType.ElementId)
-                        {
-                            var elemId = para.AsElementId();
-                            if (elemId != null && elemId != ElementId.InvalidElementId)
-                            {
-                                var tempElem = elem.Document.GetElement(elemId);
-                                res = tempElem.Name;
-                            }
-                        }
-                        else
-                        {
-                            res = para.AsValueString();
-                        }
-                    }
-                }
-            }
-            catch
-            {
-
-            }
-            return res;
-        }
-    }
-
-    public static class ParameterUtil
-    {
-        /// <summary>
-        /// 鏈夊唴缃弬鏁扮殑锛岃皟鐢ㄨ鍑芥暟
-        /// </summary>
-        /// <param name="element"></param>
-        /// <param name="parameterName">鍙傛暟鍚�</param>
-        /// <param name="builtInParameter">鍐呯疆鍙傛暟</param>
-        /// <returns></returns>
-        public static Parameter GetParameter(this Element element, string parameterName, BuiltInParameter builtInParameter)
-        {
-            Parameter para = null;
-            try
-            {
-                if (element is ElementType)
-                {
-                    para = element.get_Parameter(builtInParameter);
-                }
-                else
-                {
-                    para = element.get_Parameter(builtInParameter);
-                    if (para == null)
-                    {
-                        var typeId = element.GetTypeId();
-                        if (typeId == null)
-                        {
-                            return null;
-                        }
-                        var type = element.Document.GetElement(typeId) as ElementType;
-                        para = type.get_Parameter(builtInParameter);
-                    }
-                }
-            }
-            catch (Exception ex)
-            {
-                para = null;
-            }
-
-            return para == null ? GetParameterByProName(element, parameterName) : para;
-        }
-        /// <summary>
-        /// 鏍规嵁鍙傛暟鍚嶈幏鍙栧弬鏁帮紝濡傛灉element鏄被鍨嬶紝鑾峰彇鐨勫氨鏄被鍨嬪弬鏁帮紝
-        /// 濡傛灉element鏄疄渚嬶紝鍏堣幏鍙栧疄渚嬪弬鏁帮紝濡傛灉鑾峰彇涓嶅埌锛屽氨鑾峰彇绫诲瀷鍙傛暟锛屽疄渚嬪弬鏁颁紭鍏�
-        /// 濡傛灉鍙傛暟鏈夊涓紝鍙栨湁鍙傛暟鍊肩殑閭d釜锛屽鏋滃涓湁鍙傛暟鍊硷紝灏卞彇绗竴涓湁鍙傛暟鍊肩殑
-        /// </summary>
-        /// <param name="element"></param>
-        /// <param name="parameterName"></param>
-        /// <returns></returns>
-        public static Parameter GetParameterByProName(this Element element, string parameterName)
-        {
-            if (element is ElementType elementType)
-            {
-                return GetParameterByName(elementType, parameterName);
-            }
-            else
-            {
-                var result = GetParameterByName(element, parameterName);
-                if (result != null)
-                {
-                    return result;
-                }
-                var typeId = element.GetTypeId();
-                if (typeId == null || typeId == ElementId.InvalidElementId)
-                {
-                    return null;
-                }
-                var type = element.Document.GetElement(typeId) as ElementType;
-                return GetParameterByName(type, parameterName);
-            }
-        }
-        /// <summary>
-        /// 鏍规嵁鍙傛暟鍚嶈幏鍙栵紝濡傛灉鍙傛暟鏈夊涓紝鍙栨湁鍙傛暟鍊肩殑閭d釜锛屽鏋滃涓湁鍙傛暟鍊硷紝灏卞彇绗竴涓湁鍙傛暟鍊肩殑
-        /// </summary>
-        /// <param name="element"></param>
-        /// <param name="parameterName"></param>
-        /// <returns></returns>
-        private static Parameter GetParameterByName(this Element element, string parameterName)
-        {
-            if (string.IsNullOrEmpty(parameterName))
-            {
-                return null;
-            }
-            var parameters = element.GetParameters(parameterName);
-            if (parameters.Count == 0)
-            {
-                return null;
-            }
-            if (parameters.Count == 1)
-            {
-                return parameters[0];
-            }
-            //濡傛灉鍙傛暟鏈夊涓紝鑾峰彇鏈夊�肩殑鍙傛暟
-            var tempParams = parameters.Where(x => !string.IsNullOrEmpty(ParameterOperator.GetParemeterValue(x))).ToList();
-            //濡傛灉澶氫釜鍙傛暟閮芥病鏈夊�� 鍒欒繑鍥炵涓�涓�
-            if (tempParams.Count == 0)
-            {
-                return parameters.First();
-            }
-            //濡傛灉鍙湁涓�涓弬鏁版湁鍊� 鍒欒繑鍥炶繖涓弬鏁�
-            if (tempParams.Count == 1)
-            {
-                return tempParams.First();
-            }
-
-            return tempParams.First();
-        }
-    }
-}
+锘縰sing 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;
+
+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>
+        /// <param name="doc"></param>
+        /// <param name="inputElement"></param>
+        /// <param name="attributeName"></param>
+        /// <returns></returns>
+        public static Parameter GetParameterByEnum(Document doc, Element inputElement, string attributeName)
+        {
+            Parameter useParameter = null;
+            try
+            {
+                var fi = inputElement as FamilyInstance;
+                if (null != fi)
+                {
+                    useParameter = fi.LookupParameter(attributeName);
+                    if (useParameter != null)
+                    {
+                        return useParameter;
+                    }
+                    useParameter = fi.Symbol.LookupParameter(attributeName);
+                    if (null != useParameter) { return useParameter; }
+                }
+
+                useParameter = inputElement.LookupParameter(attributeName);
+                if (null != useParameter) { return useParameter; }
+
+                Element element = doc.GetElement(inputElement.GetTypeId());
+                if (null != element)
+                {
+                    useParameter = element.LookupParameter(attributeName);
+                    if (null != useParameter) { return useParameter; }
+                }
+            }
+            catch (Exception)
+            {
+            }
+
+            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 mepSystem = pipe.MEPSystem;
+                if (mepSystem == null) { return null; }
+                var typeId = mepSystem.GetTypeId();
+                return elem.Document.GetElement(typeId) as PipingSystemType;
+            }
+            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);
+                    return pst;
+                }
+                else if (parameter.StorageType == StorageType.ElementId)
+                {
+                    var elemId = parameter.AsElementId();
+                    return elem.Document.GetElement(elemId) as PipingSystemType;
+                }
+
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// 鑾峰彇灞炴��
+        /// </summary>
+        /// <param name="doc"></param>
+        /// <param name="inputElement"></param>
+        /// <param name="attributeName"></param>
+        /// <returns></returns>
+        public static Parameter GetParameter(Document doc, Element inputElement, string attributeName)
+        {
+            return GetParameterByEnum(doc, inputElement, attributeName);
+        }
+
+        /// <summary>
+        /// 鑾峰彇灞炴�у��
+        /// </summary>
+        /// <param name="inputParameter"></param>
+        /// <returns></returns>
+        public static string GetParemeterValue(Parameter parameter)
+        {
+            if (parameter == null)
+            {
+                return string.Empty;
+            }
+
+            var result = string.Empty;
+            if (parameter.StorageType == StorageType.Integer)
+            {
+                result = parameter.AsInteger().ToString();
+            }
+            else if (parameter.StorageType == StorageType.Double)
+            {
+                result = parameter.AsDouble().ToString();
+            }
+            else if (parameter.StorageType == StorageType.ElementId)
+            {
+                result = parameter.AsValueString();
+            }
+            else
+            {
+                result = string.IsNullOrWhiteSpace(parameter.AsString()) ? parameter.AsValueString() : parameter.AsString();
+            }
+            if (result == null)
+            {
+                return string.Empty;
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍚嶇О灞炴�у��
+        /// </summary>
+        /// <param name="doc"></param>
+        /// <param name="inputElement"></param>
+        /// <param name="attributeName"></param>
+        /// <returns></returns>
+        public static string GetElementName(Element eachElement)
+        {
+            try
+            {
+                //鑾峰彇瀹炰緥 鏃忎笌绫诲瀷 鍙傛暟鍊�
+                Parameter param = eachElement.get_Parameter(BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM);
+                string value = GetParemeterValue(param);
+                if (!string.IsNullOrEmpty(value))
+                {
+                    return value;
+                }
+
+                return eachElement.Name;
+            }
+            catch (Exception)
+            {
+                return string.Empty;
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇鏃忎笌绫诲瀷鍙傛暟
+        /// </summary>
+        /// <returns></returns>
+        public static string GetElementFamilyAndTypeValue(Element eachElement)
+        {
+            try
+            {
+                //鑾峰彇瀹炰緥 鏃忎笌绫诲瀷 鍙傛暟鍊�
+                Parameter param = eachElement.get_Parameter(BuiltInParameter.ELEM_FAMILY_AND_TYPE_PARAM);
+                string value = GetParemeterValue(param);
+                if (!string.IsNullOrEmpty(value))
+                {
+                    return value;
+                }
+
+                //濡� 鏃忎笌绫诲瀷 鑾峰彇澶辫触锛屽彧鎻愬彇绫诲瀷鍚嶇О
+                var type = eachElement.Document.GetElement(eachElement.GetTypeId());
+                return type == null ? string.Empty : type.Name;
+            }
+            catch (Exception)
+            {
+                return string.Empty;
+            }
+        }
+
+        /// <summary>
+        /// 灞炴�у�兼槸鍚﹀彲鐢�
+        /// </summary>
+        /// <param name="lstParametet"></param>
+        /// <param name="paraValue"></param>
+        /// <returns></returns>
+        private static bool ExtractParameter(IList<Parameter> lstParametet, out string paraValue)
+        {
+            paraValue = string.Empty;
+
+            foreach (var item in lstParametet)
+            {
+                var value = GetParemeterValue(item);
+
+                var succeed = value != null
+                    && !string.IsNullOrWhiteSpace(value)
+                    && value != "0";
+
+                if (succeed)
+                {
+                    paraValue = value;
+                    return succeed;
+                }
+            }
+
+            return false;
+        }
+
+        /// <summary>
+        /// 鏄惁涓簃ep鏋勪欢
+        /// </summary>
+        /// <returns></returns>
+        private static bool IsMEPInstace(BuiltInCategory instanceCategory)
+        {
+            switch (instanceCategory)
+            {
+                case BuiltInCategory.OST_DuctSystem:
+                case BuiltInCategory.OST_PipingSystem:
+                    return true;
+                default:
+                    return false;
+            }
+        }
+
+        public static string GetPipeSystemTypeName(Pipe pipe)
+        {
+            try
+            {
+                var parameter = pipe.get_Parameter(BuiltInParameter.RBS_PIPING_SYSTEM_TYPE_PARAM);
+                return parameter.AsValueString();
+            }
+            catch (Exception)
+            {
+                return string.Empty;
+            }
+        }
+
+        public static string GetDuctSystemTypeName(Duct duct)
+        {
+            try
+            {
+                var parameter = duct.get_Parameter(BuiltInParameter.RBS_DUCT_SYSTEM_TYPE_PARAM);
+                if (parameter == null) { return null; }
+                return parameter.AsValueString();
+            }
+            catch (Exception)
+            {
+                return string.Empty;
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙傛暟鍊� AsDouble
+        /// </summary>
+        /// <param name="elem"></param>
+        /// <param name="builtInParameter"></param>
+        /// <returns></returns>
+        public static double? GetParameterValueAsDouble(Element elem, BuiltInParameter builtInParameter)
+        {
+            double? result = null;
+            if (elem != null && elem.get_Parameter(builtInParameter) is Parameter para)
+            {
+                if (para == null || !para.HasValue) { return result; }
+                result = para.AsDouble();
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙傛暟鍊� AsDouble
+        /// </summary>
+        /// <param name="elem"></param>
+        /// <param name="paramName"></param>
+        /// <param name="innerTo">鍗曚綅杞崲鏂规硶</param>
+        /// <returns></returns>
+        public static double? GetParameterValueAsDouble(Element elem, string paramName, Func<object, double?> innerTo = null)
+        {
+            double? result = null;
+            if (elem != null)
+            {
+                try
+                {
+                    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;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙傛暟鍊� AsDouble
+        /// </summary>
+        /// <param name="elem"></param>
+        /// <param name="paramNames"></param>
+        /// <param name="innerTo"></param>
+        /// <returns></returns>
+        public static double? GetParameterValueAsDouble(Element elem, string[] paramNames, Func<object, double?> innerTo = null)
+        {
+            double? result = null;
+            foreach (var paramName in paramNames)
+            {
+                var res = GetParameterValueAsDouble(elem, paramName, innerTo);
+                if (res != null)
+                {
+                    result = res;
+                    break;
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙傛暟鍊� AsString
+        /// </summary>
+        /// <param name="elem"></param>
+        /// <param name="paramName"></param>
+        /// <returns></returns>
+        public static string GetParameterValueAsString(Element elem, string paramName)
+        {
+            string result = string.Empty;
+            if (elem != null)
+            {
+                Parameter para = elem.GetParameterByProName(paramName);
+                if (para == null || !para.HasValue) { return result; }
+                switch (para.StorageType)
+                {
+                    case StorageType.None:
+                        result = para.AsString();
+                        break;
+                    case StorageType.Integer:
+                        result = para.AsInteger().ToString();
+                        break;
+                    case StorageType.Double:
+                        result = para.AsValueString();
+                        break;
+                    case StorageType.String:
+                        result = para.AsString();
+                        break;
+                    case StorageType.ElementId:
+                        result = para.AsElementId().IntegerValue.ToString();
+                        break;
+                    default:
+                        break;
+                }
+
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙傛暟鍊� AsValueString
+        /// </summary>
+        /// <param name="elem"></param>
+        /// <param name="paramName"></param>
+        /// <returns></returns>
+        public static string GetParameterValueAsValueString(Element elem, string paramName)
+        {
+            string result = null;
+            if (elem != null)
+            {
+                Parameter para = elem.GetParameterByProName(paramName);
+                if (para == null || !para.HasValue) { return result; }
+                switch (para.StorageType)
+                {
+                    case StorageType.None:
+                        result = para.AsString();
+                        break;
+                    case StorageType.Integer:
+                        result = para.AsInteger().ToString();
+                        break;
+                    case StorageType.Double:
+                        result = para.AsValueString();
+                        break;
+                    case StorageType.String:
+                        result = para.AsString();
+                        break;
+                    case StorageType.ElementId:
+                        result = para.AsElementId().IntegerValue.ToString();
+                        break;
+                    default:
+                        break;
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙傛暟鍊� AsDouble
+        /// </summary>
+        /// <param name="elem"></param>
+        /// <param name="paramName"></param>
+        /// <param name="builtInParameter"></param>
+        /// <param name="innerTo">鍗曚綅杞崲鏂规硶</param>
+        /// <returns></returns>
+        public static double? GetParameterValueAsDouble(Element elem, string paramName, BuiltInParameter builtInParameter, Func<object, double?> innerTo = null)
+        {
+            double? result = null;
+            try
+            {
+                if (elem != null)
+                {
+                    Parameter para = elem.GetParameter(paramName, builtInParameter);
+                    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 null;
+            }
+            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>
+        /// <param name="str"></param>
+        /// <returns></returns>
+        private static double? StringToDouble(string str)
+        {
+            double? value = null;
+            if (string.IsNullOrWhiteSpace(str))
+                return value;
+
+            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);
+            string newStr = "";
+            while (m.Success)
+            {
+                //鍖归厤鎴愬姛
+                newStr += m.Groups[0].Value;
+
+                //浠庝笂涓�涓尮閰嶇粨鏉熺殑浣嶇疆寮�濮嬩笅涓�涓尮閰�
+                m = m.NextMatch();
+            }
+            if (newStr == "")
+            {
+                return value;
+            }
+            value = Convert.ToDouble(newStr);
+            return value;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙傛暟鍊� AsString
+        /// </summary>
+        /// <param name="elem"></param>
+        /// <param name="paramName"></param>
+        /// <param name="builtInParameter"></param>
+        /// <returns></returns>
+        public static string GetParameterValueAsString(Element elem, string paramName, BuiltInParameter builtInParameter)
+        {
+            string result = null;
+            if (elem != null)
+            {
+                Parameter para = elem.GetParameter(paramName, builtInParameter);
+                if (para == null || !para.HasValue) { return result; }
+                switch (para.StorageType)
+                {
+                    case StorageType.None:
+                        result = para.AsString();
+                        break;
+                    case StorageType.Integer:
+                        result = para.AsInteger().ToString();
+                        break;
+                    case StorageType.Double:
+                        result = para.AsValueString();
+                        break;
+                    case StorageType.String:
+                        result = para.AsString();
+                        break;
+                    case StorageType.ElementId:
+                        result = para.AsElementId().IntegerValue.ToString();
+                        break;
+                    default:
+                        break;
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙傛暟鍊� AsValueString
+        /// </summary>
+        /// <param name="elem"></param>
+        /// <param name="paramName"></param>
+        /// <param name="builtInParameter"></param>
+        /// <returns></returns>
+        public static string GetParameterValueAsValueString(Element elem, string paramName, BuiltInParameter builtInParameter)
+        {
+            string result = null;
+            if (elem != null)
+            {
+                Parameter para = elem.GetParameter(paramName, builtInParameter);
+                if (para == null || !para.HasValue) { return result; }
+                result = para.AsValueString();
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙傛暟鍊� AsInt
+        /// </summary>
+        /// <param name="elem"></param>
+        /// <param name="paramName"></param>
+        /// <param name="builtInParameter"></param>
+        /// <returns></returns>
+        public static int? GetParameterValueAsInt(Element elem, string paramName, BuiltInParameter builtInParameter)
+        {
+            int? result = null;
+            if (elem != null)
+            {
+                Parameter para = elem.GetParameter(paramName, builtInParameter);
+                if (para == null || !para.HasValue) { return result; }
+                switch (para.StorageType)
+                {
+                    case StorageType.None:
+                        break;
+                    case StorageType.Integer:
+                        result = para.AsInteger();
+                        break;
+                    case StorageType.Double:
+                        //涓嶅鐞�
+                        break;
+                    case StorageType.String:
+                        break;
+                    case StorageType.ElementId:
+                        result = para.AsElementId().IntegerValue;
+                        break;
+                    default:
+                        break;
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙傛暟鍊� AsInt
+        /// </summary>
+        /// <param name="elem"></param>
+        /// <param name="paramName"></param>
+        /// <param name="builtInParameter"></param>
+        /// <returns></returns>
+        public static int? GetParameterValueAsInt(Element elem, string paramName)
+        {
+            int? result = null;
+            if (elem != null)
+            {
+                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:
+                        {
+                            var ret = para.AsDouble();
+                            result = (int)ret;
+                            break;
+                        }
+                    case StorageType.String:
+                        {
+                            var str = para.AsString();
+                            if (int.TryParse(str, out int ret))
+                            {
+                                return ret;
+                            }
+                            break;
+                        }
+                    case StorageType.ElementId:
+                        result = para.AsElementId().IntegerValue;
+                        break;
+                    default:
+                        break;
+                }
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙傛暟鍊� AsElementId
+        /// </summary>
+        /// <param name="elem"></param>
+        /// <param name="paramName"></param>
+        /// <param name="builtInParameter"></param>
+        /// <returns></returns>
+        public static ElementId GetParameterValueAsElementId(Element elem, string paramName, BuiltInParameter builtInParameter)
+        {
+            ElementId result = null;
+            if (elem != null)
+            {
+                Parameter para = elem.GetParameter(paramName, builtInParameter);
+                if (para == null || !para.HasValue) { return result; }
+                result = para.AsElementId();
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙傛暟鍊� AsElementId
+        /// </summary>
+        /// <param name="elem"></param>
+        /// <param name="paramName"></param>
+        /// <param name="builtInParameter"></param>
+        /// <returns></returns>
+        public static ElementId GetParameterValueAsElementId(Element elem, BuiltInParameter builtInParameter)
+        {
+            ElementId result = null;
+            if (elem != null)
+            {
+                Parameter para = elem.get_Parameter(builtInParameter);
+                if (para == null || !para.HasValue) { return result; }
+                result = para.AsElementId();
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍙傛暟鍊� AsElementId
+        /// </summary>
+        /// <param name="elem"></param>
+        /// <param name="paramName"></param>
+        /// <param name="builtInParameter"></param>
+        /// <returns></returns>
+        public static ElementId GetParameterValueAsElementId(Element elem, string paramName)
+        {
+            ElementId result = null;
+            if (elem != null)
+            {
+                Parameter para = elem.GetParameterByProName(paramName);
+                if (para == null || !para.HasValue) { return result; }
+                result = para.AsElementId();
+            }
+            return result;
+        }
+
+        /// <summary>
+        /// 鑾峰彇绯荤粺绫诲瀷鍚嶇О瀛楃涓�
+        /// </summary>
+        /// <param name="elem"></param>
+        /// <param name="paramName"></param>
+        /// <param name="builtIn"></param>
+        /// <returns></returns>
+        public static string GetSystemTypeName(Element elem, string paramName, BuiltInParameter builtInParameter = BuiltInParameter.INVALID)
+        {
+            string res = null;
+            try
+            {
+                if (builtInParameter != BuiltInParameter.INVALID)
+                {
+                    Parameter para = elem.GetParameter(paramName, builtInParameter);
+                    if (para != null)
+                    {
+                        if (para.StorageType == StorageType.ElementId)
+                        {
+                            var elemId = para.AsElementId();
+                            if (elemId != null && elemId != ElementId.InvalidElementId)
+                            {
+                                var tempElem = elem.Document.GetElement(elemId);
+                                res = tempElem.Name;
+                            }
+                        }
+                        else
+                        {
+                            res = para.AsValueString();
+                        }
+                    }
+                }
+                else
+                {
+                    Parameter para = elem.GetParameterByProName(paramName);
+                    if (para != null)
+                    {
+                        if (para.StorageType == StorageType.ElementId)
+                        {
+                            var elemId = para.AsElementId();
+                            if (elemId != null && elemId != ElementId.InvalidElementId)
+                            {
+                                var tempElem = elem.Document.GetElement(elemId);
+                                res = tempElem.Name;
+                            }
+                        }
+                        else
+                        {
+                            res = para.AsValueString();
+                        }
+                    }
+                }
+            }
+            catch
+            {
+
+            }
+            return res;
+        }
+    }
+
+    public static class ParameterUtil
+    {
+        /// <summary>
+        /// 鏈夊唴缃弬鏁扮殑锛岃皟鐢ㄨ鍑芥暟
+        /// </summary>
+        /// <param name="element"></param>
+        /// <param name="parameterName">鍙傛暟鍚�</param>
+        /// <param name="builtInParameter">鍐呯疆鍙傛暟</param>
+        /// <returns></returns>
+        public static Parameter GetParameter(this Element element, string parameterName, BuiltInParameter builtInParameter)
+        {
+            Parameter para = null;
+            try
+            {
+                if (element is ElementType)
+                {
+                    para = element.get_Parameter(builtInParameter);
+                }
+                else
+                {
+                    para = element.get_Parameter(builtInParameter);
+                    if (para == null)
+                    {
+                        var typeId = element.GetTypeId();
+                        if (typeId == null)
+                        {
+                            return null;
+                        }
+                        var type = element.Document.GetElement(typeId) as ElementType;
+                        para = type.get_Parameter(builtInParameter);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                para = null;
+            }
+
+            return para == null ? GetParameterByProName(element, parameterName) : para;
+        }
+
+        /// <summary>
+        /// 鏍规嵁鍙傛暟鍚嶈幏鍙栧弬鏁帮紝濡傛灉element鏄被鍨嬶紝鑾峰彇鐨勫氨鏄被鍨嬪弬鏁帮紝
+        /// 濡傛灉element鏄疄渚嬶紝鍏堣幏鍙栧疄渚嬪弬鏁帮紝濡傛灉鑾峰彇涓嶅埌锛屽氨鑾峰彇绫诲瀷鍙傛暟锛屽疄渚嬪弬鏁颁紭鍏�
+        /// 濡傛灉鍙傛暟鏈夊涓紝鍙栨湁鍙傛暟鍊肩殑閭d釜锛屽鏋滃涓湁鍙傛暟鍊硷紝灏卞彇绗竴涓湁鍙傛暟鍊肩殑
+        /// </summary>
+        /// <param name="element"></param>
+        /// <param name="parameterName"></param>
+        /// <returns></returns>
+        public static Parameter GetParameterByProName(this Element element, string parameterName)
+        {
+            if (element is ElementType elementType)
+            {
+                return GetParameterByName(elementType, parameterName);
+            }
+            else
+            {
+                var result = GetParameterByName(element, parameterName);
+                if (result != null)
+                {
+                    return result;
+                }
+                var typeId = element.GetTypeId();
+                if (typeId == null || typeId == ElementId.InvalidElementId)
+                {
+                    return null;
+                }
+                var type = element.Document.GetElement(typeId) as ElementType;
+                return GetParameterByName(type, parameterName);
+            }
+        }
+
+        /// <summary>
+        /// 鏍规嵁鍙傛暟鍚嶈幏鍙栧弬鏁帮紝濡傛灉element鏄被鍨嬶紝鑾峰彇鐨勫氨鏄被鍨嬪弬鏁帮紝
+        /// 濡傛灉element鏄疄渚嬶紝鍏堣幏鍙栧疄渚嬪弬鏁帮紝濡傛灉鑾峰彇涓嶅埌锛屽氨鑾峰彇绫诲瀷鍙傛暟锛屽疄渚嬪弬鏁颁紭鍏�
+        /// 濡傛灉鍙傛暟鏈夊涓紝鍙栨湁鍙傛暟鍊肩殑閭d釜锛屽鏋滃涓湁鍙傛暟鍊硷紝灏卞彇绗竴涓湁鍙傛暟鍊肩殑
+        /// </summary>
+        /// <param name="element"></param>
+        /// <param name="paramNames">鍙傛暟鍚嶇О鍒楄〃銆愭湁涓�涓尮閰嶅垯鐩存帴杩斿洖銆�</param>
+        /// <returns></returns>
+        public static Parameter GetParameterByProName(this Element element, List<string> paramNames)
+        {
+            Parameter ret = null;
+            foreach (var parameterName in paramNames)
+            {
+                if (element is ElementType elementType)
+                {
+                    ret = GetParameterByName(elementType, parameterName);
+                    if (ret == null) { continue; }
+                }
+                else
+                {
+                    var result = GetParameterByName(element, parameterName);
+                    if (result != null)
+                    {
+                        return result;
+                    }
+                    var typeId = element.GetTypeId();
+                    if (typeId == null || typeId == ElementId.InvalidElementId)
+                    {
+                        continue; 
+                    }
+                    var type = element.Document.GetElement(typeId) as ElementType;
+                    ret = GetParameterByName(type, parameterName);
+                    if (ret == null) { continue; }
+                }
+                if (ret != null)
+                {
+                    return ret;
+                }
+            }
+            return null;
+        }
+
+        /// <summary>
+        /// 鏍规嵁鍙傛暟鍚嶈幏鍙栵紝濡傛灉鍙傛暟鏈夊涓紝鍙栨湁鍙傛暟鍊肩殑閭d釜锛屽鏋滃涓湁鍙傛暟鍊硷紝灏卞彇绗竴涓湁鍙傛暟鍊肩殑
+        /// </summary>
+        /// <param name="element"></param>
+        /// <param name="parameterName"></param>
+        /// <returns></returns>
+        private static Parameter GetParameterByName(this Element element, string parameterName)
+        {
+            if (string.IsNullOrEmpty(parameterName))
+            {
+                return null;
+            }
+            var parameters = element.GetParameters(parameterName);
+            if (parameters.Count == 0)
+            {
+                return null;
+            }
+            if (parameters.Count == 1)
+            {
+                return parameters[0];
+            }
+            //濡傛灉鍙傛暟鏈夊涓紝鑾峰彇鏈夊�肩殑鍙傛暟
+            var tempParams = parameters.Where(x => !string.IsNullOrEmpty(ParameterOperator.GetParemeterValue(x))).ToList();
+            //濡傛灉澶氫釜鍙傛暟閮芥病鏈夊�� 鍒欒繑鍥炵涓�涓�
+            if (tempParams.Count == 0)
+            {
+                return parameters.First();
+            }
+            //濡傛灉鍙湁涓�涓弬鏁版湁鍊� 鍒欒繑鍥炶繖涓弬鏁�
+            if (tempParams.Count == 1)
+            {
+                return tempParams.First();
+            }
+
+            return tempParams.First();
+        }
+    }
+}

--
Gitblit v1.9.3