Files
MsAddIns/Mstn.Toolkit/Helpers/ElementCreationHelper.cs
2026-02-28 21:01:57 +08:00

739 lines
33 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}
}