添加项目文件。

This commit is contained in:
GG Z
2026-02-28 21:01:57 +08:00
parent 9fe4e5a9aa
commit 7a229067cc
175 changed files with 18060 additions and 0 deletions

View File

@@ -0,0 +1,296 @@
using System;
using System.Collections.Generic;
using Bentley.DgnPlatformNET;
using Bentley.DgnPlatformNET.DgnEC;
using Bentley.DgnPlatformNET.Elements;
using Bentley.ECObjects.Instance;
using Bentley.GeometryNET;
using Bentley.MstnPlatformNET;
namespace RebarMsAddins
{
/// <summary>
/// 元素扩展类
/// </summary>
public static class ElementExtensions
{
/// <summary>
/// 通过属性名获取钢筋的属性值
/// </summary>
/// <param name="elem">元素</param>
/// <param name="propName">属性名</param>
/// <returns>属性值,可根据情况进行转换数据类型</returns>
public static object GetRebarPropertyValue(this Element elem, string propName)
{
var instances = new CustomItemHost(elem, false).CustomItems;
object value = default;
foreach (var instance in instances)
{
if ((instance.ClassDefinition.DisplayLabel == "钢筋" || instance.ClassDefinition.DisplayLabel == "纵向钢筋") && instance.ContainsValues)
{
foreach (var propValue in instance)
{
if (propValue.Property.DisplayLabel == propName && propValue.TryGetNativeValue(out value))
{
break;
}
}
}
}
return value;
}
/// <summary>
/// 元素之间传递ItemTypes及值
/// </summary>
/// <param name="source"></param>
/// <param name="target"></param>
public static void DeliverItemTypesTo(this Element source, Element target)
{
CustomItemHost host = new CustomItemHost(source, true);//声明元素的CustomItemHost
var instances = host.CustomItems;
//List<ItemType> list = new List<ItemType>();
foreach (var instance in instances)
{
var ecClass = instance.ClassDefinition;//ItemTypes
var lib = ecClass.Schema;//ItemTypesLibrary
target.AttachItemType(lib.DisplayLabel, ecClass.DisplayLabel);
if (instance.ContainsValues)
{
foreach (var propValue in instance)
{
if (propValue.TryGetNativeValue(out var value))
{
var prop = propValue.Property;
target.SetECPropertyValues(prop.DisplayLabel, value);
}
}
}
}
}
/// <summary>
/// 通过属性名设置属性值,多个同名属性会同时设置
/// </summary>
/// <param name="elem">元素</param>
/// <param name="propName">属性名</param>
/// <returns></returns>
public static void SetECPropertyValues(this Element elem, string propName, object value)
{
var instances = new CustomItemHost(elem, false).CustomItems;
try
{
foreach (var instance in instances)
{
instance.SetValue(propName, value);
instance.WriteChanges();
}
}
catch (Exception)
{
}
}
/// <summary>
/// 获取ItemType包含多个CustomProperty
/// </summary>
/// <param name="itemLibName"></param>
/// <param name="itemTypeName"></param>
/// <returns></returns>
public static ItemType GetItemType(string itemLibName, string itemTypeName)
{
DgnFile dgnFile = Session.Instance.GetActiveDgnFile();
//根据声明名称获取对应的ItemTypeLibrary
ItemTypeLibrary itemTypeLibrary = ItemTypeLibrary.FindByName(itemLibName, dgnFile);
return itemTypeLibrary?.GetItemTypeByName(itemTypeName);
}
/// <summary>
/// 挂接ItemType到元素
/// </summary>
/// <param name="elem"></param>
/// <param name="itemLibName"></param>
/// <param name="itemTypeName"></param>
public static void AttachItemType(this Element elem, string itemLibName, string itemTypeName)
{
DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
//根据声明名称获取对应的ItemType
ItemType itemType = GetItemType(itemLibName, itemTypeName);
CustomItemHost host = new CustomItemHost(elem, true);//声明元素的CustomItemHost
//实例化
IDgnECInstance item = host.ApplyCustomItem(itemType, true);//对CustomItemHost添加ItemType得到EC实例
EditParameterDefinitions defs = EditParameterDefinitions.GetForModel(dgnModel);//获得模型中的参数定义
DgnECInstanceEnabler enabler = DgnECManager.Manager.ObtainInstanceEnabler(dgnFile, itemType.ECClass);//获得文件中使用指定EC类的EC实例
if (null != enabler && enabler.SupportsCreateInstanceOnElement)//判断是否是否支持对元素挂接EC实例
defs.SetDomainParameters(enabler.SharedWipInstance);//对参数定义设置域参数
item.ScheduleChanges(elem);//对元素更新ItemType信息
elem.ReplaceInModel(elem);
}
/// <summary>
/// 设置元素图层
/// </summary>
/// <param name="element"></param>
/// <param name="leveName"></param>
/// <remarks>图层名不存在时,则创建</remarks>
/// <returns></returns>
public static Element SetLevel(this Element element, string leveName)
{
Element oldElem = Element.GetFromElementRef(element.GetNativeElementRef());
if (string.IsNullOrEmpty(leveName))
{
return element;
}
//获取指定名层
DgnFile dgnfile = Session.Instance.GetActiveDgnFile();
FileLevelCache lvlCache = dgnfile.GetLevelCache();
LevelHandle lvlHandle = lvlCache.GetLevelByName(leveName);
if (!lvlHandle.IsValid)//当前文件中不存在时创建
{
lvlCache.CreateLevel(leveName);
lvlCache.Write();
lvlHandle = lvlCache.GetLevelByName(leveName);
}
//设置元素的层属性写入模型中
ElementPropertiesSetter eleSet = new ElementPropertiesSetter();
eleSet.SetLevel(lvlHandle.LevelId);
eleSet.Apply(element);
element.ReplaceInModel(oldElem);
return element;
}
/// <summary>
/// 获取元素的长度
/// </summary>
/// <param name="elem">元素</param>
/// <returns>长度值单位m保留两位小数</returns>
public static double GetLength(this 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 LineStringElement lineString)
//{
// curve = lineString.GetCurveVector().SumOfLengths();
// //GetFilteredECPropValue(lineString, "ID-100-名称");
//}
//if (elem is ShapeElement shape)
//{
// curve = shape.GetCurveVector().SumOfLengths();
//}
if (elem is ComplexShapeElement complexShape)
{
length = complexShape.GetCurveVector().SumOfLengths();
}
if (elem is BSplineCurveElement bSplineCurve)
{
length = bSplineCurve.GetCurveVector().SumOfLengths();
}
return Math.Round(length / uorMeter, 3, MidpointRounding.AwayFromZero);
}
/// <summary>
/// 获取元素的CurveVector
/// </summary>
/// <returns></returns>
public static CurveVector GetCurveVector(this Element elem)
{
CurveVector curve = default;
if (elem is LineElement line)
{
curve = line.GetCurveVector();
}
if (elem is ComplexStringElement complexString)
{
curve = complexString.GetCurveVector();
}
if (elem is LineStringBaseElement lineStringBase)
{
curve = lineStringBase.GetCurveVector();
}
if (elem is EllipseElement ellipseElement)
{
curve = ellipseElement.GetCurveVector();
}
//if (elem is LineStringElement lineString)
//{
// curve = lineString.GetCurveVector();
// //GetFilteredECPropValue(lineString, "ID-100-名称");
//}
//if (elem is ShapeElement shape)
//{
// curve = shape.GetCurveVector();
//}
if (elem is ComplexShapeElement complexShape)
{
curve = complexShape.GetCurveVector();
}
if (elem is BSplineCurveElement bSplineCurve)
{
curve = bSplineCurve.GetCurveVector();
}
return curve;
}
/// <summary>
/// 获取元素中的圆弧
/// </summary>
/// <param leveName="elem"></param>
/// <returns>若没有,则返回空列表</returns>
public static List<DEllipse3d> GetArcs(this Element elem)
{
var list = new List<DEllipse3d>();
foreach (var child in elem.GetCurveVector())
{
if (child.GetCurvePrimitiveType() == CurvePrimitive.CurvePrimitiveType.Arc)
{
child.TryGetArc(out var arc);
list.Add(arc);
}
}
return list;
}
/// <summary>
/// 获取元素中线
/// </summary>
/// <param leveName="elem"></param>
/// <returns></returns>
public static List<DSegment3d> GetLines(this Element elem)
{
var list = new List<DSegment3d>();
foreach (var child in elem.GetCurveVector())
{
if (child.GetCurvePrimitiveType() == CurvePrimitive.CurvePrimitiveType.Arc)
{
child.TryGetLine(out var line);
list.Add(line);
}
}
return list;
}
}
}

