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