Files
MsAddIns/RebarMsAddins/RebarHelpers.cs

209 lines
7.9 KiB
C#
Raw Permalink Normal View History

2026-02-28 21:01:57 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
using Bentley.DgnPlatformNET;
using Bentley.DgnPlatformNET.Elements;
using Bentley.GeometryNET;
using Bentley.MstnPlatformNET;
namespace RebarMsAddins
{
/// <summary>
/// 钢筋帮助类
/// </summary>
internal static class RebarHelpers
{
public static void CreateRebarSolid(List<Rebar> rebars, string levelName = null)
{
var dgnModel = Session.Instance.GetActiveDgnModel();
if (rebars == null || rebars.Count == 0)
{
return;
}
double uorMeter = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMeter;//米与分辨率单位的比值,绝对长度,不随主、子单位设置而改变
var modelRef = Session.Instance.GetActiveDgnModelRef();
var model = Session.Instance.GetActiveDgnModel();
var layer = model.GetLevelCache().GetLevelByName("JG_EC_ZXJ");
foreach (var rebar in rebars)
{
var host = new CustomItemHost(rebar.Element, false);
CurveVector pathCurve = null;
CurveVector profile = null;
var d = rebar.Diameter / 1000 * uorMeter;
//"纵向筋"需要自己定义轮廓和放样线
if (rebar.Element.LevelId == layer.LevelId)
{
var arcs = rebar.Element.GetArcs();
if (arcs.Count > 0)
{
//获取圆弧
var arc = arcs.FirstOrDefault();
//得到圆弧平面的法向
if (!arc.Vector0.CrossProduct(arc.Vector90).TryNormalize(out var normal))
{
continue;
}
var vector = normal * (rebar.Length / 1000 * uorMeter) * 0.5;
//拿到以元素平面为中心的两侧点,作为放样线起终点
var startPoint = arc.Center - vector;
var endPoint = arc.Center + vector;
//创建路径
List<DPoint3d> pos = new List<DPoint3d>() { startPoint, endPoint };
//ElementCreationHelpers.CreateLine(startPoint, endPoint);
pathCurve = CurveVector.CreateLinear(pos, CurveVector.BoundaryType.Open, false);
//截面
DEllipse3d dEllipse3D = DEllipse3d.FromCenterRadiusNormal(startPoint, d / 2, normal);
profile = CurveVector.CreateDisk(dEllipse3D, CurveVector.BoundaryType.Outer);
}
}
else
{
pathCurve = rebar.Element.GetCurveVector();
//起点和起点的切向
pathCurve.GetStartEnd(out var p1, out _, out var t1, out _);
//在起点创建截面
DEllipse3d ellipse = DEllipse3d.FromCenterRadiusNormal(p1, d / 2, t1);
EllipseElement ellipseElem = new EllipseElement(dgnModel, null, ellipse);//使用椭圆几何创建椭圆元素
profile = ellipseElem.GetCurveVector();
}
if (profile == null || pathCurve == null)
{
continue;
}
Create.BodyFromSweep(
out var entity,
profile,
pathCurve,
modelRef,
false,
true,
false,
null,
null,
null,
null);
if (entity != null)
{
BentleyStatus result = Convert1.BodyToElement(out Element eeh, entity, null, dgnModel);//将SolidKernelEntity转换为元素
eeh.AddToModel();//将元素写入模型
if (!string.IsNullOrEmpty(levelName))
{
eeh.SetLevel(levelName);
}
rebar.Element.DeliverItemTypesTo(eeh);
//eeh.AttachItemType()
}
}
}
/// <summary>
/// 按图层获取钢筋的数据
/// </summary>
/// <param name="levelName"></param>
/// <returns>钢筋的数据集合</returns>
public static List<Rebar> GetRebarDataByLevelName(string levelName)
{
//获取当前激活的模型
DgnModel model = Session.Instance.GetActiveDgnModel();
//获取图层
var layer = model.GetLevelCache().GetLevelByName(levelName);
//拿到图层上的元素
var elems = model.GetGraphicElements().Where(e => e.LevelId == layer.LevelId).ToList();
List<Rebar> rebars = new List<Rebar>();
foreach (var elem in elems)
{
//整理钢筋数据
Rebar rebar = new Rebar()
{
Function = elem.GetRebarPropertyValue("ID-100-名称")?.ToString(),
Number = elem.GetRebarPropertyValue("ID-100-编号")?.ToString(),
StrengthRating = elem.GetRebarPropertyValue("TC-100-钢筋强度等级")?.ToString(),
Diameter = Convert.ToDouble(elem.GetRebarPropertyValue("TC-100-直径")),
Element = elem,
Length = elem.GetLength()
};
//纵向筋通过读属性获取
if (levelName == "JG_EC_ZXJ")
{
rebar.Length = Convert.ToDouble(elem.GetRebarPropertyValue("TC-100-长度"));
}
rebars.Add(rebar);
}
return rebars;
}
}
/// <summary>
/// 如何使用
/// </summary>
internal static class Using
{
public static void Command(string unparsed)
{
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
var dgnModelRef = Session.Instance.GetActiveDgnModelRef();
//二衬结构附加筋
var fjj = RebarHelpers.GetRebarDataByLevelName("JG_EC_FJJ");
//二衬结构箍筋
var guj = RebarHelpers.GetRebarDataByLevelName("JG_EC_GuJ");
//二衬结构拉筋
var laj = RebarHelpers.GetRebarDataByLevelName("JG_EC_LaJ");
//二衬结构主筋
var zj = RebarHelpers.GetRebarDataByLevelName("JG_EC_ZJ");
//二衬结构纵向筋
var zxj = RebarHelpers.GetRebarDataByLevelName("JG_EC_ZXJ");
List<Rebar> list = new List<Rebar>();
RebarHelpers.CreateRebarSolid(fjj, "JG_EC_GJMX");
RebarHelpers.CreateRebarSolid(guj, "JG_EC_GJMX");
RebarHelpers.CreateRebarSolid(laj, "JG_EC_GJMX");
RebarHelpers.CreateRebarSolid(zxj, "JG_EC_GJMX");
}
}
/// <summary>
/// 钢筋
/// </summary>
internal class Rebar
{
public override string ToString() { return $"功能:{Function},编号:{Number},直径:{Diameter},长度:{Length}"; }
/// <summary>
/// 钢筋直径mm
/// </summary>
public double Diameter { get; set; }
/// <summary>
/// 关联的元素
/// </summary>
public Element Element { get; set; }
/// <summary>
/// 钢筋类型 拉筋,箍筋,主筋,纵向筋、附加筋等
/// </summary>
public string Function { get; set; }
/// <summary>
/// 钢筋长度
/// </summary>
public double Length { get; set; }
/// <summary>
/// 编号N
/// </summary>
public string Number { get; set; }
/// <summary>
/// 钢筋强度等级HPB
/// </summary>
public string StrengthRating { get; set; }
}
}