正多边形与collection区分
- autocad中正多边形
- 点的转换
- [ObjectIdCollection 和 DBObjectCollection区别](#ObjectIdCollection 和 DBObjectCollection区别)
autocad中正多边形
本质
在AutoCAD底层,所有的多边形(不管正不正)本质上都是 闭合的 Polyline(多段线)。AutoCAD自带的 POLYGON 命令,底层也是通过计算顶点坐标后生成 Polyline 来实现的。
参数
csharp
// 1. 定义正多边形参数
int sides = 6; // 边数
Point3d center = new Point3d(0, 0, 0); // 中心点
double radius = 10.0; // 半径
bool isInscribed = true; // true: 内接于圆, false: 外切于圆
顶点坐标计算(内接为例)
csharp
double partAngle = Math.PI * 2 / 6;
Point2dCollection points = new Point2dCollection();
//获取六边形的每一个顶点坐标
for(int i=0; i<6; i++)
{
// CAD中原生多边形默认第一个点在正上方(90度),所以起始角度设为 π/2
double currentAngle = partAngle*i + Math.PI/2;
double x = cMain.Center.X + radius*Math.Cos(currentAngle);
double y = cMain.Center.Y + radius.*Math.Sin(currentAngle);
Point2d interPoint = new Point2d(x, y);
points.Add(interPoint);
}
画内接正多边形
csharp
using (Polyline pol = new Polyline())
{
//获取所有顶点坐标
for(int i=0; i<points.Count; i++)
{
//将坐标按顺序加入多段线
pol.AddVertexAt(i, points[i],0,0,0);
}
//闭合多段线
pol.Closed = true;
btr.AppendEntity(pol);
trans.AddNewlyCreatedDBObject(pol, true);
}
点的转换
二维转三维
csharp
Point2d pt2d = new Point2d(10.5, 20.3);
// 提取 X 和 Y,Z 轴设为 0
Point3d pt3d = new Point3d(pt2d.X, pt2d.Y, 0.0);
三维转二维
csharp
Point3d pt3d = new Point3d(10, 20, 5);
// 提取 X 和 Y,Z 轴舍去
Point2d pt2d = new Point2d(pt3d.X, pt3d.Y);
ObjectIdCollection 和 DBObjectCollection区别
核心区别在于"装的是对象的身份证,还是对象本体"
- ObjectIdCollection(身份证集合):里面装的是一堆身份证号码(ObjectId 结构体)。它非常轻量,只记录对象在数据库中的唯一标识。
- DBObjectCollection(本体集合):里面装的是活生生的人(DBObject 对象实例)。它包含了对象在内存中的全部数据(如圆的圆心、半径、颜色等)。
| 特性 | ObjectIdCollection | DBObjectCollection |
|---|---|---|
| 存储内容 | ObjectId (结构体,轻量级指针) | DBObject (类,完整的内存对象) |
| 内存占用 | 极小 (仅占用几个字节/ID) | 较大 (包含对象所有属性和底层 C++ 包装) |
| 事务依赖 | 无。事务结束后,ID依然有效,可以跨事务使用。 | 强依赖。事务结束后,DBObject 会被关闭/释放,继续访问会报错。 |
| 访问数据 | 需要通过事务再次 GetObject() 才能读取数据。 | 可以直接调用 circle.Radius 等属性,无需再次打开。 |
| 安全性 | 非常安全,是 AutoCAD 官方推荐的标准做法。 | 危险,容易因为事务管理不当导致程序崩溃或数据损坏。 |
| 使用频率 | 极高(99%的场景) | 极低(仅在某些特殊的底层 API 回调或临时计算时使用) |