475 lines
27 KiB
C#
475 lines
27 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
using System.Text;
|
|||
|
|
using System.Threading.Tasks;
|
|||
|
|
using System.Windows;
|
|||
|
|
|
|||
|
|
using Bentley.DgnPlatformNET;
|
|||
|
|
using Bentley.DgnPlatformNET.Elements;
|
|||
|
|
using Bentley.GeometryNET;
|
|||
|
|
using Bentley.MstnPlatformNET;
|
|||
|
|
|
|||
|
|
using Mstn.Toolkit.Extensions;
|
|||
|
|
|
|||
|
|
namespace Mstn.Toolkit.External
|
|||
|
|
{
|
|||
|
|
internal class SelectionExtensions
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 围栅(临时组合)
|
|||
|
|
/// </summary>
|
|||
|
|
/// <remarks>只在当前操作期内有效,关闭DGN后再打开将不复存在,命名围栅则可以保存下来</remarks>
|
|||
|
|
/// <param name="unparsed"></param>
|
|||
|
|
public static void CreateFenceByElement(string unparsed)//Case:FenceClipByElement
|
|||
|
|
{
|
|||
|
|
DgnModelRef dgnModelRef = Session.Instance.GetActiveDgnModelRef();//获得当前的模型空间/参照空间 注:DgnModelRef是一个基类,DgnModel和DgnAttachment都派生于这个基类
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的模型控件
|
|||
|
|
Viewport view = Session.GetActiveViewport();//获得当前视图信息
|
|||
|
|
double uorPerMas = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMaster;//分辨率单位转换为主单位
|
|||
|
|
#region Create complex shape element
|
|||
|
|
DPoint3d p1 = new(-10 * uorPerMas, 0, 0);//声明线串元素端点
|
|||
|
|
DPoint3d p2 = new(-10 * uorPerMas, 260 * uorPerMas, 0);
|
|||
|
|
DPoint3d p3 = new(110 * uorPerMas, 260 * uorPerMas, 0);
|
|||
|
|
DPoint3d p4 = new(110 * uorPerMas, 110 * uorPerMas, 0);
|
|||
|
|
DPoint3d[] pos = { p1, p2, p3, p4 };//声明端点集
|
|||
|
|
LineStringElement lineString = new(dgnModel, null, pos);//声明线串元素
|
|||
|
|
|
|||
|
|
DPoint3d centerPo = new(0, 100 * uorPerMas, 0);//声明弧元素的圆心
|
|||
|
|
ArcElement arc = new(
|
|||
|
|
dgnModel,
|
|||
|
|
null,
|
|||
|
|
centerPo,
|
|||
|
|
110 * uorPerMas,
|
|||
|
|
110 * uorPerMas,
|
|||
|
|
DMatrix3d.Identity,
|
|||
|
|
0,
|
|||
|
|
-Angle.PI.Radians / 2);//声明弧元素
|
|||
|
|
|
|||
|
|
ComplexShapeElement complexShape = new(dgnModel, null);//声明复杂形元素
|
|||
|
|
complexShape.AddComponentElement(lineString);//将子构件添加到复杂元素中
|
|||
|
|
complexShape.AddComponentElement(arc);
|
|||
|
|
complexShape.AddComponentComplete();//子构件添加完成
|
|||
|
|
#endregion
|
|||
|
|
if (StatusInt.Success == FenceManager.DefineByElement(complexShape, view))//使用元素围成的区域声明围栅
|
|||
|
|
{
|
|||
|
|
FenceParameters fenceParams = new(dgnModelRef, DTransform3d.Identity);//声明围栅信息
|
|||
|
|
FenceManager.InitFromActiveFence(fenceParams, false, false, FenceClipMode.None);
|
|||
|
|
/*
|
|||
|
|
* 使用围栅信息初始化围栅
|
|||
|
|
* fenceParameters:围栅信息
|
|||
|
|
* overlap:若需囊括部分包含的元素则输入true
|
|||
|
|
* doClip:若需修剪操作则输入true
|
|||
|
|
* allowClipFlag:若需要在原始元素上剪切则输入FenceClipMode.Original,若需要在新声明的元素上剪切则输入FenceClipMode.Copy
|
|||
|
|
*/
|
|||
|
|
ElementAgenda eAgenda = new();//声明元素容器
|
|||
|
|
DgnModelRef[] modelRefList = new DgnModelRef[1];//设置需要声明围栅的模型空间
|
|||
|
|
modelRefList[0] = dgnModelRef;//设置模型空间
|
|||
|
|
FenceManager.BuildAgenda(fenceParams, eAgenda, modelRefList, false, false, false);
|
|||
|
|
/*
|
|||
|
|
* 使用围栅信息获得符合要求的元素集
|
|||
|
|
* fenceParameters:围栅信息
|
|||
|
|
* elementAgenda:符合要求的元素集
|
|||
|
|
* modelRefList:声明围栅的模型空间
|
|||
|
|
* modifyOrig:是否修改原始元素
|
|||
|
|
* allowLocked:是否允许锁定元素
|
|||
|
|
* callAsynch:是否需要调用异步
|
|||
|
|
*/
|
|||
|
|
string result = "Result:\n";//声明字符串
|
|||
|
|
for (uint i = 0; i < eAgenda.GetCount(); i++)//遍历元素容器中的元素
|
|||
|
|
{
|
|||
|
|
Element element = eAgenda.GetEntry(i);//获得元素容器中的元素
|
|||
|
|
result = result + "ElementId = " + element.ElementId + '\n';//将元素ID写入模型
|
|||
|
|
}
|
|||
|
|
result = result + "Total count: " + eAgenda.GetCount();//输出元素个数
|
|||
|
|
MessageBox.Show(result);//将字符串输出到对话框中
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
public static void ClipElementByFence(string unparsed)//Case:FenceClipByPoints
|
|||
|
|
{
|
|||
|
|
DgnModelRef dgnModelRef = Session.Instance.GetActiveDgnModelRef();//获得当前的模型空间/参照空间 注:DgnModelRef是一个基类,DgnModel和DgnAttachment都派生于这个基类
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得当前激活的模型控件
|
|||
|
|
Viewport view = Session.GetActiveViewport();//获得当前视图信息
|
|||
|
|
double uorPerMas = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMaster;//分辨率单位转换为主单位
|
|||
|
|
|
|||
|
|
DPoint3d p1 = new(-10 * uorPerMas, 0, -130 * uorPerMas);//声明围栅坐标点
|
|||
|
|
DPoint3d p2 = new(-10 * uorPerMas, 0, 200 * uorPerMas);
|
|||
|
|
DPoint3d p3 = new(50 * uorPerMas, 0, 200 * uorPerMas);
|
|||
|
|
DPoint3d p4 = new(50 * uorPerMas, 0, -130 * uorPerMas);
|
|||
|
|
DPoint3d[] pos = { p1, p2, p3, p4 };//使用端点声明端点集
|
|||
|
|
ShapeElement shape = new(dgnModel, null, pos);//声明形元素
|
|||
|
|
|
|||
|
|
if (StatusInt.Success == FenceManager.DefineByElement(shape, view))//使用图形建立围栅
|
|||
|
|
{
|
|||
|
|
FenceParameters fenceParams = new(dgnModelRef, DTransform3d.Identity);//声明围栅信息
|
|||
|
|
FenceManager.InitFromActiveFence(fenceParams, true, true, FenceClipMode.Copy);//使用围栅信息初始化围栅
|
|||
|
|
ElementAgenda eAgenda = new();//声明元素容器
|
|||
|
|
DgnModelRef[] modelRefList = new DgnModelRef[1];//设置需要声明围栅的模型空间
|
|||
|
|
modelRefList[0] = dgnModelRef;//设置模型空间
|
|||
|
|
FenceManager.BuildAgenda(fenceParams, eAgenda, modelRefList, false, false, false);//使用围栅信息获得符合要求的元素集
|
|||
|
|
for (uint i = 0; i < eAgenda.GetCount(); i++)//遍历元素容器中的元素
|
|||
|
|
{
|
|||
|
|
ElementAgenda insideElems = new();//声明元素容器
|
|||
|
|
ElementAgenda outsideElems = new();//声明元素容器
|
|||
|
|
Element element = eAgenda.GetEntry(i);//获得元素容器中的元素
|
|||
|
|
|
|||
|
|
FenceManager.ClipElement(fenceParams, insideElems, outsideElems, element, FenceClipFlags.Optimized);//对围栅内的元素进行剪切
|
|||
|
|
for (uint j = 0; j < outsideElems.GetCount(); j++)//遍历围栅切割后生成的外围元素
|
|||
|
|
{
|
|||
|
|
using (ElementCopyContext copyContext = new(dgnModelRef))//复制元素
|
|||
|
|
{
|
|||
|
|
Element elemToCopy = outsideElems.GetEntry(j);//获得切割后生成的外围元素
|
|||
|
|
copyContext.DoCopy(elemToCopy);//将元素复制到指定模型中
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//参考文章:https://communities.bentley.com/communities/other_communities/bdn_other_communities/b/bdn-blog/posts/mesh
|
|||
|
|
public static void BreakElementIntoPolyface(string unparsed)//Case:BreakSolidExample
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前的模型空间
|
|||
|
|
double uorPerMas = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMaster;//分辨率单位转换为主单位
|
|||
|
|
#region Create Solid
|
|||
|
|
#region Create profile
|
|||
|
|
DPoint3d p1 = new(-uorPerMas, uorPerMas, 0);//声明体元素端点
|
|||
|
|
DPoint3d p2 = new(uorPerMas, uorPerMas, 0);
|
|||
|
|
DPoint3d p3 = new(uorPerMas, -uorPerMas, 0);
|
|||
|
|
DPoint3d p4 = new(-uorPerMas, -uorPerMas, 0);
|
|||
|
|
|
|||
|
|
DPoint3d[] pos = { p1, p2, p3, p4 };//将面元素端点添加到面元素端点数组中
|
|||
|
|
|
|||
|
|
ShapeElement shape = new(dgnModel, null, pos);//声明形元素
|
|||
|
|
#endregion
|
|||
|
|
DPoint3d origin = DPoint3d.Zero;//声明拉伸基点
|
|||
|
|
DVector3d extrudeVector = new(uorPerMas, uorPerMas, 10 * uorPerMas);//声明拉伸向量
|
|||
|
|
|
|||
|
|
SurfaceOrSolidElement solid = SurfaceOrSolidElement.CreateProjectionElement(
|
|||
|
|
dgnModel,
|
|||
|
|
null,
|
|||
|
|
shape,
|
|||
|
|
origin,
|
|||
|
|
extrudeVector,
|
|||
|
|
DTransform3d.Identity,
|
|||
|
|
true);//声明实体元素
|
|||
|
|
solid.AddToModel();//将拉伸体写入模型
|
|||
|
|
#endregion
|
|||
|
|
IList<PolyfaceHeader> polyfaces = [];//声明多面体几何列表
|
|||
|
|
|
|||
|
|
FacetOptions facetOptions = new();//曲面属性,用于设置生成曲面或曲线弦的属性声明
|
|||
|
|
facetOptions.SetDefaults();//属性设置为默认
|
|||
|
|
|
|||
|
|
PolyfaceProcessor polyfaceProcessor = new(ref polyfaces, facetOptions);//声明用于分解多面体几何的处理器
|
|||
|
|
polyfaceProcessor.Process(solid); //将需要分解的元素输入处理器中
|
|||
|
|
|
|||
|
|
for (int i = 0; i < polyfaces.Count; i++)//遍历元素中分解后的多面体几何
|
|||
|
|
{
|
|||
|
|
List<uint> colorIndex = [];//声明颜色索引
|
|||
|
|
foreach (DPoint3d po in polyfaces[i].Point)//为了获得该多面体几何的端点个数,对端点进行遍历
|
|||
|
|
{
|
|||
|
|
if (po.Z < 5 * uorPerMas)//Z坐标小于5为红色,否则则为蓝色
|
|||
|
|
{
|
|||
|
|
colorIndex.Add(0x00ff0000);//红色
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
colorIndex.Add(0x000000ff);//蓝色
|
|||
|
|
}
|
|||
|
|
//关于16进制颜色对照请参考:http://each.sinaapp.com/tools/color.html 格式为:0x00+(去掉#)16进制颜色
|
|||
|
|
}
|
|||
|
|
polyfaces[i].IntColor = colorIndex;//设置多面体几何的颜色索引值
|
|||
|
|
polyfaces[i].ActivateVectorsForIndexing(polyfaces[i]);//设置为激活状态,以便携带所有的数据及索引信息
|
|||
|
|
MeshHeaderElement meshElem = new(dgnModel, null, polyfaces[i]);//使用修改后的多面体几何建立网格元素
|
|||
|
|
TransformInfo trans = new(DTransform3d.FromTranslation(new DPoint3d(5 * uorPerMas, 0, 0)));//声明变换信息
|
|||
|
|
meshElem.ApplyTransform(trans);//对网格元素应用变换
|
|||
|
|
meshElem.AddToModel();//将网格元素写入模型
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void BreakElementIntoCurves(string unparsed)//Case:BreakSolidExample
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前的模型空间
|
|||
|
|
double uorPerMas = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMaster;//分辨率单位转换为主单位
|
|||
|
|
#region Create Solid
|
|||
|
|
#region Create profile
|
|||
|
|
DPoint3d p1 = new(-uorPerMas, uorPerMas, 0);//声明体元素端点
|
|||
|
|
DPoint3d p2 = new(uorPerMas, uorPerMas, 0);
|
|||
|
|
DPoint3d p3 = new(uorPerMas, -uorPerMas, 0);
|
|||
|
|
DPoint3d p4 = new(-uorPerMas, -uorPerMas, 0);
|
|||
|
|
|
|||
|
|
DPoint3d[] pos = { p1, p2, p3, p4 };//将面元素端点添加到面元素端点数组中
|
|||
|
|
|
|||
|
|
ShapeElement shape = new(dgnModel, null, pos);//声明形元素
|
|||
|
|
#endregion
|
|||
|
|
DPoint3d origin = DPoint3d.Zero;//声明拉伸基点
|
|||
|
|
DVector3d extrudeVector = new(uorPerMas, uorPerMas, 10 * uorPerMas);//声明拉伸向量
|
|||
|
|
|
|||
|
|
SurfaceOrSolidElement solid = SurfaceOrSolidElement.CreateProjectionElement(
|
|||
|
|
dgnModel,
|
|||
|
|
null,
|
|||
|
|
shape,
|
|||
|
|
origin,
|
|||
|
|
extrudeVector,
|
|||
|
|
DTransform3d.Identity,
|
|||
|
|
true);//声明实体元素
|
|||
|
|
solid.AddToModel();//将拉伸体写入模型
|
|||
|
|
#endregion
|
|||
|
|
IList<CurveVector> curves = [];//声明多面体几何列表
|
|||
|
|
CurveProcessor curveProcessor = new(ref curves);//声明用于分解曲线几何的处理器
|
|||
|
|
curveProcessor.Process(solid); //将需要分解的元素输入处理器中
|
|||
|
|
|
|||
|
|
List<CurveVector> curvesList = [];//声明几何图元列表
|
|||
|
|
for (int i = 0; i < curves.Count; i++)//遍历元素中分解后的曲线几何
|
|||
|
|
{
|
|||
|
|
Element subElem = DraftingElementSchema.ToElement(dgnModel, curves[i], null);//将几何转换成对应的元素
|
|||
|
|
subElem.AddToModel();//将元素写入模型
|
|||
|
|
|
|||
|
|
if (subElem.ElementType == MSElementType.LineString)//判断转换后的元素是否为线串
|
|||
|
|
{
|
|||
|
|
ComplexShapeElement complexShape = new(dgnModel, null);//声明复杂形元素(因为对于线串元素不一定为闭合,有可能无法围城封闭图形,故使用建立shape的形式闭合几何图形)
|
|||
|
|
complexShape.AddComponentElement(subElem);//将线串元素添加到shape元素中
|
|||
|
|
complexShape.AddComponentComplete();//添加元素完成
|
|||
|
|
CurveVector shapeCurve = complexShape.GetCurveVector();//获得shape的封闭图形
|
|||
|
|
CurveVector curveWithFillets = shapeCurve.CloneWithFillets(0.1 * uorPerMas);//对获得的几何图元做倒角处理
|
|||
|
|
curvesList.Add(curveWithFillets);//将几何图元添加到列表中
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
BentleyStatus result = Create.BodyFromLoft(
|
|||
|
|
out SolidKernelEntity entityOut,
|
|||
|
|
curvesList.ToArray(),
|
|||
|
|
curvesList.Count,
|
|||
|
|
curvesList.ToArray(),
|
|||
|
|
0,
|
|||
|
|
dgnModel,
|
|||
|
|
false,
|
|||
|
|
false);//声明扫掠体
|
|||
|
|
Convert1.BodyToElement(out Element solidElem, entityOut, null, dgnModel);//将实体转换为元素
|
|||
|
|
solidElem.AddToModel();//将元素写入模型空间
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#region PracticeWork
|
|||
|
|
public static void CmdPracticeWork(string unparsed)
|
|||
|
|
{
|
|||
|
|
DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得当前激活的文件
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前的模型空间
|
|||
|
|
double uorPerMeter = Session.Instance.GetActiveDgnModel().GetModelInfo().UorPerMeter;//分辨率单位转换为米
|
|||
|
|
#region Create beam
|
|||
|
|
#region Create profile
|
|||
|
|
double H = 700 * uorPerMeter / 1000;
|
|||
|
|
double H1 = 125 * uorPerMeter / 1000, H2 = 125 * uorPerMeter / 1000;
|
|||
|
|
double H3 = 275 * uorPerMeter / 1000;
|
|||
|
|
double H4 = 75 * uorPerMeter / 1000, B4 = 75 * uorPerMeter / 1000;
|
|||
|
|
double H5 = 100 * uorPerMeter / 1000;
|
|||
|
|
double B3 = 125 * uorPerMeter / 1000;
|
|||
|
|
double B1 = 400 * uorPerMeter / 1000;
|
|||
|
|
double B2 = 300 * uorPerMeter / 1000;
|
|||
|
|
double B = 150 * uorPerMeter / 1000;
|
|||
|
|
|
|||
|
|
DPoint3d p1 = new(-1 * 0.5 * B1, 0, 0);//声明体元素端点
|
|||
|
|
DPoint3d p2 = new(-1 * 0.5 * B1, 0, H2);
|
|||
|
|
DPoint3d p3 = new(-0.5 * B, 0, H2 + H5);
|
|||
|
|
DPoint3d p4 = new(-0.5 * B, 0, H2 + H5 + H3);
|
|||
|
|
DPoint3d p5 = new(-0.5 * B2, 0, H2 + H5 + H3 + H4);
|
|||
|
|
DPoint3d p6 = new(-0.5 * B2, 0, H);
|
|||
|
|
DPoint3d p7 = new(0.5 * B2, 0, H);
|
|||
|
|
DPoint3d p8 = new(0.5 * B2, 0, H2 + H5 + H3 + H4);
|
|||
|
|
DPoint3d p9 = new(0.5 * B, 0, H2 + H5 + H3);
|
|||
|
|
DPoint3d p10 = new(0.5 * B, 0, H2 + H5);
|
|||
|
|
DPoint3d p11 = new(0.5 * B1, 0, H2);
|
|||
|
|
DPoint3d p12 = new(0.5 * B1, 0, 0);
|
|||
|
|
|
|||
|
|
DPoint3d[] pos = { p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 };//将面元素端点添加到面元素端点数组中
|
|||
|
|
|
|||
|
|
ShapeElement shape = new(dgnModel, null, pos);//声明形元素
|
|||
|
|
#endregion
|
|||
|
|
DPoint3d origin = DPoint3d.Zero;//声明拉伸基点
|
|||
|
|
DVector3d extrudeVector = new(0, 12 * uorPerMeter, 0);//声明拉伸向量
|
|||
|
|
|
|||
|
|
SurfaceOrSolidElement beamSolid = SurfaceOrSolidElement.CreateProjectionElement(
|
|||
|
|
dgnModel,
|
|||
|
|
null,
|
|||
|
|
shape,
|
|||
|
|
origin,
|
|||
|
|
extrudeVector,
|
|||
|
|
DTransform3d.Identity,
|
|||
|
|
true);//使用投影的方式声明拉伸体元素
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region Create dimension
|
|||
|
|
DPoint3d d1 = new(-0.5 * B1, 0, -50 * uorPerMeter / 1000);//声明标注点
|
|||
|
|
DPoint3d d2 = new(0.5 * B1, 0, -50 * uorPerMeter / 1000);//声明标注点
|
|||
|
|
DPoint3d[] dimensionPos1 = { d1, d2 };//声明标注点数组
|
|||
|
|
DMatrix3d dMatrix1 = new(-1, 0, 0, 0, 0, 1, 0, -1, 0);//声明变换矩阵
|
|||
|
|
DimensionElement dimEle1 = CreateDimensionElement(dgnFile, dgnModel, dimensionPos1, string.Empty, dMatrix1);//声明标注元素
|
|||
|
|
dimEle1.AddToModel();//将标注元素写入模型
|
|||
|
|
|
|||
|
|
DPoint3d d3 = new(-0.5 * B1, 0, -10 * uorPerMeter / 1000);
|
|||
|
|
DPoint3d d4 = new(-0.5 * B, 0, -10 * uorPerMeter / 1000);
|
|||
|
|
DPoint3d d5 = new(0.5 * B, 0, -10 * uorPerMeter / 1000);
|
|||
|
|
DPoint3d d6 = new(0.5 * B1, 0, -10 * uorPerMeter / 1000);
|
|||
|
|
DPoint3d[] dimensionPos2 = { d3, d4, d5, d6 };
|
|||
|
|
DimensionElement dimEle2 = CreateDimensionElement(dgnFile, dgnModel, dimensionPos2, string.Empty, dMatrix1);
|
|||
|
|
dimEle2.AddToModel();//将标注元素写入模型
|
|||
|
|
|
|||
|
|
DMatrix3d dMatrix2 = DMatrix3d.FromRows(new DVector3d(0, 1, 0), new DVector3d(-1, 0, 0), new DVector3d(0, 0, 1));
|
|||
|
|
DMatrix3d dMatrix = DMatrix3d.Multiply(dMatrix1, dMatrix2);
|
|||
|
|
|
|||
|
|
DPoint3d d7 = new(-0.5 * B1 - 50 * uorPerMeter / 1000, 0, 0);
|
|||
|
|
DPoint3d d8 = new(-0.5 * B1 - 50 * uorPerMeter / 1000, 0, H);
|
|||
|
|
DPoint3d[] dimensionPos3 = { d7, d8 };
|
|||
|
|
DimensionElement dimEle3 = CreateDimensionElement(dgnFile, dgnModel, dimensionPos3, string.Empty, dMatrix);
|
|||
|
|
dimEle3.AddToModel();//将标注元素写入模型
|
|||
|
|
|
|||
|
|
DPoint3d d9 = new(-0.5 * B1 - 10 * uorPerMeter / 1000, 0, 0);
|
|||
|
|
DPoint3d d10 = new(-0.5 * B1 - 10 * uorPerMeter / 1000, 0, H2);
|
|||
|
|
DPoint3d d11 = new(-0.5 * B1 - 10 * uorPerMeter / 1000, 0, H2 + H5);
|
|||
|
|
DPoint3d d12 = new(-0.5 * B1 - 10 * uorPerMeter / 1000, 0, H2 + H5 + H3);
|
|||
|
|
DPoint3d d13 = new(-0.5 * B1 - 10 * uorPerMeter / 1000, 0, H2 + H5 + H3 + H4);
|
|||
|
|
DPoint3d d14 = new(-0.5 * B1 - 10 * uorPerMeter / 1000, 0, H);
|
|||
|
|
DPoint3d[] dimensionPos4 = { d9, d10, d11, d12, d13, d14 };
|
|||
|
|
DimensionElement dimEle4 = CreateDimensionElement(dgnFile, dgnModel, dimensionPos4, string.Empty, dMatrix);
|
|||
|
|
dimEle4.AddToModel();//将标注元素写入模型
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region Create column
|
|||
|
|
EllipseElement ellipse = new(
|
|||
|
|
dgnModel,
|
|||
|
|
null,
|
|||
|
|
DPoint3d.Zero,
|
|||
|
|
350 * uorPerMeter / 1000,
|
|||
|
|
350 * uorPerMeter / 1000,
|
|||
|
|
DMatrix3d.Identity);
|
|||
|
|
|
|||
|
|
DVector3d columnVector = new(0, 0, 3 * uorPerMeter);//声明拉伸向量
|
|||
|
|
|
|||
|
|
SurfaceOrSolidElement columnSolid = SurfaceOrSolidElement.CreateProjectionElement(
|
|||
|
|
dgnModel,
|
|||
|
|
null,
|
|||
|
|
ellipse,
|
|||
|
|
DPoint3d.Zero,
|
|||
|
|
columnVector,
|
|||
|
|
DTransform3d.Identity,
|
|||
|
|
true);//使用投影的方式声明拉伸体元素
|
|||
|
|
|
|||
|
|
DTransform3d dTransform3D = DTransform3d.FromTranslation(new DPoint3d(0, 12 * uorPerMeter, -1 * uorPerMeter));//声明变换几何,执行元素平移操作
|
|||
|
|
TransformInfo trans = new(dTransform3D);//声明变换信息
|
|||
|
|
columnSolid.ApplyTransform(trans);//对拉伸圆柱体施加变换信息
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region BooleanSubtract
|
|||
|
|
Convert1.ElementToBody(out SolidKernelEntity entity1, beamSolid, true, false, false);//将实体转成SolidKernelEntity
|
|||
|
|
Convert1.ElementToBody(out SolidKernelEntity entity2, columnSolid, true, false, false);//将圆台实体元素转成SolidKernelEntity
|
|||
|
|
SolidKernelEntity[] entities = { entity2 };//声明实核实体集
|
|||
|
|
Modify.BooleanSubtract(ref entity1, ref entities, entities.Count());//用实核实体集中的实体与实体进行布尔减运算
|
|||
|
|
Convert1.BodyToElement(out Element resultElem, entity1, null, dgnModel);//将结果转换为元素
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
#region Attach material
|
|||
|
|
MaterialId id = FindMaterial(dgnFile, dgnModel);
|
|||
|
|
AttachMaterialToElement(id, resultElem);
|
|||
|
|
AttachMaterialToElement(id, columnSolid);
|
|||
|
|
#endregion
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static void AttachMaterialToElement(MaterialId id, Element elem)
|
|||
|
|
{
|
|||
|
|
if (id != null)
|
|||
|
|
{
|
|||
|
|
MaterialPropertiesExtension propertiesExtension = MaterialPropertiesExtension.GetAsMaterialPropertiesExtension(
|
|||
|
|
(DisplayableElement)elem);//为拉伸实体元素设置材料属性
|
|||
|
|
propertiesExtension.AddMaterialAttachment(id);//添加嵌入的材料信息
|
|||
|
|
propertiesExtension.StoresAttachmentInfo(id);//保存拉伸实体元素的材料信息
|
|||
|
|
propertiesExtension.AddToModel();//将拉伸实体写入模型
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private static MaterialId FindMaterial(DgnFile dgnFile, DgnModel dgnModel)
|
|||
|
|
{
|
|||
|
|
MaterialTable matTbl = new(dgnFile)
|
|||
|
|
{
|
|||
|
|
Name = "MyMaterialTable"//声明材料表名称
|
|||
|
|
};//声明材料表
|
|||
|
|
PaletteInfo[] palInfo = MaterialManager.GetPalettesInSearchPath("MS_MATERIAL");//从MS_MATERIAL的环境变量声明路径下读取材料图表
|
|||
|
|
if (palInfo.Length < 1)//判断是否获取到材料图表
|
|||
|
|
{
|
|||
|
|
MessageCenter.Instance.ShowInfoMessage("Can't get palette", null, true);//输出错误信息
|
|||
|
|
return null;//返回
|
|||
|
|
}
|
|||
|
|
for (int i = 0; i < palInfo.Count(); i++)//遍历材料图表
|
|||
|
|
{
|
|||
|
|
if (palInfo[i].Name == "Concrete&Pavers")//判断材料图表是否名为Concrete&Pavers
|
|||
|
|
{
|
|||
|
|
matTbl.AddPalette(palInfo[i]);//添加材料图表至材料表
|
|||
|
|
break;//跳出循环
|
|||
|
|
}
|
|||
|
|
else if (i == palInfo.Count() - 1)//若未找到名为lightwidgets的材料图表
|
|||
|
|
{
|
|||
|
|
MessageCenter.Instance
|
|||
|
|
.ShowErrorMessage(
|
|||
|
|
"Can't find material lib named lightwidgets, please check",
|
|||
|
|
"Can't find material lib named lightwidgets, please check",
|
|||
|
|
true);//输出错误信息
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
MaterialManager.SetActiveTable(matTbl, dgnModel);//设置当前材料表为激活图表
|
|||
|
|
MaterialManager.SaveTable(matTbl);//保存材料表
|
|||
|
|
|
|||
|
|
MaterialId id = new("Concrete_1");//查找名为Concrete_1的材料
|
|||
|
|
return id;
|
|||
|
|
}
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
/*
|
|||
|
|
* 参考论坛帖子:
|
|||
|
|
* https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/158653/ms-ce-c
|
|||
|
|
* https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/200717/thread/601140#601140
|
|||
|
|
* https://communities.bentley.com/communities/other_communities/chinafirst/f/microstation-projectwise/221336/abd-ce-c/678991#678991
|
|||
|
|
*/
|
|||
|
|
private static DimensionElement CreateDimensionElement(
|
|||
|
|
DgnFile dgnFile,
|
|||
|
|
DgnModel dgnModel,
|
|||
|
|
DPoint3d[] pos,
|
|||
|
|
string text,
|
|||
|
|
DMatrix3d dMatrix)
|
|||
|
|
{
|
|||
|
|
//获取当前dgn文件中名字为"DimStyle"的标注样式,尺寸标注元素的外貌由上百个属性控制,而标注样式是一组预先设置好的属性
|
|||
|
|
//获取了预先订制好的标注样式之后,还可以调用DimensionStyle下的各种SetXXX成员函数修改设置的属性
|
|||
|
|
DimensionStyle dimStyle = new("DimStyle", dgnFile);//声明标注样式
|
|||
|
|
dimStyle.SetBooleanProp(true, DimStyleProp.Placement_UseStyleAnnotationScale_BOOLINT);//设置标注样式
|
|||
|
|
dimStyle.SetDoubleProp(1, DimStyleProp.Placement_AnnotationScale_DOUBLE);
|
|||
|
|
dimStyle.SetBooleanProp(true, DimStyleProp.Text_OverrideHeight_BOOLINT);
|
|||
|
|
dimStyle.SetDistanceProp(200, DimStyleProp.Text_Height_DISTANCE, dgnModel);
|
|||
|
|
dimStyle.SetBooleanProp(true, DimStyleProp.Text_OverrideWidth_BOOLINT);
|
|||
|
|
dimStyle.SetDistanceProp(200, DimStyleProp.Text_Width_DISTANCE, dgnModel);
|
|||
|
|
dimStyle.SetBooleanProp(true, DimStyleProp.General_UseMinLeader_BOOLINT);
|
|||
|
|
dimStyle.SetDoubleProp(0.01, DimStyleProp.Terminator_MinLeader_DOUBLE);
|
|||
|
|
dimStyle.SetBooleanProp(true, DimStyleProp.Value_AngleMeasure_BOOLINT);
|
|||
|
|
dimStyle.SetAccuracyProp((byte)AnglePrecision.Use1Place, DimStyleProp.Value_AnglePrecision_INTEGER);
|
|||
|
|
int alignInt = (int)DimStyleProp_General_Alignment.True;
|
|||
|
|
StatusInt status = dimStyle.SetIntegerProp(alignInt, DimStyleProp.General_Alignment_INTEGER);
|
|||
|
|
dimStyle.GetIntegerProp(out int valueOut, DimStyleProp.General_Alignment_INTEGER);
|
|||
|
|
DgnTextStyle textStyle = new("TestStyle", dgnFile);//设置文字样式
|
|||
|
|
LevelId lvlId = Settings.GetLevelIdFromName("Default");//设置图层
|
|||
|
|
|
|||
|
|
DimensionData callbacks = new(dimStyle, textStyle, new Symbology(), lvlId, null);//尺寸标注元素的构造函数会调用DimensionCreateData的各个成员函数去获取声明尺寸标注元素需要的各种参数
|
|||
|
|
DimensionElement dimEle = new(dgnModel, callbacks, DimensionType.SizeStroke);//声明标注元素
|
|||
|
|
if (dimEle.IsValid)//判断标注元素是否有效
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < pos.Count(); i++)
|
|||
|
|
{
|
|||
|
|
dimEle.InsertPoint(pos[i], null, dimStyle, -1);//对标注元素设置插入点
|
|||
|
|
}
|
|||
|
|
dimEle.SetHeight(500);//设置尺寸标注元素的高度
|
|||
|
|
dimEle.SetRotationMatrix(dMatrix);//设置变换信息
|
|||
|
|
}
|
|||
|
|
return dimEle;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|