View File

@@ -0,0 +1,33 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("RebarMsAddins")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("RebarMsAddins")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("4421ef72-cd7e-4618-beb6-4873fba33950")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,208 @@
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; }
}
}

View File

@@ -0,0 +1,50 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net48</TargetFramework>
<OutputType>Library</OutputType>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />
<PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
<Reference Include="Bentley.Platform">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\dlls\Bentley.Platform.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Bentley.DgnDisplayNet" HintPath="..\dlls\Bentley.DgnDisplayNet.dll" SpecificVersion="False" Private="False" />
<!--<Reference Include="Bentley.MicroStation" HintPath="$(MSAssemblies)Bentley.MicroStation.dll" Private="False" />-->
<Reference Include="Bentley.DgnPlatformNET" SpecificVersion="False" HintPath="..\dlls\Bentley.DgnPlatformNET.dll" Private="False" />
<Reference Include="Bentley.ECObjects3">
<SpecificVersion>False</SpecificVersion>
<HintPath><!--$(MSAssemblies)-->..\dlls\Bentley.ECObjects3.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Bentley.ECObjects.MixedMode3">
<SpecificVersion>False</SpecificVersion>
<HintPath><!--$(MSAssemblies)-->..\dlls\Bentley.ECObjects.MixedMode3.dll</HintPath>
<Private>False</Private>
</Reference>
<Reference Include="Bentley.GeometryNET">
<SpecificVersion>False</SpecificVersion>
<Private>False</Private>
<HintPath><!--$(BentleyReferencePath)-->..\dlls\Bentley.GeometryNET.dll</HintPath>
</Reference>
<Reference Include="Bentley.GeometryNET.Structs">
<Private>False</Private>
<HintPath><!--$(BentleyReferencePath)-->..\dlls\Bentley.GeometryNET.Structs.dll</HintPath>
</Reference>
<!--<Reference Include="MstnMixedAssistant">
<HintPath>..\dlls\MstnMixedAssistant.dll</HintPath>
<Private>True</Private>
</Reference>-->
<Reference Include="ustation">
<HintPath><!--$(BentleyReferencePath)-->..\dlls\ustation.dll</HintPath>
<Private>False</Private>
</Reference>
</ItemGroup>
</Project>