From e5b04afb7062a908c700f66a1a33aaa5eb98b7bb Mon Sep 17 00:00:00 2001
From: zhangyk-c <zhangyk-c@glodon.com>
Date: 星期二, 30 七月 2024 12:19:10 +0800
Subject: [PATCH] 更新导出json功能

---
 HStation.RevitDev/RevitDataExport/Utility/ParameterOperator.cs |  452 +++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 378 insertions(+), 74 deletions(-)

diff --git a/HStation.RevitDev/RevitDataExport/Utility/ParameterOperator.cs b/HStation.RevitDev/RevitDataExport/Utility/ParameterOperator.cs
index 6047ec2..5b5c2a5 100644
--- a/HStation.RevitDev/RevitDataExport/Utility/ParameterOperator.cs
+++ b/HStation.RevitDev/RevitDataExport/Utility/ParameterOperator.cs
@@ -1,19 +1,248 @@
-锘縰sing Autodesk.Revit.Creation;
-using Autodesk.Revit.DB;
-using Autodesk.Revit.DB.Architecture;
+锘縰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;
-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>
-        /// 灏嗙壒娈婄殑瀛楃涓茶浆鎴恑nt琛ㄧず鐨刡ool
-        /// </summary>
-        /// <param name="str"></param>
-        /// <returns></returns>
-        private static int? StringToInt(string str)
-        {
-            if (str == "鏄�" || str == "姝g‘" || 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>

--
Gitblit v1.9.3