-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathRegionTools.cs
More file actions
209 lines (207 loc) · 10 KB
/
Copy pathRegionTools.cs
File metadata and controls
209 lines (207 loc) · 10 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
namespace DotNetARX
{
/// <summary>
/// 面域操作类
/// </summary>
public static class RegionTools
{
#region 面域特性
[DllImport("acdb17.dll", CallingConvention = CallingConvention.ThisCall, EntryPoint = "?getAreaProp@AcDbRegion@@UBE?AW4ErrorStatus@Acad@@ABVAcGePoint3d@@ABVAcGeVector3d@@1AAN2AAVAcGePoint2d@@QAN24QAVAcGeVector2d@@433@Z")]
private static extern ErrorStatus getAreaProp(IntPtr region,
ref Point3d origin,
ref Vector3d xAxis,
ref Vector3d yAxis,
out double perimeter,
out double area,
out Point2d centroid,
double[] momInertia,
out double prodInertia,
double[] prinMoments,
Vector2d[] prinAxes,
double[] radiiGyration,
out Point2d extentsLow,
out Point2d extentsHigh);
static double perimeter;
static double area;
static Point2d centroid;
static double[] momInertia=new double[2];
static double prodInertia;
static double[] prinMoments=new double[2];
static Vector2d[] prinAxes=new Vector2d[2];
static double[] radiiGyration=new double[2];
static Point2d extentsLow;
static Point2d extentsHigh;
/// <summary>
/// 获取面域的质心
/// </summary>
/// <param name="region">面域对象</param>
/// <returns>返回质心的坐标</returns>
public static Point2d GetCentroid(this Region region)
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
CoordinateSystem3d coord= ed.CurrentUserCoordinateSystem.CoordinateSystem3d;
Point3d origin=coord.Origin;
Vector3d xAxis=coord.Xaxis;
Vector3d yAxis=coord.Yaxis;
getAreaProp(region.UnmanagedObject, ref origin, ref xAxis, ref yAxis, out perimeter, out area, out centroid,
momInertia, out prodInertia, prinMoments, prinAxes, radiiGyration, out extentsLow, out extentsHigh);
return centroid;
}
/// <summary>
/// 获取面域的惯性矩
/// </summary>
/// <param name="region">面域对象</param>
/// <returns>返回惯性矩</returns>
public static double[] GetMomInertia(this Region region)
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
CoordinateSystem3d coord= ed.CurrentUserCoordinateSystem.CoordinateSystem3d;
Point3d origin=coord.Origin;
Vector3d xAxis=coord.Xaxis;
Vector3d yAxis=coord.Yaxis;
getAreaProp(region.UnmanagedObject, ref origin, ref xAxis, ref yAxis, out perimeter, out area, out centroid,
momInertia, out prodInertia, prinMoments, prinAxes, radiiGyration, out extentsLow, out extentsHigh);
return momInertia;
}
/// <summary>
/// 获取面域的惯性积
/// </summary>
/// <param name="region">面域对象</param>
/// <returns>返回惯性积</returns>
public static double GetProdInertia(this Region region)
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
CoordinateSystem3d coord= ed.CurrentUserCoordinateSystem.CoordinateSystem3d;
Point3d origin=coord.Origin;
Vector3d xAxis=coord.Xaxis;
Vector3d yAxis=coord.Yaxis;
getAreaProp(region.UnmanagedObject, ref origin, ref xAxis, ref yAxis, out perimeter, out area, out centroid,
momInertia, out prodInertia, prinMoments, prinAxes, radiiGyration, out extentsLow, out extentsHigh);
return prodInertia;
}
/// <summary>
/// 获取面域的主力矩
/// </summary>
/// <param name="region">面域对象</param>
/// <returns>返回主力矩</returns>
public static double[] GetPrinMoments(this Region region)
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
CoordinateSystem3d coord= ed.CurrentUserCoordinateSystem.CoordinateSystem3d;
Point3d origin=coord.Origin;
Vector3d xAxis=coord.Xaxis;
Vector3d yAxis=coord.Yaxis;
getAreaProp(region.UnmanagedObject, ref origin, ref xAxis, ref yAxis, out perimeter, out area, out centroid,
momInertia, out prodInertia, prinMoments, prinAxes, radiiGyration, out extentsLow, out extentsHigh);
return prinMoments;
}
/// <summary>
/// 获取面域的主方向
/// </summary>
/// <param name="region">面域对象</param>
/// <returns>返回主方向</returns>
public static Vector2d[] GetPrinAxes(this Region region)
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
CoordinateSystem3d coord= ed.CurrentUserCoordinateSystem.CoordinateSystem3d;
Point3d origin=coord.Origin;
Vector3d xAxis=coord.Xaxis;
Vector3d yAxis=coord.Yaxis;
getAreaProp(region.UnmanagedObject, ref origin, ref xAxis, ref yAxis, out perimeter, out area, out centroid,
momInertia, out prodInertia, prinMoments, prinAxes, radiiGyration, out extentsLow, out extentsHigh);
return prinAxes;
}
/// <summary>
/// 获取面域的旋转半径
/// </summary>
/// <param name="region">面域对象</param>
/// <returns>返回旋转半径</returns>
public static double[] GetRadiiGyration(this Region region)
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
CoordinateSystem3d coord= ed.CurrentUserCoordinateSystem.CoordinateSystem3d;
Point3d origin=coord.Origin;
Vector3d xAxis=coord.Xaxis;
Vector3d yAxis=coord.Yaxis;
getAreaProp(region.UnmanagedObject, ref origin, ref xAxis, ref yAxis, out perimeter, out area, out centroid,
momInertia, out prodInertia, prinMoments, prinAxes, radiiGyration, out extentsLow, out extentsHigh);
return radiiGyration;
}
/// <summary>
/// 获取面域边界框的下限
/// </summary>
/// <param name="region">面域对象</param>
/// <returns>返回边界框的下限</returns>
public static Point2d GetExtentsLow(this Region region)
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
CoordinateSystem3d coord= ed.CurrentUserCoordinateSystem.CoordinateSystem3d;
Point3d origin=coord.Origin;
Vector3d xAxis=coord.Xaxis;
Vector3d yAxis=coord.Yaxis;
getAreaProp(region.UnmanagedObject, ref origin, ref xAxis, ref yAxis, out perimeter, out area, out centroid,
momInertia, out prodInertia, prinMoments, prinAxes, radiiGyration, out extentsLow, out extentsHigh);
return extentsLow;
}
/// <summary>
/// 获取面域边界框的上限
/// </summary>
/// <param name="region">面域对象</param>
/// <returns>返回边界框的上限</returns>
public static Point2d GetExtentsHigh(this Region region)
{
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
CoordinateSystem3d coord= ed.CurrentUserCoordinateSystem.CoordinateSystem3d;
Point3d origin=coord.Origin;
Vector3d xAxis=coord.Xaxis;
Vector3d yAxis=coord.Yaxis;
getAreaProp(region.UnmanagedObject, ref origin, ref xAxis, ref yAxis, out perimeter, out area, out centroid,
momInertia, out prodInertia, prinMoments, prinAxes, radiiGyration, out extentsLow, out extentsHigh);
return extentsHigh;
}
#endregion
/// <summary>
/// 根据曲线创建面域
/// </summary>
/// <param name="curves">曲线</param>
/// <returns>返回创建的面域列表</returns>
public static List<Region> CreateRegion(params Curve[] curves)
{
//新建面域列表,存储创建的面域
List<Region> regionList=new List<Region>();
//将可变数组转化为集合类,用于面域的创建
DBObjectCollection curveCollection=new DBObjectCollection();
foreach (Curve curve in curves)//遍历曲线
{
//如果曲线已经被加入到数据库且为写的状态,则返回
if (!curve.IsNewObject && curve.IsWriteEnabled)
return null;
curveCollection.Add(curve);//将曲线添加到集合中
}
try
{
//根据曲线集合,在内存中创建面域对象集合
DBObjectCollection regionObjs=Region.CreateFromCurves(curveCollection);
//将面域对象集合复制到面域列表
foreach (Region region in regionObjs)
{
regionList.Add(region);
}
return regionList;
}
catch //面域创建失败
{
regionList.Clear();//清空面域列表
return regionList;//返回空的面域列表
}
}
}
}