添加项目文件。
This commit is contained in:
439
ZYJSCSMsAddins/ZYJSCSHelpers.cs
Normal file
439
ZYJSCSMsAddins/ZYJSCSHelpers.cs
Normal file
@@ -0,0 +1,439 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
using Bentley.DgnPlatformNET;
|
||||
using Bentley.DgnPlatformNET.DgnEC;
|
||||
using Bentley.DgnPlatformNET.Elements;
|
||||
using Bentley.ECObjects.Instance;
|
||||
using Bentley.ECObjects.Schema;
|
||||
using Bentley.MstnPlatformNET;
|
||||
|
||||
namespace ZYJSCSMsAddins
|
||||
{
|
||||
/// <summary>
|
||||
/// 专业技术措施,面积:平方米,体积:立方米,长度:米,个数:个
|
||||
/// </summary>
|
||||
/// <example>var models = ZYJSCSHelpers.GetDataByLevelName("JG_ZYJSCS");</example>
|
||||
public class ZYJSCSHelpers
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取元素的图层,如果是一般单元,则按第一个子元素来获取
|
||||
/// </summary>
|
||||
/// <param name="element"></param>
|
||||
/// <returns></returns>
|
||||
private static LevelHandle GetLevel(Element element)
|
||||
{
|
||||
ElementPropertiesGetter getter = new ElementPropertiesGetter(element);
|
||||
|
||||
var lvlcache = Session.Instance.GetActiveDgnFile().GetLevelCache();
|
||||
//一般单元
|
||||
if (element.GetChildren().Count() > 0)
|
||||
{
|
||||
foreach (var elem in element.GetChildren())
|
||||
{
|
||||
if (elem is DisplayableElement && !elem.IsInvisible)
|
||||
{
|
||||
return GetLevel(elem);
|
||||
}
|
||||
}
|
||||
}
|
||||
return lvlcache.GetLevel(getter.Level, true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 按图层获取数据
|
||||
/// </summary>
|
||||
/// <param name="levelName"></param>
|
||||
/// <returns>数据集合</returns>
|
||||
public static List<JSCSModel> GetDataByLevelName(string levelName)
|
||||
{
|
||||
//获取当前激活的模型
|
||||
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
||||
//获取图层
|
||||
var layer = dgnModel.GetLevelCache().GetLevelByName(levelName);
|
||||
if (layer == null)
|
||||
{
|
||||
Debug.WriteLine("图层为空");
|
||||
return new List<JSCSModel>();
|
||||
}
|
||||
//拿到图层上的元素
|
||||
var groups = dgnModel.GetGraphicElements()
|
||||
.Where(e => e.LevelId == layer.LevelId || GetLevel(e).LevelId == layer.LevelId)
|
||||
.GroupBy(e => GetJSCSPropertyValue(e, "ID-100-名称")?.ToString());
|
||||
List<JSCSModel> models = new List<JSCSModel>();
|
||||
|
||||
foreach (var group in groups)
|
||||
{
|
||||
var li = group.ToList();
|
||||
var first = GetJSCSPropertyValue(li.FirstOrDefault(), "ID-100-计量方式")?.ToString();
|
||||
//计量方式都一致
|
||||
//var b = li.TrueForAll(e => GetJSCSPropertyValue(e, "ID-100-计量方式") == first);
|
||||
JSCSModel model = new JSCSModel(first, li);
|
||||
models.Add(model);
|
||||
}
|
||||
return models;
|
||||
}
|
||||
/// <summary>
|
||||
/// 通过属性名获取钢筋的属性值
|
||||
/// </summary>
|
||||
/// <param name="elem">元素</param>
|
||||
/// <param name="propName">属性名</param>
|
||||
/// <returns>属性值,可根据情况进行转换数据类型</returns>
|
||||
public static object GetJSCSPropertyValue(Element elem, string propName)
|
||||
{
|
||||
var instances = new CustomItemHost(elem, false).CustomItems;
|
||||
|
||||
object value = default;
|
||||
foreach (var instance in instances)
|
||||
{
|
||||
if (instance.ClassDefinition.DisplayLabel == "专业技术措施" && instance.ContainsValues)
|
||||
{
|
||||
foreach (var propValue in instance)
|
||||
{
|
||||
if (propValue.Property.DisplayLabel == propName && propValue.TryGetNativeValue(out value))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取元素的长度
|
||||
/// </summary>
|
||||
/// <param name="elem">元素</param>
|
||||
/// <returns>长度值,单位m</returns>
|
||||
public static double GetLength(Element elem)
|
||||
{
|
||||
var uorMeter = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMeter;
|
||||
double length = default;
|
||||
|
||||
if (elem is LineElement line)
|
||||
{
|
||||
length = line.GetCurveVector().SumOfLengths();
|
||||
}
|
||||
if (elem is ComplexStringElement complexString)
|
||||
{
|
||||
length = complexString.GetCurveVector().SumOfLengths();
|
||||
}
|
||||
if (elem is LineStringBaseElement lineStringBase)
|
||||
{
|
||||
length = lineStringBase.GetCurveVector().SumOfLengths();
|
||||
}
|
||||
if (elem is EllipseElement ellipseElement)
|
||||
{
|
||||
length = ellipseElement.GetCurveVector().SumOfLengths();
|
||||
}
|
||||
if (elem is ComplexShapeElement complexShape)
|
||||
{
|
||||
length = complexShape.GetCurveVector().SumOfLengths();
|
||||
}
|
||||
if (elem is BSplineCurveElement bSplineCurve)
|
||||
{
|
||||
length = bSplineCurve.GetCurveVector().SumOfLengths();
|
||||
}
|
||||
return length / uorMeter;
|
||||
}
|
||||
/// <summary>
|
||||
/// 获取属性
|
||||
/// </summary>
|
||||
/// <param name="element"></param>
|
||||
public static List<IECPropertyValue> GetProperties(Element element, string propName)
|
||||
{
|
||||
if (null == element)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(element), "所提供ElemId无效");
|
||||
}
|
||||
List<IECPropertyValue> eCProperties = new List<IECPropertyValue>();
|
||||
DgnECManager ecManager = DgnECManager.Manager;
|
||||
int count = 0;
|
||||
DgnECInstanceCollection instCol = ecManager.GetElementProperties(element, ECQueryProcessFlags.SearchAllClasses);
|
||||
foreach (IDgnECInstance inst in instCol)
|
||||
{
|
||||
count++;
|
||||
IEnumerator<IECProperty> propertyEnum = inst.ClassDefinition.GetEnumerator();
|
||||
while (propertyEnum.MoveNext())
|
||||
{
|
||||
IECPropertyValue propertyValue = inst.GetPropertyValue(propertyEnum.Current.Name);
|
||||
if (propertyValue.IsArray)
|
||||
{
|
||||
IECArrayValue arrayVal = propertyValue as IECArrayValue;
|
||||
if (arrayVal.Count >= 1)
|
||||
propertyValue = arrayVal[0];
|
||||
}
|
||||
var prop = propertyEnum.Current.Name;
|
||||
ECNameValidation.DecodeFromValidName(ref prop);
|
||||
if (propName == prop)
|
||||
{
|
||||
eCProperties.Add(propertyValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
return eCProperties;
|
||||
}
|
||||
}
|
||||
|
||||
public class JSCSModel
|
||||
{
|
||||
private readonly double uorMeter = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMeter;
|
||||
|
||||
public JSCSModel(string measure, List<Element> elements)
|
||||
{
|
||||
Measurement = GetMeasurement(measure);
|
||||
AssociateElements = elements;
|
||||
Name = ZYJSCSHelpers.GetJSCSPropertyValue(elements.FirstOrDefault(), "ID-100-名称")?.ToString();
|
||||
}
|
||||
|
||||
public StringBuilder Message { get; private set; }
|
||||
private double GetArea()
|
||||
{
|
||||
//StringBuilder sb = new StringBuilder();
|
||||
double area = default;
|
||||
foreach (var elem in AssociateElements)
|
||||
{
|
||||
var prop = ZYJSCSHelpers.GetProperties(elem, "SurfaceArea").FirstOrDefault();
|
||||
if (prop != null)
|
||||
{
|
||||
prop.TryGetNativeValue(out var value);
|
||||
double d = Convert.ToDouble(value) / (uorMeter * uorMeter);
|
||||
//sb.AppendLine($"父元素{elem.ElementId}:{elem.Description};面积:{d}");
|
||||
area += d;
|
||||
}
|
||||
if (elem is CellHeaderElement cellElem)
|
||||
{
|
||||
foreach (var child in cellElem.GetChildren())
|
||||
{
|
||||
var childProp = ZYJSCSHelpers.GetProperties(child, "SurfaceArea").FirstOrDefault();
|
||||
if (childProp != null)
|
||||
{
|
||||
childProp.TryGetNativeValue(out var value);
|
||||
double d = Convert.ToDouble(value) / (uorMeter * uorMeter);
|
||||
//sb.AppendLine($"父元素{elem.ElementId}:{elem.Description}中的子元素{child.ElementId}:{child.Description};面积:{d}");
|
||||
area += d;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (elem is SharedCellElement sharedCell)
|
||||
{
|
||||
var definition = sharedCell.GetDefinition(Session.Instance.GetActiveDgnFile());
|
||||
foreach (var child in definition.GetChildren())
|
||||
{
|
||||
var childProp = ZYJSCSHelpers.GetProperties(child, "SurfaceArea").FirstOrDefault();
|
||||
if (childProp != null)
|
||||
{
|
||||
childProp.TryGetNativeValue(out var value);
|
||||
double d = Convert.ToDouble(value) / (uorMeter * uorMeter);
|
||||
//sb.AppendLine($"父元素{elem.ElementId}:{elem.Description}中的子元素{child.ElementId}:{child.Description};面积:{d}");
|
||||
area += d;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//Message = sb;
|
||||
return Math.Round(area, 3, MidpointRounding.AwayFromZero);
|
||||
}
|
||||
|
||||
private double GetLength()
|
||||
{
|
||||
double length = default;
|
||||
//StringBuilder sb = new StringBuilder();
|
||||
|
||||
foreach (var elem in AssociateElements)
|
||||
{
|
||||
//sb.AppendLine($"父元素{elem.ElementId}:{elem.Description};长度:{ZYJSCSHelpers.GetLength(elem)}");
|
||||
length += ZYJSCSHelpers.GetLength(elem);
|
||||
}
|
||||
//Message = sb;
|
||||
return Math.Round(length, 3, MidpointRounding.AwayFromZero);
|
||||
}
|
||||
private Measurement GetMeasurement(string measure)
|
||||
{
|
||||
if (string.IsNullOrEmpty(measure))
|
||||
{
|
||||
return Measurement.Unknow;
|
||||
}
|
||||
if (measure == "个数" || measure == "个" || measure == "数量")
|
||||
{
|
||||
return Measurement.Count;
|
||||
}
|
||||
else if (measure == "长度" || measure == "长" || measure == "毫米" || measure == "米" || measure == "厘米")
|
||||
{
|
||||
return Measurement.Length;
|
||||
}
|
||||
else if (measure == "面积" || measure.StartsWith("平方"))
|
||||
{
|
||||
return Measurement.Area;
|
||||
}
|
||||
else if (measure == "体积" || measure.StartsWith("立方"))
|
||||
{
|
||||
return Measurement.Volume;
|
||||
}
|
||||
return Measurement.Unknow;
|
||||
}
|
||||
private double GetVolume()
|
||||
{
|
||||
double volume = default;
|
||||
//StringBuilder sb = new StringBuilder();
|
||||
|
||||
foreach (var elem in AssociateElements)
|
||||
{
|
||||
//直接可以读取
|
||||
var prop = ZYJSCSHelpers.GetProperties(elem, "Volume").FirstOrDefault();
|
||||
if (prop != null)
|
||||
{
|
||||
prop.TryGetNativeValue(out var value);
|
||||
double d = Convert.ToDouble(value) / (uorMeter * uorMeter * uorMeter);
|
||||
//sb.AppendLine($"父元素{elem.ElementId}:{elem.Description};体积:{d}");
|
||||
volume += d;
|
||||
}
|
||||
//一般单元,能看到子元素
|
||||
if (elem.GetChildren().Count() > 0)
|
||||
{
|
||||
foreach (var child in elem.GetChildren())
|
||||
{
|
||||
var childProp = ZYJSCSHelpers.GetProperties(child, "Volume").FirstOrDefault();
|
||||
if (childProp != null)
|
||||
{
|
||||
childProp.TryGetNativeValue(out var value);
|
||||
double d = Convert.ToDouble(value) / (uorMeter * uorMeter * uorMeter);
|
||||
//sb.AppendLine($"父元素{elem.ElementId}:{elem.Description}中的子元素{child.ElementId}:{child.Description};体积:{d}");
|
||||
volume += d;
|
||||
}
|
||||
}
|
||||
}
|
||||
//共享单元看不到子元素
|
||||
if (elem is SharedCellElement sharedCell)
|
||||
{
|
||||
//var definition = sharedCell.GetDefinition(Session.Instance.GetActiveDgnFile());
|
||||
DropGeometry geom = new DropGeometry();
|
||||
geom.SetOptions(DropGeometry.Options.OPTION_SharedCells);
|
||||
geom.SetSharedCellOptions(DropGeometry.SharedCells.SHAREDCELL_Geometry);
|
||||
var status = MstnMixedAssistant.ElementOperation.DropElement(sharedCell, out var agenda, geom);
|
||||
if (status == StatusInt.Success)
|
||||
{
|
||||
for (uint i = 0; i < agenda.GetCount(); i++)
|
||||
{
|
||||
var child = agenda.GetEntry(i);
|
||||
var childProp = ZYJSCSHelpers.GetProperties(child, "Volume").FirstOrDefault();
|
||||
//第一次打散后,但是还是找不到体积属性,需要二次打散
|
||||
if (childProp == null)
|
||||
{
|
||||
DropGeometry geomSub = new DropGeometry();
|
||||
geomSub.SetOptions(DropGeometry.Options.OPTION_AppData);
|
||||
geomSub.SetSolidsOptions(DropGeometry.Solids.SOLID_Surfaces);
|
||||
var statusSub = MstnMixedAssistant.ElementOperation.DropElement(child, out var agendaSub, geomSub);
|
||||
if (statusSub == StatusInt.Success)
|
||||
{
|
||||
for (uint j = 0; j < agendaSub.GetCount(); j++)
|
||||
{
|
||||
var childSub = agendaSub.GetEntry(j);
|
||||
var childPropSub = ZYJSCSHelpers.GetProperties(childSub, "Volume").FirstOrDefault();
|
||||
if (childPropSub != null)
|
||||
{
|
||||
childPropSub.TryGetNativeValue(out var valueSub);
|
||||
var d = Convert.ToDouble(valueSub) / (uorMeter * uorMeter * uorMeter);
|
||||
volume += d;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
childProp.TryGetNativeValue(out var value);
|
||||
double d = Convert.ToDouble(value) / (uorMeter * uorMeter * uorMeter);
|
||||
//sb.AppendLine($"父元素{elem.ElementId}:{elem.Description}中的子元素{child.ElementId}:{child.Description};体积:{d}");
|
||||
volume += d;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//Message = sb;
|
||||
return Math.Round(volume, 3, MidpointRounding.AwayFromZero);
|
||||
}
|
||||
//private int GetCount()
|
||||
//{
|
||||
// StringBuilder sb = new StringBuilder();
|
||||
|
||||
// foreach (var elem in AssociateElements)
|
||||
// {
|
||||
// sb.AppendLine($"父元素{elem.ElementId}:{elem.Description};个数:1");
|
||||
// }
|
||||
// Message = sb;
|
||||
// return 1;
|
||||
//}
|
||||
public List<Element> AssociateElements { get; }
|
||||
/// <summary>
|
||||
/// 计量方式
|
||||
/// </summary>
|
||||
public Measurement Measurement
|
||||
{
|
||||
get; private set;
|
||||
|
||||
}
|
||||
public string Unit { get; private set; }
|
||||
public string Name { get; }
|
||||
|
||||
public double Result
|
||||
{
|
||||
get
|
||||
{
|
||||
double result = 0.0;
|
||||
switch (Measurement)
|
||||
{
|
||||
case Measurement.Count:
|
||||
result = AssociateElements.Count;
|
||||
//result = GetCount();
|
||||
break;
|
||||
case Measurement.Length:
|
||||
result = GetLength();
|
||||
Unit = "m";
|
||||
break;
|
||||
case Measurement.Area:
|
||||
result = GetArea();
|
||||
Unit = "㎡";
|
||||
break;
|
||||
case Measurement.Volume:
|
||||
result = GetVolume();
|
||||
Unit = "m³";
|
||||
break;
|
||||
case Measurement.Unknow:
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 计量方式
|
||||
/// </summary>
|
||||
public enum Measurement
|
||||
{
|
||||
Unknow,
|
||||
/// <summary>
|
||||
/// 个数
|
||||
/// </summary>
|
||||
Count,
|
||||
/// <summary>
|
||||
/// 长度
|
||||
/// </summary>
|
||||
Length,
|
||||
/// <summary>
|
||||
/// 面积
|
||||
/// </summary>
|
||||
Area,
|
||||
/// <summary>
|
||||
/// 体积
|
||||
/// </summary>
|
||||
Volume
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user