739 lines
33 KiB
C#
739 lines
33 KiB
C#
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using System.Linq;
|
|||
|
|
|
|||
|
|
using Bentley.DgnPlatformNET;
|
|||
|
|
using Bentley.DgnPlatformNET.Elements;
|
|||
|
|
using Bentley.GeometryNET;
|
|||
|
|
using Bentley.MstnPlatformNET;
|
|||
|
|
|
|||
|
|
namespace Mstn.Toolkit.Helpers
|
|||
|
|
{
|
|||
|
|
public class ElementCreationHelper
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// 在当前模型中创建椭圆
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="centerPoint"></param>
|
|||
|
|
/// <param name="longVector">长轴向量</param>
|
|||
|
|
/// <param name="shortVector">短轴向量</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static ArcElement CreateArc(DPoint3d centerPoint, DVector3d longVector, DVector3d shortVector)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
DEllipse3d ellipse = new(centerPoint, longVector, shortVector);
|
|||
|
|
ArcElement arc = new(dgnModel, null, ellipse);
|
|||
|
|
arc.AddToModel();
|
|||
|
|
return arc;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Angle.PI.Radians
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="centerPoint">中心点</param>
|
|||
|
|
/// <param name="longLength">长轴长</param>
|
|||
|
|
/// <param name="shortLength">短轴长</param>
|
|||
|
|
/// <param name="startRadian">起始弧度</param>
|
|||
|
|
/// <param name="sweepRadian">扫过的弧度</param>
|
|||
|
|
/// <remarks>创建弧度的方法Angle.PI.Radians</remarks>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static ArcElement CreateArc(DPoint3d centerPoint, double longLength, double shortLength, double startRadian, double sweepRadian)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
/*
|
|||
|
|
* 创建弧元素
|
|||
|
|
* dgnModel:创建弧元素所在模型空间
|
|||
|
|
* templateElement:元素模板
|
|||
|
|
* center:弧元素的圆心
|
|||
|
|
* axis1:主轴长
|
|||
|
|
* axis2:副轴长
|
|||
|
|
* rotation:圆弧旋转角(平面旋转)
|
|||
|
|
* start:圆弧起始旋转角
|
|||
|
|
* sweep:圆弧扫掠角
|
|||
|
|
*/
|
|||
|
|
ArcElement arc = new(dgnModel, null, centerPoint, longLength, shortLength, 0, startRadian, sweepRadian);
|
|||
|
|
arc.AddToModel();
|
|||
|
|
return arc;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 折线
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="points"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static BSplineCurveElement CreateBSplineCurve(params DPoint3d[] points)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
MSBsplineCurve msBSplineCurve = MSBsplineCurve.CreateFromPoints(points);
|
|||
|
|
//用B样条曲线创建B样条曲线元素
|
|||
|
|
BSplineCurveElement bSplineCurve = new(dgnModel, null, msBSplineCurve);
|
|||
|
|
bSplineCurve.AddToModel();
|
|||
|
|
return bSplineCurve;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 创建B样条曲线元素
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="tangents">起终点切向</param>
|
|||
|
|
/// <param name="points"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static BSplineCurveElement CreateBSplineCurve(List<DVector3d> tangents, params DPoint3d[] points)
|
|||
|
|
{
|
|||
|
|
if (tangents.Count != 2)
|
|||
|
|
{
|
|||
|
|
throw new ArgumentException("参数有误,起终点切向方向数量有误,必须为2");
|
|||
|
|
}
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
/*
|
|||
|
|
*根据节点和起端点切线方向创建插值曲线
|
|||
|
|
* points:插值点
|
|||
|
|
* removeDuplicatePoints:是否需要删除重复点
|
|||
|
|
* endTangents:端点切线方向向量
|
|||
|
|
* closedCurve:是否需要闭合曲线
|
|||
|
|
* colinearTangents:切线是否共线
|
|||
|
|
* chordLenTangents:是否仅相切弦
|
|||
|
|
* naturalTangents:是否为自然切线
|
|||
|
|
*/
|
|||
|
|
MSInterpolationCurve interpolationCurve = MSInterpolationCurve.CreateFromPointsAndEndTangents(
|
|||
|
|
points,
|
|||
|
|
true,
|
|||
|
|
0,
|
|||
|
|
tangents,
|
|||
|
|
true,
|
|||
|
|
false,
|
|||
|
|
false,
|
|||
|
|
false);
|
|||
|
|
BSplineCurveElement bSplineCurve = new(dgnModel, null, interpolationCurve);
|
|||
|
|
bSplineCurve.AddToModel();
|
|||
|
|
return bSplineCurve;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 创建复杂形状
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="elements"></param>
|
|||
|
|
public static void CreateComplexShape(params Element[] elements)
|
|||
|
|
{
|
|||
|
|
var dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
|
|||
|
|
ComplexShapeElement complexShape = new(dgnModel, null);//创建复杂形元素
|
|||
|
|
foreach (var elem in elements)
|
|||
|
|
{
|
|||
|
|
complexShape.AddComponentElement(elem);
|
|||
|
|
}
|
|||
|
|
complexShape.AddComponentComplete();//添加子部件完成
|
|||
|
|
complexShape.AddToModel();//将复杂元素写入模型
|
|||
|
|
}
|
|||
|
|
public static ComplexStringElement CreateComplexString(params DisplayableElement[] elements)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
ComplexStringElement complexString = new(dgnModel, null);
|
|||
|
|
|
|||
|
|
foreach (DisplayableElement element in elements)
|
|||
|
|
{
|
|||
|
|
complexString.AddComponentElement(element);
|
|||
|
|
}
|
|||
|
|
complexString.AddToModel();
|
|||
|
|
return complexString;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 创建圆台
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="topRadius"></param>
|
|||
|
|
/// <param name="bottomRadius"></param>
|
|||
|
|
/// <param name="points"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static ConeElement CreateCone(double topRadius, double bottomRadius, List<DPoint3d> points)
|
|||
|
|
{
|
|||
|
|
var dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
|
|||
|
|
var cone = new ConeElement(dgnModel, null, topRadius, bottomRadius, points.First(), points
|
|||
|
|
.Last(), DMatrix3d.Identity, true);
|
|||
|
|
cone.AddToModel();
|
|||
|
|
return cone;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 在当前模型中创建曲线元素
|
|||
|
|
/// </summary>
|
|||
|
|
|
|||
|
|
/// <param name="points">三维点个数需大于等于6</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static CurveElement CreateCurve(params DPoint3d[] points)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
CurveElement curve = new(dgnModel, null, points);
|
|||
|
|
curve.AddToModel();
|
|||
|
|
return curve;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 在当前模型中创建曲线元素
|
|||
|
|
/// </summary>
|
|||
|
|
|
|||
|
|
/// <param name="points">三维点个数需大于等于6</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static CurveElement CreateCurve(List<DPoint3d> points)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
CurveElement curve = new(dgnModel, null, points);
|
|||
|
|
curve.AddToModel();
|
|||
|
|
return curve;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 创建椭圆
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="centerPo">椭圆圆心</param>
|
|||
|
|
/// <param name="vector0In">主轴向量</param>
|
|||
|
|
/// <param name="vector90In">副轴向量</param>
|
|||
|
|
public static EllipseElement CreateEllipse(DPoint3d centerPo, DVector3d vector0In, DVector3d vector90In)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前的模型空间
|
|||
|
|
|
|||
|
|
DEllipse3d ellipse = new(centerPo, vector0In, vector90In);//创建椭圆几何
|
|||
|
|
EllipseElement ellipseElem = new(dgnModel, null, ellipse);//使用椭圆几何创建椭圆元素
|
|||
|
|
ellipseElem.AddToModel();
|
|||
|
|
return ellipseElem;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 创建椭圆
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="centerPo">椭圆圆心</param>
|
|||
|
|
/// <param name="longAxis">主轴长度</param>
|
|||
|
|
/// <param name="shortAxis">主轴长度</param>
|
|||
|
|
/// <param name="angle"></param>
|
|||
|
|
public static EllipseElement CreateEllipse(DPoint3d centerPo, double longAxis, double shortAxis, double angle)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
|
|||
|
|
EllipseElement ellipseElem = new(dgnModel, null, centerPo, longAxis, shortAxis, angle);
|
|||
|
|
|
|||
|
|
ellipseElem.AddToModel();
|
|||
|
|
return ellipseElem;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 创建椭圆
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="centerPo">椭圆圆心</param>
|
|||
|
|
/// <param name="longAxis">主轴长度</param>
|
|||
|
|
/// <param name="shortAxis">主轴长度</param>
|
|||
|
|
/// <param name="matrix">变换矩阵</param>
|
|||
|
|
public static EllipseElement CreateEllipse(DPoint3d centerPo, double longAxis, double shortAxis, DMatrix3d matrix)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
|
|||
|
|
EllipseElement ellipseElem = new(dgnModel, null, centerPo, longAxis, shortAxis, matrix);
|
|||
|
|
|
|||
|
|
ellipseElem.AddToModel();
|
|||
|
|
return ellipseElem;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 在当前模型中创建直线元素
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="startPoint"></param>
|
|||
|
|
/// <param name="endPoint"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static LineElement CreateLine(DPoint3d startPoint, DPoint3d endPoint)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
//创建直线图元
|
|||
|
|
DSegment3d segment = new(startPoint, endPoint);
|
|||
|
|
//创建直线元素
|
|||
|
|
var line = new LineElement(dgnModel, null, segment);
|
|||
|
|
line.AddToModel();
|
|||
|
|
return line;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 在当前模型中创建线串元素
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="points"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static LineStringElement CreateLineString(params DPoint3d[] points)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
var pointString = new LineStringElement(dgnModel, null, points);
|
|||
|
|
pointString.AddToModel();
|
|||
|
|
return pointString;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
///
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="pos">多面体坐标的列表</param>
|
|||
|
|
public static void CreateMesh(List<DPoint3d> pos)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前的模型空间
|
|||
|
|
//TODO
|
|||
|
|
#region create polyface
|
|||
|
|
//DPoint3d p1 = DPoint3d.Zero;//创建多面体端点坐标
|
|||
|
|
//DPoint3d p2 = new(10000, 0, 0);
|
|||
|
|
//DPoint3d p3 = new(0, 10000, 0);
|
|||
|
|
//DPoint3d p4 = new(0, 0, 10000);
|
|||
|
|
|
|||
|
|
//IList<DPoint3d> pos =
|
|||
|
|
//[
|
|||
|
|
// p1,//将多面体端点坐标添加到列表中
|
|||
|
|
// p2,
|
|||
|
|
// p3,
|
|||
|
|
// p4,
|
|||
|
|
//];//创建储存多面体坐标的列表
|
|||
|
|
|
|||
|
|
PolyfaceHeader polyface = new()
|
|||
|
|
{
|
|||
|
|
Point = pos//设置该多面体几何的端点集
|
|||
|
|
};//创建多面体几何
|
|||
|
|
|
|||
|
|
polyface.ActivateVectorsForIndexing(polyface);//激活多面体几何中的数据与索引
|
|||
|
|
|
|||
|
|
List<int> indices =
|
|||
|
|
[
|
|||
|
|
1,
|
|||
|
|
2,
|
|||
|
|
3, //将索引号添加到列表中
|
|||
|
|
];//创建索引列表
|
|||
|
|
polyface.AddIndexedFacet(indices, null, null, indices);//添加索引信息到多面体几何中
|
|||
|
|
indices.Clear();//清空索引列表
|
|||
|
|
indices.Add(1); indices.Add(2); indices.Add(4);//继续将索引号添加到列表中
|
|||
|
|
polyface.AddIndexedFacet(indices, null, null, indices);
|
|||
|
|
indices.Clear();
|
|||
|
|
indices.Add(2); indices.Add(3); indices.Add(4);
|
|||
|
|
polyface.AddIndexedFacet(indices, null, null, indices);
|
|||
|
|
indices.Clear();
|
|||
|
|
indices.Add(1); indices.Add(3); indices.Add(4);
|
|||
|
|
polyface.AddIndexedFacet(indices, null, null, indices);
|
|||
|
|
#endregion
|
|||
|
|
|
|||
|
|
MeshHeaderElement mesh = new(dgnModel, null, polyface);//创建使用多面体几何网格元素
|
|||
|
|
mesh.AddToModel();//将网格元素添加到模型空间中
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 创建多线
|
|||
|
|
/// </summary>
|
|||
|
|
public static void CreateMultiLine()
|
|||
|
|
{
|
|||
|
|
// TODO
|
|||
|
|
var dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
|
|||
|
|
DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获取当前模型所属文件
|
|||
|
|
|
|||
|
|
MultilineStyle lineStyle = new("testMultiline", dgnFile);//创建多线元素样式
|
|||
|
|
|
|||
|
|
MultilineProfile profile1 = new()
|
|||
|
|
{
|
|||
|
|
Distance = 0,//设置轮廓偏移基点
|
|||
|
|
UseLinestyle = true,//设置轮廓是否使用线样式
|
|||
|
|
Linestyle = 1//设置轮廓线样式
|
|||
|
|
};//创建多线轮廓
|
|||
|
|
lineStyle.InsertProfile(profile1, 0);//将轮廓信息写入多线样式中
|
|||
|
|
MultilineProfile profile2 = new()
|
|||
|
|
{
|
|||
|
|
Distance = -10000//设置轮廓偏移基点
|
|||
|
|
};//创建多线轮廓
|
|||
|
|
lineStyle.InsertProfile(profile2, 1);//将轮廓信息写入多线样式中
|
|||
|
|
|
|||
|
|
DVector3d vector = DVector3d.UnitZ;//设置多线法线方向向量
|
|||
|
|
|
|||
|
|
DPoint3d p1 = DPoint3d.Zero;//设置多线轨迹控制点
|
|||
|
|
DPoint3d p2 = new(100000, 0, 0);
|
|||
|
|
DPoint3d p3 = new(200000, 200000, 0);
|
|||
|
|
DPoint3d[] pos = { p1, p2, p3 };//创建轨迹点数组
|
|||
|
|
|
|||
|
|
MultilineElement multiline = MultilineElement.CreateMultilineElement(
|
|||
|
|
dgnModel,
|
|||
|
|
null,
|
|||
|
|
lineStyle,
|
|||
|
|
1,
|
|||
|
|
vector,
|
|||
|
|
pos);
|
|||
|
|
/*
|
|||
|
|
* 创建多线元素
|
|||
|
|
* dgnModel:写入多线元素的模型空间
|
|||
|
|
* templateElement:元素模板
|
|||
|
|
* mlineStyle:多线样式
|
|||
|
|
* styleScale:样式缩放比例
|
|||
|
|
* normal:多线法线方向向量
|
|||
|
|
* points:轨迹点数组
|
|||
|
|
*/
|
|||
|
|
multiline.AddToModel();//将多线元素写入模型空间
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 在当前模型中创建点串元素
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="points"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static PointStringElement CreatePointString(params DPoint3d[] points)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
var pointString = new PointStringElement(dgnModel, null, points, true);
|
|||
|
|
pointString.AddToModel();
|
|||
|
|
return pointString;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 在当前模型中创建点串元素
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="ms">变换矩阵</param>
|
|||
|
|
/// <param name="points"></param>
|
|||
|
|
/// <remarks>矩阵个数要于点数一致,且一一对应</remarks>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static PointStringElement CreatePointString(DMatrix3d[] ms, DPoint3d[] points)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
var pointString = new PointStringElement(dgnModel, null, points, ms, true);
|
|||
|
|
pointString.AddToModel();
|
|||
|
|
return pointString;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 拉伸投影体
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="origin">拉伸起点</param>
|
|||
|
|
/// <param name="extrudeVector">拉伸方向及长度</param>
|
|||
|
|
/// <param name="profilePoints"></param>
|
|||
|
|
/// <param name="isSolid"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static SurfaceOrSolidElement CreateProjectionSolid(DPoint3d origin, DVector3d extrudeVector, bool isSolid, params DPoint3d[] profilePoints)
|
|||
|
|
{
|
|||
|
|
var dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
|
|||
|
|
ShapeElement shape = new(dgnModel, null, profilePoints);
|
|||
|
|
/*
|
|||
|
|
* 使用投影的方式创建拉伸面元素
|
|||
|
|
* dgnModel:创建拉伸面元素的模型空间
|
|||
|
|
* templateElement:元素模板
|
|||
|
|
* profile:投影轮廓面(截面)
|
|||
|
|
* origin:拉伸起点
|
|||
|
|
* extrudeVector:拉伸向量
|
|||
|
|
* transform:元素变换矩阵
|
|||
|
|
* preferSolid:生成拉伸体还是拉伸面(若为拉伸体则为true)
|
|||
|
|
*/
|
|||
|
|
SurfaceOrSolidElement surface = SurfaceOrSolidElement.CreateProjectionElement(
|
|||
|
|
dgnModel,
|
|||
|
|
null,
|
|||
|
|
shape,
|
|||
|
|
origin,
|
|||
|
|
extrudeVector,
|
|||
|
|
DTransform3d.Identity,
|
|||
|
|
isSolid);
|
|||
|
|
surface.AddToModel();
|
|||
|
|
return surface;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 创建旋转体
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="shape">轮廓</param>
|
|||
|
|
/// <param name="centerPo">创建旋转体元素的中心点</param>
|
|||
|
|
/// <param name="axis">创建旋转体元素的旋转轴</param>
|
|||
|
|
public static void CreateRevolution(ShapeElement shape, DPoint3d centerPo, DVector3d axis, bool isSolid)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前的模型空间
|
|||
|
|
|
|||
|
|
SurfaceOrSolidElement solid = SurfaceOrSolidElement.CreateRevolutionElement(
|
|||
|
|
dgnModel,
|
|||
|
|
null,
|
|||
|
|
shape,
|
|||
|
|
centerPo,
|
|||
|
|
axis,
|
|||
|
|
Angle.PI.Radians / 2,
|
|||
|
|
isSolid);
|
|||
|
|
/*
|
|||
|
|
* 创建旋转体元素
|
|||
|
|
* dgnModel:创建旋转体元素的模型空间
|
|||
|
|
* templateElement:元素模板
|
|||
|
|
* profile:旋转截面
|
|||
|
|
* center:旋转面元素的中心点
|
|||
|
|
* axis:旋转轴线
|
|||
|
|
* sweepAngle:旋转扫掠角
|
|||
|
|
* preferSolid:生成旋转体还是旋转面(若为旋转体则为true)
|
|||
|
|
*/
|
|||
|
|
solid.AddToModel();//将旋转体元素写入模型
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 规则拉伸体
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="profileA">截面1</param>
|
|||
|
|
/// <param name="profileB">截面2</param>
|
|||
|
|
public static void CreateRuledSweep(CurveVector profileA, CurveVector profileB)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前激活的model
|
|||
|
|
|
|||
|
|
//创建规则拉伸体 DgnRuledSweep
|
|||
|
|
DgnRuledSweep dgnRuledSweepDetail = new(profileA, profileB, true);
|
|||
|
|
|
|||
|
|
//转化为element 添加到model中
|
|||
|
|
Element element = DraftingElementSchema.ToElement(dgnModel, dgnRuledSweepDetail, null);
|
|||
|
|
element.AddToModel();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// //在当前模型中创建形元素
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="points"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static ShapeElement CreateShape(params DPoint3d[] points)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
ShapeElement shape = new(dgnModel, null, points);
|
|||
|
|
shape.AddToModel();
|
|||
|
|
return shape;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// 拉伸体
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="profileCurve">拉伸体拉伸平面轮廓线</param>
|
|||
|
|
/// <param name="extrudeCurve">拉伸体截面轮廓线</param>
|
|||
|
|
public static Element CreateSmartSolidFromExtrusion(CurveVector profileCurve, CurveVector extrudeCurve)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前的模型空间
|
|||
|
|
|
|||
|
|
Create.BodyFromCurveVector(out SolidKernelEntity profileEntity, profileCurve, dgnModel);//将拉伸平面轮廓线转化为SolidKernelEntity
|
|||
|
|
|
|||
|
|
Create.BodyFromCurveVector(out SolidKernelEntity extrudeEntity, extrudeCurve, dgnModel);//将截面轮廓线转化为SolidKernelEntity
|
|||
|
|
|
|||
|
|
Create.BodyFromExtrusionToBody(out SolidKernelEntity solid, extrudeEntity, profileEntity, false);
|
|||
|
|
/*
|
|||
|
|
* 通过将平面实体拉伸到另一个平面实体来创建新实体
|
|||
|
|
* entityOut:新实体
|
|||
|
|
* extrudeToIn:修剪拉伸实体的平面实体
|
|||
|
|
* profileIn:要拉伸的平面实体。
|
|||
|
|
* reverseDirectionIn:拉伸方向是否与拉伸的平面实体法线方向相同或相反
|
|||
|
|
*/
|
|||
|
|
Convert1.BodyToElement(out Element solidElem, solid, null, dgnModel);//将实体转换为元素
|
|||
|
|
solidElem.AddToModel();//将元素写入模型空间
|
|||
|
|
return solidElem;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static Element CreateSmartSolidFromLoft(params CurveVector[] profilesIns)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前的模型空间
|
|||
|
|
|
|||
|
|
Create.BodyFromLoft(out SolidKernelEntity entityOut, profilesIns, profilesIns.Length, profilesIns, 0, dgnModel, false, false);
|
|||
|
|
/*
|
|||
|
|
* 创建一组轮廓线放样创建实体
|
|||
|
|
* bool segmentIn
|
|||
|
|
* entityOut:创建的放样实体
|
|||
|
|
* profilesIn:横截面轮廓集
|
|||
|
|
* nProfilesIn:横截面数量
|
|||
|
|
* guidesIn:(可选)用于控制放样曲线轨迹的曲线集 注意:若不使用控制曲线,该位置可将横截面轮廓集填到此处,不可为空,否则会报错
|
|||
|
|
* nGuidesIn:控制放样曲线轨迹的曲线数量
|
|||
|
|
* modelRefIn:获取当前模型的比例单位
|
|||
|
|
* periodicIn:若为真,则会构造一个闭合曲面,其中第一条截面将作为最后一条截面
|
|||
|
|
* segmentIn:若为真,每个截面间将创建线性曲线而不做平滑
|
|||
|
|
*/
|
|||
|
|
Convert1.BodyToElement(out Element eeh, entityOut, null, dgnModel);//将SolidKernelEntity转换为元素
|
|||
|
|
eeh.AddToModel();//将元素写入模型
|
|||
|
|
return eeh;
|
|||
|
|
}
|
|||
|
|
public static Element CreateSmartSolidFromLoft(params ShapeElement[] profilesIns)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前的模型空间
|
|||
|
|
|
|||
|
|
CurveVector[] profilesIn = new CurveVector[profilesIns.Length];//创建截面曲线数组
|
|||
|
|
|
|||
|
|
for (int i = 0; i < profilesIns.Length; i++)
|
|||
|
|
{
|
|||
|
|
var shp0 = profilesIns[i];
|
|||
|
|
profilesIn[i] = CurvePathQuery.ElementToCurveVector(shp0);//将面转换为曲线
|
|||
|
|
}
|
|||
|
|
Create.BodyFromLoft(out SolidKernelEntity entityOut, profilesIn, profilesIn.Length, profilesIn, 0, dgnModel, false, false);
|
|||
|
|
/*
|
|||
|
|
* 创建一组轮廓线放样创建实体
|
|||
|
|
* bool segmentIn
|
|||
|
|
* entityOut:创建的放样实体
|
|||
|
|
* profilesIn:横截面轮廓集
|
|||
|
|
* nProfilesIn:横截面数量
|
|||
|
|
* guidesIn:(可选)用于控制放样曲线轨迹的曲线集 注意:若不使用控制曲线,该位置可将横截面轮廓集填到此处,不可为空,否则会报错
|
|||
|
|
* nGuidesIn:控制放样曲线轨迹的曲线数量
|
|||
|
|
* modelRefIn:获取当前模型的比例单位
|
|||
|
|
* periodicIn:若为真,则会构造一个闭合曲面,其中第一条截面将作为最后一条截面
|
|||
|
|
* segmentIn:若为真,每个截面间将创建线性曲线而不做平滑
|
|||
|
|
*/
|
|||
|
|
Convert1.BodyToElement(out Element eeh, entityOut, null, dgnModel);//将SolidKernelEntity转换为元素
|
|||
|
|
eeh.AddToModel();//将元素写入模型
|
|||
|
|
return eeh;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 拉伸智能实体
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="profile">轮廓线</param>
|
|||
|
|
/// <param name="vector">拉伸向量(包含拉伸长度及方向信息)</param>
|
|||
|
|
public static Element CreateSmartSolidFromPrimitive(CurveVector profile, DVector3d vector)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前的模型空间
|
|||
|
|
|
|||
|
|
DgnExtrusionDetail detail = new(profile, vector, true);
|
|||
|
|
/*
|
|||
|
|
* 创建拉伸信息
|
|||
|
|
* baseCurve:截面轮廓曲线
|
|||
|
|
* extrusionVector:拉伸信息
|
|||
|
|
* capped:若启用端盖则为真
|
|||
|
|
*/
|
|||
|
|
SolidPrimitive solid = SolidPrimitive.CreateDgnExtrusion(detail);//使用拉伸信息创建实体
|
|||
|
|
|
|||
|
|
Create.BodyFromSolidPrimitive(out SolidKernelEntity entityOut, solid, dgnModel);//使用拉伸实体创建SolidKernelEntity
|
|||
|
|
Convert1.BodyToElement(out Element eeh, entityOut, null, dgnModel);//将SolidKernelEntity转换为元素
|
|||
|
|
eeh.AddToModel();//将元素写入模型
|
|||
|
|
return eeh;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 缝合实核实体
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="shapeElements">形状</param>
|
|||
|
|
public static void CreateSmartSolidFromSew(params ShapeElement[] shapeElements)
|
|||
|
|
{
|
|||
|
|
SolidKernelEntity[] tools = new SolidKernelEntity[shapeElements.Length];//创建实核实体列表
|
|||
|
|
for (int i = 0; i < shapeElements.Length; i++)
|
|||
|
|
{
|
|||
|
|
Convert1.ElementToBody(out tools[i], shapeElements[i], false, true, false);//将Shape元素转换为实核实体
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
BrepCellHeaderElement brepCellHeader = null;//初始化智能实体
|
|||
|
|
if (BentleyStatus.Success == Modify.SewBodies(out SolidKernelEntity[] sewns, out SolidKernelEntity[] unsewns, ref tools, 6, 0, 1))//缝合实核实体
|
|||
|
|
{
|
|||
|
|
for (int i = 0; i < sewns.Length; i++)//遍历缝合结果
|
|||
|
|
{
|
|||
|
|
brepCellHeader = new BrepCellHeaderElement(Session.Instance.GetActiveDgnModel(), null, sewns[i]);//创建智能实体
|
|||
|
|
brepCellHeader.AddToModel();//将智能实体写入模型
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 扫掠体
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="curve">截面</param>
|
|||
|
|
/// <param name="pathCurve">路径</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static Element CreateSmartSolidFromSweep(CurveVector curve, CurveVector pathCurve)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前的模型空间
|
|||
|
|
|
|||
|
|
Create.BodyFromSweep(out SolidKernelEntity entityOut, curve, pathCurve, dgnModel, false, true, false,
|
|||
|
|
null, null, null, null);
|
|||
|
|
/*
|
|||
|
|
* 使用横截面扫掠路径创建实体
|
|||
|
|
* entityOut:生成的新实体
|
|||
|
|
* profileIn:横断面轮廓(开放,闭合或带孔区域)
|
|||
|
|
* pathIn:扫掠轨迹线
|
|||
|
|
* modelRefIn:获取当前模型的比例单位
|
|||
|
|
* alignParallelIn:若为真,则轮廓与全局轴线保持固定角度,而不是与路径相切并锁定方向
|
|||
|
|
* selfRepairIn:若为真,则会尝试修复扫掠自交
|
|||
|
|
* createSheetIn:若为真,则会强制生成闭合的扫掠实体
|
|||
|
|
* lockDirectionIn:(可选)使截面轮廓与垂直于方向向量同时切线保持固定角度,仅当alignParallelIn为真时有效
|
|||
|
|
* twistAngleIn:(可选)在轮廓沿路径移动时旋转轮廓角度
|
|||
|
|
* scaleIn:(可选)在轮廓沿路径扫掠时缩放比例
|
|||
|
|
* scalePointIn:应用缩放需要缩放的轮廓端点
|
|||
|
|
*/
|
|||
|
|
Convert1.BodyToElement(out Element eeh, entityOut, null, dgnModel);//将SolidKernelEntity转换为元素
|
|||
|
|
eeh.AddToModel();//将元素写入模型
|
|||
|
|
return eeh;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 扫掠体
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="Profile">截面形状</param>
|
|||
|
|
/// <param name="pathPos">路径点</param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static Element CreateSmartSolidFromSweep(ShapeElement Profile, params DPoint3d[] pathPos)
|
|||
|
|
{
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获取当前的模型空间
|
|||
|
|
|
|||
|
|
CurveVector curve = CurvePathQuery.ElementToCurveVector(Profile);//使用图形元素获得轮廓线
|
|||
|
|
|
|||
|
|
LineStringElement lineString = new(dgnModel, null, pathPos);//创建线串元素
|
|||
|
|
CurveVector pathCurve = lineString.GetCurveVector();//使用线串元素获得扫掠轨迹点
|
|||
|
|
|
|||
|
|
Create.BodyFromSweep(out SolidKernelEntity entityOut, curve, pathCurve, dgnModel, false, true, false,
|
|||
|
|
null, null, null, null);
|
|||
|
|
/*
|
|||
|
|
* 使用横截面扫掠路径创建实体
|
|||
|
|
* entityOut:生成的新实体
|
|||
|
|
* profileIn:横断面轮廓(开放,闭合或带孔区域)
|
|||
|
|
* pathIn:扫掠轨迹线
|
|||
|
|
* modelRefIn:获取当前模型的比例单位
|
|||
|
|
* alignParallelIn:若为真,则轮廓与全局轴线保持固定角度,而不是与路径相切并锁定方向
|
|||
|
|
* selfRepairIn:若为真,则会尝试修复扫掠自交
|
|||
|
|
* createSheetIn:若为真,则会强制生成闭合的扫掠实体
|
|||
|
|
* lockDirectionIn:(可选)使截面轮廓与垂直于方向向量同时切线保持固定角度,仅当alignParallelIn为真时有效
|
|||
|
|
* twistAngleIn:(可选)在轮廓沿路径移动时旋转轮廓角度
|
|||
|
|
* scaleIn:(可选)在轮廓沿路径扫掠时缩放比例
|
|||
|
|
* scalePointIn:应用缩放需要缩放的轮廓端点
|
|||
|
|
*/
|
|||
|
|
Convert1.BodyToElement(out Element eeh, entityOut, null, dgnModel);//将SolidKernelEntity转换为元素
|
|||
|
|
eeh.AddToModel();//将元素写入模型
|
|||
|
|
return eeh;
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 创建曲面
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="points"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static BrepCellHeaderElement CreateSmartSurface(List<DPoint3d> points)
|
|||
|
|
{
|
|||
|
|
var dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
|
|||
|
|
CurveVector curve = CurveVector.CreateLinear(points, CurveVector.BoundaryType.Outer, true);//根据列表中的端点坐标创建曲线
|
|||
|
|
Create.BodyFromCurveVector(out var solid, curve, dgnModel);//使用曲线创建SolidEntity
|
|||
|
|
BrepCellHeaderElement brepCellHeader = new(dgnModel, null, solid);//使用SolidEntity创建智能实体
|
|||
|
|
return brepCellHeader;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void CreateTag(DPoint3d insertPoint, Element elementToTag, object value)
|
|||
|
|
{
|
|||
|
|
DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得创建文本元素的文件
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();//获得创建文本元素的模型空间
|
|||
|
|
|
|||
|
|
DgnTagDefinition[] tagDefs =
|
|||
|
|
[
|
|||
|
|
new DgnTagDefinition
|
|||
|
|
{
|
|||
|
|
Name = "Line",//设置标签名称
|
|||
|
|
TagDataType = TagType.Double,//设置标签类型
|
|||
|
|
Value = value//设置标签值
|
|||
|
|
},//创建标签定义
|
|||
|
|
];//创建标签定义数组
|
|||
|
|
|
|||
|
|
TagSetElement tagSet = new(dgnModel, tagDefs, tagDefs[0].Name, "", true, dgnFile, 0);//创建标签集元素
|
|||
|
|
tagSet.AddToModel();//将标签集元素写入模型
|
|||
|
|
|
|||
|
|
DMatrix3d orientation = DMatrix3d.Identity;//设置标签变换矩阵
|
|||
|
|
DgnTextStyle style = DgnTextStyle.GetSettings(dgnFile);//从当前激活的文件中获得文字样式
|
|||
|
|
TagElement tag = new(
|
|||
|
|
dgnModel,
|
|||
|
|
null,
|
|||
|
|
tagSet.SetName,
|
|||
|
|
tagSet.SetName,
|
|||
|
|
null,
|
|||
|
|
style,
|
|||
|
|
false,
|
|||
|
|
insertPoint,
|
|||
|
|
orientation,
|
|||
|
|
elementToTag);//创建标注元素
|
|||
|
|
tag.AddToModel();//将标注元素写入模型
|
|||
|
|
}
|
|||
|
|
/// <summary>
|
|||
|
|
/// 创建文本元素
|
|||
|
|
/// </summary>
|
|||
|
|
/// <param name="content"></param>
|
|||
|
|
/// <returns></returns>
|
|||
|
|
public static TextElement CreateText(string content)
|
|||
|
|
{
|
|||
|
|
DgnFile dgnFile = Session.Instance.GetActiveDgnFile();//获得创建文本元素的文件
|
|||
|
|
DgnModel dgnModel = Session.Instance.GetActiveDgnModel();
|
|||
|
|
TextBlockProperties txtBlockProp = new(dgnModel)
|
|||
|
|
{
|
|||
|
|
IsViewIndependent = false//设置文本非独立于视图
|
|||
|
|
};//创建文本属性
|
|||
|
|
ParagraphProperties paraProp = new(dgnModel);//创建段落属性
|
|||
|
|
DgnTextStyle txtStyle = DgnTextStyle.GetSettings(dgnFile);//从激活的文件中获得文字样式
|
|||
|
|
RunProperties runProp = new(txtStyle, dgnModel);//创建运行属性
|
|||
|
|
TextBlock txtBlock = new(txtBlockProp, paraProp, runProp, dgnModel);//创建文本块
|
|||
|
|
txtBlock.AppendText(content);//设置文本块文字内容
|
|||
|
|
TextElement text = (TextElement)TextHandlerBase.CreateElement(null, txtBlock);//创建文本元素
|
|||
|
|
text.AddToModel();//将生成的文本元素写入模型
|
|||
|
|
return text;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|